Commit 8f6ab784953b618c569f799ff4c04c7f100f3163

Authored by 廖磊
2 parents 8722f91c 4e2bb969

Merge branch 'pudong' of http://222.66.0.204:8090/panzhaov5/bsth_control

into pudong
Showing 73 changed files with 2564 additions and 546 deletions

Too many changes to show.

To preserve performance only 73 of 80 files are displayed.

src/main/java/com/bsth/common/Constants.java
... ... @@ -38,6 +38,7 @@ public class Constants {
38 38  
39 39 public static final String SESSION_USERNAME = "sessionUserName";
40 40 public static final String COMPANY_AUTHORITYS = "cmyAuths";
  41 + public static final String STATION_AND_SECTION_COUNT = "/station/updateStationAndSectionCode";
41 42  
42 43 /**
43 44 * 解除调度指令和班次的外键约束
... ...
src/main/java/com/bsth/controller/gps/GpsController.java
... ... @@ -212,5 +212,15 @@ public class GpsController {
212 212 map.put("pageData","10");
213 213 return gpsService.Pagequery(map);
214 214 }
  215 +
  216 + /**
  217 + * 获取线路下所有车辆,包括实时设备 和 计划排班
  218 + * @param lineCode
  219 + * @return
  220 + */
  221 + @RequestMapping(value = "/allCarsByLine",method = RequestMethod.GET)
  222 + public Map<String, Object> allCarsByLine(String lineCode){
  223 + return gpsService.allCarsByLine(lineCode);
  224 + }
215 225  
216 226 }
... ...
src/main/java/com/bsth/controller/realcontrol/ChildTaskPlanController.java
... ... @@ -27,4 +27,9 @@ public class ChildTaskPlanController extends BaseController&lt;ChildTaskPlan, Long&gt;
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/controller/realcontrol/ServiceDataInterface.java
... ... @@ -63,7 +63,9 @@ public class ServiceDataInterface {
63 63 map = new HashMap<>();
64 64 map.put("clZbh", sch.getClZbh());
65 65 map.put("jGh", sch.getjGh());
  66 + map.put("jName", sch.getjGh());
66 67 map.put("sGh", sch.getsGh());
  68 + map.put("sName", sch.getsGh());
67 69 map.put("lpName", sch.getLpName());
68 70 map.put("xlBm", sch.getXlBm());
69 71 map.put("xlName", sch.getXlName());
... ...
src/main/java/com/bsth/controller/realcontrol/summary/TempSchSituationController.java 0 → 100644
  1 +package com.bsth.controller.realcontrol.summary;
  2 +
  3 +import com.bsth.controller.BaseController;
  4 +import com.bsth.data.summary.entity.TempSchSituation;
  5 +import com.bsth.data.summary.service.TempSchSituationService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RequestParam;
  9 +import org.springframework.web.bind.annotation.RestController;
  10 +
  11 +import javax.servlet.http.HttpServletRequest;
  12 +import javax.servlet.http.HttpServletResponse;
  13 +import java.util.Map;
  14 +
  15 +/**
  16 + * Created by panzhao on 2017/11/1.
  17 + */
  18 +@RestController
  19 +@RequestMapping("/summary/temp_sch")
  20 +public class TempSchSituationController extends BaseController<TempSchSituation, Long> {
  21 +
  22 + @Autowired
  23 + TempSchSituationService tempSchSituationService;
  24 +
  25 + @RequestMapping("excel")
  26 + public void excel(@RequestParam Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {
  27 + tempSchSituationService.excel(map, request, response);
  28 + }
  29 +}
... ...
src/main/java/com/bsth/data/gpsdata_v2/GpsRealData.java
... ... @@ -123,7 +123,13 @@ public class GpsRealData {
123 123 * @Title: get @Description: TODO(线路编码获取GPS集合) @throws
124 124 */
125 125 public List<GpsEntity> getByLine(String lineCode) {
126   - NavigableSet<String> set = lineCode2Devices.get(lineCode);
  126 + NavigableSet<String> set = lineCode2Devices.get(lineCode);//实际车载
  127 + Set<String> nbbmSet = dayOfSchedule.findCarByLineCode(lineCode);//计划用车
  128 +
  129 + Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse();
  130 + for(String nbbm : nbbmSet){
  131 + set.add(nbbm2deviceMap.get(nbbm));
  132 + }
127 133  
128 134 List<GpsEntity> rs = new ArrayList<>();
129 135 GpsEntity gps;
... ... @@ -135,14 +141,28 @@ public class GpsRealData {
135 141 continue;
136 142  
137 143 sch = dayOfSchedule.execPlanMap().get(gps.getNbbm());
138   - if (null != sch)
  144 + if (null != sch){
139 145 gps.setSchId(sch.getId());
  146 + if(!sch.getXlBm().equals(lineCode)){
  147 + //车辆在其他线路营运
  148 + gps.setRemark("执行 " + sch.getXlName() + " " + sch.getDfsj() + " 班次");
  149 + gps.setPlanCode(sch.getXlBm());
  150 + }
  151 + else
  152 + gps.setRemark(null);
  153 + }else
  154 + gps.setRemark(null);
  155 +
140 156 rs.add(gps);
141 157 }
142 158  
143 159 return rs;
144 160 }
145 161  
  162 + public static Set<String> findDevices(String lineCode){
  163 + return lineCode2Devices.get(lineCode);
  164 + }
  165 +
146 166 public List<GpsEntity> get(List<String> pArray) {
147 167 List<GpsEntity> list = new ArrayList<>();
148 168  
... ...
src/main/java/com/bsth/data/gpsdata_v2/cache/GeoCacheData.java
... ... @@ -139,7 +139,7 @@ public class GeoCacheData {
139 139  
140 140 private void loadTccMapData(){
141 141 //加载停车场数据
142   - String sql = "select PARK_CODE, ST_AsText(G_PARK_POINT) as G_PARK_POINT from bsth_c_car_park where park_code is not null and b_park_point is not null";
  142 + String sql = "select PARK_CODE, ST_AsText(G_PARK_POINT) as G_PARK_POINT from bsth_c_car_park where park_code is not null and b_park_point is not null and destroy=0";
143 143 List<Map<String, Object>> tccList = jdbcTemplate.queryForList(sql);
144 144 Map<String, Polygon> tccTempMap = new HashMap<>();
145 145  
... ...
src/main/java/com/bsth/data/gpsdata_v2/entity/GpsEntity.java
... ... @@ -100,6 +100,9 @@ public class GpsEntity implements Cloneable{
100 100 */
101 101 private int source = -1;
102 102  
  103 + private String remark;
  104 + private String planCode;
  105 +
103 106 public Object clone() {
104 107 try {
105 108 return super.clone();
... ... @@ -360,4 +363,20 @@ public class GpsEntity implements Cloneable{
360 363 public void setPremiseCode(String premiseCode) {
361 364 this.premiseCode = premiseCode;
362 365 }
  366 +
  367 + public String getRemark() {
  368 + return remark;
  369 + }
  370 +
  371 + public void setRemark(String remark) {
  372 + this.remark = remark;
  373 + }
  374 +
  375 + public String getPlanCode() {
  376 + return planCode;
  377 + }
  378 +
  379 + public void setPlanCode(String planCode) {
  380 + this.planCode = planCode;
  381 + }
363 382 }
... ...
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/EnableRouteVersionHandler.java
... ... @@ -59,6 +59,25 @@ public class EnableRouteVersionHandler {
59 59 }
60 60 }
61 61  
  62 + public void sync(String lineCode, int version){
  63 + //编程式事务
  64 + DataSourceTransactionManager tran = new DataSourceTransactionManager(jdbcTemplate.getDataSource());
  65 + DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  66 + def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  67 + TransactionStatus status = tran.getTransaction(def);
  68 +
  69 +
  70 + try{
  71 + enableStation(lineCode, version);
  72 + enableRoad(lineCode, version);
  73 +
  74 + tran.commit(status);
  75 + }catch (Exception e){
  76 + tran.rollback(status);
  77 + logger.error("", e);
  78 + }
  79 + }
  80 +
62 81 /**
63 82 * 启用新版本站点
64 83 * @param lineCode
... ...
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,24 +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());
  42 + enableRouteVersionHandler.enable(lineCode, version);
  43 + }
  44 + }
  45 +
  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);
43 50  
44   - enableRouteVersionHandler.enable(lineCode, version);
  51 + String[] ks;
  52 + for (String keys : syncs) {
  53 + ks = keys.split("_");
  54 +
  55 + enableRouteVersionHandler.sync(ks[0], Integer.parseInt(ks[1]));
  56 +
  57 + logger.info("同步线路 " + ks[0] + " 版本:" + ks[1]);
45 58 }
46   - }catch (Exception e){
  59 +
  60 + jdbcTemplate.update("delete from logger_route_synchro where t < " + t);
  61 + } catch (Exception e) {
47 62 logger.error("", e);
48 63 }
49 64 }
... ...
src/main/java/com/bsth/data/pilot80/PilotReport.java
... ... @@ -20,9 +20,7 @@ import org.slf4j.LoggerFactory;
20 20 import org.springframework.beans.factory.annotation.Autowired;
21 21 import org.springframework.stereotype.Component;
22 22  
23   -import java.util.ArrayList;
24   -import java.util.Collection;
25   -import java.util.List;
  23 +import java.util.*;
26 24 import java.util.concurrent.ConcurrentHashMap;
27 25  
28 26 /**
... ... @@ -55,10 +53,16 @@ public class PilotReport {
55 53  
56 54 private static ConcurrentHashMap<Integer, D80> d80Maps;
57 55  
  56 + /**
  57 + * 设备 ——> 最后一条请求出场记录
  58 + */
  59 + public static ConcurrentHashMap<String, D80> qqccMap;
  60 +
58 61 Logger logger = LoggerFactory.getLogger(PilotReport.class);
59 62  
60 63 static {
61 64 d80Maps = new ConcurrentHashMap<>();
  65 + qqccMap = new ConcurrentHashMap<>();
62 66 }
63 67  
64 68 public void report(D80 d80) {
... ... @@ -81,6 +85,7 @@ public class PilotReport {
81 85 switch (d80.getData().getRequestCode()) {
82 86 //出场请求
83 87 case 0xA3:
  88 + qqccMap.put(d80.getDeviceId(), d80);
84 89 ScheduleRealInfo outSch = dayOfSchedule.searchNearByBcType(nbbm, "out");
85 90 //如果有对应出场班次
86 91 if (outSch != null && StringUtils.isEmpty(outSch.getFcsjActual())) {
... ... @@ -241,6 +246,7 @@ public class PilotReport {
241 246 List<D80> rems = findByLine(lineCode);
242 247 for (D80 d80 : rems) {
243 248 d80Maps.remove(d80.getId());
  249 + qqccMap.remove(d80.getDeviceId());
244 250 }
245 251  
246 252 rems.clear();
... ...
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
... ... @@ -15,6 +15,7 @@ import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
15 15 import com.bsth.service.schedule.SchedulePlanInfoService;
16 16 import com.bsth.websocket.handler.SendUtils;
17 17 import com.google.common.collect.ArrayListMultimap;
  18 +import com.google.common.collect.HashMultimap;
18 19 import org.apache.commons.lang3.StringUtils;
19 20 import org.joda.time.format.DateTimeFormat;
20 21 import org.joda.time.format.DateTimeFormatter;
... ... @@ -55,6 +56,9 @@ public class DayOfSchedule {
55 56 // 按车辆分组的班次数据
56 57 private static ArrayListMultimap<String, ScheduleRealInfo> nbbmScheduleMap;
57 58  
  59 + //按线路分组计划用车
  60 + private static HashMultimap<String, String> lineNbbmsMap;
  61 +
58 62 //按路牌分组的班次数据 线路编码_路牌名称 ——> 班次list
59 63 private static ArrayListMultimap<String, ScheduleRealInfo> lpScheduleMap;
60 64  
... ... @@ -199,6 +203,8 @@ public class DayOfSchedule {
199 203 reCalcExecPlan(nbbm);
200 204 }
201 205  
  206 + //分组计划用车
  207 + reCalcLineNbbms();
202 208 // 页面 翻班通知
203 209 //sendUtils.shiftSchedule(lineCode);
204 210 } catch (Exception e) {
... ... @@ -543,15 +549,15 @@ public class DayOfSchedule {
543 549 * @Description: TODO(线路下运营的车辆)
544 550 */
545 551 public Set<String> findCarByLineCode(String lineCode) {
546   - Set<String> rs = new HashSet<>();
  552 + /*Set<String> rs = new HashSet<>();
547 553  
548 554 Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values();
549 555 for (ScheduleRealInfo sch : schs) {
550 556 if (sch.getXlBm().equals(lineCode))
551 557 rs.add(sch.getClZbh());
552 558 }
553   -
554   - return rs;
  559 +*/
  560 + return lineNbbmsMap.get(lineCode);
555 561 }
556 562  
557 563 public List<ScheduleRealInfo> findByNbbm(String nbbm) {
... ... @@ -908,6 +914,8 @@ public class DayOfSchedule {
908 914 //重新计算车辆当前执行班次
909 915 reCalcExecPlan(newClZbh);
910 916 reCalcExecPlan(sch.getClZbh());
  917 + //重新分组计划用车
  918 + reCalcLineNbbms();
911 919 return ups;
912 920 }
913 921  
... ... @@ -970,7 +978,6 @@ public class DayOfSchedule {
970 978  
971 979 //删除班次数据
972 980 removeRealSch(lineCode, rq);
973   - //删除相关班次修正记录
974 981  
975 982 }
976 983 rs.put("status", ResponseCode.SUCCESS);
... ... @@ -1083,6 +1090,20 @@ public class DayOfSchedule {
1083 1090 return id2SchedulMap.size();
1084 1091 }
1085 1092  
  1093 + /**
  1094 + * 重新计算线路计划用车
  1095 + */
  1096 + public void reCalcLineNbbms(){
  1097 + HashMultimap<String, String> multimap = HashMultimap.create();
  1098 +
  1099 + Collection<ScheduleRealInfo> schs = nbbmScheduleMap.values();
  1100 + for (ScheduleRealInfo sch : schs) {
  1101 + multimap.put(sch.getXlBm(), sch.getClZbh());
  1102 + }
  1103 +
  1104 + lineNbbmsMap = multimap;
  1105 + }
  1106 +
1086 1107 public String sizeString(){
1087 1108 return id2SchedulMap.size() + "/" + nbbmScheduleMap.size();
1088 1109 }
... ...
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/data/summary/entity/TempSchSituation.java 0 → 100644
  1 +package com.bsth.data.summary.entity;
  2 +
  3 +import javax.persistence.Entity;
  4 +import javax.persistence.Id;
  5 +import javax.persistence.Table;
  6 +
  7 +/**
  8 + * 临加情况
  9 + * Created by panzhao on 2017/10/31.
  10 + */
  11 +@Entity
  12 +@Table(name = "z_calc_temp_detail")
  13 +public class TempSchSituation {
  14 +
  15 + @Id
  16 + private Long id;
  17 +
  18 + private String rq;
  19 +
  20 + private String gsBm;
  21 +
  22 + private String fgsBm;
  23 +
  24 + private String lineCode;
  25 +
  26 + private String lineName;
  27 +
  28 + private String nbbm;
  29 +
  30 + private String jGh;
  31 +
  32 + private String sGh;
  33 +
  34 + private String reason;
  35 +
  36 + private int size;
  37 +
  38 + private Double mileage;
  39 +
  40 + private Long t;
  41 +
  42 + private String remark;
  43 +
  44 + private String idsStr;
  45 +
  46 + public Long getId() {
  47 + return id;
  48 + }
  49 +
  50 + public void setId(Long id) {
  51 + this.id = id;
  52 + }
  53 +
  54 + public String getRq() {
  55 + return rq;
  56 + }
  57 +
  58 + public void setRq(String rq) {
  59 + this.rq = rq;
  60 + }
  61 +
  62 + public String getLineCode() {
  63 + return lineCode;
  64 + }
  65 +
  66 + public void setLineCode(String lineCode) {
  67 + this.lineCode = lineCode;
  68 + }
  69 +
  70 + public String getLineName() {
  71 + return lineName;
  72 + }
  73 +
  74 + public void setLineName(String lineName) {
  75 + this.lineName = lineName;
  76 + }
  77 +
  78 + public String getNbbm() {
  79 + return nbbm;
  80 + }
  81 +
  82 + public void setNbbm(String nbbm) {
  83 + this.nbbm = nbbm;
  84 + }
  85 +
  86 + public String getjGh() {
  87 + return jGh;
  88 + }
  89 +
  90 + public void setjGh(String jGh) {
  91 + this.jGh = jGh;
  92 + }
  93 +
  94 + public String getsGh() {
  95 + return sGh;
  96 + }
  97 +
  98 + public void setsGh(String sGh) {
  99 + this.sGh = sGh;
  100 + }
  101 +
  102 + public String getReason() {
  103 + return reason;
  104 + }
  105 +
  106 + public void setReason(String reason) {
  107 + this.reason = reason;
  108 + }
  109 +
  110 + public int getSize() {
  111 + return size;
  112 + }
  113 +
  114 + public void setSize(int size) {
  115 + this.size = size;
  116 + }
  117 +
  118 + public Double getMileage() {
  119 + return mileage;
  120 + }
  121 +
  122 + public void setMileage(Double mileage) {
  123 + this.mileage = mileage;
  124 + }
  125 +
  126 + public Long getT() {
  127 + return t;
  128 + }
  129 +
  130 + public void setT(Long t) {
  131 + this.t = t;
  132 + }
  133 +
  134 + public String getRemark() {
  135 + return remark;
  136 + }
  137 +
  138 + public void setRemark(String remark) {
  139 + this.remark = remark;
  140 + }
  141 +
  142 + public String getIdsStr() {
  143 + return idsStr;
  144 + }
  145 +
  146 + public void setIdsStr(String idsStr) {
  147 + this.idsStr = idsStr;
  148 + }
  149 +
  150 + public String getGsBm() {
  151 + return gsBm;
  152 + }
  153 +
  154 + public void setGsBm(String gsBm) {
  155 + this.gsBm = gsBm;
  156 + }
  157 +
  158 + public String getFgsBm() {
  159 + return fgsBm;
  160 + }
  161 +
  162 + public void setFgsBm(String fgsBm) {
  163 + this.fgsBm = fgsBm;
  164 + }
  165 +}
... ...
src/main/java/com/bsth/data/summary/repository/TempSchSituationRepository.java 0 → 100644
  1 +package com.bsth.data.summary.repository;
  2 +
  3 +import com.bsth.data.summary.entity.TempSchSituation;
  4 +import com.bsth.repository.BaseRepository;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 + * Created by panzhao on 2017/11/1.
  9 + */
  10 +@Repository
  11 +public interface TempSchSituationRepository extends BaseRepository<TempSchSituation, Long> {
  12 +}
... ...
src/main/java/com/bsth/data/summary/service/TempSchSituationService.java 0 → 100644
  1 +package com.bsth.data.summary.service;
  2 +
  3 +import com.bsth.data.summary.entity.TempSchSituation;
  4 +import com.bsth.service.BaseService;
  5 +
  6 +import javax.servlet.http.HttpServletRequest;
  7 +import javax.servlet.http.HttpServletResponse;
  8 +import java.util.Map;
  9 +
  10 +/**
  11 + * Created by panzhao on 2017/11/1.
  12 + */
  13 +public interface TempSchSituationService extends BaseService<TempSchSituation, Long> {
  14 + void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response);
  15 +}
0 16 \ No newline at end of file
... ...
src/main/java/com/bsth/data/summary/service/impl/DestroySituationServiceImpl.java
... ... @@ -118,7 +118,7 @@ public class DestroySituationServiceImpl extends BaseServiceImpl&lt;DestroySituatio
118 118 row.createCell(9).setCellValue(dys.getRemark());
119 119 }
120 120  
121   - String name = list.get(0).getLineName();
  121 + String name = "";//list.get(0).getLineName();
122 122 wb.setSheetName(0, name + "烂班明细");
123 123 //response 输出
124 124 String filename = name + map.get("rq_ge") + "至" + map.get("rq_le") + "烂班明细情况.xls";
... ...
src/main/java/com/bsth/data/summary/service/impl/TempSchSituationServiceImpl.java 0 → 100644
  1 +package com.bsth.data.summary.service.impl;
  2 +
  3 +import com.bsth.data.summary.entity.TempSchSituation;
  4 +import com.bsth.data.summary.service.TempSchSituationService;
  5 +import com.bsth.data.utils.CustomStringUtils;
  6 +import com.bsth.service.impl.BaseServiceImpl;
  7 +import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  8 +import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  9 +import org.apache.poi.ss.usermodel.Row;
  10 +import org.apache.poi.ss.usermodel.Sheet;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.stereotype.Service;
  14 +
  15 +import javax.servlet.http.HttpServletRequest;
  16 +import javax.servlet.http.HttpServletResponse;
  17 +import java.io.FileInputStream;
  18 +import java.io.OutputStream;
  19 +import java.net.URLEncoder;
  20 +import java.text.SimpleDateFormat;
  21 +import java.util.*;
  22 +
  23 +/**
  24 + * Created by panzhao on 2017/11/1.
  25 + */
  26 +@Service
  27 +public class TempSchSituationServiceImpl extends BaseServiceImpl<TempSchSituation, Long> implements TempSchSituationService {
  28 +
  29 + Logger logger = LoggerFactory.getLogger(this.getClass());
  30 +
  31 + @Override
  32 + public Iterable<TempSchSituation> list(Map<String, Object> map) {
  33 + List<TempSchSituation> list = (List<TempSchSituation>) super.list(map);
  34 +
  35 + //排序
  36 + Collections.sort(list, new Comparator<TempSchSituation>() {
  37 + @Override
  38 + public int compare(TempSchSituation o1, TempSchSituation o2) {
  39 + int i = o1.getRq().compareTo(o2.getRq());
  40 + if(i != 0)
  41 + return i;
  42 +
  43 + i = o1.getLineName().compareTo(o2.getLineName());
  44 + if(i != 0)
  45 + return i;
  46 +
  47 + i = (int) (o1.getT() - o2.getT());
  48 + if(i != 0)
  49 + return i;
  50 +
  51 + i = o1.getReason().compareTo(o2.getReason());
  52 +
  53 + return i;
  54 + }
  55 + });
  56 + return list;
  57 + }
  58 +
  59 + @Override
  60 + public void excel(Map<String, Object> map, HttpServletRequest request, HttpServletResponse response) {
  61 + try {
  62 + map.put("rq_le", CustomStringUtils.maxEndTime(map.get("rq_ge").toString()
  63 + , map.get("rq_le").toString(), 62));
  64 +
  65 + List<TempSchSituation> list = (List<TempSchSituation>) super.list(map);
  66 +
  67 + if(list.size() == 0){
  68 + response.setHeader("Content-type", "text/html;charset=UTF-8");
  69 + response.getWriter().print("<span style='color:red;font-size:24px;'>根据查询条件没有搜索到数据,别导了!</span>");
  70 + return ;
  71 + }
  72 +
  73 + //排序
  74 + Collections.sort(list, new Comparator<TempSchSituation>() {
  75 + @Override
  76 + public int compare(TempSchSituation o1, TempSchSituation o2) {
  77 + int i = o1.getRq().compareTo(o2.getRq());
  78 + if(i != 0)
  79 + return i;
  80 +
  81 + i = o1.getLineName().compareTo(o2.getLineName());
  82 + if(i != 0)
  83 + return i;
  84 +
  85 + i = (int) (o1.getT() - o2.getT());
  86 + if(i != 0)
  87 + return i;
  88 +
  89 + i = o1.getReason().compareTo(o2.getReason());
  90 +
  91 + return i;
  92 + }
  93 + });
  94 +
  95 + //输出excel
  96 + String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
  97 + String filePath = basePath + "/static/pages/summary/excel/临加明细情况.xls";
  98 + POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));
  99 + HSSFWorkbook wb = new HSSFWorkbook(fs);
  100 +
  101 + //写入数据
  102 + Sheet sheet = wb.getSheetAt(0);
  103 + Row row;
  104 + TempSchSituation tss;
  105 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  106 + for(int i = 0; i < list.size(); i++){
  107 + tss = list.get(i);
  108 + row = sheet.createRow(i + 1);
  109 + row.createCell(0).setCellValue(tss.getRq());
  110 + row.createCell(1).setCellValue(tss.getLineName());
  111 + row.createCell(2).setCellValue(tss.getNbbm());
  112 + row.createCell(3).setCellValue(tss.getjGh());
  113 + row.createCell(4).setCellValue(tss.getsGh());
  114 + row.createCell(5).setCellValue(tss.getSize());
  115 + row.createCell(6).setCellValue(tss.getMileage());
  116 + row.createCell(7).setCellValue(sdf.format(new Date(tss.getT())));
  117 + row.createCell(8).setCellValue(tss.getRemark());
  118 + }
  119 +
  120 + String name = "";//list.get(0).getLineName();
  121 + wb.setSheetName(0, name + "临加明细");
  122 + //response 输出
  123 + String filename = name + map.get("rq_ge") + "至" + map.get("rq_le") + "临加明细情况.xls";
  124 + response.setContentType("application/x-msdownload");
  125 + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
  126 +
  127 + OutputStream os = response.getOutputStream();
  128 + wb.write(os);
  129 + os.flush();
  130 + os.close();
  131 + } catch (Exception e) {
  132 + logger.error("", e);
  133 + }
  134 + }
  135 +
  136 +}
0 137 \ No newline at end of file
... ...
src/main/java/com/bsth/filter/BaseFilter.java
... ... @@ -17,7 +17,7 @@ public abstract class BaseFilter implements Filter {
17 17 * 白名单
18 18 */
19 19 private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE,
20   - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL };
  20 + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT };
21 21  
22 22 @Override
23 23 public void destroy() {
... ...
src/main/java/com/bsth/security/WebSecurityConfig.java
... ... @@ -36,7 +36,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
36 36 public void configure(WebSecurity web) throws Exception {
37 37 // 白名单
38 38 web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA,
39   - Constants.SERVICE_INTERFACE, Constants.METRONIC_URL, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL);
  39 + Constants.SERVICE_INTERFACE, Constants.METRONIC_URL, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,Constants.STATION_AND_SECTION_COUNT);
40 40 }
41 41  
42 42 @Override
... ...
src/main/java/com/bsth/security/filter/LoginInterceptor.java
... ... @@ -33,7 +33,7 @@ public class LoginInterceptor implements Filter {
33 33 * 相比于 BaseFilter,此处对线调GPS请求进行了拦截验证
34 34 */
35 35 private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.SERVICE_INTERFACE,
36   - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL };
  36 + Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.METRONIC_URL, Constants.LOGIN, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,Constants.STATION_AND_SECTION_COUNT };
37 37  
38 38  
39 39 @Override
... ...
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));
... ... @@ -279,6 +282,10 @@ public class GeoDataServiceImpl implements GeoDataService {
279 282 }
280 283 });
281 284  
  285 +
  286 + //写一条走向变更记录
  287 + jdbcTemplate.update("insert into logger_route_synchro(t, line_code, version) values(?, ?, ?)", System.currentTimeMillis(), lineCode, versions);
  288 +
282 289 tran.commit(status);
283 290  
284 291 //返回更新之后的数据
... ... @@ -765,6 +772,9 @@ public class GeoDataServiceImpl implements GeoDataService {
765 772 }
766 773 });
767 774  
  775 + //写一条走向变更记录
  776 + jdbcTemplate.update("insert into logger_route_synchro(t, line_code, version) values(?, ?, ?)", System.currentTimeMillis(), lineCode, versions);
  777 +
768 778 tran.commit(status);
769 779  
770 780 //返回更新之后的数据
... ... @@ -874,6 +884,9 @@ public class GeoDataServiceImpl implements GeoDataService {
874 884 }
875 885 });
876 886  
  887 + //写一条走向变更记录
  888 + jdbcTemplate.update("insert into logger_route_synchro(t, line_code, version) values(?, ?, ?)", System.currentTimeMillis(), station.getLineCode(), station.getVersions());
  889 +
877 890 tran.commit(status);
878 891  
879 892 //返回更新之后的数据
... ... @@ -897,6 +910,9 @@ public class GeoDataServiceImpl implements GeoDataService {
897 910 String sql = "update bsth_c_ls_sectionroute set destroy=1 where id=?";
898 911 jdbcTemplate.update(sql, road.getId());
899 912  
  913 + //写一条走向变更记录
  914 + jdbcTemplate.update("insert into logger_route_synchro(t, line_code, version) values(?, ?, ?)", System.currentTimeMillis(), road.getLineCode(), road.getVersions());
  915 +
900 916 //返回更新之后的数据
901 917 List<GeoRoad> list = findRoadByUpdown(road.getLineCode(), road.getDirections(), road.getVersions());
902 918 rs.put("list", list);
... ...
src/main/java/com/bsth/service/gps/GpsService.java
... ... @@ -45,4 +45,6 @@ public interface GpsService {
45 45 String enddate) throws ParseException;
46 46  
47 47 Map<String, Object> Pagequery(Map<String, Object> map);
  48 +
  49 + Map<String,Object> allCarsByLine(String lineCode);
48 50 }
... ...
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -7,15 +7,16 @@ import com.bsth.data.gpsdata_v2.GpsRealData;
7 7 import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
8 8 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
9 9 import com.bsth.data.gpsdata_v2.utils.GeoUtils;
  10 +import com.bsth.data.pilot80.PilotReport;
10 11 import com.bsth.data.safe_driv.SafeDriv;
11 12 import com.bsth.data.safe_driv.SafeDrivCenter;
12 13 import com.bsth.data.schedule.DayOfSchedule;
  14 +import com.bsth.entity.directive.D80;
13 15 import com.bsth.entity.realcontrol.ScheduleRealInfo;
14 16 import com.bsth.repository.CarParkRepository;
15 17 import com.bsth.repository.StationRepository;
16 18 import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
17 19 import com.bsth.service.gps.entity.*;
18   -import com.bsth.util.DateUtils;
19 20 import com.bsth.util.TransGPS;
20 21 import com.bsth.util.TransGPS.Location;
21 22 import com.bsth.util.db.DBUtils_MS;
... ... @@ -32,6 +33,7 @@ import org.slf4j.Logger;
32 33 import org.slf4j.LoggerFactory;
33 34 import org.springframework.beans.factory.annotation.Autowired;
34 35 import org.springframework.dao.DataAccessException;
  36 +import org.springframework.jdbc.core.BeanPropertyRowMapper;
35 37 import org.springframework.jdbc.core.JdbcTemplate;
36 38 import org.springframework.stereotype.Service;
37 39  
... ... @@ -164,56 +166,134 @@ public class GpsServiceImpl implements GpsService {
164 166 return (byte) (((serviceState & 0x02000000) == 0x02000000) ? 1 : 0);
165 167 }
166 168  
  169 + private static DateTimeFormatter fmtyyyy = DateTimeFormat.forPattern("yyyy");
167 170 @Override
168 171 public List<Map<String, Object>> history(String[] nbbmArray, Long st, Long et) {
169 172 List<Map<String, Object>> list = new ArrayList<>();
170   - // 超过最大查询范围,直接忽略
171 173 if (et - st > GPS_RANGE)
172 174 return list;
173 175  
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
  176 + st = st * 1000;
  177 + et = et * 1000;
  178 + // day_of_year 分区字段
180 179 Calendar sCal = Calendar.getInstance();
181   - sCal.setTime(new Date(st * 1000));
182   - int sDayOfYear = sCal.get(Calendar.DAY_OF_YEAR)/* 200 */;
183   -
  180 + sCal.setTime(new Date(st));
  181 + int sDayOfYear = sCal.get(Calendar.DAY_OF_YEAR);
184 182 Calendar eCal = Calendar.getInstance();
185   - eCal.setTime(new Date(et * 1000));
186   - int eDayOfYear = eCal.get(Calendar.DAY_OF_YEAR)/* 200 */;
  183 + eCal.setTime(new Date(et));
  184 + int eDayOfYear = eCal.get(Calendar.DAY_OF_YEAR);
187 185  
188   - Calendar weekCal = Calendar.getInstance();
  186 + String nbbm = nbbmArray[0];
189 187  
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   - }
  188 + List<DeviceChange> dcs = findDeviceChangeLogs(nbbm, et, st);
  189 + //没有设备变更记录,则参考车辆信息上的设备号
  190 + if(null == dcs || dcs.size() == 0){
  191 + DeviceChange dc = new DeviceChange();
  192 + dc.setNbbm(nbbm);
  193 + dc.setDevice(BasicData.deviceId2NbbmMap.inverse().get(nbbm));
  194 + dc.setSt(st);
  195 + dc.setEt(et);
209 196  
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   - }
  197 + dcs.add(dc);
215 198 }
216 199  
  200 + //bsth_c_gps_info
  201 + String tableName = "bsth_c_gps_info";
  202 + String sYear = fmtyyyy.print(st),
  203 + currYear = fmtyyyy.print(System.currentTimeMillis());
  204 +
  205 + if(!sYear.equals(currYear))
  206 + tableName += "_" + sYear;
  207 +
  208 + StringBuilder sql = new StringBuilder("");
  209 + long t1,t2;
  210 + DeviceChange dc;
  211 + for(int i = 0,len=dcs.size(); i < len; i++){
  212 + t1 = st;
  213 + t2 = et;
  214 + dc = dcs.get(i);
  215 + if(dc.getSt() > st)
  216 + t1 = dc.getSt();
  217 + if(dc.getEt() < et)
  218 + t2 = dc.getEt();
  219 +
  220 + 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+") " +
  221 + " and device_id='"+dc.getDevice()+"' and ts > "+t1+" and ts < "+t2+" ");
  222 +
  223 + if(i == len - 1)
  224 + sql.append(" ORDER BY device_id,ts,stop_no");
  225 + else
  226 + sql.append(" UNION");
  227 + }
  228 +
  229 + logger.info("轨迹回放 nbbm: " + nbbm + " -st: " + st + " -et: " + et + " -sql: " + sql.toString());
  230 +
  231 + // 查询到离站数据
  232 + Map<String, ArrivalEntity> arrivalMap = findArrivalByTs(st, et, dcs);
  233 +
  234 + //查询GPS数据
  235 + JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  236 + List<Map<String, Object>> dataList = jdbcTemplate_ms.queryForList(sql.toString());
  237 +
  238 + Float lon, lat;
  239 + Location bdLoc, gdLoc;
  240 + int inOutStop;
  241 + long serviceState;
  242 + ArrivalEntity arrival;
  243 +
  244 + Map<String, Object> map = null;
  245 + for(Map<String, Object> rs : dataList){
  246 + serviceState = map_get_long(rs, "SERVICE_STATE");
  247 +
  248 + if(getGpsValid(serviceState) == 1)
  249 + continue;
  250 +
  251 + map = new HashMap<>();
  252 + if(getGpsValid(serviceState) == 1)
  253 + continue;
  254 +
  255 + map = new HashMap<>();
  256 +
  257 + lon = map_get_float(rs, "LON");
  258 + lat = map_get_float(rs, "LAT");
  259 + // 高德坐标
  260 + gdLoc = TransGPS.transformFromWGSToGCJ(TransGPS.LocationMake(lon, lat));
  261 + map.put("gcj_lon", gdLoc.getLng());
  262 + map.put("gcj_lat", gdLoc.getLat());
  263 + // 百度坐标
  264 + bdLoc = TransGPS.bd_encrypt(gdLoc);
  265 + map.put("bd_lon", bdLoc.getLng());
  266 + map.put("bd_lat", bdLoc.getLat());
  267 + //原始坐标
  268 + map.put("lon", lon);
  269 + map.put("lat", lat);
  270 +
  271 + map.put("deviceId", map_get_str(rs, "DEVICE_ID"));
  272 + map.put("ts", map_get_long(rs, "TS"));
  273 + map.put("timestamp", map_get_long(rs, "TS"));
  274 + map.put("stopNo", map_get_str(rs, "STOP_NO"));
  275 + map.put("direction", map_get_float(rs,"DIRECTION"));
  276 +
  277 + map.put("lineId", map_get_str(rs, "LINE_ID"));
  278 + map.put("speed", map_get_float(rs,"SPEED_GPS"));
  279 +
  280 + inOutStop = Integer.parseInt(rs.get("INOUT_STOP").toString());
  281 + map.put("inout_stop", inOutStop);
  282 +
  283 + arrival = arrivalMap.get(map_get_str(rs, "DEVICE_ID") + "_" + map_get_long(rs, "TS"));
  284 + if (arrival != null) {
  285 + map.put("inout_stop_info", arrival);
  286 + map.put("inout_stop", arrival.getInOut());
  287 + }
  288 +
  289 + map.put("nbbm", BasicData.deviceId2NbbmMap.get(map_get_str(rs,"DEVICE_ID")));
  290 + map.put("state", getService(serviceState));
  291 + // 上下行
  292 + map.put("upDown", getUpOrDown(serviceState));
  293 + //路段编码
  294 + map.put("section_code", map_get_str(rs,"SECTION_CODE"));
  295 + list.add(map);
  296 + }
217 297 // 按时间排序
218 298 Collections.sort(list, new Comparator<Map<String, Object>>() {
219 299  
... ... @@ -225,132 +305,97 @@ public class GpsServiceImpl implements GpsService {
225 305 return list;
226 306 }
227 307  
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);
  308 + private String map_get_str(Map<String, Object> map, String key){
  309 + return map.containsKey(key)?map.get(key).toString():"";
  310 + }
250 311  
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;
  312 + private Long map_get_long(Map<String, Object> map, String key){
  313 + return map.containsKey(key)?Long.parseLong(map.get(key).toString()):-1;
  314 + }
261 315  
262   - map = new HashMap<>();
  316 + private Float map_get_float(Map<String, Object> map, String key){
  317 + return map.containsKey(key)?Float.parseFloat(map.get(key).toString()):-1;
  318 + }
263 319  
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"));
  320 + private List<DeviceChange> findDeviceChangeLogs(String nbbm, long t, long st){
  321 + List<DeviceChange> dcs = null;
  322 + List<DeviceChange> rs = new ArrayList<>();
  323 + try{
283 324  
284   - map.put("lineId", rs.getString("LINE_ID"));
285   - map.put("speed", rs.getFloat("SPEED_GPS"));
  325 + //JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  326 + 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)
  327 + , BeanPropertyRowMapper.newInstance(DeviceChange.class));
286 328  
287   - inOutStop = rs.getInt("INOUT_STOP");
288   - map.put("inout_stop", inOutStop);
289 329  
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());
  330 + Collections.sort(dcs, new Comparator<DeviceChange>() {
  331 + @Override
  332 + public int compare(DeviceChange d1, DeviceChange d2) {
  333 + return (int) (d1.getSt() - d2.getSt());
294 334 }
  335 + });
295 336  
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);
  337 + for(int i = 0,len=dcs.size(); i < len - 1; i++){
  338 + dcs.get(i).setEt(dcs.get(i + 1).getSt());
303 339 }
304   - } catch (Exception e) {
  340 +
  341 + for(DeviceChange dc : dcs){
  342 + if(dc.getEt() > st)
  343 + rs.add(dc);
  344 + }
  345 + }catch (Exception e){
305 346 logger.error("", e);
306   - } finally {
307   - DBUtils_MS.close(rs, ps, conn);
308 347 }
309   - return list;
  348 + return rs;
310 349 }
311 350  
312 351 public static byte getGpsValid(long serviceState) {
313 352 return (byte)(((serviceState & 0x80000000) == 0x80000000) ? 1 : 0);
314 353 }
315 354  
316   - public Map<String, ArrivalEntity> findArrivalByTs(int weekOfYear, Long st, Long et, String devicesInSql) {
  355 + public Map<String, ArrivalEntity> findArrivalByTs(Long st, Long et, List<DeviceChange> dcs) {
317 356 Map<String, ArrivalEntity> map = new HashMap<>();
318 357  
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);
  358 + // weeks_year 分区字段
  359 + Calendar sCal = Calendar.getInstance();
  360 + sCal.setTime(new Date(st * 1000));
  361 + int sWeekOfYear = sCal.get(Calendar.WEEK_OF_YEAR);
  362 + Calendar eCal = Calendar.getInstance();
  363 + eCal.setTime(new Date(et * 1000));
  364 + int eWeekOfYear = eCal.get(Calendar.DAY_OF_YEAR);
  365 +
  366 + StringBuilder sql = new StringBuilder("");
  367 + long t1,t2;
  368 + DeviceChange dc;
  369 + for(int i = 0,len=dcs.size(); i < len; i++){
  370 + t1 = st;
  371 + t2 = et;
  372 + dc = dcs.get(i);
  373 + if(dc.getSt() > st)
  374 + t1 = dc.getSt();
  375 + if(dc.getEt() < et)
  376 + t2 = dc.getEt();
  377 +
  378 + 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 " +
  379 + " where weeks_year in ("+sWeekOfYear+", "+eWeekOfYear+") and device_id='"+dc.getDevice()+"' and ts > "+t1+" and ts < " + t2);
  380 +
  381 + if(i == len - 1)
  382 + sql.append(" ORDER BY device_id,ts,stop_no");
  383 + else
  384 + sql.append(" UNION");
  385 + }
327 386  
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);
  387 + JdbcTemplate jdbcTemplate_ms = new JdbcTemplate(DBUtils_MS.getDataSource());
  388 + List<ArrivalEntity> list = jdbcTemplate_ms.query(sql.toString(), BeanPropertyRowMapper.newInstance(ArrivalEntity.class));
337 389  
338   - if (StringUtils.isEmpty(stationName))
339   - continue;
  390 + String stationName, prefix;
  391 + for(ArrivalEntity arr : list){
  392 + prefix = arr.getLineCode() + "_" + arr.getUpDown() + "_";
  393 + stationName = BasicData.getStationNameByCode(arr.getStopNo(), prefix);
340 394  
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);
  395 + arr.setStopName(stationName);
344 396  
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);
  397 + // 反转进出状态
  398 + map.put(arr.getDeviceId() + "_" + arr.getTs(), arr);
354 399 }
355 400 return map;
356 401 }
... ... @@ -612,14 +657,6 @@ public class GpsServiceImpl implements GpsService {
612 657 //获取历史gps 数据
613 658 List<HistoryGps_DTOV3> list = HistoryGps_DTOV3.craete(history(new String[]{nbbm}, st, et));
614 659 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 660 //关联路段名称
624 661 Map<String, String> sectionCode2Name = GeoCacheData.sectionCode2NameMap();
625 662 for(HistoryGps_DTOV3 gps : list){
... ... @@ -1139,6 +1176,89 @@ public class GpsServiceImpl implements GpsService {
1139 1176 return paramMap;
1140 1177 }
1141 1178  
  1179 + @Override
  1180 + public Map<String, Object> allCarsByLine(String lineCode) {
  1181 + Map<String, Object> map = new HashMap();
  1182 + try{
  1183 + List<Map<String, Object>> list = new ArrayList<>();
  1184 + Map<String, Object> item;
  1185 + GpsEntity gps;
  1186 + //当天线路下营运的车辆
  1187 + Set<String> cars = dayOfSchedule.findCarByLineCode(lineCode);
  1188 + ScheduleRealInfo sch;
  1189 + String device;
  1190 +
  1191 + Map<String, Integer> allDevices = new HashMap<>();
  1192 + String execStr = "";
  1193 + D80 d80;
  1194 + for(String nbbm : cars){
  1195 + item = new HashMap<>();
  1196 + device = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
  1197 + allDevices.put(device, 1);
  1198 + item.put("nbbm", nbbm);
  1199 + item.put("device", device);
  1200 +
  1201 + sch = dayOfSchedule.executeCurr(nbbm);
  1202 + if(null != sch){
  1203 + execStr = (sch.getXlDir().equals("0")?"上行":"下行") + "("+sch.getDfsj()+")";
  1204 + if(!sch.getXlBm().equals(lineCode))
  1205 + execStr = sch.getXlName()+execStr;
  1206 + else
  1207 + item.put("schId", sch.getId());
  1208 + item.put("exec", execStr);
  1209 + }
  1210 +
  1211 + gps = gpsRealData.get(device);
  1212 + if(null != gps){
  1213 + item.put("loc", gps.getStationName());
  1214 + item.put("lineCodeReal", gps.getLineId());
  1215 + item.put("status", gps.isOffline()?"离线":"在线");
  1216 + item.put("gpsTs", gps.getTimestamp());
  1217 + }
  1218 + //请求出场时间
  1219 + d80 = PilotReport.qqccMap.get(device);
  1220 + if(null != d80)
  1221 + item.put("qqcc", d80.getTimestamp());
  1222 +
  1223 + list.add(item);
  1224 + }
  1225 +
  1226 + //车载编码落在该线路的设备
  1227 + Set<String> devices = gpsRealData.findDevices(lineCode);
  1228 + for(String d : devices){
  1229 + if(allDevices.containsKey(d))
  1230 + continue;
  1231 +
  1232 + gps = gpsRealData.get(d);
  1233 + if(null == gps)
  1234 + continue;
  1235 +
  1236 + item = new HashMap<>();
  1237 + item.put("nbbm", gps.getNbbm());
  1238 + item.put("device", d);
  1239 + item.put("loc", gps.getStationName());
  1240 + item.put("lineCodeReal", gps.getLineId());
  1241 + item.put("status", gps.isOffline()?"离线":"在线");
  1242 + item.put("gpsTs", gps.getTimestamp());
  1243 +
  1244 + //请求出场时间
  1245 + d80 = PilotReport.qqccMap.get(d);
  1246 + if(null != d80)
  1247 + item.put("qqcc", d80.getTimestamp());
  1248 +
  1249 + list.add(item);
  1250 + }
  1251 +
  1252 + map.put("list", list);
  1253 + map.put("status", ResponseCode.SUCCESS);
  1254 + }catch (Exception e){
  1255 + logger.error("", e);
  1256 + map.put("status", ResponseCode.ERROR);
  1257 + map.put("msg", e.getMessage());
  1258 + }
  1259 + return map;
  1260 + }
  1261 +
1142 1262 static List<GpsSpeed> findAll(Map<String, Object> map) {
1143 1263 Connection conn = null;
1144 1264 PreparedStatement ps = null;
... ...
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/impl/BusIntervalServiceImpl.java
... ... @@ -1843,7 +1843,16 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1843 1843 }
1844 1844 }
1845 1845  
1846   - sjlc = new BigDecimal(culateService.culateSjgl(keyMap.get(key)) + culateService.culateLjgl(keyMap.get(key)));
  1846 + List<ScheduleRealInfo> tempList = new ArrayList<ScheduleRealInfo>();
  1847 + for(ScheduleRealInfo s : keyMap.get(key)){
  1848 + if(s.getcTasks() != null && s.getcTasks().size() > 0){
  1849 + tempList.add(s);
  1850 + } else if(s.getZdsjActual() != null && s.getFcsjActual() != null){
  1851 + tempList.add(s);
  1852 + }
  1853 + }
  1854 +
  1855 + sjlc = new BigDecimal(culateService.culateSjgl(tempList) + culateService.culateLjgl(tempList));
1847 1856 lzlc = new BigDecimal(culateService.culateCJLC(keyMap.get(key), "路阻"));
1848 1857 dmlc = new BigDecimal(culateService.culateCJLC(keyMap.get(key), "吊慢"));
1849 1858 gzlc = new BigDecimal(culateService.culateCJLC(keyMap.get(key), "故障"));
... ... @@ -2421,13 +2430,13 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2421 2430 }
2422 2431  
2423 2432 for(Ylb ylb : queryYlbByRqXlbm){
2424   - String key = sdfMonth.format(ylb.getRq()) + ylb.getXlbm();
  2433 + String key = ylb.getJsy() + ylb.getNbbm();
2425 2434 if(!ylbMap.containsKey(key))
2426 2435 ylbMap.put(key, new ArrayList<Ylb>());
2427 2436 ylbMap.get(key).add(ylb);
2428 2437 }
2429 2438 for(Dlb dlb : queryDlbByRqXlbm){
2430   - String key = sdfMonth.format(dlb.getRq()) + dlb.getXlbm();
  2439 + String key = dlb.getJsy() + dlb.getNbbm();
2431 2440 if(!dlbMap.containsKey(key))
2432 2441 dlbMap.put(key, new ArrayList<Dlb>());
2433 2442 dlbMap.get(key).add(dlb);
... ... @@ -2480,8 +2489,9 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2480 2489 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
2481 2490 // ScheduleRealInfo s = scheduleRealInfoRepository.scheduleById(scheduleRealInfos.get(0).getId());
2482 2491 ScheduleRealInfo s = scheduleRealInfos.get(0);
2483   - String xlbm = s.getXlBm();
2484 2492 String fcrq = s.getScheduleDateStr();
  2493 + String jsy = s.getjGh();
  2494 + String nbbm = s.getClZbh();
2485 2495  
2486 2496 int type = 0;
2487 2497 Double ccyl = 0.0;
... ... @@ -2491,8 +2501,8 @@ public class BusIntervalServiceImpl implements BusIntervalService {
2491 2501 Double zlc = 0.0;
2492 2502 // List<Ylb> listYlb = ylbRepository.queryListYlb(fcrq, s.getClZbh(), s.getjGh(),xlbm);
2493 2503 // List<Dlb> listDlb = dlbRepository.queryListDlb(fcrq, s.getClZbh(), s.getjGh(),xlbm);
2494   - List<Ylb> listYlb = ylbMap.get(fcrq + xlbm);
2495   - List<Dlb> listDlb = dlbMap.get(fcrq + xlbm);
  2504 + List<Ylb> listYlb = ylbMap.get(jsy + nbbm);
  2505 + List<Dlb> listDlb = dlbMap.get(jsy + nbbm);
2496 2506  
2497 2507 // List<Cars> listCars = carsRepository.findCarsByCode(s.getClZbh());
2498 2508 List<Cars> listCars = carMap.get(s.getClZbh());
... ...
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/index.html
... ... @@ -61,9 +61,9 @@
61 61 href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css"
62 62 rel="stylesheet" type="text/css" />
63 63 <!-- table 表格控件 -->
64   - <link rel="stylesheet"
65   - href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"
66   - type="text/css" />
  64 + <!--<link rel="stylesheet"-->
  65 + <!--href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css"-->
  66 + <!--type="text/css" />-->
67 67 <link href="/metronic_v4.5.4/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css" rel="stylesheet" type="text/css"/>
68 68 <!-- handsontable样式 -->
69 69 <link rel="stylesheet"
... ...
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/base/line/list.html
... ... @@ -350,7 +350,7 @@
350 350 </td>
351 351 <td>
352 352 <a href="/pages/base/stationroute/list.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 查看</a>
353   - <a href="javascript:window.localStorage.setItem('geo_data_edit_line_code' , '{{obj.lineCode}}');window.localStorage.removeItem('geo_data_edit_line_version');window.location.href='/pages/base/geo_data_edit/uk3_wrap.html';" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a>
  353 + <!--<a href="javascript:window.localStorage.setItem('geo_data_edit_line_code' , '{{obj.lineCode}}');window.localStorage.removeItem('geo_data_edit_line_version');window.location.href='/pages/base/geo_data_edit/uk3_wrap.html';" class="btn default blue-stripe btn-sm" data-pjax> 查看 </a>-->
354 354 </td>
355 355 <td>
356 356 <a href="details.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 详细 </a>
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-map.js
... ... @@ -22,7 +22,7 @@
22 22 * - - - - - -》getSectionListPlonly:根据坐标点获取两点之间的折线路段(手动规划)
23 23 */
24 24  
25   -var WorldsBMap = function () {
  25 +window.WorldsBMap = function () {
26 26  
27 27 /** WorldsBMap 全局变量定义 mapBValue:地图对象;polygon:多边形;polyUpline:走向折线;circle:圆 */
28 28 var mapBValue = '';polygon='',polyUpline='',circle='',iseditStatus = false;
... ...
src/main/resources/static/pages/forms/mould/waybill_minhang.xls
No preview for this file type
src/main/resources/static/pages/forms/mould/waybill_minhang_dl.xls
No preview for this file type
src/main/resources/static/pages/scheduleApp/module/basicInfo/deviceInfoManage/detail.html
... ... @@ -98,7 +98,7 @@
98 98 <label class="col-md-2 control-label">启用日期*:</label>
99 99 <div class="col-md-3">
100 100 <input type="text" class="form-control"
101   - name="qyrq" uib-datepicker-popup="yyyy年MM月dd日"
  101 + name="qyrq" uib-datepicker-popup="yyyy年MM月dd日 HH:mm"
102 102 ng-model="ctrl.deviceInfoForDetail.qyrq" readonly/>
103 103 </div>
104 104 </div>
... ...
src/main/resources/static/pages/scheduleApp/module/basicInfo/deviceInfoManage/edit.html
... ... @@ -82,13 +82,8 @@
82 82 <div class="form-group has-success has-feedback">
83 83 <label class="col-md-2 control-label">旧终端号*:</label>
84 84 <div class="col-md-3">
85   - <input type="text" class="form-control"
86   - name="oldDeviceNo" ng-model="ctrl.deviceInfoForSave.oldDeviceNo"
87   - required placeholder="请输入旧终端号"/>
88   - </div>
89   - <!-- 隐藏块,显示验证信息 -->
90   - <div class="alert alert-danger well-sm" ng-show="myForm.oldDeviceNo.$error.required">
91   - 旧终端号必须填写
  85 + <input type="text" class="form-control" name="oldDeviceNo"
  86 + ng-model="ctrl.deviceInfoForSave.oldDeviceNo" readonly/>
92 87 </div>
93 88 </div>
94 89  
... ... @@ -143,31 +138,40 @@
143 138 </div>
144 139 </div>
145 140  
  141 + <!--<div class="form-group has-success has-feedback">-->
  142 + <!--<label class="col-md-2 control-label">启用日期*:</label>-->
  143 + <!--<div class="col-md-3">-->
  144 + <!--<div class="input-group">-->
  145 + <!--<input type="text" class="form-control"-->
  146 + <!--name="qyrq" placeholder="请选择启用日期..."-->
  147 + <!--uib-datepicker-popup="yyyy年MM月dd日"-->
  148 + <!--is-open="ctrl.qyrqOpen" required-->
  149 + <!--ng-model="ctrl.deviceInfoForSave.qyrq" readonly-->
  150 + <!--remote-Validation-->
  151 + <!--remotevtype="cde1"-->
  152 + <!--remotevparam="{{ {'id_eq': ctrl.deviceInfoForSave.id, 'qyrq_eq': ctrl.deviceInfoForSave.qyrq, 'xl_eq': ctrl.deviceInfoForSave.xl, 'cl_eq': ctrl.deviceInfoForSave.cl} | json}}"/>-->
  153 + <!--<span class="input-group-btn">-->
  154 + <!--<button type="button" class="btn btn-default" ng-click="ctrl.qyrq_open()">-->
  155 + <!--<i class="glyphicon glyphicon-calendar"></i>-->
  156 + <!--</button>-->
  157 + <!--</span>-->
  158 + <!--</div>-->
  159 + <!--</div>-->
  160 + <!--&lt;!&ndash; 隐藏块,显示验证信息 &ndash;&gt;-->
  161 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.required">-->
  162 + <!--启用日期必须选择-->
  163 + <!--</div>-->
  164 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.remote">-->
  165 + <!--{{$remote_msg}}-->
  166 + <!--</div>-->
  167 + <!--</div>-->
  168 +
146 169 <div class="form-group has-success has-feedback">
147 170 <label class="col-md-2 control-label">启用日期*:</label>
148 171 <div class="col-md-3">
149   - <div class="input-group">
150   - <input type="text" class="form-control"
151   - name="qyrq" placeholder="请选择启用日期..."
152   - uib-datepicker-popup="yyyy年MM月dd日"
153   - is-open="ctrl.qyrqOpen" required
154   - ng-model="ctrl.deviceInfoForSave.qyrq" readonly
155   - remote-Validation
156   - remotevtype="cde1"
157   - remotevparam="{{ {'id_eq': ctrl.deviceInfoForSave.id, 'qyrq_eq': ctrl.deviceInfoForSave.qyrq, 'xl_eq': ctrl.deviceInfoForSave.xl, 'cl_eq': ctrl.deviceInfoForSave.cl} | json}}"/>
158   - <span class="input-group-btn">
159   - <button type="button" class="btn btn-default" ng-click="ctrl.qyrq_open()">
160   - <i class="glyphicon glyphicon-calendar"></i>
161   - </button>
162   - </span>
163   - </div>
164   - </div>
165   - <!-- 隐藏块,显示验证信息 -->
166   - <div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.required">
167   - 启用日期必须选择
168   - </div>
169   - <div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.remote">
170   - {{$remote_msg}}
  172 + <input type="text" class="form-control"
  173 + name="qyrq" uib-datepicker-popup="yyyy年MM月dd日 HH:mm"
  174 + ng-model="ctrl.deviceInfoForSave.qyrq" readonly/>
171 175 </div>
172 176 </div>
173 177  
... ...
src/main/resources/static/pages/scheduleApp/module/basicInfo/deviceInfoManage/form.html
... ... @@ -82,13 +82,8 @@
82 82 <div class="form-group has-success has-feedback">
83 83 <label class="col-md-2 control-label">旧终端号*:</label>
84 84 <div class="col-md-3">
85   - <input type="text" class="form-control"
86   - name="oldDeviceNo" ng-model="ctrl.deviceInfoForSave.oldDeviceNo"
87   - required placeholder="请输入旧终端号"/>
88   - </div>
89   - <!-- 隐藏块,显示验证信息 -->
90   - <div class="alert alert-danger well-sm" ng-show="myForm.oldDeviceNo.$error.required">
91   - 旧终端号必须填写
  85 + <input type="text" class="form-control" name="oldDeviceNo"
  86 + ng-model="ctrl.deviceInfoForSave.oldDeviceNo" readonly/>
92 87 </div>
93 88 </div>
94 89  
... ... @@ -143,23 +138,44 @@
143 138 </div>
144 139 </div>
145 140  
  141 + <!--<div class="form-group has-success has-feedback">-->
  142 + <!--<label class="col-md-2 control-label">启用日期*:</label>-->
  143 + <!--<div class="col-md-3">-->
  144 + <!--<div class="input-group">-->
  145 + <!--<input type="text" class="form-control"-->
  146 + <!--name="qyrq" placeholder="请选择启用日期..."-->
  147 + <!--uib-datepicker-popup="yyyy年MM月dd日 hh:mm:ss"-->
  148 + <!--is-open="ctrl.qyrqOpen" required-->
  149 + <!--ng-model="ctrl.deviceInfoForSave.qyrq" readonly-->
  150 + <!--remote-Validation-->
  151 + <!--remotevtype="cde1"-->
  152 + <!--remotevparam="{{ {'qyrq_eq': ctrl.deviceInfoForSave.qyrq, 'xl_eq': ctrl.deviceInfoForSave.xl, 'cl_eq': ctrl.deviceInfoForSave.cl} | json}}"/>-->
  153 + <!--<span class="input-group-btn">-->
  154 + <!--<button type="button" class="btn btn-default" ng-click="ctrl.qyrq_open()">-->
  155 + <!--<i class="glyphicon glyphicon-calendar"></i>-->
  156 + <!--</button>-->
  157 + <!--</span>-->
  158 + <!--</div>-->
  159 + <!--</div>-->
  160 + <!--&lt;!&ndash; 隐藏块,显示验证信息 &ndash;&gt;-->
  161 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.required">-->
  162 + <!--启用日期必须选择-->
  163 + <!--</div>-->
  164 + <!--<div class="alert alert-danger well-sm" ng-show="myForm.qyrq.$error.remote">-->
  165 + <!--{{$remote_msg}}-->
  166 + <!--</div>-->
  167 + <!--</div>-->
  168 +
146 169 <div class="form-group has-success has-feedback">
147   - <label class="col-md-2 control-label">启用日期*:</label>
  170 + <label class="col-md-2 control-label">启用日期:</label>
148 171 <div class="col-md-3">
149 172 <div class="input-group">
150   - <input type="text" class="form-control"
151   - name="qyrq" placeholder="请选择启用日期..."
152   - uib-datepicker-popup="yyyy年MM月dd日"
153   - is-open="ctrl.qyrqOpen" required
154   - ng-model="ctrl.deviceInfoForSave.qyrq" readonly
  173 + <input type="datetime-local" class="form-control" name="qyrq"
  174 + ng-model="ctrl.deviceInfoForSave.qyrq"
155 175 remote-Validation
156 176 remotevtype="cde1"
157   - remotevparam="{{ {'qyrq_eq': ctrl.deviceInfoForSave.qyrq, 'xl_eq': ctrl.deviceInfoForSave.xl, 'cl_eq': ctrl.deviceInfoForSave.cl} | json}}"/>
158   - <span class="input-group-btn">
159   - <button type="button" class="btn btn-default" ng-click="ctrl.qyrq_open()">
160   - <i class="glyphicon glyphicon-calendar"></i>
161   - </button>
162   - </span>
  177 + remotevparam="{{ {'qyrq_eq': ctrl.deviceInfoForSave.qyrq, 'xl_eq': ctrl.deviceInfoForSave.xl, 'cl_eq': ctrl.deviceInfoForSave.cl} | json}}" />
  178 +
163 179 </div>
164 180 </div>
165 181 <!-- 隐藏块,显示验证信息 -->
... ...
src/main/resources/static/pages/scheduleApp/module/basicInfo/deviceInfoManage/list.html
... ... @@ -7,7 +7,7 @@
7 7 <th style="width: 70px;">序号</th>
8 8 <th style="width: 15%;">线路名称</th>
9 9 <th style="width: 10%;">内部编号</th>
10   - <th style="width: 100px;">启用日期</th>
  10 + <th style="width: 160px;">启用日期</th>
11 11 <th>旧设备编号</th>
12 12 <th>新设备编号</th>
13 13 <th style="width: 180px;">操作人/操作时间</th>
... ... @@ -71,7 +71,7 @@
71 71 <span ng-bind="info.clZbh"></span>
72 72 </td>
73 73 <td>
74   - <span ng-bind="info.qyrq | date:'yyyy-MM-dd'"></span>
  74 + <span ng-bind="info.qyrq | date:'yyyy-MM-dd HH:mm'"></span>
75 75 </td>
76 76 <td>
77 77 <span ng-bind="info.oldDeviceNo"></span>
... ...
src/main/resources/static/pages/scheduleApp/module/common/main.js
... ... @@ -283,7 +283,8 @@ ScheduleApp.factory(
283 283 alert("我擦,后台返回连个状态码都没返回,见鬼了,服务器可能重启了");
284 284 } else if (rejection.status == -1) {
285 285 // 服务器断开了
286   - alert("貌似服务端连接不上");
  286 + // alert("貌似服务端连接不上");
  287 + console.log("貌似服务端连接不上");
287 288 } else {
288 289 output.push("状态编码:" + rejection.status);
289 290 output.push("错误内容:" + angular.toJson(rejection.data));
... ...
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/list.html
... ... @@ -176,8 +176,8 @@
176 176 <!--class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 编辑2 </a>-->
177 177 <a ui-sref="ttInfoDetailManage_edit3({xlid: info.xl.id, ttid : info.id, xlname: info.xl.name, ttname : info.name, rflag : true, lineversion : info.lineVersion})"
178 178 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 编辑 </a>
179   - <a ng-click="ctrl.toTtInfoDetailAuto(info.id)"
180   - class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 生成 </a>
  179 + <!--<a ng-click="ctrl.toTtInfoDetailAuto(info.id)"-->
  180 + <!--class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 生成 </a>-->
181 181 <a ui-sref="ttInfoDetailManage_form({xlid: info.xl.id, ttid : info.id, xlname: info.xl.name, ttname : info.name})"
182 182 class="btn btn-info btn-sm" ng-if="info.isCancel == '0'"> 导入 </a>
183 183 <a href="javascript:" class="btn btn-info btn-sm" ng-click="ctrl.exportData(info.id)"> 导出 </a>
... ...
src/main/resources/static/pages/summary/destory_sch_detail/list.html
... ... @@ -127,7 +127,7 @@
127 127 <div uk-spinner></div>
128 128 </div>
129 129 <div class="ct_page" style="display: none;">
130   - <h3 class="uk-heading-line uk-heading-bullet"><span>烂班明细统计</span></h3>
  130 + <h3 class="uk-heading-line uk-heading-bullet"><span style="color: #ff5353;">烂班明细统计</span></h3>
131 131 <div class="ct_cont" >
132 132 <div class="ct_search_form_wrap">
133 133 <form>
... ... @@ -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/pages/summary/excel/临加明细情况.xls 0 → 100644
No preview for this file type
src/main/resources/static/pages/summary/temp_sch_detail/d_s_d_wrap.html 0 → 100644
  1 +<!-- 临加明细统计 -->
  2 +<iframe src="/pages/summary/temp_sch_detail/list.html?origin=real_control_iframe" frameborder="0" style="height: 100%;width: 100%;"></iframe>
0 3 \ No newline at end of file
... ...
src/main/resources/static/pages/summary/temp_sch_detail/list.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="zh-cn">
  3 +
  4 +<head>
  5 + <meta charset="UTF-8">
  6 + <link rel="stylesheet" href="/assets/plugins/uk3.0/uikit.min.css"/>
  7 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.css" />
  8 + <!-- flatpickr -->
  9 + <link rel="stylesheet" href="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.css">
  10 + <style>
  11 + html,body{
  12 + height: 100%;
  13 + }
  14 + .ct_page{
  15 + padding: 25px 15px;
  16 + height: 100%;
  17 + height: calc(100% - 50px);
  18 + }
  19 +
  20 + .ct_cont{
  21 + height: calc(100% - 35px);
  22 + }
  23 +
  24 + .ct_cont>div>div.uk-card{
  25 + height: 99%;
  26 + }
  27 +
  28 + .loading{
  29 + height: 100%;
  30 + text-align: center;
  31 + }
  32 + .loading .uk-spinner{
  33 + margin-top: 200px;
  34 + }
  35 + .loading circle{
  36 + stroke: red;
  37 + }
  38 +
  39 + .ps-container > .ps-scrollbar-x-rail, .ps-container > .ps-scrollbar-y-rail{
  40 + opacity: 0.6 !important;
  41 + padding: 0 !important;
  42 + }
  43 +
  44 + .ct_destroy_sch_table_width th:nth-of-type(1),.ct_destroy_sch_table_width td:nth-of-type(1){
  45 + width: 9%;
  46 + }
  47 + .ct_destroy_sch_table_width th:nth-of-type(2),.ct_destroy_sch_table_width td:nth-of-type(2){
  48 + width: 10%;
  49 + }
  50 + .ct_destroy_sch_table_width th:nth-of-type(3),.ct_destroy_sch_table_width td:nth-of-type(3){
  51 + width: 9%;
  52 + }
  53 + .ct_destroy_sch_table_width th:nth-of-type(4),.ct_destroy_sch_table_width td:nth-of-type(4){
  54 + width: 9%;
  55 + }
  56 + .ct_destroy_sch_table_width th:nth-of-type(5),.ct_destroy_sch_table_width td:nth-of-type(5){
  57 + width: 9%;
  58 + }
  59 + .ct_destroy_sch_table_width th:nth-of-type(6),.ct_destroy_sch_table_width td:nth-of-type(6){
  60 + width: 8%;
  61 + }
  62 + .ct_destroy_sch_table_width th:nth-of-type(7),.ct_destroy_sch_table_width td:nth-of-type(7){
  63 + width: 8%;
  64 + }
  65 + .ct_destroy_sch_table_width th:nth-of-type(8),.ct_destroy_sch_table_width td:nth-of-type(8){
  66 + width: 8%;
  67 + }
  68 + .ct_destroy_sch_table_width th:nth-of-type(9),.ct_destroy_sch_table_width td:nth-of-type(9){
  69 + }
  70 +
  71 + .ct_search_form_wrap{
  72 + border-bottom: 1px solid #e5e5e5;
  73 + padding: 10px 0 25px 10px;
  74 + }
  75 + .ct_search_form_wrap .ct_field{
  76 + display: inline-block;
  77 + margin: 0 5px;
  78 + }
  79 +
  80 + .ct_search_form_wrap .ct_field label{
  81 + font-size: 14px;
  82 + }
  83 +
  84 + .ct_search_form_wrap .ct_field input{
  85 + width: 110px;
  86 + }
  87 +
  88 + .ct_search_form_wrap .ct_field select{
  89 + width: auto;
  90 + min-width: 100px;
  91 + }
  92 +
  93 + .ct_search_form_wrap .uk-button{
  94 + padding: 0 14px;
  95 + }
  96 +
  97 + .ct_search_form_wrap .uk-button i{
  98 + vertical-align: middle;
  99 + margin-top: -2px;
  100 + margin-right: 7px;
  101 + }
  102 +
  103 + .ct_table_wrap{
  104 + font-size: 14px;
  105 + height: calc(100% - 77px);
  106 + }
  107 +
  108 + .t_body_wrap{
  109 + height: calc(100% - 41px);
  110 + overflow: auto;
  111 + position: relative;
  112 + }
  113 +
  114 + .ct_field.ct_field_bottom{
  115 + vertical-align: bottom;
  116 + font-size: 12px;
  117 + margin-left: 0;
  118 + }
  119 + </style>
  120 +</head>
  121 +
  122 +<body>
  123 +<div class="loading">
  124 + <div uk-spinner></div>
  125 +</div>
  126 +<div class="ct_page" style="display: none;">
  127 + <h3 class="uk-heading-line uk-heading-bullet"><span>临加明细统计</span></h3>
  128 + <div class="ct_cont" >
  129 + <div class="ct_search_form_wrap">
  130 + <form>
  131 + <div class="ct_field">
  132 + <label>公司:
  133 + <select class="uk-select" name="gsBm_eq">
  134 + </select>
  135 + </label>
  136 + </div>
  137 + <div class="ct_field">
  138 + <label>分公司:
  139 + <select class="uk-select" name="fgsBm_eq">
  140 + </select>
  141 + </label>
  142 + </div>
  143 + <div class="ct_field">
  144 + <label>线路:
  145 + <select class="uk-select" name="lineCode_eq">
  146 + </select>
  147 + </label>
  148 + </div>
  149 + <div class="ct_field">
  150 + <label>日期:
  151 + <input class="uk-input" name="rq" style="width: 220px;">
  152 + </label>
  153 + </div>
  154 + <div class="ct_field">
  155 + <button class="uk-button uk-button-primary search"><i uk-icon="icon: search"></i>搜索</button>
  156 + </div>
  157 + <div class="ct_field ct_field_bottom">
  158 + <button class="uk-button uk-button-text export_excel" style="padding: 0 5px;">导出数据</button>
  159 + </div>
  160 + <div class="ct_field ct_field_bottom">
  161 + <span uk-icon="icon: question" title="不统计进出场和2点间空驶" uk-tooltip="pos: bottom"></span>
  162 + </div>
  163 + </form>
  164 + </div>
  165 + <div class="ct_table_wrap day">
  166 + <table class="uk-table uk-table-small ct_destroy_sch_table_width" style="margin-bottom: 0;">
  167 + <thead>
  168 + <tr>
  169 + <th>日期</th>
  170 + <th>线路</th>
  171 + <th>车号</th>
  172 + <th>司机</th>
  173 + <th>售票员</th>
  174 + <th>班次</th>
  175 + <th>烂班公里</th>
  176 + <th>烂班时间</th>
  177 + <th>备注</th>
  178 + </tr>
  179 + </thead>
  180 + </table>
  181 + <div class="t_body_wrap">
  182 + <table class="uk-table uk-table-divider uk-table-hover uk-table-small ct_destroy_sch_table ct_destroy_sch_table_width">
  183 + <tbody>
  184 + </tbody>
  185 + </table>
  186 + </div>
  187 + </div>
  188 + </div>
  189 +</div>
  190 +
  191 +<script id="destroy_sch_list_temp" type="text/html">
  192 + {{each list as obj i}}
  193 + <tr>
  194 + <td>{{obj.rq}}</td>
  195 + <td>{{obj.lineName}}</td>
  196 + <td>{{obj.nbbm}}</td>
  197 + <td>{{obj.jGh}}</td>
  198 + <td>{{obj.sGh}}</td>
  199 + <td><a style="text-decoration: underline;">{{obj.size}}</a></td>
  200 + <td>{{obj.mileage}}</td>
  201 + <td>{{obj.timeStr}}</td>
  202 + <td>{{obj.remark}}</td>
  203 + </tr>
  204 + {{/each}}
  205 +</script>
  206 +
  207 +<script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
  208 +<script src="/assets/plugins/uk3.0/uikit.min.js"></script>
  209 +<script src="/assets/plugins/uk3.0/uikit-icons.min.js"></script>
  210 +<script src="/real_control_v2/assets/plugins/perfect-scrollbar/perfect-scrollbar.jquery.js" ></script>
  211 +<!-- EventProxy -->
  212 +<script src="/assets/js/eventproxy.js"></script>
  213 +<!-- art-template 模版引擎 -->
  214 +<script src="/assets/plugins/template.js"></script>
  215 +<script src="/real_control_v2/assets/plugins/moment/moment.min.js"></script>
  216 +<!-- jquery.serializejson JSON序列化插件 -->
  217 +<script src="/assets/plugins/jquery.serializejson.js" merge="plugins"></script>
  218 +<!-- flatpickr -->
  219 +<script src="/real_control_v2/assets/plugins/flatpickr/flatpickr.min.js" ></script>
  220 +<script src="/real_control_v2/assets/plugins/flatpickr/l10n/zh.js" ></script>
  221 +<script>
  222 +
  223 + var f = $('form', '');
  224 + //var page=0, pageSize=120;
  225 +
  226 + var ep = EventProxy.create('query_comps', 'query_lines', function () {
  227 + $('[name=gsBm_eq]', f).trigger('change');//公司change
  228 + query();
  229 +
  230 + $('.loading').remove();
  231 + $('.ct_page').show();
  232 + });
  233 +
  234 + //点击搜索
  235 + $('button.search', f).on('click', query);
  236 +
  237 + function query() {
  238 + $('button.search', f).attr('disabled', 'disabled');
  239 + var data = f.serializeJSON();
  240 + $('.ct_destroy_sch_table tbody').html('');
  241 + //开始结束时间
  242 + data.rq_ge = data.rq.substr(0, 10);
  243 + data.rq_le = data.rq.substr(13);
  244 + //data.order='t';
  245 + delete data.rq;
  246 +
  247 + $.get('/summary/temp_sch/all', data, function (rs) {
  248 + $('button.search', f).removeAttr('disabled');
  249 + if(!rs || rs.length==0)
  250 + return UIkit.notification('没有搜索到相关数据!!', 'danger');
  251 + $.each(rs, function () {
  252 + this.timeStr=moment(this.t).format('HH:mm')
  253 + });
  254 +
  255 + var htmlStr = template('destroy_sch_list_temp', {list: rs});
  256 + $('.ct_destroy_sch_table tbody').html(htmlStr);
  257 + $('.t_body_wrap').perfectScrollbar('update');
  258 + });
  259 + }
  260 +
  261 +
  262 + //日期选择框
  263 + var fs='YYYY-MM-DD'
  264 + , ets=moment().subtract(1, 'days').format(fs)
  265 + , sts=moment().subtract(3, 'days').format(fs);
  266 + flatpickr('.ct_search_form_wrap [name=rq]', {
  267 + mode: "range", dateFormat: "Y-m-d","locale": "zh", defaultDate: [sts, ets]
  268 + });
  269 + var comps;
  270 + //构建公司级联下拉框
  271 + $.get('/user/companyData', function (rs) {
  272 + comps = rs;
  273 + var opts = '';
  274 + for(var i=0,obj;obj=comps[i++];){
  275 + opts += '<option value="'+obj.companyCode+'">'+obj.companyName+'</option>';
  276 + }
  277 + $('[name=gsBm_eq]', f).html(opts);
  278 + ep.emit('query_comps');
  279 + });
  280 +
  281 + var lineMapps;
  282 + //加载线路信息
  283 + $.get('/line/all', {'destroy_eq': 0}, function (rs) {
  284 + rs.sort(function (a, b) {
  285 + return a.name.localeCompare(b.name);
  286 + });
  287 + lineMapps={};
  288 + var k;
  289 + $.each(rs, function () {
  290 + k = this.company+'_'+this.brancheCompany;
  291 + if(!lineMapps[k])
  292 + lineMapps[k]=[];
  293 + lineMapps[k].push(this);
  294 + });
  295 +
  296 + ep.emit('query_lines');
  297 + });
  298 +
  299 + $('[name=gsBm_eq]', f).on('change', function () {
  300 + var code = $(this).val(), subs=[];
  301 + $.each(comps, function () {
  302 + if(this.companyCode==code)
  303 + subs=this.children;
  304 + });
  305 +
  306 + var opts='';
  307 + $.each(subs, function () {
  308 + opts += '<option value="'+this.code+'">'+this.name+'</option>';
  309 + });
  310 + $('[name=fgsBm_eq]', f).html(opts).trigger('change');
  311 + });
  312 +
  313 + $('[name=fgsBm_eq]', f).on('change', function () {
  314 + var k = $('[name=gsBm_eq]', f).val() + '_' + $(this).val();
  315 + var array = lineMapps[k];
  316 + var opts = '<option value="">全部</option>';
  317 + if(array){
  318 + $.each(array, function () {
  319 + opts += '<option value="'+this.lineCode+'">'+this.name+'</option>';
  320 + });
  321 + }
  322 + $('[name=lineCode_eq]', f).html(opts);
  323 + });
  324 +
  325 + //
  326 + //滚动条
  327 + $('.t_body_wrap').perfectScrollbar({suppressScrollX: true});
  328 +
  329 + $(document).on('submit', 'form', function () {
  330 + return false;
  331 + });
  332 +
  333 + /**
  334 + * 导出
  335 + */
  336 + $('.export_excel').on('click', function () {
  337 + var data = f.serializeJSON();
  338 + data.rq_ge = data.rq.substr(0, 10);
  339 + data.rq_le = data.rq.substr(13);
  340 + data.order='t';
  341 + delete data.rq;
  342 +
  343 + window.open('/summary/temp_sch/excel?' + $.param(data));
  344 + });
  345 +
  346 +</script>
  347 +</body>
  348 +</html>
0 349 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/css/handicapped_style.css
... ... @@ -22,6 +22,6 @@
22 22 background: rgb(15, 220, 220) !important;
23 23 }
24 24  
25   -.ct_table>.ct_table_body{
  25 +.schedule-body .ct_table>.ct_table_body{
26 26 border-bottom: 1px solid #000000 !important;
27 27 }
... ...
src/main/resources/static/real_control_v2/css/line_schedule.css
... ... @@ -98,6 +98,14 @@
98 98  
99 99 .line-schedule-table dl dt:nth-of-type(3), .line-schedule-table dl dd:nth-of-type(3) {
100 100 width: calc(2% + 66px);
  101 + position: relative;
  102 +}
  103 +.line-schedule-table dl dd:nth-of-type(3)>i{
  104 + position: absolute;
  105 + color: #313030;
  106 + top: 1px;
  107 + right: 3px;
  108 + text-shadow: 0 -1px 0 rgba(0,0,0,.2);
101 109 }
102 110  
103 111 .line-schedule-table dl dt:nth-of-type(4), .line-schedule-table dl dd:nth-of-type(4) {
... ... @@ -545,7 +553,7 @@ dl.relevance-active.intimity dd:nth-child(n+2) {
545 553 dl.relevance-active.intimity dd:nth-child(n+2) a {
546 554 color: white !important;
547 555 }
548   -
  556 +/*
549 557 dl.relevance-active dd.tl-qrlb,
550 558 dl.relevance-active.intimity dd.tl-qrlb{
551 559 background: linear-gradient(to right, #a9a911, #808000, #8baabf) !important;
... ... @@ -587,7 +595,7 @@ dl.relevance-active.intimity dd.tl-xxrd {
587 595 dl.relevance-active dd.tl-xxfc,
588 596 dl.relevance-active.intimity dd.tl-xxfc {
589 597 background: linear-gradient(to right, #8baabf, rgb(43, 185, 185), rgb(0,255,255)) !important;
590   -}
  598 +}*/
591 599  
592 600 dl.relevance-active.intimity dd span.fcsj-diff {
593 601 color: #616060;
... ...
src/main/resources/static/real_control_v2/css/main.css
1 1 input::-webkit-outer-spin-button,
2   -input::-webkit-inner-spin-button{
  2 +input::-webkit-inner-spin-button {
3 3 display: none;
4 4 }
5 5  
... ... @@ -7,9 +7,11 @@ input::-webkit-calendar-picker-indicator {
7 7 display: none;
8 8 }
9 9  
10   -input::-webkit-datetime-edit { padding: 1px; }
  10 +input::-webkit-datetime-edit {
  11 + padding: 1px;
  12 +}
11 13  
12   -.ps-container > .ps-scrollbar-y-rail{
  14 +.ps-container > .ps-scrollbar-y-rail {
13 15 z-index: 1 !important;
14 16 }
15 17  
... ... @@ -18,6 +20,7 @@ input::-webkit-datetime-edit { padding: 1px; }
18 20 opacity: 0.6 !important;
19 21 padding: 0 !important;
20 22 }
  23 +
21 24 /* ^_^ baidu map hide logo */
22 25 .anchorBL, .anchorBL, .amap-logo, .amap-copyright {
23 26 display: none;
... ... @@ -298,7 +301,7 @@ svg.line-chart g.merge-item text {
298 301 .tooltip.multi-tooltip {
299 302 width: 160px;
300 303 display: inline-block;
301   - padding: 10px 0 10px 15px;
  304 + padding: 10px 0 10px 12px;
302 305 border-right: 1px solid #eeeeee;
303 306 border-bottom: 1px solid #eeeeee;
304 307 }
... ... @@ -749,8 +752,8 @@ li.map-panel {
749 752 }
750 753  
751 754 #schedule-lp_change-modal .sch-list dl dt:nth-of-type(4), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(4) {
752   - width: 10%;
753   - }
  755 + width: 10%;
  756 +}
754 757  
755 758 #schedule-lp_change-modal .sch-list dl dt:nth-of-type(5), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(5) {
756 759 width: 21%;
... ... @@ -764,9 +767,6 @@ li.map-panel {
764 767 width: 14%;
765 768 }
766 769  
767   -
768   -
769   -
770 770 #schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(1), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(1) {
771 771 width: 5%;
772 772 border-left: 1px solid #dedede;
... ... @@ -816,59 +816,57 @@ li.map-panel {
816 816 border-top: 1px solid #ffe2b9;
817 817 }
818 818  
819   -#cache_data_manage-modal .uk-table td{
  819 +#cache_data_manage-modal .uk-table td {
820 820 vertical-align: bottom;
821 821 }
822 822  
823 823 #cache_data_manage-modal .uk-table td,
824   -#cache_data_manage-modal .uk-table th{
  824 +#cache_data_manage-modal .uk-table th {
825 825 padding: 8px 8px 6px;
826 826 }
827 827  
828   -
829   -.ps-help-panel{
  828 +.ps-help-panel {
830 829 color: grey;
831 830 padding: 5px 2px;
832 831 }
833 832  
834   -.ps-help-panel small{
  833 +.ps-help-panel small {
835 834 display: block;
836 835 }
837 836  
838   -
839   -svg text.offline{
  837 +svg text.offline {
840 838 fill: #6f6a6a !important;
841 839 }
842 840  
843   -svg rect.offline{
  841 +svg rect.offline {
844 842 stroke: #dbdada !important;
845 843 fill: #dbdada !important;
846 844 }
847 845  
848   -.tooltip .tooltip-container .title a>.abnormal-text{
  846 +.tooltip .tooltip-container .title a > .abnormal-text {
849 847 font-size: 14px;
850 848 color: #ff5e5e;
851 849 font-weight: 600;
852 850 }
853 851  
854   -#addChildTaskBtn{
  852 +#addChildTaskBtn {
855 853 margin-left: 5px;
856 854 color: #36729b;
857 855 padding: 1px 5px 1px 6px;
858 856 }
859 857  
860   -#addChildTaskBtn:hover{
  858 +#addChildTaskBtn:hover {
861 859 box-shadow: 2px 1px 3px 0 rgba(0, 0, 0, 0.2), 0px 3px 8px 0 rgba(0, 0, 0, 0.19);
862 860 }
863 861  
864   -.edit-icon{
  862 +.edit-icon {
865 863 color: #aba9a9;
866 864 font-size: 12px;
867 865 margin-left: 5px;
868 866 display: none;
869 867 }
870 868  
871   -.operation-real-text{
  869 +.operation-real-text {
872 870 position: absolute;
873 871 top: 9px;
874 872 width: 100%;
... ... @@ -877,7 +875,7 @@ svg rect.offline{
877 875 pointer-events: none;
878 876 }
879 877  
880   -.operation-real-text span{
  878 +.operation-real-text span {
881 879 padding: 15px;
882 880 background: #ff4f4f;
883 881 color: white;
... ... @@ -885,75 +883,76 @@ svg rect.offline{
885 883 border-radius: 1px 1px 4px 4px;
886 884 }
887 885  
888   -#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-label{
  886 +#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-label {
889 887 width: 120px;
890 888 }
891 889  
892   -#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-controls{
  890 +#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-controls {
893 891 margin-left: 125px;
894 892 }
895 893  
896   -#oil_station-modal .uk-form-icon>[class*=uk-icon-]{
  894 +#oil_station-modal .uk-form-icon > [class*=uk-icon-] {
897 895 right: 23px;
898 896 }
899 897  
900   -#oil_station-modal .uk-form-icon:not(.uk-form-icon-flip)>input{
  898 +#oil_station-modal .uk-form-icon:not(.uk-form-icon-flip) > input {
901 899 padding-left: 10px !important;
902 900 }
903 901  
904   -#oil_station-modal .uk-form-icon{
  902 +#oil_station-modal .uk-form-icon {
905 903 width: calc(100% - 145px);
906 904 }
907 905  
908   -#oil_station-modal .uk-icon-mile:before{
  906 +#oil_station-modal .uk-icon-mile:before {
909 907 content: '公里';
910 908 }
911 909  
912   -#oil_station-modal .uk-icon-minute:before{
  910 +#oil_station-modal .uk-icon-minute:before {
913 911 content: '分钟';
914 912 }
915 913  
916   -option.oil_station_opt{
  914 +option.oil_station_opt {
917 915 color: red;
918 916 }
919 917  
920   -#oil_station-modal .uk-modal .uk-form.fv-form{
  918 +#oil_station-modal .uk-modal .uk-form.fv-form {
921 919 margin-bottom: 0 !important;
922 920 }
923 921  
924   -#gb_wait_modal .uk-modal-spinner{
  922 +#gb_wait_modal .uk-modal-spinner {
925 923 top: 25px;
926   - -webkit-transform: translate(-50%,0);
927   - transform: translate(-50%,0);
  924 + -webkit-transform: translate(-50%, 0);
  925 + transform: translate(-50%, 0);
928 926 }
929 927  
930   -#gb_wait_modal .wait-modal-text{
  928 +#gb_wait_modal .wait-modal-text {
931 929 text-align: center;
932 930 margin-top: 35px;
933 931 font-size: 15px;
934 932 color: #635e5e;
935 933 }
936 934  
937   -.park-and-station-wrap{
  935 +.park-and-station-wrap {
938 936 margin-top: 9px;
939 937 border: 1px solid #3dce69;
940 938 width: 580px;
941 939 padding: 12px;
942 940 border-radius: 5px;
943 941 }
944   -.park-and-station-wrap select{
  942 +
  943 +.park-and-station-wrap select {
945 944 width: auto !important;
946 945 }
947 946  
948 947 /** 安全驾驶相关css */
949   -.safe_driv_pop_wrap{
  948 +.safe_driv_pop_wrap {
950 949 position: absolute;
951 950 right: 12px;
952 951 bottom: 12px;
953 952 z-index: 99;
954 953 }
955 954  
956   -.safe_driv_pop{
  955 +.safe_driv_pop {
957 956 background: #d44b4b;
958 957 font-size: 15px;
959 958 padding: 9px 10px 0;
... ... @@ -965,14 +964,14 @@ option.oil_station_opt{
965 964 color: #f2f2f2;
966 965 }
967 966  
968   -.safe_driv_pop:hover{
  967 +.safe_driv_pop:hover {
969 968 background: #bc2a2a;
970 969 }
971 970  
972   -.safe_driv_pop .title{
  971 +.safe_driv_pop .title {
973 972 }
974 973  
975   -.safe_driv_pop .desc{
  974 +.safe_driv_pop .desc {
976 975 display: block;
977 976 font-size: 12px;
978 977 color: #ff9d9d;
... ... @@ -985,24 +984,26 @@ option.oil_station_opt{
985 984 width: 10px;
986 985 background-color: #F5F5F5;
987 986 }
  987 +
988 988 #formFragmentModal::-webkit-scrollbar-thumb {
989 989 background-color: #000000;
990 990 }
  991 +
991 992 #formFragmentModal::-webkit-scrollbar-track {
992 993 border: 0;
993 994 background-color: #F5F5F5;
994 995 border-radius: 0;
995 996 }
996 997  
997   -#formFragmentModal::-webkit-scrollbar-thumb{
  998 +#formFragmentModal::-webkit-scrollbar-thumb {
998 999 border: 5px solid rgb(226, 122, 122);
999 1000 }
1000 1001  
1001   -#schedule-addsch_oil-modal select{
  1002 +#schedule-addsch_oil-modal select {
1002 1003 height: 30px !important;
1003 1004 }
1004 1005  
1005   -#oil_station-modal .input_clear_icon{
  1006 +#oil_station-modal .input_clear_icon {
1006 1007 position: absolute;
1007 1008 top: 6px;
1008 1009 right: 108px;
... ... @@ -1015,26 +1016,25 @@ option.oil_station_opt{
1015 1016 cursor: pointer;
1016 1017 }
1017 1018  
1018   -#oil_station-modal .input_clear_icon:hover{
  1019 +#oil_station-modal .input_clear_icon:hover {
1019 1020 color: #de2020;
1020 1021 }
1021 1022  
1022   -#oil_station-modal .input_clear_icon:before{
  1023 +#oil_station-modal .input_clear_icon:before {
1023 1024 display: block;
1024 1025 font-family: FontAwesome;
1025 1026 content: "\f057";
1026 1027 }
1027 1028  
1028   -#oil_station-modal input.readonly{
  1029 +#oil_station-modal input.readonly {
1029 1030 background: #dddddd;
1030 1031 }
1031 1032  
1032   -
1033   -.ct_tags{
  1033 +.ct_tags {
1034 1034 margin-bottom: 12px;
1035 1035 }
1036 1036  
1037   -.ct_tags>span{
  1037 +.ct_tags > span {
1038 1038 padding: 3px 7px;
1039 1039 background: #e8e8e8;
1040 1040 color: #3a3939;
... ... @@ -1042,21 +1042,21 @@ option.oil_station_opt{
1042 1042 margin-right: 5px;
1043 1043 }
1044 1044  
1045   -.ct_tags>span.active{
  1045 +.ct_tags > span.active {
1046 1046 background: #62a9e1;
1047 1047 color: white;
1048 1048 box-shadow: 0 0 4px rgba(0, 0, 0, 0.35);
1049 1049 }
1050 1050  
1051   -.ct_tags>span.active:before{
  1051 +.ct_tags > span.active:before {
1052 1052 content: "\f00c";
1053 1053 font-family: FontAwesome;
1054 1054 margin-right: 2px;
1055 1055 font-size: 13px;
1056 1056 }
1057 1057  
1058   -.ct_tags>span:hover{
1059   - box-shadow: 0 0 4px rgba(0,0,0,.3);
  1058 +.ct_tags > span:hover {
  1059 + box-shadow: 0 0 4px rgba(0, 0, 0, .3);
1060 1060 }
1061 1061  
1062 1062 span.late-badge {
... ... @@ -1067,48 +1067,51 @@ span.late-badge {
1067 1067 margin-left: 2px;
1068 1068 }
1069 1069  
1070   -dl.intimity span.late-badge{
  1070 +dl.intimity span.late-badge {
1071 1071 color: #fbfbfb;
1072 1072 }
1073 1073  
1074 1074 /** badge tooltip */
1075 1075 .uk-badge.c_task:hover,
1076   -.uk-badge.sch_region:hover{
  1076 +.uk-badge.sch_region:hover {
1077 1077 background-image: none;
1078 1078 background: #38b3e1;
1079 1079 border: 1px solid #7ebad1;
1080 1080 }
1081 1081  
1082   -.uk-badge.out:hover{
  1082 +.uk-badge.out:hover {
1083 1083 background-image: none;
1084 1084 background: #8fc650;
1085 1085 border: 1px solid #949f86;
1086 1086 }
1087 1087  
1088   -.uk-badge.in:hover{
  1088 +.uk-badge.in:hover {
1089 1089 background-image: none;
1090 1090 background: #fabc64;
1091 1091 border: 1px solid #a68c67;
1092 1092 }
1093 1093  
1094   -.qtip.sch-badge-tip{
1095   - max-width: 500px;
  1094 +.qtip.sch-badge-tip {
  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   -.tip_task_list dl{
  1102 +
  1103 +.tip_task_list dl {
1103 1104 font-size: 0;
1104 1105 border-bottom: 1px solid #e6e6e6;
1105 1106 margin: 0;
1106 1107 }
1107   -.tip_task_list dl:last-child{
  1108 +
  1109 +.tip_task_list dl:last-child {
1108 1110 border-bottom: none;
1109 1111 }
  1112 +
1110 1113 .tip_task_list dl dt,
1111   -.tip_task_list dl dd{
  1114 +.tip_task_list dl dd {
1112 1115 display: inline-block;
1113 1116 font-size: 13px;
1114 1117 white-space: nowrap;
... ... @@ -1118,55 +1121,72 @@ dl.intimity span.late-badge{
1118 1121 line-height: 24px;
1119 1122 }
1120 1123  
1121   -.tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1){
1122   - width: 19%;
  1124 +.tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1) {
  1125 + width: 38px;
  1126 + border-right: 1px solid #c8c8c8;
1123 1127 }
1124   -.tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2){
1125   - width: 12%;
  1128 +
  1129 +.tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2) {
  1130 + width: 18%;
  1131 + text-indent: 5px;
1126 1132 }
1127   -.tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3){
1128   - width: 28%;
  1133 +
  1134 +.tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3) {
  1135 + width: 11%;
1129 1136 }
1130   -.tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4){
1131   - width: 28%;
  1137 +
  1138 +.tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4) {
  1139 + width: 25%;
1132 1140 }
1133   -.tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5){
1134   - width: 13%;
  1141 +
  1142 +.tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5) {
  1143 + width: 25%;
  1144 +}
  1145 +
  1146 +.tip_task_list dl dt:nth-of-type(6), .tip_task_list dl dd:nth-of-type(6) {
  1147 +
1135 1148 }
1136 1149  
1137   -.tip_task_list dl.service{
  1150 +.tip_task_list dl dd:nth-of-type(1) a {
  1151 + color: #3c3c3c;
  1152 + text-decoration: underline;
  1153 + font-size: 12px;
  1154 +}
  1155 +
  1156 +.tip_task_list dl.service {
1138 1157 color: blue;
1139 1158 }
1140   -.tip_task_list dl.service.destroy{
  1159 +
  1160 +.tip_task_list dl.service.destroy {
1141 1161 color: red;
1142 1162 }
1143 1163  
1144   -.tip_task_list dl.service.temp_add{
  1164 +.tip_task_list dl.service.temp_add {
1145 1165 color: #9C27B0;
1146 1166 }
1147 1167  
1148   -.tip_task_list dl span{
  1168 +.tip_task_list dl span {
1149 1169 margin: 0;
1150 1170 width: auto;
1151 1171 }
1152 1172  
1153   -ul.left_tabs_lg{
  1173 +ul.left_tabs_lg {
1154 1174 border: 1px solid #efeded;
1155 1175 height: 100%;
1156 1176 background: #fafafa;
1157 1177 }
1158 1178  
1159   -ul.left_tabs_lg li{
  1179 +ul.left_tabs_lg li {
1160 1180 line-height: 40px;
1161 1181 font-size: 15px;
1162 1182 }
1163 1183  
1164   -#schedule-addsch-modal .uk-modal-footer{
  1184 +#schedule-addsch-modal .uk-modal-footer {
1165 1185 border-top: none;
1166 1186 background: none;
1167 1187 }
1168 1188  
1169   -.ct_line_lp_badge{
  1189 +.ct_line_lp_badge {
1170 1190 float: left;
1171 1191 margin-top: 6px;
1172 1192 background: #e0e0e0;
... ... @@ -1174,94 +1194,111 @@ ul.left_tabs_lg li{
1174 1194 border-radius: 3px;
1175 1195 }
1176 1196  
1177   -.uk-badge.sch_ldks{
  1197 +.uk-badge.sch_ldks {
1178 1198 background: #8c8c8c;
1179   - background-image: linear-gradient(to bottom,#a7a7a7,#8c8c8c);
  1199 + background-image: linear-gradient(to bottom, #a7a7a7, #8c8c8c);
1180 1200 }
1181 1201  
1182   -.ct_layer_modal{
  1202 +.ct_layer_modal {
1183 1203 background: #e5e5e5;
1184 1204 height: 100%;
1185 1205 width: 100%;
1186 1206 overflow: auto;
1187 1207 }
1188 1208  
1189   -.layui-layer-setwin{
  1209 +.layui-layer-setwin {
1190 1210  
1191 1211 }
1192 1212  
1193   -.device_config_table dl dt:nth-of-type(1), .device_config_table dl dd:nth-of-type(1){
  1213 +.device_config_table dl dt:nth-of-type(1), .device_config_table dl dd:nth-of-type(1) {
1194 1214 width: 7%;
1195 1215 text-indent: 10px;
1196 1216 }
1197   -.device_config_table dl dt:nth-of-type(2), .device_config_table dl dd:nth-of-type(2){
  1217 +
  1218 +.device_config_table dl dt:nth-of-type(2), .device_config_table dl dd:nth-of-type(2) {
1198 1219 width: 7%;
1199 1220 }
1200   -.device_config_table dl dt:nth-of-type(3), .device_config_table dl dd:nth-of-type(3){
  1221 +
  1222 +.device_config_table dl dt:nth-of-type(3), .device_config_table dl dd:nth-of-type(3) {
1201 1223 width: 8%;
1202 1224 }
1203   -.device_config_table dl dt:nth-of-type(4), .device_config_table dl dd:nth-of-type(4){
  1225 +
  1226 +.device_config_table dl dt:nth-of-type(4), .device_config_table dl dd:nth-of-type(4) {
1204 1227 width: 5%;
1205 1228 }
1206   -.device_config_table dl dt:nth-of-type(5), .device_config_table dl dd:nth-of-type(5){
  1229 +
  1230 +.device_config_table dl dt:nth-of-type(5), .device_config_table dl dd:nth-of-type(5) {
1207 1231 width: 4%;
1208 1232 }
1209   -.device_config_table dl dt:nth-of-type(6), .device_config_table dl dd:nth-of-type(6){
  1233 +
  1234 +.device_config_table dl dt:nth-of-type(6), .device_config_table dl dd:nth-of-type(6) {
1210 1235 width: 4%;
1211 1236 }
1212   -.device_config_table dl dt:nth-of-type(7), .device_config_table dl dd:nth-of-type(7){
  1237 +
  1238 +.device_config_table dl dt:nth-of-type(7), .device_config_table dl dd:nth-of-type(7) {
1213 1239 width: 4%;
1214 1240 }
1215   -.device_config_table dl dt:nth-of-type(8), .device_config_table dl dd:nth-of-type(8){
  1241 +
  1242 +.device_config_table dl dt:nth-of-type(8), .device_config_table dl dd:nth-of-type(8) {
1216 1243 width: 5%;
1217 1244 }
1218   -.device_config_table dl dt:nth-of-type(9), .device_config_table dl dd:nth-of-type(9){
  1245 +
  1246 +.device_config_table dl dt:nth-of-type(9), .device_config_table dl dd:nth-of-type(9) {
1219 1247 width: 5%;
1220 1248 }
1221   -.device_config_table dl dt:nth-of-type(10), .device_config_table dl dd:nth-of-type(10){
  1249 +
  1250 +.device_config_table dl dt:nth-of-type(10), .device_config_table dl dd:nth-of-type(10) {
1222 1251 width: 8%;
1223 1252 }
1224   -.device_config_table dl dt:nth-of-type(11), .device_config_table dl dd:nth-of-type(11){
  1253 +
  1254 +.device_config_table dl dt:nth-of-type(11), .device_config_table dl dd:nth-of-type(11) {
1225 1255 width: 5%;
1226 1256 }
1227   -.device_config_table dl dt:nth-of-type(12), .device_config_table dl dd:nth-of-type(12){
  1257 +
  1258 +.device_config_table dl dt:nth-of-type(12), .device_config_table dl dd:nth-of-type(12) {
1228 1259 width: 5%;
1229 1260 }
1230   -.device_config_table dl dt:nth-of-type(13), .device_config_table dl dd:nth-of-type(13){
  1261 +
  1262 +.device_config_table dl dt:nth-of-type(13), .device_config_table dl dd:nth-of-type(13) {
1231 1263 width: 4%;
1232 1264 }
1233   -.device_config_table dl dt:nth-of-type(14), .device_config_table dl dd:nth-of-type(14){
  1265 +
  1266 +.device_config_table dl dt:nth-of-type(14), .device_config_table dl dd:nth-of-type(14) {
1234 1267 width: 4%;
1235 1268 }
1236   -.device_config_table dl dt:nth-of-type(15), .device_config_table dl dd:nth-of-type(15){
  1269 +
  1270 +.device_config_table dl dt:nth-of-type(15), .device_config_table dl dd:nth-of-type(15) {
1237 1271 width: 4%;
1238 1272 }
1239   -.device_config_table dl dt:nth-of-type(16), .device_config_table dl dd:nth-of-type(16){
  1273 +
  1274 +.device_config_table dl dt:nth-of-type(16), .device_config_table dl dd:nth-of-type(16) {
1240 1275 width: 3%;
1241 1276 }
1242   -.device_config_table dl dt:nth-of-type(17), .device_config_table dl dd:nth-of-type(17){
  1277 +
  1278 +.device_config_table dl dt:nth-of-type(17), .device_config_table dl dd:nth-of-type(17) {
1243 1279 width: 4%;
1244 1280 }
1245   -.device_config_table dl dt:nth-of-type(18), .device_config_table dl dd:nth-of-type(18){
  1281 +
  1282 +.device_config_table dl dt:nth-of-type(18), .device_config_table dl dd:nth-of-type(18) {
1246 1283 width: 13%;
1247 1284 }
1248 1285  
1249   -.uk-tooltip{
  1286 +.uk-tooltip {
1250 1287 z-index: 29999999 !important;
1251 1288 }
1252 1289  
1253 1290 .device_config_table.ct_table dl dd,
1254   -.device_config_table.ct_table dl dt{
  1291 +.device_config_table.ct_table dl dt {
1255 1292 border-right: 1px solid #dedede !important;
1256 1293 }
1257 1294  
1258   -.device_configs_manager .search_form{
  1295 +.device_configs_manager .search_form {
1259 1296 text-indent: 12px;
1260 1297 margin-bottom: 0;
1261 1298 padding: 18px 5px;
1262 1299 }
1263 1300  
1264   -.sub_task_form_v2{
  1301 +.sub_task_form_v2 {
1265 1302 background: #f9f9f9;
1266 1303 padding: 12px 15px;
1267 1304 border-radius: 5px 0 5px 5px;
... ... @@ -1270,7 +1307,7 @@ ul.left_tabs_lg li{
1270 1307 margin-bottom: 20px;
1271 1308 }
1272 1309  
1273   -.task_form_close_icon{
  1310 +.task_form_close_icon {
1274 1311 background: #f9f9f9;
1275 1312 padding: 0px 4px;
1276 1313 position: absolute;
... ... @@ -1285,41 +1322,41 @@ ul.left_tabs_lg li{
1285 1322 transition: all .03s;
1286 1323 }
1287 1324  
1288   -.task_form_close_icon:hover{
  1325 +.task_form_close_icon:hover {
1289 1326 border: 1px solid #ff1515;
1290 1327 border-left: none;
1291 1328 border-bottom: none;
1292 1329 color: #e03e3e;
1293 1330 }
1294 1331  
1295   -.sub_task_form_v2:hover::after{
  1332 +.sub_task_form_v2:hover::after {
1296 1333 color: #5f5b5b;
1297 1334 }
1298 1335  
1299   -.sub_task_form_v2.uk-form-horizontal .uk-form-label{
  1336 +.sub_task_form_v2.uk-form-horizontal .uk-form-label {
1300 1337 width: 80px;
1301 1338 }
1302 1339  
1303   -.sub_task_form_v2.uk-form-horizontal .uk-form-controls{
  1340 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls {
1304 1341 margin-left: 85px;
1305 1342 }
1306 1343  
1307 1344 .sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=text],
1308 1345 .sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=time],
1309   -.sub_task_form_v2.uk-form-horizontal .uk-form-controls select{
  1346 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls select {
1310 1347 width: 100%;
1311 1348 }
1312 1349  
1313   -#add-sub-task-main-modal .uk-modal-footer{
  1350 +#add-sub-task-main-modal .uk-modal-footer {
1314 1351 background: none;
1315 1352 border-top: none;
1316 1353 }
1317 1354  
1318   -#add-sub-task-main-modal .uk-grid+.uk-grid{
  1355 +#add-sub-task-main-modal .uk-grid + .uk-grid {
1319 1356 margin-top: 12px;
1320 1357 }
1321 1358  
1322   -#add-sub-task-main-modal .plus_icon_span{
  1359 +#add-sub-task-main-modal .plus_icon_span {
1323 1360 font-size: 26px;
1324 1361 color: #b2b2b2;
1325 1362 padding: 10px 64px;
... ... @@ -1330,26 +1367,26 @@ ul.left_tabs_lg li{
1330 1367 cursor: pointer;
1331 1368 }
1332 1369  
1333   -#add-sub-task-main-modal .uk-animation-fade{
  1370 +#add-sub-task-main-modal .uk-animation-fade {
1334 1371 animation-duration: .3s;
1335 1372 }
1336 1373  
1337   -#add-sub-task-main-modal .forms{
1338   - max-height: 488px;
  1374 +#add-sub-task-main-modal .forms {
  1375 + max-height: 642px;
1339 1376 overflow-y: auto;
1340 1377 overflow-x: hidden;
1341 1378 padding: 8px 8px 0 0;
1342 1379 }
1343 1380  
1344   -.add_custom_wrap .forms .sub_task_form_v2:last-child{
  1381 +.add_custom_wrap .forms .sub_task_form_v2:last-child {
1345 1382 margin-bottom: 0;
1346 1383 }
1347 1384  
1348   -.sub_task_form_v2.destroy_form{
  1385 +.sub_task_form_v2.destroy_form {
1349 1386 background-color: #fff5f4 !important;
1350 1387 }
1351 1388  
1352   -.uk-form>.half_change_car_box{
  1389 +.uk-form > .half_change_car_box {
1353 1390 margin: -10px 0 15px;
1354 1391 padding: 3px 5px;
1355 1392 display: inline-block;
... ... @@ -1357,29 +1394,29 @@ ul.left_tabs_lg li{
1357 1394 color: #918f8f;
1358 1395 }
1359 1396  
1360   -.half_change_car_box input[type=checkbox]{
  1397 +.half_change_car_box input[type=checkbox] {
1361 1398 vertical-align: top;
1362 1399 }
1363 1400  
1364   -.uk-form>.half_change_car_box.active{
  1401 +.uk-form > .half_change_car_box.active {
1365 1402 background: #4CAF50;
1366 1403 color: #fff;
1367 1404 }
1368 1405  
1369   -.uk-form>.half_change_car_box.active input[type=checkbox]{
  1406 +.uk-form > .half_change_car_box.active input[type=checkbox] {
1370 1407 background: #4caf50;
1371 1408 border-color: #4caf50;
1372 1409 }
1373 1410  
1374   -.uk-form>.half_change_car_box.active input[type=checkbox]:before{
  1411 +.uk-form > .half_change_car_box.active input[type=checkbox]:before {
1375 1412 color: #ffffff;
1376 1413 }
1377 1414  
1378   -.sub_task_form_v2.change_car{
  1415 +.sub_task_form_v2.change_car {
1379 1416 z-index: 99;
1380 1417 }
1381 1418  
1382   -.st_range_top_form{
  1419 +.st_range_top_form {
1383 1420 padding: 0 0 15px 5px;
1384 1421 border: 1px solid #c4bb76;
1385 1422 background: #e5e1c1;
... ... @@ -1387,46 +1424,46 @@ ul.left_tabs_lg li{
1387 1424 box-shadow: 0px 4px 3px 0 rgba(142, 138, 138, 0.2), 0px 4px 5px 0 rgba(157, 156, 156, 0.19);
1388 1425 }
1389 1426  
1390   -.st_range_top_form .uk-form-row{
  1427 +.st_range_top_form .uk-form-row {
1391 1428 margin-top: 20px;
1392 1429 }
1393 1430  
1394   -.uk-form-horizontal.st_range_top_form .uk-form-label{
  1431 +.uk-form-horizontal.st_range_top_form .uk-form-label {
1395 1432 width: 80px;
1396 1433 }
1397 1434  
1398   -.uk-form-horizontal.st_range_top_form .uk-form-controls{
  1435 +.uk-form-horizontal.st_range_top_form .uk-form-controls {
1399 1436 margin-left: 84px;
1400 1437 }
1401 1438  
1402   -.uk-form-horizontal.st_range_top_form .uk-form-controls select{
  1439 +.uk-form-horizontal.st_range_top_form .uk-form-controls select {
1403 1440 width: calc(100% - 2px);
1404 1441 }
1405 1442  
1406   -.sub_task_form_v2.service_st_form{
  1443 +.sub_task_form_v2.service_st_form {
1407 1444 background: #f4faff;
1408 1445 }
1409 1446  
1410   -.uk-modal .uk-form.fv-form.sub_task_form_v2{
  1447 +.uk-modal .uk-form.fv-form.sub_task_form_v2 {
1411 1448 margin-bottom: 20px !important;
1412 1449 }
1413 1450  
1414   -.sub_task_table_wrap .ct_table>.ct_table_body{
  1451 +.sub_task_table_wrap .ct_table > .ct_table_body {
1415 1452 border-bottom: none;
1416 1453 }
1417 1454  
1418   -.err_panel{
  1455 +.err_panel {
1419 1456 font-size: 12px;
1420 1457 color: #7e7d7d;
1421 1458 font-family: 微软雅黑;
1422 1459 margin-top: 5px;
1423 1460 }
1424 1461  
1425   -#schedule-lp_change-modal .ct_table dl{
  1462 +#schedule-lp_change-modal .ct_table dl {
1426 1463 height: 35px;
1427 1464 }
1428 1465  
1429   -#schedule-lp_change-modal .ct_table dl dd, #schedule-lp_change-modal .ct_table dl dt{
  1466 +#schedule-lp_change-modal .ct_table dl dd, #schedule-lp_change-modal .ct_table dl dt {
1430 1467 line-height: 35px;
1431 1468 }
1432 1469  
... ... @@ -1442,7 +1479,7 @@ ul.left_tabs_lg li{
1442 1479 font-weight: 600;
1443 1480 }*/
1444 1481  
1445   -.sub_task_form_v2:before{
  1482 +.sub_task_form_v2:before {
1446 1483 position: absolute;
1447 1484 top: -7px;
1448 1485 font-size: 12px;
... ... @@ -1451,19 +1488,19 @@ ul.left_tabs_lg li{
1451 1488 line-height: 14px;
1452 1489 }
1453 1490  
1454   -.sub_task_form_v2.destroy_form:before{
  1491 +.sub_task_form_v2.destroy_form:before {
1455 1492 content: '烂班' !important;
1456 1493 color: #f14235 !important;
1457 1494 background: #ffffff !important;
1458 1495 }
1459 1496  
1460   -.sub_task_form_v2.service_form:before{
  1497 +.sub_task_form_v2.service_form:before {
1461 1498 content: '营运';
1462 1499 color: #2196F3;
1463 1500 background: #ffffff;
1464 1501 }
1465 1502  
1466   -.sub_task_form_v2.service_form.temp_service:before{
  1503 +.sub_task_form_v2.service_form.temp_service:before {
1467 1504 content: '营运 (临加)';
1468 1505 color: #9C27B0;
1469 1506 background: #ffffff;
... ... @@ -1473,13 +1510,13 @@ ul.left_tabs_lg li{
1473 1510 background: #faf0fd;
1474 1511 }
1475 1512  
1476   -.sub_task_form_v2.empty_form:before{
  1513 +.sub_task_form_v2.empty_form:before {
1477 1514 content: '空驶';
1478 1515 color: #928f92;
1479 1516 background: #ffffff;
1480 1517 }
1481 1518  
1482   -.sub_task_form_v2.service_form{
  1519 +.sub_task_form_v2.service_form {
1483 1520 background: #f4faff;
1484 1521 }
1485 1522  
... ... @@ -1490,52 +1527,52 @@ ul.left_tabs_lg li{
1490 1527 .sub_task_form_v2.repeat_main{
1491 1528 background: #f4faff;
1492 1529 }*/
1493   -.footer_tools{
  1530 +.footer_tools {
1494 1531 position: absolute;
1495 1532 left: 235px;
1496 1533 bottom: 19px;
1497 1534 }
1498 1535  
1499   -.footer_mileage_count{
  1536 +.footer_mileage_count {
1500 1537 border: 1px solid #f2f2f2;
1501 1538 padding: 5px;
1502 1539 box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.2), 0px 2px 7px 0 rgba(0, 0, 0, 0.19);
1503 1540 display: inline-block;
1504 1541 }
1505 1542  
1506   -.footer_mileage_count>span{
  1543 +.footer_mileage_count > span {
1507 1544 padding: 2px 5px;
1508 1545 }
1509 1546  
1510   -.footer_mileage_count>span.service_sum{
  1547 +.footer_mileage_count > span.service_sum {
1511 1548 color: #2196F3;
1512 1549 }
1513 1550  
1514   -.footer_mileage_count>span.empty_sum{
  1551 +.footer_mileage_count > span.empty_sum {
1515 1552 color: #636363;
1516 1553 }
1517 1554  
1518   -.footer_mileage_count>span.destroy_sum{
  1555 +.footer_mileage_count > span.destroy_sum {
1519 1556 color: #f5574b;
1520 1557 }
1521 1558  
1522   -.station_to_park_link{
  1559 +.station_to_park_link {
1523 1560 display: inline-block;
1524 1561 margin-left: 15px;
1525 1562 vertical-align: bottom;
1526 1563 font-size: 12px;
1527 1564 }
1528 1565  
1529   -.station_to_park_link>a{
  1566 +.station_to_park_link > a {
1530 1567 color: #607D8B;
1531 1568 }
1532 1569  
1533 1570 #station_to_park-modal.ct-form-modal form input[type=text],
1534   -#station_to_park-modal.ct-form-modal form select{
  1571 +#station_to_park-modal.ct-form-modal form select {
1535 1572 width: auto;
1536 1573 }
1537 1574  
1538   -.s_2_park_form_wrap{
  1575 +.s_2_park_form_wrap {
1539 1576 background: #fafafa;
1540 1577 border: 1px solid #e5e5e5;
1541 1578 padding: 7px 16px;
... ... @@ -1543,7 +1580,7 @@ ul.left_tabs_lg li{
1543 1580 position: relative;
1544 1581 }
1545 1582  
1546   -.s_2_park_form_wrap .ct_close{
  1583 +.s_2_park_form_wrap .ct_close {
1547 1584 position: absolute;
1548 1585 top: -12px;
1549 1586 padding: 0 4px;
... ... @@ -1554,42 +1591,42 @@ ul.left_tabs_lg li{
1554 1591 cursor: pointer;
1555 1592 }
1556 1593  
1557   -.s_2_park_form_wrap .ct_close:hover{
  1594 +.s_2_park_form_wrap .ct_close:hover {
1558 1595 background: #e5e5e5;
1559 1596 color: #fd6e6e;
1560 1597 }
1561 1598  
1562   -.s_2_park_form_wrap label{
  1599 +.s_2_park_form_wrap label {
1563 1600 color: #666;
1564 1601 font-size: 13px;
1565 1602 }
1566 1603  
1567   -#station_to_park-modal.ct-form-modal form input[readonly]{
  1604 +#station_to_park-modal.ct-form-modal form input[readonly] {
1568 1605 background: #fafafa;
1569 1606 }
1570 1607  
1571   -.s_2_park_form_wrap .bottom_label{
  1608 +.s_2_park_form_wrap .bottom_label {
1572 1609 margin-top: 25px;
1573 1610 display: block;
1574 1611 }
1575 1612  
1576   -.s_2_park_form_wrap .bottom_label_2{
  1613 +.s_2_park_form_wrap .bottom_label_2 {
1577 1614 margin-top: 4px;
1578 1615 display: block;
1579 1616 }
1580 1617  
1581   -.ct_describe{
  1618 +.ct_describe {
1582 1619 font-size: 12px;
1583 1620 color: #909090;
1584 1621 font-family: FontAwesome;
1585 1622 }
1586 1623  
1587   -.ct_describe:before{
  1624 +.ct_describe:before {
1588 1625 content: "\f059";
1589 1626 margin-right: 3px;
1590 1627 }
1591 1628  
1592   -#add-sub-task-main-modal abbr{
  1629 +#add-sub-task-main-modal abbr {
1593 1630 display: inline-block;
1594 1631 font-size: 12px;
1595 1632 margin-left: 25px;
... ... @@ -1597,15 +1634,17 @@ ul.left_tabs_lg li{
1597 1634 color: #929292;
1598 1635 }
1599 1636  
1600   -#all-devices-modal .search-form input[type=text]{
  1637 +#all-devices-modal .search-form input[type=text] {
1601 1638 width: 100px;
1602 1639 }
1603 1640  
1604   -#all-devices-modal .auto-refresh{
1605   - vertical-align: middle;margin-left: 5px;color: grey;
  1641 +#all-devices-modal .auto-refresh {
  1642 + vertical-align: middle;
  1643 + margin-left: 5px;
  1644 + color: grey;
1606 1645 }
1607 1646  
1608   -#all-devices-modal .auto-refresh.active{
  1647 +#all-devices-modal .auto-refresh.active {
1609 1648 color: #405dff;
1610 1649 }
1611 1650  
... ... @@ -1613,7 +1652,7 @@ ul.left_tabs_lg li{
1613 1652 margin-top: 0 !important;
1614 1653 }
1615 1654  
1616   -#history-sch-maintain-modal .add_lp_link{
  1655 +#history-sch-maintain-modal .add_lp_link {
1617 1656 display: inline-block;
1618 1657 vertical-align: bottom;
1619 1658 margin-left: 15px;
... ... @@ -1621,107 +1660,107 @@ ul.left_tabs_lg li{
1621 1660 font-size: 13px;
1622 1661 }
1623 1662  
1624   -#schedule-tzrc-modal input[type=checkbox]{
  1663 +#schedule-tzrc-modal input[type=checkbox] {
1625 1664 margin-right: 9px;
1626 1665 }
1627 1666  
1628   -#schedule-tzrc-modal span.ct_zt_yzx{
  1667 +#schedule-tzrc-modal span.ct_zt_yzx {
1629 1668 color: #2196F3;
1630 1669 font-size: 12px;
1631 1670 }
1632 1671  
1633   -#schedule-tzrc-modal span.ct_zt_lb{
  1672 +#schedule-tzrc-modal span.ct_zt_lb {
1634 1673 color: red;
1635 1674 font-size: 12px;
1636 1675 }
1637 1676  
1638   -#schedule-tzrc-modal span.ct_zt_zzzx{
  1677 +#schedule-tzrc-modal span.ct_zt_zzzx {
1639 1678 font-size: 12px;
1640 1679 color: #38ad3c;
1641 1680 }
1642 1681  
1643   -#schedule-tzrc-modal .tzrc_form{
  1682 +#schedule-tzrc-modal .tzrc_form {
1644 1683 padding: 20px;
1645 1684 border: 1px solid #f0eded;
1646   - box-shadow: 0px -3px 15px rgba(0,0,0,0.08);
  1685 + box-shadow: 0px -3px 15px rgba(0, 0, 0, 0.08);
1647 1686 background: #f9f9f9;
1648 1687 }
1649 1688  
1650   -.uk-panel.ct_search_panel{
  1689 +.uk-panel.ct_search_panel {
1651 1690 padding: 15px;
1652 1691 border: 1px solid #f0eded;
1653   - box-shadow: 0px 3px 15px rgba(0,0,0,0.08);
  1692 + box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.08);
1654 1693 background: #f9f9f9;
1655 1694 }
1656 1695  
1657 1696 .sch-tzrc-table.ct_table dl.active,
1658   -.sch-tzrc-table.ct_table>.ct_table_body dl.active:hover{
  1697 +.sch-tzrc-table.ct_table > .ct_table_body dl.active:hover {
1659 1698 background: #5bd460;
1660 1699 color: white;
1661 1700 }
1662 1701  
1663   -#schedule-tzrc-modal dl.active span.ct_zt_yzx{
  1702 +#schedule-tzrc-modal dl.active span.ct_zt_yzx {
1664 1703 color: #545252;
1665 1704 }
1666 1705  
1667   -#schedule-tzrc-modal dl.active span.ct_zt_lb{
  1706 +#schedule-tzrc-modal dl.active span.ct_zt_lb {
1668 1707 color: #d64949;
1669 1708 }
1670 1709  
1671   -#schedule-tzrc-modal dl.active span.ct_zt_zzzx{
  1710 +#schedule-tzrc-modal dl.active span.ct_zt_zzzx {
1672 1711 color: white;
1673 1712 }
1674 1713  
1675   -#schedule-tzrc-modal dl.active input[type=checkbox]{
  1714 +#schedule-tzrc-modal dl.active input[type=checkbox] {
1676 1715 border: 0;
1677 1716 }
1678 1717  
1679   -#schedule-tzrc-modal dl.active input[type=checkbox]:before{
  1718 +#schedule-tzrc-modal dl.active input[type=checkbox]:before {
1680 1719 color: #ffffff;
1681 1720 }
1682 1721  
1683   -.sch-search-autocom input{
  1722 +.sch-search-autocom input {
1684 1723 padding: 0 !important;
1685 1724 height: 100% !important;
1686 1725 }
1687 1726  
1688   -label.blue_checkbox{
  1727 +label.blue_checkbox {
1689 1728 margin-left: 12px;
1690 1729 }
1691 1730  
1692   -label.blue_checkbox>input{
  1731 +label.blue_checkbox > input {
1693 1732 width: 17px !important;
1694 1733 height: 17px !important;
1695 1734 }
1696 1735  
1697   -label.blue_checkbox>input:checked:before,
1698   -label.blue_checkbox>input:indeterminate:before{
  1736 +label.blue_checkbox > input:checked:before,
  1737 +label.blue_checkbox > input:indeterminate:before {
1699 1738 line-height: 15px !important;
1700 1739 }
1701 1740  
1702   -dd.disabled{
  1741 +dd.disabled {
1703 1742 color: #b5b3b3;
1704 1743 }
1705 1744  
1706   -dl.active>dd.disabled{
  1745 +dl.active > dd.disabled {
1707 1746 color: #ececec;
1708 1747 }
1709 1748  
1710   -#change_user_options-modal .user_info{
  1749 +#change_user_options-modal .user_info {
1711 1750 width: 360px;
1712 1751 margin: auto;
1713 1752 }
1714 1753  
1715   -.display_hide{
  1754 +.display_hide {
1716 1755 display: none;
1717 1756 }
1718 1757  
1719   -.ct_eye_icon{
  1758 +.ct_eye_icon {
1720 1759 font-size: 16px;
1721 1760 cursor: pointer;
1722 1761 }
1723 1762  
1724   -.ct_eye_icon.active{
  1763 +.ct_eye_icon.active {
1725 1764 color: #444;
1726 1765 }
1727 1766  
... ... @@ -1730,7 +1769,7 @@ dl.active&gt;dd.disabled{
1730 1769 height: 16px;
1731 1770 }
1732 1771  
1733   -.range_2_normal_tt{
  1772 +.range_2_normal_tt {
1734 1773 margin-bottom: 15px;
1735 1774 border-top: 1px dashed #c7c7c7;
1736 1775 color: #a6a6a6;
... ... @@ -1738,7 +1777,7 @@ dl.active&gt;dd.disabled{
1738 1777 padding-bottom: 5px;
1739 1778 }
1740 1779  
1741   -.cancel_link{
  1780 +.cancel_link {
1742 1781 font-size: 12px;
1743 1782 margin-left: 15px;
1744 1783 vertical-align: bottom;
... ... @@ -1748,7 +1787,7 @@ dl.active&gt;dd.disabled{
1748 1787 right: 0;
1749 1788 }
1750 1789  
1751   -.edit_link{
  1790 +.edit_link {
1752 1791 font-size: 12px;
1753 1792 margin-left: 15px;
1754 1793 vertical-align: bottom;
... ... @@ -1769,7 +1808,7 @@ dl.active&gt;dd.disabled{
1769 1808 min-height: 40px;
1770 1809 }
1771 1810  
1772   -.c_b_abnorm_notice:before{
  1811 +.c_b_abnorm_notice:before {
1773 1812 content: "-超速报警-";
1774 1813 color: #000000;
1775 1814 font-size: 12px;
... ... @@ -1790,14 +1829,201 @@ dl.active&gt;dd.disabled{
1790 1829 cursor: pointer;
1791 1830 }
1792 1831  
1793   -.c_b_abnorm_notice>.c_b_item:first-child{
  1832 +.c_b_abnorm_notice > .c_b_item:first-child {
1794 1833 margin-top: 20px;
1795 1834 }
1796 1835  
1797   -.c_b_item.over{
  1836 +.c_b_item.over {
1798 1837 color: grey;
1799 1838 }
1800 1839  
1801   -.c_b_item>span.c_b_over{
  1840 +.c_b_item > span.c_b_over {
1802 1841 float: right;
  1842 +}
  1843 +
  1844 +.mileage_elec_panel {
  1845 + position: absolute;
  1846 + width: 100%;
  1847 + /*height: 90px;*/
  1848 + z-index: 1;
  1849 + background: white;
  1850 + bottom: 0px;
  1851 + box-shadow: 1px 0px 15px rgba(90, 90, 90, 0.48);
  1852 + padding: 9px 15px;
  1853 + border-radius: 0 5px;
  1854 + color: #000;
  1855 +
  1856 + display: none;
  1857 +}
  1858 +
  1859 +.mileage_elec_panel ._title {
  1860 + margin: 5px 3px;
  1861 + font-size: 15px;
  1862 +}
  1863 +
  1864 +.mileage_elec_panel .LD_item {
  1865 + margin: 5px 0;
  1866 + font-family: 微软雅黑;
  1867 +}
  1868 +
  1869 +.mileage_elec_panel .LD_item > span {
  1870 + padding: 3px;
  1871 + display: inline-block;
  1872 + width: 85px;
  1873 +}
  1874 +
  1875 +.mileage_elec_panel .lp_name {
  1876 + padding: 0 5px;
  1877 + background: #f2f2f2;
  1878 + border-radius: 15px
  1879 +}
  1880 +
  1881 +.mileage_elec_panel .LD_item > span > a {
  1882 + color: #000;
  1883 +}
  1884 +
  1885 +.mileage_elec_panel .LD_item > span:nth-of-type(1) > a {
  1886 + color: blue;
  1887 +}
  1888 +
  1889 +/*.mileage_elec_panel .LD_item>span:nth-of-type(2)>a{
  1890 + color: #fa3a2c;
  1891 +}
  1892 +
  1893 +.mileage_elec_panel .LD_item>span:nth-of-type(3)>a{
  1894 + color: #515151;
  1895 +}*/
  1896 +
  1897 +.mileage_elec_panel hr {
  1898 + height: 1px;
  1899 + border: none;
  1900 + border-top: 1px dashed #b5b5b5;
  1901 +}
  1902 +
  1903 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-label {
  1904 + width: 70px;
  1905 +}
  1906 +
  1907 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-controls {
  1908 + margin-left: 75px;
  1909 +}
  1910 +
  1911 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid + .uk-grid,
  1912 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid-margin,
  1913 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid > * > .uk-panel + .uk-panel {
  1914 + margin-top: 22px;
  1915 +}
  1916 +
  1917 +.c_task_mileage_abnormal,
  1918 +.c_task_mileage_abnormal .ct_table > .ct_table_head dl,
  1919 +.c_task_mileage_abnormal .ct_table dl {
  1920 + background: #ffe7e7 !important;
  1921 +}
  1922 +
  1923 +.tip_task_count_dl {
  1924 + width: calc(100% + 22px) !important;
  1925 + margin-left: -11px !important;
  1926 + border-top: 1px solid #e6e6e6 !important;
  1927 +}
  1928 +
  1929 +.tip_task_count_dl > dd:last-child {
  1930 + width: calc(100% - 50px) !important;
  1931 + border-right: 0 !important;
  1932 + height: 35px !important;
  1933 + background: #f3f3f3;
  1934 + margin-bottom: -3px;
  1935 +}
  1936 +
  1937 +.tip_task_count_dl > dd:nth-of-type(1) {
  1938 + text-align: center;
  1939 + border-right: 0 !important;
  1940 + width: 48px !important;
  1941 +}
  1942 +
  1943 +.tip_task_count_dl > dd:nth-of-type(1) > i {
  1944 + padding: 6px;
  1945 + cursor: pointer;
  1946 +}
  1947 +
  1948 +.tip_task_count_dl > dd:nth-of-type(1) > i:hover {
  1949 + background: #ebebeb;
  1950 +}
  1951 +
  1952 +.tip_task_count_dl.c_task_error > dd:last-child {
  1953 + background: #ff8a81;
  1954 +}
  1955 +
  1956 +.tip_task_count_dl > dd > span {
  1957 + font-size: 13px;
  1958 + color: #000;
  1959 + height: 55px;
  1960 + display: inline-block;
  1961 + padding: 7px 0;
  1962 + border-radius: 0;
  1963 + text-indent: 12px;
  1964 +}
  1965 +
  1966 +.tip_task_list > dl:nth-last-child(2) {
  1967 + border-bottom: 0 !important;
  1968 +}
  1969 +
  1970 +.c_task_mileage_error {
  1971 + border: 1px solid rgba(218, 13, 13, 0.2);
  1972 + border-bottom-color: rgba(213, 37, 37, 0.3);
  1973 + background-image: -webkit-linear-gradient(top, #ff6155, #F44336);
  1974 +}
  1975 +
  1976 +.uk-badge.c_task.c_task_mileage_error:hover:hover {
  1977 + background-image: none;
  1978 + background: #ff6155;
  1979 + border: 1px solid rgba(213, 37, 37, 0.3);
  1980 +}
  1981 +
  1982 +.grey_link {
  1983 + color: #adabab;
  1984 +}
  1985 +
  1986 +#sch_car_info_all-modal tr.ct_active {
  1987 + -moz-animation: twinkle_bg .9s ease-in-out;
  1988 + -webkit-animation: twinkle_bg .9s ease-in-out;
  1989 +}
  1990 +
  1991 +#sch_car_info_all-modal .uk-table-hover tr:hover{
  1992 + background: #dddddd;
  1993 +}
  1994 +
  1995 +@-moz-keyframes twinkle_bg {
  1996 + 0% {
  1997 + background: rgba(254, 235, 69, 0.38);
  1998 + }
  1999 + 25% {
  2000 + background: rgba(254, 235, 69, 0.7);
  2001 + }
  2002 + 50% {
  2003 + background: rgba(254, 235, 69, 0.3);
  2004 + }
  2005 + 75% {
  2006 + background: rgba(254, 235, 69, 0.7);
  2007 + }
  2008 + 100% {
  2009 + background: rgba(254, 235, 69, 0.38);
  2010 + }
  2011 +}
  2012 +
  2013 +@-webkit-keyframes twinkle_bg {
  2014 + 0% {
  2015 + background: rgba(254, 235, 69, 0.38);
  2016 + }
  2017 + 25% {
  2018 + background: rgba(254, 235, 69, 0.7);
  2019 + }
  2020 + 50% {
  2021 + background: rgba(254, 235, 69, 0.3);
  2022 + }
  2023 + 75% {
  2024 + background: rgba(254, 235, 69, 0.7);
  2025 + }
  2026 + 100% {
  2027 + background: rgba(254, 235, 69, 0.38);
  2028 + }
1803 2029 }
1804 2030 \ 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="{{sch.xlBm}}" 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,14 @@
35 37 <dd title="{{t.remarks}}">{{t.remarks}}</dd>
36 38 </dl>
37 39 {{/each}}
  40 + <dl class="tip_task_count_dl {{if sch.c_t_mileage_status==-1}}c_task_error{{/if}}" >
  41 + <dd><i class="uk-icon-plus badge_tip_add_icon" data-line="{{sch.xlBm}}" data-schid="{{sch.id}}"></i></dd>
  42 + <dd>
  43 + <span>计划:{{sch.jhlcOrig}}</span>
  44 + <span>营运+烂班:{{serviceCount}}</span>
  45 + <span>空驶:{{emptyCount}}</span>
  46 + </dd>
  47 + </dl>
38 48 </div>
39 49 </div>
40 50 </script>
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/car_info_all.html 0 → 100644
  1 +<div class="uk-modal ct_move_modal" id="sch_car_info_all-modal">
  2 + <div class="uk-modal-dialog" style="width: 1080px;">
  3 + <a href="" class="uk-modal-close uk-close"></a>
  4 +
  5 + <div class="uk-modal-header">
  6 + <h2>1006路 -全部车辆</h2></div>
  7 +
  8 + <table class="uk-table uk-table-hover" style="table-layout: fixed;">
  9 + <thead>
  10 + <tr>
  11 + <th style="width: 10%;">车辆</th>
  12 + <th style="width: 10%;">设备号</th>
  13 + <th style="width: 16%;">位置</th>
  14 + <th style="width: 14%;">车载线路编码</th>
  15 + <th style="width: 13%;">当前执行任务</th>
  16 + <th style="width: 7%;">状态</th>
  17 + <th style="width: 19%">最后gps时间</th>
  18 + <th>请求出场</th>
  19 + </tr>
  20 + </thead>
  21 + <tbody>
  22 + </tbody>
  23 + </table>
  24 + </div>
  25 +
  26 + <script id="sch_car_info_all-temp" type="text/html">
  27 + {{each list as obj i}}
  28 + <tr data-nbbm="{{obj.nbbm}}">
  29 + <td>{{obj.nbbm}}</td>
  30 + <td>{{obj.device}}</td>
  31 + <td>{{obj.loc}}</td>
  32 + <td>{{obj.lineCodeRealStr}}</td>
  33 + <td><a class="exec_sch_link" data-id="{{obj.schId}}">{{obj.exec}}</a></td>
  34 + <td><a class="{{if obj.status!='在线'}}grey_link{{/if}}">{{obj.status}}</a></td>
  35 + <td class="{{if obj.status!='在线'}}grey_link{{/if}}">
  36 + {{obj.timeStr}}
  37 +
  38 + {{if obj.formNow!=null}}
  39 + <small>({{obj.formNow}})</small>
  40 + {{/if}}
  41 + </td>
  42 + <td>{{obj.qqccTimeStr}}</td>
  43 + </tr>
  44 + {{/each}}
  45 + </script>
  46 + <script>
  47 + (function () {
  48 + var modal = '#sch_car_info_all-modal', lineCode, nbbm;
  49 +
  50 + $(modal).on('init', function(e, data) {
  51 + e.stopPropagation();
  52 + lineCode = data.lineCode;
  53 + nbbm = data.nbbm;
  54 +
  55 + jsDoQuery(function () {
  56 + var $cell = $('tr[data-nbbm='+nbbm+']', modal);
  57 + //定位到行
  58 + $(modal).animate({
  59 + scrollTop: $cell.offset().top - $(modal).offset().top + $(modal).scrollTop()
  60 + }, 500, function () {
  61 + $cell.addClass('ct_active');
  62 + });
  63 + timer = setTimeout(fixedRefreshData, t + 500);
  64 + });
  65 + });
  66 +
  67 + var timer, t = 12*1000;
  68 + var fixedRefreshData = function () {
  69 + (function () {
  70 + var f = arguments.callee;
  71 + jsDoQuery(function () {
  72 + timer = setTimeout(f, t);
  73 + });
  74 + })();
  75 + };
  76 +
  77 + $(modal).on('hide.uk.modal', function () {
  78 + clearTimeout(timer);
  79 + timer = null;
  80 + });
  81 +
  82 + var jsDoQuery = function (cb) {
  83 + gb_common.$get('/gps/allCarsByLine', {lineCode: lineCode}, function (rs) {
  84 + $.each(rs.list, function () {
  85 + if(this['lineCodeReal'])
  86 + this['lineCodeRealStr'] = this['lineCodeReal'] + '/' + gb_data_basic.lineCode2NameAll()[this['lineCodeReal']];
  87 + else
  88 + this['lineCodeRealStr'] = '';
  89 + if(this['gpsTs']){
  90 + this['timeStr'] = moment(this['gpsTs']).format('MM/DD HH:mm:ss');
  91 + this['formNow'] = moment(this['gpsTs']).fromNow();
  92 + }
  93 + if(this['qqcc'])
  94 + this['qqccTimeStr'] = moment(this['qqcc']).format('HH:mm');
  95 + });
  96 +
  97 + rs.list.sort(function (a, b) {
  98 + if(!a.nbbm)
  99 + return -1;
  100 + if(!b.nbbm)
  101 + return 1;
  102 + return a.nbbm.localeCompare(b.nbbm);
  103 + });
  104 + var htmlStr = template('sch_car_info_all-temp', {list: rs.list});
  105 +
  106 + $('table>tbody', modal).html(htmlStr);
  107 +
  108 + cb && cb();
  109 + });
  110 + };
  111 +
  112 + $(modal).on('click', 'a.exec_sch_link', function () {
  113 + var id = $(this).data('id');
  114 + if(!id)
  115 + return;
  116 + gb_schedule_table.scroToDl({id: id, xlBm:lineCode});
  117 + });
  118 + })();
  119 + </script>
  120 +</div>
0 121 \ No newline at end of file
... ...
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
... ... @@ -110,7 +110,7 @@
110 110 {{/if}}
111 111  
112 112 {{if sch.cTasks.length > 0}}
113   - <span class="uk-badge uk-badge-notification">{{sch.cTasks.length}}</span>
  113 + <span class="uk-badge uk-badge-notification {{if sch.c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{sch.cTasks.length}}</span>
114 114 {{/if}}
115 115 </dd>
116 116 <dd>{{sch.zdsj}}</dd>
... ... @@ -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',
... ... @@ -274,26 +274,29 @@
274 274  
275 275 //检查子任务营运里程
276 276 $('#childTaskTitle .child-task-status', modal).remove();
277   - var i = 0;
  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);
284 284 calcs += (' + ' + this.mileage);
285   - i++;
  285 + //i++;
286 286 }
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 + <a class="delete_link" style="vertical-align: bottom;display: inline-block;color: red;font-size: 13px;margin-right: 10px;">删除子任务</a>
  13 + <button type="button" class="uk-button uk-modal-close">取消</button>
  14 + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> &nbsp;保存</button>
  15 + </div>
  16 + </div>
  17 +
  18 + <script id="sub-task-v2-edit-form-temp" type="text/html">
  19 + <form class="uk-form uk-form-horizontal sub_task_form_v2" style="background:#fff;">
  20 + <input type="hidden" value="{{sch.id}}" name="schedule.id" sch_id_inp>
  21 + <input type="hidden" value="正常" name="type1">
  22 + <input type="hidden" value="{{cTask.id}}" name="id">
  23 + <div class="uk-grid">
  24 + <div class="uk-width-1-3">
  25 + <div class="uk-form-row">
  26 + <label class="uk-form-label">班次类型</label>
  27 + <div class="uk-form-controls">
  28 + <select class="form-control nt-dictionary" data-code="-100" name="type2"
  29 + data-group=ChildTaskType></select>
  30 + </div>
  31 + </div>
  32 + </div>
  33 + <div class="uk-width-1-3">
  34 + <div class="uk-form-row">
  35 + <label class="uk-form-label">起点 </label>
  36 + <div class="uk-form-controls">
  37 + <select name="startStation" required></select>
  38 + </div>
  39 + </div>
  40 + </div>
  41 + <div class="uk-width-1-3">
  42 + <div class="uk-form-row">
  43 + <label class="uk-form-label">终点</label>
  44 + <div class="uk-form-controls">
  45 + <select name="endStation" required></select>
  46 + </div>
  47 + </div>
  48 + </div>
  49 + </div>
  50 +
  51 + <div class="uk-grid">
  52 + <div class="uk-width-1-3">
  53 + <div class="uk-form-row">
  54 + <label class="uk-form-label">开始时间</label>
  55 + <div class="uk-form-controls">
  56 + <input name="startDate" value="{{cTask.startDate}}" type="time"
  57 + required>
  58 + </div>
  59 + </div>
  60 + </div>
  61 + <div class="uk-width-1-3">
  62 + <div class="uk-form-row">
  63 + <label class="uk-form-label">结束时间</label>
  64 + <div class="uk-form-controls">
  65 + <input name="endDate" value="{{cTask.endDate}}" type="time" required>
  66 + </div>
  67 + </div>
  68 + </div>
  69 + <div class="uk-width-1-3">
  70 + <div class="uk-form-row">
  71 + <label class="uk-form-label">公里</label>
  72 + <div class="uk-form-controls">
  73 + <input class="form-control" name="mileage" max=222 data-fv-lessthan-inclusive="false"
  74 + required style="width: 42%;" value="{{cTask.mileage}}">
  75 + <select class="form-control nt-dictionary" required name="mileageType"
  76 + data-group="MileageType" style="width: 52%;"></select>
  77 + </div>
  78 + </div>
  79 + </div>
  80 + </div>
  81 +
  82 + <div class="uk-grid">
  83 + <div class="uk-width-2-3 domains"></div>
  84 + <div class="uk-width-1-3">
  85 + <div class="uk-form-row">
  86 + <label class="uk-form-label">备注</label>
  87 + <div class="uk-form-controls">
  88 + <!--<select class="form-control nt-dictionary" required name="remarks"></select>-->
  89 + <input class="form-control" value="{{cTask.remarks}}" name="remarks" data-fv-stringlength-max="50" data-fv-stringlength="true">
  90 + </div>
  91 + </div>
  92 + </div>
  93 + </div>
  94 + </form>
  95 + </script>
  96 +
  97 + <script id="st-edit-domains-inout-form-temp" type="text/html">
  98 + <div class="uk-grid">
  99 + <div class="uk-width-1-2">
  100 + <div class="uk-form-row" style="padding-top: 5px;">
  101 + <label class="uk-form-label"></label>
  102 + <div class="uk-form-controls">
  103 + <label data-uk-tooltip title="无人售票线路,请忽略这个选项">
  104 + <input type="checkbox" value=1 name="noClerk" class="i-cbox"> 无售票员
  105 + </label>
  106 + </div>
  107 + </div>
  108 + </div>
  109 + <div class="uk-width-1-2 destroy_reason_wrap">
  110 + <div class="uk-form-row">
  111 + <label class="uk-form-label">进出场原因</label>
  112 + <div class="uk-form-controls">
  113 + <select class="form-control" name="reason" required>
  114 + <option value="">请选择...</option>
  115 + {{each inOutExps as exp i}}
  116 + <option value="{{exp}}">{{exp}}</option>
  117 + {{/each}}
  118 + </select>
  119 + </div>
  120 + </div>
  121 + </div>
  122 + </div>
  123 + </script>
  124 +
  125 + <script id="st-edit-domains-service-form-temp" type="text/html">
  126 + <div class="uk-grid">
  127 + <div class="uk-width-1-2">
  128 + <div class="uk-form-row" style="padding-top: 5px;">
  129 + <label class="uk-form-label"></label>
  130 + <div class="uk-form-controls">
  131 + <label>
  132 + <input type="checkbox" value=1 name="destroy" class="i-cbox"> 是否烂班
  133 + </label>
  134 + </div>
  135 + </div>
  136 + </div>
  137 + <div class="uk-width-1-2 destroy_reason_wrap" style="display: none;">
  138 + <div class="uk-form-row">
  139 + <label class="uk-form-label">烂班原因</label>
  140 + <div class="uk-form-controls">
  141 + <select class="form-control" name="reason" required>
  142 + <option value="">请选择...</option>
  143 + {{each adjustExps as exp i}}
  144 + <option value="{{exp}}">{{exp}}</option>
  145 + {{/each}}
  146 + </select>
  147 + </div>
  148 + </div>
  149 + </div>
  150 + </div>
  151 + </script>
  152 + <script>
  153 + (function () {
  154 + var modal = '#edit-sub-task-main-modal', sch, cTask,
  155 + stationRoutes,
  156 + parks,
  157 + information,
  158 + st_park_data;
  159 +
  160 + $(modal).on('init', function (e, data) {
  161 + e.stopPropagation();
  162 + sch = data.sch;
  163 + cTask = data.cTask;
  164 +
  165 + //站到场数据
  166 + st_park_data = gb_data_basic.get_stat_park_data()[sch.xlBm];
  167 + //站点路由
  168 + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) {
  169 + return a.stationRouteCode - b.stationRouteCode;
  170 + }), 'directions');
  171 + //停车场
  172 + parks = gb_data_basic.simpleParksArray();
  173 + //线路标准
  174 + information = gb_data_basic.getLineInformation(sch.xlBm);
  175 + //停车场排序,常用的放前面
  176 + parks = sort_parks(parks, information, st_park_data);
  177 +
  178 + var htmlStr = template('sub-task-v2-edit-form-temp', {sch: sch, cTask: cTask});
  179 + var f = $(htmlStr);
  180 + $('.forms', modal).append(f);
  181 + //字典转换
  182 + dictionaryUtils.transformDom($('.nt-dictionary', f));
  183 +
  184 + //设置下拉框默认值
  185 + $f('type2', f).val(cTask.type2).trigger('change');//班次类型
  186 + $f('startStation', f).val(cTask.startStation);//起点站
  187 + $f('endStation', f).val(cTask.endStation);//终点站
  188 + $f('mileageType', f).val(cTask.mileageType);//里程类型
  189 + if(cTask.destroy)
  190 + $f('destroy', f).trigger('click');//烂班
  191 + if(cTask.reason)
  192 + $f('reason', f).val(cTask.reason);//原因
  193 + if(cTask.noClerk)
  194 + $f('noClerk', f).trigger('click');//无售票员
  195 +
  196 + f.formValidation({
  197 + framework: 'uikit',
  198 + locale: 'zh_CN'
  199 + });
  200 + $('button[type=submit]', modal).on('click', function () {
  201 + f.formValidation('validate');
  202 + });
  203 +
  204 + //提交
  205 + f.on('success.form.fv', function (e) {
  206 + e.preventDefault();
  207 + $('button[type=submit]', modal).attr('disabled', 'disabled');
  208 +
  209 + var data=$.extend(f.serializeJSON(), gb_common.getDisabledVal(f));
  210 +
  211 + gb_common.$post('/childTask/update', data, function (rs) {
  212 + notify_succ('修改成功!');
  213 + gb_schedule_table.updateSchedule(rs.t);
  214 +
  215 + UIkit.modal(modal).hide();
  216 + $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
  217 +
  218 + //更新路牌公里统计面板
  219 + gb_schedule_table.showLpMileageTipBySch(rs.t);
  220 + });
  221 + });
  222 +
  223 + f.on('err.field.fv', function () {
  224 + $('button[type=submit]', modal).removeClass('disabled').removeAttr('disabled');
  225 + });
  226 + });
  227 +
  228 + //班次类型切换事件
  229 + $(modal).on('change', 'select[name=type2]', reCalcInputs_type);
  230 + //烂班选项点击事件
  231 + $(modal).on('change', 'input[name=destroy]', destroyClick);
  232 + //进出场原因切换
  233 + $(modal).on('change', 'select[name=reason]', reSynchroReason);
  234 +
  235 + /**
  236 + * 根据班次类型切换起终点下拉框
  237 + */
  238 + function reCalcInputs_type() {
  239 + var f = $(this).parents('.sub_task_form_v2');
  240 + var upDown = sch.xlDir;
  241 + if($('[name=upDown]', f).length>0)
  242 + upDown = $('[name=upDown]', f).val();
  243 + var routes = stationRoutes[upDown]
  244 + , lastCode = routes[routes.length - 1].stationCode
  245 + , opts = '', park_opts = '';
  246 + //station options
  247 + $.each(routes, function () {
  248 + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>'
  249 + });
  250 + //park options
  251 + for(var i=0,p;p=parks[i++];)
  252 + park_opts += '<option value="' + p.code + '">' + p.name + '</option>';
  253 + /*for (var code in parks)
  254 + park_opts += '<option value="' + code + '">' + parks[code] + '</option>';*/
  255 +
  256 + var qdz = $f('startStation', f), zdz = $f('endStation', f), mType = $f('mileageType', f);
  257 + var domainsTemp;
  258 + switch ($(this).val()) {
  259 + case '3'://出场
  260 + qdz.html(park_opts).val(information.carPark);
  261 + zdz.html(opts).trigger('change');
  262 + mType.val('empty').attr('disabled', 'disabled').trigger('change');
  263 + domainsTemp = 'st-edit-domains-inout-form-temp';
  264 + break;
  265 + case '2'://进场
  266 + qdz.html(opts);
  267 + zdz.html(park_opts).val(information.carPark).trigger('change');
  268 + mType.val('empty').attr('disabled', 'disabled').trigger('change');
  269 + domainsTemp = 'st-edit-domains-inout-form-temp';
  270 + break;
  271 + default:
  272 + qdz.html(opts);
  273 + zdz.html(opts).val(lastCode).trigger('change');
  274 + mType.val('service').removeAttr('disabled').trigger('change');
  275 + domainsTemp = 'st-edit-domains-service-form-temp';
  276 + }
  277 +
  278 + //可变选项区域
  279 + $('.domains', f).html(template(domainsTemp, {
  280 + adjustExps: gb_common.adjustExps,
  281 + inOutExps: gb_common.inOutExps
  282 + }));
  283 +
  284 + //校验reason
  285 + f.trigger('add_reason_field');
  286 + }
  287 +
  288 +
  289 + function $f(name, f) {
  290 + return $('[name=' + name + ']', f);
  291 + }
  292 +
  293 + /**
  294 + * 停车场排序
  295 + * @param parks 停车场 code 2 name
  296 + * @param information 线路标准
  297 + * @param st_park_data 站到场
  298 + */
  299 + function sort_parks(parks, information, st_park_data) {
  300 + var array = [], names=[];
  301 + for(var code in parks){
  302 + array.push({code: code, name: parks[code]});
  303 + }
  304 +
  305 + if(st_park_data && st_park_data.length > 0){
  306 + $.each(st_park_data, function () {
  307 + names.push(this.parkName);
  308 + });
  309 + }
  310 +
  311 + //debugger
  312 + array.sort(function (a, b) {
  313 + if(a.code==information.carPark)
  314 + return -1;
  315 + if(b.code==information.carPark)
  316 + return 1;
  317 +
  318 + var ai = names.indexOf(a.name),
  319 + bi = names.indexOf(b.name);
  320 +
  321 + if(ai!=-1 && bi==-1)
  322 + return -1;
  323 + else if(ai==-1 && bi!=-1)
  324 + return 1;
  325 + else
  326 + return a.name.localeCompare(b.name);
  327 + });
  328 + return array;
  329 + }
  330 +
  331 + function destroyClick() {
  332 + var f = $(this).parents('.sub_task_form_v2');
  333 + if (this.checked) {
  334 + $('.destroy_reason_wrap', f).show();
  335 + f.attr('destroy', true);//.addClass('destroy_form');
  336 + }
  337 + else {
  338 + $('.destroy_reason_wrap', f).hide();
  339 + f.removeAttr('destroy');//.removeClass('destroy_form');
  340 + }
  341 + //reCalcMileageCount();
  342 + }
  343 +
  344 + /**
  345 + * 切换原因
  346 + */
  347 + function reSynchroReason() {
  348 + var f = $(this).parents('.sub_task_form_v2'),
  349 + reason = $(this).val(),
  350 + remInput = $('[name=remarks]', f);
  351 +
  352 + if(remInput.val()==reason + ',')
  353 + return;
  354 + remInput.val(remInput.val() + reason + ',');
  355 + }
  356 +
  357 +
  358 + $('.delete_link', modal).on('click', function () {
  359 + var id = cTask.id;
  360 + if(!id){
  361 + notify_err('无法获取标识键!');
  362 + return;
  363 + }
  364 +
  365 + var str = '<h3>确定要删除这条子任务?</h3>';
  366 + alt_confirm(str, function () {
  367 + gb_common.$del('/childTask/' + id, function (rs) {
  368 + gb_schedule_table.updateSchedule(rs.t);
  369 +
  370 + UIkit.modal(modal).hide();
  371 + $('#schedule-lj_zrw-modal .main-schedule-table').trigger('refresh', {sch: sch});
  372 +
  373 + //更新路牌公里统计面板
  374 + gb_schedule_table.showLpMileageTipBySch(rs.t);
  375 + });
  376 + }, '确定删除');
  377 + });
  378 + })();
  379 + </script>
  380 +</div>
0 381 \ 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
... ... @@ -82,7 +82,7 @@
82 82 <span class="uk-badge uk-badge-danger">临加</span>
83 83 {{/if}}
84 84 {{if sch.cTasks.length > 0}}
85   - <span class="uk-badge uk-badge-notification c_task">{{sch.cTasks.length}}</span>
  85 + <span class="uk-badge uk-badge-notification c_task {{if sch.c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{sch.cTasks.length}}</span>
86 86 {{/if}}
87 87 </dd>
88 88 <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">
... ... @@ -136,7 +136,7 @@
136 136 <span class="uk-badge uk-badge-danger">临加</span>
137 137 {{/if}}
138 138 {{if cTasks.length > 0}}
139   - <span class="uk-badge uk-badge-notification c_task">{{cTasks.length}}</span>
  139 + <span class="uk-badge uk-badge-notification c_task {{if c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{cTasks.length}}</span>
140 140 {{/if}}
141 141 </dd>
142 142 </script>
... ... @@ -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/data/data_gps.js
... ... @@ -14,9 +14,6 @@ var gb_data_gps = (function () {
14 14 refreshEventCallbacks.push(cb);
15 15 };
16 16  
17   - //超速数据回调
18   - //var overspeedEventCallbacks = [];
19   -
20 17 var refresh = function (cb) {
21 18 $.ajax({
22 19 url: '/gps/real/line',
... ... @@ -25,8 +22,6 @@ var gb_data_gps = (function () {
25 22 success: function (rs) {
26 23 //用定时的gps来检测session断开
27 24 if(rs.status && rs.status==407){
28   - //解除退出页面的提示框
29   - window.removeEventListener("beforeunload", gb_beforeunload_fun);
30 25 location.href = '/login.html';
31 26 return;
32 27 }
... ...
src/main/resources/static/real_control_v2/js/line_schedule/badge_tooltip.js
... ... @@ -18,7 +18,6 @@ var gb_schedule_badge_tootip = (function () {
18 18 },
19 19 events: {
20 20 hidden: function(event, api) {
21   - //destroy dom
22 21 $(this).qtip('destroy', true);
23 22 }
24 23 }
... ... @@ -44,25 +43,32 @@ var gb_schedule_badge_tootip = (function () {
44 43 show: _opts.show,
45 44 content: {
46 45 text: function() {
47   - var sch = getSch(this);
  46 + var sch = getSch(this),
  47 + serviceCount=0,
  48 + emptyCount=0;
48 49 //子任务排序
49 50 $.each(sch.cTasks, function () {
50 51 if(this.mileageType=='service'){
  52 + serviceCount = gb_common.accAdd(serviceCount, this.mileage);
51 53 if(this.type1=='正常')
52 54 this.order_no=0;
53 55 else
54 56 this.order_no=1;
55 57  
56   - if(this.destroy)
  58 + if(this.destroy){
57 59 this.order_no=2;
  60 + }
58 61 }
59   - else
  62 + else{
60 63 this.order_no=this.type2 + 1;
  64 + emptyCount = gb_common.accAdd(emptyCount, this.mileage);
  65 + }
61 66 });
62 67 var array = sch.cTasks.sort(function (a, b) {
63 68 return a.order_no - b.order_no;
64 69 });
65   - return temps['sch-table-task-tootip-temp']({tasks: array});
  70 + return temps['sch-table-task-tootip-temp'](
  71 + {tasks: array, sch: sch, serviceCount: serviceCount, emptyCount: emptyCount});
66 72 }
67 73 },
68 74 position: _opts.position,
... ... @@ -74,6 +80,45 @@ var gb_schedule_badge_tootip = (function () {
74 80 });
75 81 });
76 82  
  83 + /**
  84 + * 子任务编辑
  85 + */
  86 + $(document).on('click', 'a.tip_task_edit_link', function () {
  87 + var schId = $(this).data('schid'),
  88 + taskId = $(this).data('id'),
  89 + lineCode = $(this).data('line');
  90 +
  91 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[schId];
  92 +
  93 + var cTask;
  94 + for(var i=0,obj;obj=sch.cTasks[i++];){
  95 + if(obj.id==taskId){
  96 + cTask = obj;
  97 + break;
  98 + }
  99 + }
  100 +
  101 + $('#edit-sub-task-main-modal').remove();
  102 + //打开子任务修改modal
  103 + open_modal('/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/edit.html', {
  104 + sch: sch,
  105 + cTask: cTask
  106 + }, {center: false, bgclose: false});
  107 + });
  108 +
  109 + /**
  110 + * 新增子任务
  111 + */
  112 + $(document).on('click', 'i.badge_tip_add_icon', function () {
  113 + var schId = $(this).data('schid'),
  114 + lineCode = $(this).data('line');
  115 +
  116 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[schId];
  117 + open_modal('/real_control_v2/fragments/line_schedule/context_menu/sub_task_v2/main.html', {
  118 + sch: sch
  119 + }, {center: false, bgclose: false});
  120 + });
  121 +
77 122 //区间 tootip
78 123 $(document).on('mouseenter', _badge+'.sch_region', function() {
79 124 $(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/dbclick.js
... ... @@ -93,8 +93,18 @@ var gb_schedule_table_dbclick = (function() {
93 93 });
94 94 };
95 95  
  96 + var carCellClick = function (elem) {
  97 + elem.dblclick(function () {
  98 + var nbbm = $(this).data('nbbm');
  99 + var lineCode = $('.north-tabs>ul>li.tab-line.uk-active').data('code');
  100 +
  101 + open_modal('/real_control_v2/fragments/line_schedule/car_info_all.html', {nbbm:nbbm,lineCode:lineCode});
  102 + });
  103 + };
  104 +
96 105 return {
97 106 init: init,
98   - sfsjCellClick:sfsjCellClick
  107 + sfsjCellClick:sfsjCellClick,
  108 + carCellClick: carCellClick
99 109 };
100 110 })();
... ...
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
... ...