Commit afe65a2d98714567c3063c213f2d4070b797bded

Authored by 王通
1 parent 1b122441

1.调度加入异常停车提示

src/main/java/com/bsth/Application.java
1 -package com.bsth;  
2 -  
3 -import com.fasterxml.jackson.databind.ObjectMapper;  
4 -import com.fasterxml.jackson.databind.SerializationFeature;  
5 -import org.springframework.boot.SpringApplication;  
6 -import org.springframework.boot.autoconfigure.SpringBootApplication;  
7 -import org.springframework.boot.builder.SpringApplicationBuilder;  
8 -import org.springframework.boot.context.web.SpringBootServletInitializer;  
9 -import org.springframework.context.annotation.Bean;  
10 -import org.springframework.context.annotation.Primary;  
11 -import org.springframework.transaction.annotation.EnableTransactionManagement;  
12 -  
13 -import java.util.concurrent.Executors;  
14 -import java.util.concurrent.ScheduledExecutorService;  
15 -  
16 -@EnableTransactionManagement  
17 -@SpringBootApplication  
18 -public class Application extends SpringBootServletInitializer {  
19 -  
20 - public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(18);  
21 -  
22 - @Override  
23 - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
24 - return application.sources(Application.class);  
25 - }  
26 -  
27 - @Bean  
28 - @Primary  
29 - public ObjectMapper objectMapper() {  
30 - ObjectMapper objectMapper = new ObjectMapper();  
31 - objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);  
32 -  
33 - return objectMapper;  
34 - }  
35 -  
36 - public static void main(String[] args) throws Exception {  
37 - SpringApplication.run(Application.class, args);  
38 - } 1 +package com.bsth;
  2 +
  3 +import com.fasterxml.jackson.databind.ObjectMapper;
  4 +import com.fasterxml.jackson.databind.SerializationFeature;
  5 +import org.springframework.boot.SpringApplication;
  6 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  7 +import org.springframework.boot.builder.SpringApplicationBuilder;
  8 +import org.springframework.boot.context.web.SpringBootServletInitializer;
  9 +import org.springframework.context.annotation.Bean;
  10 +import org.springframework.context.annotation.Primary;
  11 +import org.springframework.scheduling.annotation.EnableScheduling;
  12 +import org.springframework.transaction.annotation.EnableTransactionManagement;
  13 +
  14 +import java.util.concurrent.Executors;
  15 +import java.util.concurrent.ScheduledExecutorService;
  16 +
  17 +@EnableScheduling
  18 +@EnableTransactionManagement
  19 +@SpringBootApplication
  20 +public class Application extends SpringBootServletInitializer {
  21 +
  22 + public static ScheduledExecutorService mainServices = Executors.newScheduledThreadPool(18);
  23 +
  24 + @Override
  25 + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  26 + return application.sources(Application.class);
  27 + }
  28 +
  29 + @Bean
  30 + @Primary
  31 + public ObjectMapper objectMapper() {
  32 + ObjectMapper objectMapper = new ObjectMapper();
  33 + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
  34 +
  35 + return objectMapper;
  36 + }
  37 +
  38 + public static void main(String[] args) throws Exception {
  39 + SpringApplication.run(Application.class, args);
  40 + }
39 } 41 }
40 \ No newline at end of file 42 \ No newline at end of file
src/main/java/com/bsth/common/SystemParamKeys.java
@@ -6,4 +6,6 @@ package com.bsth.common; @@ -6,4 +6,6 @@ package com.bsth.common;
6 public class SystemParamKeys { 6 public class SystemParamKeys {
7 7
8 public static final String SPECIAL_ROLES = "special.roles"; 8 public static final String SPECIAL_ROLES = "special.roles";
  9 +
  10 + public static final String API_URL_CARERRORSTOP = "api.url.carerrorstop";
9 } 11 }
src/main/java/com/bsth/entity/CarErrorStop.java 0 → 100644
  1 +package com.bsth.entity;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  4 +import org.joda.time.format.DateTimeFormat;
  5 +import org.joda.time.format.DateTimeFormatter;
  6 +import org.springframework.util.StringUtils;
  7 +
  8 +/**
  9 + * 企业信息化运行监控中心
  10 + * 车辆异常停车(理论上超过5分钟)
  11 + * @author Hill
  12 + */
  13 +@JsonIgnoreProperties(ignoreUnknown = true)
  14 +public class CarErrorStop {
  15 +
  16 + /**
  17 + * ID
  18 + */
  19 + private long id;
  20 +
  21 + /**
  22 + * 日期
  23 + */
  24 + private String rq;
  25 +
  26 + /**
  27 + * 公司编码
  28 + */
  29 + private String company;
  30 +
  31 + /**
  32 + * 分公司名称
  33 + */
  34 + private String branchCompany;
  35 +
  36 + /**
  37 + * 线路名称
  38 + */
  39 + private String line;
  40 +
  41 + /**
  42 + * 线路代码
  43 + */
  44 + private String lineId;
  45 +
  46 + /**
  47 + * 车辆内部编码
  48 + */
  49 + private String nbbm;
  50 +
  51 + private String carCode;
  52 +
  53 + private String driver;
  54 +
  55 + private double lat;
  56 +
  57 + private double lon;
  58 +
  59 + /**
  60 + * 发生地址
  61 + */
  62 + private String address;
  63 +
  64 + /**
  65 + * 异常停车起始时间
  66 + */
  67 + private String startTime;
  68 +
  69 + private long startTimestamp;
  70 +
  71 + /**
  72 + * 异常停车结束时间
  73 + */
  74 + private String endTime;
  75 +
  76 + private long endTimestamp;
  77 +
  78 + /**
  79 + * 上下行
  80 + */
  81 + private int upDown;
  82 +
  83 + /**
  84 + * 备注
  85 + */
  86 + private String remark;
  87 +
  88 + private static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
  89 +
  90 + public long getId() {
  91 + return id;
  92 + }
  93 +
  94 + public void setId(long id) {
  95 + this.id = id;
  96 + }
  97 +
  98 + public String getRq() {
  99 + return rq;
  100 + }
  101 +
  102 + public void setRq(String rq) {
  103 + this.rq = rq;
  104 + }
  105 +
  106 + public String getCompany() {
  107 + return company;
  108 + }
  109 +
  110 + public void setCompany(String company) {
  111 + this.company = company;
  112 + }
  113 +
  114 + public String getBranchCompany() {
  115 + return branchCompany;
  116 + }
  117 +
  118 + public void setBranchCompany(String branchCompany) {
  119 + this.branchCompany = branchCompany;
  120 + }
  121 +
  122 + public String getLine() {
  123 + return line;
  124 + }
  125 +
  126 + public void setLine(String line) {
  127 + this.line = line;
  128 + }
  129 +
  130 + public String getLineId() {
  131 + return lineId;
  132 + }
  133 +
  134 + public void setLineId(String lineId) {
  135 + this.lineId = lineId;
  136 + }
  137 +
  138 + public String getNbbm() {
  139 + return nbbm;
  140 + }
  141 +
  142 + public void setNbbm(String nbbm) {
  143 + this.nbbm = nbbm;
  144 + }
  145 +
  146 + public String getCarCode() {
  147 + return carCode;
  148 + }
  149 +
  150 + public void setCarCode(String carCode) {
  151 + this.carCode = carCode;
  152 + }
  153 +
  154 + public String getDriver() {
  155 + return driver;
  156 + }
  157 +
  158 + public void setDriver(String driver) {
  159 + this.driver = driver;
  160 + }
  161 +
  162 + public double getLat() {
  163 + return lat;
  164 + }
  165 +
  166 + public void setLat(double lat) {
  167 + this.lat = lat;
  168 + }
  169 +
  170 + public double getLon() {
  171 + return lon;
  172 + }
  173 +
  174 + public void setLon(double lon) {
  175 + this.lon = lon;
  176 + }
  177 +
  178 + public String getAddress() {
  179 + return address;
  180 + }
  181 +
  182 + public void setAddress(String address) {
  183 + this.address = address;
  184 + }
  185 +
  186 + public String getStartTime() {
  187 + return startTime;
  188 + }
  189 +
  190 + public void setStartTime(String startTime) {
  191 + this.startTime = startTime;
  192 + if (StringUtils.hasLength(startTime)) {
  193 + this.startTimestamp = formatter.parseDateTime(startTime).getMillis();
  194 + }
  195 + }
  196 +
  197 + public long getStartTimestamp() {
  198 + return startTimestamp;
  199 + }
  200 +
  201 + public void setStartTimestamp(long startTimestamp) {
  202 + this.startTimestamp = startTimestamp;
  203 + }
  204 +
  205 + public String getEndTime() {
  206 + return endTime;
  207 + }
  208 +
  209 + public void setEndTime(String endTime) {
  210 + this.endTime = endTime;
  211 + if (StringUtils.hasLength(endTime)) {
  212 + this.endTimestamp = formatter.parseDateTime(endTime).getMillis();
  213 + }
  214 + }
  215 +
  216 + public long getEndTimestamp() {
  217 + return endTimestamp;
  218 + }
  219 +
  220 + public void setEndTimestamp(long endTimestamp) {
  221 + this.endTimestamp = endTimestamp;
  222 + }
  223 +
  224 + public int getUpDown() {
  225 + return upDown;
  226 + }
  227 +
  228 + public void setUpDown(int upDown) {
  229 + this.upDown = upDown;
  230 + }
  231 +
  232 + public String getRemark() {
  233 + return remark;
  234 + }
  235 +
  236 + public void setRemark(String remark) {
  237 + this.remark = remark;
  238 + }
  239 +
  240 + @Override
  241 + public boolean equals(Object o) {
  242 + return this.id == ((CarErrorStop) o).id;
  243 + }
  244 +
  245 + @Override
  246 + public int hashCode() {
  247 + return Long.hashCode(id);
  248 + }
  249 +}
src/main/java/com/bsth/task/TimedTask.java 0 → 100644
  1 +package com.bsth.task;
  2 +
  3 +import com.bsth.common.SystemParamKeys;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.entity.CarErrorStop;
  6 +import com.bsth.entity.SystemParam;
  7 +import com.bsth.util.HttpClientUtils;
  8 +import com.bsth.websocket.handler.SendUtils;
  9 +import com.fasterxml.jackson.databind.ObjectMapper;
  10 +import org.joda.time.DateTime;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.scheduling.annotation.Scheduled;
  15 +import org.springframework.stereotype.Component;
  16 +
  17 +import java.util.HashSet;
  18 +import java.util.List;
  19 +import java.util.Set;
  20 +
  21 +@Component
  22 +public class TimedTask {
  23 +
  24 + private final static Logger log = LoggerFactory.getLogger(TimedTask.class);
  25 +
  26 + private ObjectMapper mapper = new ObjectMapper();
  27 +
  28 + @Autowired
  29 + private SendUtils sendUtils;
  30 +
  31 + private Set<CarErrorStop> carErrorStopSet = new HashSet<>();
  32 +
  33 + @Scheduled(cron = "10 0 0 * * *")
  34 + public void clear() {
  35 + carErrorStopSet.clear();
  36 + }
  37 +
  38 + @Scheduled(initialDelay = 10000, fixedDelay = 10000)
  39 + public void carErrorStopTask() {
  40 + SystemParam param = BasicData.getSystemParam().get(SystemParamKeys.API_URL_CARERRORSTOP);
  41 + String url = null;
  42 + if (param != null && param.getValue() != null) {
  43 + url = param.getValue();
  44 + }
  45 + if (url == null) {
  46 + log.error("carErrorStopTask url is null");
  47 + return;
  48 + }
  49 + url = String.format(url, new DateTime().toString("yyyyMMdd"));
  50 + try {
  51 + StringBuilder sb = HttpClientUtils.get(url);
  52 + if (sb != null) {
  53 + List<CarErrorStop> carErrorStopList = mapper.readValue(sb.toString(), mapper.getTypeFactory().constructParametricType(List.class, CarErrorStop.class));
  54 + for (CarErrorStop carErrorStop : carErrorStopList) {
  55 + //if (!carErrorStopSet.contains(carErrorStop)) {
  56 + // carErrorStopSet.add(carErrorStop);
  57 + sendUtils.sendCarErrorStop(carErrorStop);
  58 + //}
  59 + }
  60 + }
  61 + } catch (Exception e) {
  62 + log.error("getAndSendCarErrorStop异常", e);
  63 + }
  64 + }
  65 +}
src/main/java/com/bsth/websocket/handler/SendUtils.java
1 -package com.bsth.websocket.handler;  
2 -  
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.bsth.data.BasicData;  
5 -import com.bsth.data.LineConfigData;  
6 -import com.bsth.data.gpsdata_v2.entity.GpsEntity;  
7 -import com.bsth.data.safe_driv.SafeDriv;  
8 -import com.bsth.entity.directive.D80;  
9 -import com.bsth.entity.realcontrol.ScheduleRealInfo;  
10 -import com.bsth.websocket.dto.WsScheduleRealInfo;  
11 -import com.fasterxml.jackson.core.JsonProcessingException;  
12 -import com.fasterxml.jackson.databind.ObjectMapper;  
13 -import org.apache.commons.lang3.StringUtils;  
14 -import org.slf4j.Logger;  
15 -import org.slf4j.LoggerFactory;  
16 -import org.springframework.beans.factory.annotation.Autowired;  
17 -import org.springframework.stereotype.Component;  
18 -  
19 -import java.text.SimpleDateFormat;  
20 -import java.util.*;  
21 -  
22 -@Component  
23 -public class SendUtils{  
24 -  
25 - @Autowired  
26 - private RealControlSocketHandler socketHandler;  
27 -  
28 - @Autowired  
29 - LineConfigData lineConfigData;  
30 -  
31 - private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");  
32 -  
33 - private static Logger logger = LoggerFactory.getLogger(SendUtils.class);  
34 -  
35 - /**  
36 - * @throws JsonProcessingException  
37 - * TODO(推送发车信息)  
38 - */  
39 - public void sendFcsj(ScheduleRealInfo sch) {  
40 -  
41 - Map<String, Object> map = new HashMap<>();  
42 - map.put("fn", "faChe");  
43 - map.put("t", WsScheduleRealInfo.getInstance(sch));  
44 - map.put("dataStr", sdf.format(new Date()));  
45 -  
46 - ObjectMapper mapper = new ObjectMapper();  
47 -  
48 - try {  
49 - socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));  
50 - } catch (Exception e) {  
51 - logger.error("", e);  
52 - }  
53 - }  
54 -  
55 - /**  
56 - *  
57 - * @Title: sendFcsjArtificial  
58 - * @Description: TODO(要求页面刷新班次)  
59 - * @throws  
60 - */  
61 - public void refreshSch(List<ScheduleRealInfo> list){  
62 - if(null == list || list.size() == 0)  
63 - return;  
64 -  
65 - Map<String, Object> map = new HashMap<>();  
66 - map.put("fn", "refreshSch");  
67 - map.put("ts", WsScheduleRealInfo.getMultiInstance(list));  
68 -  
69 - ObjectMapper mapper = new ObjectMapper();  
70 -  
71 - try {  
72 - socketHandler.sendMessageToLine(list.get(0).getXlBm(), mapper.writeValueAsString(map));  
73 - } catch (Exception e) {  
74 - logger.error("", e);  
75 - }  
76 - }  
77 -  
78 - /**  
79 - * @throws JsonProcessingException  
80 - * @throws NumberFormatException @Title: sendFcsj @Description:  
81 - * TODO(推送到达终点时间) @param @param schedule 班次 @throws  
82 - */  
83 - public void sendZdsj(ScheduleRealInfo sch, ScheduleRealInfo nextSch, int finish) {  
84 -  
85 - Map<String, Object> map = new HashMap<>();  
86 - map.put("fn", "zhongDian");  
87 - map.put("t", WsScheduleRealInfo.getInstance(sch));  
88 - map.put("nt", WsScheduleRealInfo.getInstance(nextSch));  
89 - map.put("finish", finish);  
90 - map.put("dataStr", sdf.format(new Date()));  
91 -  
92 - ObjectMapper mapper = new ObjectMapper();  
93 -  
94 - try {  
95 - socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));  
96 - } catch (Exception e) {  
97 - logger.error("", e);  
98 - }  
99 - }  
100 -  
101 - /**  
102 - * 推送班次信号状态  
103 - * @param state  
104 -  
105 - public void sendSignalState(SignalState state){  
106 - Map<String, Object> map = new HashMap<>();  
107 - map.put("fn", "signal_state");  
108 - map.put("data", state);  
109 -  
110 - ObjectMapper mapper = new ObjectMapper();  
111 -  
112 - try {  
113 - socketHandler.sendMessageToLine(state.getLineCode(), mapper.writeValueAsString(map));  
114 - } catch (Exception e) {  
115 - logger.error("", e);  
116 - }  
117 - }*/  
118 -  
119 - /**  
120 - *  
121 - * @Title: sendDirectiveToPage  
122 - * @Description: TODO(调度指令状态推送)  
123 - */  
124 - public void sendDirectiveToPage(ScheduleRealInfo sch) {  
125 -  
126 - Map<String, Object> map = new HashMap<>();  
127 - map.put("fn", "directive");  
128 - map.put("t", WsScheduleRealInfo.getInstance(sch));;  
129 -  
130 - ObjectMapper mapper = new ObjectMapper();  
131 -  
132 - try {  
133 - socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));  
134 - } catch (JsonProcessingException e) {  
135 - logger.error("", e);  
136 - }  
137 - }  
138 -  
139 - public void send80ToPage(D80 d80) {  
140 - d80.getData().setNbbm(BasicData.deviceId2NbbmMap.get(d80.getDeviceId()));  
141 - JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(d80));  
142 - json.put("fn", "report80");  
143 - socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), json.toJSONString());  
144 - }  
145 -  
146 - public void refreshSch(ScheduleRealInfo sch) {  
147 - List<ScheduleRealInfo> list = new ArrayList<>();  
148 - list.add(sch);  
149 - refreshSch(list);  
150 - }  
151 -  
152 - public void deviceOffline(GpsEntity gps){  
153 - Map<String, Object> map = new HashMap<>();  
154 - map.put("fn", "deviceOffline");  
155 - map.put("gps", gps);  
156 - ObjectMapper mapper = new ObjectMapper();  
157 -  
158 - try {  
159 - socketHandler.sendMessageToLine(gps.getLineId().toString(), mapper.writeValueAsString(map));  
160 - } catch (JsonProcessingException e) {  
161 - logger.error("", e);  
162 - }  
163 - }  
164 -  
165 - public void sendSafeDriv(SafeDriv sd){  
166 - Map<String, Object> map = new HashMap<>();  
167 - map.put("fn", "safeDriv");  
168 - map.put("t", sd);;  
169 - ObjectMapper mapper = new ObjectMapper();  
170 -  
171 - try {  
172 - socketHandler.sendMessageToLine(sd.getXlbm(), mapper.writeValueAsString(map));  
173 - } catch (JsonProcessingException e) {  
174 - logger.error("", e);  
175 - }  
176 - }  
177 -  
178 - /**  
179 - * 通知客户端,开始进行误点调整  
180 - * @param sch  
181 - */  
182 - public void sendAutoWdtz(ScheduleRealInfo sch, ScheduleRealInfo cancel){  
183 - Map<String, Object> map = new HashMap<>();  
184 - map.put("fn", "auto_wdtz");  
185 - map.put("id", sch.getId());  
186 - if(cancel != null)  
187 - map.put("cancelId", cancel.getId());  
188 - map.put("lineCode", sch.getXlBm());  
189 - map.put("minute", sch.getLateMinute());  
190 - ObjectMapper mapper = new ObjectMapper();  
191 -  
192 - try {  
193 - socketHandler.sendMessageToLine(sch.getXlBm() ,mapper.writeValueAsString(map));  
194 -  
195 - } catch (JsonProcessingException e) {  
196 - logger.error("", e);  
197 - }  
198 - }  
199 -  
200 - /**  
201 - * 对所有线调用户进行广播  
202 - * @param t  
203 - */  
204 - public void sendRadioText(String t, String lineCode){  
205 - Map<String, Object> map = new HashMap<>();  
206 - map.put("fn", "admin_radio_text");  
207 - map.put("t", t);  
208 - ObjectMapper mapper = new ObjectMapper();  
209 -  
210 - try {  
211 - if(StringUtils.isNotEmpty(lineCode))  
212 - socketHandler.sendMessageToLine(lineCode, mapper.writeValueAsString(map));  
213 - else  
214 - socketHandler.sendMessage(mapper.writeValueAsString(map));  
215 - } catch (JsonProcessingException e) {  
216 - logger.error("", e);  
217 - }  
218 - }  
219 -} 1 +package com.bsth.websocket.handler;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.bsth.data.BasicData;
  5 +import com.bsth.data.LineConfigData;
  6 +import com.bsth.data.gpsdata_v2.entity.GpsEntity;
  7 +import com.bsth.data.safe_driv.SafeDriv;
  8 +import com.bsth.entity.directive.D80;
  9 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  10 +import com.bsth.entity.CarErrorStop;
  11 +import com.bsth.websocket.dto.WsScheduleRealInfo;
  12 +import com.fasterxml.jackson.core.JsonProcessingException;
  13 +import com.fasterxml.jackson.databind.ObjectMapper;
  14 +import org.apache.commons.lang3.StringUtils;
  15 +import org.slf4j.Logger;
  16 +import org.slf4j.LoggerFactory;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.stereotype.Component;
  19 +
  20 +import java.text.SimpleDateFormat;
  21 +import java.util.*;
  22 +
  23 +@Component
  24 +public class SendUtils{
  25 +
  26 + @Autowired
  27 + private RealControlSocketHandler socketHandler;
  28 +
  29 + @Autowired
  30 + LineConfigData lineConfigData;
  31 +
  32 + private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  33 +
  34 + private static Logger logger = LoggerFactory.getLogger(SendUtils.class);
  35 +
  36 + /**
  37 + * @throws JsonProcessingException
  38 + * TODO(推送发车信息)
  39 + */
  40 + public void sendFcsj(ScheduleRealInfo sch) {
  41 +
  42 + Map<String, Object> map = new HashMap<>();
  43 + map.put("fn", "faChe");
  44 + map.put("t", WsScheduleRealInfo.getInstance(sch));
  45 + map.put("dataStr", sdf.format(new Date()));
  46 +
  47 + ObjectMapper mapper = new ObjectMapper();
  48 +
  49 + try {
  50 + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));
  51 + } catch (Exception e) {
  52 + logger.error("", e);
  53 + }
  54 + }
  55 +
  56 + /**
  57 + *
  58 + * @Title: sendFcsjArtificial
  59 + * @Description: TODO(要求页面刷新班次)
  60 + * @throws
  61 + */
  62 + public void refreshSch(List<ScheduleRealInfo> list){
  63 + if(null == list || list.size() == 0)
  64 + return;
  65 +
  66 + Map<String, Object> map = new HashMap<>();
  67 + map.put("fn", "refreshSch");
  68 + map.put("ts", WsScheduleRealInfo.getMultiInstance(list));
  69 +
  70 + ObjectMapper mapper = new ObjectMapper();
  71 +
  72 + try {
  73 + socketHandler.sendMessageToLine(list.get(0).getXlBm(), mapper.writeValueAsString(map));
  74 + } catch (Exception e) {
  75 + logger.error("", e);
  76 + }
  77 + }
  78 +
  79 + /**
  80 + * @throws JsonProcessingException
  81 + * @throws NumberFormatException @Title: sendFcsj @Description:
  82 + * TODO(推送到达终点时间) @param @param schedule 班次 @throws
  83 + */
  84 + public void sendZdsj(ScheduleRealInfo sch, ScheduleRealInfo nextSch, int finish) {
  85 +
  86 + Map<String, Object> map = new HashMap<>();
  87 + map.put("fn", "zhongDian");
  88 + map.put("t", WsScheduleRealInfo.getInstance(sch));
  89 + map.put("nt", WsScheduleRealInfo.getInstance(nextSch));
  90 + map.put("finish", finish);
  91 + map.put("dataStr", sdf.format(new Date()));
  92 +
  93 + ObjectMapper mapper = new ObjectMapper();
  94 +
  95 + try {
  96 + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));
  97 + } catch (Exception e) {
  98 + logger.error("", e);
  99 + }
  100 + }
  101 +
  102 + /**
  103 + * 推送班次信号状态
  104 + * @param state
  105 +
  106 + public void sendSignalState(SignalState state){
  107 + Map<String, Object> map = new HashMap<>();
  108 + map.put("fn", "signal_state");
  109 + map.put("data", state);
  110 +
  111 + ObjectMapper mapper = new ObjectMapper();
  112 +
  113 + try {
  114 + socketHandler.sendMessageToLine(state.getLineCode(), mapper.writeValueAsString(map));
  115 + } catch (Exception e) {
  116 + logger.error("", e);
  117 + }
  118 + }*/
  119 +
  120 + /**
  121 + *
  122 + * @Title: sendDirectiveToPage
  123 + * @Description: TODO(调度指令状态推送)
  124 + */
  125 + public void sendDirectiveToPage(ScheduleRealInfo sch) {
  126 +
  127 + Map<String, Object> map = new HashMap<>();
  128 + map.put("fn", "directive");
  129 + map.put("t", WsScheduleRealInfo.getInstance(sch));;
  130 +
  131 + ObjectMapper mapper = new ObjectMapper();
  132 +
  133 + try {
  134 + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map));
  135 + } catch (JsonProcessingException e) {
  136 + logger.error("", e);
  137 + }
  138 + }
  139 +
  140 + public void send80ToPage(D80 d80) {
  141 + d80.getData().setNbbm(BasicData.deviceId2NbbmMap.get(d80.getDeviceId()));
  142 + JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(d80));
  143 + json.put("fn", "report80");
  144 + socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), json.toJSONString());
  145 + }
  146 +
  147 + public void refreshSch(ScheduleRealInfo sch) {
  148 + List<ScheduleRealInfo> list = new ArrayList<>();
  149 + list.add(sch);
  150 + refreshSch(list);
  151 + }
  152 +
  153 + public void deviceOffline(GpsEntity gps){
  154 + Map<String, Object> map = new HashMap<>();
  155 + map.put("fn", "deviceOffline");
  156 + map.put("gps", gps);
  157 + ObjectMapper mapper = new ObjectMapper();
  158 +
  159 + try {
  160 + socketHandler.sendMessageToLine(gps.getLineId().toString(), mapper.writeValueAsString(map));
  161 + } catch (JsonProcessingException e) {
  162 + logger.error("", e);
  163 + }
  164 + }
  165 +
  166 + public void sendSafeDriv(SafeDriv sd){
  167 + Map<String, Object> map = new HashMap<>();
  168 + map.put("fn", "safeDriv");
  169 + map.put("t", sd);;
  170 + ObjectMapper mapper = new ObjectMapper();
  171 +
  172 + try {
  173 + socketHandler.sendMessageToLine(sd.getXlbm(), mapper.writeValueAsString(map));
  174 + } catch (JsonProcessingException e) {
  175 + logger.error("", e);
  176 + }
  177 + }
  178 +
  179 + /**
  180 + * 通知客户端,开始进行误点调整
  181 + * @param sch
  182 + */
  183 + public void sendAutoWdtz(ScheduleRealInfo sch, ScheduleRealInfo cancel){
  184 + Map<String, Object> map = new HashMap<>();
  185 + map.put("fn", "auto_wdtz");
  186 + map.put("id", sch.getId());
  187 + if(cancel != null)
  188 + map.put("cancelId", cancel.getId());
  189 + map.put("lineCode", sch.getXlBm());
  190 + map.put("minute", sch.getLateMinute());
  191 + ObjectMapper mapper = new ObjectMapper();
  192 +
  193 + try {
  194 + socketHandler.sendMessageToLine(sch.getXlBm() ,mapper.writeValueAsString(map));
  195 +
  196 + } catch (JsonProcessingException e) {
  197 + logger.error("", e);
  198 + }
  199 + }
  200 +
  201 + /**
  202 + * 对所有线调用户进行广播
  203 + * @param t
  204 + */
  205 + public void sendRadioText(String t, String lineCode){
  206 + Map<String, Object> map = new HashMap<>();
  207 + map.put("fn", "admin_radio_text");
  208 + map.put("t", t);
  209 + ObjectMapper mapper = new ObjectMapper();
  210 +
  211 + try {
  212 + if(StringUtils.isNotEmpty(lineCode))
  213 + socketHandler.sendMessageToLine(lineCode, mapper.writeValueAsString(map));
  214 + else
  215 + socketHandler.sendMessage(mapper.writeValueAsString(map));
  216 + } catch (JsonProcessingException e) {
  217 + logger.error("", e);
  218 + }
  219 + }
  220 +
  221 + /**
  222 + * 将车辆异常停车发送至线调页面
  223 + */
  224 + public void sendCarErrorStop(CarErrorStop carErrorStop) {
  225 + Map<String, Object> map = new HashMap<>();
  226 + map.put("fn", "carErrorStop");
  227 + map.put("data", carErrorStop);
  228 + ObjectMapper mapper = new ObjectMapper();
  229 +
  230 + try {
  231 + if (carErrorStop.getLineId() != null) {
  232 + socketHandler.sendMessageToLine(carErrorStop.getLineId(), mapper.writeValueAsString(map));
  233 + }
  234 + } catch (JsonProcessingException e) {
  235 + logger.error("sendCarErrorStop", e);
  236 + }
  237 + }
  238 +}
src/main/resources/application-prod.properties
@@ -2,13 +2,15 @@ server.port=9088 @@ -2,13 +2,15 @@ server.port=9088
2 management.port= 9001 2 management.port= 9001
3 management.address= 127.0.0.1 3 management.address= 127.0.0.1
4 4
  5 +spring.task.scheduling.pool.size= 5
  6 +
5 spring.jpa.hibernate.ddl-auto= none 7 spring.jpa.hibernate.ddl-auto= none
6 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy 8 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
7 #DATABASE 9 #DATABASE
8 spring.jpa.database= MYSQL 10 spring.jpa.database= MYSQL
9 spring.jpa.show-sql= false 11 spring.jpa.show-sql= false
10 spring.datasource.driver-class-name= com.mysql.jdbc.Driver 12 spring.datasource.driver-class-name= com.mysql.jdbc.Driver
11 -spring.datasource.url= jdbc:mysql://192.168.168.171:3306/control?useUnicode=true&characterEncoding=utf-8&useSSL=false 13 +spring.datasource.url= jdbc:mysql://192.168.168.171/control?useUnicode=true&characterEncoding=utf-8&useSSL=false
12 spring.datasource.username= root 14 spring.datasource.username= root
13 spring.datasource.password= root2jsp 15 spring.datasource.password= root2jsp
14 #DATASOURCE 16 #DATASOURCE
src/main/resources/application.properties
1 spring.profiles.active= test 1 spring.profiles.active= test
2 2
3 -spring.mvc.view.suffix=.html  
4 -server.session.timeout=-1  
5 -security.basic.enabled=false 3 +spring.mvc.view.suffix= .html
  4 +server.session.timeout= -1
  5 +security.basic.enabled= false
6 6
7 # \u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F\u9650\u5236\u914D\u7F6E 7 # \u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F\u9650\u5236\u914D\u7F6E
8 # File size limit 8 # File size limit
9 -multipart.maxFileSize = -1 9 +multipart.maxFileSize= -1
10 # Total request size for a multipart/form-data 10 # Total request size for a multipart/form-data
11 -multipart.maxRequestSize = -1 11 +multipart.maxRequestSize= -1
12 12
13 -server.compression.enabled=true  
14 -server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,text/javascript,text/css,application/javascript 13 +server.compression.enabled= true
  14 +server.compression.mime-types= application/json,application/xml,text/html,text/xml,text/plain,text/javascript,text/css,application/javascript
15 15
16 # batch insert 16 # batch insert
17 -hibernate.jdbc.batch_size = 50  
18 -debug=true 17 +hibernate.jdbc.batch_size= 50
19 \ No newline at end of file 18 \ No newline at end of file
src/main/resources/static/real_control_v2/css/main.css
1 -input::-webkit-outer-spin-button,  
2 -input::-webkit-inner-spin-button {  
3 - display: none;  
4 -}  
5 -  
6 -input::-webkit-calendar-picker-indicator {  
7 - display: none;  
8 -}  
9 -  
10 -input::-webkit-datetime-edit {  
11 - padding: 1px;  
12 -}  
13 -  
14 -.ps-container > .ps-scrollbar-y-rail {  
15 - z-index: 1 !important;  
16 -}  
17 -  
18 -.ps-container > .ps-scrollbar-x-rail,  
19 -.ps-container > .ps-scrollbar-y-rail {  
20 - opacity: 0.6 !important;  
21 - padding: 0 !important;  
22 -}  
23 -  
24 -/* ^_^ baidu map hide logo */  
25 -.anchorBL, .anchorBL, .amap-logo, .amap-copyright {  
26 - display: none;  
27 -}  
28 -  
29 -audio, canvas, img, svg, video {  
30 - max-width: none;  
31 -}  
32 -  
33 -html, body {  
34 - width: 100%;  
35 - height: 100%;  
36 - overflow: hidden;  
37 - margin-left: 0 !important;  
38 -}  
39 -  
40 -.main-container {  
41 - height: calc(100% - 120px);  
42 -}  
43 -  
44 -#main-tab-content {  
45 - height: 100%;  
46 - margin-bottom: 0;  
47 -}  
48 -  
49 -::-webkit-scrollbar {  
50 - width: 15px;  
51 - height: 16px;  
52 -}  
53 -  
54 -::-webkit-scrollbar-track, ::-webkit-scrollbar-thumb {  
55 - border-radius: 999px;  
56 - border: 5px solid transparent;  
57 -}  
58 -  
59 -::-webkit-scrollbar-track {  
60 - box-shadow: 1px 1px 5px rgba(0, 0, 0, .2) inset;  
61 -}  
62 -  
63 -::-webkit-scrollbar-thumb {  
64 - min-height: 20px;  
65 - background-clip: content-box;  
66 - box-shadow: 0 0 0 5px rgba(0, 0, 0, .2) inset;  
67 -}  
68 -  
69 -::-webkit-scrollbar-corner {  
70 - background: transparent;  
71 -}  
72 -  
73 -.uk-modal .uk-form.fv-form, .uk-modal .ct-modal-body {  
74 - margin-bottom: -20px !important;  
75 -}  
76 -  
77 -.uk-modal .uk-form.fv-form.fixed-tool {  
78 - width: 100%;  
79 - position: relative;  
80 - height: 100%;  
81 -}  
82 -  
83 -.uk-modal .ct-modal-body .uk-modal-footer {  
84 - margin-left: 0;  
85 -}  
86 -  
87 -.uk-modal .uk-form.fv-form.fixed-tool .uk-modal-footer {  
88 - position: absolute;  
89 - bottom: 0;  
90 - width: calc(100% - 20px);  
91 -}  
92 -  
93 -table.ct-fixed-table {  
94 - table-layout: fixed;  
95 -}  
96 -  
97 -table.ct-fixed-table tr.context-menu-active {  
98 - background: #f0f0f0;  
99 -}  
100 -  
101 -table.ct-fixed-table.uk-table tr td {  
102 - white-space: nowrap;  
103 - overflow: hidden;  
104 - text-overflow: ellipsis;  
105 -}  
106 -  
107 -table.ct-fixed-table.uk-table .uk-badge {  
108 - padding: 2px 5px;  
109 -}  
110 -  
111 -.horizontal-field {  
112 - vertical-align: middle;  
113 - margin: 0 5px;  
114 -}  
115 -  
116 -.legend-tools {  
117 - float: right;  
118 - font-size: 11px;  
119 -}  
120 -  
121 -.legend-tools a.uk-icon-small {  
122 - margin: 0 5px;  
123 - cursor: pointer;  
124 -}  
125 -  
126 -.text-succ {  
127 - color: #659f13;  
128 -}  
129 -  
130 -.text-err {  
131 - color: red;  
132 -}  
133 -  
134 -.text-grey {  
135 - color: grey;  
136 -}  
137 -  
138 -svg.line-chart {  
139 - width: 100%;  
140 - height: 100%;  
141 - position: absolute;  
142 - left: 0;  
143 -}  
144 -  
145 -svg.line-chart circle.station_circle {  
146 - fill: #5e96d2;  
147 - r: 5.5;  
148 - stroke: rgb(253, 253, 253);  
149 - stroke-width: 3;  
150 - Pointer-events: none;  
151 -}  
152 -  
153 -svg.line-chart circle.station_circle.down {  
154 - fill: #c92121;  
155 -}  
156 -  
157 -svg.line-chart path.station_link {  
158 - stroke-width: 3.5px;  
159 - stroke: #5E96D2;  
160 - Pointer-events: none;  
161 -}  
162 -  
163 -svg.line-chart path.station_link.down {  
164 - stroke: #c92121;  
165 -}  
166 -  
167 -svg.line-chart path.station_link.down.loop_line {  
168 - stroke-dasharray: 4, 3;  
169 - stroke-width: 1px;  
170 -}  
171 -  
172 -svg.line-chart text.station_text {  
173 - writing-mode: tb;  
174 - fill: #3e3e3e;  
175 - letter-spacing: -.2px;  
176 - text-shadow: 0 0 2px #dadada;  
177 - Pointer-events: none;  
178 -}  
179 -  
180 -svg.line-chart text.station_text.up {  
181 - fill: #4556b6;  
182 -}  
183 -  
184 -svg.line-chart text.station_text.down {  
185 - fill: #c94f21;  
186 -}  
187 -  
188 -svg.line-chart g.item:first-child > text {  
189 - stroke: #6f6e6e;  
190 - fill: none;  
191 -}  
192 -  
193 -svg.line-chart g.item:nth-last-child(3) > text {  
194 - stroke: #6f6e6e;  
195 - fill: none;  
196 -}  
197 -  
198 -svg.line-chart g.item:first-child > text.up,  
199 -svg.line-chart g.item:nth-last-child(3) > text.up {  
200 - stroke: #4556b6;  
201 -}  
202 -  
203 -svg.line-chart g.item:first-child > text.down,  
204 -svg.line-chart g.item:nth-last-child(3) > text.down {  
205 - stroke: #c94f21;  
206 -}  
207 -  
208 -svg.line-chart g.gps-wrap > rect {  
209 - width: 30px;  
210 - height: 15px;  
211 - /* fill: #fff; */  
212 - rx: 2px;  
213 - cursor: pointer;  
214 -}  
215 -  
216 -svg.line-chart g.gps-wrap > rect[updown="0"] {  
217 - stroke: rgb(62, 80, 179);  
218 - fill: rgb(62, 80, 179);  
219 -}  
220 -  
221 -svg.line-chart g.gps-wrap > rect[updown="1"] {  
222 - stroke: #c94f21;  
223 - fill: #c94f21;  
224 -}  
225 -  
226 -svg.line-chart g.gps-wrap > rect.hover {  
227 - stroke-width: 2;  
228 -}  
229 -  
230 -svg.line-chart g.gps-wrap > text {  
231 - font-size: 12px;  
232 - transform: translate(0, 12px);  
233 - pointer-events: none;  
234 -}  
235 -  
236 -svg.line-chart g.gps-wrap > text[updown="0"] {  
237 - fill: #fff;  
238 -}  
239 -  
240 -svg.line-chart g.gps-wrap > text[updown="1"] {  
241 - fill: #fff;  
242 -}  
243 -  
244 -svg.line-chart g.gps-wrap > rect.abnormal[updown="0"],  
245 -svg.line-chart g.gps-wrap > rect.abnormal[updown="1"] {  
246 - width: 40px;  
247 - fill: yellow;  
248 - stroke: yellow;  
249 -}  
250 -  
251 -svg.line-chart g.gps-wrap > text.abnormal[updown="0"],  
252 -svg.line-chart g.gps-wrap > text.abnormal[updown="1"] {  
253 - fill: black;  
254 -}  
255 -  
256 -svg.line-chart .merge_hide {  
257 - display: none !important;  
258 -}  
259 -  
260 -svg.line-chart g.merge-item rect {  
261 - width: 22px;  
262 - height: 22px;  
263 - rx: 15px;  
264 - fill: #19a53a;  
265 - cursor: pointer;  
266 - stroke: #19a53a;  
267 - stroke-dasharray: 1, 2;  
268 - stroke-width: 3px;  
269 -}  
270 -  
271 -svg.line-chart g.merge-item text {  
272 - fill: #fff;  
273 - pointer-events: none;  
274 -}  
275 -  
276 -.qtip-multi-gps {  
277 - max-width: 720px !important;  
278 -}  
279 -  
280 -.qtip-bootstrap.qtip-multi-gps .qtip-content {  
281 - padding: 0;  
282 -}  
283 -  
284 -.tooltip {  
285 - position: relative;  
286 - padding-bottom: 160px;  
287 - width: 220px;  
288 -}  
289 -  
290 -.multi-tooltip-wrap {  
291 - width: 100%;  
292 - max-height: 350px;  
293 - overflow: auto;  
294 -}  
295 -  
296 -.tip_map_wrap.multi {  
297 - width: 100%;  
298 - height: 130px;  
299 -}  
300 -  
301 -.tooltip.multi-tooltip {  
302 - width: 160px;  
303 - display: inline-block;  
304 - padding: 10px 0 10px 12px;  
305 - border-right: 1px solid #eeeeee;  
306 - border-bottom: 1px solid #eeeeee;  
307 -}  
308 -  
309 -.tooltip hr {  
310 - border-top: 1px solid #eeeeee;  
311 - width: calc(100% + 30px);  
312 - margin: 7px 0 11px -15px;  
313 -}  
314 -  
315 -.tooltip.multi-tooltip hr {  
316 - width: calc(100% + 16px);  
317 -}  
318 -  
319 -.tooltip .tooltip-container {  
320 - padding: 1px;  
321 -}  
322 -  
323 -.tooltip .tooltip-container div, .tooltip .tooltip-container div a {  
324 - margin: 7px 1px;  
325 - font-size: 13px;  
326 - color: rgb(76, 76, 76);  
327 -}  
328 -  
329 -.tooltip .tooltip-container div.title {  
330 - margin: 8px 1px 12px;  
331 -}  
332 -  
333 -.tooltip .tooltip-container .title a {  
334 - font-size: 18px;  
335 - font-family: 微软雅黑;  
336 -}  
337 -  
338 -.tooltip span.field {  
339 - color: #7d7d7b;  
340 - margin-right: 5px;  
341 - width: 52px;  
342 - display: inline-block;  
343 - text-align: right;  
344 -}  
345 -  
346 -.tooltip .tip_map_wrap {  
347 - position: absolute;  
348 - bottom: -16px;  
349 - left: -15px;  
350 - width: calc(100% + 28px);  
351 - background: #fff;  
352 - height: 165px;  
353 - border-radius: 0 0 5px 5px;  
354 - border-top: 1px solid #e6e4e4;  
355 -}  
356 -  
357 -canvas.crosshair-layer {  
358 - position: absolute;  
359 - width: 100%;  
360 - height: 100%;  
361 - background: rgba(255, 255, 255, 0.33);  
362 - left: 0;  
363 -}  
364 -  
365 -li.map-panel {  
366 - height: 100%;  
367 - position: relative;  
368 -}  
369 -  
370 -.main-container .load-panel {  
371 - display: block;  
372 - color: #999797;  
373 -}  
374 -  
375 -.uk-panel-box-danger {  
376 - background-color: #fff1f0;  
377 - /*color: #d85030;*/  
378 - border-color: rgba(216, 80, 48, .3);  
379 -}  
380 -  
381 -/*.uk-panel-box-danger .uk-panel-title {  
382 - color: #d85030;  
383 -}*/  
384 -  
385 -.uk-badge-default {  
386 - background-color: #a09b9c;  
387 - background-image: -webkit-linear-gradient(top, #9a9898, #8c8687);  
388 - background-image: linear-gradient(to bottom, #9a9898, #8c8687);  
389 -}  
390 -  
391 -.ct-bottom-drawer {  
392 - width: 100%;  
393 - background: rgb(255, 255, 255);  
394 - position: fixed;  
395 - bottom: 0;  
396 - box-shadow: 0 0 10px rgba(0, 0, 0, .3);  
397 - transition: all .3s ease;  
398 - height: 0;  
399 -}  
400 -  
401 -.ct-bottom-drawer.open {  
402 - height: 320px;  
403 -}  
404 -  
405 -.ct-bottom-drawer a.ct-bottom-drawer-close {  
406 - position: absolute;  
407 - right: 10px;  
408 - top: 10px;  
409 - color: #c3c3c3;  
410 - width: 20px;  
411 - line-height: 20px;  
412 - background: #fff;  
413 - text-align: center;  
414 - z-index: 99;  
415 -}  
416 -  
417 -.ct-bottom-drawer a.ct-bottom-drawer-close:hover {  
418 - text-decoration: none;  
419 - color: grey;  
420 -}  
421 -  
422 -.ct-bottom-drawer a.ct-bottom-drawer-close:after {  
423 - display: block;  
424 - content: "\f00d";  
425 - font-family: FontAwesome;  
426 -}  
427 -  
428 -.ct-bottom-drawer-body {  
429 - width: 100%;  
430 - height: 100%;  
431 -}  
432 -  
433 -#station_route_spacing_chart_drawer .svg_wrap {  
434 - width: 80%;  
435 - height: 100%;  
436 - display: inline-block;  
437 - font-size: 14px;  
438 - overflow: hidden;  
439 - position: relative;  
440 -}  
441 -  
442 -#station_route_spacing_chart_drawer .drawer_right_map {  
443 - width: 20%;  
444 - height: 100%;  
445 - display: inline-block;  
446 -}  
447 -  
448 -#station_route_spacing_chart_drawer .svg_cont_body {  
449 - height: 100%;  
450 - position: absolute;  
451 - top: 0;  
452 - left: 0;  
453 -}  
454 -  
455 -#station_route_spacing_chart_drawer svg {  
456 - width: 100%;  
457 - height: 100%;  
458 -}  
459 -  
460 -#station_route_spacing_chart_drawer svg g._item rect {  
461 - stroke: rgb(62, 80, 179);  
462 - fill: rgb(62, 80, 179);  
463 - width: 30px;  
464 - height: 124px;  
465 - rx: 5;  
466 - transform: translate(-15px);  
467 -}  
468 -  
469 -#station_route_spacing_chart_drawer svg g._item text {  
470 - writing-mode: tb;  
471 - transform: translate(0, 9px);  
472 - fill: #fff;  
473 -}  
474 -  
475 -#station_route_spacing_chart_drawer svg g._item path {  
476 - stroke-width: 5.4px;  
477 - stroke: #3e50b3;  
478 -}  
479 -  
480 -#station_route_spacing_chart_drawer svg g._item circle {  
481 - r: 3px;  
482 - fill: #ffffff;  
483 -}  
484 -  
485 -#station_route_spacing_chart_drawer svg g._item path.arc_path {  
486 - stroke-width: 1.3px;  
487 - stroke: #3e50b3;  
488 - stroke-dasharray: 1000;  
489 - stroke-dashoffset: 1000;  
490 - fill: none;  
491 -  
492 - animation: dash .9s;  
493 - webkit-amimation: dash .9s;  
494 - animation-fill-mode: forwards;  
495 - -webkit-animation-fill-mode: forwards;  
496 -}  
497 -  
498 -@keyframes dash {  
499 - to {  
500 - stroke-dashoffset: 0;  
501 - stroke-dasharray: 4, 4;  
502 - }  
503 -}  
504 -  
505 -@-webkit-keyframes dash {  
506 - to {  
507 - stroke-dashoffset: 0;  
508 - stroke-dasharray: 4, 4;  
509 - }  
510 -}  
511 -  
512 -#station_route_spacing_chart_drawer svg g._item text.distance_text {  
513 - writing-mode: horizontal-tb;  
514 - fill: #3e50b3;  
515 -}  
516 -  
517 -#station_route_spacing_chart_drawer svg g._item rect.distance_rect {  
518 - height: 20px;  
519 - width: 40px;  
520 - fill: #fff !important;  
521 - stroke-width: 0;  
522 -}  
523 -  
524 -#station_route_spacing_chart_drawer .tl_desc_text {  
525 - position: absolute;  
526 - top: 5px;  
527 - left: 5px;  
528 - font-size: 12px;  
529 - color: #525050;  
530 - font-family: 微软雅黑;  
531 -}  
532 -  
533 -#station_route_spacing_chart_drawer svg g._item:first-child circle {  
534 - fill: #3e50b3;  
535 - r: 6px;  
536 -}  
537 -  
538 -#station_route_spacing_chart_drawer svg g._item:last-child circle {  
539 - fill: #3e50b3;  
540 - r: 6px;  
541 -}  
542 -  
543 -/* 下行 */  
544 -#station_route_spacing_chart_drawer svg.down g._item rect {  
545 - stroke: #dd3829;  
546 - fill: #dd3829;  
547 -}  
548 -  
549 -#station_route_spacing_chart_drawer svg.down g._item path {  
550 - stroke: #dd3829;  
551 -}  
552 -  
553 -#station_route_spacing_chart_drawer svg.down g._item:first-child circle {  
554 - fill: #dd3829;  
555 -}  
556 -  
557 -#station_route_spacing_chart_drawer svg.down g._item text.distance_text {  
558 - fill: #dd3829;  
559 -}  
560 -  
561 -#station_route_spacing_chart_drawer svg.down g._item path.arc_path {  
562 - stroke: #dd3829;  
563 -}  
564 -  
565 -#station_route_spacing_chart_drawer svg.down g._item:last-child circle {  
566 - fill: #dd3829;  
567 -}  
568 -  
569 -.svg-edit-panel-wrap {  
570 - width: 48%;  
571 - border: 1px solid #e1d3d3;  
572 - padding: 12px 0 0 0;  
573 - border-radius: 4px;  
574 - position: relative;  
575 - display: inline-block;  
576 - vertical-align: top;  
577 - height: 440px;  
578 -}  
579 -  
580 -.svg-edit-panel-wrap .title-badge {  
581 - position: absolute;  
582 - top: -10px;  
583 - left: 7px;  
584 - font-size: 13px;  
585 - background: #fff;  
586 - padding: 0 3px;  
587 - color: #888888;  
588 -}  
589 -  
590 -.svg-edit-panel-wrap .rename-tools {  
591 - height: 21px;  
592 - padding: 0 0 0 9px;  
593 -}  
594 -  
595 -.svg-edit-panel-wrap .rename-item-panel {  
596 - border-bottom: 1px solid #ede5e5;  
597 - padding: 4px;  
598 -}  
599 -  
600 -.svg-edit-panel-wrap .rename-item-panel select {  
601 - width: 150px;  
602 -}  
603 -  
604 -.svg-edit-panel-wrap .rename-item-panel input {  
605 - margin-left: 7px;  
606 -}  
607 -  
608 -.svg-edit-panel-wrap .rename-item-panel input[type=checkbox] {  
609 - margin-top: 2px;  
610 - margin-right: 4px;  
611 -}  
612 -  
613 -.svg-edit-panel-wrap .rename-item-panel.active {  
614 - background: #65c9f8;  
615 - box-shadow: 0px 3px 7px 0 rgba(101, 201, 248, 0.48), 0px 1px 4px 0 rgba(101, 201, 248, 0.32);  
616 -}  
617 -  
618 -.svg-edit-panel-wrap .rename-item-panel.active select,  
619 -.svg-edit-panel-wrap .rename-item-panel.active input {  
620 - background: #65c9f8;  
621 - color: #fff;  
622 -}  
623 -  
624 -.svg-edit-panel-wrap .rename-item-panel.active i {  
625 - color: #e4f6ff;  
626 -}  
627 -  
628 -.svg-edit-panel-wrap .rename-item-panel.active input[type=checkbox] {  
629 - border: none;  
630 -}  
631 -  
632 -.svg-edit-panel-wrap .rename-item-panel.active input[type=checkbox]:before {  
633 - color: #fff;  
634 -}  
635 -  
636 -.svg-edit-panel-wrap .rename-tools a {  
637 - font-size: 14px;  
638 - padding: 5px;  
639 -}  
640 -  
641 -.svg-edit-panel-wrap .rename-tools a:hover {  
642 - background: #e8edef;  
643 - border-radius: 5px;  
644 -}  
645 -  
646 -.station-list {  
647 - width: 190px;  
648 - padding: 2px 7px;  
649 - height: 100%;  
650 - overflow: auto;  
651 - display: inline-block;  
652 -}  
653 -  
654 -.station-list .station-item {  
655 - padding: 3px 0;  
656 - margin: 5px 0;  
657 - border-radius: 3px;  
658 - font-size: 13px;  
659 - text-indent: 7px;  
660 - cursor: pointer;  
661 - white-space: nowrap;  
662 - overflow: hidden;  
663 - text-overflow: ellipsis;  
664 -}  
665 -  
666 -.station-list .station-item.disable,  
667 -.station-list .station-item.disable:hover {  
668 - background: #d5c9c9 !important;  
669 - color: #686565 !important;  
670 -}  
671 -  
672 -.station-list.up .station-item {  
673 - background: #5364c3;  
674 - color: white;  
675 -}  
676 -  
677 -.station-list.up .station-item:hover {  
678 - box-shadow: 0px 3px 6px 0 rgba(0, 0, 0, 0.2), 0px 1px 4px 0 rgba(0, 0, 0, 0.19);  
679 - background: #4556b6;  
680 -}  
681 -  
682 -.station-list.down .station-item {  
683 - background: #f95858;  
684 - color: white;  
685 -}  
686 -  
687 -.station-list.down .station-item:hover {  
688 - box-shadow: 0px 3px 6px 0 rgba(0, 0, 0, 0.2), 0px 1px 4px 0 rgba(0, 0, 0, 0.19);  
689 - background: #e95151;  
690 -}  
691 -  
692 -.modal-dotted-hr {  
693 - height: 1px;  
694 - border: none;  
695 - border-top: 1px dashed #d1d1d1;  
696 - width: calc(100% + 40px);  
697 - margin-left: -20px;  
698 -}  
699 -  
700 -#add-sub-task-range_turn-modal .main-sch-panel {  
701 - height: 60px;  
702 - border: 1px solid #dddddd;  
703 - border-radius: 5px;  
704 - position: relative;  
705 - padding: 20px 0 0 8px;  
706 -}  
707 -  
708 -#add-sub-task-range_turn-modal .main-sch-panel:before {  
709 - content: '主任务';  
710 - position: absolute;  
711 - top: -10px;  
712 - left: 10px;  
713 - background: #fff;  
714 - padding: 0 4px;  
715 - font-size: 12px;  
716 - color: #adadad;  
717 -}  
718 -  
719 -.ct_row {  
720 - font-size: 0;  
721 -}  
722 -  
723 -.ct_row .ct_cell {  
724 - display: inline-block;  
725 - font-size: 13px;  
726 - white-space: nowrap;  
727 - overflow: hidden;  
728 - text-overflow: ellipsis;  
729 -}  
730 -  
731 -.ct_row .ct_cell label {  
732 - color: #979393;  
733 - margin-right: 3px;  
734 -}  
735 -  
736 -.ct_row .ct_cell.c_1_3 {  
737 - width: 33%;  
738 -}  
739 -  
740 -#schedule-lp_change-modal .sch-list dl dd {  
741 - font-size: 14px;  
742 -}  
743 -  
744 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(1), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(1) {  
745 - width: 5%;  
746 - border-left: 1px solid #dedede;  
747 -}  
748 -  
749 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(2), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(2) {  
750 - width: 22%;  
751 -}  
752 -  
753 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(3), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(3) {  
754 - width: 17%;  
755 -}  
756 -  
757 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(4), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(4) {  
758 - width: 10%;  
759 -}  
760 -  
761 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(5), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(5) {  
762 - width: 21%;  
763 -}  
764 -  
765 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(6), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(6) {  
766 - width: 10%;  
767 -}  
768 -  
769 -#schedule-lp_change-modal .sch-list dl dt:nth-of-type(7), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(7) {  
770 - width: 14%;  
771 -}  
772 -  
773 -#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) {  
774 - width: 5%;  
775 - border-left: 1px solid #dedede;  
776 -}  
777 -  
778 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(2), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(2) {  
779 - width: 14%;  
780 -}  
781 -  
782 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(3), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(3) {  
783 - width: 10%;  
784 -}  
785 -  
786 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(4), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(4) {  
787 - width: 21%;  
788 -}  
789 -  
790 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(5), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(5) {  
791 - width: 10%;  
792 -}  
793 -  
794 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(6), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(6) {  
795 - width: 17%;  
796 -}  
797 -  
798 -#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(7), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(7) {  
799 - width: 22%;  
800 -}  
801 -  
802 -#schedule-lp_change-modal .ct_table.sch-list .ct_table_body dl.active {  
803 - background: #b9d2ff;  
804 -}  
805 -  
806 -#schedule-lp_change-modal .ct_table.sch-list .ct_table_body dl.active dd {  
807 - border-top: 1px solid #b9d2ff;  
808 -}  
809 -  
810 -#schedule-lp_change-modal .ct_table.sch-list dl.active input[type=checkbox] {  
811 - border: none;  
812 -}  
813 -  
814 -#schedule-lp_change-modal .ct_table.sch-list.reverse .ct_table_body dl.active {  
815 - background: #ffe2b9;  
816 -}  
817 -  
818 -#schedule-lp_change-modal .ct_table.sch-list.reverse .ct_table_body dl.active dd {  
819 - border-top: 1px solid #ffe2b9;  
820 -}  
821 -  
822 -#cache_data_manage-modal .uk-table td {  
823 - vertical-align: bottom;  
824 -}  
825 -  
826 -#cache_data_manage-modal .uk-table td,  
827 -#cache_data_manage-modal .uk-table th {  
828 - padding: 8px 8px 6px;  
829 -}  
830 -  
831 -.ps-help-panel {  
832 - color: grey;  
833 - padding: 5px 2px;  
834 -}  
835 -  
836 -.ps-help-panel small {  
837 - display: block;  
838 -}  
839 -  
840 -svg text.offline {  
841 - fill: #6f6a6a !important;  
842 -}  
843 -  
844 -svg rect.offline {  
845 - stroke: #dbdada !important;  
846 - fill: #dbdada !important;  
847 -}  
848 -  
849 -.tooltip .tooltip-container .title a > .abnormal-text {  
850 - font-size: 14px;  
851 - color: #ff5e5e;  
852 - font-weight: 600;  
853 -}  
854 -  
855 -#addChildTaskBtn {  
856 - margin-left: 5px;  
857 - color: #36729b;  
858 - padding: 1px 5px 1px 6px;  
859 -}  
860 -  
861 -#addChildTaskBtn:hover {  
862 - box-shadow: 2px 1px 3px 0 rgba(0, 0, 0, 0.2), 0px 3px 8px 0 rgba(0, 0, 0, 0.19);  
863 -}  
864 -  
865 -.edit-icon {  
866 - color: #aba9a9;  
867 - font-size: 12px;  
868 - margin-left: 5px;  
869 - display: none;  
870 -}  
871 -  
872 -.operation-real-text {  
873 - position: absolute;  
874 - top: 9px;  
875 - width: 100%;  
876 - left: 0;  
877 - text-align: center;  
878 - pointer-events: none;  
879 -}  
880 -  
881 -.operation-real-text span {  
882 - padding: 15px;  
883 - background: #ff4f4f;  
884 - color: white;  
885 - box-shadow: 0px 4px 6px 0 rgba(0, 0, 0, 0.2), 0px 4px 10px 0 rgba(0, 0, 0, 0.19);  
886 - border-radius: 1px 1px 4px 4px;  
887 -}  
888 -  
889 -#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-label {  
890 - width: 120px;  
891 -}  
892 -  
893 -#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-controls {  
894 - margin-left: 125px;  
895 -}  
896 -  
897 -#oil_station-modal .uk-form-icon > [class*=uk-icon-] {  
898 - right: 23px;  
899 -}  
900 -  
901 -#oil_station-modal .uk-form-icon:not(.uk-form-icon-flip) > input {  
902 - padding-left: 10px !important;  
903 -}  
904 -  
905 -#oil_station-modal .uk-form-icon {  
906 - width: calc(100% - 145px);  
907 -}  
908 -  
909 -#oil_station-modal .uk-icon-mile:before {  
910 - content: '公里';  
911 -}  
912 -  
913 -#oil_station-modal .uk-icon-minute:before {  
914 - content: '分钟';  
915 -}  
916 -  
917 -option.oil_station_opt {  
918 - color: red;  
919 -}  
920 -  
921 -#oil_station-modal .uk-modal .uk-form.fv-form {  
922 - margin-bottom: 0 !important;  
923 -}  
924 -  
925 -#gb_wait_modal .uk-modal-spinner {  
926 - top: 25px;  
927 - -webkit-transform: translate(-50%, 0);  
928 - transform: translate(-50%, 0);  
929 -}  
930 -  
931 -#gb_wait_modal .wait-modal-text {  
932 - text-align: center;  
933 - margin-top: 35px;  
934 - font-size: 15px;  
935 - color: #635e5e;  
936 -}  
937 -  
938 -.park-and-station-wrap {  
939 - margin-top: 25px;  
940 - border: 1px solid #b9b9b9;  
941 - width: 580px;  
942 - padding: 12px;  
943 - border-radius: 5px;  
944 - box-shadow: 0 2px 5px rgba(0,0,0,.1);  
945 - margin-bottom: 15px;  
946 -}  
947 -  
948 -.park-and-station-wrap select {  
949 - width: auto !important;  
950 -}  
951 -  
952 -.park-and-station-wrap>span{  
953 - vertical-align: middle;  
954 - margin-top: 9px;  
955 - display: inline-block;  
956 -}  
957 -  
958 -/** 安全驾驶相关css */  
959 -.safe_driv_pop_wrap {  
960 - position: absolute;  
961 - right: 12px;  
962 - bottom: 12px;  
963 - z-index: 99;  
964 -}  
965 -  
966 -.safe_driv_pop {  
967 - background: #d44b4b;  
968 - font-size: 15px;  
969 - padding: 9px 10px 0;  
970 - border: 1px solid #f4f0f0;  
971 - border-radius: 5px;  
972 - cursor: pointer;  
973 - box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);  
974 - transition: all .03s;  
975 - color: #f2f2f2;  
976 -}  
977 -  
978 -.safe_driv_pop:hover {  
979 - background: #bc2a2a;  
980 -}  
981 -  
982 -.safe_driv_pop .title {  
983 -}  
984 -  
985 -.safe_driv_pop .desc {  
986 - display: block;  
987 - font-size: 12px;  
988 - color: #ff9d9d;  
989 - text-align: right;  
990 - margin-right: 5px;  
991 -}  
992 -  
993 -/** 嵌入表单modal滚动条样式 */  
994 -#formFragmentModal::-webkit-scrollbar {  
995 - width: 10px;  
996 - background-color: #F5F5F5;  
997 -}  
998 -  
999 -#formFragmentModal::-webkit-scrollbar-thumb {  
1000 - background-color: #000000;  
1001 -}  
1002 -  
1003 -#formFragmentModal::-webkit-scrollbar-track {  
1004 - border: 0;  
1005 - background-color: #F5F5F5;  
1006 - border-radius: 0;  
1007 -}  
1008 -  
1009 -#formFragmentModal::-webkit-scrollbar-thumb {  
1010 - border: 5px solid rgb(226, 122, 122);  
1011 -}  
1012 -  
1013 -#schedule-addsch_oil-modal select {  
1014 - height: 30px !important;  
1015 -}  
1016 -  
1017 -#oil_station-modal .input_clear_icon {  
1018 - position: absolute;  
1019 - top: 6px;  
1020 - right: 108px;  
1021 - color: #f75757;  
1022 - height: 18px;  
1023 - line-height: 18px;  
1024 - border-radius: 7px;  
1025 - font-size: 16px;  
1026 - display: none;  
1027 - cursor: pointer;  
1028 -}  
1029 -  
1030 -#oil_station-modal .input_clear_icon:hover {  
1031 - color: #de2020;  
1032 -}  
1033 -  
1034 -#oil_station-modal .input_clear_icon:before {  
1035 - display: block;  
1036 - font-family: FontAwesome;  
1037 - content: "\f057";  
1038 -}  
1039 -  
1040 -#oil_station-modal input.readonly {  
1041 - background: #dddddd;  
1042 -}  
1043 -  
1044 -.ct_tags {  
1045 - margin-bottom: 12px;  
1046 -}  
1047 -  
1048 -.ct_tags > span {  
1049 - padding: 3px 7px;  
1050 - background: #e8e8e8;  
1051 - color: #3a3939;  
1052 - cursor: pointer;  
1053 - margin-right: 5px;  
1054 -}  
1055 -  
1056 -.ct_tags > span.active {  
1057 - background: #62a9e1;  
1058 - color: white;  
1059 - box-shadow: 0 0 4px rgba(0, 0, 0, 0.35);  
1060 -}  
1061 -  
1062 -.ct_tags > span.active:before {  
1063 - content: "\f00c";  
1064 - font-family: FontAwesome;  
1065 - margin-right: 2px;  
1066 - font-size: 13px;  
1067 -}  
1068 -  
1069 -.ct_tags > span:hover {  
1070 - box-shadow: 0 0 4px rgba(0, 0, 0, .3);  
1071 -}  
1072 -  
1073 -span.late-badge {  
1074 - height: 20px;  
1075 - line-height: 20px;  
1076 - margin-top: 8px;  
1077 - color: grey;  
1078 - margin-left: 2px;  
1079 -}  
1080 -  
1081 -dl.intimity span.late-badge {  
1082 - color: #fbfbfb;  
1083 -}  
1084 -  
1085 -/** badge tooltip */  
1086 -.uk-badge.c_task:hover,  
1087 -.uk-badge.sch_region:hover {  
1088 - background-image: none;  
1089 - background: #38b3e1;  
1090 - border: 1px solid #7ebad1;  
1091 -}  
1092 -  
1093 -.uk-badge.out:hover {  
1094 - background-image: none;  
1095 - background: #8fc650;  
1096 - border: 1px solid #949f86;  
1097 -}  
1098 -  
1099 -.uk-badge.in:hover {  
1100 - background-image: none;  
1101 - background: #fabc64;  
1102 - border: 1px solid #a68c67;  
1103 -}  
1104 -  
1105 -.qtip.sch-badge-tip {  
1106 - max-width: 700px;  
1107 -}  
1108 -  
1109 -.tip_task_list {  
1110 - width: 530px;  
1111 - margin-bottom: -10px;  
1112 -}  
1113 -  
1114 -.tip_task_list dl {  
1115 - font-size: 0;  
1116 - border-bottom: 1px solid #e6e6e6;  
1117 - margin: 0;  
1118 -}  
1119 -  
1120 -.tip_task_list dl:last-child {  
1121 - border-bottom: none;  
1122 -}  
1123 -  
1124 -.tip_task_list dl dt,  
1125 -.tip_task_list dl dd {  
1126 - display: inline-block;  
1127 - font-size: 13px;  
1128 - white-space: nowrap;  
1129 - overflow: hidden;  
1130 - text-overflow: ellipsis;  
1131 - height: 24px;  
1132 - line-height: 24px;  
1133 -}  
1134 -  
1135 -.tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1) {  
1136 - width: 38px;  
1137 - border-right: 1px solid #c8c8c8;  
1138 -}  
1139 -  
1140 -.tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2) {  
1141 - width: 18%;  
1142 - text-indent: 5px;  
1143 -}  
1144 -  
1145 -.tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3) {  
1146 - width: 11%;  
1147 -}  
1148 -  
1149 -.tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4) {  
1150 - width: 25%;  
1151 -}  
1152 -  
1153 -.tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5) {  
1154 - width: 25%;  
1155 -}  
1156 -  
1157 -.tip_task_list dl dt:nth-of-type(6), .tip_task_list dl dd:nth-of-type(6) {  
1158 - width: 12%;  
1159 -}  
1160 -  
1161 -.tip_task_list dl dd:nth-of-type(1) a {  
1162 - color: #3c3c3c;  
1163 - text-decoration: underline;  
1164 - font-size: 12px;  
1165 -}  
1166 -  
1167 -.tip_task_list dl.service {  
1168 - color: blue;  
1169 -}  
1170 -  
1171 -.tip_task_list dl.service.destroy {  
1172 - color: red;  
1173 -}  
1174 -  
1175 -.tip_task_list dl.service.temp_add {  
1176 - color: #9C27B0;  
1177 -}  
1178 -  
1179 -.tip_task_list dl span {  
1180 - margin: 0;  
1181 - width: auto;  
1182 -}  
1183 -  
1184 -ul.left_tabs_lg {  
1185 - border: 1px solid #efeded;  
1186 - height: 100%;  
1187 - background: #fafafa;  
1188 -}  
1189 -  
1190 -ul.left_tabs_lg li {  
1191 - line-height: 40px;  
1192 - font-size: 15px;  
1193 -}  
1194 -  
1195 -#schedule-addsch-modal .uk-modal-footer {  
1196 - border-top: none;  
1197 - background: none;  
1198 -}  
1199 -  
1200 -.ct_line_lp_badge {  
1201 - float: left;  
1202 - margin-top: 6px;  
1203 - background: #e0e0e0;  
1204 - padding: 2px 7px;  
1205 - border-radius: 3px;  
1206 -}  
1207 -  
1208 -.uk-badge.sch_ldks {  
1209 - background: #8c8c8c;  
1210 - background-image: linear-gradient(to bottom, #a7a7a7, #8c8c8c);  
1211 -}  
1212 -  
1213 -.ct_layer_modal {  
1214 - background: #e5e5e5;  
1215 - height: 100%;  
1216 - width: 100%;  
1217 - overflow: auto;  
1218 -}  
1219 -  
1220 -.layui-layer-setwin {  
1221 -  
1222 -}  
1223 -  
1224 -.device_config_table dl dt:nth-of-type(1), .device_config_table dl dd:nth-of-type(1) {  
1225 - width: 7%;  
1226 - text-indent: 10px;  
1227 -}  
1228 -  
1229 -.device_config_table dl dt:nth-of-type(2), .device_config_table dl dd:nth-of-type(2) {  
1230 - width: 7%;  
1231 -}  
1232 -  
1233 -.device_config_table dl dt:nth-of-type(3), .device_config_table dl dd:nth-of-type(3) {  
1234 - width: 8%;  
1235 -}  
1236 -  
1237 -.device_config_table dl dt:nth-of-type(4), .device_config_table dl dd:nth-of-type(4) {  
1238 - width: 5%;  
1239 -}  
1240 -  
1241 -.device_config_table dl dt:nth-of-type(5), .device_config_table dl dd:nth-of-type(5) {  
1242 - width: 4%;  
1243 -}  
1244 -  
1245 -.device_config_table dl dt:nth-of-type(6), .device_config_table dl dd:nth-of-type(6) {  
1246 - width: 4%;  
1247 -}  
1248 -  
1249 -.device_config_table dl dt:nth-of-type(7), .device_config_table dl dd:nth-of-type(7) {  
1250 - width: 4%;  
1251 -}  
1252 -  
1253 -.device_config_table dl dt:nth-of-type(8), .device_config_table dl dd:nth-of-type(8) {  
1254 - width: 5%;  
1255 -}  
1256 -  
1257 -.device_config_table dl dt:nth-of-type(9), .device_config_table dl dd:nth-of-type(9) {  
1258 - width: 5%;  
1259 -}  
1260 -  
1261 -.device_config_table dl dt:nth-of-type(10), .device_config_table dl dd:nth-of-type(10) {  
1262 - width: 8%;  
1263 -}  
1264 -  
1265 -.device_config_table dl dt:nth-of-type(11), .device_config_table dl dd:nth-of-type(11) {  
1266 - width: 5%;  
1267 -}  
1268 -  
1269 -.device_config_table dl dt:nth-of-type(12), .device_config_table dl dd:nth-of-type(12) {  
1270 - width: 5%;  
1271 -}  
1272 -  
1273 -.device_config_table dl dt:nth-of-type(13), .device_config_table dl dd:nth-of-type(13) {  
1274 - width: 4%;  
1275 -}  
1276 -  
1277 -.device_config_table dl dt:nth-of-type(14), .device_config_table dl dd:nth-of-type(14) {  
1278 - width: 4%;  
1279 -}  
1280 -  
1281 -.device_config_table dl dt:nth-of-type(15), .device_config_table dl dd:nth-of-type(15) {  
1282 - width: 4%;  
1283 -}  
1284 -  
1285 -.device_config_table dl dt:nth-of-type(16), .device_config_table dl dd:nth-of-type(16) {  
1286 - width: 3%;  
1287 -}  
1288 -  
1289 -.device_config_table dl dt:nth-of-type(17), .device_config_table dl dd:nth-of-type(17) {  
1290 - width: 4%;  
1291 -}  
1292 -  
1293 -.device_config_table dl dt:nth-of-type(18), .device_config_table dl dd:nth-of-type(18) {  
1294 - width: 13%;  
1295 -}  
1296 -  
1297 -.uk-tooltip {  
1298 - z-index: 29999999 !important;  
1299 -}  
1300 -  
1301 -.device_config_table.ct_table dl dd,  
1302 -.device_config_table.ct_table dl dt {  
1303 - border-right: 1px solid #dedede !important;  
1304 -}  
1305 -  
1306 -.device_configs_manager .search_form {  
1307 - text-indent: 12px;  
1308 - margin-bottom: 0;  
1309 - padding: 18px 5px;  
1310 -}  
1311 -  
1312 -.sub_task_form_v2 {  
1313 - background: #f9f9f9;  
1314 - padding: 12px 15px;  
1315 - border-radius: 5px 0 5px 5px;  
1316 - border: 1px solid #dfdfdf;  
1317 - position: relative;  
1318 - margin-bottom: 20px;  
1319 -}  
1320 -  
1321 -.task_form_close_icon {  
1322 - background: #f9f9f9;  
1323 - padding: 0px 4px;  
1324 - position: absolute;  
1325 - top: -8px;  
1326 - right: -8px;  
1327 - color: #898989;  
1328 - font-size: 15px;  
1329 - border: 1px solid #dfdfdf;  
1330 - border-radius: 100%;  
1331 - border-left: none;  
1332 - border-bottom: none;  
1333 - transition: all .03s;  
1334 -}  
1335 -  
1336 -.task_form_close_icon:hover {  
1337 - border: 1px solid #ff1515;  
1338 - border-left: none;  
1339 - border-bottom: none;  
1340 - color: #e03e3e;  
1341 -}  
1342 -  
1343 -.sub_task_form_v2:hover::after {  
1344 - color: #5f5b5b;  
1345 -}  
1346 -  
1347 -.sub_task_form_v2.uk-form-horizontal .uk-form-label {  
1348 - width: 80px;  
1349 -}  
1350 -  
1351 -.sub_task_form_v2.uk-form-horizontal .uk-form-controls {  
1352 - margin-left: 85px;  
1353 -}  
1354 -  
1355 -.sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=text],  
1356 -.sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=time],  
1357 -.sub_task_form_v2.uk-form-horizontal .uk-form-controls select {  
1358 - width: 100%;  
1359 -}  
1360 -  
1361 -#add-sub-task-main-modal .uk-modal-footer {  
1362 - background: none;  
1363 - border-top: none;  
1364 -}  
1365 -  
1366 -#add-sub-task-main-modal .uk-grid + .uk-grid {  
1367 - margin-top: 12px;  
1368 -}  
1369 -  
1370 -#add-sub-task-main-modal .plus_icon_span {  
1371 - font-size: 26px;  
1372 - color: #b2b2b2;  
1373 - padding: 10px 64px;  
1374 - display: inline-block;  
1375 - border: 1px dashed grey;  
1376 - margin: 15px 0;  
1377 - border-radius: 5px;  
1378 - cursor: pointer;  
1379 -}  
1380 -  
1381 -#add-sub-task-main-modal .uk-animation-fade {  
1382 - animation-duration: .3s;  
1383 -}  
1384 -  
1385 -#add-sub-task-main-modal .forms {  
1386 - max-height: 642px;  
1387 - overflow-y: auto;  
1388 - overflow-x: hidden;  
1389 - padding: 8px 8px 0 0;  
1390 -}  
1391 -  
1392 -.add_custom_wrap .forms .sub_task_form_v2:last-child {  
1393 - margin-bottom: 0;  
1394 -}  
1395 -  
1396 -.sub_task_form_v2.destroy_form {  
1397 - background-color: #fff5f4 !important;  
1398 -}  
1399 -  
1400 -.uk-form > .half_change_car_box {  
1401 - margin: -10px 0 15px;  
1402 - padding: 3px 5px;  
1403 - display: inline-block;  
1404 - border: 1px solid #dfdddd;  
1405 - color: #918f8f;  
1406 -}  
1407 -  
1408 -.half_change_car_box input[type=checkbox] {  
1409 - vertical-align: top;  
1410 -}  
1411 -  
1412 -.uk-form > .half_change_car_box.active {  
1413 - background: #4CAF50;  
1414 - color: #fff;  
1415 -}  
1416 -  
1417 -.uk-form > .half_change_car_box.active input[type=checkbox] {  
1418 - background: #4caf50;  
1419 - border-color: #4caf50;  
1420 -}  
1421 -  
1422 -.uk-form > .half_change_car_box.active input[type=checkbox]:before {  
1423 - color: #ffffff;  
1424 -}  
1425 -  
1426 -.sub_task_form_v2.change_car {  
1427 - z-index: 99;  
1428 -}  
1429 -  
1430 -.st_range_top_form {  
1431 - padding: 0 0 15px 5px;  
1432 - border: 1px solid #c4bb76;  
1433 - background: #e5e1c1;  
1434 - margin-bottom: 15px;  
1435 - box-shadow: 0px 4px 3px 0 rgba(142, 138, 138, 0.2), 0px 4px 5px 0 rgba(157, 156, 156, 0.19);  
1436 -}  
1437 -  
1438 -.st_range_top_form .uk-form-row {  
1439 - margin-top: 20px;  
1440 -}  
1441 -  
1442 -.uk-form-horizontal.st_range_top_form .uk-form-label {  
1443 - width: 80px;  
1444 -}  
1445 -  
1446 -.uk-form-horizontal.st_range_top_form .uk-form-controls {  
1447 - margin-left: 84px;  
1448 -}  
1449 -  
1450 -.uk-form-horizontal.st_range_top_form .uk-form-controls select {  
1451 - width: calc(100% - 2px);  
1452 -}  
1453 -  
1454 -.sub_task_form_v2.service_st_form {  
1455 - background: #f4faff;  
1456 -}  
1457 -  
1458 -.uk-modal .uk-form.fv-form.sub_task_form_v2 {  
1459 - margin-bottom: 20px !important;  
1460 -}  
1461 -  
1462 -.sub_task_table_wrap .ct_table > .ct_table_body {  
1463 - border-bottom: none;  
1464 -}  
1465 -  
1466 -.err_panel {  
1467 - font-size: 12px;  
1468 - color: #7e7d7d;  
1469 - font-family: 微软雅黑;  
1470 - margin-top: 5px;  
1471 -}  
1472 -  
1473 -#schedule-lp_change-modal .ct_table dl {  
1474 - height: 35px;  
1475 -}  
1476 -  
1477 -#schedule-lp_change-modal .ct_table dl dd, #schedule-lp_change-modal .ct_table dl dt {  
1478 - line-height: 35px;  
1479 -}  
1480 -  
1481 -/*  
1482 -.sub_task_form_v2.repeat_main:before{  
1483 - content: '复';  
1484 - position: absolute;  
1485 - top: -10px;  
1486 - font-size: 12px;  
1487 - color: #2196F3;  
1488 - background: #ffffff;  
1489 - padding: 0 3px;  
1490 - font-weight: 600;  
1491 -}*/  
1492 -  
1493 -.sub_task_form_v2:before {  
1494 - position: absolute;  
1495 - top: -7px;  
1496 - font-size: 12px;  
1497 - padding: 0 3px;  
1498 - font-weight: 600;  
1499 - line-height: 14px;  
1500 -}  
1501 -  
1502 -.sub_task_form_v2.destroy_form:before {  
1503 - content: '烂班' !important;  
1504 - color: #f14235 !important;  
1505 - background: #ffffff !important;  
1506 -}  
1507 -  
1508 -.sub_task_form_v2.service_form:before {  
1509 - content: '营运';  
1510 - color: #2196F3;  
1511 - background: #ffffff;  
1512 -}  
1513 -  
1514 -.sub_task_form_v2.service_form.temp_service:before {  
1515 - content: '营运 (临加)';  
1516 - color: #9C27B0;  
1517 - background: #ffffff;  
1518 -}  
1519 -  
1520 -.sub_task_form_v2.service_form.temp_service {  
1521 - background: #faf0fd;  
1522 -}  
1523 -  
1524 -.sub_task_form_v2.empty_form:before {  
1525 - content: '空驶';  
1526 - color: #928f92;  
1527 - background: #ffffff;  
1528 -}  
1529 -  
1530 -.sub_task_form_v2.service_form {  
1531 - background: #f4faff;  
1532 -}  
1533 -  
1534 -/*.sub_task_form_v2.repeat_main.destroy_form:before{  
1535 - color: #F44336;  
1536 -}  
1537 -  
1538 -.sub_task_form_v2.repeat_main{  
1539 - background: #f4faff;  
1540 -}*/  
1541 -.footer_tools {  
1542 - position: absolute;  
1543 - left: 235px;  
1544 - bottom: 19px;  
1545 -}  
1546 -  
1547 -.footer_mileage_count {  
1548 - border: 1px solid #f2f2f2;  
1549 - padding: 5px;  
1550 - box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.2), 0px 2px 7px 0 rgba(0, 0, 0, 0.19);  
1551 - display: inline-block;  
1552 -}  
1553 -  
1554 -.footer_mileage_count > span {  
1555 - padding: 2px 5px;  
1556 -}  
1557 -  
1558 -.footer_mileage_count > span.service_sum {  
1559 - color: #2196F3;  
1560 -}  
1561 -  
1562 -.footer_mileage_count > span.empty_sum {  
1563 - color: #636363;  
1564 -}  
1565 -  
1566 -.footer_mileage_count > span.destroy_sum {  
1567 - color: #f5574b;  
1568 -}  
1569 -  
1570 -.station_to_park_link {  
1571 - display: inline-block;  
1572 - margin-left: 15px;  
1573 - vertical-align: bottom;  
1574 - font-size: 12px;  
1575 -}  
1576 -  
1577 -.station_to_park_link > a {  
1578 - color: #607D8B;  
1579 -}  
1580 -  
1581 -#station_to_park-modal.ct-form-modal form input[type=text],  
1582 -#station_to_park-modal.ct-form-modal form select {  
1583 - width: auto;  
1584 -}  
1585 -  
1586 -.s_2_park_form_wrap {  
1587 - background: #fafafa;  
1588 - border: 1px solid #e5e5e5;  
1589 - padding: 7px 16px;  
1590 - margin: 15px 0;  
1591 - position: relative;  
1592 -}  
1593 -  
1594 -.s_2_park_form_wrap .ct_close {  
1595 - position: absolute;  
1596 - top: -12px;  
1597 - padding: 0 4px;  
1598 - right: -8px;  
1599 - color: #939393;  
1600 - border: 1px solid #f7dfdf;  
1601 - border-radius: 25px;  
1602 - cursor: pointer;  
1603 -}  
1604 -  
1605 -.s_2_park_form_wrap .ct_close:hover {  
1606 - background: #e5e5e5;  
1607 - color: #fd6e6e;  
1608 -}  
1609 -  
1610 -.s_2_park_form_wrap label {  
1611 - color: #666;  
1612 - font-size: 13px;  
1613 -}  
1614 -  
1615 -#station_to_park-modal.ct-form-modal form input[readonly] {  
1616 - background: #fafafa;  
1617 -}  
1618 -  
1619 -.s_2_park_form_wrap .bottom_label {  
1620 - margin-top: 25px;  
1621 - display: block;  
1622 -}  
1623 -  
1624 -.s_2_park_form_wrap .bottom_label_2 {  
1625 - margin-top: 4px;  
1626 - display: block;  
1627 -}  
1628 -  
1629 -.ct_describe {  
1630 - font-size: 12px;  
1631 - color: #909090;  
1632 - font-family: FontAwesome;  
1633 -}  
1634 -  
1635 -.ct_describe:before {  
1636 - content: "\f059";  
1637 - margin-right: 3px;  
1638 -}  
1639 -  
1640 -#add-sub-task-main-modal abbr {  
1641 - display: inline-block;  
1642 - font-size: 12px;  
1643 - margin-left: 25px;  
1644 - vertical-align: bottom;  
1645 - color: #929292;  
1646 -}  
1647 -  
1648 -#all-devices-modal .search-form input[type=text] {  
1649 - width: 100px;  
1650 -}  
1651 -  
1652 -#all-devices-modal .auto-refresh {  
1653 - vertical-align: middle;  
1654 - margin-left: 5px;  
1655 - color: grey;  
1656 -}  
1657 -  
1658 -#all-devices-modal .auto-refresh.active {  
1659 - color: #405dff;  
1660 -}  
1661 -  
1662 -#all-devices-modal .uk-margin-small-top {  
1663 - margin-top: 0 !important;  
1664 -}  
1665 -  
1666 -#history-sch-maintain-modal .add_lp_link {  
1667 - display: inline-block;  
1668 - vertical-align: bottom;  
1669 - margin-left: 15px;  
1670 - text-decoration: underline;  
1671 - font-size: 13px;  
1672 -}  
1673 -  
1674 -#schedule-tzrc-modal input[type=checkbox] {  
1675 - margin-right: 9px;  
1676 -}  
1677 -  
1678 -#schedule-tzrc-modal span.ct_zt_yzx {  
1679 - color: #2196F3;  
1680 - font-size: 12px;  
1681 -}  
1682 -  
1683 -#schedule-tzrc-modal span.ct_zt_lb {  
1684 - color: red;  
1685 - font-size: 12px;  
1686 -}  
1687 -  
1688 -#schedule-tzrc-modal span.ct_zt_zzzx {  
1689 - font-size: 12px;  
1690 - color: #38ad3c;  
1691 -}  
1692 -  
1693 -#schedule-tzrc-modal .tzrc_form {  
1694 - padding: 20px;  
1695 - border: 1px solid #f0eded;  
1696 - box-shadow: 0px -3px 15px rgba(0, 0, 0, 0.08);  
1697 - background: #f9f9f9;  
1698 -}  
1699 -  
1700 -.uk-panel.ct_search_panel {  
1701 - padding: 15px;  
1702 - border: 1px solid #f0eded;  
1703 - box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.08);  
1704 - background: #f9f9f9;  
1705 -}  
1706 -  
1707 -.sch-tzrc-table.ct_table dl.active,  
1708 -.sch-tzrc-table.ct_table > .ct_table_body dl.active:hover {  
1709 - background: #5bd460;  
1710 - color: white;  
1711 -}  
1712 -  
1713 -#schedule-tzrc-modal dl.active span.ct_zt_yzx {  
1714 - color: #545252;  
1715 -}  
1716 -  
1717 -#schedule-tzrc-modal dl.active span.ct_zt_lb {  
1718 - color: #d64949;  
1719 -}  
1720 -  
1721 -#schedule-tzrc-modal dl.active span.ct_zt_zzzx {  
1722 - color: white;  
1723 -}  
1724 -  
1725 -#schedule-tzrc-modal dl.active input[type=checkbox] {  
1726 - border: 0;  
1727 -}  
1728 -  
1729 -#schedule-tzrc-modal dl.active input[type=checkbox]:before {  
1730 - color: #ffffff;  
1731 -}  
1732 -  
1733 -.sch-search-autocom input {  
1734 - padding: 0 !important;  
1735 - height: 100% !important;  
1736 -}  
1737 -  
1738 -label.blue_checkbox {  
1739 - margin-left: 12px;  
1740 -}  
1741 -  
1742 -label.blue_checkbox > input {  
1743 - width: 17px !important;  
1744 - height: 17px !important;  
1745 -}  
1746 -  
1747 -label.blue_checkbox > input:checked:before,  
1748 -label.blue_checkbox > input:indeterminate:before {  
1749 - line-height: 15px !important;  
1750 -}  
1751 -  
1752 -dd.disabled {  
1753 - color: #b5b3b3;  
1754 -}  
1755 -  
1756 -dl.active > dd.disabled {  
1757 - color: #ececec;  
1758 -}  
1759 -  
1760 -#change_user_options-modal .user_info {  
1761 - width: 360px;  
1762 - margin: auto;  
1763 -}  
1764 -  
1765 -.display_hide {  
1766 - display: none;  
1767 -}  
1768 -  
1769 -.ct_eye_icon {  
1770 - font-size: 16px;  
1771 - cursor: pointer;  
1772 -}  
1773 -  
1774 -.ct_eye_icon.active {  
1775 - color: #444;  
1776 -}  
1777 -  
1778 -#tempScheduleContent .forms::-webkit-scrollbar {  
1779 - width: 19px;  
1780 - height: 16px;  
1781 -}  
1782 -  
1783 -.range_2_normal_tt {  
1784 - margin-bottom: 15px;  
1785 - border-top: 1px dashed #c7c7c7;  
1786 - color: #a6a6a6;  
1787 - text-indent: 7px;  
1788 - padding-bottom: 5px;  
1789 -}  
1790 -  
1791 -.cancel_link {  
1792 - font-size: 12px;  
1793 - margin-left: 15px;  
1794 - vertical-align: bottom;  
1795 - color: #8d8d8d;  
1796 - text-decoration: underline;  
1797 - position: absolute;  
1798 - right: 0;  
1799 -}  
1800 -  
1801 -.edit_link {  
1802 - font-size: 12px;  
1803 - margin-left: 15px;  
1804 - vertical-align: bottom;  
1805 - color: #ff2f2f;  
1806 - text-decoration: underline;  
1807 -}  
1808 -  
1809 -.c_b_abnorm_notice {  
1810 - position: absolute;  
1811 - bottom: 0;  
1812 - margin: auto;  
1813 - width: 351px;  
1814 - padding: 7px;  
1815 - background: #ffffff;  
1816 - box-shadow: 5px 5px 15px rgba(90, 90, 90, 0.48);  
1817 - max-height: 125px;  
1818 - overflow-y: auto;  
1819 - min-height: 40px;  
1820 -}  
1821 -  
1822 -.c_b_abnorm_notice:before {  
1823 - content: "-超速报警-";  
1824 - color: #000000;  
1825 - font-size: 12px;  
1826 - font-family: 微软雅黑;  
1827 - position: fixed;  
1828 - background: #ffd967;  
1829 - margin-top: -10px;  
1830 - margin-left: -6px;  
1831 - padding: 0 7px;  
1832 - box-shadow: 2px 4px 7px rgba(90, 90, 90, 0.25);  
1833 -}  
1834 -  
1835 -.c_b_item {  
1836 - margin: 7px 0;  
1837 - padding: 7px 12px;  
1838 - box-shadow: 0px 0px 10px rgba(90, 90, 90, 0.29);  
1839 - color: #FF5722;  
1840 - cursor: pointer;  
1841 -}  
1842 -  
1843 -.c_b_abnorm_notice > .c_b_item:first-child {  
1844 - margin-top: 20px;  
1845 -}  
1846 -  
1847 -.c_b_item.over {  
1848 - color: grey;  
1849 -}  
1850 -  
1851 -.c_b_item > span.c_b_over {  
1852 - float: right;  
1853 -}  
1854 -  
1855 -.mileage_elec_panel {  
1856 - position: absolute;  
1857 - width: 100%;  
1858 - /*height: 90px;*/  
1859 - z-index: 1;  
1860 - background: white;  
1861 - bottom: 0px;  
1862 - box-shadow: 1px 0px 15px rgba(90, 90, 90, 0.48);  
1863 - padding: 9px 15px;  
1864 - border-radius: 0 5px;  
1865 - color: #000;  
1866 -  
1867 - display: none;  
1868 -}  
1869 -  
1870 -.mileage_elec_panel ._title {  
1871 - margin: 5px 3px;  
1872 - font-size: 15px;  
1873 -}  
1874 -  
1875 -.mileage_elec_panel .LD_item {  
1876 - margin: 5px 0;  
1877 - font-family: 微软雅黑;  
1878 -}  
1879 -  
1880 -.mileage_elec_panel .LD_item > span {  
1881 - padding: 3px;  
1882 - display: inline-block;  
1883 - width: 85px;  
1884 -}  
1885 -  
1886 -.mileage_elec_panel .lp_name {  
1887 - padding: 0 5px;  
1888 - background: #f2f2f2;  
1889 - border-radius: 15px  
1890 -}  
1891 -  
1892 -.mileage_elec_panel .LD_item > span > a {  
1893 - color: #000;  
1894 -}  
1895 -  
1896 -.mileage_elec_panel .LD_item > span:nth-of-type(1) > a {  
1897 - color: blue;  
1898 -}  
1899 -  
1900 -/*.mileage_elec_panel .LD_item>span:nth-of-type(2)>a{  
1901 - color: #fa3a2c;  
1902 -}  
1903 -  
1904 -.mileage_elec_panel .LD_item>span:nth-of-type(3)>a{  
1905 - color: #515151;  
1906 -}*/  
1907 -  
1908 -.mileage_elec_panel hr {  
1909 - height: 1px;  
1910 - border: none;  
1911 - border-top: 1px dashed #b5b5b5;  
1912 -}  
1913 -  
1914 -#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-label {  
1915 - width: 70px;  
1916 -}  
1917 -  
1918 -#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-controls {  
1919 - margin-left: 75px;  
1920 -}  
1921 -  
1922 -#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid + .uk-grid,  
1923 -#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid-margin,  
1924 -#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid > * > .uk-panel + .uk-panel {  
1925 - margin-top: 22px;  
1926 -}  
1927 -  
1928 -.c_task_mileage_abnormal,  
1929 -.c_task_mileage_abnormal .ct_table > .ct_table_head dl,  
1930 -.c_task_mileage_abnormal .ct_table dl {  
1931 - background: #ffe7e7 !important;  
1932 -}  
1933 -  
1934 -.tip_task_count_dl {  
1935 - width: calc(100% + 22px) !important;  
1936 - margin-left: -11px !important;  
1937 - border-top: 1px solid #e6e6e6 !important;  
1938 -}  
1939 -  
1940 -.tip_task_count_dl > dd:last-child {  
1941 - width: calc(100% - 50px) !important;  
1942 - border-right: 0 !important;  
1943 - height: 35px !important;  
1944 - background: #f3f3f3;  
1945 - margin-bottom: -3px;  
1946 -}  
1947 -  
1948 -.tip_task_count_dl > dd:nth-of-type(1) {  
1949 - text-align: center;  
1950 - border-right: 0 !important;  
1951 - width: 48px !important;  
1952 -}  
1953 -  
1954 -.tip_task_count_dl > dd:nth-of-type(1) > i {  
1955 - padding: 6px;  
1956 - cursor: pointer;  
1957 -}  
1958 -  
1959 -.tip_task_count_dl > dd:nth-of-type(1) > i:hover {  
1960 - background: #ebebeb;  
1961 -}  
1962 -  
1963 -.tip_task_count_dl.c_task_error > dd:last-child {  
1964 - background: #ff8a81;  
1965 -}  
1966 -  
1967 -.tip_task_count_dl > dd > span {  
1968 - font-size: 13px;  
1969 - color: #000;  
1970 - height: 55px;  
1971 - display: inline-block;  
1972 - padding: 7px 0;  
1973 - border-radius: 0;  
1974 - text-indent: 12px;  
1975 -}  
1976 -  
1977 -.tip_task_list > dl:nth-last-child(2) {  
1978 - border-bottom: 0 !important;  
1979 -}  
1980 -  
1981 -.c_task_mileage_error {  
1982 - border: 1px solid rgba(218, 13, 13, 0.2);  
1983 - border-bottom-color: rgba(213, 37, 37, 0.3);  
1984 - background-image: -webkit-linear-gradient(top, #ff6155, #F44336);  
1985 -}  
1986 -  
1987 -.uk-badge.c_task.c_task_mileage_error:hover:hover {  
1988 - background-image: none;  
1989 - background: #ff6155;  
1990 - border: 1px solid rgba(213, 37, 37, 0.3);  
1991 -}  
1992 -  
1993 -.grey_link {  
1994 - color: #adabab;  
1995 -}  
1996 -  
1997 -#sch_car_info_all-modal tr.ct_active {  
1998 - -moz-animation: twinkle_bg .9s ease-in-out;  
1999 - -webkit-animation: twinkle_bg .9s ease-in-out;  
2000 -}  
2001 -  
2002 -#sch_car_info_all-modal .uk-table-hover tr:hover{  
2003 - background: #dddddd;  
2004 -}  
2005 -  
2006 -@-moz-keyframes twinkle_bg {  
2007 - 0% {  
2008 - background: rgba(254, 235, 69, 0.38);  
2009 - }  
2010 - 25% {  
2011 - background: rgba(254, 235, 69, 0.7);  
2012 - }  
2013 - 50% {  
2014 - background: rgba(254, 235, 69, 0.3);  
2015 - }  
2016 - 75% {  
2017 - background: rgba(254, 235, 69, 0.7);  
2018 - }  
2019 - 100% {  
2020 - background: rgba(254, 235, 69, 0.38);  
2021 - }  
2022 -}  
2023 -  
2024 -@-webkit-keyframes twinkle_bg {  
2025 - 0% {  
2026 - background: rgba(254, 235, 69, 0.38);  
2027 - }  
2028 - 25% {  
2029 - background: rgba(254, 235, 69, 0.7);  
2030 - }  
2031 - 50% {  
2032 - background: rgba(254, 235, 69, 0.3);  
2033 - }  
2034 - 75% {  
2035 - background: rgba(254, 235, 69, 0.7);  
2036 - }  
2037 - 100% {  
2038 - background: rgba(254, 235, 69, 0.38);  
2039 - }  
2040 -}  
2041 -  
2042 -.home_svg_tips>div{  
2043 - overflow: hidden;  
2044 - text-overflow: ellipsis;  
2045 - white-space: nowrap;  
2046 -}  
2047 -  
2048 -.tab-line.destroy>a{  
2049 - background: #ff5c5c;  
2050 - color: #fff !important;  
2051 - border-radius: 0;  
2052 -}  
2053 -  
2054 -.tab-line.destroy>a:hover{  
2055 - background: #ff3333 !important;  
2056 - border-color: #ff3333 !important;  
2057 -}  
2058 -  
2059 -.uk-tab>li.uk-active.destroy>a{  
2060 - color: red !important;  
2061 -}  
2062 -  
2063 -.uk-tab>li.uk-active.destroy>a:hover{  
2064 - background: #fff !important;  
2065 -}  
2066 -  
2067 -.warn_multi_station{  
2068 - font-size: 12px;  
2069 - margin-left: 40px;  
2070 - background: yellow;  
2071 - color: #1c1c1c;  
2072 - padding: 4px 10px;  
2073 - cursor: pointer;  
2074 - display: none;  
2075 -}  
2076 -  
2077 -.warn_multi_station:hover{  
2078 - background: #f8f81e;  
2079 -}  
2080 -  
2081 -.tp_info_icon{  
2082 - font-size: 14px;  
2083 - cursor: pointer;  
2084 -}  
2085 -  
2086 -g.gps-wrap rect.twinkle[updown="0"] {  
2087 - animation: anim_bg_twinkle_up 1.4s;  
2088 -}  
2089 -  
2090 -@keyframes anim_bg_twinkle_up {  
2091 - 0% {  
2092 - fill: yellow;  
2093 - stroke: yellow;  
2094 - }  
2095 - 25% {  
2096 - stroke: rgb(62, 80, 179);  
2097 - fill: rgb(62, 80, 179);  
2098 - }  
2099 - 50% {  
2100 - fill: yellow;  
2101 - stroke: yellow;  
2102 - }  
2103 - 100% {  
2104 - stroke: rgb(62, 80, 179);  
2105 - fill: rgb(62, 80, 179);  
2106 - }  
2107 -}  
2108 -  
2109 -g.gps-wrap rect.twinkle[updown="1"] {  
2110 - animation: anim_bg_twinkle_down 1.4s;  
2111 -}  
2112 -  
2113 -@keyframes anim_bg_twinkle_down {  
2114 - 0% {  
2115 - fill: yellow;  
2116 - stroke: yellow;  
2117 - }  
2118 - 25% {  
2119 - stroke: #c94f21;  
2120 - fill: #c94f21;  
2121 - }  
2122 - 50% {  
2123 - fill: yellow;  
2124 - stroke: yellow;  
2125 - }  
2126 - 100% {  
2127 - stroke: #c94f21;  
2128 - fill: #c94f21;  
2129 - } 1 +input::-webkit-outer-spin-button,
  2 +input::-webkit-inner-spin-button {
  3 + display: none;
  4 +}
  5 +
  6 +input::-webkit-calendar-picker-indicator {
  7 + display: none;
  8 +}
  9 +
  10 +input::-webkit-datetime-edit {
  11 + padding: 1px;
  12 +}
  13 +
  14 +.ps-container > .ps-scrollbar-y-rail {
  15 + z-index: 1 !important;
  16 +}
  17 +
  18 +.ps-container > .ps-scrollbar-x-rail,
  19 +.ps-container > .ps-scrollbar-y-rail {
  20 + opacity: 0.6 !important;
  21 + padding: 0 !important;
  22 +}
  23 +
  24 +/* ^_^ baidu map hide logo */
  25 +.anchorBL, .anchorBL, .amap-logo, .amap-copyright {
  26 + display: none;
  27 +}
  28 +
  29 +audio, canvas, img, svg, video {
  30 + max-width: none;
  31 +}
  32 +
  33 +html, body {
  34 + width: 100%;
  35 + height: 100%;
  36 + overflow: hidden;
  37 + margin-left: 0 !important;
  38 +}
  39 +
  40 +.main-container {
  41 + height: calc(100% - 120px);
  42 +}
  43 +
  44 +#main-tab-content {
  45 + height: 100%;
  46 + margin-bottom: 0;
  47 +}
  48 +
  49 +::-webkit-scrollbar {
  50 + width: 15px;
  51 + height: 16px;
  52 +}
  53 +
  54 +::-webkit-scrollbar-track, ::-webkit-scrollbar-thumb {
  55 + border-radius: 999px;
  56 + border: 5px solid transparent;
  57 +}
  58 +
  59 +::-webkit-scrollbar-track {
  60 + box-shadow: 1px 1px 5px rgba(0, 0, 0, .2) inset;
  61 +}
  62 +
  63 +::-webkit-scrollbar-thumb {
  64 + min-height: 20px;
  65 + background-clip: content-box;
  66 + box-shadow: 0 0 0 5px rgba(0, 0, 0, .2) inset;
  67 +}
  68 +
  69 +::-webkit-scrollbar-corner {
  70 + background: transparent;
  71 +}
  72 +
  73 +.uk-modal .uk-form.fv-form, .uk-modal .ct-modal-body {
  74 + margin-bottom: -20px !important;
  75 +}
  76 +
  77 +.uk-modal .uk-form.fv-form.fixed-tool {
  78 + width: 100%;
  79 + position: relative;
  80 + height: 100%;
  81 +}
  82 +
  83 +.uk-modal .ct-modal-body .uk-modal-footer {
  84 + margin-left: 0;
  85 +}
  86 +
  87 +.uk-modal .uk-form.fv-form.fixed-tool .uk-modal-footer {
  88 + position: absolute;
  89 + bottom: 0;
  90 + width: calc(100% - 20px);
  91 +}
  92 +
  93 +table.ct-fixed-table {
  94 + table-layout: fixed;
  95 +}
  96 +
  97 +table.ct-fixed-table tr.context-menu-active {
  98 + background: #f0f0f0;
  99 +}
  100 +
  101 +table.ct-fixed-table.uk-table tr td {
  102 + white-space: nowrap;
  103 + overflow: hidden;
  104 + text-overflow: ellipsis;
  105 +}
  106 +
  107 +table.ct-fixed-table.uk-table .uk-badge {
  108 + padding: 2px 5px;
  109 +}
  110 +
  111 +.horizontal-field {
  112 + vertical-align: middle;
  113 + margin: 0 5px;
  114 +}
  115 +
  116 +.legend-tools {
  117 + float: right;
  118 + font-size: 11px;
  119 +}
  120 +
  121 +.legend-tools a.uk-icon-small {
  122 + margin: 0 5px;
  123 + cursor: pointer;
  124 +}
  125 +
  126 +.text-succ {
  127 + color: #659f13;
  128 +}
  129 +
  130 +.text-err {
  131 + color: red;
  132 +}
  133 +
  134 +.text-grey {
  135 + color: grey;
  136 +}
  137 +
  138 +svg.line-chart {
  139 + width: 100%;
  140 + height: 100%;
  141 + position: absolute;
  142 + left: 0;
  143 +}
  144 +
  145 +svg.line-chart circle.station_circle {
  146 + fill: #5e96d2;
  147 + r: 5.5;
  148 + stroke: rgb(253, 253, 253);
  149 + stroke-width: 3;
  150 + Pointer-events: none;
  151 +}
  152 +
  153 +svg.line-chart circle.station_circle.down {
  154 + fill: #c92121;
  155 +}
  156 +
  157 +svg.line-chart path.station_link {
  158 + stroke-width: 3.5px;
  159 + stroke: #5E96D2;
  160 + Pointer-events: none;
  161 +}
  162 +
  163 +svg.line-chart path.station_link.down {
  164 + stroke: #c92121;
  165 +}
  166 +
  167 +svg.line-chart path.station_link.down.loop_line {
  168 + stroke-dasharray: 4, 3;
  169 + stroke-width: 1px;
  170 +}
  171 +
  172 +svg.line-chart text.station_text {
  173 + writing-mode: tb;
  174 + fill: #3e3e3e;
  175 + letter-spacing: -.2px;
  176 + text-shadow: 0 0 2px #dadada;
  177 + Pointer-events: none;
  178 +}
  179 +
  180 +svg.line-chart text.station_text.up {
  181 + fill: #4556b6;
  182 +}
  183 +
  184 +svg.line-chart text.station_text.down {
  185 + fill: #c94f21;
  186 +}
  187 +
  188 +svg.line-chart g.item:first-child > text {
  189 + stroke: #6f6e6e;
  190 + fill: none;
  191 +}
  192 +
  193 +svg.line-chart g.item:nth-last-child(3) > text {
  194 + stroke: #6f6e6e;
  195 + fill: none;
  196 +}
  197 +
  198 +svg.line-chart g.item:first-child > text.up,
  199 +svg.line-chart g.item:nth-last-child(3) > text.up {
  200 + stroke: #4556b6;
  201 +}
  202 +
  203 +svg.line-chart g.item:first-child > text.down,
  204 +svg.line-chart g.item:nth-last-child(3) > text.down {
  205 + stroke: #c94f21;
  206 +}
  207 +
  208 +svg.line-chart g.gps-wrap > rect {
  209 + width: 30px;
  210 + height: 15px;
  211 + /* fill: #fff; */
  212 + rx: 2px;
  213 + cursor: pointer;
  214 +}
  215 +
  216 +svg.line-chart g.gps-wrap > rect[updown="0"] {
  217 + stroke: rgb(62, 80, 179);
  218 + fill: rgb(62, 80, 179);
  219 +}
  220 +
  221 +svg.line-chart g.gps-wrap > rect[updown="1"] {
  222 + stroke: #c94f21;
  223 + fill: #c94f21;
  224 +}
  225 +
  226 +svg.line-chart g.gps-wrap > rect.hover {
  227 + stroke-width: 2;
  228 +}
  229 +
  230 +svg.line-chart g.gps-wrap > text {
  231 + font-size: 12px;
  232 + transform: translate(0, 12px);
  233 + pointer-events: none;
  234 +}
  235 +
  236 +svg.line-chart g.gps-wrap > text[updown="0"] {
  237 + fill: #fff;
  238 +}
  239 +
  240 +svg.line-chart g.gps-wrap > text[updown="1"] {
  241 + fill: #fff;
  242 +}
  243 +
  244 +svg.line-chart g.gps-wrap > rect.abnormal[updown="0"],
  245 +svg.line-chart g.gps-wrap > rect.abnormal[updown="1"] {
  246 + width: 40px;
  247 + fill: yellow;
  248 + stroke: yellow;
  249 +}
  250 +
  251 +svg.line-chart g.gps-wrap > text.abnormal[updown="0"],
  252 +svg.line-chart g.gps-wrap > text.abnormal[updown="1"] {
  253 + fill: black;
  254 +}
  255 +
  256 +svg.line-chart .merge_hide {
  257 + display: none !important;
  258 +}
  259 +
  260 +svg.line-chart g.merge-item rect {
  261 + width: 22px;
  262 + height: 22px;
  263 + rx: 15px;
  264 + fill: #19a53a;
  265 + cursor: pointer;
  266 + stroke: #19a53a;
  267 + stroke-dasharray: 1, 2;
  268 + stroke-width: 3px;
  269 +}
  270 +
  271 +svg.line-chart g.merge-item text {
  272 + fill: #fff;
  273 + pointer-events: none;
  274 +}
  275 +
  276 +.qtip-multi-gps {
  277 + max-width: 720px !important;
  278 +}
  279 +
  280 +.qtip-bootstrap.qtip-multi-gps .qtip-content {
  281 + padding: 0;
  282 +}
  283 +
  284 +.tooltip {
  285 + position: relative;
  286 + padding-bottom: 160px;
  287 + width: 220px;
  288 +}
  289 +
  290 +.multi-tooltip-wrap {
  291 + width: 100%;
  292 + max-height: 350px;
  293 + overflow: auto;
  294 +}
  295 +
  296 +.tip_map_wrap.multi {
  297 + width: 100%;
  298 + height: 130px;
  299 +}
  300 +
  301 +.tooltip.multi-tooltip {
  302 + width: 160px;
  303 + display: inline-block;
  304 + padding: 10px 0 10px 12px;
  305 + border-right: 1px solid #eeeeee;
  306 + border-bottom: 1px solid #eeeeee;
  307 +}
  308 +
  309 +.tooltip hr {
  310 + border-top: 1px solid #eeeeee;
  311 + width: calc(100% + 30px);
  312 + margin: 7px 0 11px -15px;
  313 +}
  314 +
  315 +.tooltip.multi-tooltip hr {
  316 + width: calc(100% + 16px);
  317 +}
  318 +
  319 +.tooltip .tooltip-container {
  320 + padding: 1px;
  321 +}
  322 +
  323 +.tooltip .tooltip-container div, .tooltip .tooltip-container div a {
  324 + margin: 7px 1px;
  325 + font-size: 13px;
  326 + color: rgb(76, 76, 76);
  327 +}
  328 +
  329 +.tooltip .tooltip-container div.title {
  330 + margin: 8px 1px 12px;
  331 +}
  332 +
  333 +.tooltip .tooltip-container .title a {
  334 + font-size: 18px;
  335 + font-family: 微软雅黑;
  336 +}
  337 +
  338 +.tooltip span.field {
  339 + color: #7d7d7b;
  340 + margin-right: 5px;
  341 + width: 52px;
  342 + display: inline-block;
  343 + text-align: right;
  344 +}
  345 +
  346 +.tooltip .tip_map_wrap {
  347 + position: absolute;
  348 + bottom: -16px;
  349 + left: -15px;
  350 + width: calc(100% + 28px);
  351 + background: #fff;
  352 + height: 165px;
  353 + border-radius: 0 0 5px 5px;
  354 + border-top: 1px solid #e6e4e4;
  355 +}
  356 +
  357 +canvas.crosshair-layer {
  358 + position: absolute;
  359 + width: 100%;
  360 + height: 100%;
  361 + background: rgba(255, 255, 255, 0.33);
  362 + left: 0;
  363 +}
  364 +
  365 +li.map-panel {
  366 + height: 100%;
  367 + position: relative;
  368 +}
  369 +
  370 +.main-container .load-panel {
  371 + display: block;
  372 + color: #999797;
  373 +}
  374 +
  375 +.uk-panel-box-danger {
  376 + background-color: #fff1f0;
  377 + /*color: #d85030;*/
  378 + border-color: rgba(216, 80, 48, .3);
  379 +}
  380 +
  381 +/*.uk-panel-box-danger .uk-panel-title {
  382 + color: #d85030;
  383 +}*/
  384 +
  385 +.uk-badge-default {
  386 + background-color: #a09b9c;
  387 + background-image: -webkit-linear-gradient(top, #9a9898, #8c8687);
  388 + background-image: linear-gradient(to bottom, #9a9898, #8c8687);
  389 +}
  390 +
  391 +.ct-bottom-drawer {
  392 + width: 100%;
  393 + background: rgb(255, 255, 255);
  394 + position: fixed;
  395 + bottom: 0;
  396 + box-shadow: 0 0 10px rgba(0, 0, 0, .3);
  397 + transition: all .3s ease;
  398 + height: 0;
  399 +}
  400 +
  401 +.ct-bottom-drawer.open {
  402 + height: 320px;
  403 +}
  404 +
  405 +.ct-bottom-drawer a.ct-bottom-drawer-close {
  406 + position: absolute;
  407 + right: 10px;
  408 + top: 10px;
  409 + color: #c3c3c3;
  410 + width: 20px;
  411 + line-height: 20px;
  412 + background: #fff;
  413 + text-align: center;
  414 + z-index: 99;
  415 +}
  416 +
  417 +.ct-bottom-drawer a.ct-bottom-drawer-close:hover {
  418 + text-decoration: none;
  419 + color: grey;
  420 +}
  421 +
  422 +.ct-bottom-drawer a.ct-bottom-drawer-close:after {
  423 + display: block;
  424 + content: "\f00d";
  425 + font-family: FontAwesome;
  426 +}
  427 +
  428 +.ct-bottom-drawer-body {
  429 + width: 100%;
  430 + height: 100%;
  431 +}
  432 +
  433 +#station_route_spacing_chart_drawer .svg_wrap {
  434 + width: 80%;
  435 + height: 100%;
  436 + display: inline-block;
  437 + font-size: 14px;
  438 + overflow: hidden;
  439 + position: relative;
  440 +}
  441 +
  442 +#station_route_spacing_chart_drawer .drawer_right_map {
  443 + width: 20%;
  444 + height: 100%;
  445 + display: inline-block;
  446 +}
  447 +
  448 +#station_route_spacing_chart_drawer .svg_cont_body {
  449 + height: 100%;
  450 + position: absolute;
  451 + top: 0;
  452 + left: 0;
  453 +}
  454 +
  455 +#station_route_spacing_chart_drawer svg {
  456 + width: 100%;
  457 + height: 100%;
  458 +}
  459 +
  460 +#station_route_spacing_chart_drawer svg g._item rect {
  461 + stroke: rgb(62, 80, 179);
  462 + fill: rgb(62, 80, 179);
  463 + width: 30px;
  464 + height: 124px;
  465 + rx: 5;
  466 + transform: translate(-15px);
  467 +}
  468 +
  469 +#station_route_spacing_chart_drawer svg g._item text {
  470 + writing-mode: tb;
  471 + transform: translate(0, 9px);
  472 + fill: #fff;
  473 +}
  474 +
  475 +#station_route_spacing_chart_drawer svg g._item path {
  476 + stroke-width: 5.4px;
  477 + stroke: #3e50b3;
  478 +}
  479 +
  480 +#station_route_spacing_chart_drawer svg g._item circle {
  481 + r: 3px;
  482 + fill: #ffffff;
  483 +}
  484 +
  485 +#station_route_spacing_chart_drawer svg g._item path.arc_path {
  486 + stroke-width: 1.3px;
  487 + stroke: #3e50b3;
  488 + stroke-dasharray: 1000;
  489 + stroke-dashoffset: 1000;
  490 + fill: none;
  491 +
  492 + animation: dash .9s;
  493 + webkit-amimation: dash .9s;
  494 + animation-fill-mode: forwards;
  495 + -webkit-animation-fill-mode: forwards;
  496 +}
  497 +
  498 +@keyframes dash {
  499 + to {
  500 + stroke-dashoffset: 0;
  501 + stroke-dasharray: 4, 4;
  502 + }
  503 +}
  504 +
  505 +@-webkit-keyframes dash {
  506 + to {
  507 + stroke-dashoffset: 0;
  508 + stroke-dasharray: 4, 4;
  509 + }
  510 +}
  511 +
  512 +#station_route_spacing_chart_drawer svg g._item text.distance_text {
  513 + writing-mode: horizontal-tb;
  514 + fill: #3e50b3;
  515 +}
  516 +
  517 +#station_route_spacing_chart_drawer svg g._item rect.distance_rect {
  518 + height: 20px;
  519 + width: 40px;
  520 + fill: #fff !important;
  521 + stroke-width: 0;
  522 +}
  523 +
  524 +#station_route_spacing_chart_drawer .tl_desc_text {
  525 + position: absolute;
  526 + top: 5px;
  527 + left: 5px;
  528 + font-size: 12px;
  529 + color: #525050;
  530 + font-family: 微软雅黑;
  531 +}
  532 +
  533 +#station_route_spacing_chart_drawer svg g._item:first-child circle {
  534 + fill: #3e50b3;
  535 + r: 6px;
  536 +}
  537 +
  538 +#station_route_spacing_chart_drawer svg g._item:last-child circle {
  539 + fill: #3e50b3;
  540 + r: 6px;
  541 +}
  542 +
  543 +/* 下行 */
  544 +#station_route_spacing_chart_drawer svg.down g._item rect {
  545 + stroke: #dd3829;
  546 + fill: #dd3829;
  547 +}
  548 +
  549 +#station_route_spacing_chart_drawer svg.down g._item path {
  550 + stroke: #dd3829;
  551 +}
  552 +
  553 +#station_route_spacing_chart_drawer svg.down g._item:first-child circle {
  554 + fill: #dd3829;
  555 +}
  556 +
  557 +#station_route_spacing_chart_drawer svg.down g._item text.distance_text {
  558 + fill: #dd3829;
  559 +}
  560 +
  561 +#station_route_spacing_chart_drawer svg.down g._item path.arc_path {
  562 + stroke: #dd3829;
  563 +}
  564 +
  565 +#station_route_spacing_chart_drawer svg.down g._item:last-child circle {
  566 + fill: #dd3829;
  567 +}
  568 +
  569 +.svg-edit-panel-wrap {
  570 + width: 48%;
  571 + border: 1px solid #e1d3d3;
  572 + padding: 12px 0 0 0;
  573 + border-radius: 4px;
  574 + position: relative;
  575 + display: inline-block;
  576 + vertical-align: top;
  577 + height: 440px;
  578 +}
  579 +
  580 +.svg-edit-panel-wrap .title-badge {
  581 + position: absolute;
  582 + top: -10px;
  583 + left: 7px;
  584 + font-size: 13px;
  585 + background: #fff;
  586 + padding: 0 3px;
  587 + color: #888888;
  588 +}
  589 +
  590 +.svg-edit-panel-wrap .rename-tools {
  591 + height: 21px;
  592 + padding: 0 0 0 9px;
  593 +}
  594 +
  595 +.svg-edit-panel-wrap .rename-item-panel {
  596 + border-bottom: 1px solid #ede5e5;
  597 + padding: 4px;
  598 +}
  599 +
  600 +.svg-edit-panel-wrap .rename-item-panel select {
  601 + width: 150px;
  602 +}
  603 +
  604 +.svg-edit-panel-wrap .rename-item-panel input {
  605 + margin-left: 7px;
  606 +}
  607 +
  608 +.svg-edit-panel-wrap .rename-item-panel input[type=checkbox] {
  609 + margin-top: 2px;
  610 + margin-right: 4px;
  611 +}
  612 +
  613 +.svg-edit-panel-wrap .rename-item-panel.active {
  614 + background: #65c9f8;
  615 + box-shadow: 0px 3px 7px 0 rgba(101, 201, 248, 0.48), 0px 1px 4px 0 rgba(101, 201, 248, 0.32);
  616 +}
  617 +
  618 +.svg-edit-panel-wrap .rename-item-panel.active select,
  619 +.svg-edit-panel-wrap .rename-item-panel.active input {
  620 + background: #65c9f8;
  621 + color: #fff;
  622 +}
  623 +
  624 +.svg-edit-panel-wrap .rename-item-panel.active i {
  625 + color: #e4f6ff;
  626 +}
  627 +
  628 +.svg-edit-panel-wrap .rename-item-panel.active input[type=checkbox] {
  629 + border: none;
  630 +}
  631 +
  632 +.svg-edit-panel-wrap .rename-item-panel.active input[type=checkbox]:before {
  633 + color: #fff;
  634 +}
  635 +
  636 +.svg-edit-panel-wrap .rename-tools a {
  637 + font-size: 14px;
  638 + padding: 5px;
  639 +}
  640 +
  641 +.svg-edit-panel-wrap .rename-tools a:hover {
  642 + background: #e8edef;
  643 + border-radius: 5px;
  644 +}
  645 +
  646 +.station-list {
  647 + width: 190px;
  648 + padding: 2px 7px;
  649 + height: 100%;
  650 + overflow: auto;
  651 + display: inline-block;
  652 +}
  653 +
  654 +.station-list .station-item {
  655 + padding: 3px 0;
  656 + margin: 5px 0;
  657 + border-radius: 3px;
  658 + font-size: 13px;
  659 + text-indent: 7px;
  660 + cursor: pointer;
  661 + white-space: nowrap;
  662 + overflow: hidden;
  663 + text-overflow: ellipsis;
  664 +}
  665 +
  666 +.station-list .station-item.disable,
  667 +.station-list .station-item.disable:hover {
  668 + background: #d5c9c9 !important;
  669 + color: #686565 !important;
  670 +}
  671 +
  672 +.station-list.up .station-item {
  673 + background: #5364c3;
  674 + color: white;
  675 +}
  676 +
  677 +.station-list.up .station-item:hover {
  678 + box-shadow: 0px 3px 6px 0 rgba(0, 0, 0, 0.2), 0px 1px 4px 0 rgba(0, 0, 0, 0.19);
  679 + background: #4556b6;
  680 +}
  681 +
  682 +.station-list.down .station-item {
  683 + background: #f95858;
  684 + color: white;
  685 +}
  686 +
  687 +.station-list.down .station-item:hover {
  688 + box-shadow: 0px 3px 6px 0 rgba(0, 0, 0, 0.2), 0px 1px 4px 0 rgba(0, 0, 0, 0.19);
  689 + background: #e95151;
  690 +}
  691 +
  692 +.modal-dotted-hr {
  693 + height: 1px;
  694 + border: none;
  695 + border-top: 1px dashed #d1d1d1;
  696 + width: calc(100% + 40px);
  697 + margin-left: -20px;
  698 +}
  699 +
  700 +#add-sub-task-range_turn-modal .main-sch-panel {
  701 + height: 60px;
  702 + border: 1px solid #dddddd;
  703 + border-radius: 5px;
  704 + position: relative;
  705 + padding: 20px 0 0 8px;
  706 +}
  707 +
  708 +#add-sub-task-range_turn-modal .main-sch-panel:before {
  709 + content: '主任务';
  710 + position: absolute;
  711 + top: -10px;
  712 + left: 10px;
  713 + background: #fff;
  714 + padding: 0 4px;
  715 + font-size: 12px;
  716 + color: #adadad;
  717 +}
  718 +
  719 +.ct_row {
  720 + font-size: 0;
  721 +}
  722 +
  723 +.ct_row .ct_cell {
  724 + display: inline-block;
  725 + font-size: 13px;
  726 + white-space: nowrap;
  727 + overflow: hidden;
  728 + text-overflow: ellipsis;
  729 +}
  730 +
  731 +.ct_row .ct_cell label {
  732 + color: #979393;
  733 + margin-right: 3px;
  734 +}
  735 +
  736 +.ct_row .ct_cell.c_1_3 {
  737 + width: 33%;
  738 +}
  739 +
  740 +#schedule-lp_change-modal .sch-list dl dd {
  741 + font-size: 14px;
  742 +}
  743 +
  744 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(1), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(1) {
  745 + width: 5%;
  746 + border-left: 1px solid #dedede;
  747 +}
  748 +
  749 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(2), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(2) {
  750 + width: 22%;
  751 +}
  752 +
  753 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(3), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(3) {
  754 + width: 17%;
  755 +}
  756 +
  757 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(4), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(4) {
  758 + width: 10%;
  759 +}
  760 +
  761 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(5), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(5) {
  762 + width: 21%;
  763 +}
  764 +
  765 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(6), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(6) {
  766 + width: 10%;
  767 +}
  768 +
  769 +#schedule-lp_change-modal .sch-list dl dt:nth-of-type(7), #schedule-lp_change-modal .sch-list dl dd:nth-of-type(7) {
  770 + width: 14%;
  771 +}
  772 +
  773 +#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) {
  774 + width: 5%;
  775 + border-left: 1px solid #dedede;
  776 +}
  777 +
  778 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(2), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(2) {
  779 + width: 14%;
  780 +}
  781 +
  782 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(3), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(3) {
  783 + width: 10%;
  784 +}
  785 +
  786 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(4), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(4) {
  787 + width: 21%;
  788 +}
  789 +
  790 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(5), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(5) {
  791 + width: 10%;
  792 +}
  793 +
  794 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(6), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(6) {
  795 + width: 17%;
  796 +}
  797 +
  798 +#schedule-lp_change-modal .sch-list.reverse dl dt:nth-of-type(7), #schedule-lp_change-modal .sch-list.reverse dl dd:nth-of-type(7) {
  799 + width: 22%;
  800 +}
  801 +
  802 +#schedule-lp_change-modal .ct_table.sch-list .ct_table_body dl.active {
  803 + background: #b9d2ff;
  804 +}
  805 +
  806 +#schedule-lp_change-modal .ct_table.sch-list .ct_table_body dl.active dd {
  807 + border-top: 1px solid #b9d2ff;
  808 +}
  809 +
  810 +#schedule-lp_change-modal .ct_table.sch-list dl.active input[type=checkbox] {
  811 + border: none;
  812 +}
  813 +
  814 +#schedule-lp_change-modal .ct_table.sch-list.reverse .ct_table_body dl.active {
  815 + background: #ffe2b9;
  816 +}
  817 +
  818 +#schedule-lp_change-modal .ct_table.sch-list.reverse .ct_table_body dl.active dd {
  819 + border-top: 1px solid #ffe2b9;
  820 +}
  821 +
  822 +#cache_data_manage-modal .uk-table td {
  823 + vertical-align: bottom;
  824 +}
  825 +
  826 +#cache_data_manage-modal .uk-table td,
  827 +#cache_data_manage-modal .uk-table th {
  828 + padding: 8px 8px 6px;
  829 +}
  830 +
  831 +.ps-help-panel {
  832 + color: grey;
  833 + padding: 5px 2px;
  834 +}
  835 +
  836 +.ps-help-panel small {
  837 + display: block;
  838 +}
  839 +
  840 +svg text.offline {
  841 + fill: #6f6a6a !important;
  842 +}
  843 +
  844 +svg rect.offline {
  845 + stroke: #dbdada !important;
  846 + fill: #dbdada !important;
  847 +}
  848 +
  849 +.tooltip .tooltip-container .title a > .abnormal-text {
  850 + font-size: 14px;
  851 + color: #ff5e5e;
  852 + font-weight: 600;
  853 +}
  854 +
  855 +#addChildTaskBtn {
  856 + margin-left: 5px;
  857 + color: #36729b;
  858 + padding: 1px 5px 1px 6px;
  859 +}
  860 +
  861 +#addChildTaskBtn:hover {
  862 + box-shadow: 2px 1px 3px 0 rgba(0, 0, 0, 0.2), 0px 3px 8px 0 rgba(0, 0, 0, 0.19);
  863 +}
  864 +
  865 +.edit-icon {
  866 + color: #aba9a9;
  867 + font-size: 12px;
  868 + margin-left: 5px;
  869 + display: none;
  870 +}
  871 +
  872 +.operation-real-text {
  873 + position: absolute;
  874 + top: 9px;
  875 + width: 100%;
  876 + left: 0;
  877 + text-align: center;
  878 + pointer-events: none;
  879 +}
  880 +
  881 +.operation-real-text span {
  882 + padding: 15px;
  883 + background: #ff4f4f;
  884 + color: white;
  885 + box-shadow: 0px 4px 6px 0 rgba(0, 0, 0, 0.2), 0px 4px 10px 0 rgba(0, 0, 0, 0.19);
  886 + border-radius: 1px 1px 4px 4px;
  887 +}
  888 +
  889 +#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-label {
  890 + width: 120px;
  891 +}
  892 +
  893 +#oil_station-modal.ct-form-modal form.uk-form-horizontal .uk-form-controls {
  894 + margin-left: 125px;
  895 +}
  896 +
  897 +#oil_station-modal .uk-form-icon > [class*=uk-icon-] {
  898 + right: 23px;
  899 +}
  900 +
  901 +#oil_station-modal .uk-form-icon:not(.uk-form-icon-flip) > input {
  902 + padding-left: 10px !important;
  903 +}
  904 +
  905 +#oil_station-modal .uk-form-icon {
  906 + width: calc(100% - 145px);
  907 +}
  908 +
  909 +#oil_station-modal .uk-icon-mile:before {
  910 + content: '公里';
  911 +}
  912 +
  913 +#oil_station-modal .uk-icon-minute:before {
  914 + content: '分钟';
  915 +}
  916 +
  917 +option.oil_station_opt {
  918 + color: red;
  919 +}
  920 +
  921 +#oil_station-modal .uk-modal .uk-form.fv-form {
  922 + margin-bottom: 0 !important;
  923 +}
  924 +
  925 +#gb_wait_modal .uk-modal-spinner {
  926 + top: 25px;
  927 + -webkit-transform: translate(-50%, 0);
  928 + transform: translate(-50%, 0);
  929 +}
  930 +
  931 +#gb_wait_modal .wait-modal-text {
  932 + text-align: center;
  933 + margin-top: 35px;
  934 + font-size: 15px;
  935 + color: #635e5e;
  936 +}
  937 +
  938 +.park-and-station-wrap {
  939 + margin-top: 25px;
  940 + border: 1px solid #b9b9b9;
  941 + width: 580px;
  942 + padding: 12px;
  943 + border-radius: 5px;
  944 + box-shadow: 0 2px 5px rgba(0,0,0,.1);
  945 + margin-bottom: 15px;
  946 +}
  947 +
  948 +.park-and-station-wrap select {
  949 + width: auto !important;
  950 +}
  951 +
  952 +.park-and-station-wrap>span{
  953 + vertical-align: middle;
  954 + margin-top: 9px;
  955 + display: inline-block;
  956 +}
  957 +
  958 +/** 安全驾驶相关css */
  959 +.multi_plat_msg_pop_wrap {
  960 + position: absolute;
  961 + right: 12px;
  962 + bottom: 12px;
  963 + z-index: 99;
  964 +}
  965 +
  966 +.multi_plat_msg_pop {
  967 + background: #d44b4b;
  968 + font-size: 15px;
  969 + padding: 9px 10px 0;
  970 + border: 1px solid #f4f0f0;
  971 + border-radius: 5px;
  972 + cursor: pointer;
  973 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  974 + transition: all .03s;
  975 + color: #f2f2f2;
  976 +}
  977 +
  978 +.multi_plat_msg_pop:hover {
  979 + background: #bc2a2a;
  980 +}
  981 +
  982 +.multi_plat_msg_pop .title {
  983 +}
  984 +
  985 +.multi_plat_msg_pop .desc {
  986 + display: block;
  987 + font-size: 12px;
  988 + color: #ff9d9d;
  989 + text-align: right;
  990 + margin-right: 5px;
  991 +}
  992 +
  993 +.multi_plat_msg_pops .tests {
  994 + display: block;
  995 +}
  996 +
  997 +/** 嵌入表单modal滚动条样式 */
  998 +#formFragmentModal::-webkit-scrollbar {
  999 + width: 10px;
  1000 + background-color: #F5F5F5;
  1001 +}
  1002 +
  1003 +#formFragmentModal::-webkit-scrollbar-thumb {
  1004 + background-color: #000000;
  1005 +}
  1006 +
  1007 +#formFragmentModal::-webkit-scrollbar-track {
  1008 + border: 0;
  1009 + background-color: #F5F5F5;
  1010 + border-radius: 0;
  1011 +}
  1012 +
  1013 +#formFragmentModal::-webkit-scrollbar-thumb {
  1014 + border: 5px solid rgb(226, 122, 122);
  1015 +}
  1016 +
  1017 +#schedule-addsch_oil-modal select {
  1018 + height: 30px !important;
  1019 +}
  1020 +
  1021 +#oil_station-modal .input_clear_icon {
  1022 + position: absolute;
  1023 + top: 6px;
  1024 + right: 108px;
  1025 + color: #f75757;
  1026 + height: 18px;
  1027 + line-height: 18px;
  1028 + border-radius: 7px;
  1029 + font-size: 16px;
  1030 + display: none;
  1031 + cursor: pointer;
  1032 +}
  1033 +
  1034 +#oil_station-modal .input_clear_icon:hover {
  1035 + color: #de2020;
  1036 +}
  1037 +
  1038 +#oil_station-modal .input_clear_icon:before {
  1039 + display: block;
  1040 + font-family: FontAwesome;
  1041 + content: "\f057";
  1042 +}
  1043 +
  1044 +#oil_station-modal input.readonly {
  1045 + background: #dddddd;
  1046 +}
  1047 +
  1048 +.ct_tags {
  1049 + margin-bottom: 12px;
  1050 +}
  1051 +
  1052 +.ct_tags > span {
  1053 + padding: 3px 7px;
  1054 + background: #e8e8e8;
  1055 + color: #3a3939;
  1056 + cursor: pointer;
  1057 + margin-right: 5px;
  1058 +}
  1059 +
  1060 +.ct_tags > span.active {
  1061 + background: #62a9e1;
  1062 + color: white;
  1063 + box-shadow: 0 0 4px rgba(0, 0, 0, 0.35);
  1064 +}
  1065 +
  1066 +.ct_tags > span.active:before {
  1067 + content: "\f00c";
  1068 + font-family: FontAwesome;
  1069 + margin-right: 2px;
  1070 + font-size: 13px;
  1071 +}
  1072 +
  1073 +.ct_tags > span:hover {
  1074 + box-shadow: 0 0 4px rgba(0, 0, 0, .3);
  1075 +}
  1076 +
  1077 +span.late-badge {
  1078 + height: 20px;
  1079 + line-height: 20px;
  1080 + margin-top: 8px;
  1081 + color: grey;
  1082 + margin-left: 2px;
  1083 +}
  1084 +
  1085 +dl.intimity span.late-badge {
  1086 + color: #fbfbfb;
  1087 +}
  1088 +
  1089 +/** badge tooltip */
  1090 +.uk-badge.c_task:hover,
  1091 +.uk-badge.sch_region:hover {
  1092 + background-image: none;
  1093 + background: #38b3e1;
  1094 + border: 1px solid #7ebad1;
  1095 +}
  1096 +
  1097 +.uk-badge.out:hover {
  1098 + background-image: none;
  1099 + background: #8fc650;
  1100 + border: 1px solid #949f86;
  1101 +}
  1102 +
  1103 +.uk-badge.in:hover {
  1104 + background-image: none;
  1105 + background: #fabc64;
  1106 + border: 1px solid #a68c67;
  1107 +}
  1108 +
  1109 +.qtip.sch-badge-tip {
  1110 + max-width: 700px;
  1111 +}
  1112 +
  1113 +.tip_task_list {
  1114 + width: 530px;
  1115 + margin-bottom: -10px;
  1116 +}
  1117 +
  1118 +.tip_task_list dl {
  1119 + font-size: 0;
  1120 + border-bottom: 1px solid #e6e6e6;
  1121 + margin: 0;
  1122 +}
  1123 +
  1124 +.tip_task_list dl:last-child {
  1125 + border-bottom: none;
  1126 +}
  1127 +
  1128 +.tip_task_list dl dt,
  1129 +.tip_task_list dl dd {
  1130 + display: inline-block;
  1131 + font-size: 13px;
  1132 + white-space: nowrap;
  1133 + overflow: hidden;
  1134 + text-overflow: ellipsis;
  1135 + height: 24px;
  1136 + line-height: 24px;
  1137 +}
  1138 +
  1139 +.tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1) {
  1140 + width: 38px;
  1141 + border-right: 1px solid #c8c8c8;
  1142 +}
  1143 +
  1144 +.tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2) {
  1145 + width: 18%;
  1146 + text-indent: 5px;
  1147 +}
  1148 +
  1149 +.tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3) {
  1150 + width: 11%;
  1151 +}
  1152 +
  1153 +.tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4) {
  1154 + width: 25%;
  1155 +}
  1156 +
  1157 +.tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5) {
  1158 + width: 25%;
  1159 +}
  1160 +
  1161 +.tip_task_list dl dt:nth-of-type(6), .tip_task_list dl dd:nth-of-type(6) {
  1162 + width: 12%;
  1163 +}
  1164 +
  1165 +.tip_task_list dl dd:nth-of-type(1) a {
  1166 + color: #3c3c3c;
  1167 + text-decoration: underline;
  1168 + font-size: 12px;
  1169 +}
  1170 +
  1171 +.tip_task_list dl.service {
  1172 + color: blue;
  1173 +}
  1174 +
  1175 +.tip_task_list dl.service.destroy {
  1176 + color: red;
  1177 +}
  1178 +
  1179 +.tip_task_list dl.service.temp_add {
  1180 + color: #9C27B0;
  1181 +}
  1182 +
  1183 +.tip_task_list dl span {
  1184 + margin: 0;
  1185 + width: auto;
  1186 +}
  1187 +
  1188 +ul.left_tabs_lg {
  1189 + border: 1px solid #efeded;
  1190 + height: 100%;
  1191 + background: #fafafa;
  1192 +}
  1193 +
  1194 +ul.left_tabs_lg li {
  1195 + line-height: 40px;
  1196 + font-size: 15px;
  1197 +}
  1198 +
  1199 +#schedule-addsch-modal .uk-modal-footer {
  1200 + border-top: none;
  1201 + background: none;
  1202 +}
  1203 +
  1204 +.ct_line_lp_badge {
  1205 + float: left;
  1206 + margin-top: 6px;
  1207 + background: #e0e0e0;
  1208 + padding: 2px 7px;
  1209 + border-radius: 3px;
  1210 +}
  1211 +
  1212 +.uk-badge.sch_ldks {
  1213 + background: #8c8c8c;
  1214 + background-image: linear-gradient(to bottom, #a7a7a7, #8c8c8c);
  1215 +}
  1216 +
  1217 +.ct_layer_modal {
  1218 + background: #e5e5e5;
  1219 + height: 100%;
  1220 + width: 100%;
  1221 + overflow: auto;
  1222 +}
  1223 +
  1224 +.layui-layer-setwin {
  1225 +
  1226 +}
  1227 +
  1228 +.device_config_table dl dt:nth-of-type(1), .device_config_table dl dd:nth-of-type(1) {
  1229 + width: 7%;
  1230 + text-indent: 10px;
  1231 +}
  1232 +
  1233 +.device_config_table dl dt:nth-of-type(2), .device_config_table dl dd:nth-of-type(2) {
  1234 + width: 7%;
  1235 +}
  1236 +
  1237 +.device_config_table dl dt:nth-of-type(3), .device_config_table dl dd:nth-of-type(3) {
  1238 + width: 8%;
  1239 +}
  1240 +
  1241 +.device_config_table dl dt:nth-of-type(4), .device_config_table dl dd:nth-of-type(4) {
  1242 + width: 5%;
  1243 +}
  1244 +
  1245 +.device_config_table dl dt:nth-of-type(5), .device_config_table dl dd:nth-of-type(5) {
  1246 + width: 4%;
  1247 +}
  1248 +
  1249 +.device_config_table dl dt:nth-of-type(6), .device_config_table dl dd:nth-of-type(6) {
  1250 + width: 4%;
  1251 +}
  1252 +
  1253 +.device_config_table dl dt:nth-of-type(7), .device_config_table dl dd:nth-of-type(7) {
  1254 + width: 4%;
  1255 +}
  1256 +
  1257 +.device_config_table dl dt:nth-of-type(8), .device_config_table dl dd:nth-of-type(8) {
  1258 + width: 5%;
  1259 +}
  1260 +
  1261 +.device_config_table dl dt:nth-of-type(9), .device_config_table dl dd:nth-of-type(9) {
  1262 + width: 5%;
  1263 +}
  1264 +
  1265 +.device_config_table dl dt:nth-of-type(10), .device_config_table dl dd:nth-of-type(10) {
  1266 + width: 8%;
  1267 +}
  1268 +
  1269 +.device_config_table dl dt:nth-of-type(11), .device_config_table dl dd:nth-of-type(11) {
  1270 + width: 5%;
  1271 +}
  1272 +
  1273 +.device_config_table dl dt:nth-of-type(12), .device_config_table dl dd:nth-of-type(12) {
  1274 + width: 5%;
  1275 +}
  1276 +
  1277 +.device_config_table dl dt:nth-of-type(13), .device_config_table dl dd:nth-of-type(13) {
  1278 + width: 4%;
  1279 +}
  1280 +
  1281 +.device_config_table dl dt:nth-of-type(14), .device_config_table dl dd:nth-of-type(14) {
  1282 + width: 4%;
  1283 +}
  1284 +
  1285 +.device_config_table dl dt:nth-of-type(15), .device_config_table dl dd:nth-of-type(15) {
  1286 + width: 4%;
  1287 +}
  1288 +
  1289 +.device_config_table dl dt:nth-of-type(16), .device_config_table dl dd:nth-of-type(16) {
  1290 + width: 3%;
  1291 +}
  1292 +
  1293 +.device_config_table dl dt:nth-of-type(17), .device_config_table dl dd:nth-of-type(17) {
  1294 + width: 4%;
  1295 +}
  1296 +
  1297 +.device_config_table dl dt:nth-of-type(18), .device_config_table dl dd:nth-of-type(18) {
  1298 + width: 13%;
  1299 +}
  1300 +
  1301 +.uk-tooltip {
  1302 + z-index: 29999999 !important;
  1303 +}
  1304 +
  1305 +.device_config_table.ct_table dl dd,
  1306 +.device_config_table.ct_table dl dt {
  1307 + border-right: 1px solid #dedede !important;
  1308 +}
  1309 +
  1310 +.device_configs_manager .search_form {
  1311 + text-indent: 12px;
  1312 + margin-bottom: 0;
  1313 + padding: 18px 5px;
  1314 +}
  1315 +
  1316 +.sub_task_form_v2 {
  1317 + background: #f9f9f9;
  1318 + padding: 12px 15px;
  1319 + border-radius: 5px 0 5px 5px;
  1320 + border: 1px solid #dfdfdf;
  1321 + position: relative;
  1322 + margin-bottom: 20px;
  1323 +}
  1324 +
  1325 +.task_form_close_icon {
  1326 + background: #f9f9f9;
  1327 + padding: 0px 4px;
  1328 + position: absolute;
  1329 + top: -8px;
  1330 + right: -8px;
  1331 + color: #898989;
  1332 + font-size: 15px;
  1333 + border: 1px solid #dfdfdf;
  1334 + border-radius: 100%;
  1335 + border-left: none;
  1336 + border-bottom: none;
  1337 + transition: all .03s;
  1338 +}
  1339 +
  1340 +.task_form_close_icon:hover {
  1341 + border: 1px solid #ff1515;
  1342 + border-left: none;
  1343 + border-bottom: none;
  1344 + color: #e03e3e;
  1345 +}
  1346 +
  1347 +.sub_task_form_v2:hover::after {
  1348 + color: #5f5b5b;
  1349 +}
  1350 +
  1351 +.sub_task_form_v2.uk-form-horizontal .uk-form-label {
  1352 + width: 80px;
  1353 +}
  1354 +
  1355 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls {
  1356 + margin-left: 85px;
  1357 +}
  1358 +
  1359 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=text],
  1360 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls input[type=time],
  1361 +.sub_task_form_v2.uk-form-horizontal .uk-form-controls select {
  1362 + width: 100%;
  1363 +}
  1364 +
  1365 +#add-sub-task-main-modal .uk-modal-footer {
  1366 + background: none;
  1367 + border-top: none;
  1368 +}
  1369 +
  1370 +#add-sub-task-main-modal .uk-grid + .uk-grid {
  1371 + margin-top: 12px;
  1372 +}
  1373 +
  1374 +#add-sub-task-main-modal .plus_icon_span {
  1375 + font-size: 26px;
  1376 + color: #b2b2b2;
  1377 + padding: 10px 64px;
  1378 + display: inline-block;
  1379 + border: 1px dashed grey;
  1380 + margin: 15px 0;
  1381 + border-radius: 5px;
  1382 + cursor: pointer;
  1383 +}
  1384 +
  1385 +#add-sub-task-main-modal .uk-animation-fade {
  1386 + animation-duration: .3s;
  1387 +}
  1388 +
  1389 +#add-sub-task-main-modal .forms {
  1390 + max-height: 642px;
  1391 + overflow-y: auto;
  1392 + overflow-x: hidden;
  1393 + padding: 8px 8px 0 0;
  1394 +}
  1395 +
  1396 +.add_custom_wrap .forms .sub_task_form_v2:last-child {
  1397 + margin-bottom: 0;
  1398 +}
  1399 +
  1400 +.sub_task_form_v2.destroy_form {
  1401 + background-color: #fff5f4 !important;
  1402 +}
  1403 +
  1404 +.uk-form > .half_change_car_box {
  1405 + margin: -10px 0 15px;
  1406 + padding: 3px 5px;
  1407 + display: inline-block;
  1408 + border: 1px solid #dfdddd;
  1409 + color: #918f8f;
  1410 +}
  1411 +
  1412 +.half_change_car_box input[type=checkbox] {
  1413 + vertical-align: top;
  1414 +}
  1415 +
  1416 +.uk-form > .half_change_car_box.active {
  1417 + background: #4CAF50;
  1418 + color: #fff;
  1419 +}
  1420 +
  1421 +.uk-form > .half_change_car_box.active input[type=checkbox] {
  1422 + background: #4caf50;
  1423 + border-color: #4caf50;
  1424 +}
  1425 +
  1426 +.uk-form > .half_change_car_box.active input[type=checkbox]:before {
  1427 + color: #ffffff;
  1428 +}
  1429 +
  1430 +.sub_task_form_v2.change_car {
  1431 + z-index: 99;
  1432 +}
  1433 +
  1434 +.st_range_top_form {
  1435 + padding: 0 0 15px 5px;
  1436 + border: 1px solid #c4bb76;
  1437 + background: #e5e1c1;
  1438 + margin-bottom: 15px;
  1439 + box-shadow: 0px 4px 3px 0 rgba(142, 138, 138, 0.2), 0px 4px 5px 0 rgba(157, 156, 156, 0.19);
  1440 +}
  1441 +
  1442 +.st_range_top_form .uk-form-row {
  1443 + margin-top: 20px;
  1444 +}
  1445 +
  1446 +.uk-form-horizontal.st_range_top_form .uk-form-label {
  1447 + width: 80px;
  1448 +}
  1449 +
  1450 +.uk-form-horizontal.st_range_top_form .uk-form-controls {
  1451 + margin-left: 84px;
  1452 +}
  1453 +
  1454 +.uk-form-horizontal.st_range_top_form .uk-form-controls select {
  1455 + width: calc(100% - 2px);
  1456 +}
  1457 +
  1458 +.sub_task_form_v2.service_st_form {
  1459 + background: #f4faff;
  1460 +}
  1461 +
  1462 +.uk-modal .uk-form.fv-form.sub_task_form_v2 {
  1463 + margin-bottom: 20px !important;
  1464 +}
  1465 +
  1466 +.sub_task_table_wrap .ct_table > .ct_table_body {
  1467 + border-bottom: none;
  1468 +}
  1469 +
  1470 +.err_panel {
  1471 + font-size: 12px;
  1472 + color: #7e7d7d;
  1473 + font-family: 微软雅黑;
  1474 + margin-top: 5px;
  1475 +}
  1476 +
  1477 +#schedule-lp_change-modal .ct_table dl {
  1478 + height: 35px;
  1479 +}
  1480 +
  1481 +#schedule-lp_change-modal .ct_table dl dd, #schedule-lp_change-modal .ct_table dl dt {
  1482 + line-height: 35px;
  1483 +}
  1484 +
  1485 +/*
  1486 +.sub_task_form_v2.repeat_main:before{
  1487 + content: '复';
  1488 + position: absolute;
  1489 + top: -10px;
  1490 + font-size: 12px;
  1491 + color: #2196F3;
  1492 + background: #ffffff;
  1493 + padding: 0 3px;
  1494 + font-weight: 600;
  1495 +}*/
  1496 +
  1497 +.sub_task_form_v2:before {
  1498 + position: absolute;
  1499 + top: -7px;
  1500 + font-size: 12px;
  1501 + padding: 0 3px;
  1502 + font-weight: 600;
  1503 + line-height: 14px;
  1504 +}
  1505 +
  1506 +.sub_task_form_v2.destroy_form:before {
  1507 + content: '烂班' !important;
  1508 + color: #f14235 !important;
  1509 + background: #ffffff !important;
  1510 +}
  1511 +
  1512 +.sub_task_form_v2.service_form:before {
  1513 + content: '营运';
  1514 + color: #2196F3;
  1515 + background: #ffffff;
  1516 +}
  1517 +
  1518 +.sub_task_form_v2.service_form.temp_service:before {
  1519 + content: '营运 (临加)';
  1520 + color: #9C27B0;
  1521 + background: #ffffff;
  1522 +}
  1523 +
  1524 +.sub_task_form_v2.service_form.temp_service {
  1525 + background: #faf0fd;
  1526 +}
  1527 +
  1528 +.sub_task_form_v2.empty_form:before {
  1529 + content: '空驶';
  1530 + color: #928f92;
  1531 + background: #ffffff;
  1532 +}
  1533 +
  1534 +.sub_task_form_v2.service_form {
  1535 + background: #f4faff;
  1536 +}
  1537 +
  1538 +/*.sub_task_form_v2.repeat_main.destroy_form:before{
  1539 + color: #F44336;
  1540 +}
  1541 +
  1542 +.sub_task_form_v2.repeat_main{
  1543 + background: #f4faff;
  1544 +}*/
  1545 +.footer_tools {
  1546 + position: absolute;
  1547 + left: 235px;
  1548 + bottom: 19px;
  1549 +}
  1550 +
  1551 +.footer_mileage_count {
  1552 + border: 1px solid #f2f2f2;
  1553 + padding: 5px;
  1554 + box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.2), 0px 2px 7px 0 rgba(0, 0, 0, 0.19);
  1555 + display: inline-block;
  1556 +}
  1557 +
  1558 +.footer_mileage_count > span {
  1559 + padding: 2px 5px;
  1560 +}
  1561 +
  1562 +.footer_mileage_count > span.service_sum {
  1563 + color: #2196F3;
  1564 +}
  1565 +
  1566 +.footer_mileage_count > span.empty_sum {
  1567 + color: #636363;
  1568 +}
  1569 +
  1570 +.footer_mileage_count > span.destroy_sum {
  1571 + color: #f5574b;
  1572 +}
  1573 +
  1574 +.station_to_park_link {
  1575 + display: inline-block;
  1576 + margin-left: 15px;
  1577 + vertical-align: bottom;
  1578 + font-size: 12px;
  1579 +}
  1580 +
  1581 +.station_to_park_link > a {
  1582 + color: #607D8B;
  1583 +}
  1584 +
  1585 +#station_to_park-modal.ct-form-modal form input[type=text],
  1586 +#station_to_park-modal.ct-form-modal form select {
  1587 + width: auto;
  1588 +}
  1589 +
  1590 +.s_2_park_form_wrap {
  1591 + background: #fafafa;
  1592 + border: 1px solid #e5e5e5;
  1593 + padding: 7px 16px;
  1594 + margin: 15px 0;
  1595 + position: relative;
  1596 +}
  1597 +
  1598 +.s_2_park_form_wrap .ct_close {
  1599 + position: absolute;
  1600 + top: -12px;
  1601 + padding: 0 4px;
  1602 + right: -8px;
  1603 + color: #939393;
  1604 + border: 1px solid #f7dfdf;
  1605 + border-radius: 25px;
  1606 + cursor: pointer;
  1607 +}
  1608 +
  1609 +.s_2_park_form_wrap .ct_close:hover {
  1610 + background: #e5e5e5;
  1611 + color: #fd6e6e;
  1612 +}
  1613 +
  1614 +.s_2_park_form_wrap label {
  1615 + color: #666;
  1616 + font-size: 13px;
  1617 +}
  1618 +
  1619 +#station_to_park-modal.ct-form-modal form input[readonly] {
  1620 + background: #fafafa;
  1621 +}
  1622 +
  1623 +.s_2_park_form_wrap .bottom_label {
  1624 + margin-top: 25px;
  1625 + display: block;
  1626 +}
  1627 +
  1628 +.s_2_park_form_wrap .bottom_label_2 {
  1629 + margin-top: 4px;
  1630 + display: block;
  1631 +}
  1632 +
  1633 +.ct_describe {
  1634 + font-size: 12px;
  1635 + color: #909090;
  1636 + font-family: FontAwesome;
  1637 +}
  1638 +
  1639 +.ct_describe:before {
  1640 + content: "\f059";
  1641 + margin-right: 3px;
  1642 +}
  1643 +
  1644 +#add-sub-task-main-modal abbr {
  1645 + display: inline-block;
  1646 + font-size: 12px;
  1647 + margin-left: 25px;
  1648 + vertical-align: bottom;
  1649 + color: #929292;
  1650 +}
  1651 +
  1652 +#all-devices-modal .search-form input[type=text] {
  1653 + width: 100px;
  1654 +}
  1655 +
  1656 +#all-devices-modal .auto-refresh {
  1657 + vertical-align: middle;
  1658 + margin-left: 5px;
  1659 + color: grey;
  1660 +}
  1661 +
  1662 +#all-devices-modal .auto-refresh.active {
  1663 + color: #405dff;
  1664 +}
  1665 +
  1666 +#all-devices-modal .uk-margin-small-top {
  1667 + margin-top: 0 !important;
  1668 +}
  1669 +
  1670 +#history-sch-maintain-modal .add_lp_link {
  1671 + display: inline-block;
  1672 + vertical-align: bottom;
  1673 + margin-left: 15px;
  1674 + text-decoration: underline;
  1675 + font-size: 13px;
  1676 +}
  1677 +
  1678 +#schedule-tzrc-modal input[type=checkbox] {
  1679 + margin-right: 9px;
  1680 +}
  1681 +
  1682 +#schedule-tzrc-modal span.ct_zt_yzx {
  1683 + color: #2196F3;
  1684 + font-size: 12px;
  1685 +}
  1686 +
  1687 +#schedule-tzrc-modal span.ct_zt_lb {
  1688 + color: red;
  1689 + font-size: 12px;
  1690 +}
  1691 +
  1692 +#schedule-tzrc-modal span.ct_zt_zzzx {
  1693 + font-size: 12px;
  1694 + color: #38ad3c;
  1695 +}
  1696 +
  1697 +#schedule-tzrc-modal .tzrc_form {
  1698 + padding: 20px;
  1699 + border: 1px solid #f0eded;
  1700 + box-shadow: 0px -3px 15px rgba(0, 0, 0, 0.08);
  1701 + background: #f9f9f9;
  1702 +}
  1703 +
  1704 +.uk-panel.ct_search_panel {
  1705 + padding: 15px;
  1706 + border: 1px solid #f0eded;
  1707 + box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.08);
  1708 + background: #f9f9f9;
  1709 +}
  1710 +
  1711 +.sch-tzrc-table.ct_table dl.active,
  1712 +.sch-tzrc-table.ct_table > .ct_table_body dl.active:hover {
  1713 + background: #5bd460;
  1714 + color: white;
  1715 +}
  1716 +
  1717 +#schedule-tzrc-modal dl.active span.ct_zt_yzx {
  1718 + color: #545252;
  1719 +}
  1720 +
  1721 +#schedule-tzrc-modal dl.active span.ct_zt_lb {
  1722 + color: #d64949;
  1723 +}
  1724 +
  1725 +#schedule-tzrc-modal dl.active span.ct_zt_zzzx {
  1726 + color: white;
  1727 +}
  1728 +
  1729 +#schedule-tzrc-modal dl.active input[type=checkbox] {
  1730 + border: 0;
  1731 +}
  1732 +
  1733 +#schedule-tzrc-modal dl.active input[type=checkbox]:before {
  1734 + color: #ffffff;
  1735 +}
  1736 +
  1737 +.sch-search-autocom input {
  1738 + padding: 0 !important;
  1739 + height: 100% !important;
  1740 +}
  1741 +
  1742 +label.blue_checkbox {
  1743 + margin-left: 12px;
  1744 +}
  1745 +
  1746 +label.blue_checkbox > input {
  1747 + width: 17px !important;
  1748 + height: 17px !important;
  1749 +}
  1750 +
  1751 +label.blue_checkbox > input:checked:before,
  1752 +label.blue_checkbox > input:indeterminate:before {
  1753 + line-height: 15px !important;
  1754 +}
  1755 +
  1756 +dd.disabled {
  1757 + color: #b5b3b3;
  1758 +}
  1759 +
  1760 +dl.active > dd.disabled {
  1761 + color: #ececec;
  1762 +}
  1763 +
  1764 +#change_user_options-modal .user_info {
  1765 + width: 360px;
  1766 + margin: auto;
  1767 +}
  1768 +
  1769 +.display_hide {
  1770 + display: none;
  1771 +}
  1772 +
  1773 +.ct_eye_icon {
  1774 + font-size: 16px;
  1775 + cursor: pointer;
  1776 +}
  1777 +
  1778 +.ct_eye_icon.active {
  1779 + color: #444;
  1780 +}
  1781 +
  1782 +#tempScheduleContent .forms::-webkit-scrollbar {
  1783 + width: 19px;
  1784 + height: 16px;
  1785 +}
  1786 +
  1787 +.range_2_normal_tt {
  1788 + margin-bottom: 15px;
  1789 + border-top: 1px dashed #c7c7c7;
  1790 + color: #a6a6a6;
  1791 + text-indent: 7px;
  1792 + padding-bottom: 5px;
  1793 +}
  1794 +
  1795 +.cancel_link {
  1796 + font-size: 12px;
  1797 + margin-left: 15px;
  1798 + vertical-align: bottom;
  1799 + color: #8d8d8d;
  1800 + text-decoration: underline;
  1801 + position: absolute;
  1802 + right: 0;
  1803 +}
  1804 +
  1805 +.edit_link {
  1806 + font-size: 12px;
  1807 + margin-left: 15px;
  1808 + vertical-align: bottom;
  1809 + color: #ff2f2f;
  1810 + text-decoration: underline;
  1811 +}
  1812 +
  1813 +.c_b_abnorm_notice {
  1814 + position: absolute;
  1815 + bottom: 0;
  1816 + margin: auto;
  1817 + width: 351px;
  1818 + padding: 7px;
  1819 + background: #ffffff;
  1820 + box-shadow: 5px 5px 15px rgba(90, 90, 90, 0.48);
  1821 + max-height: 125px;
  1822 + overflow-y: auto;
  1823 + min-height: 40px;
  1824 +}
  1825 +
  1826 +.c_b_abnorm_notice:before {
  1827 + content: "-超速报警-";
  1828 + color: #000000;
  1829 + font-size: 12px;
  1830 + font-family: 微软雅黑;
  1831 + position: fixed;
  1832 + background: #ffd967;
  1833 + margin-top: -10px;
  1834 + margin-left: -6px;
  1835 + padding: 0 7px;
  1836 + box-shadow: 2px 4px 7px rgba(90, 90, 90, 0.25);
  1837 +}
  1838 +
  1839 +.c_b_item {
  1840 + margin: 7px 0;
  1841 + padding: 7px 12px;
  1842 + box-shadow: 0px 0px 10px rgba(90, 90, 90, 0.29);
  1843 + color: #FF5722;
  1844 + cursor: pointer;
  1845 +}
  1846 +
  1847 +.c_b_abnorm_notice > .c_b_item:first-child {
  1848 + margin-top: 20px;
  1849 +}
  1850 +
  1851 +.c_b_item.over {
  1852 + color: grey;
  1853 +}
  1854 +
  1855 +.c_b_item > span.c_b_over {
  1856 + float: right;
  1857 +}
  1858 +
  1859 +.mileage_elec_panel {
  1860 + position: absolute;
  1861 + width: 100%;
  1862 + /*height: 90px;*/
  1863 + z-index: 1;
  1864 + background: white;
  1865 + bottom: 0px;
  1866 + box-shadow: 1px 0px 15px rgba(90, 90, 90, 0.48);
  1867 + padding: 9px 15px;
  1868 + border-radius: 0 5px;
  1869 + color: #000;
  1870 +
  1871 + display: none;
  1872 +}
  1873 +
  1874 +.mileage_elec_panel ._title {
  1875 + margin: 5px 3px;
  1876 + font-size: 15px;
  1877 +}
  1878 +
  1879 +.mileage_elec_panel .LD_item {
  1880 + margin: 5px 0;
  1881 + font-family: 微软雅黑;
  1882 +}
  1883 +
  1884 +.mileage_elec_panel .LD_item > span {
  1885 + padding: 3px;
  1886 + display: inline-block;
  1887 + width: 85px;
  1888 +}
  1889 +
  1890 +.mileage_elec_panel .lp_name {
  1891 + padding: 0 5px;
  1892 + background: #f2f2f2;
  1893 + border-radius: 15px
  1894 +}
  1895 +
  1896 +.mileage_elec_panel .LD_item > span > a {
  1897 + color: #000;
  1898 +}
  1899 +
  1900 +.mileage_elec_panel .LD_item > span:nth-of-type(1) > a {
  1901 + color: blue;
  1902 +}
  1903 +
  1904 +/*.mileage_elec_panel .LD_item>span:nth-of-type(2)>a{
  1905 + color: #fa3a2c;
  1906 +}
  1907 +
  1908 +.mileage_elec_panel .LD_item>span:nth-of-type(3)>a{
  1909 + color: #515151;
  1910 +}*/
  1911 +
  1912 +.mileage_elec_panel hr {
  1913 + height: 1px;
  1914 + border: none;
  1915 + border-top: 1px dashed #b5b5b5;
  1916 +}
  1917 +
  1918 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-label {
  1919 + width: 70px;
  1920 +}
  1921 +
  1922 +#edit-sub-task-main-modal .sub_task_form_v2.uk-form-horizontal .uk-form-controls {
  1923 + margin-left: 75px;
  1924 +}
  1925 +
  1926 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid + .uk-grid,
  1927 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid-margin,
  1928 +#edit-sub-task-main-modal .sub_task_form_v2 .uk-grid > * > .uk-panel + .uk-panel {
  1929 + margin-top: 22px;
  1930 +}
  1931 +
  1932 +.c_task_mileage_abnormal,
  1933 +.c_task_mileage_abnormal .ct_table > .ct_table_head dl,
  1934 +.c_task_mileage_abnormal .ct_table dl {
  1935 + background: #ffe7e7 !important;
  1936 +}
  1937 +
  1938 +.tip_task_count_dl {
  1939 + width: calc(100% + 22px) !important;
  1940 + margin-left: -11px !important;
  1941 + border-top: 1px solid #e6e6e6 !important;
  1942 +}
  1943 +
  1944 +.tip_task_count_dl > dd:last-child {
  1945 + width: calc(100% - 50px) !important;
  1946 + border-right: 0 !important;
  1947 + height: 35px !important;
  1948 + background: #f3f3f3;
  1949 + margin-bottom: -3px;
  1950 +}
  1951 +
  1952 +.tip_task_count_dl > dd:nth-of-type(1) {
  1953 + text-align: center;
  1954 + border-right: 0 !important;
  1955 + width: 48px !important;
  1956 +}
  1957 +
  1958 +.tip_task_count_dl > dd:nth-of-type(1) > i {
  1959 + padding: 6px;
  1960 + cursor: pointer;
  1961 +}
  1962 +
  1963 +.tip_task_count_dl > dd:nth-of-type(1) > i:hover {
  1964 + background: #ebebeb;
  1965 +}
  1966 +
  1967 +.tip_task_count_dl.c_task_error > dd:last-child {
  1968 + background: #ff8a81;
  1969 +}
  1970 +
  1971 +.tip_task_count_dl > dd > span {
  1972 + font-size: 13px;
  1973 + color: #000;
  1974 + height: 55px;
  1975 + display: inline-block;
  1976 + padding: 7px 0;
  1977 + border-radius: 0;
  1978 + text-indent: 12px;
  1979 +}
  1980 +
  1981 +.tip_task_list > dl:nth-last-child(2) {
  1982 + border-bottom: 0 !important;
  1983 +}
  1984 +
  1985 +.c_task_mileage_error {
  1986 + border: 1px solid rgba(218, 13, 13, 0.2);
  1987 + border-bottom-color: rgba(213, 37, 37, 0.3);
  1988 + background-image: -webkit-linear-gradient(top, #ff6155, #F44336);
  1989 +}
  1990 +
  1991 +.uk-badge.c_task.c_task_mileage_error:hover:hover {
  1992 + background-image: none;
  1993 + background: #ff6155;
  1994 + border: 1px solid rgba(213, 37, 37, 0.3);
  1995 +}
  1996 +
  1997 +.grey_link {
  1998 + color: #adabab;
  1999 +}
  2000 +
  2001 +#sch_car_info_all-modal tr.ct_active {
  2002 + -moz-animation: twinkle_bg .9s ease-in-out;
  2003 + -webkit-animation: twinkle_bg .9s ease-in-out;
  2004 +}
  2005 +
  2006 +#sch_car_info_all-modal .uk-table-hover tr:hover{
  2007 + background: #dddddd;
  2008 +}
  2009 +
  2010 +@-moz-keyframes twinkle_bg {
  2011 + 0% {
  2012 + background: rgba(254, 235, 69, 0.38);
  2013 + }
  2014 + 25% {
  2015 + background: rgba(254, 235, 69, 0.7);
  2016 + }
  2017 + 50% {
  2018 + background: rgba(254, 235, 69, 0.3);
  2019 + }
  2020 + 75% {
  2021 + background: rgba(254, 235, 69, 0.7);
  2022 + }
  2023 + 100% {
  2024 + background: rgba(254, 235, 69, 0.38);
  2025 + }
  2026 +}
  2027 +
  2028 +@-webkit-keyframes twinkle_bg {
  2029 + 0% {
  2030 + background: rgba(254, 235, 69, 0.38);
  2031 + }
  2032 + 25% {
  2033 + background: rgba(254, 235, 69, 0.7);
  2034 + }
  2035 + 50% {
  2036 + background: rgba(254, 235, 69, 0.3);
  2037 + }
  2038 + 75% {
  2039 + background: rgba(254, 235, 69, 0.7);
  2040 + }
  2041 + 100% {
  2042 + background: rgba(254, 235, 69, 0.38);
  2043 + }
  2044 +}
  2045 +
  2046 +.home_svg_tips>div{
  2047 + overflow: hidden;
  2048 + text-overflow: ellipsis;
  2049 + white-space: nowrap;
  2050 +}
  2051 +
  2052 +.tab-line.destroy>a{
  2053 + background: #ff5c5c;
  2054 + color: #fff !important;
  2055 + border-radius: 0;
  2056 +}
  2057 +
  2058 +.tab-line.destroy>a:hover{
  2059 + background: #ff3333 !important;
  2060 + border-color: #ff3333 !important;
  2061 +}
  2062 +
  2063 +.uk-tab>li.uk-active.destroy>a{
  2064 + color: red !important;
  2065 +}
  2066 +
  2067 +.uk-tab>li.uk-active.destroy>a:hover{
  2068 + background: #fff !important;
  2069 +}
  2070 +
  2071 +.warn_multi_station{
  2072 + font-size: 12px;
  2073 + margin-left: 40px;
  2074 + background: yellow;
  2075 + color: #1c1c1c;
  2076 + padding: 4px 10px;
  2077 + cursor: pointer;
  2078 + display: none;
  2079 +}
  2080 +
  2081 +.warn_multi_station:hover{
  2082 + background: #f8f81e;
  2083 +}
  2084 +
  2085 +.tp_info_icon{
  2086 + font-size: 14px;
  2087 + cursor: pointer;
  2088 +}
  2089 +
  2090 +g.gps-wrap rect.twinkle[updown="0"] {
  2091 + animation: anim_bg_twinkle_up 1.4s;
  2092 +}
  2093 +
  2094 +@keyframes anim_bg_twinkle_up {
  2095 + 0% {
  2096 + fill: yellow;
  2097 + stroke: yellow;
  2098 + }
  2099 + 25% {
  2100 + stroke: rgb(62, 80, 179);
  2101 + fill: rgb(62, 80, 179);
  2102 + }
  2103 + 50% {
  2104 + fill: yellow;
  2105 + stroke: yellow;
  2106 + }
  2107 + 100% {
  2108 + stroke: rgb(62, 80, 179);
  2109 + fill: rgb(62, 80, 179);
  2110 + }
  2111 +}
  2112 +
  2113 +g.gps-wrap rect.twinkle[updown="1"] {
  2114 + animation: anim_bg_twinkle_down 1.4s;
  2115 +}
  2116 +
  2117 +@keyframes anim_bg_twinkle_down {
  2118 + 0% {
  2119 + fill: yellow;
  2120 + stroke: yellow;
  2121 + }
  2122 + 25% {
  2123 + stroke: #c94f21;
  2124 + fill: #c94f21;
  2125 + }
  2126 + 50% {
  2127 + fill: yellow;
  2128 + stroke: yellow;
  2129 + }
  2130 + 100% {
  2131 + stroke: #c94f21;
  2132 + fill: #c94f21;
  2133 + }
2130 } 2134 }
2131 \ No newline at end of file 2135 \ No newline at end of file
src/main/resources/static/real_control_v2/js/platform/carErrorStop.js 0 → 100644
  1 +/**
  2 + * 车辆异常停车相关
  3 + */
  4 +var gb_carerrorstop = (function () {
  5 + var $wrap = $('.multi_plat_msg_pop_wrap');
  6 + var max = 5;
  7 +
  8 + var pop = function (data) {
  9 + debugger
  10 + //时间格式化
  11 + var stm = moment(data.bysj);
  12 + data.timeStr = stm.format('HH时mm分');
  13 + data.dateTimeStr = stm.format('YYYY-MM-DD HH:mm')
  14 + data.type = 'ces';
  15 +
  16 + var htmlStr = template('ces_plat_msg_template', data);
  17 + var items = $wrap.find('.multi_plat_msg_pop'), len = items.length;
  18 + if (len >= max)
  19 + $wrap.find('.multi_plat_msg_pop:lt(' + (len - max) + ')').remove();
  20 +
  21 + $wrap.append(htmlStr);
  22 + };
  23 +
  24 + return {
  25 + pop: pop
  26 + }
  27 +})();
0 \ No newline at end of file 28 \ No newline at end of file
src/main/resources/static/real_control_v2/js/safe_driv/safeDriv.js
1 -/**  
2 - * 安全驾驶相关  
3 - */  
4 -var gb_safe_driv = (function () {  
5 -  
6 - var codes = {  
7 - 'A1': '手部违规',  
8 - 'A2': '摄像头偏离',  
9 - 'A3': '安全带',  
10 - 'A4': '未戴袖章',  
11 - 'A5': '眨眼/疲劳驾驶',  
12 - 'A6': '打哈欠/打瞌睡',  
13 - 'A7': '与人交谈',  
14 - 'A9': '玩手机'  
15 - };  
16 -  
17 - var path = 'http://180.166.5.82:9005/CurrentSafeDriving/';  
18 -  
19 - var $wrap = $('.safe_driv_pop_wrap');  
20 - var max = 5;  
21 -  
22 - var pop = function (sd) {  
23 - //时间格式化  
24 - var stm = moment(sd.ts);  
25 - sd.timeStr = stm.format('HH时mm分ss秒');  
26 - //异常状态文本  
27 - sd.ycztText = codes[sd.yczltype];  
28 - //图片地址  
29 - var p = (sd.sbbh+'_'+sd.yczltype+'_'+stm.format('YYYYMMDDHHmmss'));  
30 - var url = stm.format('YYYYMMDD')+'/'+p+'/'+p;  
31 - sd.url = path + url + '.gif';  
32 -  
33 - var htmlStr = template('safe_driv_item-temp', sd);  
34 - var items = $wrap.find('.safe_driv_pop'), len = items.length;  
35 - if (len >= max)  
36 - $wrap.find('.safe_driv_pop:lt(' + (len - max) + ')').remove();  
37 -  
38 - $wrap.append(htmlStr);  
39 - };  
40 -  
41 -  
42 -  
43 - $wrap.on('click', '.safe_driv_pop', function () {  
44 - var nbbm = $(this).data('nbbm');  
45 - var call_btn_html = '<button class="uk-button uk-button-mini uk-button-primary" ' +  
46 - 'id="m_voip_call_btn_001" ' +  
47 - 'type="button" ' +  
48 - 'data-nbbm="'+nbbm+'">打电话</button>';  
49 -  
50 - var title = $(this).data('title') + '&nbsp;' + call_btn_html;  
51 - var url = $(this).data('url');  
52 - $(this).remove();  
53 -  
54 - var lightbox = UIkit.lightbox.create([  
55 - {title: title, 'source': url}  
56 - ], {keyboard: false});  
57 -  
58 - lightbox.show();  
59 - });  
60 -  
61 - var channelMap = {  
62 - 'A1': 1,  
63 - 'A2': 1,  
64 - 'A3': 1,  
65 - 'A9': 1,  
66 - 'A4': 2,  
67 - 'A5': 2,  
68 - 'A6': 2,  
69 - 'A7': 2  
70 - };  
71 -/* var showVedioModal = function (type) {  
72 - var channel = channelMap[type]?channelMap[type]:1;  
73 - open_modal_dom(vedioModal.replace('^^channel^^', channel) ,{}, {modal: false});  
74 - $('#ssspVedioModal #vedioIframe').on('load', function () {  
75 - var that = this;  
76 - setTimeout(function () {  
77 - $(that).show();  
78 - $('#ssspVedioModal p.loading').remove();  
79 - }, 500);  
80 - });  
81 - };*/  
82 -  
83 -/* $(document).on('click', '#openVedioModalBtn', function () {  
84 - showVedioModal($(this).data('type'));  
85 - });*/  
86 -  
87 -  
88 -/* var showCallPhoneModal = function () {  
89 - open_modal_dom(phoneModal ,{}, {modal: false});  
90 - $('#callPhoneModal #phoneIframe').on('load', function () {  
91 - var that = this;  
92 - var iframe = this.contentWindow.document.body;  
93 - setTimeout(function () {  
94 - //修改css  
95 - $(iframe).find('.CallCenterToolBar').css('height', '200px').css('width', '100%').css('top', '10px').css('left', 'calc(50% - 148px)').css('box-shadow', 'none');  
96 - $(iframe).find('.CallCenterToolBar .top').css('display', 'none');  
97 -  
98 - $('.toolBar td[data-action=call]', iframe).trigger('click');  
99 -  
100 - //焦点  
101 - $('input#telNumber', iframe).focus();  
102 -  
103 - $(that).show();  
104 - $('#callPhoneModal p.loading').remove();  
105 - }, 700);  
106 - });  
107 - };*/  
108 -  
109 - $(document).on('click', '#m_voip_call_btn_001', function () {  
110 - //debugger  
111 - var $lb = $('.uk-modal-dialog-lightbox');  
112 - var X = $lb.offset().top + $lb.height() - 240;  
113 - var Y = $lb.offset().left + $lb.width();  
114 -  
115 - var nbbm = $(this).data('nbbm');  
116 -  
117 - var style = 'top: '+X+'px;left: '+Y+'px;height: '+$lb.height()+'px';  
118 - var htmlStr = template('voip_call_info_panel-temp', {style: style, nbbm: nbbm});  
119 - $lb.css('width', ($lb.width() + 260) + 'px');  
120 - $('.uk-lightbox-content', $lb.parent()).append(htmlStr);  
121 -  
122 - $(this).remove();  
123 - gb_call_phone.init(nbbm);  
124 - });  
125 -  
126 -  
127 - return {  
128 - pop: pop,  
129 - safeCode: codes,  
130 - urlPath: path//,  
131 - //showVedioModal: showVedioModal  
132 - } 1 +/**
  2 + * 安全驾驶相关
  3 + */
  4 +var gb_safe_driv = (function () {
  5 +
  6 + var codes = {
  7 + 'B4': '未带口罩',
  8 + 'A1': '手部违规',
  9 + 'A2': '摄像头偏离',
  10 + 'A3': '安全带',
  11 + 'A4': '未戴袖章',
  12 + 'A5': '眨眼/疲劳驾驶',
  13 + 'A6': '打哈欠/打瞌睡',
  14 + 'A7': '与人交谈',
  15 + 'A9': '玩手机',
  16 + 'A11': '抽烟',
  17 + 'A12': '打电话'
  18 + };
  19 +
  20 + var path = '/CurrentSafeDriving/';
  21 +
  22 + var $wrap = $('.multi_plat_msg_pop_wrap');
  23 + var max = 5;
  24 +
  25 + var pop = function (sd) {
  26 + //时间格式化
  27 + var stm = moment(sd.ts);
  28 + sd.timeStr = stm.format('HH时mm分ss秒');
  29 + //异常状态文本
  30 + if(sd.jctype == 'B4')
  31 + sd.ycztText = codes[sd.jctype];
  32 + else
  33 + sd.ycztText = codes[sd.yczltype];
  34 + var p;
  35 + //图片地址
  36 + if(sd.jctype == 'B4')
  37 + p = (sd.sbbh+'_A'+sd.yczltype+'_'+stm.format('YYYYMMDDHHmmss'));
  38 + else
  39 + p = (sd.sbbh+'_'+sd.yczltype+'_'+stm.format('YYYYMMDDHHmmss'));
  40 +
  41 + var url = stm.format('YYYYMMDD')+'/'+p+'/'+p;
  42 + sd.url = path + url + '.gif';
  43 + sd.type = 'sd';
  44 +
  45 + var htmlStr = template('sd_plat_msg_template', sd);
  46 + var items = $wrap.find('.multi_plat_msg_pop'), len = items.length;
  47 + if (len >= max)
  48 + $wrap.find('.multi_plat_msg_pop:lt(' + (len - max) + ')').remove();
  49 +
  50 + $wrap.append(htmlStr);
  51 + };
  52 +
  53 +
  54 +
  55 + $wrap.on('click', '.multi_plat_msg_pop', function () {
  56 + var type = $(this).data('type');
  57 + switch (type) {
  58 + // 安全驾驶平台的数据
  59 + case 'sd':
  60 + var nbbm = $(this).data('nbbm'), ts = $(this).data('ts');
  61 + var call_btn_html = '<button class="uk-button uk-button-mini uk-button-primary" ' +
  62 + 'id="m_voip_call_btn_001" ' +
  63 + 'type="button" ' +
  64 + 'data-nbbm="'+nbbm+'">打电话</button>';
  65 +
  66 + var title = $(this).data('title') + '&nbsp;' + call_btn_html;
  67 + var url = $(this).data('url');
  68 + $(this).remove();
  69 +
  70 + var image = new Image();
  71 + image.onload = function() {
  72 + var lightbox = UIkit.lightbox.create([
  73 + {title: title, 'source': url}
  74 + ], {keyboard: false});
  75 +
  76 + lightbox.show();
  77 + }
  78 + image.src = url;
  79 +
  80 + $.post('/realSchedule/ackDsm', {ts : ts, nbbm : nbbm}, function(res) {});
  81 + break;
  82 + // 应急预案平台
  83 + case 'cp':
  84 + var id = $(this).data('id'), confirm = $(this).data('confirm');
  85 + $(this).remove();
  86 + if (confirm == '确认') {
  87 + $.post('/realSchedule/ackCp', {id : id}, function(res) {});
  88 + }
  89 + break;
  90 + // 浦东公交维修库
  91 + case 'mt':
  92 + var data = { zbh: $(this).data('zbh'), bydj: $(this).data('bydj'), bysj: $(this).data('bysj'), bydd: $(this).data('bydd')};
  93 + $(this).remove();
  94 + window.localStorage.setItem('mtPlanModal', JSON.stringify(data));
  95 + open_modal('/real_control_v2/fragments/multi_plat_msg/mt_plan_modal.html', {}, {center: false, bgclose: false});
  96 + break;
  97 + // 企业信息化运行监控中心
  98 + case 'ces':
  99 + var data = { nbbm: $(this).data('zbh'), clZbh: $(this).data('zbh'), start: $(this).data('start'), fcsjActualTime: $(this).data('start'), end: $(this).data('end'), zdsjActualTime: $(this).data('end'),};
  100 + $(this).remove();
  101 + if(!$('.layui-layer.play_back-layer').is(':visible')){
  102 + gb_map_play_back.initParams(data);
  103 + } else {
  104 + gb_map_play_back.setParam(data);
  105 + }
  106 + break;
  107 + // 运管中心进出场绕改道
  108 + case 'inoutpark':
  109 + $(this).remove();
  110 + break;
  111 + default:
  112 + break;
  113 + }
  114 +
  115 + });
  116 +
  117 + var channelMap = {
  118 + 'A1': 1,
  119 + 'A2': 1,
  120 + 'A3': 1,
  121 + 'A9': 1,
  122 + 'A4': 2,
  123 + 'A5': 2,
  124 + 'A6': 2,
  125 + 'A7': 2
  126 + };
  127 +/* var showVedioModal = function (type) {
  128 + var channel = channelMap[type]?channelMap[type]:1;
  129 + open_modal_dom(vedioModal.replace('^^channel^^', channel) ,{}, {modal: false});
  130 + $('#ssspVedioModal #vedioIframe').on('load', function () {
  131 + var that = this;
  132 + setTimeout(function () {
  133 + $(that).show();
  134 + $('#ssspVedioModal p.loading').remove();
  135 + }, 500);
  136 + });
  137 + };*/
  138 +
  139 +/* $(document).on('click', '#openVedioModalBtn', function () {
  140 + showVedioModal($(this).data('type'));
  141 + });*/
  142 +
  143 +
  144 +/* var showCallPhoneModal = function () {
  145 + open_modal_dom(phoneModal ,{}, {modal: false});
  146 + $('#callPhoneModal #phoneIframe').on('load', function () {
  147 + var that = this;
  148 + var iframe = this.contentWindow.document.body;
  149 + setTimeout(function () {
  150 + //修改css
  151 + $(iframe).find('.CallCenterToolBar').css('height', '200px').css('width', '100%').css('top', '10px').css('left', 'calc(50% - 148px)').css('box-shadow', 'none');
  152 + $(iframe).find('.CallCenterToolBar .top').css('display', 'none');
  153 +
  154 + $('.toolBar td[data-action=call]', iframe).trigger('click');
  155 +
  156 + //焦点
  157 + $('input#telNumber', iframe).focus();
  158 +
  159 + $(that).show();
  160 + $('#callPhoneModal p.loading').remove();
  161 + }, 700);
  162 + });
  163 + };*/
  164 +
  165 + $(document).on('click', '#m_voip_call_btn_001', function () {
  166 + //debugger
  167 + var $lb = $('.uk-modal-dialog-lightbox');
  168 + var X = $lb.offset().top + $lb.height() - 240;
  169 + var Y = $lb.offset().left + $lb.width();
  170 +
  171 + var nbbm = $(this).data('nbbm');
  172 +
  173 + var style = 'top: '+X+'px;left: '+Y+'px;height: '+$lb.height()+'px';
  174 + var htmlStr = template('voip_call_info_panel-temp', {style: style, nbbm: nbbm});
  175 + $lb.css('width', ($lb.width() + 260) + 'px');
  176 + $('.uk-lightbox-content', $lb.parent()).append(htmlStr);
  177 +
  178 + $(this).remove();
  179 + gb_call_phone.init(nbbm);
  180 + });
  181 +
  182 +
  183 + return {
  184 + pop: pop,
  185 + safeCode: codes,
  186 + urlPath: path//,
  187 + //showVedioModal: showVedioModal
  188 + }
133 })(); 189 })();
134 \ No newline at end of file 190 \ No newline at end of file
src/main/resources/static/real_control_v2/js/websocket/sch_websocket.js
1 -var gb_sch_websocket = (function () {  
2 -  
3 - var temps;  
4 - $.get('/real_control_v2/fragments/line_schedule/sys_mailbox.html', function (dom) {  
5 - temps = gb_common.compileTempByDom(dom);  
6 - });  
7 -  
8 - var schSock = null;  
9 - var recInterval = null;  
10 - var reConnSpace = 1500;//重连间隔  
11 - var reConnCount; //重连次数  
12 - var maxReConn = 6; //最多重连次数  
13 - var new_conn = function () {  
14 - schSock = new SockJS('/sockjs/realcontrol');  
15 - schSock.onopen = function (e) {  
16 - if(reConnCount && reConnCount > 1){  
17 - gb_schedule_table.refreshAll();  
18 - console.log('重新连接,刷新班次');  
19 - }  
20 - reConnCount = 1;  
21 - clearInterval(recInterval);  
22 - console.log('webSocket[realcontrol] onopen');  
23 - $('body>.north').removeClass('scok-colse');  
24 - setTimeout(regListen, 500);  
25 - };  
26 -  
27 - //接收消息  
28 - schSock.onmessage = function (e) {  
29 - try {  
30 - var jsonMsg = $.parseJSON(e.data);  
31 - msgHandle[jsonMsg.fn](jsonMsg);  
32 - } catch (e) {  
33 - console.log(e, e.data);  
34 - }  
35 - };  
36 -  
37 - //断开  
38 - schSock.onclose = function (e) {  
39 - console.log('和服务器连接断开....', e);  
40 - $('body>.north').addClass('scok-colse');  
41 - //1.5秒后重新连接  
42 - recInterval = setTimeout(function () {  
43 - reConnCount++;  
44 - if(reConnCount > maxReConn){  
45 - $('body>.north').addClass('re_conn_error');  
46 - clearInterval(recInterval);  
47 - return;  
48 - }  
49 - new_conn();  
50 - }, reConnSpace * reConnCount);  
51 - };  
52 - };  
53 -  
54 - //初始化websocket连接  
55 - new_conn();  
56 -  
57 - function regListen() {  
58 - //注册线路监听  
59 - var data = {  
60 - operCode: 'register_line',  
61 - idx: gb_data_basic.line_idx  
62 - };  
63 - schSock.send(JSON.stringify(data));  
64 - console.log('regListen....', data);  
65 - }  
66 -  
67 - /**  
68 - * 计算未处理消息  
69 - */  
70 - var calcUntreated = function (lineCode) {  
71 - var size = $('li.line_schedule[data-id=' + lineCode + '] .sys-mailbox .sys-mail-item').length;  
72 - $('#badge_untreated_num_' + lineCode).text(size);  
73 - };  
74 -  
75 - var calcUntreatedAll = function () {  
76 - $('#main-tab-content li.line_schedule').each(function () {  
77 - calcUntreated($(this).data('id'));  
78 - });  
79 - };  
80 -  
81 -  
82 - //80协议上报  
83 - var report80 = function (msg) {  
84 - msg.dateStr = moment(msg.timestamp).format('HH:mm');  
85 - msg.text = gb_common.reqCode80[msg.data.requestCode];  
86 - if (!msg.text)  
87 - msg.text = '(未知的请求码 ' + msg.data.requestCode + ')';  
88 -  
89 - var $item = $(temps['sys-note-80-temp'](msg));  
90 - findMailBox(msg.data.lineId).prepend($item);  
91 - //tts  
92 - var ttsMsg = $item.find('.uk-panel-title').text();  
93 - gb_tts.speak(ttsMsg, msg.data.lineId);  
94 -  
95 - calcUntreated(msg.data.lineId);  
96 - };  
97 -  
98 - var safeDriv = function (msg) {  
99 - gb_safe_driv.pop(msg.t);  
100 - };  
101 -  
102 - /**  
103 - * 自动误点调整  
104 - * @param msg  
105 - */  
106 - var autoWdtz = function (msg) {  
107 - var schId = msg.id;  
108 - var minute = msg.minute;  
109 - var lineCode = msg.lineCode;  
110 - gb_schedule_table.showLateBadge(lineCode, schId, minute);  
111 - if(msg['cancelId']){  
112 - gb_schedule_table.cancelLateBadge(lineCode, msg['cancelId']);  
113 - }  
114 - };  
115 -  
116 - var waitRemoves = [];  
117 - //车辆发出  
118 - var faChe = function (msg) {  
119 - gb_schedule_table.updateSchedule(msg.t);  
120 - msg.domId = 'fache_' + msg.t.id + '_' + parseInt(Math.random() * 10000);  
121 -  
122 - var $item = $(temps['sys-note-42-temp'](msg));  
123 - findMailBox(msg.t.xlBm).prepend($item);  
124 - waitRemoves.push({  
125 - t: currentSecond(),  
126 - dom: msg.domId  
127 - });  
128 -  
129 - //tts  
130 - var ttsMsg = $item.find('.title').text();  
131 - gb_tts.speak(ttsMsg, msg.t.xlBm);  
132 - gb_schedule_table.calc_yfwf_num(msg.t.xlBm);  
133 -  
134 - calcUntreated(msg.t.xlBm);  
135 - };  
136 -  
137 - //到达终点  
138 - var zhongDian = function (msg) {  
139 - gb_schedule_table.updateSchedule(msg.t);  
140 - gb_schedule_table.updateSchedule(msg.nt);  
141 - msg.domId = 'zhongDian_' + msg.t.id + '_' + parseInt(Math.random() * 10000);  
142 -  
143 - var $item = $(temps['sys-note-42_1-temp'](msg));  
144 - findMailBox(msg.t.xlBm).prepend($item);  
145 - waitRemoves.push({  
146 - t: currentSecond(),  
147 - dom: msg.domId  
148 - });  
149 - //tts  
150 - var ttsMsg = $item.find('.title').text();  
151 - gb_tts.speak(ttsMsg, msg.t.xlBm);  
152 -  
153 - calcUntreated(msg.t.xlBm);  
154 - //更新路牌公里统计面板  
155 - gb_schedule_table.showLpMileageTipBySch(msg.t);  
156 - };  
157 -  
158 - //服务器通知刷新班次  
159 - var refreshSch = function (msg) {  
160 - gb_schedule_table.updateSchedule(msg.ts);  
161 - /*//重新计算应发未发  
162 - var idx={};  
163 - $.each(msg.ts, function(i, t){  
164 - if(idx[t.xlBm])  
165 - return true;  
166 - gb_schedule_table.calc_yfwf_num(t.xlBm);  
167 - idx[t.xlBm]=1;  
168 - });*/  
169 - };  
170 -  
171 - //80消息确认  
172 - var d80Confirm = function (msg) {  
173 - $('.sys-mailbox .sys-note-80[data-id=' + msg.id + ']').remove();  
174 - //重新计算未读消息  
175 - calcUntreated(msg.lineId);  
176 - //重新计算应发未发  
177 - gb_schedule_table.calc_yfwf_num(msg.lineId);  
178 - };  
179 -  
180 - //指令状态改变  
181 - var directiveStatus = function (msg) {  
182 - gb_schedule_table.updateSchedule(msg.t);  
183 - };  
184 -  
185 - //班次信号状态  
186 - var signalState = function (msg) {  
187 - gb_signal_state.put(msg.data);  
188 - };  
189 -  
190 - var msgHandle = {  
191 - report80: report80,  
192 - faChe: faChe,  
193 - zhongDian: zhongDian,  
194 - refreshSch: refreshSch,  
195 - d80Confirm: d80Confirm,  
196 - directive: directiveStatus,  
197 - signal_state: signalState,  
198 - deviceOffline: deviceOffline,  
199 - safeDriv: safeDriv,  
200 - auto_wdtz: autoWdtz  
201 - };  
202 -  
203 - function currentSecond() {  
204 - return Date.parse(new Date()) / 1000;  
205 - }  
206 -  
207 - var mailBoxs = {};  
208 -  
209 - function findMailBox(lineCode) {  
210 - if (mailBoxs[lineCode])  
211 - return mailBoxs[lineCode];  
212 -  
213 - var mbox = $('li.line_schedule[data-id=' + lineCode + ']').find('div.sys-mailbox');  
214 - mailBoxs[lineCode] = mbox;  
215 - return mbox;  
216 - }  
217 -  
218 -  
219 - //42确定  
220 - $(document).on('click', '.sys-mailbox .sys-note-42 .uk-button-primary', function (e) {  
221 - e.stopPropagation();  
222 - $(this).parents('.sys-note-42').remove();  
223 - var size = $(this).parents('.sys-mailbox').find('.sys-mail-item').length  
224 - , lineCode = $(this).data('line');  
225 -  
226 - $('#badge_untreated_num_' + lineCode).text(size);  
227 - });  
228 -  
229 - //42消息点击  
230 - $(document).on('click', '.sys-mailbox .sys-note-42', function () {  
231 - var lineCode = $(this).parents('li.line_schedule').data('id')  
232 - , id = $(this).data('id');  
233 - var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];  
234 - var dl = gb_schedule_table.scroToDl(sch);  
235 - //高亮  
236 - gb_schedule_table.reset_drag_active_all(dl);  
237 - dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click');  
238 - });  
239 -  
240 - //80消息点击  
241 - $(document).on('click', '.sys-mailbox .sys-note-80', function () {  
242 - var lineCode = $(this).parents('li.line_schedule').data('id')  
243 - , id = $(this).data('schid');  
244 - var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];  
245 - var dl = gb_schedule_table.scroToDl(sch);  
246 - //高亮  
247 - gb_schedule_table.reset_drag_active_all(dl);  
248 - dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click');  
249 - });  
250 -  
251 - //80同意  
252 - $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button-primary', function (e) {  
253 - e.stopPropagation();  
254 - $(this).attr('disabled', 'disabled');  
255 - var panel = $(this).parents('.sys-note-80')  
256 - , id = panel.data('id');  
257 -  
258 - reply80({id: id, reply: 0});  
259 - return false;  
260 - });  
261 -  
262 - //80不同意  
263 - $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button.reject', function (e) {  
264 - e.stopPropagation();  
265 - $(this).attr('disabled', 'disabled');  
266 - var panel = $(this).parents('.sys-note-80')  
267 - , id = panel.data('id');  
268 -  
269 - reply80({id: id, reply: -1});  
270 - return false;  
271 - });  
272 -  
273 - var reply80 = function (data, cb) {  
274 - gb_common.$post('/directive/reply80', data, function (rs) {  
275 - if (rs.msg)  
276 - notify_succ(rs.msg);  
277 - cb && cb();  
278 - });  
279 - };  
280 -  
281 -  
282 - //定时到离站信使清理掉  
283 - !function () {  
284 - var f = arguments.callee,  
285 - ct = Date.parse(new Date()) / 1000,  
286 - item, elem;  
287 - try {  
288 - for (var i = 0; i < 1000; i++) {  
289 - if (waitRemoves.length == 0)  
290 - break;  
291 - item = waitRemoves[0];  
292 - if (ct - item.t >= 30) {  
293 - waitRemoves.shift();  
294 - elem = $('#' + item.dom);  
295 - if (elem)  
296 - elem.remove();  
297 - }  
298 - }  
299 - } catch (e) {  
300 - console.log(e);  
301 - }  
302 -  
303 - //计算未读消息  
304 - calcUntreatedAll();  
305 - setTimeout(f, 5000);  
306 - }();  
307 -  
308 - /**  
309 - * 设备掉线  
310 - * @param msg  
311 - */  
312 - function deviceOffline(msg) {  
313 - gb_data_gps.deviceOffline(msg.gps);  
314 - }  
315 -  
316 - /**  
317 - * 信号撤销  
318 - */  
319 - $(document).on('click','.sys-note-42 .cancel_link', function () {  
320 - var id = $(this).data('id'),  
321 - lineCode = $(this).data('line');  
322 -  
323 - var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];  
324 - if(!sch)  
325 - return;  
326 -  
327 - var confirmBtn = $(this).parent().find('.uk-button-primary');  
328 - var type = $(this).data('type');  
329 - var fun = type==1?gb_schedule_context_menu.cxzx:gb_schedule_context_menu.cxsf;  
330 -  
331 - fun(sch, function () {  
332 - confirmBtn.trigger('click');  
333 - });  
334 - });  
335 -  
336 - /**  
337 - * 到站信号修改  
338 - */  
339 - $(document).on('click', '.sys-note-42 .edit_link', function () {  
340 - var id = $(this).data('id'),  
341 - lineCode = $(this).data('line');  
342 -  
343 - var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];  
344 - if(!sch)  
345 - return;  
346 -  
347 - var nextSch = gb_schedule_table.getNextSch(sch);  
348 - gb_schedule_context_menu.dftz(nextSch);  
349 - });  
350 -  
351 - /**  
352 - * 信使 sys-note-80 编辑  
353 - */  
354 - $(document).on('click', '.sys-note-80 .edit_link', function () {  
355 - var id = $(this).data('id'),  
356 - lineCode = $(this).data('line');  
357 -  
358 - var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];  
359 - if(!sch)  
360 - return;  
361 -  
362 - gb_schedule_context_menu.fcxxwt(sch);  
363 - });  
364 -  
365 - return {  
366 - sock: function () {  
367 - return schSock;  
368 - }  
369 - };  
370 -})(); 1 +var gb_sch_websocket = (function () {
  2 +
  3 + var temps;
  4 + $.get('/real_control_v2/fragments/line_schedule/sys_mailbox.html', function (dom) {
  5 + temps = gb_common.compileTempByDom(dom);
  6 + });
  7 +
  8 + var schSock = null;
  9 + var recInterval = null;
  10 + var reConnSpace = 1500;//重连间隔
  11 + var reConnCount; //重连次数
  12 + var maxReConn = 6; //最多重连次数
  13 + var new_conn = function () {
  14 + schSock = new SockJS('/sockjs/realcontrol');
  15 + schSock.onopen = function (e) {
  16 + if(reConnCount && reConnCount > 1){
  17 + gb_schedule_table.refreshAll();
  18 + console.log('重新连接,刷新班次');
  19 + }
  20 + reConnCount = 1;
  21 + clearInterval(recInterval);
  22 + console.log('webSocket[realcontrol] onopen');
  23 + $('body>.north').removeClass('scok-colse');
  24 + setTimeout(regListen, 500);
  25 + };
  26 +
  27 + //接收消息
  28 + schSock.onmessage = function (e) {
  29 + try {
  30 + var jsonMsg = $.parseJSON(e.data);
  31 + msgHandle[jsonMsg.fn](jsonMsg);
  32 + } catch (e) {
  33 + console.log(e, e.data);
  34 + }
  35 + };
  36 +
  37 + //断开
  38 + schSock.onclose = function (e) {
  39 + console.log('和服务器连接断开....', e);
  40 + $('body>.north').addClass('scok-colse');
  41 + //1.5秒后重新连接
  42 + recInterval = setTimeout(function () {
  43 + reConnCount++;
  44 + if(reConnCount > maxReConn){
  45 + $('body>.north').addClass('re_conn_error');
  46 + clearInterval(recInterval);
  47 + return;
  48 + }
  49 + new_conn();
  50 + }, reConnSpace * reConnCount);
  51 + };
  52 + };
  53 +
  54 + //初始化websocket连接
  55 + new_conn();
  56 +
  57 + function regListen() {
  58 + //注册线路监听
  59 + var data = {
  60 + operCode: 'register_line',
  61 + idx: gb_data_basic.line_idx
  62 + };
  63 + schSock.send(JSON.stringify(data));
  64 + console.log('regListen....', data);
  65 + }
  66 +
  67 + /**
  68 + * 计算未处理消息
  69 + */
  70 + var calcUntreated = function (lineCode) {
  71 + var size = $('li.line_schedule[data-id=' + lineCode + '] .sys-mailbox .sys-mail-item').length;
  72 + $('#badge_untreated_num_' + lineCode).text(size);
  73 + };
  74 +
  75 + var calcUntreatedAll = function () {
  76 + $('#main-tab-content li.line_schedule').each(function () {
  77 + calcUntreated($(this).data('id'));
  78 + });
  79 + };
  80 +
  81 +
  82 + //80协议上报
  83 + var report80 = function (msg) {
  84 + msg.dateStr = moment(msg.timestamp).format('HH:mm');
  85 + msg.text = gb_common.reqCode80[msg.data.requestCode];
  86 + if (!msg.text)
  87 + msg.text = '(未知的请求码 ' + msg.data.requestCode + ')';
  88 +
  89 + var $item = $(temps['sys-note-80-temp'](msg));
  90 + findMailBox(msg.data.lineId).prepend($item);
  91 + //tts
  92 + var ttsMsg = $item.find('.uk-panel-title').text();
  93 + gb_tts.speak(ttsMsg, msg.data.lineId);
  94 +
  95 + calcUntreated(msg.data.lineId);
  96 + };
  97 +
  98 + var safeDriv = function (msg) {
  99 + gb_safe_driv.pop(msg.t);
  100 + };
  101 +
  102 + /**
  103 + * 自动误点调整
  104 + * @param msg
  105 + */
  106 + var autoWdtz = function (msg) {
  107 + var schId = msg.id;
  108 + var minute = msg.minute;
  109 + var lineCode = msg.lineCode;
  110 + gb_schedule_table.showLateBadge(lineCode, schId, minute);
  111 + if(msg['cancelId']){
  112 + gb_schedule_table.cancelLateBadge(lineCode, msg['cancelId']);
  113 + }
  114 + };
  115 +
  116 + var waitRemoves = [];
  117 + //车辆发出
  118 + var faChe = function (msg) {
  119 + gb_schedule_table.updateSchedule(msg.t);
  120 + msg.domId = 'fache_' + msg.t.id + '_' + parseInt(Math.random() * 10000);
  121 +
  122 + var $item = $(temps['sys-note-42-temp'](msg));
  123 + findMailBox(msg.t.xlBm).prepend($item);
  124 + waitRemoves.push({
  125 + t: currentSecond(),
  126 + dom: msg.domId
  127 + });
  128 +
  129 + //tts
  130 + var ttsMsg = $item.find('.title').text();
  131 + gb_tts.speak(ttsMsg, msg.t.xlBm);
  132 + gb_schedule_table.calc_yfwf_num(msg.t.xlBm);
  133 +
  134 + calcUntreated(msg.t.xlBm);
  135 + };
  136 +
  137 + //到达终点
  138 + var zhongDian = function (msg) {
  139 + gb_schedule_table.updateSchedule(msg.t);
  140 + gb_schedule_table.updateSchedule(msg.nt);
  141 + msg.domId = 'zhongDian_' + msg.t.id + '_' + parseInt(Math.random() * 10000);
  142 +
  143 + var $item = $(temps['sys-note-42_1-temp'](msg));
  144 + findMailBox(msg.t.xlBm).prepend($item);
  145 + waitRemoves.push({
  146 + t: currentSecond(),
  147 + dom: msg.domId
  148 + });
  149 + //tts
  150 + var ttsMsg = $item.find('.title').text();
  151 + gb_tts.speak(ttsMsg, msg.t.xlBm);
  152 +
  153 + calcUntreated(msg.t.xlBm);
  154 + //更新路牌公里统计面板
  155 + gb_schedule_table.showLpMileageTipBySch(msg.t);
  156 + };
  157 +
  158 + //服务器通知刷新班次
  159 + var refreshSch = function (msg) {
  160 + gb_schedule_table.updateSchedule(msg.ts);
  161 + /*//重新计算应发未发
  162 + var idx={};
  163 + $.each(msg.ts, function(i, t){
  164 + if(idx[t.xlBm])
  165 + return true;
  166 + gb_schedule_table.calc_yfwf_num(t.xlBm);
  167 + idx[t.xlBm]=1;
  168 + });*/
  169 + };
  170 +
  171 + //80消息确认
  172 + var d80Confirm = function (msg) {
  173 + $('.sys-mailbox .sys-note-80[data-id=' + msg.id + ']').remove();
  174 + //重新计算未读消息
  175 + calcUntreated(msg.lineId);
  176 + //重新计算应发未发
  177 + gb_schedule_table.calc_yfwf_num(msg.lineId);
  178 + };
  179 +
  180 + //指令状态改变
  181 + var directiveStatus = function (msg) {
  182 + gb_schedule_table.updateSchedule(msg.t);
  183 + };
  184 +
  185 + //班次信号状态
  186 + var signalState = function (msg) {
  187 + gb_signal_state.put(msg.data);
  188 + };
  189 +
  190 + var carErrorStop = function (msg){
  191 + gb_carerrorstop.pop(msg.data);
  192 + };
  193 +
  194 + var msgHandle = {
  195 + report80: report80,
  196 + faChe: faChe,
  197 + zhongDian: zhongDian,
  198 + refreshSch: refreshSch,
  199 + d80Confirm: d80Confirm,
  200 + directive: directiveStatus,
  201 + signal_state: signalState,
  202 + deviceOffline: deviceOffline,
  203 + safeDriv: safeDriv,
  204 + auto_wdtz: autoWdtz,
  205 + carErrorStop: carErrorStop
  206 + };
  207 +
  208 + function currentSecond() {
  209 + return Date.parse(new Date()) / 1000;
  210 + }
  211 +
  212 + var mailBoxs = {};
  213 +
  214 + function findMailBox(lineCode) {
  215 + if (mailBoxs[lineCode])
  216 + return mailBoxs[lineCode];
  217 +
  218 + var mbox = $('li.line_schedule[data-id=' + lineCode + ']').find('div.sys-mailbox');
  219 + mailBoxs[lineCode] = mbox;
  220 + return mbox;
  221 + }
  222 +
  223 +
  224 + //42确定
  225 + $(document).on('click', '.sys-mailbox .sys-note-42 .uk-button-primary', function (e) {
  226 + e.stopPropagation();
  227 + $(this).parents('.sys-note-42').remove();
  228 + var size = $(this).parents('.sys-mailbox').find('.sys-mail-item').length
  229 + , lineCode = $(this).data('line');
  230 +
  231 + $('#badge_untreated_num_' + lineCode).text(size);
  232 + });
  233 +
  234 + //42消息点击
  235 + $(document).on('click', '.sys-mailbox .sys-note-42', function () {
  236 + var lineCode = $(this).parents('li.line_schedule').data('id')
  237 + , id = $(this).data('id');
  238 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  239 + var dl = gb_schedule_table.scroToDl(sch);
  240 + //高亮
  241 + gb_schedule_table.reset_drag_active_all(dl);
  242 + dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click');
  243 + });
  244 +
  245 + //80消息点击
  246 + $(document).on('click', '.sys-mailbox .sys-note-80', function () {
  247 + var lineCode = $(this).parents('li.line_schedule').data('id')
  248 + , id = $(this).data('schid');
  249 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  250 + var dl = gb_schedule_table.scroToDl(sch);
  251 + //高亮
  252 + gb_schedule_table.reset_drag_active_all(dl);
  253 + dl.addClass('relevance-active intimity').find('dd:eq(5)').trigger('click');
  254 + });
  255 +
  256 + //80同意
  257 + $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button-primary', function (e) {
  258 + e.stopPropagation();
  259 + $(this).attr('disabled', 'disabled');
  260 + var panel = $(this).parents('.sys-note-80')
  261 + , id = panel.data('id');
  262 +
  263 + reply80({id: id, reply: 0});
  264 + return false;
  265 + });
  266 +
  267 + //80不同意
  268 + $(document).on('click', '.sys-mailbox .sys-note-80 .uk-button.reject', function (e) {
  269 + e.stopPropagation();
  270 + $(this).attr('disabled', 'disabled');
  271 + var panel = $(this).parents('.sys-note-80')
  272 + , id = panel.data('id');
  273 +
  274 + reply80({id: id, reply: -1});
  275 + return false;
  276 + });
  277 +
  278 + var reply80 = function (data, cb) {
  279 + gb_common.$post('/directive/reply80', data, function (rs) {
  280 + if (rs.msg)
  281 + notify_succ(rs.msg);
  282 + cb && cb();
  283 + });
  284 + };
  285 +
  286 +
  287 + //定时到离站信使清理掉
  288 + !function () {
  289 + var f = arguments.callee,
  290 + ct = Date.parse(new Date()) / 1000,
  291 + item, elem;
  292 + try {
  293 + for (var i = 0; i < 1000; i++) {
  294 + if (waitRemoves.length == 0)
  295 + break;
  296 + item = waitRemoves[0];
  297 + if (ct - item.t >= 30) {
  298 + waitRemoves.shift();
  299 + elem = $('#' + item.dom);
  300 + if (elem)
  301 + elem.remove();
  302 + }
  303 + }
  304 + } catch (e) {
  305 + console.log(e);
  306 + }
  307 +
  308 + //计算未读消息
  309 + calcUntreatedAll();
  310 + setTimeout(f, 5000);
  311 + }();
  312 +
  313 + /**
  314 + * 设备掉线
  315 + * @param msg
  316 + */
  317 + function deviceOffline(msg) {
  318 + gb_data_gps.deviceOffline(msg.gps);
  319 + }
  320 +
  321 + /**
  322 + * 信号撤销
  323 + */
  324 + $(document).on('click','.sys-note-42 .cancel_link', function () {
  325 + var id = $(this).data('id'),
  326 + lineCode = $(this).data('line');
  327 +
  328 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  329 + if(!sch)
  330 + return;
  331 +
  332 + var confirmBtn = $(this).parent().find('.uk-button-primary');
  333 + var type = $(this).data('type');
  334 + var fun = type==1?gb_schedule_context_menu.cxzx:gb_schedule_context_menu.cxsf;
  335 +
  336 + fun(sch, function () {
  337 + confirmBtn.trigger('click');
  338 + });
  339 + });
  340 +
  341 + /**
  342 + * 到站信号修改
  343 + */
  344 + $(document).on('click', '.sys-note-42 .edit_link', function () {
  345 + var id = $(this).data('id'),
  346 + lineCode = $(this).data('line');
  347 +
  348 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  349 + if(!sch)
  350 + return;
  351 +
  352 + var nextSch = gb_schedule_table.getNextSch(sch);
  353 + gb_schedule_context_menu.dftz(nextSch);
  354 + });
  355 +
  356 + /**
  357 + * 信使 sys-note-80 编辑
  358 + */
  359 + $(document).on('click', '.sys-note-80 .edit_link', function () {
  360 + var id = $(this).data('id'),
  361 + lineCode = $(this).data('line');
  362 +
  363 + var sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  364 + if(!sch)
  365 + return;
  366 +
  367 + gb_schedule_context_menu.fcxxwt(sch);
  368 + });
  369 +
  370 + return {
  371 + sock: function () {
  372 + return schSock;
  373 + }
  374 + };
  375 +})();
src/main/resources/static/real_control_v2/main.html
@@ -232,19 +232,30 @@ @@ -232,19 +232,30 @@
232 <script src="/real_control_v2/js/modal_extend.js" merge="custom_js"></script> 232 <script src="/real_control_v2/js/modal_extend.js" merge="custom_js"></script>
233 233
234 <!-- #### 安全驾驶 start ### --> 234 <!-- #### 安全驾驶 start ### -->
235 -<div class="safe_driv_pop_wrap"></div>  
236 -<script id="safe_driv_item-temp" type="text/html">  
237 - <div class="safe_driv_pop uk-animation-slide-bottom" data-nbbm="{{clzbh}}" data-type="{{yczltype}}"  
238 - data-title="{{clzbh}} {{timeStr}} {{ycztText}}" data-url="{{url}}"> 235 +<div class="multi_plat_msg_pop_wrap" ></div>
  236 +<script id="sd_plat_msg_template" type="text/html">
  237 + <div class="multi_plat_msg_pop uk-animation-slide-bottom" data-type="{{type}}" data-nbbm="{{clzbh}}" data-type="{{yczltype}}" data-title="{{clzbh}} {{timeStr}} {{ycztText}}" data-url="{{url}}" data-ts="{{ts}}">
239 <div> 238 <div>
240 <span class="title">异常&nbsp;{{clzbh}}</span> 239 <span class="title">异常&nbsp;{{clzbh}}</span>
  240 + <br/>
241 <span class="text"> {{timeStr}} 出现违规驾驶({{ycztText}})</span> 241 <span class="text"> {{timeStr}} 出现违规驾驶({{ycztText}})</span>
242 <span class="desc">--安全驾驶监管平台</span> 242 <span class="desc">--安全驾驶监管平台</span>
243 </div> 243 </div>
244 </div> 244 </div>
245 </script> 245 </script>
  246 +<script id="ces_plat_msg_template" type="text/html">
  247 + <div class="multi_plat_msg_pop uk-animation-slide-bottom" style="background-color: #00ccff;" data-type="{{type}}" data-zbh="{{nbbm}}" data-start="{{startTimestamp}}" data-end="{{endTimestamp}}">
  248 + <div>
  249 + <span class="title">车辆异常停车</span>
  250 + <br/>
  251 + <span class="text"> {{line}}&nbsp;{{nbbm}}&nbsp;&nbsp;在&nbsp;{{address}}&nbsp;&nbsp;异常停车</span>
  252 + <span class="desc">--企业信息化运行监控中心</span>
  253 + </div>
  254 + </div>
  255 +</script>
246 256
247 <script src="/real_control_v2/js/safe_driv/safeDriv.js" merge="custom_js"></script> 257 <script src="/real_control_v2/js/safe_driv/safeDriv.js" merge="custom_js"></script>
  258 +<script src="/real_control_v2/js/platform/carErrorStop.js" merge="custom_js"></script>
248 <!-- #### 安全驾驶 end ### --> 259 <!-- #### 安全驾驶 end ### -->
249 260
250 <!-- 打电话 --> 261 <!-- 打电话 -->