Commit 9e555437c8c96d0fc4cf89df2800ae2c5f14fda4
1 parent
d34a3e38
1.成都配置变更
Showing
7 changed files
with
710 additions
and
712 deletions
src/main/java/com/bsth/entity/directive/D60.java
| @@ -69,7 +69,6 @@ public class D60 extends Directive { | @@ -69,7 +69,6 @@ public class D60 extends Directive { | ||
| 69 | /** | 69 | /** |
| 70 | * 相关联的班次 | 70 | * 相关联的班次 |
| 71 | */ | 71 | */ |
| 72 | - @JsonIgnore | ||
| 73 | @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH) | 72 | @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH) |
| 74 | private ScheduleRealInfo sch; | 73 | private ScheduleRealInfo sch; |
| 75 | 74 |
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
| 1 | -package com.bsth.service.directive; | ||
| 2 | - | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | ||
| 5 | -import com.bsth.common.ResponseCode; | ||
| 6 | -import com.bsth.data.BasicData; | ||
| 7 | -import com.bsth.data.directive.DayOfDirectives; | ||
| 8 | -import com.bsth.data.directive.DirectiveCreator; | ||
| 9 | -import com.bsth.data.directive.GatewayHttpUtils; | ||
| 10 | -import com.bsth.data.gpsdata_v2.GpsRealData; | ||
| 11 | -import com.bsth.data.gpsdata_v2.entity.GpsEntity; | ||
| 12 | -import com.bsth.data.pilot80.PilotReport; | ||
| 13 | -import com.bsth.data.schedule.DayOfSchedule; | ||
| 14 | -import com.bsth.data.utils.ListFilterUtils; | ||
| 15 | -import com.bsth.data.utils.ListPageQueryUtils; | ||
| 16 | -import com.bsth.entity.directive.*; | ||
| 17 | -import com.bsth.entity.realcontrol.ScheduleRealInfo; | ||
| 18 | -import com.bsth.entity.sys.SysUser; | ||
| 19 | -import com.bsth.repository.directive.D60Repository; | ||
| 20 | -import com.bsth.repository.directive.D64Repository; | ||
| 21 | -import com.bsth.repository.directive.D80Repository; | ||
| 22 | -import com.bsth.security.util.SecurityUtils; | ||
| 23 | -import com.bsth.service.directive.dto.DeviceConfigDto; | ||
| 24 | -import com.bsth.service.impl.BaseServiceImpl; | ||
| 25 | -import com.bsth.websocket.handler.RealControlSocketHandler; | ||
| 26 | -import com.fasterxml.jackson.core.JsonProcessingException; | ||
| 27 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 28 | -import com.google.common.base.Splitter; | ||
| 29 | -import org.apache.commons.lang3.StringEscapeUtils; | ||
| 30 | -import org.apache.commons.lang3.StringUtils; | ||
| 31 | -import org.joda.time.format.DateTimeFormat; | ||
| 32 | -import org.joda.time.format.DateTimeFormatter; | ||
| 33 | -import org.slf4j.Logger; | ||
| 34 | -import org.slf4j.LoggerFactory; | ||
| 35 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 36 | -import org.springframework.jdbc.core.BeanPropertyRowMapper; | ||
| 37 | -import org.springframework.jdbc.core.JdbcTemplate; | ||
| 38 | -import org.springframework.stereotype.Service; | ||
| 39 | - | ||
| 40 | -import java.util.*; | ||
| 41 | - | ||
| 42 | -@Service | ||
| 43 | -public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService { | ||
| 44 | - | ||
| 45 | - Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 46 | - | ||
| 47 | - @Autowired | ||
| 48 | - D60Repository d60Repository; | ||
| 49 | - | ||
| 50 | - @Autowired | ||
| 51 | - GpsRealData gpsRealDataBuffer; | ||
| 52 | - | ||
| 53 | - @Autowired | ||
| 54 | - D64Repository d64Repository; | ||
| 55 | - | ||
| 56 | - @Autowired | ||
| 57 | - RealControlSocketHandler socketHandler; | ||
| 58 | - | ||
| 59 | - @Autowired | ||
| 60 | - D80Repository d80Repository; | ||
| 61 | - | ||
| 62 | - @Autowired | ||
| 63 | - DayOfDirectives dayOfDirectives; | ||
| 64 | - | ||
| 65 | - @Autowired | ||
| 66 | - PilotReport pilotReport; | ||
| 67 | - | ||
| 68 | - @Autowired | ||
| 69 | - DayOfSchedule dayOfSchedule; | ||
| 70 | - | ||
| 71 | - @Autowired | ||
| 72 | - JdbcTemplate jdbcTemplate; | ||
| 73 | - | ||
| 74 | - //static Long schDiff = 1000 * 60 * 60L; | ||
| 75 | - | ||
| 76 | - private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"), fmtHHmm_CN = DateTimeFormat.forPattern("HH点mm分"); | ||
| 77 | - | ||
| 78 | - @Override | ||
| 79 | - public int send60Phrase(String nbbm, String text, String sender) { | ||
| 80 | - D60 d60 = null; | ||
| 81 | - try { | ||
| 82 | - text = StringEscapeUtils.unescapeHtml4(text); | ||
| 83 | - text = text.replaceAll("#", ""); | ||
| 84 | - d60 = create60Data(nbbm, text, (short) 0x00, null); | ||
| 85 | - } catch (Exception e) { | ||
| 86 | - logger.error("发送消息短语出现异常", e); | ||
| 87 | - return -1; | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - if (null == d60) | ||
| 91 | - return -1; | ||
| 92 | - | ||
| 93 | - // 发送指令 | ||
| 94 | - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60)); | ||
| 95 | - if (null != sender) | ||
| 96 | - d60.setSender(sender); | ||
| 97 | - d60.setHttpCode(code); | ||
| 98 | - | ||
| 99 | - if (code != 0) | ||
| 100 | - d60.setErrorText("网关通讯失败, code: " + code); | ||
| 101 | - | ||
| 102 | - dayOfDirectives.put60(d60); | ||
| 103 | - return code; | ||
| 104 | - } | ||
| 105 | - | ||
| 106 | - @Override | ||
| 107 | - public int send60Dispatch(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) { | ||
| 108 | - D60 d60 = null; | ||
| 109 | - try { | ||
| 110 | - if (sch.isDestroy()) { | ||
| 111 | - logger.warn("烂班不允许发送调度指令...."); | ||
| 112 | - return -1; | ||
| 113 | - } | ||
| 114 | - | ||
| 115 | - //待发应到时间 | ||
| 116 | - String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000)); | ||
| 117 | - String text = "您已完成" + finish + "个班次,下一发车时间" + fmtHHmm_CN.print(sch.getDfsjT()) + ",由" | ||
| 118 | - + sch.getQdzName() + "发往" + sch.getZdzName() + ";应到 " + dfsj; | ||
| 119 | - | ||
| 120 | - if(sch.getBcType().equals("venting")){ | ||
| 121 | - text += " (直放)"; | ||
| 122 | - } | ||
| 123 | - else if(sch.getBcType().equals("major")){ | ||
| 124 | - text += " (放站到"+sch.getMajorStationName()+"带客)"; | ||
| 125 | - } else if ("ldks".equals(sch.getBcType())) { | ||
| 126 | - text += " (两点空驶)"; | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - //下发0x02指令 调度指令(闹钟有效) | ||
| 130 | - long t = System.currentTimeMillis() + 1000 * 30, | ||
| 131 | - alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT(); | ||
| 132 | - | ||
| 133 | - if(StringUtils.isNotEmpty(txtPrefix)){ | ||
| 134 | - text = txtPrefix + text; | ||
| 135 | - } | ||
| 136 | - text = StringEscapeUtils.unescapeHtml4(text); | ||
| 137 | - int state = 0;//营运状态 | ||
| 138 | - if(dayOfSchedule.emptyService(sch)) | ||
| 139 | - state = 1; | ||
| 140 | - d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir()) | ||
| 141 | - , state, new Date(alarmTime)); | ||
| 142 | - | ||
| 143 | - d60.setLineCode(sch.getXlBm()); | ||
| 144 | - } catch (Exception e) { | ||
| 145 | - logger.error("生成调度指令时出现异常", e); | ||
| 146 | - return -1; | ||
| 147 | - } | ||
| 148 | - | ||
| 149 | - if (null == d60) | ||
| 150 | - return -1; | ||
| 151 | - | ||
| 152 | - d60.setSender(sender); | ||
| 153 | - | ||
| 154 | - JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60)); | ||
| 155 | - | ||
| 156 | - //进场或者出场班次时,附加lock 标识 | ||
| 157 | - if (null != sch.getBcType() | ||
| 158 | - && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) { | ||
| 159 | - | ||
| 160 | - jObj.put("lock", 1); | ||
| 161 | - } | ||
| 162 | - | ||
| 163 | - // 发送指令 | ||
| 164 | - int code = GatewayHttpUtils.postJson(jObj.toJSONString()); | ||
| 165 | - | ||
| 166 | - d60.setDispatch(true); | ||
| 167 | - d60.setSch(sch); | ||
| 168 | - d60.setHttpCode(code); | ||
| 169 | - | ||
| 170 | - if (code == 0) { | ||
| 171 | - sch.setDirectiveState(60); | ||
| 172 | - // 通知页面 | ||
| 173 | - sendD60ToPage(sch); | ||
| 174 | - } else { | ||
| 175 | - d60.setErrorText("网关通讯失败, code: " + code); | ||
| 176 | - } | ||
| 177 | - | ||
| 178 | - dayOfDirectives.put60(d60); | ||
| 179 | - return code; | ||
| 180 | - } | ||
| 181 | - | ||
| 182 | - /** | ||
| 183 | - * @Title: sendDirectiveState @Description: TODO(向页面推送班次指令状态) @throws | ||
| 184 | - */ | ||
| 185 | - @Override | ||
| 186 | - public void sendD60ToPage(ScheduleRealInfo sch) { | ||
| 187 | - Map<String, Object> map = new HashMap<>(); | ||
| 188 | - map.put("fn", "directive"); | ||
| 189 | - map.put("t", sch); | ||
| 190 | - | ||
| 191 | - ObjectMapper mapper = new ObjectMapper(); | ||
| 192 | - | ||
| 193 | - try { | ||
| 194 | - socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map)); | ||
| 195 | - } catch (JsonProcessingException e) { | ||
| 196 | - logger.error("", e); | ||
| 197 | - } | ||
| 198 | - } | ||
| 199 | - | ||
| 200 | - @Override | ||
| 201 | - public int send60Dispatch(Long id, String sender) { | ||
| 202 | - ScheduleRealInfo sch = dayOfSchedule.get(id); | ||
| 203 | - // 车辆已完成班次 | ||
| 204 | - int finish = dayOfSchedule.doneSum(sch.getClZbh()); | ||
| 205 | - return send60Dispatch(sch, finish, sender, ""); | ||
| 206 | - } | ||
| 207 | - | ||
| 208 | - @Override | ||
| 209 | - public int send60Operation(String nbbm, int state, int upDown, String sender) { | ||
| 210 | - logger.info("切换运营状态, nbbm: " + nbbm + " ,state: " + state + " ,upDown:" + upDown); | ||
| 211 | - | ||
| 212 | - String text = "切换为 " + (upDown == 0 ? "上行" : "下行") + (state == 0 ? "营运" : "未营运"); | ||
| 213 | - D60 d60 = new DirectiveCreator().createD60(nbbm, text, (short) 0x03, upDown, state, null); | ||
| 214 | - | ||
| 215 | - if (null == d60) | ||
| 216 | - return -1; | ||
| 217 | - if (null != sender) | ||
| 218 | - d60.setSender(sender); | ||
| 219 | - else | ||
| 220 | - d60.setSender("系统"); | ||
| 221 | - // 发送指令 | ||
| 222 | - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60)); | ||
| 223 | - // 添加到缓存,等待入库 | ||
| 224 | - d60.setHttpCode(code); | ||
| 225 | - | ||
| 226 | - GpsEntity gps = gpsRealDataBuffer.getByNbbm(nbbm); | ||
| 227 | - if(null != gps) | ||
| 228 | - d60.setLineCode(gps.getLineId()); | ||
| 229 | - | ||
| 230 | - if (code != 0) | ||
| 231 | - d60.setErrorText("网关通讯失败, code: " + code); | ||
| 232 | - | ||
| 233 | - dayOfDirectives.put60(d60); | ||
| 234 | - return code; | ||
| 235 | - } | ||
| 236 | - | ||
| 237 | - /** | ||
| 238 | - * 线路切换 | ||
| 239 | - */ | ||
| 240 | - @Override | ||
| 241 | - public int lineChange(String nbbm, String lineCode, String sender) { | ||
| 242 | - return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sender); | ||
| 243 | - } | ||
| 244 | - | ||
| 245 | - | ||
| 246 | - @Override | ||
| 247 | - public int lineChangeByDeviceId(String deviceId, String lineCode, String sender) { | ||
| 248 | - DirectiveCreator crt = new DirectiveCreator(); | ||
| 249 | - Long t = System.currentTimeMillis(); | ||
| 250 | - //生成64数据包 | ||
| 251 | - D64 d64 = crt.create64(deviceId, lineCode, t); | ||
| 252 | - | ||
| 253 | - if (null != sender) | ||
| 254 | - d64.setSender(sender); | ||
| 255 | - else | ||
| 256 | - d64.setSender("系统"); | ||
| 257 | - | ||
| 258 | - //String deviceId = d64.getDeviceId(); | ||
| 259 | - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d64)); | ||
| 260 | - // 入库 | ||
| 261 | - d64.setHttpCode(code); | ||
| 262 | - d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]"); | ||
| 263 | - // 通知设备刷新线路文件,忽略结果 | ||
| 264 | - if (code == 0) | ||
| 265 | - GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode)); | ||
| 266 | - else | ||
| 267 | - d64.setErrorText(" 网关通讯失败, code: " + code); | ||
| 268 | - | ||
| 269 | - dayOfDirectives.put64(d64); | ||
| 270 | - return code; | ||
| 271 | - } | ||
| 272 | - | ||
| 273 | - public D60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch) { | ||
| 274 | - | ||
| 275 | - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm); | ||
| 276 | - String lineCode = null; | ||
| 277 | - if (null == deviceId) { | ||
| 278 | - logger.error("没有设备号对照的车辆:" + nbbm); | ||
| 279 | - return null; | ||
| 280 | - } | ||
| 281 | - // 根据当前GPS确定 上下行和营运状态 | ||
| 282 | - Byte upDown = null; | ||
| 283 | - Integer state = null; | ||
| 284 | - if (null == sch) { | ||
| 285 | - GpsEntity gpsData = gpsRealDataBuffer.get(deviceId); | ||
| 286 | - if (null == gpsData) { | ||
| 287 | - /* | ||
| 288 | - * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发 | ||
| 289 | - * 其他指令在不确定状态的情况下,一律不允许 | ||
| 290 | - */ | ||
| 291 | - if (dispatchInstruct == 0) { | ||
| 292 | - upDown = 0; | ||
| 293 | - state = 0; | ||
| 294 | - } else { | ||
| 295 | - logger.error("没有找到gps对照,无法确认营运状态和上下行:" + nbbm); | ||
| 296 | - return null; | ||
| 297 | - } | ||
| 298 | - } else { | ||
| 299 | - upDown = gpsData.getUpDown(); | ||
| 300 | - state = gpsData.getState(); | ||
| 301 | - lineCode = gpsData.getLineId(); | ||
| 302 | - } | ||
| 303 | - } else { | ||
| 304 | - upDown = Byte.parseByte(sch.getXlDir()); | ||
| 305 | - state = 0; | ||
| 306 | - } | ||
| 307 | - | ||
| 308 | - return new DirectiveCreator().createD60(nbbm, text, dispatchInstruct, upDown, state, lineCode); | ||
| 309 | - } | ||
| 310 | - | ||
| 311 | -/* @Override | ||
| 312 | - public int upDownChange(String nbbm, Integer upDown, String sender) { | ||
| 313 | - return send60Operation(nbbm, 0, upDown, sender); | ||
| 314 | - }*/ | ||
| 315 | - | ||
| 316 | - | ||
| 317 | - @Override | ||
| 318 | - public Map<String, List<D80>> findNoCofm80(String lineCodes) { | ||
| 319 | - List<String> lineList = Splitter.on(",").trimResults().splitToList(lineCodes); | ||
| 320 | - | ||
| 321 | - Map<String, List<D80>> rs = new HashMap<>(); | ||
| 322 | - for (String code : lineList) | ||
| 323 | - rs.put(code, pilotReport.unconfirmed80(code)); | ||
| 324 | - | ||
| 325 | - return rs; | ||
| 326 | - } | ||
| 327 | - | ||
| 328 | - @Override | ||
| 329 | - public Map<String, Object> reply80(int id, int reply) { | ||
| 330 | - Map<String, Object> rs = new HashMap<>(); | ||
| 331 | - D80 d80 = pilotReport.findById(id); | ||
| 332 | - try { | ||
| 333 | - if (null == d80) { | ||
| 334 | - rs.put("status", ResponseCode.ERROR); | ||
| 335 | - rs.put("msg", "服务器没有找到对应数据!"); | ||
| 336 | - } else if (d80.isConfirm()) { | ||
| 337 | - rs.put("status", ResponseCode.ERROR); | ||
| 338 | - rs.put("msg", "该数据已经被处理了!"); | ||
| 339 | - } else { | ||
| 340 | - SysUser user = SecurityUtils.getCurrentUser(); | ||
| 341 | - d80.setC0(reply, user.getUserName()); | ||
| 342 | - // 入库 | ||
| 343 | - d80Repository.save(d80); | ||
| 344 | - //回复网关 | ||
| 345 | - int code = GatewayHttpUtils.postJson(JSON.toJSONString(d80.getC0())); | ||
| 346 | - | ||
| 347 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 348 | - if (code != 0) | ||
| 349 | - rs.put("msg", "发送C0响应指令到车载设备失败,但该操作已经被系统记录!"); | ||
| 350 | - | ||
| 351 | - pilotReport.reply(d80); | ||
| 352 | - | ||
| 353 | - // 通知页面 | ||
| 354 | - Map<String, Object> sockMap = new HashMap<>(); | ||
| 355 | - sockMap.put("fn", "d80Confirm"); | ||
| 356 | - sockMap.put("id", d80.getId()); | ||
| 357 | - sockMap.put("lineId", d80.getData().getLineId()); | ||
| 358 | - socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), JSON.toJSONString(sockMap)); | ||
| 359 | - } | ||
| 360 | - } catch (Exception e) { | ||
| 361 | - logger.error("80响应出现异常...", e); | ||
| 362 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 363 | - } | ||
| 364 | - | ||
| 365 | - return rs; | ||
| 366 | - } | ||
| 367 | - | ||
| 368 | - @Override | ||
| 369 | - public Map<String, Object> findDirective(String nbbms, int dType, int page, int size) { | ||
| 370 | - Map<String, Object> rsMap = new HashMap<>(); | ||
| 371 | - try{ | ||
| 372 | - | ||
| 373 | - List<String> carArray = new ArrayList<>(), deviceArray=new ArrayList<>(); | ||
| 374 | - if(StringUtils.isNotEmpty(nbbms)){ | ||
| 375 | - carArray = Splitter.on(",").splitToList(nbbms); | ||
| 376 | - //转换成设备号 | ||
| 377 | - Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse(); | ||
| 378 | - for(int i = 0, len=carArray.size(); i < len; i++){ | ||
| 379 | - deviceArray.add(nbbm2deviceMap.get(carArray.get(i))); | ||
| 380 | - } | ||
| 381 | - } | ||
| 382 | - | ||
| 383 | - List<Directive> list = new ArrayList<>(); | ||
| 384 | - switch (dType) { | ||
| 385 | - case -1: | ||
| 386 | - //所有指令 | ||
| 387 | - list = new ArrayList<>(dayOfDirectives.all()); | ||
| 388 | - break; | ||
| 389 | - case 0: | ||
| 390 | - //调度指令 | ||
| 391 | - Collection<D60> dptArray = dayOfDirectives.all60(); | ||
| 392 | - for (D60 d60 : dptArray) { | ||
| 393 | - if (d60.isDispatch()) | ||
| 394 | - list.add(d60); | ||
| 395 | - } | ||
| 396 | - break; | ||
| 397 | - case 1: | ||
| 398 | - //运营指令 | ||
| 399 | - Collection<D60> yyArray = dayOfDirectives.all60(); | ||
| 400 | - for (D60 d60 : yyArray) { | ||
| 401 | - if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x03 | ||
| 402 | - && !d60.isDispatch()) | ||
| 403 | - list.add(d60); | ||
| 404 | - } | ||
| 405 | - break; | ||
| 406 | - case 2: | ||
| 407 | - //线路切换指令 | ||
| 408 | - list.addAll(dayOfDirectives.all64()); | ||
| 409 | - break; | ||
| 410 | - case 3: | ||
| 411 | - //消息短语 | ||
| 412 | - Collection<D60> dyArray = dayOfDirectives.all60(); | ||
| 413 | - for (D60 d60 : dyArray) { | ||
| 414 | - if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x00 | ||
| 415 | - && !d60.isDispatch()) | ||
| 416 | - list.add(d60); | ||
| 417 | - } | ||
| 418 | - break; | ||
| 419 | - } | ||
| 420 | - | ||
| 421 | - // 时间倒序 | ||
| 422 | - Collections.sort(list, new DayOfDirectives.DComparator()); | ||
| 423 | - if(deviceArray.size() > 0){ | ||
| 424 | - //按设备号过滤 | ||
| 425 | - List<Directive> subList = new ArrayList<>(); | ||
| 426 | - for (Directive d : list) { | ||
| 427 | - if (deviceArray.contains(d.getDeviceId())) { | ||
| 428 | - subList.add(d); | ||
| 429 | - } | ||
| 430 | - } | ||
| 431 | - list = subList; | ||
| 432 | - } | ||
| 433 | - | ||
| 434 | - for(Directive d : list){ | ||
| 435 | - d.setTimeHHmm(fmtHHmm.print(d.getTimestamp())); | ||
| 436 | - d.setNbbm(BasicData.deviceId2NbbmMap.get(d.getDeviceId())); | ||
| 437 | - } | ||
| 438 | - | ||
| 439 | - int count = list.size(); | ||
| 440 | - // 分页 | ||
| 441 | - int s = page * size, e = s + size; | ||
| 442 | - | ||
| 443 | - if (e > count) | ||
| 444 | - e = count; | ||
| 445 | - | ||
| 446 | - List<Directive> rs = list.subList(s, e); | ||
| 447 | - rsMap.put("list", rs); | ||
| 448 | - rsMap.put("totalPages", count % size == 0 ? (count / size - 1) : count / size); | ||
| 449 | - rsMap.put("page", page); | ||
| 450 | - }catch (Exception e){ | ||
| 451 | - logger.error("", e); | ||
| 452 | - throw e; | ||
| 453 | - } | ||
| 454 | - return rsMap; | ||
| 455 | - } | ||
| 456 | - | ||
| 457 | - @Override | ||
| 458 | - public Map<String, Object> findAll80(Map<String, Object> map, int page, int size) { | ||
| 459 | - | ||
| 460 | - List all = ListFilterUtils.filter(pilotReport.findAll(), map, D80.class); | ||
| 461 | - //排序 | ||
| 462 | - Collections.sort(all, new Comparator<D80>() { | ||
| 463 | - @Override | ||
| 464 | - public int compare(D80 o1, D80 o2) { | ||
| 465 | - return (int) (o2.getTimestamp() - o1.getTimestamp()); | ||
| 466 | - } | ||
| 467 | - }); | ||
| 468 | - List<D80> d80s = ListPageQueryUtils.paging(all, page, size); | ||
| 469 | - //时间格式化 | ||
| 470 | - for (D80 d80 : d80s) { | ||
| 471 | - d80.setTimeStr(fmtHHmm.print(d80.getTimestamp())); | ||
| 472 | - } | ||
| 473 | - Map<String, Object> rsMap = new HashMap<>(); | ||
| 474 | - rsMap.put("list", d80s); | ||
| 475 | - rsMap.put("totalPages", all.size() % size == 0 ? all.size() / size - 1: all.size() / size); | ||
| 476 | - rsMap.put("page", page); | ||
| 477 | - return rsMap; | ||
| 478 | - } | ||
| 479 | - | ||
| 480 | - @Override | ||
| 481 | - public D64 save64(D64 d64) { | ||
| 482 | - return d64Repository.save(d64); | ||
| 483 | - } | ||
| 484 | - | ||
| 485 | - @Override | ||
| 486 | - public Map<String, Object> sendC0A4(String nbbm) { | ||
| 487 | - Map<String, Object> rs = new HashMap<>(); | ||
| 488 | - | ||
| 489 | - String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm); | ||
| 490 | - | ||
| 491 | - GpsEntity gps = gpsRealDataBuffer.get(deviceId); | ||
| 492 | - if(gps == null || gps.isOffline()){ | ||
| 493 | - rs.put("status", ResponseCode.ERROR); | ||
| 494 | - rs.put("msg", "下发指令失败,设备离线"); | ||
| 495 | - return rs; | ||
| 496 | - } | ||
| 497 | - | ||
| 498 | - Map<String, Object> c0a4 = new HashMap<>(); | ||
| 499 | - c0a4.put("deviceId", deviceId); | ||
| 500 | - c0a4.put("timestamp", System.currentTimeMillis()); | ||
| 501 | - c0a4.put("operCode", (short) 0xC0); | ||
| 502 | - | ||
| 503 | - Map<String, Object> data = new HashMap<>(); | ||
| 504 | - data.put("deviceId", deviceId); | ||
| 505 | - data.put("operCode2", (short) 0xA4); | ||
| 506 | - c0a4.put("data", data); | ||
| 507 | - | ||
| 508 | - int code = GatewayHttpUtils.postJson(JSON.toJSONString(c0a4)); | ||
| 509 | - if(code != 0){ | ||
| 510 | - rs.put("status", ResponseCode.ERROR); | ||
| 511 | - rs.put("msg", "和网关通讯失败, code " + code); | ||
| 512 | - } | ||
| 513 | - else{ | ||
| 514 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 515 | - } | ||
| 516 | - return rs; | ||
| 517 | - } | ||
| 518 | - | ||
| 519 | - @Override | ||
| 520 | - public int sendC0A3(DC0_A3 c0a3) { | ||
| 521 | - GatewayHttpUtils.postJson(JSON.toJSONString(c0a3)); | ||
| 522 | - return 0; | ||
| 523 | - } | ||
| 524 | - | ||
| 525 | - @Override | ||
| 526 | - public int sendC0A5(String json) { | ||
| 527 | - return GatewayHttpUtils.postJson(json); | ||
| 528 | - } | ||
| 529 | - | ||
| 530 | - @Override | ||
| 531 | - public int refreshLineFile(String deviceId) { | ||
| 532 | - GpsEntity gps = gpsRealDataBuffer.get(deviceId); | ||
| 533 | - if (gps == null) | ||
| 534 | - return -1; | ||
| 535 | - | ||
| 536 | - return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId())); | ||
| 537 | - } | ||
| 538 | - | ||
| 539 | -/* @Override | ||
| 540 | - public int stateChange(String nbbm, Integer upDown, Integer state, String userName) { | ||
| 541 | - return send60Operation(nbbm, state, upDown, userName); | ||
| 542 | - }*/ | ||
| 543 | - | ||
| 544 | - @Override | ||
| 545 | - public Map<String, Object> deviceCofigList(Map<String, String> map, int page, int size) { | ||
| 546 | - Map<String, Object> rs = new HashMap<>(); | ||
| 547 | - try { | ||
| 548 | - String conts=""; | ||
| 549 | - if(StringUtils.isNotBlank(map.get("lineId"))){ | ||
| 550 | - conts+=" AND xl='" + map.get("lineId")+"'"; | ||
| 551 | - } | ||
| 552 | - if(StringUtils.isNotBlank(map.get("nbbm"))){ | ||
| 553 | - conts+=" AND inside_code like '%" + map.get("nbbm")+"%'"; | ||
| 554 | - } | ||
| 555 | - if(StringUtils.isNotBlank(map.get("deviceId"))){ | ||
| 556 | - conts+=" AND equipment_code like '%" + map.get("deviceId")+"%'"; | ||
| 557 | - } | ||
| 558 | - | ||
| 559 | - String sql = "select * from (SELECT * FROM (SELECT id AS cl_id,inside_code,equipment_code FROM bsth_c_cars ) t1 LEFT JOIN bsth_v_c0_a4 t2 ON t1.equipment_code = t2.id LEFT JOIN (SELECT xl,cl FROM bsth_c_s_ccinfo WHERE id IN (SELECT max(id) FROM bsth_c_s_ccinfo GROUP BY cl)) t3 ON t1.cl_id = t3.cl ORDER BY t2.`timestamp` DESC) t4 where 1=1 "+conts; | ||
| 560 | - | ||
| 561 | - int count = jdbcTemplate.queryForObject("select count(*) from ("+sql+") c1", Integer.class); | ||
| 562 | - int totalPages = count % size == 0 ? count / size : count / size + 1; | ||
| 563 | - int s = page * size; | ||
| 564 | - List<DeviceConfigDto> list = jdbcTemplate.query(sql + " LIMIT " + s + "," + size, new BeanPropertyRowMapper<>(DeviceConfigDto.class)); | ||
| 565 | - | ||
| 566 | - rs.put("status", ResponseCode.SUCCESS); | ||
| 567 | - rs.put("list", list); | ||
| 568 | - rs.put("totalPages", totalPages); | ||
| 569 | - rs.put("page", page); | ||
| 570 | - } catch (Exception e) { | ||
| 571 | - e.printStackTrace(); | ||
| 572 | - logger.error("", e); | ||
| 573 | - rs.put("status", ResponseCode.ERROR); | ||
| 574 | - } | ||
| 575 | - return rs; | ||
| 576 | - } | ||
| 577 | -} | 1 | +package com.bsth.service.directive; |
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON; | ||
| 4 | +import com.alibaba.fastjson.JSONObject; | ||
| 5 | +import com.bsth.common.ResponseCode; | ||
| 6 | +import com.bsth.data.BasicData; | ||
| 7 | +import com.bsth.data.directive.DayOfDirectives; | ||
| 8 | +import com.bsth.data.directive.DirectiveCreator; | ||
| 9 | +import com.bsth.data.directive.GatewayHttpUtils; | ||
| 10 | +import com.bsth.data.gpsdata_v2.GpsRealData; | ||
| 11 | +import com.bsth.data.gpsdata_v2.entity.GpsEntity; | ||
| 12 | +import com.bsth.data.pilot80.PilotReport; | ||
| 13 | +import com.bsth.data.schedule.DayOfSchedule; | ||
| 14 | +import com.bsth.data.utils.ListFilterUtils; | ||
| 15 | +import com.bsth.data.utils.ListPageQueryUtils; | ||
| 16 | +import com.bsth.entity.directive.*; | ||
| 17 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | ||
| 18 | +import com.bsth.entity.sys.SysUser; | ||
| 19 | +import com.bsth.repository.directive.D60Repository; | ||
| 20 | +import com.bsth.repository.directive.D64Repository; | ||
| 21 | +import com.bsth.repository.directive.D80Repository; | ||
| 22 | +import com.bsth.security.util.SecurityUtils; | ||
| 23 | +import com.bsth.service.directive.dto.DeviceConfigDto; | ||
| 24 | +import com.bsth.service.impl.BaseServiceImpl; | ||
| 25 | +import com.bsth.websocket.handler.RealControlSocketHandler; | ||
| 26 | +import com.fasterxml.jackson.core.JsonProcessingException; | ||
| 27 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 28 | +import com.google.common.base.Splitter; | ||
| 29 | +import org.apache.commons.lang3.StringEscapeUtils; | ||
| 30 | +import org.apache.commons.lang3.StringUtils; | ||
| 31 | +import org.joda.time.format.DateTimeFormat; | ||
| 32 | +import org.joda.time.format.DateTimeFormatter; | ||
| 33 | +import org.slf4j.Logger; | ||
| 34 | +import org.slf4j.LoggerFactory; | ||
| 35 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 36 | +import org.springframework.jdbc.core.BeanPropertyRowMapper; | ||
| 37 | +import org.springframework.jdbc.core.JdbcTemplate; | ||
| 38 | +import org.springframework.stereotype.Service; | ||
| 39 | + | ||
| 40 | +import java.util.*; | ||
| 41 | + | ||
| 42 | +@Service | ||
| 43 | +public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implements DirectiveService { | ||
| 44 | + | ||
| 45 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | ||
| 46 | + | ||
| 47 | + @Autowired | ||
| 48 | + D60Repository d60Repository; | ||
| 49 | + | ||
| 50 | + @Autowired | ||
| 51 | + GpsRealData gpsRealDataBuffer; | ||
| 52 | + | ||
| 53 | + @Autowired | ||
| 54 | + D64Repository d64Repository; | ||
| 55 | + | ||
| 56 | + @Autowired | ||
| 57 | + RealControlSocketHandler socketHandler; | ||
| 58 | + | ||
| 59 | + @Autowired | ||
| 60 | + D80Repository d80Repository; | ||
| 61 | + | ||
| 62 | + @Autowired | ||
| 63 | + DayOfDirectives dayOfDirectives; | ||
| 64 | + | ||
| 65 | + @Autowired | ||
| 66 | + PilotReport pilotReport; | ||
| 67 | + | ||
| 68 | + @Autowired | ||
| 69 | + DayOfSchedule dayOfSchedule; | ||
| 70 | + | ||
| 71 | + @Autowired | ||
| 72 | + JdbcTemplate jdbcTemplate; | ||
| 73 | + | ||
| 74 | + //static Long schDiff = 1000 * 60 * 60L; | ||
| 75 | + | ||
| 76 | + private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm"), fmtHHmm_CN = DateTimeFormat.forPattern("HH点mm分"); | ||
| 77 | + | ||
| 78 | + @Override | ||
| 79 | + public int send60Phrase(String nbbm, String text, String sender) { | ||
| 80 | + D60 d60 = null; | ||
| 81 | + try { | ||
| 82 | + text = StringEscapeUtils.unescapeHtml4(text); | ||
| 83 | + text = text.replaceAll("#", ""); | ||
| 84 | + d60 = create60Data(nbbm, text, (short) 0x00, null); | ||
| 85 | + } catch (Exception e) { | ||
| 86 | + logger.error("发送消息短语出现异常", e); | ||
| 87 | + return -1; | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + if (null == d60) | ||
| 91 | + return -1; | ||
| 92 | + | ||
| 93 | + // 发送指令 | ||
| 94 | + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60)); | ||
| 95 | + if (null != sender) | ||
| 96 | + d60.setSender(sender); | ||
| 97 | + d60.setHttpCode(code); | ||
| 98 | + | ||
| 99 | + if (code != 0) | ||
| 100 | + d60.setErrorText("网关通讯失败, code: " + code); | ||
| 101 | + | ||
| 102 | + dayOfDirectives.put60(d60); | ||
| 103 | + return code; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + @Override | ||
| 107 | + public int send60Dispatch(ScheduleRealInfo sch, int finish, String sender, String txtPrefix) { | ||
| 108 | + D60 d60 = null; | ||
| 109 | + try { | ||
| 110 | + if (sch.isDestroy()) { | ||
| 111 | + logger.warn("烂班不允许发送调度指令...."); | ||
| 112 | + return -1; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + //待发应到时间 | ||
| 116 | + String dfsj = fmtHHmm.print(sch.getDfsjT() + (sch.getBcsj() * 60 * 1000)); | ||
| 117 | + String text = "您已完成" + finish + "个班次,下一发车时间" + fmtHHmm_CN.print(sch.getDfsjT()) + ",由" | ||
| 118 | + + sch.getQdzName() + "发往" + sch.getZdzName() + ";应到 " + dfsj; | ||
| 119 | + | ||
| 120 | + if(sch.getBcType().equals("venting")){ | ||
| 121 | + text += " (直放)"; | ||
| 122 | + } | ||
| 123 | + else if(sch.getBcType().equals("major")){ | ||
| 124 | + text += " (放站到"+sch.getMajorStationName()+"带客)"; | ||
| 125 | + } else if ("ldks".equals(sch.getBcType())) { | ||
| 126 | + text += " (两点空驶)"; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + //下发0x02指令 调度指令(闹钟有效) | ||
| 130 | + long t = System.currentTimeMillis() + 1000 * 30, | ||
| 131 | + alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT(); | ||
| 132 | + | ||
| 133 | + if(StringUtils.isNotEmpty(txtPrefix)){ | ||
| 134 | + text = txtPrefix + text; | ||
| 135 | + } | ||
| 136 | + text = StringEscapeUtils.unescapeHtml4(text); | ||
| 137 | + int state = 0;//营运状态 | ||
| 138 | + if(dayOfSchedule.emptyService(sch)) | ||
| 139 | + state = 1; | ||
| 140 | + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir()) | ||
| 141 | + , state, new Date(alarmTime)); | ||
| 142 | + | ||
| 143 | + d60.setLineCode(sch.getXlBm()); | ||
| 144 | + } catch (Exception e) { | ||
| 145 | + logger.error("生成调度指令时出现异常", e); | ||
| 146 | + return -1; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + if (null == d60) | ||
| 150 | + return -1; | ||
| 151 | + | ||
| 152 | + d60.setSender(sender); | ||
| 153 | + d60.setSch(sch); | ||
| 154 | + JSONObject jObj = JSON.parseObject(JSON.toJSONString(d60)); | ||
| 155 | + | ||
| 156 | + //进场或者出场班次时,附加lock 标识 | ||
| 157 | + if (null != sch.getBcType() | ||
| 158 | + && (sch.getBcType().equals("out") || sch.getBcType().equals("in"))) { | ||
| 159 | + | ||
| 160 | + jObj.put("lock", 1); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + // 发送指令 | ||
| 164 | + int code = GatewayHttpUtils.postJson(jObj.toJSONString()); | ||
| 165 | + | ||
| 166 | + d60.setDispatch(true); | ||
| 167 | + d60.setHttpCode(code); | ||
| 168 | + | ||
| 169 | + if (code == 0) { | ||
| 170 | + sch.setDirectiveState(60); | ||
| 171 | + // 通知页面 | ||
| 172 | + sendD60ToPage(sch); | ||
| 173 | + } else { | ||
| 174 | + d60.setErrorText("网关通讯失败, code: " + code); | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + dayOfDirectives.put60(d60); | ||
| 178 | + return code; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + /** | ||
| 182 | + * @Title: sendDirectiveState @Description: TODO(向页面推送班次指令状态) @throws | ||
| 183 | + */ | ||
| 184 | + @Override | ||
| 185 | + public void sendD60ToPage(ScheduleRealInfo sch) { | ||
| 186 | + Map<String, Object> map = new HashMap<>(); | ||
| 187 | + map.put("fn", "directive"); | ||
| 188 | + map.put("t", sch); | ||
| 189 | + | ||
| 190 | + ObjectMapper mapper = new ObjectMapper(); | ||
| 191 | + | ||
| 192 | + try { | ||
| 193 | + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map)); | ||
| 194 | + } catch (JsonProcessingException e) { | ||
| 195 | + logger.error("", e); | ||
| 196 | + } | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + @Override | ||
| 200 | + public int send60Dispatch(Long id, String sender) { | ||
| 201 | + ScheduleRealInfo sch = dayOfSchedule.get(id); | ||
| 202 | + // 车辆已完成班次 | ||
| 203 | + int finish = dayOfSchedule.doneSum(sch.getClZbh()); | ||
| 204 | + return send60Dispatch(sch, finish, sender, ""); | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + @Override | ||
| 208 | + public int send60Operation(String nbbm, int state, int upDown, String sender) { | ||
| 209 | + logger.info("切换运营状态, nbbm: " + nbbm + " ,state: " + state + " ,upDown:" + upDown); | ||
| 210 | + | ||
| 211 | + String text = "切换为 " + (upDown == 0 ? "上行" : "下行") + (state == 0 ? "营运" : "未营运"); | ||
| 212 | + D60 d60 = new DirectiveCreator().createD60(nbbm, text, (short) 0x03, upDown, state, null); | ||
| 213 | + | ||
| 214 | + if (null == d60) | ||
| 215 | + return -1; | ||
| 216 | + if (null != sender) | ||
| 217 | + d60.setSender(sender); | ||
| 218 | + else | ||
| 219 | + d60.setSender("系统"); | ||
| 220 | + // 发送指令 | ||
| 221 | + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d60)); | ||
| 222 | + // 添加到缓存,等待入库 | ||
| 223 | + d60.setHttpCode(code); | ||
| 224 | + | ||
| 225 | + GpsEntity gps = gpsRealDataBuffer.getByNbbm(nbbm); | ||
| 226 | + if(null != gps) | ||
| 227 | + d60.setLineCode(gps.getLineId()); | ||
| 228 | + | ||
| 229 | + if (code != 0) | ||
| 230 | + d60.setErrorText("网关通讯失败, code: " + code); | ||
| 231 | + | ||
| 232 | + dayOfDirectives.put60(d60); | ||
| 233 | + return code; | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + /** | ||
| 237 | + * 线路切换 | ||
| 238 | + */ | ||
| 239 | + @Override | ||
| 240 | + public int lineChange(String nbbm, String lineCode, String sender) { | ||
| 241 | + return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sender); | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + | ||
| 245 | + @Override | ||
| 246 | + public int lineChangeByDeviceId(String deviceId, String lineCode, String sender) { | ||
| 247 | + DirectiveCreator crt = new DirectiveCreator(); | ||
| 248 | + Long t = System.currentTimeMillis(); | ||
| 249 | + //生成64数据包 | ||
| 250 | + D64 d64 = crt.create64(deviceId, lineCode, t); | ||
| 251 | + | ||
| 252 | + if (null != sender) | ||
| 253 | + d64.setSender(sender); | ||
| 254 | + else | ||
| 255 | + d64.setSender("系统"); | ||
| 256 | + | ||
| 257 | + //String deviceId = d64.getDeviceId(); | ||
| 258 | + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d64)); | ||
| 259 | + // 入库 | ||
| 260 | + d64.setHttpCode(code); | ||
| 261 | + d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]"); | ||
| 262 | + // 通知设备刷新线路文件,忽略结果 | ||
| 263 | + if (code == 0) | ||
| 264 | + GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode)); | ||
| 265 | + else | ||
| 266 | + d64.setErrorText(" 网关通讯失败, code: " + code); | ||
| 267 | + | ||
| 268 | + dayOfDirectives.put64(d64); | ||
| 269 | + return code; | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + public D60 create60Data(String nbbm, String text, Short dispatchInstruct, ScheduleRealInfo sch) { | ||
| 273 | + | ||
| 274 | + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm); | ||
| 275 | + String lineCode = null; | ||
| 276 | + if (null == deviceId) { | ||
| 277 | + logger.error("没有设备号对照的车辆:" + nbbm); | ||
| 278 | + return null; | ||
| 279 | + } | ||
| 280 | + // 根据当前GPS确定 上下行和营运状态 | ||
| 281 | + Byte upDown = null; | ||
| 282 | + Integer state = null; | ||
| 283 | + if (null == sch) { | ||
| 284 | + GpsEntity gpsData = gpsRealDataBuffer.get(deviceId); | ||
| 285 | + if (null == gpsData) { | ||
| 286 | + /* | ||
| 287 | + * 短语指令不会变更设备状态,所以在没有gps状态对照的情况下可以下发 | ||
| 288 | + * 其他指令在不确定状态的情况下,一律不允许 | ||
| 289 | + */ | ||
| 290 | + if (dispatchInstruct == 0) { | ||
| 291 | + upDown = 0; | ||
| 292 | + state = 0; | ||
| 293 | + } else { | ||
| 294 | + logger.error("没有找到gps对照,无法确认营运状态和上下行:" + nbbm); | ||
| 295 | + return null; | ||
| 296 | + } | ||
| 297 | + } else { | ||
| 298 | + upDown = gpsData.getUpDown(); | ||
| 299 | + state = gpsData.getState(); | ||
| 300 | + lineCode = gpsData.getLineId(); | ||
| 301 | + } | ||
| 302 | + } else { | ||
| 303 | + upDown = Byte.parseByte(sch.getXlDir()); | ||
| 304 | + state = 0; | ||
| 305 | + } | ||
| 306 | + | ||
| 307 | + return new DirectiveCreator().createD60(nbbm, text, dispatchInstruct, upDown, state, lineCode); | ||
| 308 | + } | ||
| 309 | + | ||
| 310 | +/* @Override | ||
| 311 | + public int upDownChange(String nbbm, Integer upDown, String sender) { | ||
| 312 | + return send60Operation(nbbm, 0, upDown, sender); | ||
| 313 | + }*/ | ||
| 314 | + | ||
| 315 | + | ||
| 316 | + @Override | ||
| 317 | + public Map<String, List<D80>> findNoCofm80(String lineCodes) { | ||
| 318 | + List<String> lineList = Splitter.on(",").trimResults().splitToList(lineCodes); | ||
| 319 | + | ||
| 320 | + Map<String, List<D80>> rs = new HashMap<>(); | ||
| 321 | + for (String code : lineList) | ||
| 322 | + rs.put(code, pilotReport.unconfirmed80(code)); | ||
| 323 | + | ||
| 324 | + return rs; | ||
| 325 | + } | ||
| 326 | + | ||
| 327 | + @Override | ||
| 328 | + public Map<String, Object> reply80(int id, int reply) { | ||
| 329 | + Map<String, Object> rs = new HashMap<>(); | ||
| 330 | + D80 d80 = pilotReport.findById(id); | ||
| 331 | + try { | ||
| 332 | + if (null == d80) { | ||
| 333 | + rs.put("status", ResponseCode.ERROR); | ||
| 334 | + rs.put("msg", "服务器没有找到对应数据!"); | ||
| 335 | + } else if (d80.isConfirm()) { | ||
| 336 | + rs.put("status", ResponseCode.ERROR); | ||
| 337 | + rs.put("msg", "该数据已经被处理了!"); | ||
| 338 | + } else { | ||
| 339 | + SysUser user = SecurityUtils.getCurrentUser(); | ||
| 340 | + d80.setC0(reply, user.getUserName()); | ||
| 341 | + // 入库 | ||
| 342 | + d80Repository.save(d80); | ||
| 343 | + //回复网关 | ||
| 344 | + int code = GatewayHttpUtils.postJson(JSON.toJSONString(d80.getC0())); | ||
| 345 | + | ||
| 346 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 347 | + if (code != 0) | ||
| 348 | + rs.put("msg", "发送C0响应指令到车载设备失败,但该操作已经被系统记录!"); | ||
| 349 | + | ||
| 350 | + pilotReport.reply(d80); | ||
| 351 | + | ||
| 352 | + // 通知页面 | ||
| 353 | + Map<String, Object> sockMap = new HashMap<>(); | ||
| 354 | + sockMap.put("fn", "d80Confirm"); | ||
| 355 | + sockMap.put("id", d80.getId()); | ||
| 356 | + sockMap.put("lineId", d80.getData().getLineId()); | ||
| 357 | + socketHandler.sendMessageToLine(d80.getData().getLineId().toString(), JSON.toJSONString(sockMap)); | ||
| 358 | + } | ||
| 359 | + } catch (Exception e) { | ||
| 360 | + logger.error("80响应出现异常...", e); | ||
| 361 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 362 | + } | ||
| 363 | + | ||
| 364 | + return rs; | ||
| 365 | + } | ||
| 366 | + | ||
| 367 | + @Override | ||
| 368 | + public Map<String, Object> findDirective(String nbbms, int dType, int page, int size) { | ||
| 369 | + Map<String, Object> rsMap = new HashMap<>(); | ||
| 370 | + try{ | ||
| 371 | + | ||
| 372 | + List<String> carArray = new ArrayList<>(), deviceArray=new ArrayList<>(); | ||
| 373 | + if(StringUtils.isNotEmpty(nbbms)){ | ||
| 374 | + carArray = Splitter.on(",").splitToList(nbbms); | ||
| 375 | + //转换成设备号 | ||
| 376 | + Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse(); | ||
| 377 | + for(int i = 0, len=carArray.size(); i < len; i++){ | ||
| 378 | + deviceArray.add(nbbm2deviceMap.get(carArray.get(i))); | ||
| 379 | + } | ||
| 380 | + } | ||
| 381 | + | ||
| 382 | + List<Directive> list = new ArrayList<>(); | ||
| 383 | + switch (dType) { | ||
| 384 | + case -1: | ||
| 385 | + //所有指令 | ||
| 386 | + list = new ArrayList<>(dayOfDirectives.all()); | ||
| 387 | + break; | ||
| 388 | + case 0: | ||
| 389 | + //调度指令 | ||
| 390 | + Collection<D60> dptArray = dayOfDirectives.all60(); | ||
| 391 | + for (D60 d60 : dptArray) { | ||
| 392 | + if (d60.isDispatch()) | ||
| 393 | + list.add(d60); | ||
| 394 | + } | ||
| 395 | + break; | ||
| 396 | + case 1: | ||
| 397 | + //运营指令 | ||
| 398 | + Collection<D60> yyArray = dayOfDirectives.all60(); | ||
| 399 | + for (D60 d60 : yyArray) { | ||
| 400 | + if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x03 | ||
| 401 | + && !d60.isDispatch()) | ||
| 402 | + list.add(d60); | ||
| 403 | + } | ||
| 404 | + break; | ||
| 405 | + case 2: | ||
| 406 | + //线路切换指令 | ||
| 407 | + list.addAll(dayOfDirectives.all64()); | ||
| 408 | + break; | ||
| 409 | + case 3: | ||
| 410 | + //消息短语 | ||
| 411 | + Collection<D60> dyArray = dayOfDirectives.all60(); | ||
| 412 | + for (D60 d60 : dyArray) { | ||
| 413 | + if (d60 != null && d60.getData().getDispatchInstruct() == (short) 0x00 | ||
| 414 | + && !d60.isDispatch()) | ||
| 415 | + list.add(d60); | ||
| 416 | + } | ||
| 417 | + break; | ||
| 418 | + } | ||
| 419 | + | ||
| 420 | + // 时间倒序 | ||
| 421 | + Collections.sort(list, new DayOfDirectives.DComparator()); | ||
| 422 | + if(deviceArray.size() > 0){ | ||
| 423 | + //按设备号过滤 | ||
| 424 | + List<Directive> subList = new ArrayList<>(); | ||
| 425 | + for (Directive d : list) { | ||
| 426 | + if (deviceArray.contains(d.getDeviceId())) { | ||
| 427 | + subList.add(d); | ||
| 428 | + } | ||
| 429 | + } | ||
| 430 | + list = subList; | ||
| 431 | + } | ||
| 432 | + | ||
| 433 | + for(Directive d : list){ | ||
| 434 | + d.setTimeHHmm(fmtHHmm.print(d.getTimestamp())); | ||
| 435 | + d.setNbbm(BasicData.deviceId2NbbmMap.get(d.getDeviceId())); | ||
| 436 | + } | ||
| 437 | + | ||
| 438 | + int count = list.size(); | ||
| 439 | + // 分页 | ||
| 440 | + int s = page * size, e = s + size; | ||
| 441 | + | ||
| 442 | + if (e > count) | ||
| 443 | + e = count; | ||
| 444 | + | ||
| 445 | + List<Directive> rs = list.subList(s, e); | ||
| 446 | + rsMap.put("list", rs); | ||
| 447 | + rsMap.put("totalPages", count % size == 0 ? (count / size - 1) : count / size); | ||
| 448 | + rsMap.put("page", page); | ||
| 449 | + }catch (Exception e){ | ||
| 450 | + logger.error("", e); | ||
| 451 | + throw e; | ||
| 452 | + } | ||
| 453 | + return rsMap; | ||
| 454 | + } | ||
| 455 | + | ||
| 456 | + @Override | ||
| 457 | + public Map<String, Object> findAll80(Map<String, Object> map, int page, int size) { | ||
| 458 | + | ||
| 459 | + List all = ListFilterUtils.filter(pilotReport.findAll(), map, D80.class); | ||
| 460 | + //排序 | ||
| 461 | + Collections.sort(all, new Comparator<D80>() { | ||
| 462 | + @Override | ||
| 463 | + public int compare(D80 o1, D80 o2) { | ||
| 464 | + return (int) (o2.getTimestamp() - o1.getTimestamp()); | ||
| 465 | + } | ||
| 466 | + }); | ||
| 467 | + List<D80> d80s = ListPageQueryUtils.paging(all, page, size); | ||
| 468 | + //时间格式化 | ||
| 469 | + for (D80 d80 : d80s) { | ||
| 470 | + d80.setTimeStr(fmtHHmm.print(d80.getTimestamp())); | ||
| 471 | + } | ||
| 472 | + Map<String, Object> rsMap = new HashMap<>(); | ||
| 473 | + rsMap.put("list", d80s); | ||
| 474 | + rsMap.put("totalPages", all.size() % size == 0 ? all.size() / size - 1: all.size() / size); | ||
| 475 | + rsMap.put("page", page); | ||
| 476 | + return rsMap; | ||
| 477 | + } | ||
| 478 | + | ||
| 479 | + @Override | ||
| 480 | + public D64 save64(D64 d64) { | ||
| 481 | + return d64Repository.save(d64); | ||
| 482 | + } | ||
| 483 | + | ||
| 484 | + @Override | ||
| 485 | + public Map<String, Object> sendC0A4(String nbbm) { | ||
| 486 | + Map<String, Object> rs = new HashMap<>(); | ||
| 487 | + | ||
| 488 | + String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm); | ||
| 489 | + | ||
| 490 | + GpsEntity gps = gpsRealDataBuffer.get(deviceId); | ||
| 491 | + if(gps == null || gps.isOffline()){ | ||
| 492 | + rs.put("status", ResponseCode.ERROR); | ||
| 493 | + rs.put("msg", "下发指令失败,设备离线"); | ||
| 494 | + return rs; | ||
| 495 | + } | ||
| 496 | + | ||
| 497 | + Map<String, Object> c0a4 = new HashMap<>(); | ||
| 498 | + c0a4.put("deviceId", deviceId); | ||
| 499 | + c0a4.put("timestamp", System.currentTimeMillis()); | ||
| 500 | + c0a4.put("operCode", (short) 0xC0); | ||
| 501 | + | ||
| 502 | + Map<String, Object> data = new HashMap<>(); | ||
| 503 | + data.put("deviceId", deviceId); | ||
| 504 | + data.put("operCode2", (short) 0xA4); | ||
| 505 | + c0a4.put("data", data); | ||
| 506 | + | ||
| 507 | + int code = GatewayHttpUtils.postJson(JSON.toJSONString(c0a4)); | ||
| 508 | + if(code != 0){ | ||
| 509 | + rs.put("status", ResponseCode.ERROR); | ||
| 510 | + rs.put("msg", "和网关通讯失败, code " + code); | ||
| 511 | + } | ||
| 512 | + else{ | ||
| 513 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 514 | + } | ||
| 515 | + return rs; | ||
| 516 | + } | ||
| 517 | + | ||
| 518 | + @Override | ||
| 519 | + public int sendC0A3(DC0_A3 c0a3) { | ||
| 520 | + GatewayHttpUtils.postJson(JSON.toJSONString(c0a3)); | ||
| 521 | + return 0; | ||
| 522 | + } | ||
| 523 | + | ||
| 524 | + @Override | ||
| 525 | + public int sendC0A5(String json) { | ||
| 526 | + return GatewayHttpUtils.postJson(json); | ||
| 527 | + } | ||
| 528 | + | ||
| 529 | + @Override | ||
| 530 | + public int refreshLineFile(String deviceId) { | ||
| 531 | + GpsEntity gps = gpsRealDataBuffer.get(deviceId); | ||
| 532 | + if (gps == null) | ||
| 533 | + return -1; | ||
| 534 | + | ||
| 535 | + return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId())); | ||
| 536 | + } | ||
| 537 | + | ||
| 538 | +/* @Override | ||
| 539 | + public int stateChange(String nbbm, Integer upDown, Integer state, String userName) { | ||
| 540 | + return send60Operation(nbbm, state, upDown, userName); | ||
| 541 | + }*/ | ||
| 542 | + | ||
| 543 | + @Override | ||
| 544 | + public Map<String, Object> deviceCofigList(Map<String, String> map, int page, int size) { | ||
| 545 | + Map<String, Object> rs = new HashMap<>(); | ||
| 546 | + try { | ||
| 547 | + String conts=""; | ||
| 548 | + if(StringUtils.isNotBlank(map.get("lineId"))){ | ||
| 549 | + conts+=" AND xl='" + map.get("lineId")+"'"; | ||
| 550 | + } | ||
| 551 | + if(StringUtils.isNotBlank(map.get("nbbm"))){ | ||
| 552 | + conts+=" AND inside_code like '%" + map.get("nbbm")+"%'"; | ||
| 553 | + } | ||
| 554 | + if(StringUtils.isNotBlank(map.get("deviceId"))){ | ||
| 555 | + conts+=" AND equipment_code like '%" + map.get("deviceId")+"%'"; | ||
| 556 | + } | ||
| 557 | + | ||
| 558 | + String sql = "select * from (SELECT * FROM (SELECT id AS cl_id,inside_code,equipment_code FROM bsth_c_cars ) t1 LEFT JOIN bsth_v_c0_a4 t2 ON t1.equipment_code = t2.id LEFT JOIN (SELECT xl,cl FROM bsth_c_s_ccinfo WHERE id IN (SELECT max(id) FROM bsth_c_s_ccinfo GROUP BY cl)) t3 ON t1.cl_id = t3.cl ORDER BY t2.`timestamp` DESC) t4 where 1=1 "+conts; | ||
| 559 | + | ||
| 560 | + int count = jdbcTemplate.queryForObject("select count(*) from ("+sql+") c1", Integer.class); | ||
| 561 | + int totalPages = count % size == 0 ? count / size : count / size + 1; | ||
| 562 | + int s = page * size; | ||
| 563 | + List<DeviceConfigDto> list = jdbcTemplate.query(sql + " LIMIT " + s + "," + size, new BeanPropertyRowMapper<>(DeviceConfigDto.class)); | ||
| 564 | + | ||
| 565 | + rs.put("status", ResponseCode.SUCCESS); | ||
| 566 | + rs.put("list", list); | ||
| 567 | + rs.put("totalPages", totalPages); | ||
| 568 | + rs.put("page", page); | ||
| 569 | + } catch (Exception e) { | ||
| 570 | + e.printStackTrace(); | ||
| 571 | + logger.error("", e); | ||
| 572 | + rs.put("status", ResponseCode.ERROR); | ||
| 573 | + } | ||
| 574 | + return rs; | ||
| 575 | + } | ||
| 576 | +} |
src/main/resources/static/pages/base/line/add.html
| @@ -418,15 +418,15 @@ | @@ -418,15 +418,15 @@ | ||
| 418 | 418 | ||
| 419 | <!-- 表单分组组件 form-group START --> | 419 | <!-- 表单分组组件 form-group START --> |
| 420 | <div class="form-group"> | 420 | <div class="form-group"> |
| 421 | - <!-- 上海市线路编码 START --> | 421 | + <!-- 锐明线路编码 START --> |
| 422 | <div class="col-md-6"> | 422 | <div class="col-md-6"> |
| 423 | - <label class="control-label col-md-5"> 上海市线路编码: </label> | 423 | + <label class="control-label col-md-5"> 锐明线路编码: </label> |
| 424 | <div class="col-md-4"> | 424 | <div class="col-md-4"> |
| 425 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" | 425 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" |
| 426 | - placeholder="上海市线路编码"> | 426 | + placeholder="锐明线路编码"> |
| 427 | </div> | 427 | </div> |
| 428 | </div> | 428 | </div> |
| 429 | - <!-- 上海市线路编码 END --> | 429 | + <!-- 锐明线路编码 END --> |
| 430 | 430 | ||
| 431 | <!--设备线路编码 START --> | 431 | <!--设备线路编码 START --> |
| 432 | <div class="col-md-6"> | 432 | <div class="col-md-6"> |
src/main/resources/static/pages/base/line/details.html
| @@ -365,15 +365,15 @@ | @@ -365,15 +365,15 @@ | ||
| 365 | 365 | ||
| 366 | <!-- 表单分组组件 form-group START --> | 366 | <!-- 表单分组组件 form-group START --> |
| 367 | <div class="form-group"> | 367 | <div class="form-group"> |
| 368 | - <!-- 上海市线路编码 START --> | 368 | + <!-- 锐明线路编码 START --> |
| 369 | <div class="col-md-6"> | 369 | <div class="col-md-6"> |
| 370 | - <label class="control-label col-md-5"> 上海市线路编码: </label> | 370 | + <label class="control-label col-md-5"> 锐明线路编码: </label> |
| 371 | <div class="col-md-4"> | 371 | <div class="col-md-4"> |
| 372 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" | 372 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" |
| 373 | - placeholder="上海市线路编码"> | 373 | + placeholder="锐明线路编码"> |
| 374 | </div> | 374 | </div> |
| 375 | </div> | 375 | </div> |
| 376 | - <!-- 上海市线路编码 END --> | 376 | + <!-- 锐明线路编码 END --> |
| 377 | 377 | ||
| 378 | <!--设备线路编码 START --> | 378 | <!--设备线路编码 START --> |
| 379 | <div class="col-md-6"> | 379 | <div class="col-md-6"> |
src/main/resources/static/pages/base/line/edit.html
| @@ -379,15 +379,15 @@ | @@ -379,15 +379,15 @@ | ||
| 379 | 379 | ||
| 380 | <!-- 表单分组组件 form-group START --> | 380 | <!-- 表单分组组件 form-group START --> |
| 381 | <div class="form-group"> | 381 | <div class="form-group"> |
| 382 | - <!-- 上海市线路编码 START --> | 382 | + <!-- 锐明线路编码 START --> |
| 383 | <div class="col-md-6"> | 383 | <div class="col-md-6"> |
| 384 | - <label class="control-label col-md-5"> 上海市线路编码: </label> | 384 | + <label class="control-label col-md-5"> 锐明线路编码: </label> |
| 385 | <div class="col-md-4"> | 385 | <div class="col-md-4"> |
| 386 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" | 386 | <input type="text" class="form-control" name="shanghaiLinecode" id="shanghaiLinecodeInput" |
| 387 | - placeholder="上海市线路编码"> | 387 | + placeholder="锐明线路编码"> |
| 388 | </div> | 388 | </div> |
| 389 | </div> | 389 | </div> |
| 390 | - <!-- 上海市线路编码 END --> | 390 | + <!-- 锐明线路编码 END --> |
| 391 | 391 | ||
| 392 | <!--设备线路编码 START --> | 392 | <!--设备线路编码 START --> |
| 393 | <div class="col-md-6"> | 393 | <div class="col-md-6"> |
src/main/resources/static/pages/base/line/list.html
| @@ -72,7 +72,7 @@ | @@ -72,7 +72,7 @@ | ||
| 72 | <th width="9%">所属分公司</th> | 72 | <th width="9%">所属分公司</th> |
| 73 | <th width="6%">线路性质</th> | 73 | <th width="6%">线路性质</th> |
| 74 | <th width="6%">线路等级</th> | 74 | <th width="6%">线路等级</th> |
| 75 | - <th width="9%">上海市线路编码</th> | 75 | + <th width="9%">锐明线路编码</th> |
| 76 | <th width="7%">是否撤销</th> | 76 | <th width="7%">是否撤销</th> |
| 77 | <th width="6%">线路标准</th> | 77 | <th width="6%">线路标准</th> |
| 78 | <th width="6%">站点详情</th> | 78 | <th width="6%">站点详情</th> |
src/main/resources/static/pages/trafficManage/lineStationUploadRecord.html
| 1 | -<link href="css/trafficManage.css" rel="stylesheet" type="text/css" /> | ||
| 2 | -<link href="css/autocompleter.css" rel="stylesheet" type="text/css" /> | ||
| 3 | -<ul class="page-breadcrumb breadcrumb"> | ||
| 4 | - <li><a href="/pages/home.html" data-pjax>首页</a> <i | ||
| 5 | - class="fa fa-circle"></i></li> | ||
| 6 | - <li><span class="active">运维管理</span> <i class="fa fa-circle"></i></li> | ||
| 7 | - <li><span class="active">车载上报停靠站</span></li> | ||
| 8 | -</ul> | ||
| 9 | -<div class="tab_line"> | ||
| 10 | - <div class="col-md-12"> | ||
| 11 | - <form class="form-inline" action=""> | ||
| 12 | - <div class="inLine_block" class="param"> | ||
| 13 | - <span class="item-label" style="width: 80px;">筛选数据:日期:</span> | ||
| 14 | - <input class="form-control" name="reportDate" type="text" id="dateInput" style="width: 180px;"/> | ||
| 15 | - </div> | ||
| 16 | - <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 17 | - <span class="item-label" style="width: 80px;">时间范围:</span> | ||
| 18 | - <input type="text" name="startDate" class="inputCommon dateRange">至 | ||
| 19 | - <input type="text" name="endDate" class="inputCommon dateRange">时 | ||
| 20 | - </div> | ||
| 21 | - <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 22 | - <span class="item-label" style="width: 80px;">线路名称:</span> | ||
| 23 | - <select class="form-control" name="lineId" id="line" style="width: 150px;"></select> | ||
| 24 | - </div> | ||
| 25 | - <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 26 | - <span class="item-label" style="width: 80px;">内部编码:</span> | ||
| 27 | - <input type="text" name="insideCode" id="insideCode" style="width: 120px;" maxlength="40"/> | ||
| 28 | - </div> | ||
| 29 | - <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 30 | - <span class="item-label" style="width: 80px;">车牌号:</span> | ||
| 31 | - <input type="text" name="carPlate" id="carPlate" style="width: 120px;" maxlength="40"/> | ||
| 32 | - <span style="color: red;width: 80px;">(沪D-12345 '沪'和'-'去掉)</span> | ||
| 33 | - </div> | ||
| 34 | - <div class="form-group" style="display: inline-block;margin-left: 15px;"> | ||
| 35 | - <a class="btn btn-circle blue" id="search">筛选</a> | ||
| 36 | - </div> | ||
| 37 | - </form> | ||
| 38 | - </div> | ||
| 39 | - <div class="col-md-12 panel-wrap"> | ||
| 40 | - <div class="_panel"> | ||
| 41 | - <div class="table-container"> | ||
| 42 | - <table | ||
| 43 | - class="table table-striped table-bordered table-advance pb-table head" | ||
| 44 | - id="vehicle_stop"> | ||
| 45 | - <thead> | ||
| 46 | - <tr> | ||
| 47 | - <th>序号</th> | ||
| 48 | - <th>公司</th> | ||
| 49 | - <th>分公司</th> | ||
| 50 | - <th>线路</th> | ||
| 51 | - <th>上海市线路编码</th> | ||
| 52 | - <th>内部编码</th> | ||
| 53 | - <th>设备编码</th> | ||
| 54 | - <th>车牌</th> | ||
| 55 | - <th>站点序号</th> | ||
| 56 | - <th>营运状态</th> | ||
| 57 | - <th>上下行</th> | ||
| 58 | - <th>站内外</th> | ||
| 59 | - <th>上报时间</th> | ||
| 60 | - </tr> | ||
| 61 | - </thead> | ||
| 62 | - <tbody> | ||
| 63 | - </tbody> | ||
| 64 | - </table> | ||
| 65 | - <div style="text-align: right;"> | ||
| 66 | - <ul id="pagination" class="pagination"></ul> | ||
| 67 | - </div> | ||
| 68 | - </div> | ||
| 69 | - </div> | ||
| 70 | - </div> | ||
| 71 | -</div> | ||
| 72 | -<script id="lineStationUploadRecord_list_temp" type="text/html"> | ||
| 73 | -{{each list as obj i}} | ||
| 74 | -<tr> | ||
| 75 | - <td class="seq" style="vertical-align: middle;"> | ||
| 76 | - {{i+1}} | ||
| 77 | - </td> | ||
| 78 | - <td> | ||
| 79 | - {{obj['branche_company']}} | ||
| 80 | - </td> | ||
| 81 | - <td> | ||
| 82 | - {{obj['company']}} | ||
| 83 | - </td> | ||
| 84 | - <td> | ||
| 85 | - {{obj['name']}} | ||
| 86 | - </td> | ||
| 87 | - <td> | ||
| 88 | - {{obj['shanghai_linecode']}} | ||
| 89 | - </td> | ||
| 90 | - <td> | ||
| 91 | - {{obj['inside_code']}} | ||
| 92 | - </td> | ||
| 93 | - <td> | ||
| 94 | - {{obj['equipment_code']}} | ||
| 95 | - </td> | ||
| 96 | - <td> | ||
| 97 | - {{obj['car_plate']}} | ||
| 98 | - </td> | ||
| 99 | - <td> | ||
| 100 | - {{obj['stop']}} | ||
| 101 | - </td> | ||
| 102 | - <td> | ||
| 103 | - {{obj['service_state']}} | ||
| 104 | - </td> | ||
| 105 | - <td> | ||
| 106 | - {{obj['up_down']}} | ||
| 107 | - </td> | ||
| 108 | - <td> | ||
| 109 | - {{obj['in_out_stop']}} | ||
| 110 | - </td> | ||
| 111 | - <td> | ||
| 112 | - {{obj['report_date']}} | ||
| 113 | - </td> | ||
| 114 | -</tr> | ||
| 115 | -{{/each}} | ||
| 116 | -{{if list.length == 0}} | ||
| 117 | -<tr class="muted"> | ||
| 118 | - <td colspan=13 style="text-align: center;"><h6>没有找到相关数据</h6></td> | ||
| 119 | -</tr> | ||
| 120 | -{{/if}} | ||
| 121 | - </script> | 1 | +<link href="css/trafficManage.css" rel="stylesheet" type="text/css" /> |
| 2 | +<link href="css/autocompleter.css" rel="stylesheet" type="text/css" /> | ||
| 3 | +<ul class="page-breadcrumb breadcrumb"> | ||
| 4 | + <li><a href="/pages/home.html" data-pjax>首页</a> <i | ||
| 5 | + class="fa fa-circle"></i></li> | ||
| 6 | + <li><span class="active">运维管理</span> <i class="fa fa-circle"></i></li> | ||
| 7 | + <li><span class="active">车载上报停靠站</span></li> | ||
| 8 | +</ul> | ||
| 9 | +<div class="tab_line"> | ||
| 10 | + <div class="col-md-12"> | ||
| 11 | + <form class="form-inline" action=""> | ||
| 12 | + <div class="inLine_block" class="param"> | ||
| 13 | + <span class="item-label" style="width: 80px;">筛选数据:日期:</span> | ||
| 14 | + <input class="form-control" name="reportDate" type="text" id="dateInput" style="width: 180px;"/> | ||
| 15 | + </div> | ||
| 16 | + <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 17 | + <span class="item-label" style="width: 80px;">时间范围:</span> | ||
| 18 | + <input type="text" name="startDate" class="inputCommon dateRange">至 | ||
| 19 | + <input type="text" name="endDate" class="inputCommon dateRange">时 | ||
| 20 | + </div> | ||
| 21 | + <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 22 | + <span class="item-label" style="width: 80px;">线路名称:</span> | ||
| 23 | + <select class="form-control" name="lineId" id="line" style="width: 150px;"></select> | ||
| 24 | + </div> | ||
| 25 | + <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 26 | + <span class="item-label" style="width: 80px;">内部编码:</span> | ||
| 27 | + <input type="text" name="insideCode" id="insideCode" style="width: 120px;" maxlength="40"/> | ||
| 28 | + </div> | ||
| 29 | + <div class="inLine_block" style="display: inline-block;margin-left: 15px;"> | ||
| 30 | + <span class="item-label" style="width: 80px;">车牌号:</span> | ||
| 31 | + <input type="text" name="carPlate" id="carPlate" style="width: 120px;" maxlength="40"/> | ||
| 32 | + <span style="color: red;width: 80px;">(沪D-12345 '沪'和'-'去掉)</span> | ||
| 33 | + </div> | ||
| 34 | + <div class="form-group" style="display: inline-block;margin-left: 15px;"> | ||
| 35 | + <a class="btn btn-circle blue" id="search">筛选</a> | ||
| 36 | + </div> | ||
| 37 | + </form> | ||
| 38 | + </div> | ||
| 39 | + <div class="col-md-12 panel-wrap"> | ||
| 40 | + <div class="_panel"> | ||
| 41 | + <div class="table-container"> | ||
| 42 | + <table | ||
| 43 | + class="table table-striped table-bordered table-advance pb-table head" | ||
| 44 | + id="vehicle_stop"> | ||
| 45 | + <thead> | ||
| 46 | + <tr> | ||
| 47 | + <th>序号</th> | ||
| 48 | + <th>公司</th> | ||
| 49 | + <th>分公司</th> | ||
| 50 | + <th>线路</th> | ||
| 51 | + <th>锐明线路编码</th> | ||
| 52 | + <th>内部编码</th> | ||
| 53 | + <th>设备编码</th> | ||
| 54 | + <th>车牌</th> | ||
| 55 | + <th>站点序号</th> | ||
| 56 | + <th>营运状态</th> | ||
| 57 | + <th>上下行</th> | ||
| 58 | + <th>站内外</th> | ||
| 59 | + <th>上报时间</th> | ||
| 60 | + </tr> | ||
| 61 | + </thead> | ||
| 62 | + <tbody> | ||
| 63 | + </tbody> | ||
| 64 | + </table> | ||
| 65 | + <div style="text-align: right;"> | ||
| 66 | + <ul id="pagination" class="pagination"></ul> | ||
| 67 | + </div> | ||
| 68 | + </div> | ||
| 69 | + </div> | ||
| 70 | + </div> | ||
| 71 | +</div> | ||
| 72 | +<script id="lineStationUploadRecord_list_temp" type="text/html"> | ||
| 73 | +{{each list as obj i}} | ||
| 74 | +<tr> | ||
| 75 | + <td class="seq" style="vertical-align: middle;"> | ||
| 76 | + {{i+1}} | ||
| 77 | + </td> | ||
| 78 | + <td> | ||
| 79 | + {{obj['branche_company']}} | ||
| 80 | + </td> | ||
| 81 | + <td> | ||
| 82 | + {{obj['company']}} | ||
| 83 | + </td> | ||
| 84 | + <td> | ||
| 85 | + {{obj['name']}} | ||
| 86 | + </td> | ||
| 87 | + <td> | ||
| 88 | + {{obj['shanghai_linecode']}} | ||
| 89 | + </td> | ||
| 90 | + <td> | ||
| 91 | + {{obj['inside_code']}} | ||
| 92 | + </td> | ||
| 93 | + <td> | ||
| 94 | + {{obj['equipment_code']}} | ||
| 95 | + </td> | ||
| 96 | + <td> | ||
| 97 | + {{obj['car_plate']}} | ||
| 98 | + </td> | ||
| 99 | + <td> | ||
| 100 | + {{obj['stop']}} | ||
| 101 | + </td> | ||
| 102 | + <td> | ||
| 103 | + {{obj['service_state']}} | ||
| 104 | + </td> | ||
| 105 | + <td> | ||
| 106 | + {{obj['up_down']}} | ||
| 107 | + </td> | ||
| 108 | + <td> | ||
| 109 | + {{obj['in_out_stop']}} | ||
| 110 | + </td> | ||
| 111 | + <td> | ||
| 112 | + {{obj['report_date']}} | ||
| 113 | + </td> | ||
| 114 | +</tr> | ||
| 115 | +{{/each}} | ||
| 116 | +{{if list.length == 0}} | ||
| 117 | +<tr class="muted"> | ||
| 118 | + <td colspan=13 style="text-align: center;"><h6>没有找到相关数据</h6></td> | ||
| 119 | +</tr> | ||
| 120 | +{{/if}} | ||
| 121 | + </script> | ||
| 122 | <script src="./js/lineStationUploadRecord.js"></script> | 122 | <script src="./js/lineStationUploadRecord.js"></script> |
| 123 | \ No newline at end of file | 123 | \ No newline at end of file |