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,4 +27,9 @@ public class ChildTaskPlanController extends BaseController<ChildTaskPlan, Long>
27 public Map<String, Object> delHistory(@PathVariable("id") Long id){ 27 public Map<String, Object> delHistory(@PathVariable("id") Long id){
28 return childTaskPlanService.delHistory(id); 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,7 +159,7 @@ public class InStationProcess {
159 logger.info("车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual()); 159 logger.info("车辆:" + nbbm + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual());
160 160
161 //清除车辆误点调整监听 161 //清除车辆误点调整监听
162 - LateAdjustHandle.remove(nbbm); 162 + LateAdjustHandle.remove(sch);
163 163
164 //将gps转换成下一个班次走向的站内信号(应对只有一个站内信号 即 发出时) 164 //将gps转换成下一个班次走向的站内信号(应对只有一个站内信号 即 发出时)
165 transformUpDown(gps, next); 165 transformUpDown(gps, next);
src/main/java/com/bsth/data/gpsdata_v2/handlers/OutStationProcess.java
@@ -113,7 +113,7 @@ public class OutStationProcess { @@ -113,7 +113,7 @@ public class OutStationProcess {
113 dayOfSchedule.save(sch); 113 dayOfSchedule.save(sch);
114 114
115 //清理应发未发标记 115 //清理应发未发标记
116 - LateAdjustHandle.remove(sch.getClZbh()); 116 + LateAdjustHandle.remove(sch);
117 117
118 //发车的时候,同步一下状态 118 //发车的时候,同步一下状态
119 if (!gps.isService() && !dayOfSchedule.emptyService(sch)) 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,7 +14,7 @@ import java.util.Map;
14 * Created by panzhao on 2017/12/28. 14 * Created by panzhao on 2017/12/28.
15 */ 15 */
16 @Component 16 @Component
17 -public class FixedEnableVerionsThread extends Thread{ 17 +public class FixedEnableVerionsThread extends Thread {
18 18
19 @Autowired 19 @Autowired
20 JdbcTemplate jdbcTemplate; 20 JdbcTemplate jdbcTemplate;
@@ -26,34 +26,39 @@ public class FixedEnableVerionsThread extends Thread{ @@ -26,34 +26,39 @@ public class FixedEnableVerionsThread extends Thread{
26 26
27 @Override 27 @Override
28 public void run() { 28 public void run() {
29 - try{ 29 + try {
30 30
31 String sql = "select * from bsth_c_line_versions where status=2 and start_date<=SYSDATE()"; 31 String sql = "select * from bsth_c_line_versions where status=2 and start_date<=SYSDATE()";
32 32
33 List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); 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 String[] ks; 51 String[] ks;
51 - for(String keys : syncs){ 52 + for (String keys : syncs) {
52 ks = keys.split("_"); 53 ks = keys.split("_");
53 54
54 enableRouteVersionHandler.sync(ks[0], Integer.parseInt(ks[1])); 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 logger.error("", e); 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,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 if(lateSchMap.containsKey(nbbm)){ 121 if(lateSchMap.containsKey(nbbm)){
122 ScheduleRealInfo sch = lateSchMap.get(nbbm); 122 ScheduleRealInfo sch = lateSchMap.get(nbbm);
123 sch.setLate2(false); 123 sch.setLate2(false);
@@ -127,7 +127,7 @@ public class LateAdjustHandle implements ApplicationContextAware{ @@ -127,7 +127,7 @@ public class LateAdjustHandle implements ApplicationContextAware{
127 lateSchMap.remove(nbbm); 127 lateSchMap.remove(nbbm);
128 logger.info("移除误点调整 nbbm -" + nbbm); 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,14 +74,6 @@ public class ScheduleRefreshThread extends Thread{
74 //重载排班数据 74 //重载排班数据
75 dayOfSchedule.reloadSch(lineCode, currSchDate, false); 75 dayOfSchedule.reloadSch(lineCode, currSchDate, false);
76 logger.info(lineCode + "翻班完成, " + currSchDate + " -班次数量:" + dayOfSchedule.findByLineCode(lineCode).size()); 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 }catch (Exception e){ 78 }catch (Exception e){
87 logger.error("班次更新失败!! -" + lineCode, e); 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,14 +174,17 @@ public class GeoDataServiceImpl implements GeoDataService {
174 int id = Integer.parseInt(map.get("id").toString()); 174 int id = Integer.parseInt(map.get("id").toString());
175 String name = map.get("stationName").toString(); 175 String name = map.get("stationName").toString();
176 String code = map.get("stationCode").toString(); 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 jdbcTemplate.update("update bsth_c_ls_stationroute set station_name=? where id=?", name, id); 181 jdbcTemplate.update("update bsth_c_ls_stationroute set station_name=? where id=?", name, id);
182 //更新站点 182 //更新站点
183 jdbcTemplate.update("update bsth_c_station set station_name=? where station_cod=?", name, code); 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 tran.commit(status); 188 tran.commit(status);
186 189
187 rs.put("station", findOne(id)); 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,7 +15,6 @@ import com.bsth.repository.CarParkRepository;
15 import com.bsth.repository.StationRepository; 15 import com.bsth.repository.StationRepository;
16 import com.bsth.repository.realcontrol.ScheduleRealInfoRepository; 16 import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
17 import com.bsth.service.gps.entity.*; 17 import com.bsth.service.gps.entity.*;
18 -import com.bsth.util.DateUtils;  
19 import com.bsth.util.TransGPS; 18 import com.bsth.util.TransGPS;
20 import com.bsth.util.TransGPS.Location; 19 import com.bsth.util.TransGPS.Location;
21 import com.bsth.util.db.DBUtils_MS; 20 import com.bsth.util.db.DBUtils_MS;
@@ -32,6 +31,7 @@ import org.slf4j.Logger; @@ -32,6 +31,7 @@ import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory; 31 import org.slf4j.LoggerFactory;
33 import org.springframework.beans.factory.annotation.Autowired; 32 import org.springframework.beans.factory.annotation.Autowired;
34 import org.springframework.dao.DataAccessException; 33 import org.springframework.dao.DataAccessException;
  34 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
35 import org.springframework.jdbc.core.JdbcTemplate; 35 import org.springframework.jdbc.core.JdbcTemplate;
36 import org.springframework.stereotype.Service; 36 import org.springframework.stereotype.Service;
37 37
@@ -164,56 +164,134 @@ public class GpsServiceImpl implements GpsService { @@ -164,56 +164,134 @@ public class GpsServiceImpl implements GpsService {
164 return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0); 164 return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0);
165 } 165 }
166 166
  167 + private static DateTimeFormatter fmtyyyy = DateTimeFormat.forPattern("yyyy");
167 @Override 168 @Override
168 public List<Map<String, Object>> history(String[] nbbmArray, Long st, Long et) { 169 public List<Map<String, Object>> history(String[] nbbmArray, Long st, Long et) {
169 List<Map<String, Object>> list = new ArrayList<>(); 170 List<Map<String, Object>> list = new ArrayList<>();
170 - // 超过最大查询范围,直接忽略  
171 if (et - st > GPS_RANGE) 171 if (et - st > GPS_RANGE)
172 return list; 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 Calendar sCal = Calendar.getInstance(); 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 Calendar eCal = Calendar.getInstance(); 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 Collections.sort(list, new Comparator<Map<String, Object>>() { 296 Collections.sort(list, new Comparator<Map<String, Object>>() {
219 297
@@ -225,132 +303,97 @@ public class GpsServiceImpl implements GpsService { @@ -225,132 +303,97 @@ public class GpsServiceImpl implements GpsService {
225 return list; 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 logger.error("", e); 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 public static byte getGpsValid(long serviceState) { 349 public static byte getGpsValid(long serviceState) {
313 return (byte)(((serviceState & 0x80000000) == 0x80000000) ? 1 : 0); 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 Map<String, ArrivalEntity> map = new HashMap<>(); 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 return map; 398 return map;
356 } 399 }
@@ -612,14 +655,6 @@ public class GpsServiceImpl implements GpsService { @@ -612,14 +655,6 @@ public class GpsServiceImpl implements GpsService {
612 //获取历史gps 数据 655 //获取历史gps 数据
613 List<HistoryGps_DTOV3> list = HistoryGps_DTOV3.craete(history(new String[]{nbbm}, st, et)); 656 List<HistoryGps_DTOV3> list = HistoryGps_DTOV3.craete(history(new String[]{nbbm}, st, et));
614 if (list != null && list.size() > 0) { 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 Map<String, String> sectionCode2Name = GeoCacheData.sectionCode2NameMap(); 659 Map<String, String> sectionCode2Name = GeoCacheData.sectionCode2NameMap();
625 for(HistoryGps_DTOV3 gps : list){ 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,4 +10,6 @@ public interface ChildTaskPlanService extends BaseService&lt;ChildTaskPlan, Long&gt;{
10 Map<String,Object> saveHistory(ChildTaskPlan childTask); 10 Map<String,Object> saveHistory(ChildTaskPlan childTask);
11 11
12 Map<String,Object> delHistory(Long id); 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,6 +21,7 @@ import javax.transaction.Transactional;
21 import java.util.Date; 21 import java.util.Date;
22 import java.util.HashMap; 22 import java.util.HashMap;
23 import java.util.Map; 23 import java.util.Map;
  24 +import java.util.Set;
24 25
25 @Service 26 @Service
26 public class ChildTaskPlanServiceImpl extends BaseServiceImpl<ChildTaskPlan, Long> implements ChildTaskPlanService { 27 public class ChildTaskPlanServiceImpl extends BaseServiceImpl<ChildTaskPlan, Long> implements ChildTaskPlanService {
@@ -131,6 +132,66 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl&lt;ChildTaskPlan, Lon @@ -131,6 +132,66 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl&lt;ChildTaskPlan, Lon
131 return rs; 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 private String getStationName(String lineCode, String stationCode){ 195 private String getStationName(String lineCode, String stationCode){
135 String name; 196 String name;
136 String prefix1 = lineCode + "_" + 0 + "_", 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,6 +52,8 @@ var gb_data_submit = function () {
52 $(document).on('click', '.up_down_route_list .station_route .ul_li_input .save_icon_btn', function (e) { 52 $(document).on('click', '.up_down_route_list .station_route .ul_li_input .save_icon_btn', function (e) {
53 var f = $(this).parents('form'); 53 var f = $(this).parents('form');
54 var data = f.serializeJSON(); 54 var data = f.serializeJSON();
  55 + data.lineCode = g_line_code;
  56 + data.versions = g_version;
55 57
56 UIkit.modal.confirm('确定将站点名称修改为【'+data.stationName+'】?').then(function() { 58 UIkit.modal.confirm('确定将站点名称修改为【'+data.stationName+'】?').then(function() {
57 show_run_text('正在保存...'); 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,6 +152,7 @@ var gb_version_manage = function () {
152 var version = $(this).data('version'); 152 var version = $(this).data('version');
153 153
154 storage.setItem("geo_data_edit_line_version" , version); 154 storage.setItem("geo_data_edit_line_version" , version);
  155 + g_version = version;
155 $loadPanel.show(); 156 $loadPanel.show();
156 clearAll(); 157 clearAll();
157 startup(); 158 startup();
src/main/resources/static/pages/summary/destory_sch_detail/list.html
@@ -161,7 +161,7 @@ @@ -161,7 +161,7 @@
161 <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button> 161 <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button>
162 </div> 162 </div>
163 <div class="ct_field ct_field_bottom"> 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 </div> 165 </div>
166 </form> 166 </form>
167 </div> 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,7 +545,7 @@ dl.relevance-active.intimity dd:nth-child(n+2) {
545 dl.relevance-active.intimity dd:nth-child(n+2) a { 545 dl.relevance-active.intimity dd:nth-child(n+2) a {
546 color: white !important; 546 color: white !important;
547 } 547 }
548 - 548 +/*
549 dl.relevance-active dd.tl-qrlb, 549 dl.relevance-active dd.tl-qrlb,
550 dl.relevance-active.intimity dd.tl-qrlb{ 550 dl.relevance-active.intimity dd.tl-qrlb{
551 background: linear-gradient(to right, #a9a911, #808000, #8baabf) !important; 551 background: linear-gradient(to right, #a9a911, #808000, #8baabf) !important;
@@ -587,7 +587,7 @@ dl.relevance-active.intimity dd.tl-xxrd { @@ -587,7 +587,7 @@ dl.relevance-active.intimity dd.tl-xxrd {
587 dl.relevance-active dd.tl-xxfc, 587 dl.relevance-active dd.tl-xxfc,
588 dl.relevance-active.intimity dd.tl-xxfc { 588 dl.relevance-active.intimity dd.tl-xxfc {
589 background: linear-gradient(to right, #8baabf, rgb(43, 185, 185), rgb(0,255,255)) !important; 589 background: linear-gradient(to right, #8baabf, rgb(43, 185, 185), rgb(0,255,255)) !important;
590 -} 590 +}*/
591 591
592 dl.relevance-active.intimity dd span.fcsj-diff { 592 dl.relevance-active.intimity dd span.fcsj-diff {
593 color: #616060; 593 color: #616060;
src/main/resources/static/real_control_v2/css/main.css
@@ -1092,11 +1092,11 @@ dl.intimity span.late-badge{ @@ -1092,11 +1092,11 @@ dl.intimity span.late-badge{
1092 } 1092 }
1093 1093
1094 .qtip.sch-badge-tip{ 1094 .qtip.sch-badge-tip{
1095 - max-width: 500px; 1095 + max-width: 700px;
1096 } 1096 }
1097 1097
1098 .tip_task_list { 1098 .tip_task_list {
1099 - width: 460px; 1099 + width: 530px;
1100 margin-bottom: -10px; 1100 margin-bottom: -10px;
1101 } 1101 }
1102 .tip_task_list dl{ 1102 .tip_task_list dl{
@@ -1119,19 +1119,30 @@ dl.intimity span.late-badge{ @@ -1119,19 +1119,30 @@ dl.intimity span.late-badge{
1119 } 1119 }
1120 1120
1121 .tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1){ 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 .tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2){ 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 .tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3){ 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 .tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4){ 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 .tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5){ 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 .tip_task_list dl.service{ 1148 .tip_task_list dl.service{
@@ -1335,7 +1346,7 @@ ul.left_tabs_lg li{ @@ -1335,7 +1346,7 @@ ul.left_tabs_lg li{
1335 } 1346 }
1336 1347
1337 #add-sub-task-main-modal .forms{ 1348 #add-sub-task-main-modal .forms{
1338 - max-height: 488px; 1349 + max-height: 642px;
1339 overflow-y: auto; 1350 overflow-y: auto;
1340 overflow-x: hidden; 1351 overflow-x: hidden;
1341 padding: 8px 8px 0 0; 1352 padding: 8px 8px 0 0;
@@ -1800,4 +1811,109 @@ dl.active&gt;dd.disabled{ @@ -1800,4 +1811,109 @@ dl.active&gt;dd.disabled{
1800 1811
1801 .c_b_item>span.c_b_over{ 1812 .c_b_item>span.c_b_over{
1802 float: right; 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 \ No newline at end of file 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,6 +3,7 @@
3 <div class="tl-tip-panel"> 3 <div class="tl-tip-panel">
4 <div class="tip_task_list"> 4 <div class="tip_task_list">
5 <dl> 5 <dl>
  6 + <dt>操作</dt>
6 <dt>类型</dt> 7 <dt>类型</dt>
7 <dt>里程</dt> 8 <dt>里程</dt>
8 <dt>起点</dt> 9 <dt>起点</dt>
@@ -11,6 +12,7 @@ @@ -11,6 +12,7 @@
11 </dl> 12 </dl>
12 {{each tasks as t i}} 13 {{each tasks as t i}}
13 <dl class="{{t.mileageType}} {{if t.destroy}}destroy{{/if}} {{if t.type1=='临加'}}temp_add{{/if}}"> 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 <dd> 16 <dd>
15 {{if t.mileageType=="service"}} 17 {{if t.mileageType=="service"}}
16 营运 18 营运
@@ -35,6 +37,13 @@ @@ -35,6 +37,13 @@
35 <dd title="{{t.remarks}}">{{t.remarks}}</dd> 37 <dd title="{{t.remarks}}">{{t.remarks}}</dd>
36 </dl> 38 </dl>
37 {{/each}} 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 </div> 47 </div>
39 </div> 48 </div>
40 </script> 49 </script>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/fcxxwt.html
@@ -205,29 +205,6 @@ @@ -205,29 +205,6 @@
205 notify_err("当前操作需要选择调整原因!"); 205 notify_err("当前操作需要选择调整原因!");
206 return; 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 postData(data); 208 postData(data);
232 }); 209 });
233 210
@@ -238,6 +215,8 @@ @@ -238,6 +215,8 @@
238 notify_succ('操作成功!'); 215 notify_succ('操作成功!');
239 //计算应发未发 216 //计算应发未发
240 gb_schedule_table.calc_yfwf_num(sch.xlBm); 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,13 +153,13 @@
153 </script> 153 </script>
154 154
155 <script id="sub_task-fail-status-temp" type="text/html"> 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 <span class="calc-detail">{{calcs}}</span></div> 157 <span class="calc-detail">{{calcs}}</span></div>
158 </script> 158 </script>
159 159
160 <script> 160 <script>
161 (function () { 161 (function () {
162 - var modal_opts = {center: false, bgclose: false, modal: false} 162 + var modal_opts = {center: false, bgclose: false, modal: false};
163 var modal = '#schedule-lj_zrw-modal', 163 var modal = '#schedule-lj_zrw-modal',
164 f, 164 f,
165 m_t_body = '.main-schedule-table .ct_table_body', 165 m_t_body = '.main-schedule-table .ct_table_body',
@@ -277,7 +277,7 @@ @@ -277,7 +277,7 @@
277 var i = 0; 277 var i = 0;
278 if (sch.cTasks.length == 0) 278 if (sch.cTasks.length == 0)
279 return; 279 return;
280 - var sum = 0, calcs = ''; 280 + var sum = 0, calcs = ' ';
281 $.each(sch.cTasks, function () { 281 $.each(sch.cTasks, function () {
282 if (this.mileageType == 'service') { 282 if (this.mileageType == 'service') {
283 sum = gb_common.accAdd(sum, this.mileage); 283 sum = gb_common.accAdd(sum, this.mileage);
@@ -287,13 +287,16 @@ @@ -287,13 +287,16 @@
287 }); 287 });
288 //公里与主任务不符合 288 //公里与主任务不符合
289 if (sum != sch.jhlcOrig) { 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 calcs += (' ≠ ' + sch.jhlcOrig); 293 calcs += (' ≠ ' + sch.jhlcOrig);
293 calcs = calcs.substr(3); 294 calcs = calcs.substr(3);
294 var htmlStr = template('sub_task-fail-status-temp', {calcs: calcs}); 295 var htmlStr = template('sub_task-fail-status-temp', {calcs: calcs});
295 $('#childTaskTitle', modal).append(htmlStr); 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,10 +326,12 @@
323 gb_schedule_table.updateSchedule(rs.ts); 326 gb_schedule_table.updateSchedule(rs.ts);
324 gb_schedule_table.deheteSchedule(rs.delete); 327 gb_schedule_table.deheteSchedule(rs.delete);
325 $('.main-schedule-table', modal).trigger('refresh'); 328 $('.main-schedule-table', modal).trigger('refresh');
  329 + //更新路牌公里统计面板
  330 + gb_schedule_table.showLpMileageTipBySch(sch);
326 }); 331 });
327 }, '确定删除'); 332 }, '确定删除');
328 }; 333 };
329 - //添加自定义子任务 334 + /* //添加自定义子任务
330 var add_sub_task_other = function () { 335 var add_sub_task_other = function () {
331 var sch = getActiveSch(); 336 var sch = getActiveSch();
332 if (!sch) 337 if (!sch)
@@ -376,8 +381,32 @@ @@ -376,8 +381,32 @@
376 open_modal(folder + '/sub_task/add_sub_task_range_turn.html', { 381 open_modal(folder + '/sub_task/add_sub_task_range_turn.html', {
377 sch: sch 382 sch: sch
378 }, modal_opts); 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 var remove_sub_task = function () { 411 var remove_sub_task = function () {
383 var activeDl = $(s_t_body, modal).find('dl.context-menu-active'); 412 var activeDl = $(s_t_body, modal).find('dl.context-menu-active');
@@ -396,10 +425,12 @@ @@ -396,10 +425,12 @@
396 //选中班次 425 //选中班次
397 selectedDl(rs.t); 426 selectedDl(rs.t);
398 }, 300); 427 }, 300);
  428 + //更新路牌公里统计面板
  429 + gb_schedule_table.showLpMileageTipBySch(rs.t);
399 }); 430 });
400 }, '确定删除'); 431 }, '确定删除');
401 }; 432 };
402 - //加油 433 + /*//加油
403 var add_oil = function () { 434 var add_oil = function () {
404 var sch = getActiveSch(); 435 var sch = getActiveSch();
405 if (!sch) 436 if (!sch)
@@ -412,7 +443,7 @@ @@ -412,7 +443,7 @@
412 open_modal(folder + '/sub_task/add_sub_task_oil.html', { 443 open_modal(folder + '/sub_task/add_sub_task_oil.html', {
413 sch: sch 444 sch: sch
414 }, modal_opts); 445 }, modal_opts);
415 - }; 446 + };*/
416 447
417 var add_sub_task = function () { 448 var add_sub_task = function () {
418 var sch = getActiveSch(); 449 var sch = getActiveSch();
@@ -429,14 +460,15 @@ @@ -429,14 +460,15 @@
429 var callbackHandler = { 460 var callbackHandler = {
430 add_temp_sch: add_temp_sch, 461 add_temp_sch: add_temp_sch,
431 remove_sch: remove_sch, 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 remove_sub_task: remove_sub_task, 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,24 +483,7 @@
451 name: "临加班次" 483 name: "临加班次"
452 }, 484 },
453 "add_sub_task": { 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 'remove_sch': { 488 'remove_sch': {
474 name: '删除' 489 name: '删除'
@@ -484,6 +499,10 @@ @@ -484,6 +499,10 @@
484 callbackHandler[key] && callbackHandler[key](); 499 callbackHandler[key] && callbackHandler[key]();
485 }, 500 },
486 items: { 501 items: {
  502 + "edit_sub_task":{
  503 + name: '修改子任务',
  504 + icon: 'edit'
  505 + },
487 "remove_sub_task": { 506 "remove_sub_task": {
488 name: "删除子任务" 507 name: "删除子任务"
489 , icon: "delete" 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,7 +44,7 @@
44 44
45 //班次类型切换 45 //班次类型切换
46 if(bcTypeMap[sch.bcType]) 46 if(bcTypeMap[sch.bcType])
47 - $('[name=type2]', f).val(bcTypeMap[sch.bcType]) 47 + $('[name=type2]', f).val(bcTypeMap[sch.bcType]);
48 $('[name=type2]', f).trigger('change'); 48 $('[name=type2]', f).trigger('change');
49 49
50 //滚动条到底 50 //滚动条到底
@@ -89,6 +89,9 @@ @@ -89,6 +89,9 @@
89 UIkit.modal('#add-sub-task-main-modal').hide(); 89 UIkit.modal('#add-sub-task-main-modal').hide();
90 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch}); 90 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
91 gb_data_basic.reload_stat_park_data(); 91 gb_data_basic.reload_stat_park_data();
  92 +
  93 + //更新路牌公里统计面板
  94 + gb_schedule_table.showLpMileageTipBySch(sch);
92 return; 95 return;
93 } 96 }
94 var data = dataArray[i]; 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,6 +289,9 @@
289 UIkit.modal('#add-sub-task-main-modal').hide(); 289 UIkit.modal('#add-sub-task-main-modal').hide();
290 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch}); 290 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
291 gb_data_basic.reload_stat_park_data(); 291 gb_data_basic.reload_stat_park_data();
  292 +
  293 + //更新路牌公里统计面板
  294 + gb_schedule_table.showLpMileageTipBySch(sch);
292 return; 295 return;
293 } 296 }
294 var data = dataArray[i]; 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,6 +127,9 @@
127 if (i >= dataArray.length) { 127 if (i >= dataArray.length) {
128 UIkit.modal('#add-sub-task-main-modal').hide(); 128 UIkit.modal('#add-sub-task-main-modal').hide();
129 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch}); 129 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
  130 +
  131 + //更新路牌公里统计面板
  132 + gb_schedule_table.showLpMileageTipBySch(sch);
130 return; 133 return;
131 } 134 }
132 var data = dataArray[i]; 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,6 +263,9 @@
263 UIkit.modal('#add-sub-task-main-modal').hide(); 263 UIkit.modal('#add-sub-task-main-modal').hide();
264 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch}); 264 $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
265 gb_data_basic.reload_stat_park_data(); 265 gb_data_basic.reload_stat_park_data();
  266 +
  267 + //更新路牌公里统计面板
  268 + gb_schedule_table.showLpMileageTipBySch(sch);
266 return; 269 return;
267 } 270 }
268 var data = dataArray[i]; 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 \ No newline at end of file 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,7 +155,7 @@
155 <div class="uk-form-row" style="padding-top: 5px;"> 155 <div class="uk-form-row" style="padding-top: 5px;">
156 <label class="uk-form-label"></label> 156 <label class="uk-form-label"></label>
157 <div class="uk-form-controls"> 157 <div class="uk-form-controls">
158 - <label data-uk-tooltip title="如是无人售票线路,忽略这个选项"> 158 + <label data-uk-tooltip title="无人售票线路,请忽略这个选项">
159 <input type="checkbox" value=1 name="noClerk" class="i-cbox"> 无售票员 159 <input type="checkbox" value=1 name="noClerk" class="i-cbox"> 无售票员
160 </label> 160 </label>
161 </div> 161 </div>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch/add_normal.html
@@ -150,6 +150,10 @@ @@ -150,6 +150,10 @@
150 }catch (e){ 150 }catch (e){
151 console.log(e);} 151 console.log(e);}
152 UIkit.modal('#schedule-addsch-modal').hide(); 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 $('.ct_line_lp_badge', nf).html(sch.xlName + ',&nbsp;'+sch.lpName); 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,6 +154,10 @@
154 }catch (e){ 154 }catch (e){
155 console.log(e);} 155 console.log(e);}
156 UIkit.modal('#schedule-addsch-modal').hide(); 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 $('.ct_line_lp_badge', nf).html(sch.xlName + ',&nbsp;'+sch.lpName); 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,6 +315,8 @@
315 }catch (e){ 315 }catch (e){
316 console.log(e);} 316 console.log(e);}
317 UIkit.modal('#schedule-addsch-modal').hide(); 317 UIkit.modal('#schedule-addsch-modal').hide();
  318 + //更新路牌公里统计面板
  319 + gb_schedule_table.showLpMileageTipBySch(last);
318 return; 320 return;
319 } 321 }
320 submitFun(dataArray[i], function (rs) { 322 submitFun(dataArray[i], function (rs) {
@@ -323,6 +325,8 @@ @@ -323,6 +325,8 @@
323 upArr.push(rs.t); 325 upArr.push(rs.t);
324 i++; 326 i++;
325 f(); 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,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 data.xlBm = sch.xlBm; 314 data.xlBm = sch.xlBm;
315 data.xlName = sch.xlName; 315 data.xlName = sch.xlName;
316 data.lpName = sch.lpName; 316 data.lpName = sch.lpName;
@@ -336,7 +336,7 @@ @@ -336,7 +336,7 @@
336 gb_common.$post('/realSchedule', data, function (rs) { 336 gb_common.$post('/realSchedule', data, function (rs) {
337 notify_succ('新增临加班次成功'); 337 notify_succ('新增临加班次成功');
338 cb && cb(rs); 338 cb && cb(rs);
339 - }); 339 + }, err);
340 } 340 }
341 })(); 341 })();
342 </script> 342 </script>
src/main/resources/static/real_control_v2/fragments/line_schedule/layout.html
@@ -11,9 +11,11 @@ @@ -11,9 +11,11 @@
11 <div class="card-panel"></div> 11 <div class="card-panel"></div>
12 </div> 12 </div>
13 </div> 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 <div class="card-panel sys-mailbox" style="overflow: auto;"> 15 <div class="card-panel sys-mailbox" style="overflow: auto;">
16 </div> 16 </div>
  17 + <div class="mileage_elec_panel">
  18 + </div>
17 </div> 19 </div>
18 </div> 20 </div>
19 21
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
@@ -182,4 +182,17 @@ @@ -182,4 +182,17 @@
182 <span class="_badge">{{zdsj}}/{{zdsjActual}}</span> 182 <span class="_badge">{{zdsj}}/{{zdsjActual}}</span>
183 </div> 183 </div>
184 </script> 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 </div> 198 </div>
src/main/resources/static/real_control_v2/js/common.js
@@ -95,13 +95,13 @@ var gb_common = (function () { @@ -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 $.ajax({ 99 $.ajax({
100 url: url, 100 url: url,
101 method: 'POST', 101 method: 'POST',
102 data: data, 102 data: data,
103 complete: function (xhr, ts) { 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,7 +126,7 @@ var gb_common = (function () {
126 126
127 var errorHead = '<span style="color:red;">异常:</span>'; 127 var errorHead = '<span style="color:red;">异常:</span>';
128 128
129 - function successHandle(json, handle) { 129 + function successHandle(json, handle, err) {
130 var status = json.status; 130 var status = json.status;
131 if (status == 407) { 131 if (status == 407) {
132 location.href = '/login.html'; 132 location.href = '/login.html';
@@ -142,18 +142,20 @@ var gb_common = (function () { @@ -142,18 +142,20 @@ var gb_common = (function () {
142 UIkit.modal.alert(errorHead + (json.msg ? json.msg : '未知异常'), {labels: {Ok: '确定'}}); 142 UIkit.modal.alert(errorHead + (json.msg ? json.msg : '未知异常'), {labels: {Ok: '确定'}});
143 //关闭wait窗口 143 //关闭wait窗口
144 hide_wait_modal(); 144 hide_wait_modal();
  145 + err && err();
145 } 146 }
146 else 147 else
147 handle && handle(json); 148 handle && handle(json);
148 } 149 }
149 150
150 - function ajaxComplete(xhr, ts, succ) { 151 + function ajaxComplete(xhr, ts, succ, err) {
151 if (ts == 'success') { 152 if (ts == 'success') {
152 - successHandle(JSON.parse(xhr.responseText), succ); 153 + successHandle(JSON.parse(xhr.responseText), succ, err);
153 } else if (ts == 'error') { 154 } else if (ts == 'error') {
154 UIkit.modal.alert(errorHead + xhr.responseText, {labels: {Ok: '确定'}}); 155 UIkit.modal.alert(errorHead + xhr.responseText, {labels: {Ok: '确定'}});
155 //关闭wait窗口 156 //关闭wait窗口
156 hide_wait_modal(); 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,25 +44,33 @@ var gb_schedule_badge_tootip = (function () {
44 show: _opts.show, 44 show: _opts.show,
45 content: { 45 content: {
46 text: function() { 46 text: function() {
47 - var sch = getSch(this); 47 + var sch = getSch(this),
  48 + serviceCount=0,
  49 + emptyCount=0;
48 //子任务排序 50 //子任务排序
49 $.each(sch.cTasks, function () { 51 $.each(sch.cTasks, function () {
50 if(this.mileageType=='service'){ 52 if(this.mileageType=='service'){
  53 + serviceCount = gb_common.accAdd(serviceCount, this.mileage);
51 if(this.type1=='正常') 54 if(this.type1=='正常')
52 this.order_no=0; 55 this.order_no=0;
53 else 56 else
54 this.order_no=1; 57 this.order_no=1;
55 58
56 - if(this.destroy) 59 + if(this.destroy){
57 this.order_no=2; 60 this.order_no=2;
  61 + }
58 } 62 }
59 - else 63 + else{
60 this.order_no=this.type2 + 1; 64 this.order_no=this.type2 + 1;
  65 + emptyCount = gb_common.accAdd(emptyCount, this.mileage);
  66 + }
61 }); 67 });
62 var array = sch.cTasks.sort(function (a, b) { 68 var array = sch.cTasks.sort(function (a, b) {
63 return a.order_no - b.order_no; 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 position: _opts.position, 76 position: _opts.position,
@@ -74,6 +82,31 @@ var gb_schedule_badge_tootip = (function () { @@ -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 //区间 tootip 110 //区间 tootip
78 $(document).on('mouseenter', _badge+'.sch_region', function() { 111 $(document).on('mouseenter', _badge+'.sch_region', function() {
79 $(this).qtip({ 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,15 +319,15 @@ var gb_schedule_context_menu = (function () {
319 'fcxxwt': { 319 'fcxxwt': {
320 name: '发车信息微调' 320 name: '发车信息微调'
321 }, 321 },
  322 + 'sep3': '---------',
322 'lj_zrw': { 323 'lj_zrw': {
323 name: '临加/子任务' 324 name: '临加/子任务'
324 }, 325 },
325 - 'sep3': '---------',  
326 'add_temp_sch': { 326 'add_temp_sch': {
327 - name: '添加临加班次' 327 + name: '新增临加班次'
328 }, 328 },
329 'add_sub_task': { 329 'add_sub_task': {
330 - name: '添加子任务' 330 + name: '新增子任务'
331 }, 331 },
332 'sep4': '---------', 332 'sep4': '---------',
333 'tzrc': { 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 \ No newline at end of file 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,9 +461,106 @@ var gb_schedule_table = (function () {
461 $('dl[data-id=' + this.id + ']', contWrap).addClass('relevance-active intimity'); 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 $(document).on('click', '.header-title', function () { 565 $(document).on('click', '.header-title', function () {
469 reset_drag_active_all(this); 566 reset_drag_active_all(this);
@@ -487,6 +584,8 @@ var gb_schedule_table = (function () { @@ -487,6 +584,8 @@ var gb_schedule_table = (function () {
487 var reset_drag_active_all = function (dd) { 584 var reset_drag_active_all = function (dd) {
488 $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active'); 585 $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active');
489 reset_relevance_active(dd); 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 var reset_relevance_active = function (dd) { 591 var reset_relevance_active = function (dd) {
@@ -685,6 +784,7 @@ var gb_schedule_table = (function () { @@ -685,6 +784,7 @@ var gb_schedule_table = (function () {
685 cancelLateBadge: cancelLateBadge, 784 cancelLateBadge: cancelLateBadge,
686 refreshAll: refreshAll, 785 refreshAll: refreshAll,
687 getNextNormalSch: getNextNormalSch, 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,12 +97,12 @@ var modal_move = function (m_header) {
97 dict.stY = win.scrollTop(); 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 ,setBot = win.height() - _moveObj.outerHeight() + dict.stY; 101 ,setBot = win.height() - _moveObj.outerHeight() + dict.stY;
102 X < dict.stX && (X = dict.stX); 102 X < dict.stX && (X = dict.stX);
103 X > setRig && (X = setRig); 103 X > setRig && (X = setRig);
104 Y < dict.stY && (Y = dict.stY); 104 Y < dict.stY && (Y = dict.stY);
105 - Y > setBot && (Y = setBot); 105 + Y > setBot && (Y = setBot);*/
106 106
107 _moveObj.css({ 107 _moveObj.css({
108 left: X 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,51 +4,51 @@ var gb_call_phone = function () {
4 var wsUri = "ws://180.168.57.114:21892/"; 4 var wsUri = "ws://180.168.57.114:21892/";
5 5
6 var nbbm2tel = { 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 var locData = window.localStorage.getItem('test_nbbm2tel_json'); 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,6 +151,8 @@ var gb_sch_websocket = (function () {
151 gb_tts.speak(ttsMsg, msg.t.xlBm); 151 gb_tts.speak(ttsMsg, msg.t.xlBm);
152 152
153 calcUntreated(msg.t.xlBm); 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,7 +55,7 @@
55 <div class="uk-width-4-10"> 55 <div class="uk-width-4-10">
56 <div class="uk-panel"> 56 <div class="uk-panel">
57 <h2 class="north-logo"> 57 <h2 class="north-logo">
58 - <i class="uk-icon-life-ring"></i> 浦东公交线路调度 58 + <!--<i class="uk-icon-life-ring"></i>--> 浦东公交线路调度
59 </h2> 59 </h2>
60 </div> 60 </div>
61 </div> 61 </div>
@@ -199,6 +199,7 @@ @@ -199,6 +199,7 @@
199 <script src="/real_control_v2/js/line_schedule/dbclick.js" merge="custom_js"></script> 199 <script src="/real_control_v2/js/line_schedule/dbclick.js" merge="custom_js"></script>
200 <script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script> 200 <script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script>
201 <script src="/real_control_v2/js/line_schedule/badge_tooltip.js" merge="custom_js"></script> 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 <script src="/assets/js/dictionary.js" merge="custom_js"></script> 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,6 +26,7 @@ var gb_map_play_back = (function () {
26 title: '<i class="uk-icon-play-circle"></i> 轨迹回放', 26 title: '<i class="uk-icon-play-circle"></i> 轨迹回放',
27 shadeClose: true, 27 shadeClose: true,
28 shade: false, 28 shade: false,
  29 + moveOut: true,
29 maxmin: true, //开启最大化最小化按钮 30 maxmin: true, //开启最大化最小化按钮
30 area: ['1299px', '754px'], 31 area: ['1299px', '754px'],
31 //moveOut: true, 32 //moveOut: true,