Commit 3385ffa4e9c9c913f8254b8ffef7a1dd10bae136

Authored by 潘钊
1 parent e446d8ab

update...

Showing 41 changed files with 1209 additions and 312 deletions
src/main/java/com/bsth/controller/realcontrol/ChildTaskPlanController.java
... ... @@ -27,4 +27,9 @@ public class ChildTaskPlanController extends BaseController<ChildTaskPlan, Long>
27 27 public Map<String, Object> delHistory(@PathVariable("id") Long id){
28 28 return childTaskPlanService.delHistory(id);
29 29 }
  30 +
  31 + @RequestMapping(value = "update", method = RequestMethod.POST)
  32 + public Map<String, Object> update(ChildTaskPlan childTask){
  33 + return childTaskPlanService.update(childTask);
  34 + }
30 35 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/InStationProcess.java
... ... @@ -159,7 +159,7 @@ public class InStationProcess {
159 159 logger.info("车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());
160 160  
161 161 //清除车辆误点调整监听
162   - LateAdjustHandle.remove(nbbm);
  162 + LateAdjustHandle.remove(sch);
163 163  
164 164 //将gps转换成下一个班次走向的站内信号(应对只有一个站内信号 即 发出时)
165 165 transformUpDown(gps, next);
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/OutStationProcess.java
... ... @@ -113,7 +113,7 @@ public class OutStationProcess {
113 113 dayOfSchedule.save(sch);
114 114  
115 115 //清理应发未发标记
116   - LateAdjustHandle.remove(sch.getClZbh());
  116 + LateAdjustHandle.remove(sch);
117 117  
118 118 //发车的时候,同步一下状态
119 119 if (!gps.isService() && !dayOfSchedule.emptyService(sch))
... ...
src/main/java/com/bsth/data/line_version/thread/FixedEnableVerionsThread.java
... ... @@ -14,7 +14,7 @@ import java.util.Map;
14 14 * Created by panzhao on 2017/12/28.
15 15 */
16 16 @Component
17   -public class FixedEnableVerionsThread extends Thread{
  17 +public class FixedEnableVerionsThread extends Thread {
18 18  
19 19 @Autowired
20 20 JdbcTemplate jdbcTemplate;
... ... @@ -26,34 +26,39 @@ public class FixedEnableVerionsThread extends Thread{
26 26  
27 27 @Override
28 28 public void run() {
29   - try{
  29 + try {
30 30  
31 31 String sql = "select * from bsth_c_line_versions where status=2 and start_date<=SYSDATE()";
32 32  
33 33 List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
34   - if(list.size() == 0)
35   - return;
  34 + if (list.size() > 0) {
  35 + String lineCode;
  36 + int version;
36 37  
37   - String lineCode;
38   - int version;
  38 + for (Map<String, Object> map : list) {
  39 + lineCode = map.get("line_code").toString();
  40 + version = Integer.parseInt(map.get("versions").toString());
39 41  
40   - for(Map<String, Object> map : list){
41   - lineCode = map.get("line_code").toString();
42   - version = Integer.parseInt(map.get("versions").toString());
43   -
44   - enableRouteVersionHandler.enable(lineCode, version);
  42 + enableRouteVersionHandler.enable(lineCode, version);
  43 + }
45 44 }
46 45  
47   - //要从历史表同步当前表的变更(当前版本)
48   - List<String> syncs = jdbcTemplate.queryForList("SELECT CONCAT(line_code,'_',versions) FROM bsth_c_line_versions WHERE STATUS = 1 AND CONCAT(line_code, '_', versions) IN (SELECT CONCAT(line_code, '_', version) FROM logger_route_synchro)", String.class);
  46 +
  47 + //自动同步当前启用版本
  48 + long t = System.currentTimeMillis();
  49 + List<String> syncs = jdbcTemplate.queryForList("SELECT CONCAT(line_code,'_',versions) FROM bsth_c_line_versions WHERE STATUS = 1 AND CONCAT(line_code, '_', versions) IN (SELECT CONCAT(line_code, '_', version) FROM logger_route_synchro where t < " + t + ")", String.class);
49 50  
50 51 String[] ks;
51   - for(String keys : syncs){
  52 + for (String keys : syncs) {
52 53 ks = keys.split("_");
53 54  
54 55 enableRouteVersionHandler.sync(ks[0], Integer.parseInt(ks[1]));
  56 +
  57 + logger.info("同步线路 " + ks[0] + " 版本:" + ks[1]);
55 58 }
56   - }catch (Exception e){
  59 +
  60 + jdbcTemplate.update("delete from logger_route_synchro where t < " + t);
  61 + } catch (Exception e) {
57 62 logger.error("", e);
58 63 }
59 64 }
... ...
src/main/java/com/bsth/data/schedule/late_adjust/LateAdjustHandle.java
... ... @@ -117,7 +117,7 @@ public class LateAdjustHandle implements ApplicationContextAware{
117 117 }
118 118 }
119 119  
120   - public static void remove(String nbbm){
  120 +/* public static void remove(String nbbm){
121 121 if(lateSchMap.containsKey(nbbm)){
122 122 ScheduleRealInfo sch = lateSchMap.get(nbbm);
123 123 sch.setLate2(false);
... ... @@ -127,7 +127,7 @@ public class LateAdjustHandle implements ApplicationContextAware{
127 127 lateSchMap.remove(nbbm);
128 128 logger.info("移除误点调整 nbbm -" + nbbm);
129 129 }
130   - }
  130 + }*/
131 131  
132 132 /**
133 133 * 车辆到站
... ...
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
... ... @@ -74,14 +74,6 @@ public class ScheduleRefreshThread extends Thread{
74 74 //重载排班数据
75 75 dayOfSchedule.reloadSch(lineCode, currSchDate, false);
76 76 logger.info(lineCode + "翻班完成, " + currSchDate + " -班次数量:" + dayOfSchedule.findByLineCode(lineCode).size());
77   -
78   -
79   - //校验一下数据库和缓存的数据
80   - /*int dbCount = dayOfSchedule.dbCount(lineCode, currSchDate);
81   - logger.info(lineCode + " 数据库数量:" + dbCount);
82   - if(dbCount != dayOfSchedule.findByLineCode(lineCode).size()){
83   - logger.error("异常异常异常,,数据库和缓存数量不一致," + lineCode);
84   - }*/
85 77 }
86 78 }catch (Exception e){
87 79 logger.error("班次更新失败!! -" + lineCode, e);
... ...
src/main/java/com/bsth/service/geo_data/impl/GeoDataServiceImpl.java
... ... @@ -174,14 +174,17 @@ public class GeoDataServiceImpl implements GeoDataService {
174 174 int id = Integer.parseInt(map.get("id").toString());
175 175 String name = map.get("stationName").toString();
176 176 String code = map.get("stationCode").toString();
177   - //String lineCode = map.get("lineCode").toString();
178   - //String stationMark = map.get("stationMark").toString();
  177 + String lineCode = map.get("lineCode").toString();
  178 + String versions = map.get("versions").toString();
179 179  
180 180 //更新历史站点路由
181 181 jdbcTemplate.update("update bsth_c_ls_stationroute set station_name=? where id=?", name, id);
182 182 //更新站点
183 183 jdbcTemplate.update("update bsth_c_station set station_name=? where station_cod=?", name, code);
184 184  
  185 + //写一条走向变更记录
  186 + jdbcTemplate.update("insert into logger_route_synchro(t, line_code, version) values(?, ?, ?)", System.currentTimeMillis(), lineCode, versions);
  187 +
185 188 tran.commit(status);
186 189  
187 190 rs.put("station", findOne(id));
... ...
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -15,7 +15,6 @@ import com.bsth.repository.CarParkRepository;
15 15 import com.bsth.repository.StationRepository;
16 16 import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
17 17 import com.bsth.service.gps.entity.*;
18   -import com.bsth.util.DateUtils;
19 18 import com.bsth.util.TransGPS;
20 19 import com.bsth.util.TransGPS.Location;
21 20 import com.bsth.util.db.DBUtils_MS;
... ... @@ -32,6 +31,7 @@ import org.slf4j.Logger;
32 31 import org.slf4j.LoggerFactory;
33 32 import org.springframework.beans.factory.annotation.Autowired;
34 33 import org.springframework.dao.DataAccessException;
  34 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
35 35 import org.springframework.jdbc.core.JdbcTemplate;
36 36 import org.springframework.stereotype.Service;
37 37  
... ... @@ -164,56 +164,134 @@ public class GpsServiceImpl implements GpsService {
164 164 return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0);
165 165 }
166 166  
  167 + private static DateTimeFormatter fmtyyyy = DateTimeFormat.forPattern("yyyy");
167 168 @Override
168 169 public List<Map<String, Object>> history(String[] nbbmArray, Long st, Long et) {
169 170 List<Map<String, Object>> list = new ArrayList<>();
170   - // 超过最大查询范围,直接忽略
171 171 if (et - st > GPS_RANGE)
172 172 return list;
173 173  
174   - // 车辆编码转换成设备号
175   - String[] devices = new String[nbbmArray.length];
176   - for (int i = 0; i < nbbmArray.length; i++) {
177   - devices[i] = BasicData.deviceId2NbbmMap.inverse().get(nbbmArray[i]);
178   - }
179   - // day_of_year
  174 + st = st * 1000;
  175 + et = et * 1000;
  176 + // day_of_year 分区字段
180 177 Calendar sCal = Calendar.getInstance();
181   - sCal.setTime(new Date(st * 1000));
182   - int sDayOfYear = sCal.get(Calendar.DAY_OF_YEAR)/* 200 */;
183   -
  178 + sCal.setTime(new Date(st));
  179 + int sDayOfYear = sCal.get(Calendar.DAY_OF_YEAR);
184 180 Calendar eCal = Calendar.getInstance();
185   - eCal.setTime(new Date(et * 1000));
186   - int eDayOfYear = eCal.get(Calendar.DAY_OF_YEAR)/* 200 */;
  181 + eCal.setTime(new Date(et));
  182 + int eDayOfYear = eCal.get(Calendar.DAY_OF_YEAR);
187 183  
188   - Calendar weekCal = Calendar.getInstance();
  184 + String nbbm = nbbmArray[0];
189 185  
190   - // 如果是同一天
191   - if (sDayOfYear == eDayOfYear) {
192   - weekCal.setTimeInMillis(st * 1000);
193   - list = findByTs(weekCal.get(Calendar.WEEK_OF_YEAR), sDayOfYear, st, et, devices);
194   - } else {
195   - // 跨天
196   - Long tempSt = 0L, tempEt = 0L;
197   - for (int i = sDayOfYear; i <= eDayOfYear; i++) {
198   -
199   - if (i == sDayOfYear) {
200   - tempSt = st;
201   - tempEt = DateUtils.getTimesnight(sCal);
202   - } else if (i == eDayOfYear) {
203   - tempSt = DateUtils.getTimesmorning(sCal);
204   - tempEt = et;
205   - } else {
206   - tempSt = DateUtils.getTimesmorning(sCal);
207   - tempEt = DateUtils.getTimesnight(sCal);
208   - }
  186 + List<DeviceChange> dcs = findDeviceChangeLogs(nbbm, et, st);
  187 + //没有设备变更记录,则参考车辆信息上的设备号
  188 + if(null == dcs || dcs.size() == 0){
  189 + DeviceChange dc = new DeviceChange();
  190 + dc.setNbbm(nbbm);
  191 + dc.setDevice(BasicData.deviceId2NbbmMap.inverse().get(nbbm));
  192 + dc.setSt(st);
  193 + dc.setEt(et);
209 194  
210   - weekCal.setTimeInMillis(tempSt * 1000);
211   - list.addAll(findByTs(weekCal.get(Calendar.WEEK_OF_YEAR), i, tempSt, tempEt, devices));
212   - // 加一天
213   - sCal.add(Calendar.DATE, 1);
214   - }
  195 + dcs.add(dc);
215 196 }
216 197  
  198 + //bsth_c_gps_info
  199 + String tableName = "bsth_c_gps_info";
  200 + String sYear = fmtyyyy.print(st),
  201 + currYear = fmtyyyy.print(System.currentTimeMillis());
  202 +
  203 + if(!sYear.equals(currYear))
  204 + tableName += "_" + sYear;
  205 +
  206 + StringBuilder sql = new StringBuilder("");
  207 + long t1,t2;
  208 + DeviceChange dc;
  209 + for(int i = 0,len=dcs.size(); i < len; i++){
  210 + t1 = st;
  211 + t2 = et;
  212 + dc = dcs.get(i);
  213 + if(dc.getSt() > st)
  214 + t1 = dc.getSt();
  215 + if(dc.getEt() < et)
  216 + t2 = dc.getEt();
  217 +
  218 + sql.append("select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE ,STOP_NO,DIRECTION,LINE_ID,SPEED_GPS,SECTION_CODE from "+tableName+" where days_year in ("+sDayOfYear+","+eDayOfYear+") " +
  219 + " and device_id='"+dc.getDevice()+"' and ts > "+t1+" and ts < "+t2+" ");
  220 +
  221 + if(i == len - 1)
  222 + sql.append(" ORDER BY device_id,ts,stop_no");
  223 + else
  224 + sql.append(" UNION");
  225 + }
  226 +
  227 + logger.info("轨迹回放 nbbm: " + nbbm + " -st: " + st + " -et: " + et + " -sql: " + sql.toString());
  228 +
  229 + // 查询到离站数据
  230 + Map<String, ArrivalEntity> arrivalMap = findArrivalByTs(st, et, dcs);
  231 +
  232 + //查询GPS数据
  233 + JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  234 + List<Map<String, Object>> dataList = jdbcTemplate_ms.queryForList(sql.toString());
  235 +
  236 + Float lon, lat;
  237 + Location bdLoc, gdLoc;
  238 + int inOutStop;
  239 + long serviceState;
  240 + ArrivalEntity arrival;
  241 +
  242 + Map<String, Object> map = null;
  243 + for(Map<String, Object> rs : dataList){
  244 + serviceState = map_get_long(rs, "SERVICE_STATE");
  245 +
  246 + if(getGpsValid(serviceState) == 1)
  247 + continue;
  248 +
  249 + map = new HashMap<>();
  250 + if(getGpsValid(serviceState) == 1)
  251 + continue;
  252 +
  253 + map = new HashMap<>();
  254 +
  255 + lon = map_get_float(rs, "LON");
  256 + lat = map_get_float(rs, "LAT");
  257 + // 高德坐标
  258 + gdLoc = TransGPS.transformFromWGSToGCJ(TransGPS.LocationMake(lon, lat));
  259 + map.put("gcj_lon", gdLoc.getLng());
  260 + map.put("gcj_lat", gdLoc.getLat());
  261 + // 百度坐标
  262 + bdLoc = TransGPS.bd_encrypt(gdLoc);
  263 + map.put("bd_lon", bdLoc.getLng());
  264 + map.put("bd_lat", bdLoc.getLat());
  265 + //原始坐标
  266 + map.put("lon", lon);
  267 + map.put("lat", lat);
  268 +
  269 + map.put("deviceId", map_get_str(rs, "DEVICE_ID"));
  270 + map.put("ts", map_get_long(rs, "TS"));
  271 + map.put("timestamp", map_get_long(rs, "TS"));
  272 + map.put("stopNo", map_get_str(rs, "STOP_NO"));
  273 + map.put("direction", map_get_float(rs,"DIRECTION"));
  274 +
  275 + map.put("lineId", map_get_str(rs, "LINE_ID"));
  276 + map.put("speed", map_get_float(rs,"SPEED_GPS"));
  277 +
  278 + inOutStop = Integer.parseInt(rs.get("INOUT_STOP").toString());
  279 + map.put("inout_stop", inOutStop);
  280 +
  281 + arrival = arrivalMap.get(map_get_str(rs, "DEVICE_ID") + "_" + map_get_long(rs, "TS"));
  282 + if (arrival != null) {
  283 + map.put("inout_stop_info", arrival);
  284 + map.put("inout_stop", arrival.getInOut());
  285 + }
  286 +
  287 + map.put("nbbm", BasicData.deviceId2NbbmMap.get(map_get_str(rs,"DEVICE_ID")));
  288 + map.put("state", getService(serviceState));
  289 + // 上下行
  290 + map.put("upDown", getUpOrDown(serviceState));
  291 + //路段编码
  292 + map.put("section_code", map_get_str(rs,"SECTION_CODE"));
  293 + list.add(map);
  294 + }
217 295 // 按时间排序
218 296 Collections.sort(list, new Comparator<Map<String, Object>>() {
219 297  
... ... @@ -225,132 +303,97 @@ public class GpsServiceImpl implements GpsService {
225 303 return list;
226 304 }
227 305  
228   - public List<Map<String, Object>> findByTs(int weekOfYear, int dayOfYear, Long st, Long et, String[] devices) {
229   - List<Map<String, Object>> list = new ArrayList<>();
230   - Map<String, Object> map = null;
231   -
232   - // 直接拼 in 语句
233   - String inv = "";
234   - for (String device : devices)
235   - inv += ("'" + device + "',");
236   - inv = inv.substring(0, inv.length() - 1);
237   -
238   - // 查询到离站数据
239   - Map<String, ArrivalEntity> arrivalMap = findArrivalByTs(weekOfYear, st, et, inv);
240   -
241   - String sql = "select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE ,STOP_NO,DIRECTION,LINE_ID,SPEED_GPS,SECTION_CODE from bsth_c_gps_info where days_year=? and device_id in ("
242   - + inv + ") and ts > ? and ts < ? ORDER BY device_id,ts,stop_no";
243   - try {
244   - conn = DBUtils_MS.getConnection();
245   - ps = conn.prepareStatement(sql);
246   - ps.setInt(1, dayOfYear);
247   - /* ps.setArray(2, conn.createArrayOf("VARCHAR", devices)); */
248   - ps.setLong(2, st * 1000);
249   - ps.setLong(3, et * 1000);
  306 + private String map_get_str(Map<String, Object> map, String key){
  307 + return map.containsKey(key)?map.get(key).toString():"";
  308 + }
250 309  
251   - rs = ps.executeQuery();
252   - Float lon, lat;
253   - Location bdLoc, gdLoc;
254   - int inOutStop;
255   - long serviceState;
256   - ArrivalEntity arrival;
257   - while (rs.next()) {
258   - serviceState = rs.getLong("SERVICE_STATE");
259   - if(getGpsValid(serviceState) == 1)
260   - continue;
  310 + private Long map_get_long(Map<String, Object> map, String key){
  311 + return map.containsKey(key)?Long.parseLong(map.get(key).toString()):-1;
  312 + }
261 313  
262   - map = new HashMap<>();
  314 + private Float map_get_float(Map<String, Object> map, String key){
  315 + return map.containsKey(key)?Float.parseFloat(map.get(key).toString()):-1;
  316 + }
263 317  
264   - lon = rs.getFloat("LON");
265   - lat = rs.getFloat("LAT");
266   - // 高德坐标
267   - gdLoc = TransGPS.transformFromWGSToGCJ(TransGPS.LocationMake(lon, lat));
268   - map.put("gcj_lon", gdLoc.getLng());
269   - map.put("gcj_lat", gdLoc.getLat());
270   - // 百度坐标
271   - bdLoc = TransGPS.bd_encrypt(gdLoc);
272   - map.put("bd_lon", bdLoc.getLng());
273   - map.put("bd_lat", bdLoc.getLat());
274   - //原始坐标
275   - map.put("lon", lon);
276   - map.put("lat", lat);
277   -
278   - map.put("deviceId", rs.getString("DEVICE_ID"));
279   - map.put("ts", rs.getLong("TS"));
280   - map.put("timestamp", rs.getLong("TS"));
281   - map.put("stopNo", rs.getString("STOP_NO"));
282   - map.put("direction", rs.getFloat("DIRECTION"));
  318 + private List<DeviceChange> findDeviceChangeLogs(String nbbm, long t, long st){
  319 + List<DeviceChange> dcs = null;
  320 + List<DeviceChange> rs = new ArrayList<>();
  321 + try{
283 322  
284   - map.put("lineId", rs.getString("LINE_ID"));
285   - map.put("speed", rs.getFloat("SPEED_GPS"));
  323 + //JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  324 + dcs = jdbcTemplate.query("select cl_zbh as nbbm,new_device_no as device,UNIX_TIMESTAMP(qyrq) * 1000 as st from bsth_c_car_device where cl_zbh='"+nbbm+"' and UNIX_TIMESTAMP(qyrq)<" + (t / 1000)
  325 + , BeanPropertyRowMapper.newInstance(DeviceChange.class));
286 326  
287   - inOutStop = rs.getInt("INOUT_STOP");
288   - map.put("inout_stop", inOutStop);
289 327  
290   - arrival = arrivalMap.get(rs.getString("DEVICE_ID") + "_" + rs.getLong("TS"));
291   - if (arrival != null) {
292   - map.put("inout_stop_info", arrival);
293   - map.put("inout_stop", arrival.getInOut());
  328 + Collections.sort(dcs, new Comparator<DeviceChange>() {
  329 + @Override
  330 + public int compare(DeviceChange d1, DeviceChange d2) {
  331 + return (int) (d1.getSt() - d2.getSt());
294 332 }
  333 + });
295 334  
296   - map.put("nbbm", BasicData.deviceId2NbbmMap.get(rs.getString("DEVICE_ID")));
297   - map.put("state", getService(serviceState));
298   - // 上下行
299   - map.put("upDown", getUpOrDown(serviceState));
300   - //路段编码
301   - map.put("section_code", rs.getString("SECTION_CODE"));
302   - list.add(map);
  335 + for(int i = 0,len=dcs.size(); i < len - 1; i++){
  336 + dcs.get(i).setEt(dcs.get(i + 1).getSt());
303 337 }
304   - } catch (Exception e) {
  338 +
  339 + for(DeviceChange dc : dcs){
  340 + if(dc.getEt() > st)
  341 + rs.add(dc);
  342 + }
  343 + }catch (Exception e){
305 344 logger.error("", e);
306   - } finally {
307   - DBUtils_MS.close(rs, ps, conn);
308 345 }
309   - return list;
  346 + return rs;
310 347 }
311 348  
312 349 public static byte getGpsValid(long serviceState) {
313 350 return (byte)(((serviceState & 0x80000000) == 0x80000000) ? 1 : 0);
314 351 }
315 352  
316   - public Map<String, ArrivalEntity> findArrivalByTs(int weekOfYear, Long st, Long et, String devicesInSql) {
  353 + public Map<String, ArrivalEntity> findArrivalByTs(Long st, Long et, List<DeviceChange> dcs) {
317 354 Map<String, ArrivalEntity> map = new HashMap<>();
318 355  
319   - String sql = "SELECT DEVICE_ID,LINE_ID,STOP_NO,TS,UP_DOWN,IN_OUT,WEEKS_YEAR,CREATE_DATE FROM bsth_c_arrival_info where weeks_year=? and device_id in ("
320   - + devicesInSql + ") and ts > ? and ts < ?";
321   - try {
322   - conn = DBUtils_MS.getConnection();
323   - ps = conn.prepareStatement(sql);
324   - ps.setInt(1, weekOfYear);
325   - ps.setLong(2, st * 1000);
326   - ps.setLong(3, et * 1000);
  356 + // weeks_year 分区字段
  357 + Calendar sCal = Calendar.getInstance();
  358 + sCal.setTime(new Date(st * 1000));
  359 + int sWeekOfYear = sCal.get(Calendar.WEEK_OF_YEAR);
  360 + Calendar eCal = Calendar.getInstance();
  361 + eCal.setTime(new Date(et * 1000));
  362 + int eWeekOfYear = eCal.get(Calendar.DAY_OF_YEAR);
  363 +
  364 + StringBuilder sql = new StringBuilder("");
  365 + long t1,t2;
  366 + DeviceChange dc;
  367 + for(int i = 0,len=dcs.size(); i < len; i++){
  368 + t1 = st;
  369 + t2 = et;
  370 + dc = dcs.get(i);
  371 + if(dc.getSt() > st)
  372 + t1 = dc.getSt();
  373 + if(dc.getEt() < et)
  374 + t2 = dc.getEt();
  375 +
  376 + sql.append("SELECT DEVICE_ID,LINE_ID as LINE_CODE,STOP_NO,TS,UP_DOWN,IN_OUT,WEEKS_YEAR,CREATE_DATE FROM bsth_c_arrival_info " +
  377 + " where weeks_year in ("+sWeekOfYear+", "+eWeekOfYear+") and device_id='"+dc.getDevice()+"' and ts > "+t1+" and ts < " + t2);
  378 +
  379 + if(i == len - 1)
  380 + sql.append(" ORDER BY device_id,ts,stop_no");
  381 + else
  382 + sql.append(" UNION");
  383 + }
327 384  
328   - rs = ps.executeQuery();
329   - ArrivalEntity arr;
330   - int inOut, updown;
331   - String prefix, stationName, lineId;
332   - while (rs.next()) {
333   - lineId = rs.getString("LINE_ID");
334   - updown = rs.getInt("UP_DOWN");
335   - prefix = lineId + "_" + updown + "_";
336   - stationName = BasicData.getStationNameByCode(rs.getString("STOP_NO"), prefix);
  385 + JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  386 + List<ArrivalEntity> list = jdbcTemplate_ms.query(sql.toString(), BeanPropertyRowMapper.newInstance(ArrivalEntity.class));
337 387  
338   - if (StringUtils.isEmpty(stationName))
339   - continue;
  388 + String stationName, prefix;
  389 + for(ArrivalEntity arr : list){
  390 + prefix = arr.getLineCode() + "_" + arr.getUpDown() + "_";
  391 + stationName = BasicData.getStationNameByCode(arr.getStopNo(), prefix);
340 392  
341   - arr = new ArrivalEntity(rs.getString("DEVICE_ID"), rs.getLong("TS"), lineId,
342   - updown, rs.getString("STOP_NO"), rs.getInt("IN_OUT"), rs.getLong("CREATE_DATE"),
343   - rs.getInt("WEEKS_YEAR"), stationName);
  393 + arr.setStopName(stationName);
344 394  
345   - // 设备号_时间戳_进出状态 为key
346   - // 反转进出状态
347   - inOut = arr.getInOut() == 0 ? 1 : 0;
348   - map.put(arr.getDeviceId() + "_" + arr.getTs(), arr);
349   - }
350   - } catch (Exception e) {
351   - logger.error("", e);
352   - } finally {
353   - DBUtils_MS.close(rs, ps, conn);
  395 + // 反转进出状态
  396 + map.put(arr.getDeviceId() + "_" + arr.getTs(), arr);
354 397 }
355 398 return map;
356 399 }
... ... @@ -612,14 +655,6 @@ public class GpsServiceImpl implements GpsService {
612 655 //获取历史gps 数据
613 656 List<HistoryGps_DTOV3> list = HistoryGps_DTOV3.craete(history(new String[]{nbbm}, st, et));
614 657 if (list != null && list.size() > 0) {
615   - //获取路段信息
616   - /*String sql = "select ID, ST_AsText(GROAD_VECTOR) as GROAD_VECTOR,ROAD_CODE,ROAD_NAME,SPEED from bsth_c_road where road_code in(select section_code from bsth_c_sectionroute where line_code=? and destroy=0)";
617   - List<Road_DTO> roads = Road_DTO.craete(jdbcTemplate.queryForList(sql, list.get(0).getLineId()));
618   -
619   - //为GPS数据关联路段信息
620   - for (HistoryGps_DTOV3 gps : list) {
621   - matchRoadToGps(gps, roads);
622   - }*/
623 658 //关联路段名称
624 659 Map<String, String> sectionCode2Name = GeoCacheData.sectionCode2NameMap();
625 660 for(HistoryGps_DTOV3 gps : list){
... ...
src/main/java/com/bsth/service/gps/entity/DeviceChange.java 0 → 100644
  1 +package com.bsth.service.gps.entity;
  2 +
  3 +/**
  4 + * 车辆设备变更记录
  5 + * Created by panzhao on 2018/1/16.
  6 + */
  7 +public class DeviceChange {
  8 +
  9 + private String nbbm;
  10 + private String device;
  11 + private long st;
  12 + private long et;
  13 +
  14 + public String getNbbm() {
  15 + return nbbm;
  16 + }
  17 +
  18 + public void setNbbm(String nbbm) {
  19 + this.nbbm = nbbm;
  20 + }
  21 +
  22 + public String getDevice() {
  23 + return device;
  24 + }
  25 +
  26 + public void setDevice(String device) {
  27 + this.device = device;
  28 + }
  29 +
  30 + public long getSt() {
  31 + return st;
  32 + }
  33 +
  34 + public void setSt(long st) {
  35 + this.st = st;
  36 + }
  37 +
  38 + public long getEt() {
  39 + return et;
  40 + }
  41 +
  42 + public void setEt(long et) {
  43 + this.et = et;
  44 + }
  45 +}
... ...
src/main/java/com/bsth/service/realcontrol/ChildTaskPlanService.java
... ... @@ -10,4 +10,6 @@ public interface ChildTaskPlanService extends BaseService&lt;ChildTaskPlan, Long&gt;{
10 10 Map<String,Object> saveHistory(ChildTaskPlan childTask);
11 11  
12 12 Map<String,Object> delHistory(Long id);
  13 +
  14 +Map<String,Object> update(ChildTaskPlan childTask);
13 15 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/ChildTaskPlanServiceImpl.java
... ... @@ -21,6 +21,7 @@ import javax.transaction.Transactional;
21 21 import java.util.Date;
22 22 import java.util.HashMap;
23 23 import java.util.Map;
  24 +import java.util.Set;
24 25  
25 26 @Service
26 27 public class ChildTaskPlanServiceImpl extends BaseServiceImpl<ChildTaskPlan, Long> implements ChildTaskPlanService {
... ... @@ -131,6 +132,66 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl&lt;ChildTaskPlan, Lon
131 132 return rs;
132 133 }
133 134  
  135 + @Override
  136 + public Map<String, Object> update(ChildTaskPlan t) {
  137 + Map<String, Object> rs = new HashMap();
  138 + try {
  139 + ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId());
  140 + //保存起终点名称
  141 + if(StringUtils.isEmpty(t.getStartStationName()))
  142 + t.setStartStationName(getStationName(sch.getXlBm(), t.getStartStation()));
  143 +
  144 + if(StringUtils.isEmpty(t.getEndStationName()))
  145 + t.setEndStationName(getStationName(sch.getXlBm(), t.getEndStation()));
  146 + if(t.getDestroyReason() == null)
  147 + t.setDestroyReason("");
  148 +
  149 +
  150 + //根据id 获取原对象
  151 + ChildTaskPlan task = null;
  152 + Set<ChildTaskPlan> set = sch.getcTasks();
  153 + for(ChildTaskPlan obj : set){
  154 + if(obj.getId() == t.getId()){
  155 + task = obj;
  156 + break;
  157 + }
  158 + }
  159 +
  160 + if(null == task){
  161 + rs.put("status", ResponseCode.ERROR);
  162 + rs.put("msg", "失败,服务端无法定位到数据!");
  163 + return rs;
  164 + }
  165 + //更新字段
  166 + task.setStartStation(t.getStartStation());
  167 + task.setStartStationName(t.getStartStationName());
  168 + task.setEndStation(t.getEndStation());
  169 + task.setEndStationName(t.getEndStationName());
  170 + task.setStartDate(t.getStartDate());
  171 + task.setEndDate(t.getEndDate());
  172 + task.setMileageType(t.getMileageType());
  173 + task.setMileage(t.getMileage());
  174 + task.setDestroy(t.isDestroy());
  175 + task.setDestroyReason(t.getReason());
  176 + task.setReason(t.getReason());
  177 + task.setType1(t.getType1());
  178 + task.setType2(t.getType2());
  179 + task.setNoClerk(t.isNoClerk());
  180 + task.setRemarks(t.getRemarks());
  181 +
  182 + //更新数据库
  183 + super.save(task);
  184 +
  185 + rs.put("status", ResponseCode.SUCCESS);
  186 + rs.put("t", sch);
  187 + }catch (Exception e){
  188 + logger.error("", e);
  189 + rs.put("status", ResponseCode.ERROR);
  190 + rs.put("msg", e.getMessage());
  191 + }
  192 + return rs;
  193 + }
  194 +
134 195 private String getStationName(String lineCode, String stationCode){
135 196 String name;
136 197 String prefix1 = lineCode + "_" + 0 + "_",
... ...
src/main/resources/static/pages/base/geo_data_edit/js/submit.js
... ... @@ -52,6 +52,8 @@ var gb_data_submit = function () {
52 52 $(document).on('click', '.up_down_route_list .station_route .ul_li_input .save_icon_btn', function (e) {
53 53 var f = $(this).parents('form');
54 54 var data = f.serializeJSON();
  55 + data.lineCode = g_line_code;
  56 + data.versions = g_version;
55 57  
56 58 UIkit.modal.confirm('确定将站点名称修改为【'+data.stationName+'】?').then(function() {
57 59 show_run_text('正在保存...');
... ...
src/main/resources/static/pages/base/geo_data_edit/js/version_manage.js
... ... @@ -152,6 +152,7 @@ var gb_version_manage = function () {
152 152 var version = $(this).data('version');
153 153  
154 154 storage.setItem("geo_data_edit_line_version" , version);
  155 + g_version = version;
155 156 $loadPanel.show();
156 157 clearAll();
157 158 startup();
... ...
src/main/resources/static/pages/summary/destory_sch_detail/list.html
... ... @@ -161,7 +161,7 @@
161 161 <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button>
162 162 </div>
163 163 <div class="ct_field ct_field_bottom">
164   - <span uk-icon="icon: question" title="不统计进出场和子任务" uk-tooltip="pos: bottom"></span>
  164 + <span uk-icon="icon: question" title="不统计进出场和2点间空驶" uk-tooltip="pos: bottom"></span>
165 165 </div>
166 166 </form>
167 167 </div>
... ...
src/main/resources/static/real_control_v2/css/line_schedule.css
... ... @@ -545,7 +545,7 @@ dl.relevance-active.intimity dd:nth-child(n+2) {
545 545 dl.relevance-active.intimity dd:nth-child(n+2) a {
546 546 color: white !important;
547 547 }
548   -
  548 +/*
549 549 dl.relevance-active dd.tl-qrlb,
550 550 dl.relevance-active.intimity dd.tl-qrlb{
551 551 background: linear-gradient(to right, #a9a911, #808000, #8baabf) !important;
... ... @@ -587,7 +587,7 @@ dl.relevance-active.intimity dd.tl-xxrd {
587 587 dl.relevance-active dd.tl-xxfc,
588 588 dl.relevance-active.intimity dd.tl-xxfc {
589 589 background: linear-gradient(to right, #8baabf, rgb(43, 185, 185), rgb(0,255,255)) !important;
590   -}
  590 +}*/
591 591  
592 592 dl.relevance-active.intimity dd span.fcsj-diff {
593 593 color: #616060;
... ...
src/main/resources/static/real_control_v2/css/main.css
... ... @@ -1092,11 +1092,11 @@ dl.intimity span.late-badge{
1092 1092 }
1093 1093  
1094 1094 .qtip.sch-badge-tip{
1095   - max-width: 500px;
  1095 + max-width: 700px;
1096 1096 }
1097 1097  
1098 1098 .tip_task_list {
1099   - width: 460px;
  1099 + width: 530px;
1100 1100 margin-bottom: -10px;
1101 1101 }
1102 1102 .tip_task_list dl{
... ... @@ -1119,19 +1119,30 @@ dl.intimity span.late-badge{
1119 1119 }
1120 1120  
1121 1121 .tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1){
1122   - width: 19%;
  1122 + width: 38px;
  1123 + border-right: 1px solid #c8c8c8;
1123 1124 }
1124 1125 .tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2){
1125   - width: 12%;
  1126 + width: 18%;
  1127 + text-indent: 5px;
1126 1128 }
1127 1129 .tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3){
1128   - width: 28%;
  1130 + width: 11%;
1129 1131 }
1130 1132 .tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4){
1131   - width: 28%;
  1133 + width: 25%;
1132 1134 }
1133 1135 .tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5){
1134   - width: 13%;
  1136 + width: 25%;
  1137 +}
  1138 +.tip_task_list dl dt:nth-of-type(6), .tip_task_list dl dd:nth-of-type(6){
  1139 +
  1140 +}
  1141 +
  1142 +.tip_task_list dl dd:nth-of-type(1) a{
  1143 + color: #3c3c3c;
  1144 + text-decoration: underline;
  1145 + font-size: 12px;
1135 1146 }
1136 1147  
1137 1148 .tip_task_list dl.service{
... ... @@ -1335,7 +1346,7 @@ ul.left_tabs_lg li{
1335 1346 }
1336 1347  
1337 1348 #add-sub-task-main-modal .forms{
1338   - max-height: 488px;
  1349 + max-height: 642px;
1339 1350 overflow-y: auto;
1340 1351 overflow-x: hidden;
1341 1352 padding: 8px 8px 0 0;
... ... @@ -1800,4 +1811,109 @@ dl.active&gt;dd.disabled{
1800 1811  
1801 1812 .c_b_item>span.c_b_over{
1802 1813 float: right;
  1814 +}
  1815 +
  1816 +.mileage_elec_panel{
  1817 + position: absolute;
  1818 + width: 100%;
  1819 + /*height: 90px;*/
  1820 + z-index: 1;
  1821 + background: white;
  1822 + bottom: 0px;
  1823 + box-shadow: 1px 0px 15px rgba(90, 90, 90, 0.48);
  1824 + padding: 9px 15px;
  1825 + border-radius: 0 5px;
  1826 + color: #000;
  1827 +
  1828 + display: none;
  1829 +}
  1830 +
  1831 +.mileage_elec_panel ._title{
  1832 + margin: 5px 3px;
  1833 + font-size: 15px;
  1834 +}
  1835 +
  1836 +.mileage_elec_panel .LD_item{
  1837 + margin: 5px 0;
  1838 + font-family: 微软雅黑;
  1839 +}
  1840 +
  1841 +.mileage_elec_panel .LD_item>span{
  1842 + padding: 3px;
  1843 + display: inline-block;
  1844 + width: 85px;
  1845 +}
  1846 +
  1847 +.mileage_elec_panel .lp_name{
  1848 + padding: 0 5px;
  1849 + background: #f2f2f2;
  1850 + border-radius: 15px
  1851 +}
  1852 +
  1853 +.mileage_elec_panel .LD_item>span>a{
  1854 + color: #000;
  1855 +}
  1856 +
  1857 +.mileage_elec_panel .LD_item>span:nth-of-type(1)>a{
  1858 + color: blue;
  1859 +}
  1860 +
  1861 +/*.mileage_elec_panel .LD_item>span:nth-of-type(2)>a{
  1862 + color: #fa3a2c;
  1863 +}
  1864 +
  1865 +.mileage_elec_panel .LD_item>span:nth-of-type(3)>a{
  1866 + color: #515151;
  1867 +}*/
  1868 +
  1869 +.mileage_elec_panel hr{
  1870 + height:1px;border:none;border-top:1px dashed #b5b5b5;
  1871 +}
  1872 +
  1873 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-label {
  1874 + width: 70px;
  1875 +}
  1876 +
  1877 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-controls {
  1878 + margin-left: 75px;
  1879 +}
  1880 +
  1881 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid+.uk-grid,
  1882 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid-margin,
  1883 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid>*>.uk-panel+.uk-panel{
  1884 + margin-top: 22px;
  1885 +}
  1886 +
  1887 +.c_task_mileage_abnormal,
  1888 +.c_task_mileage_abnormal .ct_table>.ct_table_head dl,
  1889 +.c_task_mileage_abnormal .ct_table dl{
  1890 + background: #ffe7e7 !important;
  1891 +}
  1892 +
  1893 +.tip_task_count_dl{
  1894 + width: calc(100% + 22px) !important;
  1895 + margin-left: -11px !important;
  1896 + border-top: 1px solid #e6e6e6 !important;
  1897 +}
  1898 +
  1899 +.tip_task_count_dl>dd{
  1900 + width: 100% !important;
  1901 + border-right: 0 !important;
  1902 + height: 35px !important;
  1903 + background: #f3f3f3;
  1904 + margin-bottom: -3px;
  1905 +}
  1906 +
  1907 +.tip_task_count_dl>dd>span{
  1908 + font-size: 13px;
  1909 + color: #000;
  1910 + height: 55px;
  1911 + display: inline-block;
  1912 + padding: 7px 0;
  1913 + border-radius: 0;
  1914 + text-indent: 12px;
  1915 +}
  1916 +
  1917 +.tip_task_list>dl:nth-last-child(2){
  1918 + border-bottom: 0 !important;
1803 1919 }
1804 1920 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/badge_tooltip.html
... ... @@ -3,6 +3,7 @@
3 3 <div class="tl-tip-panel">
4 4 <div class="tip_task_list">
5 5 <dl>
  6 + <dt>操作</dt>
6 7 <dt>类型</dt>
7 8 <dt>里程</dt>
8 9 <dt>起点</dt>
... ... @@ -11,6 +12,7 @@
11 12 </dl>
12 13 {{each tasks as t i}}
13 14 <dl class="{{t.mileageType}} {{if t.destroy}}destroy{{/if}} {{if t.type1=='临加'}}temp_add{{/if}}">
  15 + <dd><a data-line="{{lineCode}}" data-id="{{t.id}}" data-schid="{{sch_id}}" class="tip_task_edit_link">编辑</a></dd>
14 16 <dd>
15 17 {{if t.mileageType=="service"}}
16 18 营运
... ... @@ -35,6 +37,13 @@
35 37 <dd title="{{t.remarks}}">{{t.remarks}}</dd>
36 38 </dl>
37 39 {{/each}}
  40 + <dl class="tip_task_count_dl" >
  41 + <dd>
  42 + <span>计划:{{jhlc}}</span>
  43 + <span>营运+烂班:{{serviceCount}}</span>
  44 + <span>空驶:{{emptyCount}}</span>
  45 + </dd>
  46 + </dl>
38 47 </div>
39 48 </div>
40 49 </script>
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/fcxxwt.html
... ... @@ -205,29 +205,6 @@
205 205 notify_err("当前操作需要选择调整原因!");
206 206 return;
207 207 }
208   -
209   - //里程有修改
210   - //if(data.jhlc != sch.jhlc && data.jhlc != 0){
211   -
212   - /*var confHtml = '<h4 style="color: #c04c4c;margin-bottom: 9px;">确认要将班次里程由'+sch.jhlc+' 修改为'+data.jhlc+' </h4><small>备注:</small>';
213   - UIkit.modal.prompt(confHtml, data.remarks, function(remarks){
214   - if(remarks){
215   - //在这里写操作日志
216   -
217   - //提交
218   - postData(data);
219   - }
220   - else{
221   - notify_err('失败,你必须填写备注!');
222   - }
223   - }, {
224   - labels: {
225   - Ok: '确定修改公里并保存',
226   - Cancel: '取消'
227   - }
228   - });*/
229   - //}
230   - //else
231 208 postData(data);
232 209 });
233 210  
... ... @@ -238,6 +215,8 @@
238 215 notify_succ('操作成功!');
239 216 //计算应发未发
240 217 gb_schedule_table.calc_yfwf_num(sch.xlBm);
  218 + //更新路牌公里统计面板
  219 + gb_schedule_table.showLpMileageTipBySch(sch);
241 220 });
242 221 };
243 222  
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/lj_zrw.html
... ... @@ -153,13 +153,13 @@
153 153 </script>
154 154  
155 155 <script id="sub_task-fail-status-temp" type="text/html">
156   - <div class="child-task-status fail"><i class="uk-icon-times-circle"></i> 营运里程 与主任务不符,请检查子任务
  156 + <div class="child-task-status fail"><i class="uk-icon-times-circle"></i> 子任务营运公里与计划不平
157 157 <span class="calc-detail">{{calcs}}</span></div>
158 158 </script>
159 159  
160 160 <script>
161 161 (function () {
162   - var modal_opts = {center: false, bgclose: false, modal: false}
  162 + var modal_opts = {center: false, bgclose: false, modal: false};
163 163 var modal = '#schedule-lj_zrw-modal',
164 164 f,
165 165 m_t_body = '.main-schedule-table .ct_table_body',
... ... @@ -277,7 +277,7 @@
277 277 var i = 0;
278 278 if (sch.cTasks.length == 0)
279 279 return;
280   - var sum = 0, calcs = '';
  280 + var sum = 0, calcs = ' ';
281 281 $.each(sch.cTasks, function () {
282 282 if (this.mileageType == 'service') {
283 283 sum = gb_common.accAdd(sum, this.mileage);
... ... @@ -287,13 +287,16 @@
287 287 });
288 288 //公里与主任务不符合
289 289 if (sum != sch.jhlcOrig) {
290   - if (i > 1)
291   - calcs += ('=' + sum);
  290 + $('.uk-panel-box-secondary', modal).addClass('c_task_mileage_abnormal');
  291 + /*if (i > 1)
  292 + calcs += ('=' + sum);*/
292 293 calcs += (' ≠ ' + sch.jhlcOrig);
293 294 calcs = calcs.substr(3);
294 295 var htmlStr = template('sub_task-fail-status-temp', {calcs: calcs});
295 296 $('#childTaskTitle', modal).append(htmlStr);
296 297 }
  298 + else
  299 + $('.uk-panel-box-secondary', modal).removeClass('c_task_mileage_abnormal');
297 300 };
298 301  
299 302 //新增临加
... ... @@ -323,10 +326,12 @@
323 326 gb_schedule_table.updateSchedule(rs.ts);
324 327 gb_schedule_table.deheteSchedule(rs.delete);
325 328 $('.main-schedule-table', modal).trigger('refresh');
  329 + //更新路牌公里统计面板
  330 + gb_schedule_table.showLpMileageTipBySch(sch);
326 331 });
327 332 }, '确定删除');
328 333 };
329   - //添加自定义子任务
  334 + /* //添加自定义子任务
330 335 var add_sub_task_other = function () {
331 336 var sch = getActiveSch();
332 337 if (!sch)
... ... @@ -376,8 +381,32 @@
376 381 open_modal(folder + '/sub_task/add_sub_task_range_turn.html', {
377 382 sch: sch
378 383 }, modal_opts);
379   - };
  384 + };*/
  385 +
  386 + //修改子任务
  387 + var edit_sub_task = function () {
  388 + var sch = getActiveSch();
  389 + if (!sch)
  390 + return notify_err('无法获取到主任务信息!');
  391 + var activeDl = $(s_t_body, modal).find('dl.context-menu-active');
  392 + if (activeDl.length == 0)
  393 + return;
  394 + var id = activeDl.data('id');
380 395  
  396 + var cTask;
  397 + for(var i=0,obj;obj=sch.cTasks[i++];){
  398 + if(obj.id==id){
  399 + cTask = obj;
  400 + break;
  401 + }
  402 + }
  403 + //打开子任务修改modal
  404 + open_modal(folder + '/sub_task_v2/edit.html', {
  405 + sch: sch,
  406 + cTask: cTask
  407 + }, modal_opts);
  408 + };
  409 +
381 410 //删除子任务
382 411 var remove_sub_task = function () {
383 412 var activeDl = $(s_t_body, modal).find('dl.context-menu-active');
... ... @@ -396,10 +425,12 @@
396 425 //选中班次
397 426 selectedDl(rs.t);
398 427 }, 300);
  428 + //更新路牌公里统计面板
  429 + gb_schedule_table.showLpMileageTipBySch(rs.t);
399 430 });
400 431 }, '确定删除');
401 432 };
402   - //加油
  433 + /*//加油
403 434 var add_oil = function () {
404 435 var sch = getActiveSch();
405 436 if (!sch)
... ... @@ -412,7 +443,7 @@
412 443 open_modal(folder + '/sub_task/add_sub_task_oil.html', {
413 444 sch: sch
414 445 }, modal_opts);
415   - };
  446 + };*/
416 447  
417 448 var add_sub_task = function () {
418 449 var sch = getActiveSch();
... ... @@ -429,14 +460,15 @@
429 460 var callbackHandler = {
430 461 add_temp_sch: add_temp_sch,
431 462 remove_sch: remove_sch,
432   - add_sub_task_other: add_sub_task_other,
433   - add_sub_task_in: add_sub_task_in,
  463 + //add_sub_task_other: add_sub_task_other,
  464 + //add_sub_task_in: add_sub_task_in,
434 465 remove_sub_task: remove_sub_task,
435   - add_sub_task_out: add_sub_task_out,
436   - add_sub_task_range_turn: add_sub_task_range_turn,
437   - add_oil: add_oil,
  466 + //add_sub_task_out: add_sub_task_out,
  467 + //add_sub_task_range_turn: add_sub_task_range_turn,
  468 + //add_oil: add_oil,
438 469  
439   - add_sub_task: add_sub_task
  470 + add_sub_task: add_sub_task,
  471 + edit_sub_task: edit_sub_task
440 472 };
441 473  
442 474 //右键菜单
... ... @@ -451,24 +483,7 @@
451 483 name: "临加班次"
452 484 },
453 485 "add_sub_task": {
454   - name: "添加子任务"/*,
455   - items: {
456   - 'add_oil':{
457   - name: '空驶进出场'
458   - },
459   - 'add_sub_task_in': {
460   - name: '进场'
461   - },
462   - 'add_sub_task_out': {
463   - name: '出场'
464   - },
465   - 'add_sub_task_range_turn': {
466   - name: '区间调头'
467   - },
468   - 'add_sub_task_other': {
469   - name: '自定义'
470   - }
471   - }*/
  486 + name: "添加子任务"
472 487 },
473 488 'remove_sch': {
474 489 name: '删除'
... ... @@ -484,6 +499,10 @@
484 499 callbackHandler[key] && callbackHandler[key]();
485 500 },
486 501 items: {
  502 + "edit_sub_task":{
  503 + name: '修改子任务',
  504 + icon: 'edit'
  505 + },
487 506 "remove_sub_task": {
488 507 name: "删除子任务"
489 508 , icon: "delete"
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/add_custom.html
... ... @@ -44,7 +44,7 @@
44 44  
45 45 //班次类型切换
46 46 if(bcTypeMap[sch.bcType])
47   - $('[name=type2]', f).val(bcTypeMap[sch.bcType])
  47 + $('[name=type2]', f).val(bcTypeMap[sch.bcType]);
48 48 $('[name=type2]', f).trigger('change');
49 49  
50 50 //滚动条到底
... ... @@ -89,6 +89,9 @@
89 89 UIkit.modal('#add-sub-task-main-modal').hide();
90 90 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
91 91 gb_data_basic.reload_stat_park_data();
  92 +
  93 + //更新路牌公里统计面板
  94 + gb_schedule_table.showLpMileageTipBySch(sch);
92 95 return;
93 96 }
94 97 var data = dataArray[i];
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/add_in_out.html
... ... @@ -289,6 +289,9 @@
289 289 UIkit.modal('#add-sub-task-main-modal').hide();
290 290 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
291 291 gb_data_basic.reload_stat_park_data();
  292 +
  293 + //更新路牌公里统计面板
  294 + gb_schedule_table.showLpMileageTipBySch(sch);
292 295 return;
293 296 }
294 297 var data = dataArray[i];
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/add_range_normal.html
... ... @@ -127,6 +127,9 @@
127 127 if (i >= dataArray.length) {
128 128 UIkit.modal('#add-sub-task-main-modal').hide();
129 129 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
  130 +
  131 + //更新路牌公里统计面板
  132 + gb_schedule_table.showLpMileageTipBySch(sch);
130 133 return;
131 134 }
132 135 var data = dataArray[i];
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/add_range_turn.html
... ... @@ -263,6 +263,9 @@
263 263 UIkit.modal('#add-sub-task-main-modal').hide();
264 264 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
265 265 gb_data_basic.reload_stat_park_data();
  266 +
  267 + //更新路牌公里统计面板
  268 + gb_schedule_table.showLpMileageTipBySch(sch);
266 269 return;
267 270 }
268 271 var data = dataArray[i];
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/edit.html 0 → 100644
  1 +<div class="uk-modal ct_move_modal" id="edit-sub-task-main-modal">
  2 + <div class="uk-modal-dialog" style="width: 800px;">
  3 + <a href="" class="uk-modal-close uk-close"></a>
  4 + <div class="uk-modal-header">
  5 + <h2>编辑子任务</h2></div>
  6 +
  7 + <div class="forms">
  8 +
  9 + </div>
  10 +
  11 + <div class="uk-modal-footer uk-text-right" style="margin-top: 5px;">
  12 + <button type="button" class="uk-button uk-modal-close">取消</button>
  13 + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> &nbsp;保存</button>
  14 + </div>
  15 + </div>
  16 +
  17 + <script id="sub-task-v2-edit-form-temp" type="text/html">
  18 + <form class="uk-form uk-form-horizontal sub_task_form_v2" style="background:#fff;">
  19 + <input type="hidden" value="{{sch.id}}" name="schedule.id" sch_id_inp>
  20 + <input type="hidden" value="正常" name="type1">
  21 + <input type="hidden" value="{{cTask.id}}" name="id">
  22 + <div class="uk-grid">
  23 + <div class="uk-width-1-3">
  24 + <div class="uk-form-row">
  25 + <label class="uk-form-label">班次类型</label>
  26 + <div class="uk-form-controls">
  27 + <select class="form-control nt-dictionary" data-code="-100" name="type2"
  28 + data-group=ChildTaskType></select>
  29 + </div>
  30 + </div>
  31 + </div>
  32 + <div class="uk-width-1-3">
  33 + <div class="uk-form-row">
  34 + <label class="uk-form-label">起点 </label>
  35 + <div class="uk-form-controls">
  36 + <select name="startStation" required></select>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div class="uk-width-1-3">
  41 + <div class="uk-form-row">
  42 + <label class="uk-form-label">终点</label>
  43 + <div class="uk-form-controls">
  44 + <select name="endStation" required></select>
  45 + </div>
  46 + </div>
  47 + </div>
  48 + </div>
  49 +
  50 + <div class="uk-grid">
  51 + <div class="uk-width-1-3">
  52 + <div class="uk-form-row">
  53 + <label class="uk-form-label">开始时间</label>
  54 + <div class="uk-form-controls">
  55 + <input name="startDate" value="{{cTask.startDate}}" type="time"
  56 + required>
  57 + </div>
  58 + </div>
  59 + </div>
  60 + <div class="uk-width-1-3">
  61 + <div class="uk-form-row">
  62 + <label class="uk-form-label">结束时间</label>
  63 + <div class="uk-form-controls">
  64 + <input name="endDate" value="{{cTask.endDate}}" type="time" required>
  65 + </div>
  66 + </div>
  67 + </div>
  68 + <div class="uk-width-1-3">
  69 + <div class="uk-form-row">
  70 + <label class="uk-form-label">公里</label>
  71 + <div class="uk-form-controls">
  72 + <input class="form-control" name="mileage" max=222 data-fv-lessthan-inclusive="false"
  73 + required style="width: 42%;" value="{{cTask.mileage}}">
  74 + <select class="form-control nt-dictionary" required name="mileageType"
  75 + data-group="MileageType" style="width: 52%;"></select>
  76 + </div>
  77 + </div>
  78 + </div>
  79 + </div>
  80 +
  81 + <div class="uk-grid">
  82 + <div class="uk-width-2-3 domains"></div>
  83 + <div class="uk-width-1-3">
  84 + <div class="uk-form-row">
  85 + <label class="uk-form-label">备注</label>
  86 + <div class="uk-form-controls">
  87 + <!--<select class="form-control nt-dictionary" required name="remarks"></select>-->
  88 + <input class="form-control" value="{{cTask.remarks}}" name="remarks" data-fv-stringlength-max="50" data-fv-stringlength="true">
  89 + </div>
  90 + </div>
  91 + </div>
  92 + </div>
  93 + </form>
  94 + </script>
  95 +
  96 + <script id="st-edit-domains-inout-form-temp" type="text/html">
  97 + <div class="uk-grid">
  98 + <div class="uk-width-1-2">
  99 + <div class="uk-form-row" style="padding-top: 5px;">
  100 + <label class="uk-form-label"></label>
  101 + <div class="uk-form-controls">
  102 + <label data-uk-tooltip title="无人售票线路,请忽略这个选项">
  103 + <input type="checkbox" value=1 name="noClerk" class="i-cbox"> 无售票员
  104 + </label>
  105 + </div>
  106 + </div>
  107 + </div>
  108 + <div class="uk-width-1-2 destroy_reason_wrap">
  109 + <div class="uk-form-row">
  110 + <label class="uk-form-label">进出场原因</label>
  111 + <div class="uk-form-controls">
  112 + <select class="form-control" name="reason" required>
  113 + <option value="">请选择...</option>
  114 + {{each inOutExps as exp i}}
  115 + <option value="{{exp}}">{{exp}}</option>
  116 + {{/each}}
  117 + </select>
  118 + </div>
  119 + </div>
  120 + </div>
  121 + </div>
  122 + </script>
  123 +
  124 + <script id="st-edit-domains-service-form-temp" type="text/html">
  125 + <div class="uk-grid">
  126 + <div class="uk-width-1-2">
  127 + <div class="uk-form-row" style="padding-top: 5px;">
  128 + <label class="uk-form-label"></label>
  129 + <div class="uk-form-controls">
  130 + <label>
  131 + <input type="checkbox" value=1 name="destroy" class="i-cbox"> 是否烂班
  132 + </label>
  133 + </div>
  134 + </div>
  135 + </div>
  136 + <div class="uk-width-1-2 destroy_reason_wrap" style="display: none;">
  137 + <div class="uk-form-row">
  138 + <label class="uk-form-label">烂班原因</label>
  139 + <div class="uk-form-controls">
  140 + <select class="form-control" name="reason" required>
  141 + <option value="">请选择...</option>
  142 + {{each adjustExps as exp i}}
  143 + <option value="{{exp}}">{{exp}}</option>
  144 + {{/each}}
  145 + </select>
  146 + </div>
  147 + </div>
  148 + </div>
  149 + </div>
  150 + </script>
  151 + <script>
  152 + (function () {
  153 + var modal = '#edit-sub-task-main-modal', sch, cTask,
  154 + stationRoutes,
  155 + parks,
  156 + information,
  157 + st_park_data;
  158 +
  159 + $(modal).on('init', function (e, data) {
  160 + e.stopPropagation();
  161 + sch = data.sch;
  162 + cTask = data.cTask;
  163 +
  164 + //站到场数据
  165 + st_park_data = gb_data_basic.get_stat_park_data()[sch.xlBm];
  166 + //站点路由
  167 + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) {
  168 + return a.stationRouteCode - b.stationRouteCode;
  169 + }), 'directions');
  170 + //停车场
  171 + parks = gb_data_basic.simpleParksArray();
  172 + //线路标准
  173 + information = gb_data_basic.getLineInformation(sch.xlBm);
  174 + //停车场排序,常用的放前面
  175 + parks = sort_parks(parks, information, st_park_data);
  176 +
  177 + var htmlStr = template('sub-task-v2-edit-form-temp', {sch: sch, cTask: cTask});
  178 + var f = $(htmlStr);
  179 + $('.forms', modal).append(f);
  180 + //字典转换
  181 + dictionaryUtils.transformDom($('.nt-dictionary', f));
  182 +
  183 + //设置下拉框默认值
  184 + $f('type2', f).val(cTask.type2).trigger('change');//班次类型
  185 + $f('startStation', f).val(cTask.startStation);//起点站
  186 + $f('endStation', f).val(cTask.endStation);//终点站
  187 + $f('mileageType', f).val(cTask.mileageType);//里程类型
  188 + if(cTask.destroy)
  189 + $f('destroy', f).trigger('click');//烂班
  190 + if(cTask.reason)
  191 + $f('reason', f).val(cTask.reason);//原因
  192 + if(cTask.noClerk)
  193 + $f('noClerk', f).trigger('click');//无售票员
  194 +
  195 + f.formValidation({
  196 + framework: 'uikit',
  197 + locale: 'zh_CN'
  198 + });
  199 + $('button[type=submit]', modal).on('click', function () {
  200 + f.formValidation('validate');
  201 + });
  202 +
  203 + //提交
  204 + f.on('success.form.fv', function (e) {
  205 + e.preventDefault();
  206 + $('button[type=submit]', modal).attr('disabled', 'disabled');
  207 +
  208 + var data=$.extend(f.serializeJSON(), gb_common.getDisabledVal(f));
  209 +
  210 + gb_common.$post('/childTask/update', data, function (rs) {
  211 + notify_succ('修改成功!');
  212 + gb_schedule_table.updateSchedule(rs.t);
  213 +
  214 + UIkit.modal(modal).hide();
  215 + $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
  216 +
  217 + //更新路牌公里统计面板
  218 + gb_schedule_table.showLpMileageTipBySch(rs.t);
  219 + });
  220 + });
  221 +
  222 + f.on('err.field.fv', function () {
  223 + $('button[type=submit]', modal).removeClass('disabled').removeAttr('disabled');
  224 + });
  225 + });
  226 +
  227 + //班次类型切换事件
  228 + $(modal).on('change', 'select[name=type2]', reCalcInputs_type);
  229 + //烂班选项点击事件
  230 + $(modal).on('change', 'input[name=destroy]', destroyClick);
  231 + //进出场原因切换
  232 + $(modal).on('change', 'select[name=reason]', reSynchroReason);
  233 +
  234 + /**
  235 + * 根据班次类型切换起终点下拉框
  236 + */
  237 + function reCalcInputs_type() {
  238 + var f = $(this).parents('.sub_task_form_v2');
  239 + var upDown = sch.xlDir;
  240 + if($('[name=upDown]', f).length>0)
  241 + upDown = $('[name=upDown]', f).val();
  242 + var routes = stationRoutes[upDown]
  243 + , lastCode = routes[routes.length - 1].stationCode
  244 + , opts = '', park_opts = '';
  245 + //station options
  246 + $.each(routes, function () {
  247 + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>'
  248 + });
  249 + //park options
  250 + for(var i=0,p;p=parks[i++];)
  251 + park_opts += '<option value="' + p.code + '">' + p.name + '</option>';
  252 + /*for (var code in parks)
  253 + park_opts += '<option value="' + code + '">' + parks[code] + '</option>';*/
  254 +
  255 + var qdz = $f('startStation', f), zdz = $f('endStation', f), mType = $f('mileageType', f);
  256 + var domainsTemp;
  257 + switch ($(this).val()) {
  258 + case '3'://出场
  259 + qdz.html(park_opts).val(information.carPark);
  260 + zdz.html(opts).trigger('change');
  261 + mType.val('empty').attr('disabled', 'disabled').trigger('change');
  262 + domainsTemp = 'st-edit-domains-inout-form-temp';
  263 + break;
  264 + case '2'://进场
  265 + qdz.html(opts);
  266 + zdz.html(park_opts).val(information.carPark).trigger('change');
  267 + mType.val('empty').attr('disabled', 'disabled').trigger('change');
  268 + domainsTemp = 'st-edit-domains-inout-form-temp';
  269 + break;
  270 + default:
  271 + qdz.html(opts);
  272 + zdz.html(opts).val(lastCode).trigger('change');
  273 + mType.val('service').removeAttr('disabled').trigger('change');
  274 + domainsTemp = 'st-edit-domains-service-form-temp';
  275 + }
  276 +
  277 + //可变选项区域
  278 + $('.domains', f).html(template(domainsTemp, {
  279 + adjustExps: gb_common.adjustExps,
  280 + inOutExps: gb_common.inOutExps
  281 + }));
  282 +
  283 + //校验reason
  284 + f.trigger('add_reason_field');
  285 + }
  286 +
  287 +
  288 + function $f(name, f) {
  289 + return $('[name=' + name + ']', f);
  290 + }
  291 +
  292 + /**
  293 + * 停车场排序
  294 + * @param parks 停车场 code 2 name
  295 + * @param information 线路标准
  296 + * @param st_park_data 站到场
  297 + */
  298 + function sort_parks(parks, information, st_park_data) {
  299 + var array = [], names=[];
  300 + for(var code in parks){
  301 + array.push({code: code, name: parks[code]});
  302 + }
  303 +
  304 + if(st_park_data && st_park_data.length > 0){
  305 + $.each(st_park_data, function () {
  306 + names.push(this.parkName);
  307 + });
  308 + }
  309 +
  310 + //debugger
  311 + array.sort(function (a, b) {
  312 + if(a.code==information.carPark)
  313 + return -1;
  314 + if(b.code==information.carPark)
  315 + return 1;
  316 +
  317 + var ai = names.indexOf(a.name),
  318 + bi = names.indexOf(b.name);
  319 +
  320 + if(ai!=-1 && bi==-1)
  321 + return -1;
  322 + else if(ai==-1 && bi!=-1)
  323 + return 1;
  324 + else
  325 + return a.name.localeCompare(b.name);
  326 + });
  327 + return array;
  328 + }
  329 +
  330 + function destroyClick() {
  331 + var f = $(this).parents('.sub_task_form_v2');
  332 + if (this.checked) {
  333 + $('.destroy_reason_wrap', f).show();
  334 + f.attr('destroy', true);//.addClass('destroy_form');
  335 + }
  336 + else {
  337 + $('.destroy_reason_wrap', f).hide();
  338 + f.removeAttr('destroy');//.removeClass('destroy_form');
  339 + }
  340 + //reCalcMileageCount();
  341 + }
  342 +
  343 + /**
  344 + * 切换原因
  345 + */
  346 + function reSynchroReason() {
  347 + var f = $(this).parents('.sub_task_form_v2'),
  348 + reason = $(this).val(),
  349 + remInput = $('[name=remarks]', f);
  350 +
  351 + if(remInput.val()==reason + ',')
  352 + return;
  353 + remInput.val(remInput.val() + reason + ',');
  354 + }
  355 + })();
  356 + </script>
  357 +</div>
0 358 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/main.html
... ... @@ -155,7 +155,7 @@
155 155 <div class="uk-form-row" style="padding-top: 5px;">
156 156 <label class="uk-form-label"></label>
157 157 <div class="uk-form-controls">
158   - <label data-uk-tooltip title="如是无人售票线路,忽略这个选项">
  158 + <label data-uk-tooltip title="无人售票线路,请忽略这个选项">
159 159 <input type="checkbox" value=1 name="noClerk" class="i-cbox"> 无售票员
160 160 </label>
161 161 </div>
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch/add_normal.html
... ... @@ -150,6 +150,10 @@
150 150 }catch (e){
151 151 console.log(e);}
152 152 UIkit.modal('#schedule-addsch-modal').hide();
  153 + //更新路牌公里统计面板
  154 + gb_schedule_table.showLpMileageTipBySch(rs.t);
  155 + }, function () {
  156 + enable_submit_btn(nf);
153 157 });
154 158 });
155 159 $('.ct_line_lp_badge', nf).html(sch.xlName + ',&nbsp;'+sch.lpName);
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch/add_park_to_park.html
... ... @@ -154,6 +154,10 @@
154 154 }catch (e){
155 155 console.log(e);}
156 156 UIkit.modal('#schedule-addsch-modal').hide();
  157 + //更新路牌公里统计面板
  158 + gb_schedule_table.showLpMileageTipBySch(rs.t);
  159 + }, function () {
  160 + enable_submit_btn(nf);
157 161 });
158 162 });
159 163 $('.ct_line_lp_badge', nf).html(sch.xlName + ',&nbsp;'+sch.lpName);
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch/add_two_way.html
... ... @@ -315,6 +315,8 @@
315 315 }catch (e){
316 316 console.log(e);}
317 317 UIkit.modal('#schedule-addsch-modal').hide();
  318 + //更新路牌公里统计面板
  319 + gb_schedule_table.showLpMileageTipBySch(last);
318 320 return;
319 321 }
320 322 submitFun(dataArray[i], function (rs) {
... ... @@ -323,6 +325,8 @@
323 325 upArr.push(rs.t);
324 326 i++;
325 327 f();
  328 + }, function () {
  329 + $('[type=submit]', wrap).removeClass('disabled').removeAttr('disabled');
326 330 });
327 331 })();
328 332 }
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch/main.html
... ... @@ -310,7 +310,7 @@
310 310 /**
311 311 * 提交表单
312 312 */
313   - function submit_temp_schedule_form(data, cb) {
  313 + function submit_temp_schedule_form(data, cb, err) {
314 314 data.xlBm = sch.xlBm;
315 315 data.xlName = sch.xlName;
316 316 data.lpName = sch.lpName;
... ... @@ -336,7 +336,7 @@
336 336 gb_common.$post('/realSchedule', data, function (rs) {
337 337 notify_succ('新增临加班次成功');
338 338 cb && cb(rs);
339   - });
  339 + }, err);
340 340 }
341 341 })();
342 342 </script>
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/layout.html
... ... @@ -11,9 +11,11 @@
11 11 <div class="card-panel"></div>
12 12 </div>
13 13 </div>
14   - <div class="uk-width-1-6" style="height: calc(100% - 1px);">
  14 + <div class="uk-width-1-6" style="height: calc(100% - 1px);position: relative;">
15 15 <div class="card-panel sys-mailbox" style="overflow: auto;">
16 16 </div>
  17 + <div class="mileage_elec_panel">
  18 + </div>
17 19 </div>
18 20 </div>
19 21  
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
... ... @@ -182,4 +182,17 @@
182 182 <span class="_badge">{{zdsj}}/{{zdsjActual}}</span>
183 183 </div>
184 184 </script>
  185 +
  186 + <script id="sch-lp-mileage-tip-temp" type="text/html">
  187 + {{each data as obj i}}
  188 + {{if i > 0}}<hr>{{/if}}
  189 +
  190 + <h5 class="_title"> <span class="lp_name">{{lpName}}</span>&nbsp;&nbsp;<a>{{obj.key}}</a></h5>
  191 + <div class="LD_item">
  192 + <span>营运:<a>{{obj.serviceMileage}}</a></span>
  193 + <span>烂班:<a>{{obj.destroyMileage}}</a></span>
  194 + <span>空驶:<a>{{obj.emptyMileage}}</a></span>
  195 + </div>
  196 + {{/each}}
  197 + </script>
185 198 </div>
... ...
src/main/resources/static/real_control_v2/js/common.js
... ... @@ -95,13 +95,13 @@ var gb_common = (function () {
95 95 });
96 96 };
97 97  
98   - var $post = function (url, data, successFun) {
  98 + var $post = function (url, data, successFun, errFun) {
99 99 $.ajax({
100 100 url: url,
101 101 method: 'POST',
102 102 data: data,
103 103 complete: function (xhr, ts) {
104   - ajaxComplete(xhr, ts, successFun);
  104 + ajaxComplete(xhr, ts, successFun, errFun);
105 105 }
106 106 });
107 107 };
... ... @@ -126,7 +126,7 @@ var gb_common = (function () {
126 126  
127 127 var errorHead = '<span style="color:red;">异常:</span>';
128 128  
129   - function successHandle(json, handle) {
  129 + function successHandle(json, handle, err) {
130 130 var status = json.status;
131 131 if (status == 407) {
132 132 location.href = '/login.html';
... ... @@ -142,18 +142,20 @@ var gb_common = (function () {
142 142 UIkit.modal.alert(errorHead + (json.msg ? json.msg : '未知异常'), {labels: {Ok: '确定'}});
143 143 //关闭wait窗口
144 144 hide_wait_modal();
  145 + err && err();
145 146 }
146 147 else
147 148 handle && handle(json);
148 149 }
149 150  
150   - function ajaxComplete(xhr, ts, succ) {
  151 + function ajaxComplete(xhr, ts, succ, err) {
151 152 if (ts == 'success') {
152   - successHandle(JSON.parse(xhr.responseText), succ);
  153 + successHandle(JSON.parse(xhr.responseText), succ, err);
153 154 } else if (ts == 'error') {
154 155 UIkit.modal.alert(errorHead + xhr.responseText, {labels: {Ok: '确定'}});
155 156 //关闭wait窗口
156 157 hide_wait_modal();
  158 + err && err();
157 159 }
158 160 }
159 161  
... ...
src/main/resources/static/real_control_v2/js/line_schedule/badge_tooltip.js
... ... @@ -44,25 +44,33 @@ var gb_schedule_badge_tootip = (function () {
44 44 show: _opts.show,
45 45 content: {
46 46 text: function() {
47   - var sch = getSch(this);
  47 + var sch = getSch(this),
  48 + serviceCount=0,
  49 + emptyCount=0;
48 50 //子任务排序
49 51 $.each(sch.cTasks, function () {
50 52 if(this.mileageType=='service'){
  53 + serviceCount = gb_common.accAdd(serviceCount, this.mileage);
51 54 if(this.type1=='正常')
52 55 this.order_no=0;
53 56 else
54 57 this.order_no=1;
55 58  
56   - if(this.destroy)
  59 + if(this.destroy){
57 60 this.order_no=2;
  61 + }
58 62 }
59   - else
  63 + else{
60 64 this.order_no=this.type2 + 1;
  65 + emptyCount = gb_common.accAdd(emptyCount, this.mileage);
  66 + }
61 67 });
62 68 var array = sch.cTasks.sort(function (a, b) {
63 69 return a.order_no - b.order_no;
64 70 });
65   - return temps['sch-table-task-tootip-temp']({tasks: array});
  71 + return temps['sch-table-task-tootip-temp'](
  72 + {tasks: array, sch_id: sch.id, lineCode: sch.xlBm, jhlc: sch.jhlc,
  73 + serviceCount: serviceCount, emptyCount: emptyCount});
66 74 }
67 75 },
68 76 position: _opts.position,
... ... @@ -74,6 +82,31 @@ var gb_schedule_badge_tootip = (function () {
74 82 });
75 83 });
76 84  
  85 + /**
  86 + * 子任务编辑
  87 + */
  88 + $(document).on('click', 'a.tip_task_edit_link', function () {
  89 + var schId = $(this).data('schid'),
  90 + taskId = $(this).data('id'),
  91 + lineCode = $(this).data('line');
  92 +
  93 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[schId];
  94 +
  95 + var cTask;
  96 + for(var i=0,obj;obj=sch.cTasks[i++];){
  97 + if(obj.id==taskId){
  98 + cTask = obj;
  99 + break;
  100 + }
  101 + }
  102 +
  103 + //打开子任务修改modal
  104 + open_modal('/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/edit.html', {
  105 + sch: sch,
  106 + cTask: cTask
  107 + }, {center: false, bgclose: false, modal: false});
  108 + });
  109 +
77 110 //区间 tootip
78 111 $(document).on('mouseenter', _badge+'.sch_region', function() {
79 112 $(this).qtip({
... ...
src/main/resources/static/real_control_v2/js/line_schedule/context_menu.js
... ... @@ -319,15 +319,15 @@ var gb_schedule_context_menu = (function () {
319 319 'fcxxwt': {
320 320 name: '发车信息微调'
321 321 },
  322 + 'sep3': '---------',
322 323 'lj_zrw': {
323 324 name: '临加/子任务'
324 325 },
325   - 'sep3': '---------',
326 326 'add_temp_sch': {
327   - name: '添加临加班次'
  327 + name: '新增临加班次'
328 328 },
329 329 'add_sub_task': {
330   - name: '添加子任务'
  330 + name: '新增子任务'
331 331 },
332 332 'sep4': '---------',
333 333 'tzrc': {
... ...
src/main/resources/static/real_control_v2/js/line_schedule/mileage_count.js 0 → 100644
  1 +
  2 +/**
  3 + * 统计班次公里
  4 + * @type {{}}
  5 + */
  6 +var gb_sch_mileage_count = (function () {
  7 +
  8 +
  9 + var isInOut = function (sch) {
  10 + return sch.bcType=='out' || sch.bcType=='in';
  11 + };
  12 +
  13 + return {
  14 + serviceMileage: function (array) {
  15 + var sum = 0;
  16 + var cts;
  17 +
  18 + for(var i=0,sch;sch=array[i++];){
  19 + if (sch.status == -1)
  20 + continue;
  21 +
  22 + if (isInOut(sch) || sch.bcType=='ldks')
  23 + continue;
  24 +
  25 + cts = sch['cTasks'];
  26 +
  27 + //有子任务
  28 + if (cts && cts.length > 0) {
  29 + for(var j=0,ct;ct=cts[j++];){
  30 + if (ct.mileageType=="service" && !ct.destroy)
  31 + sum = gb_common.accAdd(sum, ct.mileage);
  32 + }
  33 + }
  34 + else if(!sch.fcsjActual || !sch.zdsjActual)
  35 + continue;
  36 + else
  37 + sum = gb_common.accAdd(sum, sch.jhlc);
  38 + }
  39 +
  40 + return sum;
  41 + },
  42 + destroyMileage: function (array) {
  43 + var sum = 0;
  44 + var cts;
  45 +
  46 + for(var i=0,sch;sch=array[i++];){
  47 + if (isInOut(sch) || sch.bcType=='ldks' || sch.sflj)
  48 + continue;
  49 +
  50 + cts = sch['cTasks'];
  51 +
  52 + //有子任务
  53 + if (cts && cts.length > 0) {
  54 + for(var j=0,ct;ct=cts[j++];){
  55 + if (ct.destroy && ct.mileageType=="service")
  56 + sum = gb_common.accAdd(sum, ct.mileage);
  57 + }
  58 + }else if (sch.status == -1)
  59 + sum = gb_common.accAdd(sum, sch.jhlcOrig);
  60 + }
  61 +
  62 + return sum;
  63 + },
  64 + emptyMileage: function (array) {
  65 + var sum = 0;
  66 + var cts;
  67 +
  68 + for(var i=0,sch;sch=array[i++];){
  69 +
  70 + cts = sch['cTasks'];
  71 +
  72 + //有子任务
  73 + if (cts && cts.length > 0) {
  74 + for(var j=0,ct;ct=cts[j++];){
  75 + if (!ct.destroy && ct.mileageType=="empty")
  76 + sum = gb_common.accAdd(sum, ct.mileage);
  77 + }
  78 + }
  79 + else if(!sch.fcsjActual || !sch.zdsjActual)
  80 + continue;
  81 + else if ((isInOut(sch) || sch.bcType=="ldks") && sch.status != -1)
  82 + sum = gb_common.accAdd(sum, sch.jhlc);
  83 + }
  84 +
  85 + return sum;
  86 + }
  87 + }
  88 +})();
0 89 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
... ... @@ -461,9 +461,106 @@ var gb_schedule_table = (function () {
461 461 $('dl[data-id=' + this.id + ']', contWrap).addClass('relevance-active intimity');
462 462 });
463 463  
464   - notify_succ('高亮路牌 ' + sch.lpName);
  464 + //notify_succ('高亮路牌 ' + sch.lpName);
  465 + showLpMileageTip(lineCode, sch.lpName, schArr);
465 466 });
466 467  
  468 + var showLpMileageTipBySch = function (sch) {
  469 + if(!$('.mileage_elec_panel', $('.line_schedule[data-id='+sch.xlBm+']')).is(':visible'))
  470 + return;
  471 +
  472 + var schArr = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (item) {
  473 + return item.lpName == sch.lpName;
  474 + }).sort(schedule_sort);
  475 +
  476 + showLpMileageTip(sch.xlBm, sch.lpName, schArr);
  477 + };
  478 + /**
  479 + * 弹出路牌公里统计tip
  480 + * @param lineCode
  481 + * @param lpName
  482 + * @param array
  483 + */
  484 + var showLpMileageTip = function (lineCode, lpName, array) {
  485 + var wrap = $('.line_schedule[data-id='+lineCode+']');
  486 + //按驾驶员&车辆分组统计
  487 + var data=mileageTipGroupData(array);
  488 + //统计公里
  489 + var list=[];
  490 + for(var key in data){
  491 + list.push({
  492 + key : key,
  493 + serviceMileage: gb_sch_mileage_count.serviceMileage(data[key]),
  494 + destroyMileage: gb_sch_mileage_count.destroyMileage(data[key]),
  495 + emptyMileage: gb_sch_mileage_count.emptyMileage(data[key])
  496 + })
  497 + }
  498 + var htmlStr = temps['sch-lp-mileage-tip-temp']({data: list, lpName:lpName});
  499 + $('.mileage_elec_panel', wrap).html(htmlStr).addClass('uk-animation-slide-bottom').show()
  500 + .one('animationEnd', function () {
  501 + $(this).removeClass('uk-animation-slide-bottom');
  502 + });
  503 + };
  504 +
  505 + /**
  506 + * 分组数据,处理子任务里的中途换车
  507 + * @param array
  508 + */
  509 + var mileageTipGroupData = function (arr) {
  510 + var list = JSON.parse(JSON.stringify(arr));
  511 + var cts;
  512 + var zthcArray=[];
  513 + var sch;
  514 + for(var i=0,len=list.length;i<len;i++){
  515 + sch = list[i];
  516 + cts = sch['cTasks'];
  517 + if(!cts || cts.length==0)
  518 + continue;
  519 +
  520 + sch['cTasks'] = [];
  521 + //有子任务
  522 + for(var j=0,ct;ct=cts[j++];){
  523 + if(!ct.nbbm || ct.nbbm==sch.clZbh){
  524 + sch['cTasks'].push(ct);
  525 + continue;
  526 + }
  527 +
  528 + zthcArray.push(cloneByCTask(sch, ct));
  529 + }
  530 + }
  531 +
  532 + if(zthcArray.length > 0)
  533 + list = list.concat(zthcArray);
  534 +
  535 + var data={},key;
  536 + for(var i=0,len=list.length;i<len;i++){
  537 + key = list[i].clZbh+'/'+list[i].jGh+'('+list[i].jName+')';
  538 + if(!data[key])
  539 + data[key] = [];
  540 + data[key].push(list[i]);
  541 + }
  542 + return data;
  543 + };
  544 +
  545 + var cloneByCTask = function (sch, ct) {
  546 + var newObj = JSON.parse(JSON.stringify(sch));
  547 + newObj['cTasks']=[];
  548 + newObj.clZbh = ct.nbbm;
  549 + newObj.fcsjActual = ct.startDate;
  550 + newObj.zdsjActual = ct.endDate;
  551 + newObj.jhlc = ct.mileage;
  552 + newObj.jhlcOrig = ct.mileage;
  553 +
  554 + if(ct.type2=='1')
  555 + newObj.bcType='normal';
  556 + else if(ct.type2=='2'){
  557 + newObj.bcType='in';
  558 + }else if(ct.type2=='3')
  559 + newObj.bcType='out';
  560 +
  561 + return newObj;
  562 + };
  563 +
467 564 //头部点击去掉选中光标
468 565 $(document).on('click', '.header-title', function () {
469 566 reset_drag_active_all(this);
... ... @@ -487,6 +584,8 @@ var gb_schedule_table = (function () {
487 584 var reset_drag_active_all = function (dd) {
488 585 $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active');
489 586 reset_relevance_active(dd);
  587 +
  588 + $('.mileage_elec_panel', $(dd).parents('.top-container')).hide().remove('uk-animation-slide-bottom');
490 589 };
491 590  
492 591 var reset_relevance_active = function (dd) {
... ... @@ -685,6 +784,7 @@ var gb_schedule_table = (function () {
685 784 cancelLateBadge: cancelLateBadge,
686 785 refreshAll: refreshAll,
687 786 getNextNormalSch: getNextNormalSch,
688   - findNbbmByLineCode:findNbbmByLineCode
  787 + findNbbmByLineCode:findNbbmByLineCode,
  788 + showLpMileageTipBySch: showLpMileageTipBySch
689 789 };
690 790 })();
... ...
src/main/resources/static/real_control_v2/js/modal_extend.js
... ... @@ -97,12 +97,12 @@ var modal_move = function (m_header) {
97 97 dict.stY = win.scrollTop();
98 98  
99 99 //控制元素不被拖出窗口外
100   - var setRig = win.width() - _moveObj.outerWidth() + dict.stX
  100 + /*var setRig = win.width() - _moveObj.outerWidth() + dict.stX
101 101 ,setBot = win.height() - _moveObj.outerHeight() + dict.stY;
102 102 X < dict.stX && (X = dict.stX);
103 103 X > setRig && (X = setRig);
104 104 Y < dict.stY && (Y = dict.stY);
105   - Y > setBot && (Y = setBot);
  105 + Y > setBot && (Y = setBot);*/
106 106  
107 107 _moveObj.css({
108 108 left: X
... ...
src/main/resources/static/real_control_v2/js/safe_driv/call_phone.js
... ... @@ -4,51 +4,51 @@ var gb_call_phone = function () {
4 4 var wsUri = "ws://180.168.57.114:21892/";
5 5  
6 6 var nbbm2tel = {
7   - "S0E-178": "915618938041",
8   - "S0E-179": "915618937546",
9   - "S0E-182": "915618938047",
10   - "S0E-183": "915618937940",
11   - "S0E-186": "915601997470",
12   - "S0E-187": "915618846405",
13   - "S0E-043": "915618847457",
14   - "S0E-044": "915618845487",
15   - "S2F-070": "915618846479",
16   - "S2F-071": "915618820024",
17   - "S2F-072": "915618937945",
18   - "S2F-073": "915618937845",
19   - "S2F-075": "915618847416",
20   - "S2F-076": "915618847410",
21   - "S2F-077": "915618847413",
22   - "S2F-078": "915618847415",
23   - "S2F-079": "915618847417",
24   - "S2F-080": "915618847418",
25   - "S2F-083": "915618847420",
26   - "S2F-119": "915618951184",
27   - "W0F-018": "915618209534",
28   - "W0F-019": "915618951364",
29   - "W0F-020": "915618278604",
30   - "W0F-021": "915618278614",
31   - "W0F-022": "915618012546",
32   - "W0F-023": "915618278704",
33   - "W0F-024": "915618278594",
34   - "W0F-025": "915601989450",
35   - "W0F-026": "915618209194",
36   - "W0F-027": "915618208724",
37   - "W0F-028": "915618278624",
38   - "W0F-029": "915601988491",
39   - "W0F-030": "915618209324",
40   - "W0F-031": "915618928940",
41   - "W0F-069": "915618011142",
42   - "W0F-070": "915618279534",
43   - "W0F-071": "915618847426",
44   - "W0F-072": "915618011245",
45   - "W0F-073": "915618010242",
46   - "W0F-074": "915618279594",
47   - "W0F-075": "915618588143",
48   - "W0F-089": "915618011747",
49   - "W0F-090": "915618279574",
50   - "S2F-069": "915618938143",
51   - "S2F-081": "915618950034"
  7 + "S0E-178":"915618938041",
  8 + "S0E-179":"915618937546",
  9 + "S0E-182":"915618938047",
  10 + "S0E-183":"915618937940",
  11 + "S0E-186":"915601989452",
  12 + "S0E-187":"915618846405",
  13 + "S0E-043":"915618847457",
  14 + "S0E-044":"915618845487",
  15 + "S2F-070":"915618846479",
  16 + "S2F-071":"915601989461",
  17 + "S2F-072":"915618937945",
  18 + "S2F-073":"915618937845",
  19 + "S2F-075":"915618847416",
  20 + "S2F-076":"915618847410",
  21 + "S2F-077":"915618847413",
  22 + "S2F-078":"915618847415",
  23 + "S2F-079":"915618847417",
  24 + "S2F-080":"915618847418",
  25 + "S2F-083":"915618847420",
  26 + "S2F-119":"915601987406",
  27 + "W0F-018":"915618209534",
  28 + "W0F-019":"915601987405",
  29 + "W0F-020":"915618278604",
  30 + "W0F-021":"915618278614",
  31 + "W0F-022":"915618012546",
  32 + "W0F-023":"915618278704",
  33 + "W0F-024":"915618278594",
  34 + "W0F-025":"915601989450",
  35 + "W0F-026":"915618209194",
  36 + "W0F-027":"915618208724",
  37 + "W0F-028":"915618278624",
  38 + "W0F-029":"915601988491",
  39 + "W0F-030":"915618936848",
  40 + "W0F-031":"915618928940",
  41 + "W0F-069":"915618011142",
  42 + "W0F-070":"915618279534",
  43 + "W0F-071":"915601989439",
  44 + "W0F-072":"915618011245",
  45 + "W0F-073":"915618010242",
  46 + "W0F-074":"915618279594",
  47 + "W0F-075":"915618010947",
  48 + "W0F-089":"915618011747",
  49 + "W0F-090":"915618279574",
  50 + "S2F-069":"915618938143",
  51 + "S2F-081":"915601986481"
52 52 };
53 53  
54 54 var locData = window.localStorage.getItem('test_nbbm2tel_json');
... ...
src/main/resources/static/real_control_v2/js/websocket/sch_websocket.js
... ... @@ -151,6 +151,8 @@ var gb_sch_websocket = (function () {
151 151 gb_tts.speak(ttsMsg, msg.t.xlBm);
152 152  
153 153 calcUntreated(msg.t.xlBm);
  154 + //更新路牌公里统计面板
  155 + gb_schedule_table.showLpMileageTipBySch(msg.t);
154 156 };
155 157  
156 158 //服务器通知刷新班次
... ...
src/main/resources/static/real_control_v2/main.html
... ... @@ -55,7 +55,7 @@
55 55 <div class="uk-width-4-10">
56 56 <div class="uk-panel">
57 57 <h2 class="north-logo">
58   - <i class="uk-icon-life-ring"></i> 浦东公交线路调度
  58 + <!--<i class="uk-icon-life-ring"></i>--> 浦东公交线路调度
59 59 </h2>
60 60 </div>
61 61 </div>
... ... @@ -199,6 +199,7 @@
199 199 <script src="/real_control_v2/js/line_schedule/dbclick.js" merge="custom_js"></script>
200 200 <script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script>
201 201 <script src="/real_control_v2/js/line_schedule/badge_tooltip.js" merge="custom_js"></script>
  202 +<script src="/real_control_v2/js/line_schedule/mileage_count.js" merge="custom_js"></script>
202 203  
203 204 <!-- 字典相关 -->
204 205 <script src="/assets/js/dictionary.js" merge="custom_js"></script>
... ...
src/main/resources/static/real_control_v2/mapmonitor/js/playback.js
... ... @@ -26,6 +26,7 @@ var gb_map_play_back = (function () {
26 26 title: '<i class="uk-icon-play-circle"></i> 轨迹回放',
27 27 shadeClose: true,
28 28 shade: false,
  29 + moveOut: true,
29 30 maxmin: true, //开启最大化最小化按钮
30 31 area: ['1299px', '754px'],
31 32 //moveOut: true,
... ...