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 42 \ No newline at end of file
... ...
src/main/java/com/bsth/common/SystemParamKeys.java
... ... @@ -6,4 +6,6 @@ package com.bsth.common;
6 6 public class SystemParamKeys {
7 7  
8 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 2 management.port= 9001
3 3 management.address= 127.0.0.1
4 4  
  5 +spring.task.scheduling.pool.size= 5
  6 +
5 7 spring.jpa.hibernate.ddl-auto= none
6 8 spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
7 9 #DATABASE
8 10 spring.jpa.database= MYSQL
9 11 spring.jpa.show-sql= false
10 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 14 spring.datasource.username= root
13 15 spring.datasource.password= root2jsp
14 16 #DATASOURCE
... ...
src/main/resources/application.properties
1 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 7 # \u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F\u9650\u5236\u914D\u7F6E
8 8 # File size limit
9   -multipart.maxFileSize = -1
  9 +multipart.maxFileSize= -1
10 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 16 # batch insert
17   -hibernate.jdbc.batch_size = 50
18   -debug=true
  17 +hibernate.jdbc.batch_size= 50
19 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 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 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 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 232 <script src="/real_control_v2/js/modal_extend.js" merge="custom_js"></script>
233 233  
234 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 238 <div>
240 239 <span class="title">异常&nbsp;{{clzbh}}</span>
  240 + <br/>
241 241 <span class="text"> {{timeStr}} 出现违规驾驶({{ycztText}})</span>
242 242 <span class="desc">--安全驾驶监管平台</span>
243 243 </div>
244 244 </div>
245 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 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 259 <!-- #### 安全驾驶 end ### -->
249 260  
250 261 <!-- 打电话 -->
... ...