Commit 0edfd795d574ca68f2208f3a942b74bc9f083eac
1 parent
45776ffe
update...
Showing
31 changed files
with
3942 additions
and
107 deletions
src/main/java/com/bsth/WebAppConfiguration.java
| 1 | 1 | package com.bsth; |
| 2 | 2 | |
| 3 | -import javax.servlet.Filter; | |
| 4 | - | |
| 5 | -import org.springframework.beans.factory.annotation.Autowired; | |
| 3 | +import com.bsth.filter.ResourceFilter; | |
| 4 | +import com.bsth.websocket.WebSocketHandshakeInterceptor; | |
| 5 | +import com.bsth.websocket.handler.RealControlSocketHandler; | |
| 6 | +import org.slf4j.Logger; | |
| 7 | +import org.slf4j.LoggerFactory; | |
| 6 | 8 | import org.springframework.boot.context.embedded.FilterRegistrationBean; |
| 7 | 9 | import org.springframework.context.annotation.Bean; |
| 8 | 10 | import org.springframework.context.annotation.ComponentScan; |
| 9 | 11 | import org.springframework.context.annotation.Configuration; |
| 10 | 12 | import org.springframework.web.filter.CharacterEncodingFilter; |
| 11 | 13 | import org.springframework.web.filter.HttpPutFormContentFilter; |
| 12 | -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; | |
| 13 | 14 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; |
| 14 | 15 | import org.springframework.web.socket.config.annotation.EnableWebSocket; |
| 15 | 16 | import org.springframework.web.socket.config.annotation.WebSocketConfigurer; |
| 16 | 17 | import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; |
| 18 | +import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; | |
| 17 | 19 | |
| 18 | -import com.bsth.filter.ResourceFilter; | |
| 19 | -import com.bsth.oplog.http.HttpOpLogInterceptor; | |
| 20 | -import com.bsth.websocket.WebSocketHandshakeInterceptor; | |
| 21 | -import com.bsth.websocket.handler.RealControlSocketHandler; | |
| 20 | +import javax.servlet.Filter; | |
| 22 | 21 | |
| 23 | 22 | @Configuration |
| 24 | 23 | @EnableWebSocket |
| ... | ... | @@ -27,6 +26,8 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS |
| 27 | 26 | |
| 28 | 27 | // @Autowired |
| 29 | 28 | // HttpOpLogInterceptor httpOpLogInterceptor; |
| 29 | + | |
| 30 | + Logger logger = LoggerFactory.getLogger(this.getClass()); | |
| 30 | 31 | |
| 31 | 32 | /** |
| 32 | 33 | * @Title: httpPutFormContentFilter |
| ... | ... | @@ -75,4 +76,17 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter implements WebS |
| 75 | 76 | registry.addHandler(new RealControlSocketHandler(), "/sockjs/realcontrol").addInterceptors(new WebSocketHandshakeInterceptor()) |
| 76 | 77 | .withSockJS(); |
| 77 | 78 | } |
| 79 | + | |
| 80 | + /** | |
| 81 | + * 增加websocket的输出缓冲区 | |
| 82 | + * @return | |
| 83 | + */ | |
| 84 | + @Bean | |
| 85 | + public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() { | |
| 86 | + ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); | |
| 87 | + container.setMaxTextMessageBufferSize(52768); | |
| 88 | + container.setMaxBinaryMessageBufferSize(52768); | |
| 89 | + logger.info("Websocket factory returned"); | |
| 90 | + return container; | |
| 91 | + } | |
| 78 | 92 | } | ... | ... |
src/main/java/com/bsth/controller/realcontrol/ChildTaskPlanController.java
| 1 | 1 | package com.bsth.controller.realcontrol; |
| 2 | 2 | |
| 3 | +import com.bsth.controller.BaseController; | |
| 4 | +import com.bsth.entity.realcontrol.ChildTaskPlan; | |
| 5 | +import com.bsth.service.realcontrol.ChildTaskPlanService; | |
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 7 | +import org.springframework.web.bind.annotation.PathVariable; | |
| 3 | 8 | import org.springframework.web.bind.annotation.RequestMapping; |
| 9 | +import org.springframework.web.bind.annotation.RequestMethod; | |
| 4 | 10 | import org.springframework.web.bind.annotation.RestController; |
| 5 | 11 | |
| 6 | -import com.bsth.controller.BaseController; | |
| 7 | -import com.bsth.entity.realcontrol.ChildTaskPlan; | |
| 12 | +import java.util.Map; | |
| 8 | 13 | |
| 9 | 14 | @RestController |
| 10 | 15 | @RequestMapping("/childTask") |
| 11 | 16 | public class ChildTaskPlanController extends BaseController<ChildTaskPlan, Long>{ |
| 12 | 17 | |
| 18 | + @Autowired | |
| 19 | + ChildTaskPlanService childTaskPlanService; | |
| 20 | + | |
| 21 | + @RequestMapping(value = "history", method = RequestMethod.POST) | |
| 22 | + public Map<String, Object> saveHistory(ChildTaskPlan childTask){ | |
| 23 | + return childTaskPlanService.saveHistory(childTask); | |
| 24 | + } | |
| 25 | + | |
| 26 | + @RequestMapping(value = "history/{id}", method = RequestMethod.DELETE) | |
| 27 | + public Map<String, Object> delHistory(@PathVariable("id") Long id){ | |
| 28 | + return childTaskPlanService.delHistory(id); | |
| 29 | + } | |
| 13 | 30 | } | ... | ... |
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
| ... | ... | @@ -419,10 +419,10 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, |
| 419 | 419 | return scheduleRealInfoService.changeBcType(id, bcType, remarks); |
| 420 | 420 | } |
| 421 | 421 | |
| 422 | -/* @RequestMapping(value="/history", method=RequestMethod.POST) | |
| 422 | + @RequestMapping(value="/history", method=RequestMethod.POST) | |
| 423 | 423 | public Map<String,Object> historySave(ScheduleRealInfo sch){ |
| 424 | 424 | return scheduleRealInfoService.historySave(sch); |
| 425 | - }*/ | |
| 425 | + } | |
| 426 | 426 | |
| 427 | 427 | |
| 428 | 428 | private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"); |
| ... | ... | @@ -435,7 +435,7 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, |
| 435 | 435 | public List<String> dateArray(){ |
| 436 | 436 | List<String> rs = new ArrayList<>(); |
| 437 | 437 | |
| 438 | - long t = new Date().getTime() - ONE_DAY; | |
| 438 | + long t = new Date().getTime() - ONE_DAY - (1000 * 60 * 60 * 2); | |
| 439 | 439 | for(int i = 0; i < 5; i ++){ |
| 440 | 440 | rs.add(fmtyyyyMMdd.print(t)); |
| 441 | 441 | t -= ONE_DAY; |
| ... | ... | @@ -536,4 +536,24 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, |
| 536 | 536 | public List<ScheduleRealInfo> allLate2(@RequestParam String idx){ |
| 537 | 537 | return scheduleRealInfoService.allLate2(idx); |
| 538 | 538 | } |
| 539 | + | |
| 540 | + /** | |
| 541 | + * 添加一个临加到历史库 | |
| 542 | + * @param sch | |
| 543 | + * @return | |
| 544 | + */ | |
| 545 | + @RequestMapping(value = "history/add", method = RequestMethod.POST) | |
| 546 | + public Map<String, Object> addToHistory(ScheduleRealInfo sch){ | |
| 547 | + return scheduleRealInfoService.addToHistory(sch); | |
| 548 | + } | |
| 549 | + | |
| 550 | + /** | |
| 551 | + * 从历史库里删除临加班次 | |
| 552 | + * @param sch | |
| 553 | + * @return | |
| 554 | + */ | |
| 555 | + @RequestMapping(value = "history/{id}", method = RequestMethod.DELETE) | |
| 556 | + public Map<String, Object> deleteToHistory(@PathVariable("id") Long id){ | |
| 557 | + return scheduleRealInfoService.deleteToHistory(id); | |
| 558 | + } | |
| 539 | 559 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
| ... | ... | @@ -270,7 +270,7 @@ public class InOutStationSignalHandle extends SignalHandle{ |
| 270 | 270 | |
| 271 | 271 | //通知客户端 |
| 272 | 272 | sendUtils.sendZdsj(sch, lpNext, doneSum); |
| 273 | - | |
| 273 | + logger.info("车辆:" + sch.getClZbh() + " 班次:" + sch.getDfsj() + "到终点, 时间:" + sch.getZdsjActual()); | |
| 274 | 274 | //准备执行下一个班次 |
| 275 | 275 | if (next != null) { |
| 276 | 276 | //将gps转换为下一个班次走向的站内信号 | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/utils/GeoUtils.java
| ... | ... | @@ -96,7 +96,10 @@ public class GeoUtils { |
| 96 | 96 | public static double getDistanceFromLine(LineString line, Point p){ |
| 97 | 97 | Point s = line.getStartPoint(); |
| 98 | 98 | Point e = line.getEndPoint(); |
| 99 | + return getDistanceFromLine(s, e, p); | |
| 100 | + } | |
| 99 | 101 | |
| 102 | + public static double getDistanceFromLine(Point s, Point e, Point p){ | |
| 100 | 103 | double d1 = getDistance(s, p); |
| 101 | 104 | double d2 = getDistance(p, e); |
| 102 | 105 | double d3 = getDistance(s, e); |
| ... | ... | @@ -147,4 +150,92 @@ public class GeoUtils { |
| 147 | 150 | public static boolean overdue(GpsEntity prevGps, GpsEntity gps) { |
| 148 | 151 | return gps.getTimestamp() - prevGps.getTimestamp() < 120000; |
| 149 | 152 | } |
| 153 | + | |
| 154 | + /** | |
| 155 | + * 计算2条直线的最短距离 | |
| 156 | + * @param p1 | |
| 157 | + * @param p2 | |
| 158 | + * @param p3 | |
| 159 | + * @param p4 | |
| 160 | + * @return | |
| 161 | + */ | |
| 162 | + public static double getDistanceLineToLine(Point p1, Point p2, Point p3, Point p4){ | |
| 163 | + double distance; | |
| 164 | + double x1 = p1.getX(); //A点坐标(x1,y1,z1) | |
| 165 | + double y1 = p1.getY(); | |
| 166 | + double z1 = 0; | |
| 167 | + double x2 = p2.getX(); //B点坐标(x2,y2,z2) | |
| 168 | + double y2 = p2.getY(); | |
| 169 | + double z2 = 0; | |
| 170 | + double x3 = p3.getX(); //C点坐标(x3,y3,z3) | |
| 171 | + double y3 = p3.getY(); | |
| 172 | + double z3 = 0; | |
| 173 | + double x4 = p4.getX(); //D点坐标(x4,y4,z4) | |
| 174 | + double y4 = p4.getY(); | |
| 175 | + double z4 = 0; | |
| 176 | + | |
| 177 | + double a = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1); | |
| 178 | + double b = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3)); | |
| 179 | + double c = -((x1-x2)*(x1-x3)+(y1-y2)*(y1-y3)+(z1-z2)*(z1-z3)); | |
| 180 | + | |
| 181 | + double d = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3)); | |
| 182 | + double e = (x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)+(z4-z3)*(z4-z3); | |
| 183 | + double f = -((x1-x3)*(x4-x3)+(y1-y3)*(y4-y3)+(z1-z3)*(z4-z3)); | |
| 184 | + | |
| 185 | + //平行 | |
| 186 | + if ((a*e-b*d)==0&&(b*d-a*e)==0) | |
| 187 | + { | |
| 188 | + double d1 = getDistance(p1, p3); | |
| 189 | + double d2 = getDistance(p1, p4); | |
| 190 | + distance = (d1<d2)?d1:d2; | |
| 191 | + return distance; | |
| 192 | + } | |
| 193 | + | |
| 194 | + double s = (b*f-e*c)/(a*e-b*d); | |
| 195 | + double t = (a*f-d*c)/(b*d-a*e); | |
| 196 | + | |
| 197 | + //说明P点落在线段AB上,Q点落在线段CD上 | |
| 198 | + if(0<=s&&s<=1&&0<=t&&t<=1) | |
| 199 | + { | |
| 200 | + //2条线段的公垂线段PQ; | |
| 201 | + //P点坐标 | |
| 202 | + double X = x1+s*(x2-x1); | |
| 203 | + double Y = y1+s*(y2-y1); | |
| 204 | + double Z = z1+s*(z2-z1); | |
| 205 | + //Q点坐标 | |
| 206 | + double U = x3+t*(x4-x3); | |
| 207 | + double V = y3+t*(y4-y3); | |
| 208 | + double W = z3+t*(z4-z3); | |
| 209 | + Point p = geometryFactory.createPoint(new Coordinate(X, Y, Z)); | |
| 210 | + Point q = geometryFactory.createPoint(new Coordinate(U, V, W)); | |
| 211 | + distance = getDistance(p, q); | |
| 212 | + } | |
| 213 | + else | |
| 214 | + { | |
| 215 | + double d1 = getDistanceFromLine(p3,p4,p1); | |
| 216 | + double d2 = getDistanceFromLine(p3,p4,p2); | |
| 217 | + double d3 = getDistanceFromLine(p1,p2,p3); | |
| 218 | + double d4 = getDistanceFromLine(p1,p2,p4); | |
| 219 | + distance = (d1<d2)?d1:d2; | |
| 220 | + distance = (distance<d3)?distance:d3; | |
| 221 | + distance = (distance<d4)?distance:d4; | |
| 222 | + } | |
| 223 | + | |
| 224 | + return distance; | |
| 225 | + } | |
| 226 | + | |
| 227 | + /** | |
| 228 | + * 计算点 到 线的垂直交点 | |
| 229 | + * @param lp1 | |
| 230 | + * @param lp2 | |
| 231 | + * @param p | |
| 232 | + * @return | |
| 233 | + */ | |
| 234 | + public static Point perpendularPoint(Point lp1, Point lp2, Point p){ | |
| 235 | + double a = lp1.getX() - lp2.getX(), b = lp2.getY() - lp1.getY(), c = lp1.getY() * lp2.getX() - lp2.getY() * lp1.getX(); | |
| 236 | + double lon = (Math.pow(b, 2) * p.getY() - a * b * p.getX() - a * c) / (Math.pow(a, 2) + Math.pow(b, 2)); | |
| 237 | + double lat = (Math.pow(a, 2) * p.getX() - a * b * p.getY() - b * c) / (Math.pow(a, 2) + Math.pow(b, 2)); | |
| 238 | + | |
| 239 | + return geometryFactory.createPoint(new Coordinate(lat, lon)); | |
| 240 | + } | |
| 150 | 241 | } | ... | ... |
src/main/java/com/bsth/data/gpsdata/arrival/utils/ScheduleSignalState.java
src/main/java/com/bsth/data/gpsdata/thread/GpsDataLoaderThread.java
| ... | ... | @@ -113,8 +113,8 @@ public class GpsDataLoaderThread extends Thread { |
| 113 | 113 | gps.setNbbm(nbbm); |
| 114 | 114 | //有更新的点位 |
| 115 | 115 | updateList.add(gps); |
| 116 | - logger.info("全量点:"+ list.size() +",更新点" + updateList.size()); | |
| 117 | 116 | } |
| 117 | + logger.info("全量点:"+ list.size() +",更新点" + updateList.size()); | |
| 118 | 118 | //分析数据 |
| 119 | 119 | gpsRealAnalyse.analyse(updateList); |
| 120 | 120 | } else | ... | ... |
src/main/java/com/bsth/service/realcontrol/ChildTaskPlanService.java
| ... | ... | @@ -3,6 +3,11 @@ package com.bsth.service.realcontrol; |
| 3 | 3 | import com.bsth.entity.realcontrol.ChildTaskPlan; |
| 4 | 4 | import com.bsth.service.BaseService; |
| 5 | 5 | |
| 6 | +import java.util.Map; | |
| 7 | + | |
| 6 | 8 | public interface ChildTaskPlanService extends BaseService<ChildTaskPlan, Long>{ |
| 7 | 9 | |
| 10 | + Map<String,Object> saveHistory(ChildTaskPlan childTask); | |
| 11 | + | |
| 12 | + Map<String,Object> delHistory(Long id); | |
| 8 | 13 | } | ... | ... |
src/main/java/com/bsth/service/realcontrol/ScheduleRealInfoService.java
| ... | ... | @@ -138,7 +138,7 @@ public interface ScheduleRealInfoService extends BaseService<ScheduleRealInfo, L |
| 138 | 138 | |
| 139 | 139 | Map<String,Object> changeBcType(Long id, String bcType, String remarks); |
| 140 | 140 | |
| 141 | - //Map<String,Object> historySave(ScheduleRealInfo sch); | |
| 141 | + Map<String,Object> historySave(ScheduleRealInfo sch); | |
| 142 | 142 | |
| 143 | 143 | Map<String, Object> MapById(Long id) ; |
| 144 | 144 | |
| ... | ... | @@ -165,4 +165,8 @@ public interface ScheduleRealInfoService extends BaseService<ScheduleRealInfo, L |
| 165 | 165 | Map<String,Object> lateAdjust(String idx, float minute); |
| 166 | 166 | |
| 167 | 167 | List<ScheduleRealInfo> allLate2(String idx); |
| 168 | + | |
| 169 | + Map<String,Object> addToHistory(ScheduleRealInfo sch); | |
| 170 | + | |
| 171 | + Map<String, Object> deleteToHistory(Long id); | |
| 168 | 172 | } | ... | ... |
src/main/java/com/bsth/service/realcontrol/impl/ChildTaskPlanServiceImpl.java
| ... | ... | @@ -86,4 +86,33 @@ public class ChildTaskPlanServiceImpl extends BaseServiceImpl<ChildTaskPlan, Lon |
| 86 | 86 | rs.put("t", sch); |
| 87 | 87 | return rs; |
| 88 | 88 | } |
| 89 | + | |
| 90 | + @Override | |
| 91 | + public Map<String, Object> saveHistory(ChildTaskPlan t) { | |
| 92 | + Map<String, Object> rs = new HashMap(); | |
| 93 | + try { | |
| 94 | + ScheduleRealInfo sch = t.getSchedule(); | |
| 95 | + //保存起终点名称 | |
| 96 | + String prefix = sch.getXlBm() + "_" + sch.getXlDir() + "_"; | |
| 97 | + if(StringUtils.isEmpty(t.getStartStationName())) | |
| 98 | + t.setStartStationName(BasicData.getStationNameByCode(t.getStartStation(), prefix)); | |
| 99 | + | |
| 100 | + if(StringUtils.isEmpty(t.getEndStationName())) | |
| 101 | + t.setEndStationName(BasicData.getStationNameByCode(t.getEndStation(), prefix)); | |
| 102 | + //先持久化子任务 | |
| 103 | + rs = super.save(t); | |
| 104 | + | |
| 105 | + rs.put("status", ResponseCode.SUCCESS); | |
| 106 | + }catch (Exception e){ | |
| 107 | + logger.error("", e); | |
| 108 | + rs.put("status", ResponseCode.ERROR); | |
| 109 | + rs.put("msg", e.getMessage()); | |
| 110 | + } | |
| 111 | + return rs; | |
| 112 | + } | |
| 113 | + | |
| 114 | + @Override | |
| 115 | + public Map<String, Object> delHistory(Long id) { | |
| 116 | + return super.delete(id); | |
| 117 | + } | |
| 89 | 118 | } | ... | ... |
src/main/java/com/bsth/service/realcontrol/impl/RealMapServiceImpl.java
| ... | ... | @@ -7,6 +7,7 @@ import com.bsth.entity.CarPark; |
| 7 | 7 | import com.bsth.service.realcontrol.RealMapService; |
| 8 | 8 | import com.bsth.service.realcontrol.dto.SectionRouteCoords; |
| 9 | 9 | import com.bsth.util.TransGPS; |
| 10 | +import com.google.common.base.Joiner; | |
| 10 | 11 | import com.google.common.base.Splitter; |
| 11 | 12 | import com.google.common.collect.ArrayListMultimap; |
| 12 | 13 | import com.vividsolutions.jts.geom.*; |
| ... | ... | @@ -262,18 +263,18 @@ public class RealMapServiceImpl implements RealMapService { |
| 262 | 263 | if(len == 0) |
| 263 | 264 | return rs; |
| 264 | 265 | |
| 265 | - StringBuilder joinstr = new StringBuilder(list.get(0)); | |
| 266 | + String joinstr = list.get(0); | |
| 266 | 267 | String str; |
| 267 | 268 | for(int i = 1; i < len; i ++){ |
| 268 | 269 | str = jointCoords(joinstr.toString(), list.get(i)); |
| 269 | 270 | if(str != null) |
| 270 | - joinstr.append("," + str); | |
| 271 | + joinstr = str; | |
| 271 | 272 | else{ |
| 272 | 273 | rs.add(joinstr.toString()); |
| 273 | - joinstr = new StringBuilder(list.get(i)); | |
| 274 | + joinstr = list.get(i); | |
| 274 | 275 | } |
| 275 | 276 | } |
| 276 | - rs.add(joinstr.toString()); | |
| 277 | + rs.add(joinstr); | |
| 277 | 278 | return rs; |
| 278 | 279 | } |
| 279 | 280 | |
| ... | ... | @@ -283,18 +284,57 @@ public class RealMapServiceImpl implements RealMapService { |
| 283 | 284 | LineString s1 = createLineString(c1); |
| 284 | 285 | LineString s2 = createLineString(c2); |
| 285 | 286 | |
| 286 | - if(s1.intersects(s2)){ | |
| 287 | - Geometry g = s1.intersection(s2); | |
| 288 | - Point inPoint = geometryFactory.createPoint(g.getCoordinates()[0]);//第一个交点 | |
| 289 | 287 | |
| 290 | - //第一条线截断至交点 | |
| 291 | - rs = truncationEnd(s1, inPoint); | |
| 292 | - //第二条线从交点开始 | |
| 293 | - rs += ("," + truncationStart(s2, inPoint)); | |
| 288 | + /*if(s1.intersects(s2)){ | |
| 289 | + //2条线相交 | |
| 290 | + Geometry g = s1.intersection(s2); | |
| 291 | + Point inPoint = geometryFactory.createPoint(g.getCoordinates()[0]); | |
| 292 | + //s1 = replacePoint(s1, s1.getCoordinates().length - 1, inPoint); | |
| 293 | + //s2 = replacePoint(s2, 0, inPoint); | |
| 294 | + | |
| 295 | + //rs = toString(s1); | |
| 296 | + //rs += ("," + toString(s2)); | |
| 297 | + rs = replacePoint(c1, s1.getCoordinates().length - 1, inPoint); | |
| 298 | + rs += ("," + replacePoint(c2, 0, null)); | |
| 294 | 299 | } |
| 300 | + else {*/ | |
| 301 | + //距离10米内的点直接连起来 | |
| 302 | + double distance = GeoUtils.getDistanceLineToLine(s1.getStartPoint(), s1.getEndPoint(), s2.getStartPoint(), s2.getEndPoint()); | |
| 303 | + if(distance < 10){ | |
| 304 | + //s2 = replacePoint(s2, 0, s1.getEndPoint()); | |
| 305 | + rs = c1; | |
| 306 | + | |
| 307 | + //获取c1终点到 c2 的垂直交点 | |
| 308 | + //s1.getEndPoint() | |
| 309 | + //rs += ("," + replacePoint(c2, 0, null)); | |
| 310 | + //rs = toString(s1); | |
| 311 | + //rs += ("," + toString(s2)); | |
| 312 | + } | |
| 313 | + //} | |
| 295 | 314 | return rs; |
| 296 | 315 | } |
| 297 | 316 | |
| 317 | + /** | |
| 318 | + * 替换线段中指定的一个点位 | |
| 319 | + * @param index | |
| 320 | + * @param p | |
| 321 | + | |
| 322 | + private LineString replacePoint(LineString line, int index, Point p){ | |
| 323 | + Coordinate[] array = line.getCoordinates(); | |
| 324 | + array[index] = p.getCoordinate(); | |
| 325 | + | |
| 326 | + return geometryFactory.createLineString(array); | |
| 327 | + }*/ | |
| 328 | + | |
| 329 | + private String replacePoint(String lineStr, int index, Point p){ | |
| 330 | + List<String> list = new ArrayList<>(Splitter.on(",").splitToList(lineStr)); | |
| 331 | + list.remove(index); | |
| 332 | + if(p != null){ | |
| 333 | + list.add(index, p.getX() + " " + p.getY()); | |
| 334 | + } | |
| 335 | + return Joiner.on(",").join(list); | |
| 336 | + } | |
| 337 | + | |
| 298 | 338 | private LineString createLineString(String c){ |
| 299 | 339 | List<String> list = Splitter.on(",").splitToList(c); |
| 300 | 340 | |
| ... | ... | @@ -307,7 +347,24 @@ public class RealMapServiceImpl implements RealMapService { |
| 307 | 347 | return geometryFactory.createLineString(cds); |
| 308 | 348 | } |
| 309 | 349 | |
| 310 | - private String truncationEnd(LineString lineString, Point p){ | |
| 350 | + private String toString(LineString line){ | |
| 351 | + Coordinate[] all = line.getCoordinates(); | |
| 352 | + | |
| 353 | + Coordinate[] cs; | |
| 354 | + StringBuilder sb = new StringBuilder(""); | |
| 355 | + for(int i = 0; i < all.length - 1; i ++){ | |
| 356 | + cs = new Coordinate[2]; | |
| 357 | + cs[0] = all[i]; | |
| 358 | + cs[1] = all[i + 1]; | |
| 359 | + | |
| 360 | + sb.append("," + cs[0].y + " " + cs[0].x); | |
| 361 | + sb.append("," + cs[1].y + " " + cs[1].x); | |
| 362 | + } | |
| 363 | + sb.deleteCharAt(0); | |
| 364 | + return sb.toString(); | |
| 365 | + } | |
| 366 | + | |
| 367 | +/* private String truncationEnd(LineString lineString, Point p){ | |
| 311 | 368 | Coordinate[] all = lineString.getCoordinates(); |
| 312 | 369 | LineString sl; |
| 313 | 370 | |
| ... | ... | @@ -359,5 +416,5 @@ public class RealMapServiceImpl implements RealMapService { |
| 359 | 416 | } |
| 360 | 417 | sb.deleteCharAt(0); |
| 361 | 418 | return sb.toString(); |
| 362 | - } | |
| 419 | + }*/ | |
| 363 | 420 | } | ... | ... |
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
| ... | ... | @@ -49,7 +49,6 @@ import com.bsth.service.sys.DutyEmployeeService; |
| 49 | 49 | import com.bsth.util.*; |
| 50 | 50 | import com.bsth.websocket.handler.SendUtils; |
| 51 | 51 | import com.google.common.base.Splitter; |
| 52 | -import com.google.common.collect.BiMap; | |
| 53 | 52 | import com.google.common.collect.Lists; |
| 54 | 53 | import org.apache.commons.lang3.StringEscapeUtils; |
| 55 | 54 | import org.apache.commons.lang3.StringUtils; |
| ... | ... | @@ -135,9 +134,50 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 135 | 134 | Logger logger = LoggerFactory.getLogger(this.getClass()); |
| 136 | 135 | |
| 137 | 136 | SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), |
| 138 | - sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm"), sdfShort = new SimpleDateFormat("HH:mm"), | |
| 139 | 137 | sdfSimple = new SimpleDateFormat("yyyyMMdd"); |
| 140 | 138 | |
| 139 | + | |
| 140 | + /** | |
| 141 | + * 车辆是否存在 | |
| 142 | + * @param gsbm 公司编码 | |
| 143 | + * @param nbbm 车辆自编号 | |
| 144 | + * @return | |
| 145 | + */ | |
| 146 | + private boolean carExist(String gsbm, String nbbm){ | |
| 147 | + return BasicData.deviceId2NbbmMap.inverse().containsKey(nbbm); | |
| 148 | + } | |
| 149 | + | |
| 150 | + /** | |
| 151 | + * 获取人员姓名 | |
| 152 | + * @param gsbm 公司编码 | |
| 153 | + * @param gh 人员工号 | |
| 154 | + * @return | |
| 155 | + */ | |
| 156 | + private String getPersonName(String gsbm, String gh){ | |
| 157 | + return BasicData.allPerson.get(gsbm + '-' + gh); | |
| 158 | + } | |
| 159 | + | |
| 160 | + @Override | |
| 161 | + public Iterable<ScheduleRealInfo> list(Map<String, Object> map) { | |
| 162 | + Iterator<ScheduleRealInfo> iterator = super.list(map).iterator(); | |
| 163 | + Set<ScheduleRealInfo> set = new HashSet<>(100); | |
| 164 | + | |
| 165 | + DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm"); | |
| 166 | + //计算时间戳 | |
| 167 | + ScheduleRealInfo sch; | |
| 168 | + while(iterator.hasNext()){ | |
| 169 | + sch = iterator.next(); | |
| 170 | + //待发时间戳 | |
| 171 | + sch.setDfsjT(fmtyyyyMMddHHmm.parseMillis(sch.getRealExecDate() + sch.getDfsj())); | |
| 172 | + //实发时间戳 | |
| 173 | + if(StringUtils.isNotEmpty(sch.getFcsjActual())){ | |
| 174 | + sch.setFcsjActualTime(fmtyyyyMMddHHmm.parseMillis(sch.getRealExecDate() + sch.getFcsjActual())); | |
| 175 | + } | |
| 176 | + set.add(sch); | |
| 177 | + } | |
| 178 | + return set; | |
| 179 | + } | |
| 180 | + | |
| 141 | 181 | @Override |
| 142 | 182 | public Map<String, Collection<ScheduleRealInfo>> findByLines(String lines) { |
| 143 | 183 | List<String> lineList = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().split(lines)); |
| ... | ... | @@ -315,6 +355,97 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 315 | 355 | return rsList; |
| 316 | 356 | } |
| 317 | 357 | |
| 358 | + /** | |
| 359 | + * 添加到历史库 | |
| 360 | + * @param t | |
| 361 | + * @return | |
| 362 | + */ | |
| 363 | + @Override | |
| 364 | + public Map<String, Object> addToHistory(ScheduleRealInfo t) { | |
| 365 | + Map<String, Object> rs = new HashMap<>(); | |
| 366 | + try { | |
| 367 | + if (!carExist(t.getGsBm(), t.getClZbh())) { | |
| 368 | + rs.put("msg", "车辆 " + t.getClZbh() + " <a href=\"/#/busInfoManage\" target=_blank>车辆基础信息</a> 里找不到!"); | |
| 369 | + rs.put("status", ResponseCode.ERROR); | |
| 370 | + return rs; | |
| 371 | + } | |
| 372 | + | |
| 373 | + SysUser user = SecurityUtils.getCurrentUser(); | |
| 374 | + //String schDate = DayOfSchedule.currSchDateMap.get(t.getXlBm()); | |
| 375 | + | |
| 376 | + SimpleDateFormat sdfyyyyMMdd = new SimpleDateFormat("yyyy-MM-dd"), sdfyyyyMMddHHmm = new SimpleDateFormat("yyyy-MM-ddHH:mm"); | |
| 377 | + | |
| 378 | + if (StringUtils.isEmpty(t.getjGh())) { | |
| 379 | + rs.put("status", ResponseCode.ERROR); | |
| 380 | + rs.put("msg", "驾驶员工号不能为空!"); | |
| 381 | + return rs; | |
| 382 | + } | |
| 383 | + //截取驾驶员工号 | |
| 384 | + if (t.getjGh().indexOf("-") != -1) { | |
| 385 | + t.setjGh(t.getjGh().split("-")[1]); | |
| 386 | + } | |
| 387 | + //检查驾驶员工号 | |
| 388 | + String jName = getPersonName(t.getGsBm() ,t.getjGh()); | |
| 389 | + if(StringUtils.isEmpty(jName)){ | |
| 390 | + rs.put("msg", t.getXlName() + "所属的公司编码下找不到工号为【" + t.getjGh() + "】的驾驶员"); | |
| 391 | + rs.put("status", ResponseCode.ERROR); | |
| 392 | + return rs; | |
| 393 | + } | |
| 394 | + else if(StringUtils.isEmpty(t.getjName())){ | |
| 395 | + t.setjName(jName);//补上驾驶员名称 | |
| 396 | + } | |
| 397 | + | |
| 398 | + //有售票员 | |
| 399 | + if(StringUtils.isNotEmpty(t.getsGh())){ | |
| 400 | + String sName = getPersonName(t.getGsBm() , t.getsGh()); | |
| 401 | + if(StringUtils.isEmpty(sName)){ | |
| 402 | + rs.put("msg", t.getXlName() + "所属的公司编码下找不到工号为【" + t.getjGh() + "】的售票员"); | |
| 403 | + rs.put("status", ResponseCode.ERROR); | |
| 404 | + return rs; | |
| 405 | + }else if(StringUtils.isEmpty(t.getsName())){ | |
| 406 | + t.setsName(sName);//补上售票员名称 | |
| 407 | + } | |
| 408 | + } | |
| 409 | + | |
| 410 | + //公司 和 分公司名称 | |
| 411 | + t.setGsName(BasicData.businessCodeNameMap.get(t.getGsBm())); | |
| 412 | + t.setFgsName(BasicData.businessFgsCodeNameMap.get(t.getGsBm() + "_" + t.getFgsBm())); | |
| 413 | + | |
| 414 | + //t.setScheduleDateStr(schDate); | |
| 415 | + t.setScheduleDate(sdfyyyyMMdd.parse(t.getScheduleDateStr())); | |
| 416 | + t.setRealExecDate(t.getScheduleDateStr()); | |
| 417 | + t.setCreateBy(user); | |
| 418 | + t.setSflj(true); | |
| 419 | + t.setLate(false); | |
| 420 | + t.setDfsj(t.getFcsj()); | |
| 421 | + t.setZdsjT(sdfyyyyMMddHHmm.parse(t.getScheduleDateStr() + t.getZdsj()).getTime()); | |
| 422 | + t.setJhlcOrig(t.getJhlc()); | |
| 423 | + | |
| 424 | + //班次历时 | |
| 425 | + t.setBcsj(DateUtils.calcHHmmDiff(t.getFcsj(), t.getZdsj()) / 1000 / 60); | |
| 426 | + | |
| 427 | + //起终点名称 | |
| 428 | + String prefix = t.getXlBm() + "_" + t.getXlDir() + "_"; | |
| 429 | + t.setQdzName(BasicData.getStationNameByCode(t.getQdzCode(), prefix)); | |
| 430 | + t.setZdzName(BasicData.getStationNameByCode(t.getZdzCode(), prefix)); | |
| 431 | + | |
| 432 | + //计算班次实际执行时间 | |
| 433 | + schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t); | |
| 434 | + if (t.getZdsjT() < t.getFcsjT()) { | |
| 435 | + rs.put("status", ResponseCode.ERROR); | |
| 436 | + rs.put("msg", "起终点时间异常!"); | |
| 437 | + return rs; | |
| 438 | + } | |
| 439 | + | |
| 440 | + //实时入库 | |
| 441 | + rs = super.save(t); | |
| 442 | + } catch (Exception e) { | |
| 443 | + logger.error("", e); | |
| 444 | + rs.put("status", ResponseCode.ERROR); | |
| 445 | + } | |
| 446 | + return rs; | |
| 447 | + } | |
| 448 | + | |
| 318 | 449 | |
| 319 | 450 | /** |
| 320 | 451 | * 临加班次 |
| ... | ... | @@ -323,7 +454,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 323 | 454 | public Map<String, Object> save(ScheduleRealInfo t) { |
| 324 | 455 | Map<String, Object> rs = new HashMap<>(); |
| 325 | 456 | try { |
| 326 | - if (BasicData.deviceId2NbbmMap.inverse().get(t.getClZbh()) == null) { | |
| 457 | + if (!carExist(t.getGsBm(), t.getClZbh())) { | |
| 327 | 458 | rs.put("msg", "车辆 " + t.getClZbh() + " <a href=\"/#/busInfoManage\" target=_blank>车辆基础信息</a> 里找不到!"); |
| 328 | 459 | rs.put("status", ResponseCode.ERROR); |
| 329 | 460 | return rs; |
| ... | ... | @@ -344,7 +475,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 344 | 475 | t.setjGh(t.getjGh().split("-")[1]); |
| 345 | 476 | } |
| 346 | 477 | //检查驾驶员工号 |
| 347 | - String jName = BasicData.allPerson.get(t.getGsBm() + '-' + t.getjGh()); | |
| 478 | + String jName = getPersonName(t.getGsBm() ,t.getjGh()); | |
| 348 | 479 | if(StringUtils.isEmpty(jName)){ |
| 349 | 480 | rs.put("msg", t.getXlName() + "所属的公司编码下找不到工号为【" + t.getjGh() + "】的驾驶员"); |
| 350 | 481 | rs.put("status", ResponseCode.ERROR); |
| ... | ... | @@ -356,7 +487,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 356 | 487 | |
| 357 | 488 | //有售票员 |
| 358 | 489 | if(StringUtils.isNotEmpty(t.getsGh())){ |
| 359 | - String sName = BasicData.allPerson.get(t.getGsBm() + '-' + t.getsGh()); | |
| 490 | + String sName = getPersonName(t.getGsBm() , t.getsGh()); | |
| 360 | 491 | if(StringUtils.isEmpty(sName)){ |
| 361 | 492 | rs.put("msg", t.getXlName() + "所属的公司编码下找不到工号为【" + t.getjGh() + "】的售票员"); |
| 362 | 493 | rs.put("status", ResponseCode.ERROR); |
| ... | ... | @@ -409,7 +540,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 409 | 540 | dayOfSchedule.reCalcExecPlan(t.getClZbh()); |
| 410 | 541 | |
| 411 | 542 | |
| 412 | - rs.put("ts", ts); | |
| 543 | + rs.put("ts", ts); | |
| 413 | 544 | rs.put("t", t); |
| 414 | 545 | } catch (Exception e) { |
| 415 | 546 | logger.error("", e); |
| ... | ... | @@ -418,6 +549,41 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 418 | 549 | return rs; |
| 419 | 550 | } |
| 420 | 551 | |
| 552 | + /** | |
| 553 | + * 删除历史表临加班次 | |
| 554 | + * @param id | |
| 555 | + * @return | |
| 556 | + */ | |
| 557 | + @Override | |
| 558 | + public Map<String, Object> deleteToHistory(Long id) { | |
| 559 | + Map<String, Object> rs = new HashMap<>(); | |
| 560 | + rs.put("status", ResponseCode.ERROR); | |
| 561 | + | |
| 562 | + try { | |
| 563 | + ScheduleRealInfo sch = super.findById(id); | |
| 564 | + if (sch == null) { | |
| 565 | + rs.put("msg", "无效的id号"); | |
| 566 | + return rs; | |
| 567 | + } | |
| 568 | + | |
| 569 | + if (!sch.isSflj()) { | |
| 570 | + rs.put("msg", "你只能删除临加班次"); | |
| 571 | + return rs; | |
| 572 | + } | |
| 573 | + | |
| 574 | + //解除和调度指令的外键约束 | |
| 575 | + jdbcTemplate.update(Constants.REMOVE_DIRECTIVE_SCH_FK, id); | |
| 576 | + | |
| 577 | + //数据库删除 | |
| 578 | + rs = super.delete(id); | |
| 579 | + }catch (Exception e){ | |
| 580 | + logger.error("", e); | |
| 581 | + rs.put("msg", e.getMessage()); | |
| 582 | + } | |
| 583 | + | |
| 584 | + return rs; | |
| 585 | + } | |
| 586 | + | |
| 421 | 587 | @Override |
| 422 | 588 | public Map<String, Object> delete(Long id) { |
| 423 | 589 | Map<String, Object> rs = new HashMap<>(); |
| ... | ... | @@ -999,7 +1165,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 999 | 1165 | String clZbh = map.get("clZbh"); |
| 1000 | 1166 | if (StringUtils.isNotEmpty(clZbh)) { |
| 1001 | 1167 | //换车 |
| 1002 | - if (!BasicData.deviceId2NbbmMap.inverse().containsKey(clZbh)) { | |
| 1168 | + if (!carExist(sch.getGsBm(), clZbh)) { | |
| 1003 | 1169 | rs.put("status", ResponseCode.ERROR); |
| 1004 | 1170 | rs.put("msg", "车辆 " + clZbh + " 不存在!"); |
| 1005 | 1171 | return rs; |
| ... | ... | @@ -1013,7 +1179,14 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 1013 | 1179 | */ |
| 1014 | 1180 | String jsy = map.get("jsy"); |
| 1015 | 1181 | if (StringUtils.isNotEmpty(jsy) && jsy.indexOf("/") != -1) { |
| 1016 | - persoChange(sch, jsy.split("/")[0]); | |
| 1182 | + String jGh = jsy.split("/")[0]; | |
| 1183 | + String jName = getPersonName(sch.getGsBm(), jGh); | |
| 1184 | + if(StringUtils.isEmpty(jName)){ | |
| 1185 | + rs.put("msg", sch.getXlName() + "所属的公司编码下找不到工号为【" + jGh + "】的驾驶员"); | |
| 1186 | + rs.put("status", ResponseCode.ERROR); | |
| 1187 | + return rs; | |
| 1188 | + } | |
| 1189 | + persoChange(sch, jGh); | |
| 1017 | 1190 | } |
| 1018 | 1191 | |
| 1019 | 1192 | /** |
| ... | ... | @@ -1021,7 +1194,14 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 1021 | 1194 | */ |
| 1022 | 1195 | String spy = map.get("spy"); |
| 1023 | 1196 | if (StringUtils.isNotEmpty(spy) && spy.indexOf("/") != -1 && !spy.equals("/")) { |
| 1024 | - persoChangeSPY(sch, spy.split("/")[0]); | |
| 1197 | + String sGh = spy.split("/")[0]; | |
| 1198 | + String sName = getPersonName(sch.getGsBm(), sGh); | |
| 1199 | + if(StringUtils.isEmpty(sName)){ | |
| 1200 | + rs.put("msg", sch.getXlName() + "所属的公司编码下找不到工号为【" + sGh + "】的售票员"); | |
| 1201 | + rs.put("status", ResponseCode.ERROR); | |
| 1202 | + return rs; | |
| 1203 | + } | |
| 1204 | + persoChangeSPY(sch, sGh); | |
| 1025 | 1205 | } |
| 1026 | 1206 | else{ |
| 1027 | 1207 | sch.setsGh(""); |
| ... | ... | @@ -2852,23 +3032,25 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 2852 | 3032 | Set<ScheduleRealInfo> set = new HashSet<>(); |
| 2853 | 3033 | |
| 2854 | 3034 | ScheduleRealInfo sch; |
| 2855 | - BiMap<String, String> map = BasicData.deviceId2NbbmMap.inverse(); | |
| 3035 | + //BiMap<String, String> map = BasicData.deviceId2NbbmMap.inverse(); | |
| 2856 | 3036 | |
| 3037 | + String jGh,jName,sGh,sName; | |
| 2857 | 3038 | for (ChangePersonCar cpc : cpcs) { |
| 2858 | 3039 | |
| 2859 | - if (cpc.getClZbh() != null && map.get(cpc.getClZbh()) == null) { | |
| 3040 | + sch = dayOfSchedule.get(cpc.getSchId()); | |
| 3041 | + if (sch == null) | |
| 3042 | + continue; | |
| 3043 | + | |
| 3044 | + if (cpc.getClZbh() != null && !carExist(sch.getGsBm(), cpc.getClZbh())) { | |
| 2860 | 3045 | rs.put("msg", "车辆 " + cpc.getClZbh() + " <a href=\"/#/busInfoManage\" target=_blank>车辆基础信息</a> 里找不到!"); |
| 2861 | 3046 | rs.put("status", ResponseCode.ERROR); |
| 2862 | 3047 | return rs; |
| 2863 | 3048 | } |
| 2864 | 3049 | |
| 2865 | - sch = dayOfSchedule.get(cpc.getSchId()); | |
| 2866 | - if (sch == null) | |
| 2867 | - continue; | |
| 2868 | - | |
| 2869 | 3050 | if (StringUtils.isNotEmpty(cpc.getJsy())) { |
| 2870 | - String jGh = cpc.getJsy().split("/")[0]; | |
| 2871 | - if(!BasicData.allPerson.containsKey(sch.getGsBm()+"-"+jGh)){ | |
| 3051 | + jGh = cpc.getJsy().split("/")[0]; | |
| 3052 | + jName = getPersonName(sch.getGsBm(), jGh); | |
| 3053 | + if(StringUtils.isEmpty(jName)){ | |
| 2872 | 3054 | rs.put("msg", sch.getXlName() + "所属的公司编码下找不到工号为【" + jGh + "】的驾驶员"); |
| 2873 | 3055 | rs.put("status", ResponseCode.ERROR); |
| 2874 | 3056 | return rs; |
| ... | ... | @@ -2880,9 +3062,20 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 2880 | 3062 | |
| 2881 | 3063 | //换售票员 |
| 2882 | 3064 | if (StringUtils.isNotEmpty(cpc.getSpy())) { |
| 2883 | - persoChangeSPY(sch, cpc.getSpy().split("/")[0]); | |
| 3065 | + sGh = cpc.getSpy().split("/")[0]; | |
| 3066 | + sName = getPersonName(sch.getGsBm(), sGh); | |
| 3067 | + if(StringUtils.isEmpty(sName)){ | |
| 3068 | + rs.put("msg", sch.getXlName() + "所属的公司编码下找不到工号为【" + sGh + "】的售票员"); | |
| 3069 | + rs.put("status", ResponseCode.ERROR); | |
| 3070 | + return rs; | |
| 3071 | + } | |
| 3072 | + persoChangeSPY(sch, sGh); | |
| 2884 | 3073 | set.add(sch); |
| 2885 | 3074 | } |
| 3075 | + else if(StringUtils.isNotEmpty(sch.getsGh())){ | |
| 3076 | + sch.setsGh(""); | |
| 3077 | + sch.setsName(""); | |
| 3078 | + } | |
| 2886 | 3079 | |
| 2887 | 3080 | //换车 |
| 2888 | 3081 | if (StringUtils.isNotEmpty(cpc.getClZbh())) { |
| ... | ... | @@ -2905,7 +3098,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 2905 | 3098 | public void persoChange(ScheduleRealInfo sch, String jGh) { |
| 2906 | 3099 | if (sch.getjGh().equals(jGh)) |
| 2907 | 3100 | return; |
| 2908 | - String jName = BasicData.allPerson.get(sch.getGsBm() + "-"+ jGh); | |
| 3101 | + String jName = getPersonName(sch.getGsBm() , jGh); | |
| 2909 | 3102 | if (StringUtils.isNotEmpty(jName)) { |
| 2910 | 3103 | |
| 2911 | 3104 | if (jGh.indexOf("-") != -1) |
| ... | ... | @@ -2924,7 +3117,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 2924 | 3117 | public void persoChangeSPY(ScheduleRealInfo sch, String sGh) { |
| 2925 | 3118 | if (sch.getsGh().equals(sGh)) |
| 2926 | 3119 | return; |
| 2927 | - String sName = BasicData.allPerson.get(sGh); | |
| 3120 | + String sName = getPersonName(sch.getGsBm() , sGh); | |
| 2928 | 3121 | if (StringUtils.isNotEmpty(sName)) { |
| 2929 | 3122 | if (sGh.indexOf("-") != -1) |
| 2930 | 3123 | sch.setsGh(sGh.substring(sGh.indexOf("-") + 1)); |
| ... | ... | @@ -3051,31 +3244,69 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 3051 | 3244 | return rs; |
| 3052 | 3245 | } |
| 3053 | 3246 | |
| 3054 | - /* @Override | |
| 3247 | + @Override | |
| 3055 | 3248 | public Map<String, Object> historySave(ScheduleRealInfo sch) { |
| 3056 | 3249 | Map<String, Object> rs = new HashMap<>(); |
| 3057 | 3250 | rs.put("status", ResponseCode.ERROR); |
| 3058 | 3251 | |
| 3059 | 3252 | ScheduleRealInfo oldSch = super.findById(sch.getId()); |
| 3060 | - //修改车辆 | |
| 3061 | - if (!oldSch.getClZbh().equals(sch.getClZbh())) { | |
| 3062 | - Set<String> allCar = BasicData.deviceId2NbbmMap.values(); | |
| 3063 | - if (!allCar.contains(sch.getClZbh())) { | |
| 3064 | - rs.put("msg", "无效的车辆自编号"); | |
| 3253 | + | |
| 3254 | + //换车 | |
| 3255 | + if (StringUtils.isNotEmpty(sch.getClZbh()) && !oldSch.getClZbh().equals(sch.getClZbh())) { | |
| 3256 | + if (!carExist(oldSch.getGsBm(),sch.getClZbh())) { | |
| 3257 | + rs.put("msg", "车辆 " + sch.getClZbh() + " 不存在!"); | |
| 3065 | 3258 | return rs; |
| 3066 | 3259 | } else |
| 3067 | 3260 | oldSch.setClZbh(sch.getClZbh()); |
| 3068 | 3261 | } |
| 3069 | 3262 | |
| 3070 | - //修改驾驶员 | |
| 3071 | - if (!oldSch.getjGh().equals(sch.getjGh())) { | |
| 3072 | - Map<String, String> allPer = BasicData.allPerson; | |
| 3073 | - if (!allPer.containsKey(sch.getjGh())) { | |
| 3074 | - rs.put("msg", "无效的驾驶员"); | |
| 3263 | + //换驾驶员 | |
| 3264 | + if (StringUtils.isNotEmpty(sch.getjGh()) && !oldSch.getjGh().equals(sch.getjGh())) { | |
| 3265 | + String jName = getPersonName(oldSch.getGsBm(), sch.getjGh()); | |
| 3266 | + if(StringUtils.isEmpty(jName)){ | |
| 3267 | + rs.put("msg", oldSch.getXlName() + "所属的公司编码下找不到工号为【" + sch.getjGh() + "】的驾驶员"); | |
| 3075 | 3268 | return rs; |
| 3076 | - } else { | |
| 3077 | - oldSch.setjGh(sch.getjGh()); | |
| 3078 | - oldSch.setjName(allPer.get(oldSch.getjGh())); | |
| 3269 | + } | |
| 3270 | + persoChange(oldSch, sch.getjGh()); | |
| 3271 | + } | |
| 3272 | + | |
| 3273 | + //换售票员 | |
| 3274 | + if (StringUtils.isNotEmpty(sch.getsGh()) && !oldSch.getsGh().equals(sch.getsGh())) { | |
| 3275 | + String sName = getPersonName(oldSch.getGsBm(), sch.getsGh()); | |
| 3276 | + if(StringUtils.isEmpty(sName)){ | |
| 3277 | + rs.put("msg", sch.getXlName() + "所属的公司编码下找不到工号为【" + sch.getsGh() + "】的售票员"); | |
| 3278 | + return rs; | |
| 3279 | + } | |
| 3280 | + persoChangeSPY(oldSch, sch.getsGh()); | |
| 3281 | + } | |
| 3282 | + | |
| 3283 | + //烂班 | |
| 3284 | + boolean dest1 = oldSch.getStatus() == -1; | |
| 3285 | + boolean dest2 = sch.getStatus() == -1; | |
| 3286 | + if (!dest1 && dest2) { | |
| 3287 | + oldSch.destroy(); | |
| 3288 | + } | |
| 3289 | + else if(dest1 && !dest2){ | |
| 3290 | + //撤销烂班 | |
| 3291 | + oldSch.setJhlc(oldSch.getJhlcOrig()); | |
| 3292 | + oldSch.setStatus(0); | |
| 3293 | + oldSch.calcStatus(); | |
| 3294 | + } | |
| 3295 | + | |
| 3296 | + | |
| 3297 | + /** | |
| 3298 | + * 修改班次里程 | |
| 3299 | + */ | |
| 3300 | + if (!oldSch.getJhlc().equals(sch.getJhlc())) { | |
| 3301 | + double jhlcNum = sch.getJhlc(); | |
| 3302 | + //烂班 | |
| 3303 | + if(jhlcNum == 0 && oldSch.getJhlcOrig() != 0) | |
| 3304 | + oldSch.destroy(); | |
| 3305 | + else { | |
| 3306 | + oldSch.setJhlc(jhlcNum); | |
| 3307 | + //临加班次,实际计划一起改 | |
| 3308 | + if(oldSch.isSflj()) | |
| 3309 | + oldSch.setJhlcOrig(jhlcNum); | |
| 3079 | 3310 | } |
| 3080 | 3311 | } |
| 3081 | 3312 | |
| ... | ... | @@ -3091,7 +3322,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl<ScheduleRealInf |
| 3091 | 3322 | scheduleRealInfoRepository.save(oldSch); |
| 3092 | 3323 | rs.put("status", ResponseCode.SUCCESS); |
| 3093 | 3324 | return rs; |
| 3094 | - }*/ | |
| 3325 | + } | |
| 3095 | 3326 | |
| 3096 | 3327 | @Autowired |
| 3097 | 3328 | SvgAttributeRepository svgAttributeRepository; | ... | ... |
src/main/java/com/bsth/websocket/handler/RealControlSocketHandler.java
| ... | ... | @@ -47,7 +47,7 @@ public class RealControlSocketHandler implements WebSocketHandler { |
| 47 | 47 | listenMap.remove(k, remMap.get(k)); |
| 48 | 48 | logger.info("web socket close, remove listen K: "+ k); |
| 49 | 49 | } |
| 50 | - logger.info("listen values size: " + listenMap.values().size()); | |
| 50 | + logger.info("listen values size: " + listenMap.values().size() + " -CloseStatus:" + arg1); | |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | @Override | ... | ... |
src/main/resources/logback.xml
| ... | ... | @@ -161,7 +161,7 @@ |
| 161 | 161 | class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| 162 | 162 | <file>${LOG_BASE}/gps/count.log</file> |
| 163 | 163 | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| 164 | - <fileNamePattern>${LOG_BASE}/gps_count/gateway-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | |
| 164 | + <fileNamePattern>${LOG_BASE}/gps/count-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | |
| 165 | 165 | <timeBasedFileNamingAndTriggeringPolicy |
| 166 | 166 | class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
| 167 | 167 | <maxFileSize>100MB</maxFileSize> | ... | ... |
src/main/resources/static/real_control_v2/css/north.css
| ... | ... | @@ -140,39 +140,53 @@ |
| 140 | 140 | } |
| 141 | 141 | |
| 142 | 142 | .history-sch-table dl dt:nth-of-type(1), .history-sch-table dl dd:nth-of-type(1) { |
| 143 | - width: 10%; | |
| 143 | + width: 4%; | |
| 144 | +} | |
| 145 | +.history-sch-table dl dd:nth-of-type(1){ | |
| 146 | + background: #eae8e8; | |
| 147 | + border-right: 1px solid #b3b3b3; | |
| 148 | + text-align: center; | |
| 149 | + text-indent: -3px; | |
| 150 | + color: #000; | |
| 144 | 151 | } |
| 145 | - | |
| 146 | 152 | .history-sch-table dl dt:nth-of-type(2), .history-sch-table dl dd:nth-of-type(2) { |
| 147 | - width: 12%; | |
| 153 | + width: 5%; | |
| 148 | 154 | } |
| 149 | 155 | |
| 150 | 156 | .history-sch-table dl dt:nth-of-type(3), .history-sch-table dl dd:nth-of-type(3) { |
| 151 | - width: 14%; | |
| 157 | + width: 9%; | |
| 152 | 158 | } |
| 153 | 159 | |
| 154 | 160 | .history-sch-table dl dt:nth-of-type(4), .history-sch-table dl dd:nth-of-type(4) { |
| 155 | - width: 14%; | |
| 161 | + width: 12%; | |
| 156 | 162 | } |
| 157 | 163 | |
| 158 | 164 | .history-sch-table dl dt:nth-of-type(5), .history-sch-table dl dd:nth-of-type(5) { |
| 159 | - width: 12%; | |
| 165 | + width: 13%; | |
| 160 | 166 | } |
| 161 | 167 | |
| 162 | 168 | .history-sch-table dl dt:nth-of-type(6), .history-sch-table dl dd:nth-of-type(6) { |
| 163 | - width: 10%; | |
| 169 | + width: 13%; | |
| 164 | 170 | } |
| 165 | 171 | |
| 166 | 172 | .history-sch-table dl dt:nth-of-type(7), .history-sch-table dl dd:nth-of-type(7) { |
| 167 | - width: 12%; | |
| 173 | + width: 11%; | |
| 168 | 174 | } |
| 169 | 175 | |
| 170 | 176 | .history-sch-table dl dt:nth-of-type(8), .history-sch-table dl dd:nth-of-type(8) { |
| 171 | - width: 10%; | |
| 177 | + width: 8%; | |
| 172 | 178 | } |
| 173 | 179 | |
| 174 | 180 | .history-sch-table dl dt:nth-of-type(9), .history-sch-table dl dd:nth-of-type(9) { |
| 175 | - width: 6%; | |
| 181 | + width: 10%; | |
| 182 | +} | |
| 183 | + | |
| 184 | +.history-sch-table dl dt:nth-of-type(10), .history-sch-table dl dd:nth-of-type(10) { | |
| 185 | + width: 8%; | |
| 186 | +} | |
| 187 | + | |
| 188 | +.history-sch-table dl dt:nth-of-type(11), .history-sch-table dl dd:nth-of-type(11) { | |
| 189 | + width: 7%; | |
| 176 | 190 | } |
| 177 | 191 | |
| 178 | 192 | #history-sch-maintain-modal ul.h-s-time, | ... | ... |
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/add_temp_sch.html
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/lj_zrw.html
| ... | ... | @@ -394,7 +394,7 @@ |
| 394 | 394 | return notify_err('无法获取到主任务信息!'); |
| 395 | 395 | |
| 396 | 396 | if(sch.bcType == 'out' || sch.bcType == 'in'){ |
| 397 | - notify_err('暂不能在进出场班次上做加油子任务!'); | |
| 397 | + notify_err('暂不能在进出场班次上执行该操作!'); | |
| 398 | 398 | return; |
| 399 | 399 | } |
| 400 | 400 | open_modal(folder + '/sub_task/add_sub_task_oil.html', { | ... | ... |
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task/add_sub_task_oil.html
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/edit.html
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/editor.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal ct_move_modal" id="history-sch-edit-modal"> | |
| 2 | + <div class="uk-modal-dialog" style="width: 900px;"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>历史路单编辑</h2></div> | |
| 6 | + <form class="uk-form uk-form-horizontal sch_form"> | |
| 7 | + </form> | |
| 8 | + | |
| 9 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary" style="padding-bottom: 0;"> | |
| 10 | + <h3 class="uk-panel-title" id="childTaskTitle"> | |
| 11 | + 子任务列表 | |
| 12 | + <a id="addChildTaskBtn" data-uk-tooltip title="添加子任务"><i | |
| 13 | + class="uk-icon-plus"></i> </a> | |
| 14 | + </h3> | |
| 15 | + <div class="ct_table_wrap ct_table_no_border sub_task_table_wrap" style="height: 142px;"> | |
| 16 | + <div class="ct_table sub-task-table"> | |
| 17 | + <div class="ct_table_head"> | |
| 18 | + <dl> | |
| 19 | + <dt>序号</dt> | |
| 20 | + <dt>类型</dt> | |
| 21 | + <dt>起点</dt> | |
| 22 | + <dt>终点</dt> | |
| 23 | + <dt>开始时间</dt> | |
| 24 | + <dt>结束时间</dt> | |
| 25 | + <dt>里程</dt> | |
| 26 | + <dt>备注</dt> | |
| 27 | + </dl> | |
| 28 | + </div> | |
| 29 | + <div class="ct_table_body"> | |
| 30 | + </div> | |
| 31 | + </div> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + </div> | |
| 35 | + | |
| 36 | + <script id="history-sch-edit-form-temp" type="text/html"> | |
| 37 | + <input type="hidden" name="id" value="{{id}}"/> | |
| 38 | + | |
| 39 | + <div class="uk-grid"> | |
| 40 | + <div class="uk-width-1-3"> | |
| 41 | + <div class="uk-form-row"> | |
| 42 | + <label class="uk-form-label" >班次类型</label> | |
| 43 | + <div class="uk-form-controls"> | |
| 44 | + <select class="form-control nt-dictionary" data-code="{{bcType}}" name="bcType" data-group=ScheduleType></select> | |
| 45 | + </div> | |
| 46 | + </div> | |
| 47 | + </div> | |
| 48 | + <div class="uk-width-1-3"> | |
| 49 | + <div class="uk-form-row"> | |
| 50 | + <label class="uk-form-label" >起点</label> | |
| 51 | + <div class="uk-form-controls"> | |
| 52 | + <select type="text" name="qdzCode" ></select> | |
| 53 | + </div> | |
| 54 | + </div> | |
| 55 | + </div> | |
| 56 | + <div class="uk-width-1-3"> | |
| 57 | + <div class="uk-form-row"> | |
| 58 | + <label class="uk-form-label" >终点</label> | |
| 59 | + <div class="uk-form-controls"> | |
| 60 | + <select type="text" name="zdzCode" ></select> | |
| 61 | + </div> | |
| 62 | + </div> | |
| 63 | + </div> | |
| 64 | + </div> | |
| 65 | + | |
| 66 | + <div class="uk-grid"> | |
| 67 | + <div class="uk-width-1-3"> | |
| 68 | + <div class="uk-form-row"> | |
| 69 | + <label class="uk-form-label" >车辆</label> | |
| 70 | + <div class="uk-form-controls"> | |
| 71 | + <div class="uk-autocomplete uk-form car-autocom"> | |
| 72 | + <input type="text" value="{{clZbh}}" name="clZbh" required> | |
| 73 | + </div> | |
| 74 | + </div> | |
| 75 | + </div> | |
| 76 | + </div> | |
| 77 | + <div class="uk-width-1-3"> | |
| 78 | + <div class="uk-form-row"> | |
| 79 | + <label class="uk-form-label" >驾驶员</label> | |
| 80 | + <div class="uk-form-controls"> | |
| 81 | + <div class="uk-autocomplete uk-form jsy-autocom"> | |
| 82 | + <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> | |
| 83 | + </div> | |
| 84 | + </div> | |
| 85 | + </div> | |
| 86 | + </div> | |
| 87 | + <div class="uk-width-1-3"> | |
| 88 | + <div class="uk-form-row"> | |
| 89 | + <label class="uk-form-label" >售票员</label> | |
| 90 | + <div class="uk-form-controls"> | |
| 91 | + <div class="uk-autocomplete uk-form spy-autocom"> | |
| 92 | + <input type="text" value="{{sGh}}/{{sName}}" name="spy"> | |
| 93 | + </div> | |
| 94 | + </div> | |
| 95 | + </div> | |
| 96 | + </div> | |
| 97 | + </div> | |
| 98 | + | |
| 99 | + <div class="uk-grid"> | |
| 100 | + <div class="uk-width-1-3"> | |
| 101 | + <div class="uk-form-row"> | |
| 102 | + <label class="uk-form-label" >计发</label> | |
| 103 | + <div class="uk-form-controls"> | |
| 104 | + <input type="time" value="{{fcsj}}" disabled> | |
| 105 | + </div> | |
| 106 | + </div> | |
| 107 | + </div> | |
| 108 | + <div class="uk-width-1-3"> | |
| 109 | + <div class="uk-form-row"> | |
| 110 | + <label class="uk-form-label" >待发</label> | |
| 111 | + <div class="uk-form-controls"> | |
| 112 | + <input type="time" name="dfsj" value="{{dfsj}}" required> | |
| 113 | + </div> | |
| 114 | + </div> | |
| 115 | + </div> | |
| 116 | + <div class="uk-width-1-3"> | |
| 117 | + <div class="uk-form-row"> | |
| 118 | + <label class="uk-form-label" >实发</label> | |
| 119 | + <div class="uk-form-controls"> | |
| 120 | + <input type="time" name="fcsjActual" value="{{fcsjActual}}" > | |
| 121 | + </div> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + <div class="uk-grid"> | |
| 127 | + <div class="uk-width-1-3"> | |
| 128 | + <div class="uk-form-row"> | |
| 129 | + <label class="uk-form-label" >里程</label> | |
| 130 | + <div class="uk-form-controls"> | |
| 131 | + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" | |
| 132 | + required> | |
| 133 | + </div> | |
| 134 | + </div> | |
| 135 | + </div> | |
| 136 | + <div class="uk-width-1-3"> | |
| 137 | + <div class="uk-form-row"> | |
| 138 | + <label class="uk-form-label" >计达</label> | |
| 139 | + <div class="uk-form-controls"> | |
| 140 | + <input type="time" value="{{zdsj}}" disabled> | |
| 141 | + </div> | |
| 142 | + </div> | |
| 143 | + </div> | |
| 144 | + <div class="uk-width-1-3"> | |
| 145 | + <div class="uk-form-row"> | |
| 146 | + <label class="uk-form-label" >实达</label> | |
| 147 | + <div class="uk-form-controls"> | |
| 148 | + <input type="time" name="zdsjActual" value="{{zdsjActual}}" > | |
| 149 | + </div> | |
| 150 | + </div> | |
| 151 | + </div> | |
| 152 | + </div> | |
| 153 | + <div class="uk-grid"> | |
| 154 | + <div class="uk-width-1-3"> | |
| 155 | + <div class="uk-form-row"> | |
| 156 | + <label class="uk-form-label" ></label> | |
| 157 | + <label> | |
| 158 | + <input class="i-cbox destroy-box" type="checkbox" name="status" value="-1" {{if status==-1}}checked{{/if}}> | |
| 159 | + 是否烂班 | |
| 160 | + </label> | |
| 161 | + </div> | |
| 162 | + </div> | |
| 163 | + | |
| 164 | + <div class="uk-width-2-3"> | |
| 165 | + <div class="uk-form-row ct-stacked"> | |
| 166 | + <label class="uk-form-label" >备注</label> | |
| 167 | + <div class="uk-form-controls" style="margin-top: 5px;"> | |
| 168 | + <textarea id="form-s-t" cols="20" rows="3" name="remarks" data-fv-stringlength="true" data-fv-stringlength-max="100" placeholder="备注">{{remarks}}</textarea> | |
| 169 | + </div> | |
| 170 | + </div> | |
| 171 | + </div> | |
| 172 | + </div> | |
| 173 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: 20px;"> | |
| 174 | + <div class="uk-button-dropdown" data-uk-dropdown> | |
| 175 | + <a class="uk-button uk-button-success"><i class="uk-icon-pencil-square-o"></i> 添加子任务 <i class="uk-icon-caret-down"></i></a> | |
| 176 | + <div class="uk-dropdown" style="text-align: left;"> | |
| 177 | + <ul class="uk-nav uk-nav-dropdown child_task_list"> | |
| 178 | + <li data-method="add_oil"><a>空驶进出场</a></li> | |
| 179 | + <li data-method="in_park"><a>进场</a></li> | |
| 180 | + <li data-method="out_park"><a>出场</a></li> | |
| 181 | + <li data-method="other"><a>自定义</a></li> | |
| 182 | + </ul> | |
| 183 | + </div> | |
| 184 | + </div> | |
| 185 | + | |
| 186 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存主任务信息</button> | |
| 187 | + </div> | |
| 188 | + </script> | |
| 189 | + | |
| 190 | + <script id="h-sub_task-table-temp" type="text/html"> | |
| 191 | + {{each list as task i}} | |
| 192 | + <dl data-id="{{task.id}}"> | |
| 193 | + <dd>{{i+1}}</dd> | |
| 194 | + <dd><span class="nt-dictionary" data-group="ChildTaskType">{{task.type2}}</span></dd> | |
| 195 | + <dd>{{task.startStationName}}</dd> | |
| 196 | + <dd>{{task.endStationName}}</dd> | |
| 197 | + <dd>{{task.startDate}}</dd> | |
| 198 | + <dd>{{task.endDate}}</dd> | |
| 199 | + <dd> | |
| 200 | + {{task.mileage}} | |
| 201 | + (<span class="nt-dictionary" data-group="MileageType">{{task.mileageType}}</span> | |
| 202 | + {{if task.destroy}} | |
| 203 | + <small style="color:red;">烂班</small> | |
| 204 | + {{/if}} | |
| 205 | + ) | |
| 206 | + </dd> | |
| 207 | + <dd title="{{task.remarks}}">{{task.remarks}}</dd> | |
| 208 | + </dl> | |
| 209 | + {{/each}} | |
| 210 | + </script> | |
| 211 | + | |
| 212 | + <script> | |
| 213 | + (function() { | |
| 214 | + var modal = '#history-sch-edit-modal' | |
| 215 | + ,gb_sch,parentModal; | |
| 216 | + var stationRoutes, parks, information; | |
| 217 | + | |
| 218 | + $(modal).on('init', function(e, data) { | |
| 219 | + e.stopPropagation(); | |
| 220 | + var id = data.id; | |
| 221 | + parentModal=data.parentModal; | |
| 222 | + | |
| 223 | + $.get('/realSchedule/'+id, function (sch) { | |
| 224 | + gb_sch = sch; | |
| 225 | + | |
| 226 | + var htmlStr = template('history-sch-edit-form-temp', sch); | |
| 227 | + $('form.sch_form', modal).html(htmlStr); | |
| 228 | + //子任务列表 | |
| 229 | + sch.cTasks.sort(sub_task_sort); | |
| 230 | + htmlStr = template('h-sub_task-table-temp', {list: sch.cTasks}); | |
| 231 | + $('.sub-task-table .ct_table_body', modal).html(htmlStr); | |
| 232 | + | |
| 233 | + //字典转换 | |
| 234 | + dictionaryUtils.transformDom($('.nt-dictionary', modal)); | |
| 235 | + //渲染表格,自动补全和下拉框等 | |
| 236 | + renderForm(); | |
| 237 | + | |
| 238 | + //submit | |
| 239 | + var f = $('form.sch_form', modal).formValidation(gb_form_validation_opts); | |
| 240 | + //是否烂班 | |
| 241 | + $('[name=status]', f).on('click', function () { | |
| 242 | + if(this.checked) | |
| 243 | + $('[name=jhlc]', f).val(0); | |
| 244 | + else | |
| 245 | + $('[name=jhlc]', f).val(gb_sch.jhlcOrig); | |
| 246 | + }); | |
| 247 | + f.on('success.form.fv', function(e) { | |
| 248 | + e.preventDefault(); | |
| 249 | + var data = $(this).serializeJSON(); | |
| 250 | + | |
| 251 | + //拆分驾驶员工号和姓名 | |
| 252 | + data.jGh = data.jsy.split('/')[0]; | |
| 253 | + data.jName = data.jsy.split('/')[1]; | |
| 254 | + delete data.jsy; | |
| 255 | + //拆分售票员工号和姓名 | |
| 256 | + if(data.sGh != null){ | |
| 257 | + data.sGh = data.spy.split('/')[0]; | |
| 258 | + data.sName = data.spy.split('/')[1]; | |
| 259 | + delete data.spy; | |
| 260 | + } | |
| 261 | + | |
| 262 | + gb_common.$post('/realSchedule/history', data, function (rs) { | |
| 263 | + //console.log(rs); | |
| 264 | + UIkit.modal(modal).hide(); | |
| 265 | + $(parentModal).trigger('refresh'); | |
| 266 | + }); | |
| 267 | + }); | |
| 268 | + }); | |
| 269 | + }); | |
| 270 | + | |
| 271 | + /** | |
| 272 | + * 添加子任务 | |
| 273 | + */ | |
| 274 | + $(modal).on('click','.child_task_list>li', function () { | |
| 275 | + var method = $(this).data('method'); | |
| 276 | + addChildTaskObj[method](); | |
| 277 | + }); | |
| 278 | + var modal_opts = {center: false, bgclose: false, modal: false} | |
| 279 | + ,folder = '/real_control_v2/fragments/north/nav/history_sch'; | |
| 280 | + var addChildTaskObj = { | |
| 281 | + add_oil: function () { | |
| 282 | + open_modal(folder + '/h_add_sub_task_oil.html', { | |
| 283 | + sch: gb_sch | |
| 284 | + }, modal_opts); | |
| 285 | + }, | |
| 286 | + in_park: function () { | |
| 287 | + open_modal(folder + '/h_add_sub_task_inpark.html', { | |
| 288 | + sch: gb_sch | |
| 289 | + }, modal_opts); | |
| 290 | + }, | |
| 291 | + out_park: function () { | |
| 292 | + open_modal(folder + '/h_add_sub_task_outpark.html', { | |
| 293 | + sch: gb_sch | |
| 294 | + }, modal_opts); | |
| 295 | + }, | |
| 296 | + other: function () { | |
| 297 | + open_modal(folder + '/h_add_sub_task_other.html', { | |
| 298 | + sch: gb_sch | |
| 299 | + }, modal_opts); | |
| 300 | + } | |
| 301 | + }; | |
| 302 | + | |
| 303 | + $('#addChildTaskBtn', modal).on('click', addChildTaskObj.other); | |
| 304 | + | |
| 305 | + | |
| 306 | + var callbackHandler = { | |
| 307 | + remove_sub_task: function () { | |
| 308 | + var activeDl = $('.sub-task-table .ct_table_body', modal).find('dl.context-menu-active'); | |
| 309 | + if (activeDl.length == 0) | |
| 310 | + return; | |
| 311 | + var dds = activeDl.find('dd'); | |
| 312 | + var id = activeDl.data('id') | |
| 313 | + , str = '<h3>确定要删除子任务<span style="color:red;margin: 0 5px;">' + $(dds[4]).text() + ',' + $(dds[6]).text() + ' </span>?</h3>'; | |
| 314 | + alt_confirm(str, function () { | |
| 315 | + gb_common.$del('/childTask/history/' + id, function (rs) { | |
| 316 | + notify_succ('删除子任务成功!'); | |
| 317 | + //刷新界面数据 | |
| 318 | + $(modal).trigger('init', {id: gb_sch.id}); | |
| 319 | + }); | |
| 320 | + }, '确定删除'); | |
| 321 | + } | |
| 322 | + }; | |
| 323 | + //右键菜单 | |
| 324 | + $.contextMenu({ | |
| 325 | + selector: modal + ' .sub-task-table .ct_table_body dl', | |
| 326 | + className: 'schedule-ct-menu', | |
| 327 | + callback: function (key, options) { | |
| 328 | + callbackHandler[key] && callbackHandler[key](); | |
| 329 | + }, | |
| 330 | + items: { | |
| 331 | + "remove_sub_task": { | |
| 332 | + name: "删除子任务" | |
| 333 | + , icon: "delete" | |
| 334 | + } | |
| 335 | + } | |
| 336 | + }); | |
| 337 | + | |
| 338 | + function renderForm() { | |
| 339 | + //站点路由 | |
| 340 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(gb_sch.xlBm).sort(function (a, b) { | |
| 341 | + return a.stationRouteCode - b.stationRouteCode; | |
| 342 | + }), 'directions'); | |
| 343 | + //停车场 | |
| 344 | + parks = gb_data_basic.simpleParksArray(); | |
| 345 | + //线路标准 | |
| 346 | + information = gb_data_basic.getLineInformation(gb_sch.xlBm); | |
| 347 | + | |
| 348 | + //----------- Autocomplete -------------- | |
| 349 | + //车辆 | |
| 350 | + gb_common.carAutocomplete($('.car-autocom', modal), gb_data_basic.carsArray()); | |
| 351 | + //驾驶员 | |
| 352 | + gb_common.personAutocomplete($('.jsy-autocom', modal)); | |
| 353 | + //售票员 | |
| 354 | + gb_common.personAutocomplete($('.spy-autocom', modal)); | |
| 355 | + | |
| 356 | + //班次类型切换 | |
| 357 | + var f = $('form.sch_form', modal); | |
| 358 | + initScheduleTypeChange(f); | |
| 359 | + $('[name=bcType]', f).trigger('change'); | |
| 360 | + } | |
| 361 | + | |
| 362 | + | |
| 363 | + function initScheduleTypeChange(f, cb) { | |
| 364 | + (function (f, cb) { | |
| 365 | + $('[name=bcType]', f).on('change', function () { | |
| 366 | + var bcType_e = $('[name=bcType]', f) | |
| 367 | + , updown = gb_sch.xlDir; | |
| 368 | + | |
| 369 | + var routes = stationRoutes[updown] | |
| 370 | + , lastCode = routes[routes.length - 1].stationCode | |
| 371 | + , opts = '', park_opts = ''; | |
| 372 | + //station options | |
| 373 | + $.each(routes, function () { | |
| 374 | + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>' | |
| 375 | + }); | |
| 376 | + //park options | |
| 377 | + for (var code in parks) | |
| 378 | + park_opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 379 | + | |
| 380 | + var qdz = $('[name=qdzCode]', f), zdz = $('[name=zdzCode]', f); | |
| 381 | + var time, mileage; | |
| 382 | + switch (bcType_e.val()) { | |
| 383 | + case 'out': | |
| 384 | + qdz.html(park_opts).val(information.carPark); | |
| 385 | + zdz.html(opts); | |
| 386 | + //出场结束时间 | |
| 387 | + time = updown == 0 ? information.upOutTimer : information.downOutTimer; | |
| 388 | + mileage = updown == 0 ? information.upOutMileage : information.downOutMileage; | |
| 389 | + break; | |
| 390 | + case 'in': | |
| 391 | + qdz.html(opts); | |
| 392 | + zdz.html(park_opts).val(information.carPark); | |
| 393 | + //进场结束时间 | |
| 394 | + time = updown == 0 ? information.upInTimer : information.downInTimer; | |
| 395 | + mileage = updown == 0 ? information.upInMileage : information.downInMileage; | |
| 396 | + break; | |
| 397 | + default: | |
| 398 | + qdz.html(opts); | |
| 399 | + zdz.html(opts).val(lastCode); | |
| 400 | + time = updown == 0?information.upTravelTime:information.downTravelTime; | |
| 401 | + mileage = updown == 0?information.upMileage:information.downMileage; | |
| 402 | + } | |
| 403 | + | |
| 404 | + cb && cb(); | |
| 405 | + }).trigger('change'); | |
| 406 | + })(f, cb); | |
| 407 | + } | |
| 408 | + | |
| 409 | + function sub_task_sort(a, b) { | |
| 410 | + return a.id - b.id; | |
| 411 | + } | |
| 412 | + })(); | |
| 413 | + </script> | |
| 414 | +</div> | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_add_sub_task_inpark.html
0 → 100644
| 1 | +<div class="uk-modal ct_move_modal" id="add-sub-task-inpark-modal"> | |
| 2 | + <div class="uk-modal-dialog"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>回场子任务</h2></div> | |
| 6 | + | |
| 7 | + <div style="width: 100%;padding-left: 1%;"> | |
| 8 | + <div class="sub-task-card"> | |
| 9 | + <div class="uk-panel uk-panel-box uk-panel-box-primary twins_task_panel"> | |
| 10 | + <div class="uk-panel-badge uk-badge">营运</div> | |
| 11 | + <h3 class="uk-panel-title">线路上站点间</h3> | |
| 12 | + <form class="uk-form uk-form-horizontal inpark_form" service_form> | |
| 13 | + <input type="hidden" name="type2" value="1"> | |
| 14 | + <input type="hidden" name="mileageType" value="service"> | |
| 15 | + <div class="uk-grid"> | |
| 16 | + <div class="uk-width-3-10"> | |
| 17 | + <div class="uk-form-row"> | |
| 18 | + <label class="uk-form-label">班次类型 </label> | |
| 19 | + </div> | |
| 20 | + </div> | |
| 21 | + <div class="uk-width-7-10 pl5"> | |
| 22 | + <select name="type1" class="ct_focus" disabled> | |
| 23 | + <option value="正常">正常</option> | |
| 24 | + <option value="临加">临加</option> | |
| 25 | + </select> | |
| 26 | + </div> | |
| 27 | + </div> | |
| 28 | + <div class="uk-grid"> | |
| 29 | + <div class="uk-width-3-10"> | |
| 30 | + <div class="uk-form-row"> | |
| 31 | + <label class="uk-form-label">起点 </label> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + <div class="uk-width-7-10 pl5"> | |
| 35 | + <select name="startStation" disabled></select> | |
| 36 | + </div> | |
| 37 | + </div> | |
| 38 | + <div class="uk-grid"> | |
| 39 | + <div class="uk-width-3-10"> | |
| 40 | + <div class="uk-form-row"> | |
| 41 | + <label class="uk-form-label">终点 </label> | |
| 42 | + </div> | |
| 43 | + </div> | |
| 44 | + <div class="uk-width-7-10 pl5"> | |
| 45 | + <select name="endStation" class="ct_focus"></select> | |
| 46 | + </div> | |
| 47 | + </div> | |
| 48 | + <div class="uk-grid"> | |
| 49 | + <div class="uk-width-3-10"> | |
| 50 | + <div class="uk-form-row"> | |
| 51 | + <label class="uk-form-label">营运里程</label> | |
| 52 | + </div> | |
| 53 | + </div> | |
| 54 | + <div class="uk-width-7-10 pl5"> | |
| 55 | + <input type="number" step="0.01" name="mileage" required> | |
| 56 | + </div> | |
| 57 | + </div> | |
| 58 | + <div class="uk-grid"> | |
| 59 | + <div class="uk-width-3-10"> | |
| 60 | + <div class="uk-form-row"> | |
| 61 | + <label class="uk-form-label">开始时间</label> | |
| 62 | + </div> | |
| 63 | + </div> | |
| 64 | + <div class="uk-width-7-10 pl5"> | |
| 65 | + <input type="time" name="startDate" required> | |
| 66 | + </div> | |
| 67 | + </div> | |
| 68 | + <div class="uk-grid"> | |
| 69 | + <div class="uk-width-3-10"> | |
| 70 | + <div class="uk-form-row"> | |
| 71 | + <label class="uk-form-label">结束时间</label> | |
| 72 | + </div> | |
| 73 | + </div> | |
| 74 | + <div class="uk-width-7-10 pl5"> | |
| 75 | + <input type="time" name="endDate" required> | |
| 76 | + </div> | |
| 77 | + </div> | |
| 78 | + </form> | |
| 79 | + </div> | |
| 80 | + </div> | |
| 81 | + <div class="sub-task-card"> | |
| 82 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | |
| 83 | + <div class="uk-panel-badge uk-badge uk-badge-default">空驶</div> | |
| 84 | + <h3 class="uk-panel-title">进场</h3> | |
| 85 | + <form class="uk-form uk-form-horizontal inpark_form" empty_form> | |
| 86 | + <input type="hidden" name="type2" value="2"> | |
| 87 | + <input type="hidden" name="mileageType" value="empty"> | |
| 88 | + <div class="uk-grid"> | |
| 89 | + <div class="uk-width-3-10"> | |
| 90 | + <div class="uk-form-row"> | |
| 91 | + <label class="uk-form-label">班次类型 </label> | |
| 92 | + </div> | |
| 93 | + </div> | |
| 94 | + <div class="uk-width-7-10 pl5"> | |
| 95 | + <select name="type1" class="ct_focus"> | |
| 96 | + <option value="正常">正常</option> | |
| 97 | + <option value="临加">临加</option> | |
| 98 | + </select> | |
| 99 | + </div> | |
| 100 | + </div> | |
| 101 | + <div class="uk-grid"> | |
| 102 | + <div class="uk-width-3-10"> | |
| 103 | + <div class="uk-form-row"> | |
| 104 | + <label class="uk-form-label">起点 </label> | |
| 105 | + </div> | |
| 106 | + </div> | |
| 107 | + <div class="uk-width-7-10 pl5"> | |
| 108 | + <select name="startStation" ></select> | |
| 109 | + </div> | |
| 110 | + </div> | |
| 111 | + <div class="uk-grid"> | |
| 112 | + <div class="uk-width-3-10"> | |
| 113 | + <div class="uk-form-row"> | |
| 114 | + <label class="uk-form-label">终点 </label> | |
| 115 | + </div> | |
| 116 | + </div> | |
| 117 | + <div class="uk-width-7-10 pl5"> | |
| 118 | + <select name="endStation" class="ct_focus"></select> | |
| 119 | + </div> | |
| 120 | + </div> | |
| 121 | + <div class="uk-grid"> | |
| 122 | + <div class="uk-width-3-10"> | |
| 123 | + <div class="uk-form-row"> | |
| 124 | + <label class="uk-form-label">空驶里程</label> | |
| 125 | + </div> | |
| 126 | + </div> | |
| 127 | + <div class="uk-width-7-10 pl5"> | |
| 128 | + <input type="number" step="0.01" name="mileage" required style="width: calc(100% - 62px);"> | |
| 129 | + <a style="font-size: 12px;color: grey;cursor: default;" data-uk-tooltip title="可选择回场路径,设置途径点位。暂不开放" id="inpark_paths_link">路径(<span>0</span>)</a> | |
| 130 | + </div> | |
| 131 | + </div> | |
| 132 | + <div class="uk-grid"> | |
| 133 | + <div class="uk-width-3-10"> | |
| 134 | + <div class="uk-form-row"> | |
| 135 | + <label class="uk-form-label">开始时间</label> | |
| 136 | + </div> | |
| 137 | + </div> | |
| 138 | + <div class="uk-width-7-10 pl5"> | |
| 139 | + <input type="time" name="startDate" required> | |
| 140 | + </div> | |
| 141 | + </div> | |
| 142 | + <div class="uk-grid"> | |
| 143 | + <div class="uk-width-3-10"> | |
| 144 | + <div class="uk-form-row"> | |
| 145 | + <label class="uk-form-label">结束时间</label> | |
| 146 | + </div> | |
| 147 | + </div> | |
| 148 | + <div class="uk-width-7-10 pl5"> | |
| 149 | + <input type="time" name="endDate" required> | |
| 150 | + </div> | |
| 151 | + </div> | |
| 152 | + </form> | |
| 153 | + </div> | |
| 154 | + </div> | |
| 155 | + <div class="sub-task-card destroy-card uk-animation-scale"> | |
| 156 | + <div class="uk-panel uk-panel-box uk-panel-box-danger"> | |
| 157 | + <div class="uk-panel-badge uk-badge uk-badge-danger">烂班</div> | |
| 158 | + <h3 class="uk-panel-title">线路上站点间</h3> | |
| 159 | + <form class="uk-form uk-form-horizontal inpark_form" destroy_form> | |
| 160 | + <input type="hidden" value="正常" name="type1"> | |
| 161 | + <input type="hidden" value="1" name="type2"> | |
| 162 | + <input type="hidden" name="mileageType" value="service"> | |
| 163 | + <input type="hidden" name="destroy" value="true"> | |
| 164 | + <div class="uk-grid" style="height: 30px;"> | |
| 165 | + </div> | |
| 166 | + <div class="uk-grid"> | |
| 167 | + <div class="uk-width-3-10"> | |
| 168 | + <div class="uk-form-row"> | |
| 169 | + <label class="uk-form-label">起点 </label> | |
| 170 | + </div> | |
| 171 | + </div> | |
| 172 | + <div class="uk-width-7-10 pl5"> | |
| 173 | + <select name="startStation" disabled></select> | |
| 174 | + </div> | |
| 175 | + </div> | |
| 176 | + <div class="uk-grid"> | |
| 177 | + <div class="uk-width-3-10"> | |
| 178 | + <div class="uk-form-row"> | |
| 179 | + <label class="uk-form-label">终点 </label> | |
| 180 | + </div> | |
| 181 | + </div> | |
| 182 | + <div class="uk-width-7-10 pl5"> | |
| 183 | + <select name="endStation" class="ct_focus" disabled></select> | |
| 184 | + </div> | |
| 185 | + </div> | |
| 186 | + <div class="uk-grid"> | |
| 187 | + <div class="uk-width-3-10"> | |
| 188 | + <div class="uk-form-row"> | |
| 189 | + <label class="uk-form-label">烂班里程</label> | |
| 190 | + </div> | |
| 191 | + </div> | |
| 192 | + <div class="uk-width-7-10 pl5"> | |
| 193 | + <input type="number" step="0.01" name="mileage" required> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | + <div class="uk-grid"> | |
| 197 | + <div class="uk-width-3-10"> | |
| 198 | + <div class="uk-form-row"> | |
| 199 | + <label class="uk-form-label">开始时间</label> | |
| 200 | + </div> | |
| 201 | + </div> | |
| 202 | + <div class="uk-width-7-10 pl5"> | |
| 203 | + <input type="time" name="startDate" required> | |
| 204 | + </div> | |
| 205 | + </div> | |
| 206 | + <div class="uk-grid"> | |
| 207 | + <div class="uk-width-3-10"> | |
| 208 | + <div class="uk-form-row"> | |
| 209 | + <label class="uk-form-label">烂班原因</label> | |
| 210 | + </div> | |
| 211 | + </div> | |
| 212 | + <div class="uk-width-7-10 pl5"> | |
| 213 | + <select name="destroyReason" required></select> | |
| 214 | + </div> | |
| 215 | + </div> | |
| 216 | + </form> | |
| 217 | + </div> | |
| 218 | + </div> | |
| 219 | + | |
| 220 | + <form class="uk-form" style="margin-top: 15px; padding: 0 10px 0 0;"> | |
| 221 | + <textarea placeholder="备注" style="width: 100%;height: 70px;" id="globalRemarks"></textarea> | |
| 222 | + </form> | |
| 223 | + </div> | |
| 224 | + | |
| 225 | + <div class="uk-modal-footer uk-text-right"> | |
| 226 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 227 | + <button type="button" class="uk-button uk-button-primary" id="submitChildTaskBtn">提交子任务</button> | |
| 228 | + | |
| 229 | + <div class="ct-footer-left"> | |
| 230 | + <a id="betweenStationRangeCalc" data-drawer-id="station_route_spacing_chart_drawer">站点间公里不准?</a> | |
| 231 | + </div> | |
| 232 | + </div> | |
| 233 | + </div> | |
| 234 | + | |
| 235 | + <div class="ct-bottom-drawer"> | |
| 236 | + <div class="ct-bottom-drawer-body"></div> | |
| 237 | + </div> | |
| 238 | + | |
| 239 | + <script id="sub-task-inpark-form-temp" type="text/html"> | |
| 240 | + </script> | |
| 241 | + | |
| 242 | + <script> | |
| 243 | + (function () { | |
| 244 | + var modal = '#add-sub-task-inpark-modal', | |
| 245 | + serviceForm = $('form[service_form]', modal), | |
| 246 | + emptyForm = $('form[empty_form]', modal), | |
| 247 | + destroyForm = $('form[destroy_form]', modal), | |
| 248 | + sch, stationRoutes, parks, information, esCode, timeLocStations; | |
| 249 | + var adjustExps = ['配车', '保养', '故障', '肇事', '路阻', '纠纷', '缺人', '客稀', '缺车', '气候', '援外', '吊慢', '抽减', '其他']; | |
| 250 | + $(modal).on('init', function (e, data) { | |
| 251 | + e.stopPropagation(); | |
| 252 | + sch = data.sch; | |
| 253 | + | |
| 254 | + //站点路由 | |
| 255 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) { | |
| 256 | + return a.stationRouteCode - b.stationRouteCode; | |
| 257 | + }), 'directions')[sch.xlDir]; | |
| 258 | + //空驶终点(停车场) | |
| 259 | + //切换进场终点 | |
| 260 | + $('select[name=endStation]', emptyForm).on('change', inparkNavigation); | |
| 261 | + $.get('/basic/parks', function (rs) { | |
| 262 | + parks = rs; | |
| 263 | + var opts = ''; | |
| 264 | + for (var code in parks) { | |
| 265 | + opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 266 | + } | |
| 267 | + $('select[name=endStation]', emptyForm).html(opts).val(information.carPark).trigger('change'); | |
| 268 | + }); | |
| 269 | + //线路标准 | |
| 270 | + information = gb_data_basic.getLineInformation(sch.xlBm); | |
| 271 | + //本地存储的站点耗时 | |
| 272 | + getLocStationsSpace(); | |
| 273 | + | |
| 274 | + //设置默认值 | |
| 275 | + setDefaultVal(); | |
| 276 | + | |
| 277 | + //切换营运终点 | |
| 278 | + $('select[name=endStation]', serviceForm).val(esCode).on('change', function () { | |
| 279 | + var val = $(this).val(); | |
| 280 | + if (val == esCode) { | |
| 281 | + $('.uk-modal-dialog', modal).removeClass('three-children'); | |
| 282 | + $('.sub-task-card.destroy-card').css("display", "none"); | |
| 283 | + } | |
| 284 | + else { | |
| 285 | + $('.uk-modal-dialog', modal).addClass('three-children'); | |
| 286 | + $('.sub-task-card.destroy-card').css("display", "inline-block"); | |
| 287 | + } | |
| 288 | + | |
| 289 | + reClac(); | |
| 290 | + }).trigger('change'); | |
| 291 | + | |
| 292 | + | |
| 293 | + var dataArray = []; | |
| 294 | + var fs = $('form.inpark_form', modal).formValidation({ | |
| 295 | + framework: 'uikit', | |
| 296 | + locale: 'zh_CN' | |
| 297 | + }); | |
| 298 | + fs.on('success.form.fv', function(e) { | |
| 299 | + e.preventDefault(); | |
| 300 | + if($(this).is(':hidden')) | |
| 301 | + return; | |
| 302 | + dataArray.push($.extend($(this).serializeJSON(), getDisabledVal(this) | |
| 303 | + , {remarks: $('#globalRemarks',modal).val(), 'schedule.id': sch.id})); | |
| 304 | + $(this).data('valid', true); | |
| 305 | + | |
| 306 | + if(allValidSuccess()){ | |
| 307 | + var i = 0, rst; | |
| 308 | + (function () { | |
| 309 | + var f = arguments.callee; | |
| 310 | + if(i >= dataArray.length){ | |
| 311 | + UIkit.modal(modal).hide(); | |
| 312 | + $('#history-sch-edit-modal').trigger('init', {id: sch.id}); | |
| 313 | + return; | |
| 314 | + } | |
| 315 | + var data = dataArray[i]; | |
| 316 | + //里程为0的不保存 | |
| 317 | + if(data.mileage==0){ | |
| 318 | + i++; | |
| 319 | + f(); | |
| 320 | + } | |
| 321 | + else{ | |
| 322 | + //营运子任务不写备注 | |
| 323 | + if(data.mileageType == 'service' && !data.destroy) | |
| 324 | + data.remarks = ''; | |
| 325 | + //需要关联的部分主任务属性 | |
| 326 | + data['schedule.xlBm'] = sch.xlBm; | |
| 327 | + data['schedule.xlDir'] = sch.xlDir; | |
| 328 | + gb_common.$post('/childTask/history', data, function (rs) { | |
| 329 | + notify_succ('子任务添加成功'); | |
| 330 | + rst = rs.t; | |
| 331 | + i++; | |
| 332 | + f(); | |
| 333 | + }); | |
| 334 | + } | |
| 335 | + })(); | |
| 336 | + } | |
| 337 | + }); | |
| 338 | + | |
| 339 | + //校验不过 | |
| 340 | + fs.on('err.field.fv', function () { | |
| 341 | + $('#submitChildTaskBtn', modal).removeClass('disabled').removeAttr('disabled'); | |
| 342 | + }); | |
| 343 | + | |
| 344 | + //submit | |
| 345 | + $('#submitChildTaskBtn', modal).on('click', function () { | |
| 346 | + $(this).addClass('disabled').attr('disabled','disabled'); | |
| 347 | + dataArray = []; | |
| 348 | + fs.data('valid', false); | |
| 349 | + fs.formValidation('validate'); | |
| 350 | + //fs.submit(); | |
| 351 | + }); | |
| 352 | + | |
| 353 | + //选择烂班原因 | |
| 354 | + $('select[name=destroyReason]', destroyForm).on('change', function () { | |
| 355 | + var e =$('#globalRemarks', modal); | |
| 356 | + e.val(e.val() + $(this).val() + ','); | |
| 357 | + }); | |
| 358 | + | |
| 359 | + //根据主任务状态,复子任务 | |
| 360 | + updateTwinsTaskBySch(sch); | |
| 361 | + }); | |
| 362 | + | |
| 363 | + function allValidSuccess() { | |
| 364 | + var flag = true; | |
| 365 | + $('form.inpark_form:visible', modal).each(function (i, f) { | |
| 366 | + if(!$(f).data('valid')){ | |
| 367 | + flag = false; | |
| 368 | + return false; | |
| 369 | + } | |
| 370 | + }); | |
| 371 | + return flag; | |
| 372 | + } | |
| 373 | + | |
| 374 | + //获取表单disabled 项的值 | |
| 375 | + function getDisabledVal(f) { | |
| 376 | + var rs = {}; | |
| 377 | + $('input,select', f).each(function () { | |
| 378 | + if($(this).attr('disabled')){ | |
| 379 | + rs[$(this).attr('name')]=$(this).val(); | |
| 380 | + } | |
| 381 | + }); | |
| 382 | + return rs; | |
| 383 | + } | |
| 384 | + | |
| 385 | + function setDefaultVal() { | |
| 386 | + var routeOpts = ''; | |
| 387 | + $.each(stationRoutes, function () { | |
| 388 | + routeOpts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>'; | |
| 389 | + }); | |
| 390 | + esCode = stationRoutes[stationRoutes.length - 1].stationCode; | |
| 391 | + | |
| 392 | + //营运起终点 | |
| 393 | + $('select[name=startStation],select[name=endStation]', serviceForm).html(routeOpts); | |
| 394 | + //空驶起点 | |
| 395 | + $('select[name=startStation]', emptyForm).html(routeOpts).val(esCode); | |
| 396 | + //烂班起终点 | |
| 397 | + $('select[name=startStation],select[name=endStation]', destroyForm).html(routeOpts).val(esCode); | |
| 398 | + | |
| 399 | + //烂班原因 | |
| 400 | + var adjustExpsOpts = '<option value="">请选择...</option>'; | |
| 401 | + $.each(adjustExps, function (i, str) { | |
| 402 | + adjustExpsOpts += '<option value="' + str + '">' + str + '</option>'; | |
| 403 | + }); | |
| 404 | + $('select[name=destroyReason]', destroyForm).html(adjustExpsOpts); | |
| 405 | + | |
| 406 | + //营运开始时间 | |
| 407 | + $('input[name=startDate]', serviceForm).val(sch.fcsjActual?sch.fcsjActual:sch.dfsj); | |
| 408 | + | |
| 409 | + //营运班次类型 | |
| 410 | + $('select[name=type1]', serviceForm).val(sch['sflj']?'临加':'正常'); | |
| 411 | + } | |
| 412 | + | |
| 413 | + //点击 路径 | |
| 414 | + $('#inpark_paths_link', modal).on('click', function () { | |
| 415 | + | |
| 416 | + }); | |
| 417 | + | |
| 418 | + //进场导航 | |
| 419 | + var drivingRouteResult; | |
| 420 | + function inparkNavigation() { | |
| 421 | + var start = $('select[name=startStation]', emptyForm).val() | |
| 422 | + ,end = $('select[name=endStation]', emptyForm).val(); | |
| 423 | + | |
| 424 | + if(!end) return; | |
| 425 | + | |
| 426 | + var station = getStationByCode(start).station | |
| 427 | + ,park = gb_data_basic.getCarparkByCode(end); | |
| 428 | + | |
| 429 | + if(!park){ | |
| 430 | + notify_err('无法找到停车场的坐标对照!!!'); | |
| 431 | + return; | |
| 432 | + } | |
| 433 | + var tArray = park['gCenterPoint'].split(' '); | |
| 434 | + var sCoord = TransGPS.wgsToBD(station['gLaty'], station['gLonx']) | |
| 435 | + ,eCoord = TransGPS.wgsToBD(parseFloat(tArray[1]), parseFloat(tArray[0])); | |
| 436 | + | |
| 437 | + var sp = new BMap.Point(sCoord.lng,sCoord.lat); | |
| 438 | + var ep = new BMap.Point(eCoord.lng,eCoord.lat); | |
| 439 | + | |
| 440 | + var driving = new BMap.DrivingRoute('上海', { | |
| 441 | + onSearchComplete: function (rs) { | |
| 442 | + drivingRouteResult = rs; | |
| 443 | + calcInparkMileage(0); | |
| 444 | + } | |
| 445 | + }); | |
| 446 | + driving.search(sp,ep); | |
| 447 | + } | |
| 448 | + | |
| 449 | + function calcInparkMileage(index) { | |
| 450 | + var count = drivingRouteResult.getNumPlans(); | |
| 451 | + | |
| 452 | + //选择方案 | |
| 453 | + var routePlan = drivingRouteResult.getPlan(index); | |
| 454 | + //里程 | |
| 455 | + var mileage = routePlan.getDistance(false); | |
| 456 | + $('input[name=mileage]', emptyForm).val(mileage / 1000); | |
| 457 | + //结束时间 | |
| 458 | + var duratio = routePlan.getDuration(false); | |
| 459 | + var st = $('input[name=startDate]', emptyForm).val(); | |
| 460 | + var ets = moment(st, 'HH:mm').add(duratio, 'seconds').format('HH:mm'); | |
| 461 | + $('input[name=endDate]', emptyForm).val(ets); | |
| 462 | + | |
| 463 | + | |
| 464 | + $('#inpark_paths_link span', modal).text(count); | |
| 465 | + } | |
| 466 | + | |
| 467 | + function getStationByCode(code) { | |
| 468 | + for(var i = 0; i < stationRoutes.length; i++){ | |
| 469 | + if(stationRoutes[i]['stationCode']==code) | |
| 470 | + return stationRoutes[i]; | |
| 471 | + } | |
| 472 | + return null; | |
| 473 | + } | |
| 474 | + | |
| 475 | + function reClac() { | |
| 476 | + var serviceEnd = $('select[name=endStation]', serviceForm).val(); | |
| 477 | + //空驶起点 == 营运终点 | |
| 478 | + $('select[name=startStation]', emptyForm).val(serviceEnd); | |
| 479 | + | |
| 480 | + //计算营运里程 | |
| 481 | + var s = $('select[name=startStation]', serviceForm).val(), | |
| 482 | + e = $('select[name=endStation]', serviceForm).val(); | |
| 483 | + var sMileage = calcMileage(s, e); | |
| 484 | + if(sMileage >= 0) | |
| 485 | + $('input[name=mileage]', serviceForm).val(sMileage); | |
| 486 | + | |
| 487 | + //营运结束时间 | |
| 488 | + var et = sch.dfsjT + (parseInt(sMileage / sch.jhlcOrig * sch.bcsj) * 60 * 1000) | |
| 489 | + ,ets = et > sch.zdsjT?sch.zdsj:moment(et).format('HH:mm'); | |
| 490 | + $('input[name=endDate]', serviceForm).val(ets); | |
| 491 | + | |
| 492 | + //有烂班 | |
| 493 | + if (serviceEnd != esCode) { | |
| 494 | + //烂班起点 == 营运终点 | |
| 495 | + $('select[name=startStation]', destroyForm).val(serviceEnd); | |
| 496 | + //计算烂班公里 | |
| 497 | + s = $('select[name=startStation]', destroyForm).val(); | |
| 498 | + e = $('select[name=endStation]', destroyForm).val(); | |
| 499 | + var dMileage = calcMileage(s, e); | |
| 500 | + $('input[name=mileage]', destroyForm).val(dMileage); | |
| 501 | + //烂班开始时间 | |
| 502 | + $('input[name=startDate]', destroyForm).val(ets); | |
| 503 | + } | |
| 504 | + | |
| 505 | + //进场开始时间 | |
| 506 | + $('input[name=startDate]', emptyForm).val(ets); | |
| 507 | + | |
| 508 | + //重新导航 | |
| 509 | + inparkNavigation(); | |
| 510 | + } | |
| 511 | + | |
| 512 | + function calcMileage(s, e) { | |
| 513 | + var mileage = 0, flag, code; | |
| 514 | + if (timeLocStations) { | |
| 515 | + //空间坐标计算的站距 | |
| 516 | + $.each(timeLocStations, function () { | |
| 517 | + code = this.station['STATION_CODE']; | |
| 518 | + if (flag) | |
| 519 | + mileage = gb_common.accAdd(mileage, this.toDistanceGl); | |
| 520 | + if (code == s) | |
| 521 | + flag = true; | |
| 522 | + if (code == e) | |
| 523 | + return false; | |
| 524 | + }); | |
| 525 | + } | |
| 526 | + else{ | |
| 527 | + //从原始站点路由字段里取值 | |
| 528 | + $.each(stationRoutes, function () { | |
| 529 | + code = this['stationCode']; | |
| 530 | + if (flag) | |
| 531 | + mileage = gb_common.accAdd(mileage, this.distances); | |
| 532 | + if (code == s) | |
| 533 | + flag = true; | |
| 534 | + if (code == e) | |
| 535 | + return false; | |
| 536 | + }); | |
| 537 | + } | |
| 538 | + return mileage; | |
| 539 | + } | |
| 540 | + | |
| 541 | + //从本地localStorage获取站间距数据 | |
| 542 | + function getLocStationsSpace() { | |
| 543 | + try { | |
| 544 | + timeLocStations = window.localStorage.getItem('control_route_distance_' + sch.xlBm); | |
| 545 | + if (timeLocStations) | |
| 546 | + timeLocStations = JSON.parse(timeLocStations).stations[sch.xlDir == 0 ? 'up' : 'down']; | |
| 547 | + } catch (e) { | |
| 548 | + console.log(e); | |
| 549 | + } | |
| 550 | + } | |
| 551 | + | |
| 552 | + //站间距计算后刷新 | |
| 553 | + $(modal).on('refresh_station_space', function () { | |
| 554 | + getLocStationsSpace(); | |
| 555 | + reClac(); | |
| 556 | + }); | |
| 557 | + | |
| 558 | + //------ 下抽屉 ------ | |
| 559 | + $('#betweenStationRangeCalc', modal).on('click', function () { | |
| 560 | + var id = $(this).data('drawer-id'); | |
| 561 | + switchBtmDrawer(id, '/real_control_v2/fragments/line_schedule/context_menu/sub_task/station_route_spacing_chart.html'); | |
| 562 | + }); | |
| 563 | + | |
| 564 | + var btmDrawer = $('.ct-bottom-drawer', modal); | |
| 565 | + //打开事件 | |
| 566 | + btmDrawer.on('drawer_show', function () { | |
| 567 | + var url = $(this).data('url'); | |
| 568 | + if (!url) { | |
| 569 | + alert('无效的地址'); | |
| 570 | + } | |
| 571 | + | |
| 572 | + var drawerPanel = $(this).data('name'); | |
| 573 | + $('.ct-bottom-drawer-body', btmDrawer).load(url, function () { | |
| 574 | + $('#' + drawerPanel).trigger('drawer-init', {sch: sch}); | |
| 575 | + }); | |
| 576 | + }); | |
| 577 | + | |
| 578 | + function switchBtmDrawer(id, url) { | |
| 579 | + if (btmDrawer.hasClass('open') && btmDrawer.data('name') == id) { | |
| 580 | + btmDrawer.removeClass('open'); | |
| 581 | + btmDrawer.removeData('name').removeData('url'); | |
| 582 | + } | |
| 583 | + else { | |
| 584 | + btmDrawer.addClass('open'); | |
| 585 | + btmDrawer.data('name', id).data('url', url).trigger('drawer_show'); | |
| 586 | + } | |
| 587 | + } | |
| 588 | + | |
| 589 | + | |
| 590 | + function updateTwinsTaskBySch(sch) { | |
| 591 | + //主任务是烂班 | |
| 592 | + if(sch.destroy){ | |
| 593 | + serviceForm.prepend('<input type="hidden" name="destroy" value="true">'); | |
| 594 | + $('[name=mileage]', serviceForm).val(sch.jhlcOrig).attr('disabled', 'disabled'); | |
| 595 | + $('.twins_task_panel .uk-badge', modal).addClass('uk-badge-danger').text('烂班'); | |
| 596 | + //终点禁选 | |
| 597 | + $('select[name=endStation]', serviceForm).attr('disabled', 'disabled'); | |
| 598 | + //开始结束时间禁选 | |
| 599 | + | |
| 600 | + //空驶起点 | |
| 601 | + $('select[name=startStation]', emptyForm).val(sch.qdzCode); | |
| 602 | + } | |
| 603 | + } | |
| 604 | + })(); | |
| 605 | + </script> | |
| 606 | +</div> | |
| 0 | 607 | \ No newline at end of file | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_add_sub_task_oil.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal ct_move_modal" id="schedule-addsch_oil-modal"> | |
| 2 | + <div class="uk-modal-dialog" style="width: 1101px;"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>空驶进出场</h2></div> | |
| 6 | + | |
| 7 | + <div class="uk-grid"> | |
| 8 | + <div class="uk-width-1-3"> | |
| 9 | + <form class="uk-form uk-form-horizontal c_task_form twins_task_form"> | |
| 10 | + <input type="hidden" name="type1" value="正常"> | |
| 11 | + <input type="hidden" name="type2" value="1"> | |
| 12 | + <input type="hidden" name="mileageType" value="service"> | |
| 13 | + | |
| 14 | + <div class="uk-panel uk-panel-box uk-panel-box-primary"> | |
| 15 | + <div class="uk-panel-badge uk-badge ">营运</div> | |
| 16 | + <h3 class="uk-panel-title">线路上站点间</h3> | |
| 17 | + <div class="uk-form-row"> | |
| 18 | + <label class="uk-form-label">起点站</label> | |
| 19 | + <div class="uk-form-controls"> | |
| 20 | + <input type="hidden" name="startStation"> | |
| 21 | + <input type="text" name="startStationName" disabled> | |
| 22 | + </div> | |
| 23 | + </div> | |
| 24 | + <div class="uk-form-row"> | |
| 25 | + <label class="uk-form-label">终点站</label> | |
| 26 | + <div class="uk-form-controls"> | |
| 27 | + <input type="hidden" name="endStation"> | |
| 28 | + <input type="text" name="endStationName" disabled> | |
| 29 | + </div> | |
| 30 | + </div> | |
| 31 | + <div class="uk-form-row"> | |
| 32 | + <label class="uk-form-label">里程</label> | |
| 33 | + <div class="uk-form-controls"> | |
| 34 | + <input type="number" step="0.01" name="mileage" max=222 | |
| 35 | + data-fv-lessthan-inclusive="false" | |
| 36 | + disabled> | |
| 37 | + </div> | |
| 38 | + </div> | |
| 39 | + <div class="uk-form-row"> | |
| 40 | + <label class="uk-form-label">开始时间</label> | |
| 41 | + <div class="uk-form-controls"> | |
| 42 | + <input type="time" name="startDate" required> | |
| 43 | + </div> | |
| 44 | + </div> | |
| 45 | + <div class="uk-form-row"> | |
| 46 | + <label class="uk-form-label">结束时间</label> | |
| 47 | + <div class="uk-form-controls"> | |
| 48 | + <input type="time" name="endDate" required> | |
| 49 | + </div> | |
| 50 | + </div> | |
| 51 | + </div> | |
| 52 | + </form> | |
| 53 | + </div> | |
| 54 | + | |
| 55 | + <div class="uk-width-1-3"> | |
| 56 | + <form class="uk-form uk-form-horizontal c_task_form"> | |
| 57 | + <input type="hidden" name="type1" value="临加"> | |
| 58 | + <input type="hidden" name="type2" value="2"> | |
| 59 | + <input type="hidden" name="mileageType" value="empty"> | |
| 60 | + | |
| 61 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | |
| 62 | + <div class="uk-panel-badge uk-badge uk-badge-default">空驶</div> | |
| 63 | + <h3 class="uk-panel-title">进场</h3> | |
| 64 | + <div class="uk-form-row"> | |
| 65 | + <label class="uk-form-label">起点站</label> | |
| 66 | + <div class="uk-form-controls"> | |
| 67 | + <select name="startStation" required> | |
| 68 | + </select> | |
| 69 | + <input type="hidden" name="startStationName" disabled> | |
| 70 | + </div> | |
| 71 | + </div> | |
| 72 | + <div class="uk-form-row"> | |
| 73 | + <label class="uk-form-label">终点站</label> | |
| 74 | + <div class="uk-form-controls"> | |
| 75 | + <select name="endStation" required> | |
| 76 | + </select> | |
| 77 | + <input type="hidden" name="endStationName" disabled> | |
| 78 | + </div> | |
| 79 | + </div> | |
| 80 | + <div class="uk-form-row"> | |
| 81 | + <label class="uk-form-label">里程</label> | |
| 82 | + <div class="uk-form-controls"> | |
| 83 | + <input type="number" step="0.01" name="mileage" max=222 | |
| 84 | + data-fv-lessthan-inclusive="false" | |
| 85 | + required> | |
| 86 | + </div> | |
| 87 | + </div> | |
| 88 | + <div class="uk-form-row"> | |
| 89 | + <label class="uk-form-label">开始时间</label> | |
| 90 | + <div class="uk-form-controls"> | |
| 91 | + <input type="time" name="startDate" required> | |
| 92 | + </div> | |
| 93 | + </div> | |
| 94 | + <div class="uk-form-row"> | |
| 95 | + <label class="uk-form-label">结束时间</label> | |
| 96 | + <div class="uk-form-controls"> | |
| 97 | + <input type="time" name="endDate" required> | |
| 98 | + </div> | |
| 99 | + </div> | |
| 100 | + </div> | |
| 101 | + </form> | |
| 102 | + </div> | |
| 103 | + | |
| 104 | + <div class="uk-width-1-3"> | |
| 105 | + <form class="uk-form uk-form-horizontal c_task_form"> | |
| 106 | + <input type="hidden" name="type1" value="临加"> | |
| 107 | + <input type="hidden" name="type2" value="3"> | |
| 108 | + <input type="hidden" name="mileageType" value="empty"> | |
| 109 | + | |
| 110 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | |
| 111 | + <div class="uk-panel-badge uk-badge uk-badge-default">空驶</div> | |
| 112 | + <h3 class="uk-panel-title">出场</h3> | |
| 113 | + <div class="uk-form-row"> | |
| 114 | + <label class="uk-form-label">起点站</label> | |
| 115 | + <div class="uk-form-controls"> | |
| 116 | + <select name="startStation" required> | |
| 117 | + </select> | |
| 118 | + <input type="hidden" name="startStationName" disabled> | |
| 119 | + </div> | |
| 120 | + </div> | |
| 121 | + <div class="uk-form-row"> | |
| 122 | + <label class="uk-form-label">终点站</label> | |
| 123 | + <div class="uk-form-controls"> | |
| 124 | + <select name="endStation" required> | |
| 125 | + </select> | |
| 126 | + <input type="hidden" name="endStationName" disabled> | |
| 127 | + </div> | |
| 128 | + </div> | |
| 129 | + <div class="uk-form-row"> | |
| 130 | + <label class="uk-form-label">里程</label> | |
| 131 | + <div class="uk-form-controls"> | |
| 132 | + <input type="number" step="0.01" name="mileage" max=222 | |
| 133 | + data-fv-lessthan-inclusive="false" | |
| 134 | + required> | |
| 135 | + </div> | |
| 136 | + </div> | |
| 137 | + <div class="uk-form-row"> | |
| 138 | + <label class="uk-form-label">开始时间</label> | |
| 139 | + <div class="uk-form-controls"> | |
| 140 | + <input type="time" name="startDate" required> | |
| 141 | + </div> | |
| 142 | + </div> | |
| 143 | + <div class="uk-form-row"> | |
| 144 | + <label class="uk-form-label">结束时间</label> | |
| 145 | + <div class="uk-form-controls"> | |
| 146 | + <input type="time" name="endDate" required> | |
| 147 | + </div> | |
| 148 | + </div> | |
| 149 | + </div> | |
| 150 | + </form> | |
| 151 | + </div> | |
| 152 | + | |
| 153 | + <div class="uk-width-1-1" style="margin-top: 20px;"> | |
| 154 | + <hr style="border-top: 1px dashed #ddd;"> | |
| 155 | + </div> | |
| 156 | + <div class="uk-width-2-3 uk-push-1-3" style="margin-top: 10px;"> | |
| 157 | + | |
| 158 | + <div class="ct_tags inout_reason_tags"> | |
| 159 | + <span>加油</span> | |
| 160 | + <span>维修</span> | |
| 161 | + </div> | |
| 162 | + <form class="uk-form"> | |
| 163 | + <textarea placeholder="备注,必填" style="width: 100%;height: 70px;" id="globalRemarks"></textarea> | |
| 164 | + </form> | |
| 165 | + </div> | |
| 166 | + </div> | |
| 167 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 168 | + <span class="bind_gas_station_panel" style="position: absolute;left: 30px;text-decoration: underline;"></span> | |
| 169 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 170 | + <button type="submit" id="submitChildTaskBtn" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 171 | + </div> | |
| 172 | + </div> | |
| 173 | + | |
| 174 | + <script id="schedule-addsch_oil-form-temp" type="text/html"> | |
| 175 | + | |
| 176 | + </script> | |
| 177 | + | |
| 178 | + <script> | |
| 179 | + (function () { | |
| 180 | + var modal = '#schedule-addsch_oil-modal', | |
| 181 | + sch, stationRoutes, parks, oilStation; | |
| 182 | + var yyForm = $('form', modal)[0]; | |
| 183 | + var jcForm = $('form', modal)[1]; | |
| 184 | + var ccForm = $('form', modal)[2]; | |
| 185 | + var oilId; | |
| 186 | + var lineInfo; | |
| 187 | + | |
| 188 | + var folder = '/real_control_v2/fragments/north/nav/history_sch'; | |
| 189 | + $(modal).on('init', function (e, data) { | |
| 190 | + e.stopPropagation(); | |
| 191 | + sch = data.sch; | |
| 192 | + | |
| 193 | + oilId = sch.xlBm + '_oil_station'; | |
| 194 | + lineInfo = gb_data_basic.codeToLine[sch.xlBm]; | |
| 195 | + | |
| 196 | + //站点路由 | |
| 197 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) { | |
| 198 | + return a.stationRouteCode - b.stationRouteCode; | |
| 199 | + }), 'directions'); | |
| 200 | + | |
| 201 | + setDefaultVal(); | |
| 202 | + //停车场 | |
| 203 | + $.get('/basic/parks', function (rs) { | |
| 204 | + parks = rs; | |
| 205 | + var opts = ''; | |
| 206 | + for (var code in parks) { | |
| 207 | + opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 208 | + } | |
| 209 | + $('[name=endStation]', jcForm).html(opts); | |
| 210 | + $('[name=startStation]', ccForm).html(opts); | |
| 211 | + }); | |
| 212 | + | |
| 213 | + //切换空驶起终点 | |
| 214 | + $('[name=endStation]', jcForm).on('change', reCalcIn); | |
| 215 | + $('[name=startStation]', jcForm).on('change', reCalcIn); | |
| 216 | + | |
| 217 | + $('[name=endStation]', ccForm).on('change', reCalcOut); | |
| 218 | + $('[name=startStation]', ccForm).on('change', reCalcOut); | |
| 219 | + //修改开始时间 | |
| 220 | + $('[name=startDate]', jcForm).on('change', reCalcIn); | |
| 221 | + $('[name=startDate]', ccForm).on('change', reCalcOut); | |
| 222 | + | |
| 223 | + //绑定的社会加油站 | |
| 224 | + $.get('/oilStation/'+sch.xlBm, function (rs) { | |
| 225 | + var htmlStr; | |
| 226 | + oilStation = rs; | |
| 227 | + if(oilStation){ | |
| 228 | + htmlStr = '<a><i class="uk-icon-product-hunt"></i> '+oilStation.stationName+'</a>'; | |
| 229 | + if(oilStation.stationCode) | |
| 230 | + oilId = oilStation.stationCode; | |
| 231 | + | |
| 232 | + var opt = '<option value="'+oilId+'" class="oil_station_opt">'+oilStation.stationName+'</option>'; | |
| 233 | + $('[name=endStation]', jcForm).prepend(opt).val(oilId).change(); | |
| 234 | + $('[name=startStation]', ccForm).prepend(opt).val(oilId).change(); | |
| 235 | + } | |
| 236 | + else | |
| 237 | + htmlStr = '<a>为'+sch.xlName+'绑定一个停车场</a>'; | |
| 238 | + | |
| 239 | + $('.bind_gas_station_panel', modal).html(htmlStr); | |
| 240 | + $('.bind_gas_station_panel a', modal).on('click', function () { | |
| 241 | + open_modal(folder + '/h_oil_station.html', { | |
| 242 | + sch: sch | |
| 243 | + }, {center: false, bgclose: false, modal: false}); | |
| 244 | + }); | |
| 245 | + }); | |
| 246 | + | |
| 247 | + //根据主任务状态,复子任务 | |
| 248 | + updateTwinsTaskBySch(sch); | |
| 249 | + }); | |
| 250 | + | |
| 251 | + var dataArray = []; | |
| 252 | + var fs = $('form.c_task_form', modal).formValidation({ | |
| 253 | + framework: 'uikit', | |
| 254 | + locale: 'zh_CN' | |
| 255 | + }); | |
| 256 | + fs.on('success.form.fv', function(e) { | |
| 257 | + e.preventDefault(); | |
| 258 | + if($(this).is(':hidden')) | |
| 259 | + return; | |
| 260 | + dataArray.push($.extend($(this).serializeJSON(), getDisabledVal(this) | |
| 261 | + , {remarks: $('#globalRemarks', modal).val(), 'schedule.id': sch.id})); | |
| 262 | + $(this).data('valid', true); | |
| 263 | + | |
| 264 | + if(allValidSuccess()){ | |
| 265 | + var i = 0, rst; | |
| 266 | + (function () { | |
| 267 | + var f = arguments.callee; | |
| 268 | + if(i >= dataArray.length){ | |
| 269 | + UIkit.modal(modal).hide(); | |
| 270 | + $('#history-sch-edit-modal').trigger('init', {id: sch.id}); | |
| 271 | + return; | |
| 272 | + } | |
| 273 | + var data = dataArray[i]; | |
| 274 | + //里程为0的不保存 | |
| 275 | + if(data.mileage==0){ | |
| 276 | + i++; | |
| 277 | + f(); | |
| 278 | + } | |
| 279 | + else{ | |
| 280 | + //营运子任务不写备注 | |
| 281 | + if(data.mileageType == 'service' && !data.destroy) | |
| 282 | + data.remarks = ''; | |
| 283 | + //需要关联的部分主任务属性 | |
| 284 | + data['schedule.xlBm'] = sch.xlBm; | |
| 285 | + data['schedule.xlDir'] = sch.xlDir; | |
| 286 | + gb_common.$post('/childTask/history', data, function (rs) { | |
| 287 | + notify_succ('子任务添加成功'); | |
| 288 | + rst = rs.t; | |
| 289 | + i++; | |
| 290 | + f(); | |
| 291 | + }); | |
| 292 | + } | |
| 293 | + })(); | |
| 294 | + } | |
| 295 | + }); | |
| 296 | + | |
| 297 | + //校验不过 | |
| 298 | + fs.on('err.field.fv', function () { | |
| 299 | + $('#submitChildTaskBtn', modal).removeClass('disabled').removeAttr('disabled'); | |
| 300 | + }); | |
| 301 | + | |
| 302 | + //submit | |
| 303 | + $('#submitChildTaskBtn', modal).on('click', function () { | |
| 304 | + //备注 | |
| 305 | + var rems = $('#globalRemarks', modal).val(); | |
| 306 | + if($.trim(rems) == ''){ | |
| 307 | + notify_err('你必须填写备注!'); | |
| 308 | + return; | |
| 309 | + } | |
| 310 | + | |
| 311 | + //空驶的进场终点名称 | |
| 312 | + if(!oilStation || $('[name=endStation]', jcForm).val() != oilId) | |
| 313 | + $('[name=endStationName]', jcForm).val(''); | |
| 314 | + else | |
| 315 | + $('[name=endStationName]', jcForm).val(oilStation.stationName); | |
| 316 | + | |
| 317 | + //空驶的出场起点名称 | |
| 318 | + if(!oilStation || $('[name=startStation]', ccForm).val() != oilId) | |
| 319 | + $('[name=startStationName]', ccForm).val(''); | |
| 320 | + else | |
| 321 | + $('[name=startStationName]', ccForm).val(oilStation.stationName); | |
| 322 | + | |
| 323 | + | |
| 324 | + //提交表单 | |
| 325 | + $(this).addClass('disabled').attr('disabled','disabled'); | |
| 326 | + dataArray = []; | |
| 327 | + fs.data('valid', false); | |
| 328 | + fs.formValidation('validate'); | |
| 329 | + //fs.submit(); | |
| 330 | + }); | |
| 331 | + | |
| 332 | + //获取表单disabled 项的值 | |
| 333 | + function getDisabledVal(f) { | |
| 334 | + var rs = {}; | |
| 335 | + $('input,select', f).each(function () { | |
| 336 | + if($(this).attr('disabled')){ | |
| 337 | + rs[$(this).attr('name')]=$(this).val(); | |
| 338 | + } | |
| 339 | + }); | |
| 340 | + return rs; | |
| 341 | + } | |
| 342 | + | |
| 343 | + function allValidSuccess() { | |
| 344 | + var flag = true; | |
| 345 | + $('form.c_task_form:visible', modal).each(function (i, f) { | |
| 346 | + if(!$(f).data('valid')){ | |
| 347 | + flag = false; | |
| 348 | + return false; | |
| 349 | + } | |
| 350 | + }); | |
| 351 | + return flag; | |
| 352 | + } | |
| 353 | + | |
| 354 | + function setDefaultVal() { | |
| 355 | + //营运班次 | |
| 356 | + $('[name=startStation]', yyForm).val(sch.qdzCode); | |
| 357 | + $('[name=startStationName]', yyForm).val(sch.qdzName); | |
| 358 | + $('[name=endStation]', yyForm).val(sch.zdzCode); | |
| 359 | + $('[name=endStationName]', yyForm).val(sch.zdzName); | |
| 360 | + $('[name=mileage]', yyForm).val(sch.jhlc); | |
| 361 | + $('[name=startDate]', yyForm).val(sch.fcsjActual==null?sch.dfsj:sch.fcsjActual); | |
| 362 | + $('[name=endDate]', yyForm).val(sch.zdsjActual==null?sch.zdsj:sch.zdsjActual); | |
| 363 | + | |
| 364 | + //设置进场默认值 | |
| 365 | + $('[name=startStation]', jcForm).html(createStationOpts(stationRoutes[sch.xlDir])); | |
| 366 | + $('[name=startDate]', jcForm).val(sch.zdsjActual==null?sch.zdsj:sch.zdsjActual); | |
| 367 | + $('[name=startStation]', jcForm).val(sch.zdzCode); | |
| 368 | + | |
| 369 | + //设置出场默认值 | |
| 370 | + $('[name=endStation]', ccForm).html(createStationOpts(stationRoutes[sch.xlDir])); | |
| 371 | + $('[name=endStation]', ccForm).val(sch.zdzCode); | |
| 372 | + } | |
| 373 | + | |
| 374 | + function createStationOpts(list) { | |
| 375 | + var opts = ''; | |
| 376 | + $.each(list, function () { | |
| 377 | + opts += '<option value="'+this.station.stationCod+'">'+this.stationName+'</option>'; | |
| 378 | + }); | |
| 379 | + return opts; | |
| 380 | + } | |
| 381 | + | |
| 382 | + function reCalcIn() { | |
| 383 | + if(!oilStation || $('[name=endStation]', jcForm).val() != oilId) | |
| 384 | + return; | |
| 385 | + | |
| 386 | + var data; | |
| 387 | + var qdz = $('[name=startStation]', jcForm).find("option:selected").text(); | |
| 388 | + if(qdz == lineInfo.startStationName){ | |
| 389 | + //起点进场 | |
| 390 | + data = { | |
| 391 | + mileage: oilStation.upInMile, | |
| 392 | + time: oilStation.upInTime | |
| 393 | + } | |
| 394 | + } | |
| 395 | + else if(qdz == lineInfo.endStationName){ | |
| 396 | + //终点进场 | |
| 397 | + data = { | |
| 398 | + mileage: oilStation.downInMile, | |
| 399 | + time: oilStation.downInTime | |
| 400 | + } | |
| 401 | + } | |
| 402 | + if(!data) | |
| 403 | + return; | |
| 404 | + | |
| 405 | + $('[name=mileage]', jcForm).val(data.mileage); | |
| 406 | + var st = $('[name=startDate]', jcForm).val(); | |
| 407 | + if(!st) | |
| 408 | + return; | |
| 409 | + var ets = moment(st, 'HH:mm').add(data.time, 'minute').format('HH:mm'); | |
| 410 | + $('[name=endDate]', jcForm).val(ets); | |
| 411 | + | |
| 412 | + //出场时间 + 1 分钟 | |
| 413 | + $('[name=startDate]', ccForm).val(moment(ets, 'HH:mm').add(1, 'minute').format('HH:mm')); | |
| 414 | + } | |
| 415 | + | |
| 416 | + function reCalcOut() { | |
| 417 | + if(!oilStation || $('[name=startStation]', ccForm).val() != oilId) | |
| 418 | + return; | |
| 419 | + | |
| 420 | + var data; | |
| 421 | + var zdz = $('[name=endStation]', ccForm).find("option:selected").text(); | |
| 422 | + if(zdz == lineInfo.startStationName){ | |
| 423 | + //出场到起点 | |
| 424 | + data = { | |
| 425 | + mileage: oilStation.upOutMile, | |
| 426 | + time: oilStation.upOutTime | |
| 427 | + } | |
| 428 | + } | |
| 429 | + else if(zdz == lineInfo.endStationName){ | |
| 430 | + //出场到终点 | |
| 431 | + data = { | |
| 432 | + mileage: oilStation.downOutMile, | |
| 433 | + time: oilStation.downOutTime | |
| 434 | + } | |
| 435 | + } | |
| 436 | + if(!data) | |
| 437 | + return; | |
| 438 | + | |
| 439 | + $('[name=mileage]', ccForm).val(data.mileage); | |
| 440 | + var st = $('[name=startDate]', ccForm).val(); | |
| 441 | + if(!st) | |
| 442 | + return; | |
| 443 | + var ets = moment(st, 'HH:mm').add(data.time, 'minute').format('HH:mm'); | |
| 444 | + $('[name=endDate]', ccForm).val(ets); | |
| 445 | + } | |
| 446 | + | |
| 447 | + //tags 点击 | |
| 448 | + $('.inout_reason_tags>span', modal).on('click', function () { | |
| 449 | + if($(this).hasClass('active')){ | |
| 450 | + $(this).removeClass('active'); | |
| 451 | + return; | |
| 452 | + } | |
| 453 | + | |
| 454 | + var e = $('#globalRemarks', modal); | |
| 455 | + e.val(e.val() + $(this).text() + ','); | |
| 456 | + | |
| 457 | + $('.inout_reason_tags>span.active', modal).removeClass('active'); | |
| 458 | + $(this).addClass('active'); | |
| 459 | + }); | |
| 460 | + | |
| 461 | + | |
| 462 | + function updateTwinsTaskBySch(sch) { | |
| 463 | + //主任务是烂班 | |
| 464 | + if(sch.destroy){ | |
| 465 | + var f = $('.twins_task_form', modal); | |
| 466 | + $('.uk-badge', f).addClass('uk-badge-danger').text('烂班'); | |
| 467 | + $('.uk-panel-box', f).removeClass('uk-panel-box-primary'); | |
| 468 | + f.prepend('<input type="hidden" name="destroy" value="true">'); | |
| 469 | + $('[name=mileage]', f).val(sch.jhlcOrig); | |
| 470 | + | |
| 471 | + //进场起点 | |
| 472 | + $('[name=startStation]', jcForm).val(sch.qdzCode); | |
| 473 | + //出场终点 | |
| 474 | + $('[name=endStation]', ccForm).val(sch.qdzCode); | |
| 475 | + } | |
| 476 | + } | |
| 477 | + })(); | |
| 478 | + </script> | |
| 479 | +</div> | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_add_sub_task_other.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal ct_move_modal" id="add-sub-task-other-modal"> | |
| 2 | + <div class="uk-modal-dialog" style="width: 635px;"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>自定义子任务</h2></div> | |
| 6 | + <form class="uk-form uk-form-horizontal"> | |
| 7 | + </form> | |
| 8 | + </div> | |
| 9 | + | |
| 10 | + <script id="sub-task-other-form-temp" type="text/html"> | |
| 11 | + <input type="hidden" value="{{sch.id}}" name="schedule.id"> | |
| 12 | + <div class="uk-grid"> | |
| 13 | + <div class="uk-width-1-1"> | |
| 14 | + <div class="uk-form-row"> | |
| 15 | + <label class="uk-form-label">班次类型</label> | |
| 16 | + <div class="uk-form-controls"> | |
| 17 | + <select class="form-control" name="type1" style="width: 65px;"> | |
| 18 | + <option>正常</option> | |
| 19 | + <option>临加</option> | |
| 20 | + </select> | |
| 21 | + <select class="form-control nt-dictionary" name="type2" data-group=ChildTaskType | |
| 22 | + style="width: 126px;;"></select> | |
| 23 | + </div> | |
| 24 | + </div> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | + <div class="uk-grid"> | |
| 28 | + <div class="uk-width-1-2"> | |
| 29 | + <div class="uk-form-row"> | |
| 30 | + <label class="uk-form-label">起点 </label> | |
| 31 | + <div class="uk-form-controls"> | |
| 32 | + <select name="startStation" required></select> | |
| 33 | + </div> | |
| 34 | + </div> | |
| 35 | + </div> | |
| 36 | + <div class="uk-width-1-2"> | |
| 37 | + <div class="uk-form-row"> | |
| 38 | + <label class="uk-form-label">终点</label> | |
| 39 | + <div class="uk-form-controls"> | |
| 40 | + <select name="endStation" required></select> | |
| 41 | + </div> | |
| 42 | + </div> | |
| 43 | + </div> | |
| 44 | + </div> | |
| 45 | + | |
| 46 | + <div class="uk-grid"> | |
| 47 | + <div class="uk-width-1-2"> | |
| 48 | + <div class="uk-form-row"> | |
| 49 | + <label class="uk-form-label">里程类型</label> | |
| 50 | + <div class="uk-form-controls"> | |
| 51 | + <select class="form-control nt-dictionary" required name="mileageType" | |
| 52 | + data-group="MileageType"></select> | |
| 53 | + </div> | |
| 54 | + </div> | |
| 55 | + </div> | |
| 56 | + <div class="uk-width-1-2"> | |
| 57 | + <div class="uk-form-row"> | |
| 58 | + <label class="uk-form-label">公里数</label> | |
| 59 | + <div class="uk-form-controls"> | |
| 60 | + <input class="form-control" name="mileage" max=222 data-fv-lessthan-inclusive="false" required> | |
| 61 | + </div> | |
| 62 | + </div> | |
| 63 | + </div> | |
| 64 | + </div> | |
| 65 | + | |
| 66 | + <div class="uk-grid"> | |
| 67 | + <div class="uk-width-1-2"> | |
| 68 | + <div class="uk-form-row"> | |
| 69 | + <label class="uk-form-label">开始时间</label> | |
| 70 | + <div class="uk-form-controls"> | |
| 71 | + <input name="startDate" value="{{sch.fcsj}}" type="time" required> | |
| 72 | + </div> | |
| 73 | + </div> | |
| 74 | + </div> | |
| 75 | + <div class="uk-width-1-2"> | |
| 76 | + <div class="uk-form-row"> | |
| 77 | + <label class="uk-form-label">结束时间</label> | |
| 78 | + <div class="uk-form-controls"> | |
| 79 | + <input name="endDate" value="{{sch.zdsj}}" type="time" required> | |
| 80 | + </div> | |
| 81 | + </div> | |
| 82 | + </div> | |
| 83 | + </div> | |
| 84 | + | |
| 85 | + <div class="uk-grid"> | |
| 86 | + <div class="uk-width-1-2"> | |
| 87 | + <div class="uk-form-row" style="padding-top: 5px;"> | |
| 88 | + <label class="uk-form-label"></label> | |
| 89 | + <div class="uk-form-controls"> | |
| 90 | + <label> | |
| 91 | + <input type="checkbox" value=1 name="destroy" class="i-cbox"> 是否烂班 | |
| 92 | + </label> | |
| 93 | + </div> | |
| 94 | + </div> | |
| 95 | + </div> | |
| 96 | + <div class="uk-width-1-2 destroy_reason_wrap" style="display: none;"> | |
| 97 | + <div class="uk-form-row"> | |
| 98 | + <label class="uk-form-label">烂班原因</label> | |
| 99 | + <div class="uk-form-controls"> | |
| 100 | + <select class="form-control" name="destroyReason"> | |
| 101 | + <option value="">请选择...</option> | |
| 102 | + {{each adjustExps as exp i}} | |
| 103 | + <option value="{{exp}}">{{exp}}</option> | |
| 104 | + {{/each}} | |
| 105 | + </select> | |
| 106 | + </div> | |
| 107 | + </div> | |
| 108 | + </div> | |
| 109 | + </div> | |
| 110 | + | |
| 111 | + <div class="uk-grid"> | |
| 112 | + <div class="uk-width-1-1"> | |
| 113 | + <div class="uk-form-row ct-stacked"> | |
| 114 | + <div class="uk-form-controls" style="margin-top: 5px;"> | |
| 115 | + <textarea id="form-s-t" cols="30" rows="5" name="remarks" data-fv-stringlength="true" | |
| 116 | + data-fv-stringlength-max="50" placeholder="备注,不超过50个字符"></textarea> | |
| 117 | + </div> | |
| 118 | + </div> | |
| 119 | + </div> | |
| 120 | + </div> | |
| 121 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 122 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 123 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 124 | + </div> | |
| 125 | + </script> | |
| 126 | + | |
| 127 | + <script> | |
| 128 | + (function () { | |
| 129 | + var modal = '#add-sub-task-other-modal', | |
| 130 | + sch, stationRoutes, parks, information; | |
| 131 | + var adjustExps = ['配车', '保养', '故障', '肇事', '路阻', '纠纷', '缺人', '客稀', '缺车', '气候', '援外', '吊慢', '抽减', '其他']; | |
| 132 | + $(modal).on('init', function (e, data) { | |
| 133 | + e.stopPropagation(); | |
| 134 | + sch = data.sch; | |
| 135 | + var formHtml = template('sub-task-other-form-temp', {sch: sch, adjustExps: adjustExps}); | |
| 136 | + $('form', modal).html(formHtml); | |
| 137 | + //字典转换 | |
| 138 | + dictionaryUtils.transformDom($('.nt-dictionary', modal)); | |
| 139 | + | |
| 140 | + //站点路由 | |
| 141 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) { | |
| 142 | + return a.stationRouteCode - b.stationRouteCode; | |
| 143 | + }), 'directions'); | |
| 144 | + //停车场 | |
| 145 | + $.get('/basic/parks', function (rs) { | |
| 146 | + parks = rs; | |
| 147 | + }); | |
| 148 | + //线路标准 | |
| 149 | + information = gb_data_basic.getLineInformation(sch.xlBm); | |
| 150 | + | |
| 151 | + //submit | |
| 152 | + var f = $('form', modal).formValidation(gb_form_validation_opts); | |
| 153 | + f.on('success.form.fv', function (e) { | |
| 154 | + disabled_submit_btn(this); | |
| 155 | + e.preventDefault(); | |
| 156 | + var data = $(this).serializeJSON(); | |
| 157 | + | |
| 158 | + //需要关联的部分主任务属性 | |
| 159 | + data['schedule.xlBm'] = sch.xlBm; | |
| 160 | + data['schedule.xlDir'] = sch.xlDir; | |
| 161 | + gb_common.$post('/childTask/history', data, function (rs) { | |
| 162 | + notify_succ('子任务添加成功'); | |
| 163 | + $('#history-sch-edit-modal').trigger('init', {id: sch.id}); | |
| 164 | + UIkit.modal(modal).hide(); | |
| 165 | + }); | |
| 166 | + }); | |
| 167 | + | |
| 168 | + //班次类型 | |
| 169 | + $('[name=type2]', f).on('change', function () { | |
| 170 | + var routes = stationRoutes[sch.xlDir] | |
| 171 | + , lastCode = routes[routes.length - 1].stationCode | |
| 172 | + , opts = '', park_opts = ''; | |
| 173 | + //station options | |
| 174 | + $.each(routes, function () { | |
| 175 | + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>' | |
| 176 | + }); | |
| 177 | + //park options | |
| 178 | + for (var code in parks) | |
| 179 | + park_opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 180 | + | |
| 181 | + var qdz = $('[name=startStation]', f), zdz = $('[name=endStation]', f), mType = $('[name=mileageType]', f); | |
| 182 | + switch ($(this).val()) { | |
| 183 | + case '3'://出场 | |
| 184 | + qdz.html(park_opts).val(information.carPark); | |
| 185 | + zdz.html(opts); | |
| 186 | + mType.val('empty'); | |
| 187 | + break; | |
| 188 | + case '2'://进场 | |
| 189 | + qdz.html(opts); | |
| 190 | + zdz.html(park_opts).val(information.carPark); | |
| 191 | + mType.val('empty'); | |
| 192 | + break; | |
| 193 | + default: | |
| 194 | + qdz.html(opts); | |
| 195 | + zdz.html(opts).val(lastCode); | |
| 196 | + mType.val('service'); | |
| 197 | + | |
| 198 | + } | |
| 199 | + }); | |
| 200 | + | |
| 201 | + //是否烂班 | |
| 202 | + $('[name=destroy]', f).on('click', function () { | |
| 203 | + console.log(this, this.checked); | |
| 204 | + if (this.checked) { | |
| 205 | + $('.destroy_reason_wrap', modal).show(); | |
| 206 | + } | |
| 207 | + else { | |
| 208 | + $('.destroy_reason_wrap', modal).hide(); | |
| 209 | + } | |
| 210 | + }); | |
| 211 | + | |
| 212 | + $('[name=destroyReason]', f).on('change', function () { | |
| 213 | + var rem = $('[name=remarks]', f); | |
| 214 | + rem.val(rem.val() + $(this).val() + ','); | |
| 215 | + }); | |
| 216 | + }); | |
| 217 | + })(); | |
| 218 | + </script> | |
| 219 | +</div> | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_add_sub_task_outpark.html
0 → 100644
| 1 | +<div class="uk-modal ct_move_modal" id="add-sub-task-inpark-modal"> | |
| 2 | + <div class="uk-modal-dialog"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>出场子任务</h2></div> | |
| 6 | + | |
| 7 | + <div style="width: 100%;padding-left: 1%;"> | |
| 8 | + <div class="sub-task-card"> | |
| 9 | + <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | |
| 10 | + <div class="uk-panel-badge uk-badge uk-badge-default">空驶</div> | |
| 11 | + <h3 class="uk-panel-title">出场</h3> | |
| 12 | + <form class="uk-form uk-form-horizontal inpark_form" empty_form> | |
| 13 | + <input type="hidden" name="type2" value="3"> | |
| 14 | + <input type="hidden" name="mileageType" value="empty"> | |
| 15 | + <div class="uk-grid"> | |
| 16 | + <div class="uk-width-3-10"> | |
| 17 | + <div class="uk-form-row"> | |
| 18 | + <label class="uk-form-label">班次类型 </label> | |
| 19 | + </div> | |
| 20 | + </div> | |
| 21 | + <div class="uk-width-7-10 pl5"> | |
| 22 | + <select name="type1" class="ct_focus"> | |
| 23 | + <option value="正常">正常</option> | |
| 24 | + <option value="临加">临加</option> | |
| 25 | + </select> | |
| 26 | + </div> | |
| 27 | + </div> | |
| 28 | + <div class="uk-grid"> | |
| 29 | + <div class="uk-width-3-10"> | |
| 30 | + <div class="uk-form-row"> | |
| 31 | + <label class="uk-form-label">起点 </label> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + <div class="uk-width-7-10 pl5"> | |
| 35 | + <select name="startStation"></select> | |
| 36 | + </div> | |
| 37 | + </div> | |
| 38 | + <div class="uk-grid"> | |
| 39 | + <div class="uk-width-3-10"> | |
| 40 | + <div class="uk-form-row"> | |
| 41 | + <label class="uk-form-label" disabled>终点 </label> | |
| 42 | + </div> | |
| 43 | + </div> | |
| 44 | + <div class="uk-width-7-10 pl5"> | |
| 45 | + <select name="endStation" class="ct_focus"></select> | |
| 46 | + </div> | |
| 47 | + </div> | |
| 48 | + <div class="uk-grid"> | |
| 49 | + <div class="uk-width-3-10"> | |
| 50 | + <div class="uk-form-row"> | |
| 51 | + <label class="uk-form-label">空驶里程</label> | |
| 52 | + </div> | |
| 53 | + </div> | |
| 54 | + <div class="uk-width-7-10 pl5"> | |
| 55 | + <input type="number" step="0.01" name="mileage" required style="width: calc(100% - 62px);"> | |
| 56 | + <a style="font-size: 12px;color: grey;cursor: default;" target="_blank" | |
| 57 | + class="linkToLineInfo">线路标准</a> | |
| 58 | + </div> | |
| 59 | + </div> | |
| 60 | + <div class="uk-grid"> | |
| 61 | + <div class="uk-width-3-10"> | |
| 62 | + <div class="uk-form-row"> | |
| 63 | + <label class="uk-form-label">开始时间</label> | |
| 64 | + </div> | |
| 65 | + </div> | |
| 66 | + <div class="uk-width-7-10 pl5"> | |
| 67 | + <input type="time" name="startDate" required> | |
| 68 | + </div> | |
| 69 | + </div> | |
| 70 | + <div class="uk-grid"> | |
| 71 | + <div class="uk-width-3-10"> | |
| 72 | + <div class="uk-form-row"> | |
| 73 | + <label class="uk-form-label">结束时间</label> | |
| 74 | + </div> | |
| 75 | + </div> | |
| 76 | + <div class="uk-width-7-10 pl5"> | |
| 77 | + <input type="time" name="endDate" required> | |
| 78 | + </div> | |
| 79 | + </div> | |
| 80 | + </form> | |
| 81 | + </div> | |
| 82 | + </div> | |
| 83 | + | |
| 84 | + <div class="sub-task-card"> | |
| 85 | + <div class="uk-panel uk-panel-box uk-panel-box-primary twins_task_panel"> | |
| 86 | + <div class="uk-panel-badge uk-badge">营运</div> | |
| 87 | + <h3 class="uk-panel-title">线路上站点间</h3> | |
| 88 | + <form class="uk-form uk-form-horizontal inpark_form" service_form> | |
| 89 | + <input type="hidden" name="type2" value="1"> | |
| 90 | + <input type="hidden" name="mileageType" value="service"> | |
| 91 | + <div class="uk-grid"> | |
| 92 | + <div class="uk-width-3-10"> | |
| 93 | + <div class="uk-form-row"> | |
| 94 | + <label class="uk-form-label">班次类型 </label> | |
| 95 | + </div> | |
| 96 | + </div> | |
| 97 | + <div class="uk-width-7-10 pl5"> | |
| 98 | + <select name="type1" class="ct_focus" disabled> | |
| 99 | + <option value="正常">正常</option> | |
| 100 | + <option value="临加">临加</option> | |
| 101 | + </select> | |
| 102 | + </div> | |
| 103 | + </div> | |
| 104 | + <div class="uk-grid"> | |
| 105 | + <div class="uk-width-3-10"> | |
| 106 | + <div class="uk-form-row"> | |
| 107 | + <label class="uk-form-label">起点 </label> | |
| 108 | + </div> | |
| 109 | + </div> | |
| 110 | + <div class="uk-width-7-10 pl5"> | |
| 111 | + <select name="startStation" disabled></select> | |
| 112 | + </div> | |
| 113 | + </div> | |
| 114 | + <div class="uk-grid"> | |
| 115 | + <div class="uk-width-3-10"> | |
| 116 | + <div class="uk-form-row"> | |
| 117 | + <label class="uk-form-label">终点 </label> | |
| 118 | + </div> | |
| 119 | + </div> | |
| 120 | + <div class="uk-width-7-10 pl5"> | |
| 121 | + <select name="endStation" class="ct_focus" disabled></select> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + <div class="uk-grid"> | |
| 125 | + <div class="uk-width-3-10"> | |
| 126 | + <div class="uk-form-row"> | |
| 127 | + <label class="uk-form-label">营运里程</label> | |
| 128 | + </div> | |
| 129 | + </div> | |
| 130 | + <div class="uk-width-7-10 pl5"> | |
| 131 | + <input type="number" step="0.01" name="mileage" disabled> | |
| 132 | + </div> | |
| 133 | + </div> | |
| 134 | + <div class="uk-grid"> | |
| 135 | + <div class="uk-width-3-10"> | |
| 136 | + <div class="uk-form-row"> | |
| 137 | + <label class="uk-form-label">开始时间</label> | |
| 138 | + </div> | |
| 139 | + </div> | |
| 140 | + <div class="uk-width-7-10 pl5"> | |
| 141 | + <input type="time" name="startDate" disabled> | |
| 142 | + </div> | |
| 143 | + </div> | |
| 144 | + <div class="uk-grid"> | |
| 145 | + <div class="uk-width-3-10"> | |
| 146 | + <div class="uk-form-row"> | |
| 147 | + <label class="uk-form-label">结束时间</label> | |
| 148 | + </div> | |
| 149 | + </div> | |
| 150 | + <div class="uk-width-7-10 pl5"> | |
| 151 | + <input type="time" name="endDate" disabled> | |
| 152 | + </div> | |
| 153 | + </div> | |
| 154 | + </form> | |
| 155 | + </div> | |
| 156 | + </div> | |
| 157 | + | |
| 158 | + <form class="uk-form" style="margin-top: 15px; padding: 0 10px 0 0;"> | |
| 159 | + <textarea placeholder="备注" style="width: 100%;height: 70px;" id="globalRemarks"></textarea> | |
| 160 | + </form> | |
| 161 | + </div> | |
| 162 | + | |
| 163 | + <div class="uk-modal-footer uk-text-right"> | |
| 164 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 165 | + <button type="button" class="uk-button uk-button-primary" id="submitChildTaskBtn">提交子任务</button> | |
| 166 | + </div> | |
| 167 | + </div> | |
| 168 | + | |
| 169 | + <div class="ct-bottom-drawer"> | |
| 170 | + <div class="ct-bottom-drawer-body"></div> | |
| 171 | + </div> | |
| 172 | + | |
| 173 | + <script id="sub-task-inpark-form-temp" type="text/html"> | |
| 174 | + </script> | |
| 175 | + | |
| 176 | + <script> | |
| 177 | + (function () { | |
| 178 | + var modal = '#add-sub-task-inpark-modal', | |
| 179 | + serviceForm = $('form[service_form]', modal), | |
| 180 | + emptyForm = $('form[empty_form]', modal), | |
| 181 | + sch, stationRoutes, parks, information, esCode; | |
| 182 | + $(modal).on('init', function (e, data) { | |
| 183 | + e.stopPropagation(); | |
| 184 | + sch = data.sch; | |
| 185 | + $('.linkToLineInfo', modal).attr('href', '/pages/base/lineinformation/list.html?no=' + gb_data_basic.codeToLine[sch.xlBm].id); | |
| 186 | + | |
| 187 | + //站点路由 | |
| 188 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) { | |
| 189 | + return a.stationRouteCode - b.stationRouteCode; | |
| 190 | + }), 'directions')[sch.xlDir]; | |
| 191 | + //空驶起点(停车场) | |
| 192 | + $.get('/basic/parks', function (rs) { | |
| 193 | + parks = rs; | |
| 194 | + var opts = ''; | |
| 195 | + for (var code in parks) { | |
| 196 | + opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 197 | + } | |
| 198 | + $('select[name=startStation]', emptyForm).html(opts).val(information.carPark); | |
| 199 | + | |
| 200 | + //设置默认值 | |
| 201 | + setDefaultVal(); | |
| 202 | + | |
| 203 | + //根据主任务状态,复子任务 | |
| 204 | + updateTwinsTaskBySch(sch); | |
| 205 | + }); | |
| 206 | + //线路标准 | |
| 207 | + information = gb_data_basic.getLineInformation(sch.xlBm); | |
| 208 | + | |
| 209 | + //出场开始时间改变 | |
| 210 | + $('input[name=startDate]', emptyForm).on('change input', function () { | |
| 211 | + var st = moment($(this).val(), 'HH:mm') | |
| 212 | + , time = getOutTime(); | |
| 213 | + if (!time) | |
| 214 | + return; | |
| 215 | + | |
| 216 | + var ets = st.add(time, 'minute').format('HH:mm'); | |
| 217 | + $('input[name=endDate]', emptyForm).val(ets); | |
| 218 | + }); | |
| 219 | + //出场结束时间改变 | |
| 220 | + $('input[name=endDate]', emptyForm).on('change input', function () { | |
| 221 | + var et = moment($(this).val(), 'HH:mm'), time = getOutTime(); | |
| 222 | + if (!time) | |
| 223 | + return; | |
| 224 | + | |
| 225 | + var ets = et.subtract(time, 'minute').format('HH:mm'); | |
| 226 | + $('input[name=startDate]', emptyForm).val(ets); | |
| 227 | + }); | |
| 228 | + | |
| 229 | + var dataArray = []; | |
| 230 | + var fs = $('form.inpark_form', modal).formValidation({ | |
| 231 | + framework: 'uikit', | |
| 232 | + locale: 'zh_CN' | |
| 233 | + }); | |
| 234 | + fs.on('success.form.fv', function (e) { | |
| 235 | + e.preventDefault(); | |
| 236 | + if ($(this).is(':hidden')) | |
| 237 | + return; | |
| 238 | + dataArray.push($.extend($(this).serializeJSON(), getDisabledVal(this) | |
| 239 | + , {remarks: $('#globalRemarks', modal).val(), 'schedule.id': sch.id})); | |
| 240 | + $(this).data('valid', true); | |
| 241 | + | |
| 242 | + if (allValidSuccess()) { | |
| 243 | + var i = 0,rst; | |
| 244 | + (function () { | |
| 245 | + var f = arguments.callee; | |
| 246 | + if (i >= dataArray.length) { | |
| 247 | + UIkit.modal(modal).hide(); | |
| 248 | + $('#history-sch-edit-modal').trigger('init', {id: sch.id}); | |
| 249 | + return; | |
| 250 | + } | |
| 251 | + var data = dataArray[i]; | |
| 252 | + //营运子任务不写备注 | |
| 253 | + if(data.mileageType == 'service' && !data.destroy) | |
| 254 | + data.remarks = ''; | |
| 255 | + //需要关联的部分主任务属性 | |
| 256 | + data['schedule.xlBm'] = sch.xlBm; | |
| 257 | + data['schedule.xlDir'] = sch.xlDir; | |
| 258 | + gb_common.$post('/childTask/history', data, function (rs) { | |
| 259 | + notify_succ('子任务添加成功'); | |
| 260 | + rst = rs.t; | |
| 261 | + i++; | |
| 262 | + f(); | |
| 263 | + }); | |
| 264 | + })(); | |
| 265 | + } | |
| 266 | + }); | |
| 267 | + | |
| 268 | + //校验不过 | |
| 269 | + fs.on('err.field.fv', function () { | |
| 270 | + $('#submitChildTaskBtn', modal).removeClass('disabled').removeAttr('disabled'); | |
| 271 | + }); | |
| 272 | + | |
| 273 | + //submit | |
| 274 | + $('#submitChildTaskBtn', modal).on('click', function () { | |
| 275 | + $(this).addClass('disabled').attr('disabled', 'disabled'); | |
| 276 | + dataArray = []; | |
| 277 | + fs.data('valid', false); | |
| 278 | + fs.formValidation('validate'); | |
| 279 | + //fs.submit(); | |
| 280 | + }); | |
| 281 | + }); | |
| 282 | + | |
| 283 | + function getOutTime() { | |
| 284 | + if (information.carPark != $('select[name=startStation]', emptyForm).val()) | |
| 285 | + return null; | |
| 286 | + | |
| 287 | + if (sch.xlDir == 0) | |
| 288 | + return information.upOutTimer; | |
| 289 | + else if (sch.xlDir == 1) | |
| 290 | + return information.downOutTimer; | |
| 291 | + } | |
| 292 | + | |
| 293 | + function allValidSuccess() { | |
| 294 | + var flag = true; | |
| 295 | + $('form.inpark_form:visible', modal).each(function (i, f) { | |
| 296 | + if (!$(f).data('valid')) { | |
| 297 | + flag = false; | |
| 298 | + return false; | |
| 299 | + } | |
| 300 | + }); | |
| 301 | + return flag; | |
| 302 | + } | |
| 303 | + | |
| 304 | + //获取表单disabled 项的值 | |
| 305 | + function getDisabledVal(f) { | |
| 306 | + var rs = {}; | |
| 307 | + $('input,select', f).each(function () { | |
| 308 | + if ($(this).attr('disabled')) { | |
| 309 | + rs[$(this).attr('name')] = $(this).val(); | |
| 310 | + } | |
| 311 | + }); | |
| 312 | + return rs; | |
| 313 | + } | |
| 314 | + | |
| 315 | + function setDefaultVal() { | |
| 316 | + var routeOpts = ''; | |
| 317 | + $.each(stationRoutes, function () { | |
| 318 | + routeOpts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>'; | |
| 319 | + }); | |
| 320 | + esCode = stationRoutes[stationRoutes.length - 1].stationCode; | |
| 321 | + | |
| 322 | + //营运起终点 | |
| 323 | + $('select[name=startStation]', serviceForm).html(routeOpts).val(sch.qdzCode); | |
| 324 | + $('select[name=endStation]', serviceForm).html(routeOpts).val(sch.zdzCode); | |
| 325 | + //营运开始结束时间 | |
| 326 | + $('input[name=startDate]', serviceForm).val(sch.dfsj); | |
| 327 | + $('input[name=endDate]', serviceForm).val(sch.zdsj); | |
| 328 | + //营运里程 | |
| 329 | + $('input[name=mileage]', serviceForm).val(sch.jhlc); | |
| 330 | + //营运班次类型 | |
| 331 | + $('select[name=type1]', serviceForm).val(sch['sflj'] ? '临加' : '正常'); | |
| 332 | + | |
| 333 | + | |
| 334 | + //空驶终点 | |
| 335 | + $('select[name=endStation]', emptyForm).html(routeOpts).val(sch.qdzCode); | |
| 336 | + //出场结束时间 | |
| 337 | + var eDate = moment(sch.dfsj, 'HH:mm').subtract(5, 'minute').format('HH:mm'); | |
| 338 | + $('input[name=endDate]', emptyForm).val(eDate).trigger('change'); | |
| 339 | + //空驶里程 | |
| 340 | + $('input[name=mileage]', emptyForm).val(sch.xlDir == 0 ? information.upOutMileage : information.downOutMileage); | |
| 341 | + } | |
| 342 | + | |
| 343 | + | |
| 344 | + function updateTwinsTaskBySch(sch) { | |
| 345 | + //主任务是烂班 | |
| 346 | + if(sch.destroy){ | |
| 347 | + serviceForm.prepend('<input type="hidden" name="destroy" value="true">'); | |
| 348 | + $('.twins_task_panel .uk-badge', modal).addClass('uk-badge-danger').text('烂班'); | |
| 349 | + $('[name=mileage]', serviceForm).val(sch.jhlcOrig).attr('disabled', 'disabled'); | |
| 350 | + } | |
| 351 | + } | |
| 352 | + })(); | |
| 353 | + </script> | |
| 354 | +</div> | |
| 0 | 355 | \ No newline at end of file | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_add_temp_sch.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal ct_move_modal" id="schedule-addsch-modal"> | |
| 2 | + <div class="uk-modal-dialog" style="width: 800px;"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>新增临加班次</h2></div> | |
| 6 | + | |
| 7 | + <div class="uk-grid"> | |
| 8 | + <div class="uk-width-1-4"> | |
| 9 | + <ul data-uk-switcher="{connect:'#tempScheduleContent'}" class="uk-nav uk-nav-side left_tabs_lg" > | |
| 10 | + <li data-handle="normal"><a>1、临加班次</a></li> | |
| 11 | + <li data-handle="toAndFro"><a>2、往返</a></li> | |
| 12 | + <li data-handle="parkToPark"><a>3、场到场</a></li> | |
| 13 | + </ul> | |
| 14 | + </div> | |
| 15 | + <div class="uk-width-3-4"> | |
| 16 | + <ul id="tempScheduleContent" class="uk-switcher"> | |
| 17 | + <li class="normalCont"></li> | |
| 18 | + <li class="toAndFroCont"></li> | |
| 19 | + <li class="parkToParkCont"></li> | |
| 20 | + </ul> | |
| 21 | + </div> | |
| 22 | + </div> | |
| 23 | + </div> | |
| 24 | + | |
| 25 | + <!-- 普通单程临加班次 --> | |
| 26 | + <script id="add_normal_sch-form-temp" type="text/html"> | |
| 27 | + <form class="uk-form uk-form-horizontal"> | |
| 28 | + <div class="uk-grid"> | |
| 29 | + <div class="uk-width-1-2"> | |
| 30 | + <div class="uk-form-row"> | |
| 31 | + <label class="uk-form-label">班次类型</label> | |
| 32 | + <div class="uk-form-controls"> | |
| 33 | + <select class="form-control nt-dictionary" name="bcType" data-code="{{bcType}}" | |
| 34 | + data-group=ScheduleType></select> | |
| 35 | + </div> | |
| 36 | + </div> | |
| 37 | + </div> | |
| 38 | + <div class="uk-width-1-2"> | |
| 39 | + <div class="uk-form-row"> | |
| 40 | + <label class="uk-form-label">上下行</label> | |
| 41 | + <div class="uk-form-controls"> | |
| 42 | + <select name="xlDir"> | |
| 43 | + <option value="0">上行</option> | |
| 44 | + <option value="1">下行</option> | |
| 45 | + </select> | |
| 46 | + </div> | |
| 47 | + </div> | |
| 48 | + </div> | |
| 49 | + </div> | |
| 50 | + <div class="uk-grid"> | |
| 51 | + <div class="uk-width-1-2"> | |
| 52 | + <div class="uk-form-row"> | |
| 53 | + <label class="uk-form-label">起点站</label> | |
| 54 | + <div class="uk-form-controls"> | |
| 55 | + <select name="qdzCode" required> | |
| 56 | + </select> | |
| 57 | + </div> | |
| 58 | + </div> | |
| 59 | + </div> | |
| 60 | + <div class="uk-width-1-2"> | |
| 61 | + <div class="uk-form-row"> | |
| 62 | + <label class="uk-form-label">终点站</label> | |
| 63 | + <div class="uk-form-controls"> | |
| 64 | + <select name="zdzCode" required> | |
| 65 | + </select> | |
| 66 | + </div> | |
| 67 | + </div> | |
| 68 | + </div> | |
| 69 | + </div> | |
| 70 | + <div class="uk-grid"> | |
| 71 | + <div class="uk-width-1-2"> | |
| 72 | + <div class="uk-form-row"> | |
| 73 | + <label class="uk-form-label">开始时间</label> | |
| 74 | + <div class="uk-form-controls"> | |
| 75 | + <input type="time" value="{{zdsj}}" name="fcsj" required> | |
| 76 | + </div> | |
| 77 | + </div> | |
| 78 | + </div> | |
| 79 | + <div class="uk-width-1-2"> | |
| 80 | + <div class="uk-form-row"> | |
| 81 | + <label class="uk-form-label">结束时间</label> | |
| 82 | + <div class="uk-form-controls"> | |
| 83 | + <input type="time" name="zdsj" required> | |
| 84 | + </div> | |
| 85 | + </div> | |
| 86 | + </div> | |
| 87 | + </div> | |
| 88 | + <div class="uk-grid"> | |
| 89 | + <div class="uk-width-1-2"> | |
| 90 | + <div class="uk-form-row"> | |
| 91 | + <label class="uk-form-label">车辆</label> | |
| 92 | + <div class="uk-form-controls"> | |
| 93 | + <div class="uk-autocomplete uk-form car-autocom"> | |
| 94 | + <input type="text" value="{{clZbh}}" name="clZbh" required> | |
| 95 | + </div> | |
| 96 | + </div> | |
| 97 | + </div> | |
| 98 | + </div> | |
| 99 | + <div class="uk-width-1-2"> | |
| 100 | + <div class="uk-form-row"> | |
| 101 | + <label class="uk-form-label">里程</label> | |
| 102 | + <div class="uk-form-controls"> | |
| 103 | + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" | |
| 104 | + required> | |
| 105 | + </div> | |
| 106 | + </div> | |
| 107 | + </div> | |
| 108 | + </div> | |
| 109 | + <div class="uk-grid"> | |
| 110 | + <div class="uk-width-1-2"> | |
| 111 | + <div class="uk-form-row"> | |
| 112 | + <label class="uk-form-label">驾驶员</label> | |
| 113 | + <div class="uk-form-controls"> | |
| 114 | + <div class="uk-autocomplete uk-form jsy-autocom"> | |
| 115 | + <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> | |
| 116 | + </div> | |
| 117 | + </div> | |
| 118 | + </div> | |
| 119 | + </div> | |
| 120 | + <div class="uk-width-1-2"> | |
| 121 | + <div class="uk-form-row"> | |
| 122 | + <label class="uk-form-label">售票员</label> | |
| 123 | + <div class="uk-form-controls"> | |
| 124 | + <div class="uk-autocomplete uk-form spy-autocom"> | |
| 125 | + <input type="text" name="spy" value="{{sGh}}/{{sName}}"> | |
| 126 | + </div> | |
| 127 | + </div> | |
| 128 | + </div> | |
| 129 | + </div> | |
| 130 | + </div> | |
| 131 | + <div class="uk-grid"> | |
| 132 | + <div class="uk-width-1-1"> | |
| 133 | + <div class="uk-form-row"> | |
| 134 | + <label class="uk-form-label">备注</label> | |
| 135 | + <div class="uk-form-controls"> | |
| 136 | + <div class="uk-autocomplete uk-form remarks-autocom"> | |
| 137 | + <input type="text" name="remarks"> | |
| 138 | + </div> | |
| 139 | + </div> | |
| 140 | + </div> | |
| 141 | + </div> | |
| 142 | + </div> | |
| 143 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 144 | + <span class="ct_line_lp_badge" ></span> | |
| 145 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 146 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 147 | + </div> | |
| 148 | + </form> | |
| 149 | + </script> | |
| 150 | + | |
| 151 | + <!-- 线路上往返临加班次 --> | |
| 152 | + <script id="add_toAndFro_sch-form-temp" type="text/html"> | |
| 153 | + <form class="uk-form uk-form-horizontal one_form"> | |
| 154 | + <div class="uk-grid"> | |
| 155 | + <div class="uk-width-1-2"> | |
| 156 | + <div class="uk-form-row"> | |
| 157 | + <label class="uk-form-label">班次类型</label> | |
| 158 | + <div class="uk-form-controls"> | |
| 159 | + <select class="form-control nt-dictionary" name="bcType" data-code="{{bcType}}" | |
| 160 | + data-group=ScheduleType></select> | |
| 161 | + </div> | |
| 162 | + </div> | |
| 163 | + </div> | |
| 164 | + <div class="uk-width-1-2"> | |
| 165 | + <div class="uk-form-row"> | |
| 166 | + <label class="uk-form-label">上下行</label> | |
| 167 | + <div class="uk-form-controls"> | |
| 168 | + <select name="xlDir"> | |
| 169 | + <option value="0">上行</option> | |
| 170 | + <option value="1">下行</option> | |
| 171 | + </select> | |
| 172 | + </div> | |
| 173 | + </div> | |
| 174 | + </div> | |
| 175 | + </div> | |
| 176 | + <div class="uk-grid"> | |
| 177 | + <div class="uk-width-1-2"> | |
| 178 | + <div class="uk-form-row"> | |
| 179 | + <label class="uk-form-label">起点站</label> | |
| 180 | + <div class="uk-form-controls"> | |
| 181 | + <select name="qdzCode" required> | |
| 182 | + </select> | |
| 183 | + </div> | |
| 184 | + </div> | |
| 185 | + </div> | |
| 186 | + <div class="uk-width-1-2"> | |
| 187 | + <div class="uk-form-row"> | |
| 188 | + <label class="uk-form-label">终点站</label> | |
| 189 | + <div class="uk-form-controls"> | |
| 190 | + <select name="zdzCode" required> | |
| 191 | + </select> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | + <div class="uk-grid"> | |
| 197 | + <div class="uk-width-1-2"> | |
| 198 | + <div class="uk-form-row"> | |
| 199 | + <label class="uk-form-label">开始时间</label> | |
| 200 | + <div class="uk-form-controls"> | |
| 201 | + <input type="time" value="{{zdsj}}" name="fcsj" required> | |
| 202 | + </div> | |
| 203 | + </div> | |
| 204 | + </div> | |
| 205 | + <div class="uk-width-1-2"> | |
| 206 | + <div class="uk-form-row"> | |
| 207 | + <label class="uk-form-label">结束时间</label> | |
| 208 | + <div class="uk-form-controls"> | |
| 209 | + <input type="time" name="zdsj" required> | |
| 210 | + </div> | |
| 211 | + </div> | |
| 212 | + </div> | |
| 213 | + </div> | |
| 214 | + <div class="uk-grid"> | |
| 215 | + <div class="uk-width-1-2"> | |
| 216 | + <div class="uk-form-row"> | |
| 217 | + <label class="uk-form-label">车辆</label> | |
| 218 | + <div class="uk-form-controls"> | |
| 219 | + <div class="uk-autocomplete uk-form car-autocom"> | |
| 220 | + <input type="text" value="{{clZbh}}" name="clZbh" required> | |
| 221 | + </div> | |
| 222 | + </div> | |
| 223 | + </div> | |
| 224 | + </div> | |
| 225 | + <div class="uk-width-1-2"> | |
| 226 | + <div class="uk-form-row"> | |
| 227 | + <label class="uk-form-label">里程</label> | |
| 228 | + <div class="uk-form-controls"> | |
| 229 | + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" | |
| 230 | + required> | |
| 231 | + </div> | |
| 232 | + </div> | |
| 233 | + </div> | |
| 234 | + </div> | |
| 235 | + <div class="uk-grid"> | |
| 236 | + <div class="uk-width-1-2"> | |
| 237 | + <div class="uk-form-row"> | |
| 238 | + <label class="uk-form-label">驾驶员</label> | |
| 239 | + <div class="uk-form-controls"> | |
| 240 | + <div class="uk-autocomplete uk-form jsy-autocom"> | |
| 241 | + <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> | |
| 242 | + </div> | |
| 243 | + </div> | |
| 244 | + </div> | |
| 245 | + </div> | |
| 246 | + <div class="uk-width-1-2"> | |
| 247 | + <div class="uk-form-row"> | |
| 248 | + <label class="uk-form-label">售票员</label> | |
| 249 | + <div class="uk-form-controls"> | |
| 250 | + <div class="uk-autocomplete uk-form spy-autocom"> | |
| 251 | + <input type="text" name="spy" value="{{sGh}}/{{sName}}"> | |
| 252 | + </div> | |
| 253 | + </div> | |
| 254 | + </div> | |
| 255 | + </div> | |
| 256 | + </div> | |
| 257 | + <div class="uk-grid"> | |
| 258 | + <div class="uk-width-1-1"> | |
| 259 | + <div class="uk-form-row"> | |
| 260 | + <label class="uk-form-label">备注</label> | |
| 261 | + <div class="uk-form-controls"> | |
| 262 | + <div class="uk-autocomplete uk-form remarks-autocom"> | |
| 263 | + <input type="text" name="remarks"> | |
| 264 | + </div> | |
| 265 | + </div> | |
| 266 | + </div> | |
| 267 | + </div> | |
| 268 | + </div> | |
| 269 | + </form> | |
| 270 | + <hr style="margin-top: 35px;"> | |
| 271 | + <form class="uk-form uk-form-horizontal two_form"> | |
| 272 | + <div class="uk-grid"> | |
| 273 | + <div class="uk-width-1-2"> | |
| 274 | + <div class="uk-form-row"> | |
| 275 | + <label class="uk-form-label">班次类型</label> | |
| 276 | + <div class="uk-form-controls"> | |
| 277 | + <select class="form-control nt-dictionary" name="bcType" data-code="{{bcType}}" | |
| 278 | + data-group=ScheduleType></select> | |
| 279 | + </div> | |
| 280 | + </div> | |
| 281 | + </div> | |
| 282 | + <div class="uk-width-1-2"> | |
| 283 | + <div class="uk-form-row"> | |
| 284 | + <label class="uk-form-label">上下行</label> | |
| 285 | + <div class="uk-form-controls"> | |
| 286 | + <select name="xlDir"> | |
| 287 | + <option value="0">上行</option> | |
| 288 | + <option value="1">下行</option> | |
| 289 | + </select> | |
| 290 | + </div> | |
| 291 | + </div> | |
| 292 | + </div> | |
| 293 | + </div> | |
| 294 | + <div class="uk-grid"> | |
| 295 | + <div class="uk-width-1-2"> | |
| 296 | + <div class="uk-form-row"> | |
| 297 | + <label class="uk-form-label">起点站</label> | |
| 298 | + <div class="uk-form-controls"> | |
| 299 | + <select name="qdzCode" required> | |
| 300 | + </select> | |
| 301 | + </div> | |
| 302 | + </div> | |
| 303 | + </div> | |
| 304 | + <div class="uk-width-1-2"> | |
| 305 | + <div class="uk-form-row"> | |
| 306 | + <label class="uk-form-label">终点站</label> | |
| 307 | + <div class="uk-form-controls"> | |
| 308 | + <select name="zdzCode" required> | |
| 309 | + </select> | |
| 310 | + </div> | |
| 311 | + </div> | |
| 312 | + </div> | |
| 313 | + </div> | |
| 314 | + <div class="uk-grid"> | |
| 315 | + <div class="uk-width-1-2"> | |
| 316 | + <div class="uk-form-row"> | |
| 317 | + <label class="uk-form-label">开始时间</label> | |
| 318 | + <div class="uk-form-controls"> | |
| 319 | + <input type="time" value="{{zdsj}}" name="fcsj" required> | |
| 320 | + </div> | |
| 321 | + </div> | |
| 322 | + </div> | |
| 323 | + <div class="uk-width-1-2"> | |
| 324 | + <div class="uk-form-row"> | |
| 325 | + <label class="uk-form-label">结束时间</label> | |
| 326 | + <div class="uk-form-controls"> | |
| 327 | + <input type="time" name="zdsj" required> | |
| 328 | + </div> | |
| 329 | + </div> | |
| 330 | + </div> | |
| 331 | + </div> | |
| 332 | + <div class="uk-grid"> | |
| 333 | + <div class="uk-width-1-2"> | |
| 334 | + <div class="uk-form-row"> | |
| 335 | + <label class="uk-form-label">车辆</label> | |
| 336 | + <div class="uk-form-controls"> | |
| 337 | + <div class="uk-autocomplete uk-form car-autocom"> | |
| 338 | + <input type="text" value="{{clZbh}}" name="clZbh" required> | |
| 339 | + </div> | |
| 340 | + </div> | |
| 341 | + </div> | |
| 342 | + </div> | |
| 343 | + <div class="uk-width-1-2"> | |
| 344 | + <div class="uk-form-row"> | |
| 345 | + <label class="uk-form-label">里程</label> | |
| 346 | + <div class="uk-form-controls"> | |
| 347 | + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" | |
| 348 | + required> | |
| 349 | + </div> | |
| 350 | + </div> | |
| 351 | + </div> | |
| 352 | + </div> | |
| 353 | + <div class="uk-grid"> | |
| 354 | + <div class="uk-width-1-2"> | |
| 355 | + <div class="uk-form-row"> | |
| 356 | + <label class="uk-form-label">驾驶员</label> | |
| 357 | + <div class="uk-form-controls"> | |
| 358 | + <div class="uk-autocomplete uk-form jsy-autocom"> | |
| 359 | + <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> | |
| 360 | + </div> | |
| 361 | + </div> | |
| 362 | + </div> | |
| 363 | + </div> | |
| 364 | + <div class="uk-width-1-2"> | |
| 365 | + <div class="uk-form-row"> | |
| 366 | + <label class="uk-form-label">售票员</label> | |
| 367 | + <div class="uk-form-controls"> | |
| 368 | + <div class="uk-autocomplete uk-form spy-autocom"> | |
| 369 | + <input type="text" name="spy" value="{{sGh}}/{{sName}}"> | |
| 370 | + </div> | |
| 371 | + </div> | |
| 372 | + </div> | |
| 373 | + </div> | |
| 374 | + </div> | |
| 375 | + <div class="uk-grid"> | |
| 376 | + <div class="uk-width-1-1"> | |
| 377 | + <div class="uk-form-row"> | |
| 378 | + <label class="uk-form-label">备注</label> | |
| 379 | + <div class="uk-form-controls"> | |
| 380 | + <div class="uk-autocomplete uk-form remarks-autocom"> | |
| 381 | + <input type="text" name="remarks"> | |
| 382 | + </div> | |
| 383 | + </div> | |
| 384 | + </div> | |
| 385 | + </div> | |
| 386 | + </div> | |
| 387 | + </form> | |
| 388 | + | |
| 389 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 390 | + <span class="ct_line_lp_badge" ></span> | |
| 391 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 392 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 393 | + </div> | |
| 394 | + </script> | |
| 395 | + | |
| 396 | + | |
| 397 | + <!-- 场到场临加班次 --> | |
| 398 | + <script id="add_park2park_sch-form-temp" type="text/html"> | |
| 399 | + <form class="uk-form uk-form-horizontal"> | |
| 400 | + <div class="uk-grid"> | |
| 401 | + <div class="uk-width-1-2"> | |
| 402 | + <div class="uk-form-row"> | |
| 403 | + <label class="uk-form-label">班次类型</label> | |
| 404 | + <div class="uk-form-controls"> | |
| 405 | + <select class="form-control" name="bcType"> | |
| 406 | + <option value="in">进场</option> | |
| 407 | + </select> | |
| 408 | + </div> | |
| 409 | + </div> | |
| 410 | + </div> | |
| 411 | + <div class="uk-width-1-2"> | |
| 412 | + <div class="uk-form-row"> | |
| 413 | + <label class="uk-form-label">上下行</label> | |
| 414 | + <div class="uk-form-controls"> | |
| 415 | + <select name="xlDir"> | |
| 416 | + <option value="0">上行</option> | |
| 417 | + <option value="1">下行</option> | |
| 418 | + </select> | |
| 419 | + </div> | |
| 420 | + </div> | |
| 421 | + </div> | |
| 422 | + </div> | |
| 423 | + <div class="uk-grid"> | |
| 424 | + <div class="uk-width-1-2"> | |
| 425 | + <div class="uk-form-row"> | |
| 426 | + <label class="uk-form-label">起点站</label> | |
| 427 | + <div class="uk-form-controls"> | |
| 428 | + <select name="qdzCode" required> | |
| 429 | + </select> | |
| 430 | + </div> | |
| 431 | + </div> | |
| 432 | + </div> | |
| 433 | + <div class="uk-width-1-2"> | |
| 434 | + <div class="uk-form-row"> | |
| 435 | + <label class="uk-form-label">终点站</label> | |
| 436 | + <div class="uk-form-controls"> | |
| 437 | + <select name="zdzCode" required> | |
| 438 | + </select> | |
| 439 | + </div> | |
| 440 | + </div> | |
| 441 | + </div> | |
| 442 | + </div> | |
| 443 | + <div class="uk-grid"> | |
| 444 | + <div class="uk-width-1-2"> | |
| 445 | + <div class="uk-form-row"> | |
| 446 | + <label class="uk-form-label">开始时间</label> | |
| 447 | + <div class="uk-form-controls"> | |
| 448 | + <input type="time" value="{{zdsj}}" name="fcsj" required> | |
| 449 | + </div> | |
| 450 | + </div> | |
| 451 | + </div> | |
| 452 | + <div class="uk-width-1-2"> | |
| 453 | + <div class="uk-form-row"> | |
| 454 | + <label class="uk-form-label">结束时间</label> | |
| 455 | + <div class="uk-form-controls"> | |
| 456 | + <input type="time" name="zdsj" value="{{zdsj}}" required> | |
| 457 | + </div> | |
| 458 | + </div> | |
| 459 | + </div> | |
| 460 | + </div> | |
| 461 | + <div class="uk-grid"> | |
| 462 | + <div class="uk-width-1-2"> | |
| 463 | + <div class="uk-form-row"> | |
| 464 | + <label class="uk-form-label">车辆</label> | |
| 465 | + <div class="uk-form-controls"> | |
| 466 | + <div class="uk-autocomplete uk-form car-autocom"> | |
| 467 | + <input type="text" value="{{clZbh}}" name="clZbh" required> | |
| 468 | + </div> | |
| 469 | + </div> | |
| 470 | + </div> | |
| 471 | + </div> | |
| 472 | + <div class="uk-width-1-2"> | |
| 473 | + <div class="uk-form-row"> | |
| 474 | + <label class="uk-form-label">里程</label> | |
| 475 | + <div class="uk-form-controls"> | |
| 476 | + <input type="text" name="jhlc" value="{{jhlc}}" max=222 data-fv-lessthan-inclusive="false" | |
| 477 | + required> | |
| 478 | + </div> | |
| 479 | + </div> | |
| 480 | + </div> | |
| 481 | + </div> | |
| 482 | + <div class="uk-grid"> | |
| 483 | + <div class="uk-width-1-2"> | |
| 484 | + <div class="uk-form-row"> | |
| 485 | + <label class="uk-form-label">驾驶员</label> | |
| 486 | + <div class="uk-form-controls"> | |
| 487 | + <div class="uk-autocomplete uk-form jsy-autocom"> | |
| 488 | + <input type="text" value="{{jGh}}/{{jName}}" name="jsy" required> | |
| 489 | + </div> | |
| 490 | + </div> | |
| 491 | + </div> | |
| 492 | + </div> | |
| 493 | + <div class="uk-width-1-2"> | |
| 494 | + <div class="uk-form-row"> | |
| 495 | + <label class="uk-form-label">售票员</label> | |
| 496 | + <div class="uk-form-controls"> | |
| 497 | + <div class="uk-autocomplete uk-form spy-autocom"> | |
| 498 | + <input type="text" name="spy" value="{{sGh}}/{{sName}}"> | |
| 499 | + </div> | |
| 500 | + </div> | |
| 501 | + </div> | |
| 502 | + </div> | |
| 503 | + </div> | |
| 504 | + <div class="uk-grid"> | |
| 505 | + <div class="uk-width-1-1"> | |
| 506 | + <div class="uk-form-row"> | |
| 507 | + <label class="uk-form-label">备注</label> | |
| 508 | + <div class="uk-form-controls"> | |
| 509 | + <div class="uk-autocomplete uk-form remarks-autocom"> | |
| 510 | + <input type="text" name="remarks"> | |
| 511 | + </div> | |
| 512 | + </div> | |
| 513 | + </div> | |
| 514 | + </div> | |
| 515 | + </div> | |
| 516 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 517 | + <span class="ct_line_lp_badge" ></span> | |
| 518 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 519 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 520 | + </div> | |
| 521 | + </form> | |
| 522 | + </script> | |
| 523 | + | |
| 524 | + <script> | |
| 525 | + (function () { | |
| 526 | + var modal = '#schedule-addsch-modal', | |
| 527 | + sch, stationRoutes, parks, information,carsArray; | |
| 528 | + | |
| 529 | + $(modal).on('init', function (e, data) { | |
| 530 | + e.stopPropagation(); | |
| 531 | + sch = data.sch; | |
| 532 | + //站点路由 | |
| 533 | + stationRoutes = gb_common.groupBy(gb_data_basic.stationRoutes(sch.xlBm).sort(function (a, b) { | |
| 534 | + return a.stationRouteCode - b.stationRouteCode; | |
| 535 | + }), 'directions'); | |
| 536 | + //停车场 | |
| 537 | + parks = gb_data_basic.simpleParksArray(); | |
| 538 | + //线路标准 | |
| 539 | + information = gb_data_basic.getLineInformation(sch.xlBm); | |
| 540 | + //车辆信息 | |
| 541 | + carsArray = gb_data_basic.carsArray(); | |
| 542 | + | |
| 543 | + //监听tab切换事件 | |
| 544 | + $('.left_tabs_lg[data-uk-switcher]', modal).on('show.uk.switcher', function (event, area) { | |
| 545 | + var handle = area.data('handle'); | |
| 546 | + $('#tempScheduleContent>li').empty(); | |
| 547 | + leftTabsHandles[handle](); | |
| 548 | + }); | |
| 549 | + }); | |
| 550 | + | |
| 551 | + function setEndTime(diff, f) { | |
| 552 | + var et = moment($('[name=fcsj]', f).val(), 'HH:mm').add(diff, 'minutes').format('HH:mm'); | |
| 553 | + $('[name=zdsj]', f).val(et); | |
| 554 | + } | |
| 555 | + | |
| 556 | + function initAutoCom(f) { | |
| 557 | + //车辆 | |
| 558 | + if(carsArray) | |
| 559 | + gb_common.carAutocomplete($('.car-autocom', f), carsArray); | |
| 560 | + //驾驶员 | |
| 561 | + gb_common.personAutocomplete($('.jsy-autocom', f)); | |
| 562 | + //售票员 | |
| 563 | + gb_common.personAutocomplete($('.spy-autocom', f)); | |
| 564 | + //备注补全 | |
| 565 | + gb_common.remarksAutocomplete($('.remarks-autocom', f)); | |
| 566 | + } | |
| 567 | + | |
| 568 | + function initScheduleTypeChange(f, cb) { | |
| 569 | + (function (f, cb) { | |
| 570 | + $('[name=bcType],[name=xlDir]', f).on('change', function () { | |
| 571 | + var bcType_e = $('[name=bcType]', f) | |
| 572 | + , xlDir_e = $('[name=xlDir]', f); | |
| 573 | + | |
| 574 | + var routes = stationRoutes[xlDir_e.val()] | |
| 575 | + , lastCode = routes[routes.length - 1].stationCode | |
| 576 | + , opts = '', park_opts = ''; | |
| 577 | + //station options | |
| 578 | + $.each(routes, function () { | |
| 579 | + opts += '<option value="' + this.stationCode + '">' + this.stationName + '</option>' | |
| 580 | + }); | |
| 581 | + //park options | |
| 582 | + for (var code in parks) | |
| 583 | + park_opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 584 | + | |
| 585 | + var qdz = $('[name=qdzCode]', f), zdz = $('[name=zdzCode]', f); | |
| 586 | + var time, mileage; | |
| 587 | + switch (bcType_e.val()) { | |
| 588 | + case 'out': | |
| 589 | + qdz.html(park_opts).val(information.carPark); | |
| 590 | + zdz.html(opts); | |
| 591 | + //出场结束时间 | |
| 592 | + time = xlDir_e.val() == 0 ? information.upOutTimer : information.downOutTimer; | |
| 593 | + mileage = xlDir_e.val() == 0 ? information.upOutMileage : information.downOutMileage; | |
| 594 | + break; | |
| 595 | + case 'in': | |
| 596 | + qdz.html(opts); | |
| 597 | + zdz.html(park_opts).val(information.carPark); | |
| 598 | + //进场结束时间 | |
| 599 | + time = xlDir_e.val() == 0 ? information.upInTimer : information.downInTimer; | |
| 600 | + mileage = xlDir_e.val() == 0 ? information.upInMileage : information.downInMileage; | |
| 601 | + break; | |
| 602 | + default: | |
| 603 | + qdz.html(opts); | |
| 604 | + zdz.html(opts).val(lastCode); | |
| 605 | + time = xlDir_e.val() == 0?information.upTravelTime:information.downTravelTime; | |
| 606 | + mileage = xlDir_e.val() == 0?information.upMileage:information.downMileage; | |
| 607 | + } | |
| 608 | + | |
| 609 | + setEndTime(time, f); | |
| 610 | + $('[name=jhlc]', f).val(mileage); | |
| 611 | + | |
| 612 | + cb && cb(); | |
| 613 | + }).trigger('change'); | |
| 614 | + })(f, cb); | |
| 615 | + } | |
| 616 | + | |
| 617 | + function initStationChange(f, cb) { | |
| 618 | + (function (f, cb) { | |
| 619 | + //起点站改变 | |
| 620 | + $('[name=qdzCode]', f).on('change', function () { | |
| 621 | + var bcType = $('[name=bcType]', f).val(); | |
| 622 | + if(bcType!='in' && bcType!='out'){ | |
| 623 | + var ops = $('[name=zdzCode]', f).find('option'); | |
| 624 | + var flag, code = $(this).val(); | |
| 625 | + $.each(ops, function () { | |
| 626 | + if (!flag) | |
| 627 | + $(this).attr('disabled', 'disabled'); | |
| 628 | + else | |
| 629 | + $(this).removeAttr('disabled'); | |
| 630 | + if (this.value == code) | |
| 631 | + flag = true; | |
| 632 | + }); | |
| 633 | + setBcType(f); | |
| 634 | + } | |
| 635 | + cb && cb(); | |
| 636 | + }); | |
| 637 | + //终点站改变 | |
| 638 | + $('[name=zdzCode]', f).on('change', function () { | |
| 639 | + var bcType = $('[name=bcType]', f).val(); | |
| 640 | + if(bcType!='in' && bcType!='out'){ | |
| 641 | + var ops = $('[name=qdzCode]', f).find('option'); | |
| 642 | + var flag, code = $(this).val(); | |
| 643 | + $.each(ops, function () { | |
| 644 | + if (this.value == code) | |
| 645 | + flag = true; | |
| 646 | + | |
| 647 | + if (flag) | |
| 648 | + $(this).attr('disabled', 'disabled'); | |
| 649 | + else | |
| 650 | + $(this).removeAttr('disabled'); | |
| 651 | + }); | |
| 652 | + setBcType(f); | |
| 653 | + } | |
| 654 | + | |
| 655 | + cb && cb(); | |
| 656 | + }); | |
| 657 | + })(f, cb); | |
| 658 | + } | |
| 659 | + | |
| 660 | + function setBcType(f) { | |
| 661 | + var qdzCode = $('[name=qdzCode]', f).val(), | |
| 662 | + zdzCode =$('[name=zdzCode]', f).val(), | |
| 663 | + updown = $('[name=xlDir]', f).val(); | |
| 664 | + var rts = stationRoutes[updown]; | |
| 665 | + if(rts[0].stationCode == qdzCode | |
| 666 | + && rts[rts.length - 1].stationCode == zdzCode){ | |
| 667 | + $('[name=bcType]', f).val('normal'); | |
| 668 | + $('[name=jhlc]', f).val(updown == 0?information.upMileage:information.downMileage); | |
| 669 | + } | |
| 670 | + else { | |
| 671 | + var type = $('[name=bcType]', f).val(); | |
| 672 | + if(type!='normal') | |
| 673 | + return; | |
| 674 | + $('[name=bcType]', f).val('region'); | |
| 675 | + //计算区间站点间公里 | |
| 676 | + var mileage = calcMileage(qdzCode, zdzCode, rts); | |
| 677 | + $('[name=jhlc]', f).val(mileage); | |
| 678 | + } | |
| 679 | + } | |
| 680 | + | |
| 681 | + function calcMileage(s, e, rts) { | |
| 682 | + var mileage = 0, flag, code; | |
| 683 | + //从原始站点路由字段里取值 | |
| 684 | + $.each(rts, function () { | |
| 685 | + code = this['stationCode']; | |
| 686 | + if (flag) | |
| 687 | + mileage = gb_common.accAdd(mileage, this.distances); | |
| 688 | + if (code == s) | |
| 689 | + flag = true; | |
| 690 | + if (code == e) | |
| 691 | + return false; | |
| 692 | + }); | |
| 693 | + return mileage; | |
| 694 | + } | |
| 695 | + | |
| 696 | + /** | |
| 697 | + * 提交表单 | |
| 698 | + */ | |
| 699 | + var submitScheduleForm = function (data, cb) { | |
| 700 | + //班次日期 | |
| 701 | + data.scheduleDateStr = sch.scheduleDateStr; | |
| 702 | + data.xlBm = sch.xlBm; | |
| 703 | + data.xlName = sch.xlName; | |
| 704 | + data.lpName = sch.lpName; | |
| 705 | + //拆分驾驶员工号和姓名 | |
| 706 | + data.jGh = data.jsy.split('/')[0]; | |
| 707 | + data.jName = data.jsy.split('/')[1]; | |
| 708 | + delete data.jsy; | |
| 709 | + //拆分售票员工号和姓名 | |
| 710 | + if (data.sGh != null) { | |
| 711 | + data.sGh = data.spy.split('/')[0]; | |
| 712 | + data.sName = data.spy.split('/')[1]; | |
| 713 | + delete data.spy; | |
| 714 | + } | |
| 715 | + | |
| 716 | + //公司信息 | |
| 717 | + var line = gb_data_basic.findLineByCodes([data.xlBm]); | |
| 718 | + if(line && line.length > 0){ | |
| 719 | + line = line[0]; | |
| 720 | + data.gsBm = line.company; | |
| 721 | + data.fgsBm = line.brancheCompany; | |
| 722 | + } | |
| 723 | + | |
| 724 | + //直接给实发实达时间 | |
| 725 | + data.fcsjActual = data.fcsj; | |
| 726 | + data.zdsjActual = data.zdsj; | |
| 727 | + gb_common.$post('/realSchedule/history/add', data, function (rs) { | |
| 728 | + notify_succ('新增临加班次成功'); | |
| 729 | + cb && cb(rs); | |
| 730 | + }); | |
| 731 | + }; | |
| 732 | + | |
| 733 | + /** | |
| 734 | + * 普通单程临加班次 | |
| 735 | + * @type {{show}} | |
| 736 | + */ | |
| 737 | + var normalObj = (function () { | |
| 738 | + var cont = $('.normalCont', modal); | |
| 739 | + var show = function () { | |
| 740 | + var formHtml = template('add_normal_sch-form-temp', sch); | |
| 741 | + cont.html(formHtml); | |
| 742 | + var f = $('form', cont); | |
| 743 | + | |
| 744 | + initAutoCom(f); | |
| 745 | + //字典转换 | |
| 746 | + dictionaryUtils.transformDom($('.nt-dictionary', f)); | |
| 747 | + //站点切换 | |
| 748 | + initStationChange(f); | |
| 749 | + //类型、走向切换 | |
| 750 | + initScheduleTypeChange(f); | |
| 751 | + | |
| 752 | + //校验 | |
| 753 | + f.formValidation({framework: 'uikit', locale: 'zh_CN'}); | |
| 754 | + //提交 | |
| 755 | + f.on('success.form.fv', function (e) { | |
| 756 | + e.preventDefault(); | |
| 757 | + | |
| 758 | + disabled_submit_btn(f); | |
| 759 | + var data = $(f).serializeJSON(); | |
| 760 | + submitScheduleForm(data, function (rs) { | |
| 761 | + $('#history-sch-maintain-modal').trigger('refresh'); | |
| 762 | + UIkit.modal(modal).hide(); | |
| 763 | + }); | |
| 764 | + }); | |
| 765 | + $('.ct_line_lp_badge', f).html(sch.xlName + ', '+sch.lpName); | |
| 766 | + }; | |
| 767 | + | |
| 768 | + return { | |
| 769 | + show: show | |
| 770 | + } | |
| 771 | + })(); | |
| 772 | + | |
| 773 | + /** | |
| 774 | + * 线路上往返 | |
| 775 | + */ | |
| 776 | + var toAndFroObj = (function () { | |
| 777 | + var cont = $('.toAndFroCont', modal); | |
| 778 | + var show = function () { | |
| 779 | + var formHtml = template('add_toAndFro_sch-form-temp', sch); | |
| 780 | + cont.html(formHtml); | |
| 781 | + //字典转换 | |
| 782 | + dictionaryUtils.transformDom($('.nt-dictionary', cont)); | |
| 783 | + var f1 = $('.one_form', cont); | |
| 784 | + var f2 = $('.two_form', cont); | |
| 785 | + //第1个表单事件 | |
| 786 | + initStationChange(f1, synchroFormData); | |
| 787 | + initScheduleTypeChange(f1, synchroFormData); | |
| 788 | + //第2个表单事件 | |
| 789 | + initStationChange(f2); | |
| 790 | + initScheduleTypeChange(f2); | |
| 791 | + //第一个结束时间改变 | |
| 792 | + $('[name=zdsj]', f1).on('input', synchroTimes).trigger('input'); | |
| 793 | + //默认1备注同步到2 | |
| 794 | + $('.remarks-autocom', f1).on('selectitem.uk.autocomplete', function (e, data, acobject) { | |
| 795 | + $('[name=remarks]', f2).val(data.value); | |
| 796 | + }); | |
| 797 | + //自动补全 | |
| 798 | + initAutoCom(f1); | |
| 799 | + initAutoCom(f2); | |
| 800 | + | |
| 801 | + //表单校验提交相关 | |
| 802 | + var dataArray; | |
| 803 | + var fs = $('form', cont); | |
| 804 | + fs.formValidation({framework: 'uikit', locale: 'zh_CN'}); | |
| 805 | + fs.on('success.form.fv', function (e) { | |
| 806 | + e.preventDefault(); | |
| 807 | + dataArray.push($(this).serializeJSON()); | |
| 808 | + $(this).data('valid', true); | |
| 809 | + if (allValidSuccess()) { | |
| 810 | + //开始post | |
| 811 | + var i = 0; | |
| 812 | + (function () { | |
| 813 | + var f = arguments.callee; | |
| 814 | + if (i >= dataArray.length) { | |
| 815 | + $('#history-sch-maintain-modal').trigger('refresh'); | |
| 816 | + UIkit.modal(modal).hide(); | |
| 817 | + return; | |
| 818 | + } | |
| 819 | + submitScheduleForm(dataArray[i], function (rs) { | |
| 820 | + i++; | |
| 821 | + f(); | |
| 822 | + }); | |
| 823 | + })(); | |
| 824 | + } | |
| 825 | + }); | |
| 826 | + //提交 | |
| 827 | + $('[type=submit]', cont).on('click', function () { | |
| 828 | + $(this).addClass('disabled').attr('disabled', 'disabled'); | |
| 829 | + dataArray = []; | |
| 830 | + fs.data('valid', false); | |
| 831 | + fs.formValidation('validate'); | |
| 832 | + }); | |
| 833 | + $('.ct_line_lp_badge', cont).html(sch.xlName + ', '+sch.lpName); | |
| 834 | + }; | |
| 835 | + | |
| 836 | + function allValidSuccess() { | |
| 837 | + var flag = true; | |
| 838 | + $('form:visible', cont).each(function (i, f) { | |
| 839 | + if (!$(f).data('valid')) { | |
| 840 | + flag = false; | |
| 841 | + return false; | |
| 842 | + } | |
| 843 | + }); | |
| 844 | + return flag; | |
| 845 | + } | |
| 846 | + | |
| 847 | + /** | |
| 848 | + * 同步2个表单的数据 | |
| 849 | + */ | |
| 850 | + var bcTypes = {'normal': 'normal', 'region': 'region', 'out': 'in', 'in': 'out'}; | |
| 851 | + var synchroFormData = function () { | |
| 852 | + var f1 = $('.one_form', cont); | |
| 853 | + var f2 = $('.two_form', cont); | |
| 854 | + | |
| 855 | + //同步班次类型 | |
| 856 | + var type = $('[name=bcType]', f1).val(); | |
| 857 | + if (bcTypes[type]) | |
| 858 | + $('[name=bcType]', f2).val(bcTypes[type]).trigger('change'); | |
| 859 | + var updown = $('[name=xlDir]', f1).val(); | |
| 860 | + | |
| 861 | + if (type != 'out' && type != 'in') { | |
| 862 | + //走向 | |
| 863 | + $('[name=xlDir]', f2).val(updown == 0 ? 1 : 0).trigger('change'); | |
| 864 | + | |
| 865 | + //第一个表单终点 = 第二个起点 | |
| 866 | + var oneZdName = $('[name=zdzCode] option:selected', f1).text(); | |
| 867 | + $('[name=qdzCode]', f2).val(searchParallelStation(oneZdName, updown == 0 ? 1 : 0)).trigger('change'); | |
| 868 | + //第一个表单起点 = 第二个终点 | |
| 869 | + var oneQdName = $('[name=qdzCode] option:selected', f1).text(); | |
| 870 | + $('[name=zdzCode]', f2).val(searchParallelStation(oneQdName, updown == 0 ? 1 : 0)).trigger('change'); | |
| 871 | + } | |
| 872 | + else { | |
| 873 | + //进出场走向相同 | |
| 874 | + $('[name=xlDir]', f2).val(updown).trigger('change'); | |
| 875 | + //第一个表单终点 = 第二个起点 | |
| 876 | + $('[name=qdzCode]', f2).val($('[name=zdzCode]', f1).val()); | |
| 877 | + //第一个表单起点 = 第二个终点 | |
| 878 | + $('[name=zdzCode]', f2).val($('[name=qdzCode]', f1).val()); | |
| 879 | + } | |
| 880 | + }; | |
| 881 | + | |
| 882 | + /** | |
| 883 | + * 同步时间 | |
| 884 | + */ | |
| 885 | + var synchroTimes = function () { | |
| 886 | + var f1 = $('.one_form', cont); | |
| 887 | + var f2 = $('.two_form', cont); | |
| 888 | + var updown = $('[name=xlDir]', f2).val(); | |
| 889 | + var oneZdsj = $('[name=zdsj]', f1).val(); | |
| 890 | + | |
| 891 | + //全程班次历时 | |
| 892 | + var diff = updown==0?information.upTravelTime:information.downTravelTime; | |
| 893 | + //设置第二个表单开始时间 | |
| 894 | + $('[name=fcsj]', f2).val(oneZdsj); | |
| 895 | + setEndTime(diff, f2); | |
| 896 | + }; | |
| 897 | + | |
| 898 | + return { | |
| 899 | + show : show | |
| 900 | + } | |
| 901 | + })(); | |
| 902 | + | |
| 903 | + /** | |
| 904 | + * 场到场 | |
| 905 | + */ | |
| 906 | + var parkToParkObj = (function () { | |
| 907 | + | |
| 908 | + var cont = $('.parkToParkCont', modal); | |
| 909 | + var show = function () { | |
| 910 | + var formHtml = template('add_park2park_sch-form-temp', sch); | |
| 911 | + cont.html(formHtml); | |
| 912 | + var f = $('form', cont); | |
| 913 | + | |
| 914 | + initAutoCom(f); | |
| 915 | + //字典转换 | |
| 916 | + dictionaryUtils.transformDom($('.nt-dictionary', f)); | |
| 917 | + | |
| 918 | + //park options | |
| 919 | + var park_opts; | |
| 920 | + for (var code in parks) | |
| 921 | + park_opts += '<option value="' + code + '">' + parks[code] + '</option>'; | |
| 922 | + $('[name=qdzCode]', f).html(park_opts); | |
| 923 | + $('[name=zdzCode]', f).html(park_opts); | |
| 924 | + if(sch.bcType=='in'){ | |
| 925 | + $('[name=qdzCode]', f).val(sch.zdzCode); | |
| 926 | + //选中的也是场到场班次 | |
| 927 | + if(gb_data_basic.getCarparkByCode(sch.qdzCode) != null){ | |
| 928 | + //默认做返程 | |
| 929 | + $('[name=zdzCode]', f).val(sch.qdzCode); | |
| 930 | + $('[name=remarks]', f).val(sch.remarks); | |
| 931 | + $('[name=jhlc]', f).val(sch.jhlc); | |
| 932 | + //时间 | |
| 933 | + var zdsj = moment(sch.zdsj, 'HH:mm').add('minutes', sch.bcsj).format('HH:mm'); | |
| 934 | + $('[name=zdsj]', f).val(zdsj); | |
| 935 | + } | |
| 936 | + } | |
| 937 | + | |
| 938 | + //校验 | |
| 939 | + f.formValidation({framework: 'uikit', locale: 'zh_CN'}); | |
| 940 | + //提交 | |
| 941 | + f.on('success.form.fv', function (e) { | |
| 942 | + e.preventDefault(); | |
| 943 | + | |
| 944 | + disabled_submit_btn(f); | |
| 945 | + var data = $(f).serializeJSON(); | |
| 946 | + submitScheduleForm(data, function (rs) { | |
| 947 | + $('#history-sch-maintain-modal').trigger('refresh'); | |
| 948 | + UIkit.modal(modal).hide(); | |
| 949 | + }); | |
| 950 | + }); | |
| 951 | + $('.ct_line_lp_badge', f).html(sch.xlName + ', '+sch.lpName); | |
| 952 | + }; | |
| 953 | + | |
| 954 | + return { | |
| 955 | + show: show | |
| 956 | + } | |
| 957 | + })(); | |
| 958 | + | |
| 959 | + /** 左 tabs 切换处理*/ | |
| 960 | + var leftTabsHandles = { | |
| 961 | + normal: normalObj.show, | |
| 962 | + toAndFro: toAndFroObj.show, | |
| 963 | + parkToPark: parkToParkObj.show | |
| 964 | + }; | |
| 965 | + | |
| 966 | + //返回另一个走向对应的站点 | |
| 967 | + function searchParallelStation(stationName, updown) { | |
| 968 | + var routes = stationRoutes[updown] | |
| 969 | + , len = routes.length; | |
| 970 | + | |
| 971 | + for (var i = 0; i < len; i++) { | |
| 972 | + if (routes[i].stationName == stationName) | |
| 973 | + return routes[i].stationCode; | |
| 974 | + } | |
| 975 | + } | |
| 976 | + | |
| 977 | + })(); | |
| 978 | + </script> | |
| 979 | +</div> | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch/h_oil_station.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal ct_move_modal" id="oil_station-modal"> | |
| 2 | + <div class="uk-modal-dialog" style="width: 450px;"> | |
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | |
| 4 | + <div class="uk-modal-header"> | |
| 5 | + <h2>绑定停车场(里程/历时)</h2></div> | |
| 6 | + | |
| 7 | + <form class="uk-form uk-form-horizontal " style="margin-bottom: 0 !important;"> | |
| 8 | + <div class="uk-form-row"> | |
| 9 | + <label class="uk-form-label">线路</label> | |
| 10 | + <div class="uk-form-icon"> | |
| 11 | + <input type="hidden" name="lineCode"> | |
| 12 | + <input type="text" name="qdzName" disabled> | |
| 13 | + </div> | |
| 14 | + </div> | |
| 15 | + <div class="uk-form-row"> | |
| 16 | + <label class="uk-form-label">停车场名称</label> | |
| 17 | + <div class="uk-form-icon"> | |
| 18 | + <input type="text" name="stationName" required style="width: calc(100% - 99px);margin-right: 5px;"> | |
| 19 | + <span class="input_clear_icon"></span> | |
| 20 | + <div class="uk-button-dropdown" data-uk-dropdown> | |
| 21 | + <a>选择停车场 <i class="uk-icon-angle-down"></i></a> | |
| 22 | + <div class="uk-dropdown uk-dropdown-scrollable" style="max-height: 300px;"> | |
| 23 | + <ul class="uk-nav uk-nav-dropdown parks_list"> | |
| 24 | + </ul> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | + | |
| 28 | + </div> | |
| 29 | + </div> | |
| 30 | + <div class="uk-form-row"> | |
| 31 | + <label class="uk-form-label">起点进场里程</label> | |
| 32 | + <div class="uk-form-icon"> | |
| 33 | + <i class="uk-icon-mile"></i> | |
| 34 | + <input type="number" name="upInMile" step="0.01" required> | |
| 35 | + </div> | |
| 36 | + </div> | |
| 37 | + <div class="uk-form-row"> | |
| 38 | + <label class="uk-form-label">终点进场里程</label> | |
| 39 | + <div class="uk-form-icon"> | |
| 40 | + <i class="uk-icon-mile"></i> | |
| 41 | + <input type="number" name="downInMile" step="0.01" required> | |
| 42 | + </div> | |
| 43 | + </div> | |
| 44 | + <div class="uk-form-row"> | |
| 45 | + <label class="uk-form-label">起点进场时间</label> | |
| 46 | + <div class="uk-form-icon"> | |
| 47 | + <i class="uk-icon-minute"></i> | |
| 48 | + <input type="text" name="upInTime" required> | |
| 49 | + </div> | |
| 50 | + </div> | |
| 51 | + <div class="uk-form-row"> | |
| 52 | + <label class="uk-form-label">终点进场时间</label> | |
| 53 | + <div class="uk-form-icon"> | |
| 54 | + <i class="uk-icon-minute"></i> | |
| 55 | + <input type="text" name="downInTime" required> | |
| 56 | + </div> | |
| 57 | + </div> | |
| 58 | + | |
| 59 | + <hr> | |
| 60 | + <div class="uk-form-row"> | |
| 61 | + <label class="uk-form-label">出场到起点里程</label> | |
| 62 | + <div class="uk-form-icon"> | |
| 63 | + <i class="uk-icon-mile"></i> | |
| 64 | + <input type="number" name="upOutMile" step="0.01" required> | |
| 65 | + </div> | |
| 66 | + </div> | |
| 67 | + <div class="uk-form-row"> | |
| 68 | + <label class="uk-form-label">出场到终点里程</label> | |
| 69 | + <div class="uk-form-icon"> | |
| 70 | + <i class="uk-icon-mile"></i> | |
| 71 | + <input type="number" name="downOutMile" step="0.01" required> | |
| 72 | + </div> | |
| 73 | + </div> | |
| 74 | + <div class="uk-form-row"> | |
| 75 | + <label class="uk-form-label">出场到起点时间</label> | |
| 76 | + <div class="uk-form-icon"> | |
| 77 | + <i class="uk-icon-minute"></i> | |
| 78 | + <input type="text" name="upOutTime" required> | |
| 79 | + </div> | |
| 80 | + </div> | |
| 81 | + <div class="uk-form-row"> | |
| 82 | + <label class="uk-form-label">出场到终点时间</label> | |
| 83 | + <div class="uk-form-icon"> | |
| 84 | + <i class="uk-icon-minute"></i> | |
| 85 | + <input type="text" name="downOutTime" required> | |
| 86 | + </div> | |
| 87 | + </div> | |
| 88 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | |
| 89 | + <button type="button" class="uk-button uk-modal-close">取消</button> | |
| 90 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | |
| 91 | + </div> | |
| 92 | + </form> | |
| 93 | + </div> | |
| 94 | + | |
| 95 | + <script id="park_list_dropdown-temp" type="text/html"> | |
| 96 | + {{each list as p i}} | |
| 97 | + <li data-code="{{p.code}}" data-name="{{p.name}}"><a>{{p.name}}</a></li> | |
| 98 | + {{if i == 0}} | |
| 99 | + <li class="uk-nav-divider"></li> | |
| 100 | + {{/if}} | |
| 101 | + {{/each}} | |
| 102 | + </script> | |
| 103 | + | |
| 104 | + <script> | |
| 105 | + (function () { | |
| 106 | + var modal = '#oil_station-modal', | |
| 107 | + sch, oilStation, information; | |
| 108 | + | |
| 109 | + var cognates = { | |
| 110 | + 'upInMile': 'upOutMile', | |
| 111 | + 'downInMile': 'downOutMile', | |
| 112 | + 'upInTime': 'upOutTime', | |
| 113 | + 'downInTime': 'downOutTime' | |
| 114 | + }; | |
| 115 | + $(modal).on('init', function (e, data) { | |
| 116 | + e.stopPropagation(); | |
| 117 | + sch = data.sch; | |
| 118 | + | |
| 119 | + $.get('/oilStation/'+sch.xlBm, function (rs) { | |
| 120 | + oilStation = rs; | |
| 121 | + setDefaultVal(oilStation); | |
| 122 | + }); | |
| 123 | + | |
| 124 | + $('form [name=qdzName]', modal).val(sch.xlName); | |
| 125 | + $('form [name=lineCode]', modal).val(sch.xlBm); | |
| 126 | + | |
| 127 | + //submit | |
| 128 | + var f = $('form', modal).formValidation({framework: 'uikit', locale: 'zh_CN'}); | |
| 129 | + f.on('success.form.fv', function(e) { | |
| 130 | + e.preventDefault(); | |
| 131 | + var data = $(this).serializeJSON(); | |
| 132 | + if(parkCode) | |
| 133 | + data.stationCode = parkCode; | |
| 134 | + | |
| 135 | + gb_common.$post('/oilStation', data, function (rs) { | |
| 136 | + notify_succ('添加成功!'); | |
| 137 | + UIkit.modal(modal).hide(); | |
| 138 | + $('#schedule-addsch_oil-modal').trigger('init', {sch: sch}); | |
| 139 | + }); | |
| 140 | + }); | |
| 141 | + | |
| 142 | + $('form input', modal).on('input', function () { | |
| 143 | + var name = $(this).attr('name'); | |
| 144 | + if(cognates[name]){ | |
| 145 | + $('form [name='+cognates[name]+']', modal).val($(this).val()).trigger('input'); | |
| 146 | + } | |
| 147 | + }); | |
| 148 | + | |
| 149 | + //线路标准 | |
| 150 | + information = gb_data_basic.getLineInformation(sch.xlBm); | |
| 151 | + //查询停车场 | |
| 152 | + $.get('/basic/parks', function (rs) { | |
| 153 | + var parks = [], index; | |
| 154 | + for(var code in rs){ | |
| 155 | + parks.push({code: code, name: rs[code]}); | |
| 156 | + if(code == information.carPark) | |
| 157 | + index = parks.length - 1; | |
| 158 | + } | |
| 159 | + | |
| 160 | + //将线路标准停车场排在第一个 | |
| 161 | + parks[index] = parks.splice(0, 1 , parks[index])[0]; | |
| 162 | + var htmlStr = template('park_list_dropdown-temp', {list: parks}); | |
| 163 | + $('.parks_list', modal).html(htmlStr); | |
| 164 | + //选择停车场 | |
| 165 | + $('.parks_list>li', modal).on('click', selectPark); | |
| 166 | + }); | |
| 167 | + }); | |
| 168 | + | |
| 169 | + function setDefaultVal(obj) { | |
| 170 | + if(!obj) | |
| 171 | + return; | |
| 172 | + $('form input', modal).each(function () { | |
| 173 | + var name = $(this).attr('name'); | |
| 174 | + if(obj[name] != null) | |
| 175 | + $(this).val(obj[name]); | |
| 176 | + }); | |
| 177 | + } | |
| 178 | + | |
| 179 | + var parkCode; | |
| 180 | + function selectPark() { | |
| 181 | + var code = $(this).data('code'); | |
| 182 | + var name = $(this).data('name'); | |
| 183 | + | |
| 184 | + //选择的是线路标准停车场 | |
| 185 | + if(code == information.carPark){ | |
| 186 | + //起点进场里程 | |
| 187 | + $('[name=upInMile]', modal).val(information.upInMileage).trigger('input'); | |
| 188 | + //起点进场时间 | |
| 189 | + $('[name=upInTime]', modal).val(information.upInTimer).trigger('input'); | |
| 190 | + //终点进场里程 | |
| 191 | + $('[name=downInMile]', modal).val(information.downOutMileage).trigger('input'); | |
| 192 | + //终点进场时间 | |
| 193 | + $('[name=downInTime]', modal).val(information.downInTimer).trigger('input'); | |
| 194 | + | |
| 195 | + //起点出场里程 | |
| 196 | + $('[name=upOutMile]', modal).val(information.upOutMileage).trigger('input'); | |
| 197 | + //起点出场时间 | |
| 198 | + $('[name=upOutTime]', modal).val(information.upOutTimer).trigger('input'); | |
| 199 | + //终点出场里程 | |
| 200 | + $('[name=downOutMile]', modal).val(information.downOutMileage).trigger('input'); | |
| 201 | + //终点出场时间 | |
| 202 | + $('[name=downOutTime]', modal).val(information.downOutTimer).trigger('input'); | |
| 203 | + } | |
| 204 | + else | |
| 205 | + clearInputs(); | |
| 206 | + | |
| 207 | + $('[name=stationName]', modal).val(name).addClass('readonly').attr('readonly', 'readonly'); | |
| 208 | + $('.input_clear_icon', modal).show(); | |
| 209 | + //记录停车场编码 | |
| 210 | + parkCode = code; | |
| 211 | + } | |
| 212 | + | |
| 213 | + $('.input_clear_icon', modal).on('click', function () { | |
| 214 | + $(this).hide(); | |
| 215 | + parkCode = null; | |
| 216 | + $('[name=stationName]', modal).val('').removeClass('readonly').removeAttr('readonly'); | |
| 217 | + | |
| 218 | + clearInputs(); | |
| 219 | + }); | |
| 220 | + | |
| 221 | + function clearInputs() { | |
| 222 | + $('[name=upInMile]', modal).val('').trigger('input'); | |
| 223 | + $('[name=upInTime]', modal).val('').trigger('input'); | |
| 224 | + $('[name=downInMile]', modal).val('').trigger('input'); | |
| 225 | + $('[name=downInTime]', modal).val('').trigger('input'); | |
| 226 | + $('[name=upOutMile]', modal).val('').trigger('input'); | |
| 227 | + $('[name=upOutTime]', modal).val('').trigger('input'); | |
| 228 | + $('[name=downOutMile]', modal).val('').trigger('input'); | |
| 229 | + $('[name=downOutTime]', modal).val('').trigger('input'); | |
| 230 | + } | |
| 231 | + })(); | |
| 232 | + </script> | |
| 233 | +</div> | ... | ... |
src/main/resources/static/real_control_v2/fragments/north/nav/history_sch_maintain.html
| 1 | -<div class="uk-modal" id="history-sch-maintain-modal"> | |
| 1 | +<div class="uk-modal ct_move_modal" id="history-sch-maintain-modal"> | |
| 2 | 2 | <div class="uk-modal-dialog" style="width: 1180px;"> |
| 3 | 3 | <a href="" class="uk-modal-close uk-close"></a> |
| 4 | - <h2>历史班次维护</h2> | |
| 4 | + <h2>历史路单维护</h2> | |
| 5 | 5 | |
| 6 | 6 | <div style="padding-left: 12px;margin: 20px 0"> |
| 7 | 7 | <ul class="uk-subnav uk-subnav-pill h-s-time"> |
| ... | ... | @@ -16,6 +16,8 @@ |
| 16 | 16 | <div class="uk-panel uk-panel-box uk-panel-box-primary"> |
| 17 | 17 | <form class="uk-form search-form"> |
| 18 | 18 | <fieldset data-uk-margin> |
| 19 | + <span class="horizontal-field">路牌</span> | |
| 20 | + <select name="lpName_eq" style="width: 80px;"></select> | |
| 19 | 21 | <span class="horizontal-field">上下行</span> |
| 20 | 22 | <select name="xlDir_eq"> |
| 21 | 23 | <option value="">全部</option> |
| ... | ... | @@ -40,6 +42,8 @@ |
| 40 | 42 | <div class="ct_table history-sch-table"> |
| 41 | 43 | <div class="ct_table_head"> |
| 42 | 44 | <dl> |
| 45 | + <dt>序号</dt> | |
| 46 | + <dt>路牌</dt> | |
| 43 | 47 | <dt>车辆</dt> |
| 44 | 48 | <dt>驾驶员</dt> |
| 45 | 49 | <dt>起点</dt> |
| ... | ... | @@ -47,7 +51,7 @@ |
| 47 | 51 | <dt>计发</dt> |
| 48 | 52 | <dt>待发</dt> |
| 49 | 53 | <dt>实发</dt> |
| 50 | - <dt>终点时间</dt> | |
| 54 | + <dt>终点实达</dt> | |
| 51 | 55 | <dt>备注</dt> |
| 52 | 56 | </dl> |
| 53 | 57 | </div> |
| ... | ... | @@ -55,8 +59,6 @@ |
| 55 | 59 | </div> |
| 56 | 60 | </div> |
| 57 | 61 | </div> |
| 58 | - <div class="uk-modal-footer uk-text-right pagination-wrap"> | |
| 59 | - </div> | |
| 60 | 62 | |
| 61 | 63 | <div class="load-panel"> |
| 62 | 64 | <i class="uk-icon-spinner uk-icon-spin"></i> |
| ... | ... | @@ -67,6 +69,8 @@ |
| 67 | 69 | <script id="history-sch-maintain-table-temp" type="text/html"> |
| 68 | 70 | {{each list as sch i}} |
| 69 | 71 | <dl data-id="{{sch.id}}"> |
| 72 | + <dd>{{i + 1}}</dd> | |
| 73 | + <dd>{{sch.lpName}}</dd> | |
| 70 | 74 | <dd>{{sch.clZbh}}</dd> |
| 71 | 75 | <dd>{{sch.jGh}}/{{sch.jName}}</dd> |
| 72 | 76 | <dd title="{{sch.qdzName}}">{{sch.qdzName}}</dd> |
| ... | ... | @@ -80,6 +84,8 @@ |
| 80 | 84 | <span class="uk-badge uk-badge-danger">直放</span> |
| 81 | 85 | {{else if sch.bcType == "major"}} |
| 82 | 86 | <span class="uk-badge uk-badge-danger">放站</span> |
| 87 | + {{else if sch.bcType == "region"}} | |
| 88 | + <span class="uk-badge sch_region">区间</span> | |
| 83 | 89 | {{/if}} |
| 84 | 90 | {{if sch.sflj}} |
| 85 | 91 | <span class="uk-badge uk-badge-danger">临加</span> |
| ... | ... | @@ -93,7 +99,7 @@ |
| 93 | 99 | <span class="uk-badge uk-badge-danger">烂班</span> |
| 94 | 100 | {{/if}} |
| 95 | 101 | </dd> |
| 96 | - <dd>{{sch.fcsjActual}}</dd> | |
| 102 | + <dd>{{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span></dd> | |
| 97 | 103 | <dd>{{sch.zdsjActual}}</dd> |
| 98 | 104 | <dd title="{{sch.remarks}}">{{sch.remarks}}</dd> |
| 99 | 105 | </dl> |
| ... | ... | @@ -103,6 +109,10 @@ |
| 103 | 109 | <script> |
| 104 | 110 | (function () { |
| 105 | 111 | var modal = '#history-sch-maintain-modal'; |
| 112 | + | |
| 113 | + //滚动条 | |
| 114 | + $('.history-sch-wrap', modal).perfectScrollbar({suppressScrollX: true}); | |
| 115 | + //history-sch-wrap | |
| 106 | 116 | $(modal).on('init', function (e, data) { |
| 107 | 117 | e.stopPropagation(); |
| 108 | 118 | $.get('/realSchedule/dateArray', function (rs) { |
| ... | ... | @@ -120,7 +130,8 @@ |
| 120 | 130 | }); |
| 121 | 131 | $('.h-s-line', modal).html(xlStr); |
| 122 | 132 | |
| 123 | - | |
| 133 | + clearLpSelect(); | |
| 134 | + //reLoadLp=true; | |
| 124 | 135 | jsQuery(); |
| 125 | 136 | }); |
| 126 | 137 | }); |
| ... | ... | @@ -132,11 +143,16 @@ |
| 132 | 143 | return; |
| 133 | 144 | $(this).parent().find('li.uk-active').removeClass('uk-active'); |
| 134 | 145 | $(this).addClass('uk-active'); |
| 146 | + clearLpSelect(); | |
| 147 | + //检索之前将滚动条置顶 | |
| 148 | + $('.history-sch-wrap', modal)[0].scrollTop = 0; | |
| 135 | 149 | jsQuery(); |
| 136 | 150 | }); |
| 137 | 151 | |
| 138 | 152 | $('.search-form', modal).on('submit', function (e) { |
| 139 | 153 | try { |
| 154 | + //检索之前将滚动条置顶 | |
| 155 | + $('.history-sch-wrap', modal)[0].scrollTop = 0; | |
| 140 | 156 | jsQuery(); |
| 141 | 157 | }catch(e){ |
| 142 | 158 | console.log(e); |
| ... | ... | @@ -144,7 +160,9 @@ |
| 144 | 160 | return false; |
| 145 | 161 | }); |
| 146 | 162 | |
| 147 | - var nbbmArray=[],jsyArray=[],loading; | |
| 163 | + var reLoadLp; | |
| 164 | + var nbbmArray,jsyArray,lpArray,loading; | |
| 165 | + var schArray;//主键映射 | |
| 148 | 166 | function jsQuery() { |
| 149 | 167 | var data = $('.search-form', modal).serializeJSON(); |
| 150 | 168 | var rq = $('.h-s-time li.uk-active', modal).text(), |
| ... | ... | @@ -161,27 +179,52 @@ |
| 161 | 179 | loading=true; |
| 162 | 180 | $.get('/realSchedule/all', data, function (rs) { |
| 163 | 181 | rs.sort(schedule_sort); |
| 164 | - var tbodyStr = template('history-sch-maintain-table-temp', {list: rs}); | |
| 165 | - $('.history-sch-table .ct_table_body', modal).html(tbodyStr); | |
| 166 | - | |
| 167 | 182 | //可搜索的车辆自编号和驾驶员 |
| 168 | 183 | nbbmArray=[]; |
| 169 | 184 | jsyArray=[]; |
| 185 | + lpArray = []; | |
| 186 | + schArray = {}; | |
| 170 | 187 | $.each(rs, function () { |
| 171 | 188 | nbbmArray.push({value: this.clZbh}); |
| 172 | 189 | jsyArray.push({value: this.jGh+'/'+this.jName, |
| 173 | 190 | fullChars: pinyin.getFullChars(this.jName).toUpperCase(), |
| 174 | 191 | camelChars: pinyin.getCamelChars(this.jName)}); |
| 192 | + lpArray.push({value: this.lpName}); | |
| 193 | + calc_sch_real_shift(this); | |
| 194 | + schArray[this.id] = this; | |
| 175 | 195 | }); |
| 196 | + | |
| 197 | + var tbodyStr = template('history-sch-maintain-table-temp', {list: rs}); | |
| 198 | + $('.history-sch-table .ct_table_body', modal).html(tbodyStr); | |
| 176 | 199 | //value |
| 177 | 200 | nbbmArray=distinctByField(nbbmArray); |
| 178 | 201 | jsyArray=distinctByField(jsyArray); |
| 202 | + lpArray=distinctByField(lpArray); | |
| 203 | + | |
| 204 | + if(reLoadLp){ | |
| 205 | + //路牌下拉框 | |
| 206 | + var ops = '<option value="">全部</option>'; | |
| 207 | + $.each(lpArray, function () { | |
| 208 | + ops += '<option value="'+this.value+'">'+this.value+'</option>'; | |
| 209 | + }); | |
| 210 | + $('[name=lpName_eq]', modal).html(ops); | |
| 211 | + reLoadLp = false; | |
| 212 | + } | |
| 213 | + | |
| 214 | + //lpName_eq | |
| 179 | 215 | $('.load-panel', modal).hide(); |
| 180 | 216 | loading=false; |
| 181 | 217 | |
| 218 | + //更新滚动条高度 | |
| 219 | + $('.history-sch-wrap', modal).perfectScrollbar('update'); | |
| 182 | 220 | }); |
| 183 | 221 | } |
| 184 | 222 | |
| 223 | + function clearLpSelect() { | |
| 224 | + $('[name=lpName_eq]', modal).val('').html(''); | |
| 225 | + reLoadLp = true; | |
| 226 | + } | |
| 227 | + | |
| 185 | 228 | //nbbm autocomplete |
| 186 | 229 | var carAutoCom=$('.autocomplete-cars', modal); |
| 187 | 230 | UIkit.autocomplete(carAutoCom, { |
| ... | ... | @@ -196,6 +239,8 @@ |
| 196 | 239 | rs.push(this); |
| 197 | 240 | count++; |
| 198 | 241 | } |
| 242 | + if (count >= 15) | |
| 243 | + return false; | |
| 199 | 244 | }); |
| 200 | 245 | release && release(rs); |
| 201 | 246 | } |
| ... | ... | @@ -225,7 +270,7 @@ |
| 225 | 270 | }); |
| 226 | 271 | |
| 227 | 272 | function schedule_sort(s1, s2) { |
| 228 | - return (s1.realExecDate+s1.dfsj).localeCompare(s2.realExecDate+s2.dfsj); | |
| 273 | + return (s1.realExecDate+s1.fcsj).localeCompare(s2.realExecDate+s2.fcsj); | |
| 229 | 274 | } |
| 230 | 275 | |
| 231 | 276 | function distinctByField(arr, f){ |
| ... | ... | @@ -246,11 +291,42 @@ |
| 246 | 291 | $(this).addClass('active'); |
| 247 | 292 | }); |
| 248 | 293 | |
| 294 | + var modal_opts = {center: false,bgclose: false, modal: false}; | |
| 295 | + var folder = '/real_control_v2/fragments/north/nav/history_sch'; | |
| 249 | 296 | var callbackHandler={ |
| 250 | 297 | edit: function(id){ |
| 251 | - open_modal('/real_control_v2/fragments/north/nav/history_sch/edit.html', {id: id, parentModal: modal}, {center: false,bgclose: false, modal: false}); | |
| 298 | + open_modal(folder + '/editor.html', {id: id, parentModal: modal}, modal_opts); | |
| 299 | + }, | |
| 300 | + add: function (id) { | |
| 301 | + open_modal(folder + '/h_add_temp_sch.html', { | |
| 302 | + sch: schArray[id] | |
| 303 | + }, modal_opts); | |
| 304 | + }, | |
| 305 | + delete: function (id) { | |
| 306 | + var sch = schArray[id]; | |
| 307 | + if (!sch || !sch.sflj) | |
| 308 | + return notify_err('只能删除临加班次!'); | |
| 309 | + var str = '<h3>确定要删除临加班次<span style="color:red;margin: 0 5px;">' + sch.clZbh + '( ' + sch.dfsj + ' )</span>?</h3><h5 style="color: #6c6c6c;font-size: 12px;">班次删除后,调度指令会保留</h5>'; | |
| 310 | + alt_confirm(str, function () { | |
| 311 | + gb_common.$del('/realSchedule/history/' + sch.id, function (rs) { | |
| 312 | + jsQuery(); | |
| 313 | + }); | |
| 314 | + }, '确定删除'); | |
| 252 | 315 | } |
| 253 | - } | |
| 316 | + }; | |
| 317 | + | |
| 318 | + //计算实发时间差值 | |
| 319 | + var calc_sch_real_shift = function (sch) { | |
| 320 | + if (sch.fcsjActualTime) { | |
| 321 | + var diff = parseInt((sch.fcsjActualTime - sch.dfsjT) / 1000 / 60); | |
| 322 | + if (diff > 0) | |
| 323 | + sch.fcsj_diff = '( +' + diff + ' )'; | |
| 324 | + else if (diff < 0) | |
| 325 | + sch.fcsj_diff = '( ' + diff + ' )'; | |
| 326 | + else | |
| 327 | + sch.fcsj_diff = ''; | |
| 328 | + } | |
| 329 | + }; | |
| 254 | 330 | |
| 255 | 331 | //右键菜单 |
| 256 | 332 | $.contextMenu({ |
| ... | ... | @@ -264,17 +340,11 @@ |
| 264 | 340 | 'edit': { |
| 265 | 341 | name: '编辑' |
| 266 | 342 | }, |
| 267 | - 'child_task':{ | |
| 268 | - name: '子任务', | |
| 269 | - disabled: true | |
| 270 | - }, | |
| 271 | 343 | 'add': { |
| 272 | - name: '新增', | |
| 273 | - disabled: true | |
| 344 | + name: '新增临加班次' | |
| 274 | 345 | }, |
| 275 | 346 | 'delete':{ |
| 276 | - name: '删除', | |
| 277 | - disabled: true | |
| 347 | + name: '删除' | |
| 278 | 348 | } |
| 279 | 349 | } |
| 280 | 350 | }); | ... | ... |
src/main/resources/static/real_control_v2/js/data/json/north_toolbar.json
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
src/main/resources/static/real_control_v2/js/main.js