Commit 50f37b34f2379c89084a293983b52fe7546c79b4

Authored by 游瑞烽
2 parents 7b71578f 668bce79

Merge branch 'pudong' of 192.168.168.201:panzhaov5/bsth_control into pudong

Showing 24 changed files with 1260 additions and 306 deletions
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
... ... @@ -48,7 +48,7 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo,
48 48 public Map<String, Object> outgoAdjust(@RequestParam Long id, @RequestParam String remarks,
49 49 @RequestParam String dfsj,String bcType,
50 50 @RequestParam(defaultValue = "") String opType) {
51   - return scheduleRealInfoService.outgoAdjust(id, remarks, dfsj, bcType, opType);
  51 + return scheduleRealInfoService.outgoAdjust(id, remarks, dfsj, bcType, opType, null);
52 52 }
53 53  
54 54 /**
... ... @@ -59,7 +59,7 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
59 59 public Map<String, Object> destroy(@RequestParam String idsStr
60 60 /*, @RequestParam(defaultValue = "-1") int spaceAdjust*/,
61 61 @RequestParam String remarks, @RequestParam String adjustExps/*, @RequestParam(defaultValue = "0") int spaceNum*/) {
62   - return scheduleRealInfoService.destroy(idsStr/*, spaceAdjust*/, remarks, adjustExps/*, spaceNum*/);
  62 + return scheduleRealInfoService.destroy(idsStr, remarks, adjustExps, null);
63 63 }
64 64  
65 65 /**
... ... @@ -520,7 +520,7 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
520 520 public Map<String, Object> multi_tzrc(@RequestParam String cpcsJson){
521 521 cpcsJson = StringEscapeUtils.unescapeHtml4(cpcsJson);
522 522 List<ChangePersonCar> cpcs = JSONArray.parseArray(cpcsJson, ChangePersonCar.class);
523   - return scheduleRealInfoService.multi_tzrc(cpcs);
  523 + return scheduleRealInfoService.multi_tzrc(cpcs, null);
524 524 }
525 525  
526 526 @RequestMapping(value="/multi_dftz", method=RequestMethod.POST)
... ...
src/main/java/com/bsth/controller/realcontrol/ServiceDataInterface.java
1 1 package com.bsth.controller.realcontrol;
2 2  
3 3 import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONArray;
  5 +import com.alibaba.fastjson.JSONObject;
  6 +import com.bsth.controller.realcontrol.dto.ChangePersonCar;
  7 +import com.bsth.controller.realcontrol.dto.DftzAndDestroy;
4 8 import com.bsth.data.BasicData;
5 9 import com.bsth.data.directive.DayOfDirectives;
6 10 import com.bsth.data.directive.DirectiveCreator;
... ... @@ -8,10 +12,12 @@ import com.bsth.data.directive.GatewayHttpUtils;
8 12 import com.bsth.data.gpsdata_v2.GpsRealData;
9 13 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
10 14 import com.bsth.data.schedule.DayOfSchedule;
  15 +import com.bsth.data.schedule.external.TccExternalService;
11 16 import com.bsth.entity.directive.D60;
12 17 import com.bsth.entity.realcontrol.ScheduleRealInfo;
13 18 import com.bsth.repository.directive.D60Repository;
14 19 import com.google.common.base.Splitter;
  20 +import org.apache.commons.lang3.StringEscapeUtils;
15 21 import org.apache.commons.lang3.StringUtils;
16 22 import org.slf4j.Logger;
17 23 import org.slf4j.LoggerFactory;
... ... @@ -44,12 +50,16 @@ public class ServiceDataInterface {
44 50 @Autowired
45 51 GpsRealData gpsRealData;
46 52  
  53 + @Autowired
  54 + TccExternalService tccExternalService;
  55 +
47 56 /**
48 57 * 获取车辆 和 当前执行班次对照信息
  58 + *
49 59 * @return
50 60 */
51 61 @RequestMapping("/execSchList")
52   - public List<Map<String, Object>> execSchList(@RequestParam String secretKey){
  62 + public List<Map<String, Object>> execSchList(@RequestParam String secretKey) {
53 63 if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
54 64 return null;
55 65  
... ... @@ -57,8 +67,8 @@ public class ServiceDataInterface {
57 67 Collection<ScheduleRealInfo> list = dayOfSchedule.execPlanMap().values();
58 68  
59 69 Map<String, Object> map;
60   - for(ScheduleRealInfo sch : list){
61   - if(null == sch)
  70 + for (ScheduleRealInfo sch : list) {
  71 + if (null == sch)
62 72 continue;
63 73 map = new HashMap<>();
64 74 map.put("clZbh", sch.getClZbh());
... ... @@ -105,7 +115,7 @@ public class ServiceDataInterface {
105 115 }
106 116  
107 117 @RequestMapping("/returnCCInfo")
108   - public List<ScheduleRealInfo> returnCCInfo(@RequestParam String companyId, @RequestParam String secretKey){
  118 + public List<ScheduleRealInfo> returnCCInfo(@RequestParam String companyId, @RequestParam String secretKey) {
109 119 if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
110 120 return null;
111 121  
... ... @@ -123,7 +133,7 @@ public class ServiceDataInterface {
123 133 }
124 134  
125 135 @RequestMapping("/returnJCInfo")
126   - public List<ScheduleRealInfo> returnJCInfo(@RequestParam String companyId, @RequestParam String secretKey){
  136 + public List<ScheduleRealInfo> returnJCInfo(@RequestParam String companyId, @RequestParam String secretKey) {
127 137 if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
128 138 return null;
129 139  
... ... @@ -141,10 +151,11 @@ public class ServiceDataInterface {
141 151  
142 152 /**
143 153 * 获取全量的进出场数据, 仅供接口项目调用。 由接口项目负责对外所有场站输出
  154 + *
144 155 * @return
145 156 */
146 157 @RequestMapping("/findCurrInAndOut")
147   - public List<ScheduleRealInfo> findCurrInAndOut(@RequestParam String secretKey){
  158 + public List<ScheduleRealInfo> findCurrInAndOut(@RequestParam String secretKey) {
148 159 if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
149 160 return null;
150 161  
... ... @@ -161,30 +172,29 @@ public class ServiceDataInterface {
161 172  
162 173 /**
163 174 * 向指定的车辆下发消息短语
164   - * @param nbbm
165   - * @param txt
  175 + *
166 176 * @return
167 177 */
168 178 @RequestMapping(value = "/send60Phrase", method = RequestMethod.POST)
169   - public int send60Phrase(@RequestBody Map<String, String> map,@RequestParam String secretKey){
170   - try{
  179 + public int send60Phrase(@RequestBody Map<String, String> map, @RequestParam String secretKey) {
  180 + try {
171 181 String nbbm = map.get("nbbm");
172 182 String txt = map.get("txt");
173 183 String sender = map.get("sender");
174   - if(txt.length() > 50)
  184 + if (txt.length() > 50)
175 185 txt = txt.substring(0, 50);
176 186 if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
177 187 return -500;
178 188  
179 189 //车辆和设备号对照
180 190 String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
181   - if(StringUtils.isEmpty(deviceId))
  191 + if (StringUtils.isEmpty(deviceId))
182 192 return -404;
183 193  
184 194 //检查设备是否在线
185 195 long t = System.currentTimeMillis();
186 196 GpsEntity gps = gpsRealData.get(deviceId);
187   - if(null == gps || (t - gps.getServerTimestamp()) > 1000 * 60 * 5)
  197 + if (null == gps || (t - gps.getServerTimestamp()) > 1000 * 60 * 5)
188 198 return -405;
189 199  
190 200 Short dispatchInstruct = 0;//消息短语
... ... @@ -199,7 +209,7 @@ public class ServiceDataInterface {
199 209  
200 210 dayOfDirectives.put60(d60);
201 211 return d60.getMsgId();
202   - }catch (Exception e){
  212 + } catch (Exception e) {
203 213 logger.error("", e);
204 214 return -500;
205 215 }
... ... @@ -207,23 +217,24 @@ public class ServiceDataInterface {
207 217  
208 218 /**
209 219 * 根据msg id 查询指令响应情况
210   - * @param msgIDs
  220 + *
  221 + * @param msgIds
211 222 * @return
212 223 */
213 224 @RequestMapping("/findD60Reply")
214   - public List<Map<String, Object>> findD60Reply(@RequestParam String msgIds){
  225 + public List<Map<String, Object>> findD60Reply(@RequestParam String msgIds) {
215 226 List<Map<String, Object>> rs = new ArrayList<>();
216   - try{
  227 + try {
217 228 Map<String, Object> map = new HashMap();
218 229  
219 230 List<String> ids = Splitter.on(",").splitToList(msgIds);
220 231 D60 d60;
221   - for(String id : ids){
222   - if(StringUtils.isEmpty(id))
  232 + for (String id : ids) {
  233 + if (StringUtils.isEmpty(id))
223 234 continue;
224 235  
225 236 d60 = dayOfDirectives.get(Integer.parseInt(id));
226   - if(null == d60)
  237 + if (null == d60)
227 238 continue;
228 239  
229 240 map.put("msgId", d60.getMsgId());
... ... @@ -231,7 +242,7 @@ public class ServiceDataInterface {
231 242 map.put("jsyReplyTime", d60.getReply47Time());
232 243 rs.add(map);
233 244 }
234   - }catch (Exception e){
  245 + } catch (Exception e) {
235 246 logger.error("", e);
236 247 }
237 248 return rs;
... ... @@ -239,18 +250,52 @@ public class ServiceDataInterface {
239 250  
240 251 /**
241 252 * 获取路牌下所有班次
  253 + *
242 254 * @param lineCode
243 255 * @param lpName
244 256 * @return
245 257 */
246 258 @RequestMapping("/findByLpName")
247   - public List<ScheduleRealInfo> findByLpName(@RequestParam String lineCode,@RequestParam String lpName){
248   - try{
  259 + public List<ScheduleRealInfo> findByLpName(@RequestParam String lineCode, @RequestParam String lpName, @RequestParam String secretKey) {
  260 + try {
  261 + if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
  262 + return null;
  263 +
249 264 List<ScheduleRealInfo> list = dayOfSchedule.getLpScheduleMap().get(lineCode + "_" + lpName);
250 265 return list;
251   - }catch (Exception e){
  266 + } catch (Exception e) {
252 267 logger.error("", e);
253 268 }
254 269 return null;
255 270 }
  271 +
  272 + /**
  273 + * 调整出场班次待发,并烂掉后续班次(调派用)
  274 + *
  275 + * @param dad
  276 + * @return
  277 + */
  278 + @RequestMapping(value = "/dftzAndDestroy", method = RequestMethod.POST)
  279 + public Map<String, Object> dftzAndDestroy(@RequestBody DftzAndDestroy dad, @RequestParam String secretKey) {
  280 + if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
  281 + return null;
  282 + return tccExternalService.dftz(dad);
  283 + }
  284 +
  285 + /**
  286 + * 换人换车,(调派用)
  287 + * @return
  288 + */
  289 + @RequestMapping(value = "/tccHrhc", method = RequestMethod.POST)
  290 + public Map<String, Object> hrhc(@RequestBody String jsonStr, @RequestParam String secretKey){
  291 +
  292 + if (StringUtils.isEmpty(secretKey) || !secretKey.equals(SECRE_KEY))
  293 + return null;
  294 +
  295 + jsonStr = StringEscapeUtils.unescapeHtml4(jsonStr);
  296 + JSONObject rootObj = JSON.parseObject(jsonStr);
  297 +
  298 + List<ChangePersonCar> cpcs = JSONArray.parseArray(rootObj.getString("cpcs"), ChangePersonCar.class);
  299 + return tccExternalService.hrhc(cpcs, rootObj.getString("tccCode"), rootObj.getString("userId"));
  300 + }
256 301 }
... ...
src/main/java/com/bsth/controller/realcontrol/dto/DftzAndDestroy.java 0 → 100644
  1 +package com.bsth.controller.realcontrol.dto;
  2 +
  3 +/**
  4 + * Created by panzhao on 2018/3/22.
  5 + */
  6 +public class DftzAndDestroy {
  7 +
  8 + /**
  9 + * 要调整待发的出场班次ID
  10 + */
  11 + private Long dftzId;
  12 +
  13 + /**
  14 + * 要设置的待发时间
  15 + */
  16 + private String newTimeStr;
  17 +
  18 + /**
  19 + * 要烂掉的班次的 班次id ,号分割多个
  20 + */
  21 + private String destroyIdx;
  22 +
  23 + /**
  24 + * 备注
  25 + */
  26 + private String remarks;
  27 +
  28 + private String reason;
  29 +
  30 + /**
  31 + * 调派工号
  32 + */
  33 + private String userId;
  34 +
  35 + public String getNewTimeStr() {
  36 + return newTimeStr;
  37 + }
  38 +
  39 + public void setNewTimeStr(String newTimeStr) {
  40 + this.newTimeStr = newTimeStr;
  41 + }
  42 +
  43 + public String getDestroyIdx() {
  44 + return destroyIdx;
  45 + }
  46 +
  47 + public void setDestroyIdx(String destroyIdx) {
  48 + this.destroyIdx = destroyIdx;
  49 + }
  50 +
  51 + public String getRemarks() {
  52 + return remarks;
  53 + }
  54 +
  55 + public void setRemarks(String remarks) {
  56 + this.remarks = remarks;
  57 + }
  58 +
  59 + public Long getDftzId() {
  60 + return dftzId;
  61 + }
  62 +
  63 + public void setDftzId(Long dftzId) {
  64 + this.dftzId = dftzId;
  65 + }
  66 +
  67 + public String getReason() {
  68 + return reason;
  69 + }
  70 +
  71 + public void setReason(String reason) {
  72 + this.reason = reason;
  73 + }
  74 +
  75 + public String getUserId() {
  76 + return userId;
  77 + }
  78 +
  79 + public void setUserId(String userId) {
  80 + this.userId = userId;
  81 + }
  82 +}
... ...
src/main/java/com/bsth/data/gpsdata_v2/GpsRealData.java
... ... @@ -129,8 +129,11 @@ public class GpsRealData {
129 129 Set<String> nbbmSet = dayOfSchedule.findCarByLineCode(lineCode);//计划用车
130 130  
131 131 Map<String, String> nbbm2deviceMap = BasicData.deviceId2NbbmMap.inverse();
  132 + String deviceId;
132 133 for(String nbbm : nbbmSet){
133   - set.add(nbbm2deviceMap.get(nbbm));
  134 + deviceId = nbbm2deviceMap.get(nbbm);
  135 + if(StringUtils.isNotEmpty(deviceId))
  136 + set.add(deviceId);
134 137 }
135 138  
136 139 List<GpsEntity> rs = new ArrayList<>();
... ...
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
... ... @@ -979,18 +979,21 @@ public class DayOfSchedule {
979 979 String rq = currSchDateMap.get(lineCode);
980 980 if (StringUtils.isNotEmpty(rq)) {
981 981 List<ScheduleRealInfo> all = findByLineCode(lineCode);
982   - //解除gps 和班次之间的关联
983   - List<ScheduleRealInfo> unions = calcUnion(all, carExecutePlanMap.values());
984   - for (ScheduleRealInfo sch : unions) {
985   - removeExecPlan(sch.getClZbh());
986   - }
987   - //解除调度指令和班次的外键约束
988   - StringBuilder inStr = new StringBuilder("(");
989   - for (ScheduleRealInfo sch : all) {
990   - inStr.append(sch.getId() + ",");
  982 +
  983 + if(null != all && all.size() > 0){
  984 + //解除gps 和班次之间的关联
  985 + List<ScheduleRealInfo> unions = calcUnion(all, carExecutePlanMap.values());
  986 + for (ScheduleRealInfo sch : unions) {
  987 + removeExecPlan(sch.getClZbh());
  988 + }
  989 + //解除调度指令和班次的外键约束
  990 + StringBuilder inStr = new StringBuilder("(");
  991 + for (ScheduleRealInfo sch : all) {
  992 + inStr.append(sch.getId() + ",");
  993 + }
  994 + inStr.deleteCharAt(inStr.length() - 1).append(")");
  995 + jdbcTemplate.update(Constants.MULTI_REMOVE_DIRECTIVE_SCH_FK + " " + inStr.toString());
991 996 }
992   - inStr.deleteCharAt(inStr.length() - 1).append(")");
993   - jdbcTemplate.update(Constants.MULTI_REMOVE_DIRECTIVE_SCH_FK + " " + inStr.toString());
994 997  
995 998 //删除班次数据
996 999 removeRealSch(lineCode, rq);
... ...
src/main/java/com/bsth/data/schedule/edit_logs/FormLogger.java
... ... @@ -37,7 +37,7 @@ public class FormLogger {
37 37 /**
38 38 * 换人换车情况表
39 39 */
40   - public void saveChangetochange(ScheduleRealInfo sch, ChangePersonCar cpc){
  40 + public void saveChangetochange(ScheduleRealInfo sch, ChangePersonCar cpc, String userId){
41 41 try {
42 42 String newNbbm = cpc.getClZbh();
43 43 String newJsy = cpc.getJsy();
... ... @@ -51,7 +51,6 @@ public class FormLogger {
51 51 return;
52 52  
53 53 Date d = new Date();
54   - SysUser user = SecurityUtils.getCurrentUser();
55 54 Changetochange cc = new Changetochange();
56 55 cc.setRq(sch.getScheduleDateStr());
57 56 cc.setGs(sch.getGsBm());
... ... @@ -61,8 +60,13 @@ public class FormLogger {
61 60 cc.setFssj(sch.getFcsj());
62 61 cc.setXgsj(fmtHHmm.print(d.getTime()));
63 62 cc.setsId(sch.getId());
64   - if(user != null)
  63 +
  64 + if(StringUtils.isEmpty(userId)){
  65 + SysUser user = SecurityUtils.getCurrentUser();
65 66 cc.setXgr(user.getUserName());
  67 + }
  68 + else
  69 + cc.setXgr(userId);
66 70  
67 71 cc.setPcch(sch.getClZbh());
68 72 cc.setPcry(oldJsy);
... ... @@ -86,7 +90,7 @@ public class FormLogger {
86 90 ChangePersonCar cpc = new ChangePersonCar();
87 91 cpc.setClZbh(nbbm);
88 92 cpc.setJsy(jsy);
89   - saveChangetochange(sch, cpc);
  93 + saveChangetochange(sch, cpc, null);
90 94 }
91 95  
92 96 public void saveDb(){
... ...
src/main/java/com/bsth/data/schedule/edit_logs/ScheduleModifyLogger.java
... ... @@ -28,14 +28,14 @@ public class ScheduleModifyLogger {
28 28  
29 29 /**
30 30 * 待发调整
31   - * opType 0: 双击调整、 1:待发调整、2:批量待发调整、3:间隔调整
  31 + * opType 0: 双击调整、 1:待发调整、2:批量待发调整、3:间隔调整、4:调派系统调整
32 32 */
33   - public static void dftz(ScheduleRealInfo sch, String opType, String oldDfsj, String nowDfsj, String remarks) {
  33 + public static void dftz(ScheduleRealInfo sch, String opType, String oldDfsj, String nowDfsj, String remarks, String userId) {
34 34 try {
35 35 if (oldDfsj.equals(nowDfsj))
36 36 return;
37 37  
38   - SchEditInfo sei = SchEditInfo.getInstance(sch);
  38 + SchEditInfo sei = SchEditInfo.getInstance(sch, userId);
39 39 sei.setType(EditType.DFTZ);
40 40 sei.setType2(opType);
41 41 sei.setRemarks(remarks == null ? "" : remarks);
... ... @@ -78,9 +78,9 @@ public class ScheduleModifyLogger {
78 78 *
79 79 * @param remarks
80 80 */
81   - public static void jhlb(ScheduleRealInfo sch, String remarks) {
  81 + public static void jhlb(ScheduleRealInfo sch, String remarks, String userId) {
82 82 try {
83   - SchEditInfo sei = SchEditInfo.getInstance(sch);
  83 + SchEditInfo sei = SchEditInfo.getInstance(sch, userId);
84 84 sei.setRemarks(remarks);
85 85 sei.setType(EditType.JHLB);
86 86  
... ... @@ -182,7 +182,7 @@ public class ScheduleModifyLogger {
182 182 * @param sch
183 183 * @param cpc
184 184 */
185   - public static void tzrc(ScheduleRealInfo sch, ChangePersonCar cpc) {
  185 + public static void tzrc(ScheduleRealInfo sch, ChangePersonCar cpc, String userId) {
186 186 try {
187 187 String newNbbm = cpc.getClZbh();
188 188 String newJsy = cpc.getJsy();
... ... @@ -218,7 +218,7 @@ public class ScheduleModifyLogger {
218 218 if(jobj.size() == 0)
219 219 return;
220 220  
221   - SchEditInfo sei = SchEditInfo.getInstance(sch);
  221 + SchEditInfo sei = SchEditInfo.getInstance(sch, userId);
222 222 sei.setType(EditType.TZRC);
223 223  
224 224 sei.setJsonArray(jobj.toJSONString());
... ...
src/main/java/com/bsth/data/schedule/edit_logs/entity/SchEditInfo.java
... ... @@ -160,6 +160,20 @@ public class SchEditInfo {
160 160 return sei;
161 161 }
162 162  
  163 + public static SchEditInfo getInstance(ScheduleRealInfo sch, String userId){
  164 + SchEditInfo sei = new SchEditInfo();
  165 + long t = System.currentTimeMillis();
  166 + sei.setTs(t);
  167 + sei.setTimeStr(fmtHHmm.print(t));
  168 + sei.setUser(userId);
  169 + sei.setRq(sch.getScheduleDateStr());
  170 + sei.setSchId(sch.getId());
  171 + sei.setLineCode(sch.getXlBm());
  172 + sei.setGsbm(sch.getGsBm());
  173 + sei.setFgsbm(sch.getFgsBm());
  174 + return sei;
  175 + }
  176 +
163 177 public String getLineCode() {
164 178 return lineCode;
165 179 }
... ...
src/main/java/com/bsth/data/schedule/external/TccExternalService.java 0 → 100644
  1 +package com.bsth.data.schedule.external;
  2 +
  3 +import com.bsth.common.ResponseCode;
  4 +import com.bsth.controller.realcontrol.dto.ChangePersonCar;
  5 +import com.bsth.controller.realcontrol.dto.DftzAndDestroy;
  6 +import com.bsth.data.schedule.DayOfSchedule;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import com.bsth.service.realcontrol.ScheduleRealInfoService;
  9 +import com.bsth.websocket.handler.SendUtils;
  10 +import org.apache.commons.lang3.StringUtils;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.stereotype.Component;
  15 +
  16 +import java.util.*;
  17 +
  18 +/**
  19 + * 对停车场开放的班次调度服务
  20 + * Created by panzhao on 2018/3/22.
  21 + */
  22 +@Component
  23 +public class TccExternalService {
  24 +
  25 + Logger logger = LoggerFactory.getLogger(TccExternalService.class);
  26 +
  27 + @Autowired
  28 + DayOfSchedule dayOfSchedule;
  29 +
  30 + @Autowired
  31 + ScheduleRealInfoService scheduleRealInfoService;
  32 +
  33 + @Autowired
  34 + SendUtils sendUtils;
  35 +
  36 + /**
  37 + * 待发调整
  38 + *
  39 + * @param dad
  40 + * @return
  41 + */
  42 + public Map<String, Object> dftz(DftzAndDestroy dad) {
  43 + Map<String, Object> rs = new HashMap();
  44 + rs.put("status", ResponseCode.ERROR);
  45 + try {
  46 + List<ScheduleRealInfo> updateList = new ArrayList<>();//要刷新的班次
  47 + ScheduleRealInfo sch = dayOfSchedule.get(dad.getDftzId());
  48 + if (null == sch) {
  49 + rs.put("msg", "班次已经不存在了!");
  50 + return rs;
  51 + }
  52 +
  53 + if (!sch.getBcType().equals("out")) {
  54 + rs.put("msg", "只能操作出场班次!");
  55 + return rs;
  56 + }
  57 +
  58 + //调整待发时间
  59 + scheduleRealInfoService.outgoAdjust(sch.getId(), dad.getRemarks(), dad.getNewTimeStr(), sch.getBcType(), "4", dad.getUserId());
  60 + updateList.add(sch);
  61 +
  62 + //需要烂班的班次
  63 + if (StringUtils.isNotEmpty(dad.getDestroyIdx())) {
  64 + Map<String, Object> dMap =
  65 + scheduleRealInfoService.destroy(dad.getDestroyIdx(), dad.getRemarks(), dad.getReason(), dad.getUserId());
  66 +
  67 +
  68 + updateList.addAll((Collection<? extends ScheduleRealInfo>) dMap.get("ts"));
  69 + }
  70 +
  71 + //通知调度客户端更新班次信息
  72 + sendUpdate2Page(updateList);
  73 +
  74 + rs.put("status", ResponseCode.SUCCESS);
  75 + rs.put("t", sch);
  76 + } catch (Exception e) {
  77 + rs.put("msg", "内部调度服务接口出现异常!");
  78 + logger.error("", e);
  79 + }
  80 + return rs;
  81 + }
  82 +
  83 + /**
  84 + * 换人换车
  85 + *
  86 + * @param cpcs
  87 + * @return
  88 + */
  89 + public Map<String, Object> hrhc(List<ChangePersonCar> cpcs,String tccCode, String userId) {
  90 + Map<String, Object> rs = new HashMap();
  91 + rs.put("status", ResponseCode.ERROR);
  92 + try {
  93 + rs = scheduleRealInfoService.multi_tzrc(cpcs, userId);
  94 +
  95 + //通知调度客户端更新班次信息
  96 + sendUpdate2Page(new ArrayList<ScheduleRealInfo>((Set)rs.get("ts")));
  97 +
  98 + //返回更新结果集中指定停车场的进出场班次
  99 + Set<ScheduleRealInfo> ts = (Set<ScheduleRealInfo>) rs.get("ts");
  100 + List<ScheduleRealInfo> list = new ArrayList<>();
  101 + for(ScheduleRealInfo sch : ts){
  102 + if((sch.getBcType().equals("out") && sch.getQdzCode().equals(tccCode))
  103 + || (sch.getBcType().equals("in") && sch.getZdzCode().equals(tccCode)))
  104 + list.add(sch);
  105 + }
  106 + rs.put("list", list);
  107 + rs.remove("ts");
  108 + } catch (Exception e) {
  109 + rs.put("msg", "服务器出现异常!");
  110 + logger.error("", e);
  111 + }
  112 + return rs;
  113 + }
  114 +
  115 +
  116 + public void sendUpdate2Page(List<ScheduleRealInfo> list) {
  117 + sendUtils.refreshSch(list);
  118 + }
  119 +}
... ...
src/main/java/com/bsth/data/schedule/late_adjust/LateAdjustHandle.java
... ... @@ -8,6 +8,7 @@ import com.bsth.entity.realcontrol.LineConfig;
8 8 import com.bsth.entity.realcontrol.ScheduleRealInfo;
9 9 import com.bsth.util.Arith;
10 10 import com.bsth.websocket.handler.SendUtils;
  11 +import com.google.common.collect.ArrayListMultimap;
11 12 import org.slf4j.Logger;
12 13 import org.slf4j.LoggerFactory;
13 14 import org.springframework.beans.BeansException;
... ... @@ -16,8 +17,7 @@ import org.springframework.context.ApplicationContextAware;
16 17 import org.springframework.stereotype.Component;
17 18  
18 19 import java.util.Collection;
19   -import java.util.HashMap;
20   -import java.util.Map;
  20 +import java.util.List;
21 21  
22 22 /**
23 23 * 误点自动调整待发 处理程序
... ... @@ -35,12 +35,14 @@ public class LateAdjustHandle implements ApplicationContextAware{
35 35  
36 36 /**
37 37 * 应发未到车辆 和 班次
  38 + *
  39 + * 起点相同的,保留最后一个班次
38 40 */
39   - private static Map<String, ScheduleRealInfo> lateSchMap;
  41 + private static ArrayListMultimap lateSchMaps;
40 42  
41 43  
42 44 static {
43   - lateSchMap = new HashMap<>();
  45 + lateSchMaps = ArrayListMultimap.create();
44 46 }
45 47  
46 48 /**
... ... @@ -48,125 +50,140 @@ public class LateAdjustHandle implements ApplicationContextAware{
48 50 * @param sch
49 51 */
50 52 public static void putLate(ScheduleRealInfo sch){
51   - try {
52   - //出场班次不需要
53   - if(sch.getBcType().equals("out"))
54   - return;
  53 + try{
55 54 //线路配置
56 55 LineConfig config = lineConfigData.get(sch.getXlBm());
57 56 if(sch.getLateMinute() == 0){
58   - if(config.isEnableYjtk()){
59   - sch.setLateMinute(sch.getXlDir().equals("0")?config.getUpStopMinute():config.getDownStopMinute());
60   - }
61   - else
  57 + if(!config.isEnableYjtk())
62 58 return;
  59 +
  60 + sch.setLateMinute(sch.getXlDir().equals("0")?config.getUpStopMinute():config.getDownStopMinute());
63 61 }
64 62  
65 63 if(sch.getDfsj().compareTo(config.getYjtkStart()) > 0
66 64 && sch.getDfsj().compareTo(config.getYjtkEnd()) <= 0){
67 65  
68   - ScheduleRealInfo cancel = null;
69   - //之前存在误点班次没有发出
70   - ScheduleRealInfo old = lateSchMap.get(sch.getClZbh());
  66 + ScheduleRealInfo old = popLateSch(sch);
  67 + if(null != old){
  68 + //通知客户端
  69 + sch.setLate2(true);
  70 + sendUtils.sendAutoWdtz(sch, old);
71 71  
72   - if(old != null && old.getDfsjT() < sch.getDfsjT()){
73   - //如果之前班次的 待发应到时间已经过了 3 分钟
74   - long t = System.currentTimeMillis();
75   - long dfEndTime = old.getDfsjT() + (old.getBcsj() * 60 * 1000);
76   - if((t - dfEndTime) > 1000 * 60 * 3){
77   -
78   - remove(old);
79   - cancel = old;
80   - logger.info("【应发未到】old 班次 " + old.getId() + " -被覆盖!");
81   - }
  72 + logger.info("【应发未到】班次 " + sch.getClZbh() + " -" + sch.getDfsj() + " -id: " + sch.getId() + " -加入误点调整!");
82 73 }
83   -
84   - lateSchMap.put(sch.getClZbh(), sch);
85   - //通知客户端
86   - sch.setLate2(true);
87   - sendUtils.sendAutoWdtz(sch, cancel);
88   -
89   - logger.info("【应发未到】班次 " + sch.getClZbh() + " -" + sch.getDfsj() + " -id: " + sch.getId() + " -加入误点调整!");
90 74 }
  75 +
91 76 }catch (Exception e){
92 77 logger.error("", e);
93 78 }
94 79 }
95 80  
  81 + /**
  82 + * 压入新的误点班次
  83 + * @param sch
  84 + * @return 返回被移除的误点班次
  85 + */
  86 + private static ScheduleRealInfo popLateSch(ScheduleRealInfo sch) {
  87 + List<ScheduleRealInfo> list = lateSchMaps.get(sch.getXlBm());
  88 +
  89 + if(null == list || list.size() == 0)
  90 + lateSchMaps.put(sch.getClZbh(), sch);
  91 + else {
  92 + ScheduleRealInfo old = findExistQdz(list, sch.getQdzCode(), sch.getQdzName());
  93 +
  94 + //同一个起点,保留时间最大的班次
  95 + if(null == old || old.getDfsjT() < sch.getDfsjT()){
  96 + lateSchMaps.remove(old.getClZbh(), old);
  97 + lateSchMaps.put(sch.getClZbh(), sch);
  98 +
  99 + logger.info(sch.getClZbh() + "【应发未到】old 班次 " + old.getId() + " -被覆盖!");
  100 + return old;
  101 + }
  102 + }
  103 +
  104 + return null;
  105 + }
  106 +
  107 + /**
  108 + * 搜索同样起点的班次
  109 + * @param list
  110 + * @return
  111 + */
  112 + private static ScheduleRealInfo findExistQdz(List<ScheduleRealInfo> list, String qdzCode, String qdzName) {
  113 + for(ScheduleRealInfo item : list){
  114 + if(item.getQdzCode().equals(qdzCode)
  115 + || item.getQdzName().equals(qdzName))
  116 + return item;
  117 + }
  118 + return null;
  119 + }
  120 +
96 121  
97 122 /**
98 123 * 获取所有应发未到的班次
99 124 * @return
100 125 */
101 126 public static Collection<ScheduleRealInfo> allLateSch(){
102   - return lateSchMap.values();
  127 + return lateSchMaps.values();
103 128 }
104 129  
105 130 public static void remove(ScheduleRealInfo sch){
106 131 try {
107   - if(lateSchMap.get(sch.getClZbh()) == sch){
108   - lateSchMap.remove(sch.getClZbh());
  132 + if(lateSchMaps.containsEntry(sch.getClZbh(), sch)){
  133 + lateSchMaps.remove(sch.getClZbh(), sch);
  134 +
109 135 sch.setLate2(false);
110 136 sch.setLateMinute(0);
111 137 sch.setDfAuto(false);
112 138  
113   - logger.info("移除误点调整 -" + sch.getClZbh());
  139 + logger.info("移除误点调整 -" + sch.getClZbh() + " -time: " + sch.getDfsj() + " -id: " + sch.getId());
114 140 }
115 141 }catch (Exception e){
116 142 logger.error("", e);
117 143 }
118 144 }
119 145  
120   -/* public static void remove(String nbbm){
121   - if(lateSchMap.containsKey(nbbm)){
122   - ScheduleRealInfo sch = lateSchMap.get(nbbm);
123   - sch.setLate2(false);
124   - sch.setLateMinute(0);
125   - sch.setDfAuto(false);
126   -
127   - lateSchMap.remove(nbbm);
128   - logger.info("移除误点调整 nbbm -" + nbbm);
129   - }
130   - }*/
131   -
132 146 /**
133 147 * 车辆到站
134 148 * @param gps
135 149 */
136 150 public static void carArrive(GpsEntity gps){
137 151 try{
138   - if(gps.getInstation() != 1)
  152 + List<ScheduleRealInfo> list = lateSchMaps.get(gps.getNbbm());
  153 +
  154 + if(null == list || list.size() == 0)
139 155 return;
140 156  
141   - ScheduleRealInfo sch = lateSchMap.get(gps.getNbbm());
142   - if(sch == null)
  157 + String key = gps.getStopNo();
  158 + if(gps.getInstation()==1)//站点名称
  159 + key = gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStopNo();
  160 +
  161 + gps.setStationName(BasicData.stationCode2NameMap.get(key));
  162 + //根据起点站获取误点班次
  163 + ScheduleRealInfo sch = findExistQdz(list, gps.getStopNo(), gps.getStationName());
  164 +
  165 + if(null == sch)
143 166 return;
144 167  
145 168 //可能是延迟信号,gps时间没有误点
146 169 if(gps.getTimestamp() <= sch.getDfsjT()){
147 170 sch.setLate2(false);
148   - lateSchMap.remove(sch.getClZbh());
  171 + lateSchMaps.remove(sch.getClZbh(), sch);
149 172 return;
150 173 }
151   - //进的是班次起点(名称一样即可)
152   - gps.setStationName(BasicData.stationCode2NameMap.get(gps.getLineId() + "_" + gps.getUpDown() + "_" + gps.getStopNo()));
  174 +
153 175 if(gps.getStationName().equals(sch.getQdzName())
154   - /*&& sch.getLateMinute() > 0*/){
  176 + || gps.getStopNo().equals(sch.getQdzCode())){
  177 +
155 178 //自动调整待发 到达时间 + 停靠时间
156 179 long dt = Arith.addLong(gps.getTimestamp(), (sch.getLateMinute() * 60 * 1000));
157 180  
158   - //超过2小时最大阈值,放弃 -临时代码,待删除
159   - if(Math.abs(dt - sch.getDfsjT()) > 1000 * 60 * 60 * 2){
160   - logger.info(sch.getClZbh() + " 超过误点调整阈值,放弃");
161   - }
162   - else{
163   - sch.setDfsjAll(dt);
164   - sch.setDfAuto(true);
165   - //取消应发未到标记
166   - sch.setLate2(false);
167   - }
  181 + sch.setDfsjAll(dt);
  182 + sch.setDfAuto(true);
  183 + //取消应发未到标记
  184 + sch.setLate2(false);
168 185  
169   - lateSchMap.remove(sch.getClZbh());
  186 + lateSchMaps.remove(sch.getClZbh(), sch);
170 187 logger.info("【应发未到】车辆到站 " + sch.getClZbh() + " -" + sch.getDfsj() + " -到站时间:" + gps.getTimestamp() + " -停靠时间:" + sch.getLateMinute() + " -自动设置的待发时间:" + dt);
171 188 }
172 189 }catch (Exception e){
... ...
src/main/java/com/bsth/service/realcontrol/ScheduleRealInfoService.java
... ... @@ -17,9 +17,9 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
17 17  
18 18 Map<String, Collection<ScheduleRealInfo>> findByLines(String lines);
19 19  
20   - Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType, String opType);
  20 + Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType, String opType,String userId);
21 21  
22   - Map<String, Object> destroy(String idsStr/*, int spaceAdjust*/, String remarks, String reason/*, int spaceNum*/);
  22 + Map<String, Object> destroy(String idsStr/*, int spaceAdjust*/, String remarks, String reason/*, int spaceNum*/, String userId);
23 23  
24 24 List<Map<String, String>> findDriverByLine(String lineCode);
25 25  
... ... @@ -135,7 +135,7 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
135 135  
136 136 List<Map<String,Object>> yesterdayDataList(String line);
137 137  
138   - Map<String, Object> multi_tzrc(List<ChangePersonCar> cpcs);
  138 + Map<String, Object> multi_tzrc(List<ChangePersonCar> cpcs, String userId);
139 139  
140 140 Map<String, Object> multi_dftz(List<DfsjChange> dfsjcs);
141 141  
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -229,7 +229,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
229 229 private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
230 230  
231 231 @Override
232   - public Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType, String opType) {
  232 + public Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType, String opType, String userId) {
233 233 Map<String, Object> map = new HashMap<>();
234 234 try {
235 235  
... ... @@ -251,7 +251,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
251 251 }
252 252  
253 253 //记录日志
254   - ScheduleModifyLogger.dftz(schedule,opType, schedule.getDfsj(),dfsj,remarks);
  254 + ScheduleModifyLogger.dftz(schedule,opType, schedule.getDfsj(),dfsj,remarks, userId);
255 255  
256 256 schedule.setDfsjAll(dfsj);
257 257 schedule.setDfAuto(false);
... ... @@ -316,7 +316,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
316 316 }
317 317  
318 318 @Override
319   - public Map<String, Object> destroy(String idsStr, /*int spaceAdjust, */String remarks, String reason/*, int spaceNum*/) {
  319 + public Map<String, Object> destroy(String idsStr, String remarks, String reason, String userId) {
320 320  
321 321 Map<String, Object> map = new HashMap<>();
322 322 List<ScheduleRealInfo> rsList = new ArrayList<>();
... ... @@ -333,7 +333,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
333 333 return map;
334 334 }
335 335 //记录日志
336   - ScheduleModifyLogger.jhlb(schedule, remarks);
  336 + ScheduleModifyLogger.jhlb(schedule, remarks, userId);
337 337  
338 338 schedule.setAdjustExps(reason);
339 339 schedule.destroy();
... ... @@ -1354,7 +1354,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1354 1354 sch = list.get(i);
1355 1355  
1356 1356 //调整待发
1357   - tempRs = outgoAdjust(sch.getId(), null, fmtHHmm.print(st), null, "3");
  1357 + tempRs = outgoAdjust(sch.getId(), null, fmtHHmm.print(st), null, "3", null);
1358 1358  
1359 1359 if(null != tempRs && tempRs.get("ts") != null)
1360 1360 tempTs = (List<ScheduleRealInfo>) tempRs.get("ts");
... ... @@ -1532,7 +1532,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1532 1532 */
1533 1533 if (map.get("status") != null
1534 1534 && Integer.parseInt(map.get("status").toString()) == -1) {
1535   - destroy(sch.getId() + "", "", map.get("adjustExps").toString());
  1535 + destroy(sch.getId() + "", "", map.get("adjustExps").toString(), null);
1536 1536 fLog.log("烂班");
1537 1537 }
1538 1538  
... ... @@ -1544,7 +1544,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1544 1544 double jhlcNum = Double.parseDouble(jhlc);
1545 1545 //烂班
1546 1546 if(jhlcNum == 0 && sch.getJhlcOrig() != 0 && !sch._isInout() && !sch.isDestroy()){
1547   - destroy(sch.getId() + "", "", map.get("adjustExps").toString());
  1547 + destroy(sch.getId() + "", "", map.get("adjustExps").toString(), null);
1548 1548 fLog.log("里程设置为0,自动烂班");
1549 1549 }
1550 1550 else if(jhlcNum != sch.getJhlc()){
... ... @@ -1600,7 +1600,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1600 1600 schedule = dayOfSchedule.get(id);
1601 1601  
1602 1602 if(schedule != null)
1603   - outgoAdjust(id, null, dfsj, null, "2");
  1603 + outgoAdjust(id, null, dfsj, null, "2", null);
1604 1604 }
1605 1605  
1606 1606 rs.put("status", ResponseCode.SUCCESS);
... ... @@ -3179,7 +3179,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3179 3179 * 批量调整人车
3180 3180 */
3181 3181 @Override
3182   - public Map<String, Object> multi_tzrc(List<ChangePersonCar> cpcs) {
  3182 + public Map<String, Object> multi_tzrc(List<ChangePersonCar> cpcs, String userId) {
3183 3183 Map<String, Object> rs = new HashMap<>();
3184 3184 Set<ScheduleRealInfo> set = new HashSet<>();
3185 3185  
... ... @@ -3218,9 +3218,9 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3218 3218 }
3219 3219  
3220 3220 //为换人换车情况表写入数据
3221   - schModifyLog.saveChangetochange(sch, cpc);
  3221 + schModifyLog.saveChangetochange(sch, cpc, userId);
3222 3222 //日志记录
3223   - ScheduleModifyLogger.tzrc(sch, cpc);
  3223 + ScheduleModifyLogger.tzrc(sch, cpc, userId);
3224 3224  
3225 3225 //换驾驶员
3226 3226 if (StringUtils.isNotEmpty(cpc.getJsy())) {
... ... @@ -3232,7 +3232,9 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3232 3232 }
3233 3233  
3234 3234 //换售票员
3235   - if (StringUtils.isNotEmpty(cpc.getSpy())) {
  3235 + if (StringUtils.isNotEmpty(cpc.getSpy())
  3236 + && cpc.getSpy().indexOf("/")!=-1
  3237 + && cpc.getSpy().length() > 1) {
3236 3238 sGh = cpc.getSpy().split("/")[0];
3237 3239 sName = getPersonName(sch.getGsBm(), sGh);
3238 3240 if(StringUtils.isEmpty(sName)){
... ... @@ -3322,7 +3324,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3322 3324 if (StringUtils.isEmpty(dc.getOld_dfsj()) || StringUtils.isEmpty(dc.getNew_dfsj()))
3323 3325 continue;
3324 3326  
3325   - tempMap = outgoAdjust(dc.getSchId(), "", dc.getNew_dfsj(), null, "2");
  3327 + tempMap = outgoAdjust(dc.getSchId(), "", dc.getNew_dfsj(), null, "2", null);
3326 3328  
3327 3329 if (tempMap.get("status").equals(ResponseCode.SUCCESS)) {
3328 3330 list.addAll((Collection<? extends ScheduleRealInfo>) tempMap.get("ts"));
... ...
src/main/java/com/bsth/websocket/dto/WsScheduleRealInfo.java
... ... @@ -6,10 +6,7 @@ import com.bsth.entity.realcontrol.ScheduleRealInfo;
6 6 import javax.persistence.FetchType;
7 7 import javax.persistence.OneToMany;
8 8 import javax.persistence.Transient;
9   -import java.util.ArrayList;
10   -import java.util.HashSet;
11   -import java.util.List;
12   -import java.util.Set;
  9 +import java.util.*;
13 10  
14 11 /**
15 12 * 精简字段的实际排班 entity
... ... @@ -73,7 +70,7 @@ public class WsScheduleRealInfo {
73 70 }
74 71  
75 72  
76   - public static List<WsScheduleRealInfo> getMultiInstance(List<ScheduleRealInfo> list){
  73 + public static List<WsScheduleRealInfo> getMultiInstance(Collection<ScheduleRealInfo> list){
77 74 List<WsScheduleRealInfo> rs = new ArrayList<>();
78 75 for(ScheduleRealInfo sch : list){
79 76 rs.add(getInstance(sch));
... ...
src/main/resources/static/real_control_v2/assets/plugins/uikit-2.27.1/components/lightbox.js 0 → 100644
  1 +/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
  2 +(function(addon) {
  3 +
  4 + var component;
  5 +
  6 + if (window.UIkit) {
  7 + component = addon(UIkit);
  8 + }
  9 +
  10 + if (typeof define == "function" && define.amd) { // AMD
  11 + define("uikit-lightbox", ["uikit"], function(){
  12 + return component || addon(UIkit);
  13 + });
  14 + }
  15 +
  16 +})(function(UI){
  17 +
  18 + "use strict";
  19 +
  20 + var modal, cache = {};
  21 +
  22 + UI.component('lightbox', {
  23 +
  24 + defaults: {
  25 + "group" : false,
  26 + "duration" : 400,
  27 + "keyboard" : true
  28 + },
  29 +
  30 + index : 0,
  31 + items : false,
  32 +
  33 + boot: function() {
  34 +
  35 + UI.$html.on('click', '[data-uk-lightbox]', function(e){
  36 +
  37 + e.preventDefault();
  38 +
  39 + var link = UI.$(this);
  40 +
  41 + if (!link.data("lightbox")) {
  42 +
  43 + UI.lightbox(link, UI.Utils.options(link.attr("data-uk-lightbox")));
  44 + }
  45 +
  46 + link.data("lightbox").show(link);
  47 + });
  48 +
  49 + // keyboard navigation
  50 + UI.$doc.on('keyup', function(e) {
  51 +
  52 + if (modal && modal.is(':visible') && modal.lightbox.options.keyboard) {
  53 +
  54 + e.preventDefault();
  55 +
  56 + switch(e.keyCode) {
  57 + case 37:
  58 + modal.lightbox.previous();
  59 + break;
  60 + case 39:
  61 + modal.lightbox.next();
  62 + break;
  63 + }
  64 + }
  65 + });
  66 + },
  67 +
  68 + init: function() {
  69 +
  70 + var siblings = [];
  71 +
  72 + this.index = 0;
  73 + this.siblings = [];
  74 +
  75 + if (this.element && this.element.length) {
  76 +
  77 + var domSiblings = this.options.group ? UI.$([
  78 + '[data-uk-lightbox*="'+this.options.group+'"]',
  79 + "[data-uk-lightbox*='"+this.options.group+"']"
  80 + ].join(',')) : this.element;
  81 +
  82 + domSiblings.each(function() {
  83 +
  84 + var ele = UI.$(this);
  85 +
  86 + siblings.push({
  87 + 'source': ele.attr('href'),
  88 + 'title' : ele.attr('data-title') || ele.attr('title'),
  89 + 'type' : ele.attr("data-lightbox-type") || 'auto',
  90 + 'link' : ele
  91 + });
  92 + });
  93 +
  94 + this.index = domSiblings.index(this.element);
  95 + this.siblings = siblings;
  96 +
  97 + } else if (this.options.group && this.options.group.length) {
  98 + this.siblings = this.options.group;
  99 + }
  100 +
  101 + this.trigger('lightbox-init', [this]);
  102 + },
  103 +
  104 + show: function(index) {
  105 +
  106 + this.modal = getModal(this);
  107 +
  108 + // stop previous animation
  109 + this.modal.dialog.stop();
  110 + this.modal.content.stop();
  111 +
  112 + var $this = this, promise = UI.$.Deferred(), data, item;
  113 +
  114 + index = index || 0;
  115 +
  116 + // index is a jQuery object or DOM element
  117 + if (typeof(index) == 'object') {
  118 +
  119 + this.siblings.forEach(function(s, idx){
  120 +
  121 + if (index[0] === s.link[0]) {
  122 + index = idx;
  123 + }
  124 + });
  125 + }
  126 +
  127 + // fix index if needed
  128 + if ( index < 0 ) {
  129 + index = this.siblings.length - index;
  130 + } else if (!this.siblings[index]) {
  131 + index = 0;
  132 + }
  133 +
  134 + item = this.siblings[index];
  135 +
  136 + data = {
  137 + "lightbox" : $this,
  138 + "source" : item.source,
  139 + "type" : item.type,
  140 + "index" : index,
  141 + "promise" : promise,
  142 + "title" : item.title,
  143 + "item" : item,
  144 + "meta" : {
  145 + "content" : '',
  146 + "width" : null,
  147 + "height" : null
  148 + }
  149 + };
  150 +
  151 + this.index = index;
  152 +
  153 + this.modal.content.empty();
  154 +
  155 + if (!this.modal.is(':visible')) {
  156 + this.modal.content.css({width:'', height:''}).empty();
  157 + this.modal.modal.show();
  158 + }
  159 +
  160 + this.modal.loader.removeClass('uk-hidden');
  161 +
  162 + promise.promise().done(function() {
  163 +
  164 + $this.data = data;
  165 + $this.fitSize(data);
  166 +
  167 + }).fail(function(){
  168 +
  169 + data.meta.content = '<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>';
  170 + data.meta.width = 400;
  171 + data.meta.height = 300;
  172 +
  173 + $this.data = data;
  174 + $this.fitSize(data);
  175 + });
  176 +
  177 + $this.trigger('showitem.uk.lightbox', [data]);
  178 + },
  179 +
  180 + fitSize: function() {
  181 +
  182 + var $this = this,
  183 + data = this.data,
  184 + pad = this.modal.dialog.outerWidth() - this.modal.dialog.width(),
  185 + dpadTop = parseInt(this.modal.dialog.css('margin-top'), 10),
  186 + dpadBot = parseInt(this.modal.dialog.css('margin-bottom'), 10),
  187 + dpad = dpadTop + dpadBot,
  188 + content = data.meta.content,
  189 + duration = $this.options.duration;
  190 +
  191 + if (this.siblings.length > 1) {
  192 +
  193 + content = [
  194 + content,
  195 + '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>',
  196 + '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'
  197 + ].join('');
  198 + }
  199 +
  200 + // calculate width
  201 + var tmp = UI.$('<div>&nbsp;</div>').css({
  202 + 'opacity' : 0,
  203 + 'position' : 'absolute',
  204 + 'top' : 0,
  205 + 'left' : 0,
  206 + 'width' : '100%',
  207 + 'max-width' : $this.modal.dialog.css('max-width'),
  208 + 'padding' : $this.modal.dialog.css('padding'),
  209 + 'margin' : $this.modal.dialog.css('margin')
  210 + }), maxwidth, maxheight, w = data.meta.width, h = data.meta.height;
  211 +
  212 + tmp.appendTo('body').width();
  213 +
  214 + maxwidth = tmp.width();
  215 + maxheight = window.innerHeight - dpad;
  216 +
  217 + tmp.remove();
  218 +
  219 + this.modal.dialog.find('.uk-modal-caption').remove();
  220 +
  221 + if (data.title) {
  222 + this.modal.dialog.append('<div class="uk-modal-caption">'+data.title+'</div>');
  223 + maxheight -= this.modal.dialog.find('.uk-modal-caption').outerHeight();
  224 + }
  225 +
  226 + if (maxwidth < data.meta.width) {
  227 +
  228 + h = Math.floor( h * (maxwidth / w) );
  229 + w = maxwidth;
  230 + }
  231 +
  232 + if (maxheight < h) {
  233 +
  234 + h = Math.floor(maxheight);
  235 + w = Math.ceil(data.meta.width * (maxheight/data.meta.height));
  236 + }
  237 +
  238 + this.modal.content.css('opacity', 0).width(w).html(content);
  239 +
  240 + if (data.type == 'iframe') {
  241 + this.modal.content.find('iframe:first').height(h);
  242 + }
  243 +
  244 + var dh = h + pad,
  245 + t = Math.floor(window.innerHeight/2 - dh/2) - dpad;
  246 +
  247 + if (t < 0) { t = 0; }
  248 +
  249 + this.modal.closer.addClass('uk-hidden');
  250 +
  251 + if ($this.modal.data('mwidth') == w && $this.modal.data('mheight') == h) {
  252 + duration = 0;
  253 + }
  254 +
  255 + this.modal.dialog.animate({width: w + pad, height: h + pad, top: t }, duration, 'swing', function() {
  256 + $this.modal.loader.addClass('uk-hidden');
  257 + $this.modal.content.css({width:''}).animate({'opacity': 1}, function() {
  258 + $this.modal.closer.removeClass('uk-hidden');
  259 + });
  260 +
  261 + $this.modal.data({'mwidth': w, 'mheight': h});
  262 + });
  263 + },
  264 +
  265 + next: function() {
  266 + this.show(this.siblings[(this.index+1)] ? (this.index+1) : 0);
  267 + },
  268 +
  269 + previous: function() {
  270 + this.show(this.siblings[(this.index-1)] ? (this.index-1) : this.siblings.length-1);
  271 + }
  272 + });
  273 +
  274 +
  275 + // Plugins
  276 +
  277 + UI.plugin('lightbox', 'image', {
  278 +
  279 + init: function(lightbox) {
  280 +
  281 + lightbox.on("showitem.uk.lightbox", function(e, data){
  282 +
  283 + if (data.type == 'image' || data.source && data.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)) {
  284 +
  285 + var resolve = function(source, width, height) {
  286 +
  287 + data.meta = {
  288 + "content" : '<img class="uk-responsive-width" width="'+width+'" height="'+height+'" src ="'+source+'">',
  289 + "width" : width,
  290 + "height" : height
  291 + };
  292 +
  293 + data.type = 'image';
  294 +
  295 + data.promise.resolve();
  296 + };
  297 +
  298 + if (!cache[data.source]) {
  299 +
  300 + var img = new Image();
  301 +
  302 + img.onerror = function(){
  303 + data.promise.reject('Loading image failed');
  304 + };
  305 +
  306 + img.onload = function(){
  307 + cache[data.source] = {width: img.width, height: img.height};
  308 + resolve(data.source, cache[data.source].width, cache[data.source].height);
  309 + };
  310 +
  311 + img.src = data.source;
  312 +
  313 + } else {
  314 + resolve(data.source, cache[data.source].width, cache[data.source].height);
  315 + }
  316 + }
  317 + });
  318 + }
  319 + });
  320 +
  321 + UI.plugin("lightbox", "youtube", {
  322 +
  323 + init: function(lightbox) {
  324 +
  325 + var youtubeRegExp = /(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,
  326 + youtubeRegExpShort = /youtu\.be\/(.*)/;
  327 +
  328 +
  329 + lightbox.on("showitem.uk.lightbox", function(e, data){
  330 +
  331 + var id, matches, resolve = function(id, width, height) {
  332 +
  333 + data.meta = {
  334 + 'content': '<iframe src="//www.youtube.com/embed/'+id+'" width="'+width+'" height="'+height+'" style="max-width:100%;"></iframe>',
  335 + 'width': width,
  336 + 'height': height
  337 + };
  338 +
  339 + data.type = 'iframe';
  340 +
  341 + data.promise.resolve();
  342 + };
  343 +
  344 + if (matches = data.source.match(youtubeRegExp)) {
  345 + id = matches[2];
  346 + }
  347 +
  348 + if (matches = data.source.match(youtubeRegExpShort)) {
  349 + id = matches[1];
  350 + }
  351 +
  352 + if (id) {
  353 +
  354 + if(!cache[id]) {
  355 +
  356 + var img = new Image(), lowres = false;
  357 +
  358 + img.onerror = function(){
  359 + cache[id] = {width:640, height:320};
  360 + resolve(id, cache[id].width, cache[id].height);
  361 + };
  362 +
  363 + img.onload = function(){
  364 + //youtube default 404 thumb, fall back to lowres
  365 + if (img.width == 120 && img.height == 90) {
  366 + if (!lowres) {
  367 + lowres = true;
  368 + img.src = '//img.youtube.com/vi/' + id + '/0.jpg';
  369 + } else {
  370 + cache[id] = {width: 640, height: 320};
  371 + resolve(id, cache[id].width, cache[id].height);
  372 + }
  373 + } else {
  374 + cache[id] = {width: img.width, height: img.height};
  375 + resolve(id, img.width, img.height);
  376 + }
  377 + };
  378 +
  379 + img.src = '//img.youtube.com/vi/'+id+'/maxresdefault.jpg';
  380 +
  381 + } else {
  382 + resolve(id, cache[id].width, cache[id].height);
  383 + }
  384 +
  385 + e.stopImmediatePropagation();
  386 + }
  387 + });
  388 + }
  389 + });
  390 +
  391 +
  392 + UI.plugin("lightbox", "vimeo", {
  393 +
  394 + init: function(lightbox) {
  395 +
  396 + var regex = /(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/, matches;
  397 +
  398 +
  399 + lightbox.on("showitem.uk.lightbox", function(e, data){
  400 +
  401 + var id, resolve = function(id, width, height) {
  402 +
  403 + data.meta = {
  404 + 'content': '<iframe src="//player.vimeo.com/video/'+id+'" width="'+width+'" height="'+height+'" style="width:100%;box-sizing:border-box;"></iframe>',
  405 + 'width': width,
  406 + 'height': height
  407 + };
  408 +
  409 + data.type = 'iframe';
  410 +
  411 + data.promise.resolve();
  412 + };
  413 +
  414 + if (matches = data.source.match(regex)) {
  415 +
  416 + id = matches[2];
  417 +
  418 + if(!cache[id]) {
  419 +
  420 + UI.$.ajax({
  421 + type : 'GET',
  422 + url : 'http://vimeo.com/api/oembed.json?url=' + encodeURI(data.source),
  423 + jsonp : 'callback',
  424 + dataType : 'jsonp',
  425 + success : function(data) {
  426 + cache[id] = {width:data.width, height:data.height};
  427 + resolve(id, cache[id].width, cache[id].height);
  428 + }
  429 + });
  430 +
  431 + } else {
  432 + resolve(id, cache[id].width, cache[id].height);
  433 + }
  434 +
  435 + e.stopImmediatePropagation();
  436 + }
  437 + });
  438 + }
  439 + });
  440 +
  441 + UI.plugin("lightbox", "video", {
  442 +
  443 + init: function(lightbox) {
  444 +
  445 + lightbox.on("showitem.uk.lightbox", function(e, data){
  446 +
  447 +
  448 + var resolve = function(source, width, height) {
  449 +
  450 + data.meta = {
  451 + 'content': '<video class="uk-responsive-width" src="'+source+'" width="'+width+'" height="'+height+'" controls></video>',
  452 + 'width': width,
  453 + 'height': height
  454 + };
  455 +
  456 + data.type = 'video';
  457 +
  458 + data.promise.resolve();
  459 + };
  460 +
  461 + if (data.type == 'video' || data.source.match(/\.(mp4|webm|ogv)$/i)) {
  462 +
  463 + if (!cache[data.source]) {
  464 +
  465 + var vid = UI.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr('src', data.source).appendTo('body');
  466 +
  467 + var idle = setInterval(function() {
  468 +
  469 + if (vid[0].videoWidth) {
  470 + clearInterval(idle);
  471 + cache[data.source] = {width: vid[0].videoWidth, height: vid[0].videoHeight};
  472 + resolve(data.source, cache[data.source].width, cache[data.source].height);
  473 + vid.remove();
  474 + }
  475 +
  476 + }, 20);
  477 +
  478 + } else {
  479 + resolve(data.source, cache[data.source].width, cache[data.source].height);
  480 + }
  481 + }
  482 + });
  483 + }
  484 + });
  485 +
  486 +
  487 + function getModal(lightbox) {
  488 +
  489 + if (modal) {
  490 + modal.lightbox = lightbox;
  491 + return modal;
  492 + }
  493 +
  494 + // init lightbox container
  495 + modal = UI.$([
  496 + '<div class="uk-modal">',
  497 + '<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:'+Math.abs(window.innerHeight/2 - 200)+'px;">',
  498 + '<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>',
  499 + '<div class="uk-lightbox-content"></div>',
  500 + '<div class="uk-modal-spinner uk-hidden"></div>',
  501 + '</div>',
  502 + '</div>'
  503 + ].join('')).appendTo('body');
  504 +
  505 + modal.dialog = modal.find('.uk-modal-dialog:first');
  506 + modal.content = modal.find('.uk-lightbox-content:first');
  507 + modal.loader = modal.find('.uk-modal-spinner:first');
  508 + modal.closer = modal.find('.uk-close.uk-close-alt');
  509 + modal.modal = UI.modal(modal, {modal:false, bgclose: false});
  510 +
  511 + // next / previous
  512 +/* modal.on("swipeRight swipeLeft", function(e) {
  513 + modal.lightbox[e.type=='swipeLeft' ? 'next':'previous']();
  514 + }).on("click", "[data-lightbox-previous], [data-lightbox-next]", function(e){
  515 + e.preventDefault();
  516 + modal.lightbox[UI.$(this).is('[data-lightbox-next]') ? 'next':'previous']();
  517 + });*/
  518 +
  519 + // destroy content on modal hide
  520 + modal.on("hide.uk.modal", function(e) {
  521 + modal.content.html('');
  522 + });
  523 +
  524 + UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(e){
  525 + if (modal.is(':visible') && !UI.Utils.isFullscreen()) modal.lightbox.fitSize();
  526 + }.bind(this), 100));
  527 +
  528 + modal.lightbox = lightbox;
  529 +
  530 + return modal;
  531 + }
  532 +
  533 + UI.lightbox.create = function(items, options) {
  534 +
  535 + if (!items) return;
  536 +
  537 + var group = [], o;
  538 +
  539 + items.forEach(function(item) {
  540 +
  541 + group.push(UI.$.extend({
  542 + 'source' : '',
  543 + 'title' : '',
  544 + 'type' : 'auto',
  545 + 'link' : false
  546 + }, (typeof(item) == 'string' ? {'source': item} : item)));
  547 + });
  548 +
  549 + o = UI.lightbox(UI.$.extend({}, options, {'group':group}));
  550 +
  551 + return o;
  552 + };
  553 +
  554 + return UI.lightbox;
  555 +});
... ...
src/main/resources/static/real_control_v2/assets/plugins/uikit-2.27.1/components/lightbox.min.js
1   -/* UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
2   -!function(i){var t;window.UIkit&&(t=i(UIkit)),"function"==typeof define&&define.amd&&define("uikit-lightbox",["uikit"],function(){return t||i(UIkit)})}(function(i){"use strict";function t(t){if(e)return e.lightbox=t,e;e=i.$(['<div class="uk-modal">','<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:'+Math.abs(window.innerHeight/2-200)+'px;">','<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>','<div class="uk-lightbox-content"></div>','<div class="uk-modal-spinner uk-hidden"></div>',"</div>","</div>"].join("")).appendTo("body"),e.dialog=e.find(".uk-modal-dialog:first"),e.content=e.find(".uk-lightbox-content:first"),e.loader=e.find(".uk-modal-spinner:first"),e.closer=e.find(".uk-close.uk-close-alt"),e.modal=i.modal(e,{modal:!1}),e.on("swipeRight swipeLeft",function(i){e.lightbox["swipeLeft"==i.type?"next":"previous"]()}).on("click","[data-lightbox-previous], [data-lightbox-next]",function(t){t.preventDefault(),e.lightbox[i.$(this).is("[data-lightbox-next]")?"next":"previous"]()}),e.on("hide.uk.modal",function(){e.content.html("")});var o={w:window.innerWidth,h:window.innerHeight};return i.$win.on("load resize orientationchange",i.Utils.debounce(function(){o.w!==window.innerWidth&&e.is(":visible")&&!i.Utils.isFullscreen()&&e.lightbox.fitSize(),o={w:window.innerWidth,h:window.innerHeight}},100)),e.lightbox=t,e}var e,o={};return i.component("lightbox",{defaults:{allowfullscreen:!0,duration:400,group:!1,keyboard:!0},index:0,items:!1,boot:function(){i.$html.on("click","[data-uk-lightbox]",function(t){t.preventDefault();var e=i.$(this);e.data("lightbox")||i.lightbox(e,i.Utils.options(e.attr("data-uk-lightbox"))),e.data("lightbox").show(e)}),i.$doc.on("keyup",function(i){if(e&&e.is(":visible")&&e.lightbox.options.keyboard)switch(i.preventDefault(),i.keyCode){case 37:e.lightbox.previous();break;case 39:e.lightbox.next()}})},init:function(){var t=[];if(this.index=0,this.siblings=[],this.element&&this.element.length){var e=this.options.group?i.$(['[data-uk-lightbox*="'+this.options.group+'"]',"[data-uk-lightbox*='"+this.options.group+"']"].join(",")):this.element;e.each(function(){var e=i.$(this);t.push({source:e.attr("href"),title:e.attr("data-title")||e.attr("title"),type:e.attr("data-lightbox-type")||"auto",link:e})}),this.index=e.index(this.element),this.siblings=t}else this.options.group&&this.options.group.length&&(this.siblings=this.options.group);this.trigger("lightbox-init",[this])},show:function(e){this.modal=t(this),this.modal.dialog.stop(),this.modal.content.stop();var o,n,s=this,h=i.$.Deferred();e=e||0,"object"==typeof e&&this.siblings.forEach(function(i,t){e[0]===i.link[0]&&(e=t)}),0>e?e=this.siblings.length-e:this.siblings[e]||(e=0),n=this.siblings[e],o={lightbox:s,source:n.source,type:n.type,index:e,promise:h,title:n.title,item:n,meta:{content:"",width:null,height:null}},this.index=e,this.modal.content.empty(),this.modal.is(":visible")||(this.modal.content.css({width:"",height:""}).empty(),this.modal.modal.show()),this.modal.loader.removeClass("uk-hidden"),h.promise().done(function(){s.data=o,s.fitSize(o)}).fail(function(){o.meta.content='<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>',o.meta.width=400,o.meta.height=300,s.data=o,s.fitSize(o)}),s.trigger("showitem.uk.lightbox",[o])},fitSize:function(){var t=this,e=this.data,o=this.modal.dialog.outerWidth()-this.modal.dialog.width(),n=parseInt(this.modal.dialog.css("margin-top"),10),s=parseInt(this.modal.dialog.css("margin-bottom"),10),h=n+s,a=e.meta.content,l=t.options.duration;this.siblings.length>1&&(a=[a,'<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>','<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'].join(""));var d,r,u=i.$("<div>&nbsp;</div>").css({opacity:0,position:"absolute",top:0,left:0,width:"100%","max-width":t.modal.dialog.css("max-width"),padding:t.modal.dialog.css("padding"),margin:t.modal.dialog.css("margin")}),c=e.meta.width,g=e.meta.height;u.appendTo("body").width(),d=u.width(),r=window.innerHeight-h,u.remove(),this.modal.dialog.find(".uk-modal-caption").remove(),e.title&&(this.modal.dialog.append('<div class="uk-modal-caption">'+e.title+"</div>"),r-=this.modal.dialog.find(".uk-modal-caption").outerHeight()),d<e.meta.width&&(g=Math.floor(g*(d/c)),c=d),g>r&&(g=Math.floor(r),c=Math.ceil(e.meta.width*(r/e.meta.height))),this.modal.content.css("opacity",0).width(c).html(a),"iframe"==e.type&&this.modal.content.find("iframe:first").height(g);var m=g+o,p=Math.floor(window.innerHeight/2-m/2)-h;0>p&&(p=0),this.modal.closer.addClass("uk-hidden"),t.modal.data("mwidth")==c&&t.modal.data("mheight")==g&&(l=0),this.modal.dialog.animate({width:c+o,height:g+o,top:p},l,"swing",function(){t.modal.loader.addClass("uk-hidden"),t.modal.content.css({width:""}).animate({opacity:1},function(){t.modal.closer.removeClass("uk-hidden")}),t.modal.data({mwidth:c,mheight:g})})},next:function(){this.show(this.siblings[this.index+1]?this.index+1:0)},previous:function(){this.show(this.siblings[this.index-1]?this.index-1:this.siblings.length-1)}}),i.plugin("lightbox","image",{init:function(i){i.on("showitem.uk.lightbox",function(i,t){if("image"==t.type||t.source&&t.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)){var e=function(i,e,o){t.meta={content:'<img class="uk-responsive-width" width="'+e+'" height="'+o+'" src ="'+i+'">',width:e,height:o},t.type="image",t.promise.resolve()};if(o[t.source])e(t.source,o[t.source].width,o[t.source].height);else{var n=new Image;n.onerror=function(){t.promise.reject("Loading image failed")},n.onload=function(){o[t.source]={width:n.width,height:n.height},e(t.source,o[t.source].width,o[t.source].height)},n.src=t.source}}})}}),i.plugin("lightbox","youtube",{init:function(i){var t=/(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,n=/youtu\.be\/(.*)/;i.on("showitem.uk.lightbox",function(i,s){var h,a,l=function(i,t,o){s.meta={content:'<iframe src="//www.youtube.com/embed/'+i+'" width="'+t+'" height="'+o+'" style="max-width:100%;"'+(e.lightbox.options.allowfullscreen?" allowfullscreen":"")+"></iframe>",width:t,height:o},s.type="iframe",s.promise.resolve()};if((a=s.source.match(t))&&(h=a[2]),(a=s.source.match(n))&&(h=a[1]),h){if(o[h])l(h,o[h].width,o[h].height);else{var d=new Image,r=!1;d.onerror=function(){o[h]={width:640,height:320},l(h,o[h].width,o[h].height)},d.onload=function(){120==d.width&&90==d.height?r?(o[h]={width:640,height:320},l(h,o[h].width,o[h].height)):(r=!0,d.src="//img.youtube.com/vi/"+h+"/0.jpg"):(o[h]={width:d.width,height:d.height},l(h,d.width,d.height))},d.src="//img.youtube.com/vi/"+h+"/maxresdefault.jpg"}i.stopImmediatePropagation()}})}}),i.plugin("lightbox","vimeo",{init:function(t){var n,s=/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;t.on("showitem.uk.lightbox",function(t,h){var a,l=function(i,t,o){h.meta={content:'<iframe src="//player.vimeo.com/video/'+i+'" width="'+t+'" height="'+o+'" style="width:100%;box-sizing:border-box;"'+(e.lightbox.options.allowfullscreen?" allowfullscreen":"")+"></iframe>",width:t,height:o},h.type="iframe",h.promise.resolve()};(n=h.source.match(s))&&(a=n[2],o[a]?l(a,o[a].width,o[a].height):i.$.ajax({type:"GET",url:"//vimeo.com/api/oembed.json?url="+encodeURI(h.source),jsonp:"callback",dataType:"jsonp",success:function(i){o[a]={width:i.width,height:i.height},l(a,o[a].width,o[a].height)}}),t.stopImmediatePropagation())})}}),i.plugin("lightbox","video",{init:function(t){t.on("showitem.uk.lightbox",function(t,e){var n=function(i,t,o){e.meta={content:'<video class="uk-responsive-width" src="'+i+'" width="'+t+'" height="'+o+'" controls></video>',width:t,height:o},e.type="video",e.promise.resolve()};if("video"==e.type||e.source.match(/\.(mp4|webm|ogv)$/i))if(o[e.source])n(e.source,o[e.source].width,o[e.source].height);else var s=i.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr("src",e.source).appendTo("body"),h=setInterval(function(){s[0].videoWidth&&(clearInterval(h),o[e.source]={width:s[0].videoWidth,height:s[0].videoHeight},n(e.source,o[e.source].width,o[e.source].height),s.remove())},20)})}}),UIkit.plugin("lightbox","iframe",{init:function(i){i.on("showitem.uk.lightbox",function(t,o){var n=function(i,t,n){o.meta={content:'<iframe class="uk-responsive-width" src="'+i+'" width="'+t+'" height="'+n+'"'+(e.lightbox.options.allowfullscreen?" allowfullscreen":"")+"></iframe>",width:t,height:n},o.type="iframe",o.promise.resolve()};("iframe"===o.type||o.source.match(/\.(html|php)$/))&&n(o.source,i.options.width||800,i.options.height||600)})}}),i.lightbox.create=function(t,e){if(t){var o,n=[];return t.forEach(function(t){n.push(i.$.extend({source:"",title:"",type:"auto",link:!1},"string"==typeof t?{source:t}:t))}),o=i.lightbox(i.$.extend({},e,{group:n}))}},i.lightbox});
3 1 \ No newline at end of file
  2 +(function(addon){var component;if(window.UIkit){component=addon(UIkit)}if(typeof define=="function"&&define.amd){define("uikit-lightbox",["uikit"],function(){return component||addon(UIkit)})}})(function(UI){"use strict";var modal,cache={};UI.component('lightbox',{defaults:{"group":false,"duration":400,"keyboard":true},index:0,items:false,boot:function(){UI.$html.on('click','[data-uk-lightbox]',function(e){e.preventDefault();var link=UI.$(this);if(!link.data("lightbox")){UI.lightbox(link,UI.Utils.options(link.attr("data-uk-lightbox")))}link.data("lightbox").show(link)});UI.$doc.on('keyup',function(e){if(modal&&modal.is(':visible')&&modal.lightbox.options.keyboard){e.preventDefault();switch(e.keyCode){case 37:modal.lightbox.previous();break;case 39:modal.lightbox.next();break}}})},init:function(){var siblings=[];this.index=0;this.siblings=[];if(this.element&&this.element.length){var domSiblings=this.options.group?UI.$(['[data-uk-lightbox*="'+this.options.group+'"]',"[data-uk-lightbox*='"+this.options.group+"']"].join(',')):this.element;domSiblings.each(function(){var ele=UI.$(this);siblings.push({'source':ele.attr('href'),'title':ele.attr('data-title')||ele.attr('title'),'type':ele.attr("data-lightbox-type")||'auto','link':ele})});this.index=domSiblings.index(this.element);this.siblings=siblings}else if(this.options.group&&this.options.group.length){this.siblings=this.options.group}this.trigger('lightbox-init',[this])},show:function(index){this.modal=getModal(this);this.modal.dialog.stop();this.modal.content.stop();var $this=this,promise=UI.$.Deferred(),data,item;index=index||0;if(typeof(index)=='object'){this.siblings.forEach(function(s,idx){if(index[0]===s.link[0]){index=idx}})}if(index<0){index=this.siblings.length-index}else if(!this.siblings[index]){index=0}item=this.siblings[index];data={"lightbox":$this,"source":item.source,"type":item.type,"index":index,"promise":promise,"title":item.title,"item":item,"meta":{"content":'',"width":null,"height":null}};this.index=index;this.modal.content.empty();if(!this.modal.is(':visible')){this.modal.content.css({width:'',height:''}).empty();this.modal.modal.show()}this.modal.loader.removeClass('uk-hidden');promise.promise().done(function(){$this.data=data;$this.fitSize(data)}).fail(function(){data.meta.content='<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>';data.meta.width=400;data.meta.height=300;$this.data=data;$this.fitSize(data)});$this.trigger('showitem.uk.lightbox',[data])},fitSize:function(){var $this=this,data=this.data,pad=this.modal.dialog.outerWidth()-this.modal.dialog.width(),dpadTop=parseInt(this.modal.dialog.css('margin-top'),10),dpadBot=parseInt(this.modal.dialog.css('margin-bottom'),10),dpad=dpadTop+dpadBot,content=data.meta.content,duration=$this.options.duration;if(this.siblings.length>1){content=[content,'<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>','<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'].join('')}var tmp=UI.$('<div>&nbsp;</div>').css({'opacity':0,'position':'absolute','top':0,'left':0,'width':'100%','max-width':$this.modal.dialog.css('max-width'),'padding':$this.modal.dialog.css('padding'),'margin':$this.modal.dialog.css('margin')}),maxwidth,maxheight,w=data.meta.width,h=data.meta.height;tmp.appendTo('body').width();maxwidth=tmp.width();maxheight=window.innerHeight-dpad;tmp.remove();this.modal.dialog.find('.uk-modal-caption').remove();if(data.title){this.modal.dialog.append('<div class="uk-modal-caption">'+data.title+'</div>');maxheight-=this.modal.dialog.find('.uk-modal-caption').outerHeight()}if(maxwidth<data.meta.width){h=Math.floor(h*(maxwidth/w));w=maxwidth}if(maxheight<h){h=Math.floor(maxheight);w=Math.ceil(data.meta.width*(maxheight/data.meta.height))}this.modal.content.css('opacity',0).width(w).html(content);if(data.type=='iframe'){this.modal.content.find('iframe:first').height(h)}var dh=h+pad,t=Math.floor(window.innerHeight/2-dh/2)-dpad;if(t<0){t=0}this.modal.closer.addClass('uk-hidden');if($this.modal.data('mwidth')==w&&$this.modal.data('mheight')==h){duration=0}this.modal.dialog.animate({width:w+pad,height:h+pad,top:t},duration,'swing',function(){$this.modal.loader.addClass('uk-hidden');$this.modal.content.css({width:''}).animate({'opacity':1},function(){$this.modal.closer.removeClass('uk-hidden')});$this.modal.data({'mwidth':w,'mheight':h})})},next:function(){this.show(this.siblings[(this.index+1)]?(this.index+1):0)},previous:function(){this.show(this.siblings[(this.index-1)]?(this.index-1):this.siblings.length-1)}});UI.plugin('lightbox','image',{init:function(lightbox){lightbox.on("showitem.uk.lightbox",function(e,data){if(data.type=='image'||data.source&&data.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)){var resolve=function(source,width,height){data.meta={"content":'<img class="uk-responsive-width" width="'+width+'" height="'+height+'" src ="'+source+'">',"width":width,"height":height};data.type='image';data.promise.resolve()};if(!cache[data.source]){var img=new Image();img.onerror=function(){data.promise.reject('Loading image failed')};img.onload=function(){cache[data.source]={width:img.width,height:img.height};resolve(data.source,cache[data.source].width,cache[data.source].height)};img.src=data.source}else{resolve(data.source,cache[data.source].width,cache[data.source].height)}}})}});UI.plugin("lightbox","youtube",{init:function(lightbox){var youtubeRegExp=/(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,youtubeRegExpShort=/youtu\.be\/(.*)/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,matches,resolve=function(id,width,height){data.meta={'content':'<iframe src="//www.youtube.com/embed/'+id+'" width="'+width+'" height="'+height+'" style="max-width:100%;"></iframe>','width':width,'height':height};data.type='iframe';data.promise.resolve()};if(matches=data.source.match(youtubeRegExp)){id=matches[2]}if(matches=data.source.match(youtubeRegExpShort)){id=matches[1]}if(id){if(!cache[id]){var img=new Image(),lowres=false;img.onerror=function(){cache[id]={width:640,height:320};resolve(id,cache[id].width,cache[id].height)};img.onload=function(){if(img.width==120&&img.height==90){if(!lowres){lowres=true;img.src='//img.youtube.com/vi/'+id+'/0.jpg'}else{cache[id]={width:640,height:320};resolve(id,cache[id].width,cache[id].height)}}else{cache[id]={width:img.width,height:img.height};resolve(id,img.width,img.height)}};img.src='//img.youtube.com/vi/'+id+'/maxresdefault.jpg'}else{resolve(id,cache[id].width,cache[id].height)}e.stopImmediatePropagation()}})}});UI.plugin("lightbox","vimeo",{init:function(lightbox){var regex=/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/,matches;lightbox.on("showitem.uk.lightbox",function(e,data){var id,resolve=function(id,width,height){data.meta={'content':'<iframe src="//player.vimeo.com/video/'+id+'" width="'+width+'" height="'+height+'" style="width:100%;box-sizing:border-box;"></iframe>','width':width,'height':height};data.type='iframe';data.promise.resolve()};if(matches=data.source.match(regex)){id=matches[2];if(!cache[id]){UI.$.ajax({type:'GET',url:'http://vimeo.com/api/oembed.json?url='+encodeURI(data.source),jsonp:'callback',dataType:'jsonp',success:function(data){cache[id]={width:data.width,height:data.height};resolve(id,cache[id].width,cache[id].height)}})}else{resolve(id,cache[id].width,cache[id].height)}e.stopImmediatePropagation()}})}});UI.plugin("lightbox","video",{init:function(lightbox){lightbox.on("showitem.uk.lightbox",function(e,data){var resolve=function(source,width,height){data.meta={'content':'<video class="uk-responsive-width" src="'+source+'" width="'+width+'" height="'+height+'" controls></video>','width':width,'height':height};data.type='video';data.promise.resolve()};if(data.type=='video'||data.source.match(/\.(mp4|webm|ogv)$/i)){if(!cache[data.source]){var vid=UI.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr('src',data.source).appendTo('body');var idle=setInterval(function(){if(vid[0].videoWidth){clearInterval(idle);cache[data.source]={width:vid[0].videoWidth,height:vid[0].videoHeight};resolve(data.source,cache[data.source].width,cache[data.source].height);vid.remove()}},20)}else{resolve(data.source,cache[data.source].width,cache[data.source].height)}}})}});function getModal(lightbox){if(modal){modal.lightbox=lightbox;return modal}modal=UI.$(['<div class="uk-modal">','<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:'+Math.abs(window.innerHeight/2-200)+'px;">','<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>','<div class="uk-lightbox-content"></div>','<div class="uk-modal-spinner uk-hidden"></div>','</div>','</div>'].join('')).appendTo('body');modal.dialog=modal.find('.uk-modal-dialog:first');modal.content=modal.find('.uk-lightbox-content:first');modal.loader=modal.find('.uk-modal-spinner:first');modal.closer=modal.find('.uk-close.uk-close-alt');modal.modal=UI.modal(modal,{modal:false,bgclose:false});modal.on("hide.uk.modal",function(e){modal.content.html('')});UI.$win.on('load resize orientationchange',UI.Utils.debounce(function(e){if(modal.is(':visible')&&!UI.Utils.isFullscreen())modal.lightbox.fitSize()}.bind(this),100));modal.lightbox=lightbox;return modal}UI.lightbox.create=function(items,options){if(!items)return;var group=[],o;items.forEach(function(item){group.push(UI.$.extend({'source':'','title':'','type':'auto','link':false},(typeof(item)=='string'?{'source':item}:item)))});o=UI.lightbox(UI.$.extend({},options,{'group':group}));return o};return UI.lightbox});
4 3 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/css/main.css
... ... @@ -936,17 +936,25 @@ option.oil_station_opt {
936 936 }
937 937  
938 938 .park-and-station-wrap {
939   - margin-top: 9px;
940   - border: 1px solid #3dce69;
  939 + margin-top: 25px;
  940 + border: 1px solid #b9b9b9;
941 941 width: 580px;
942 942 padding: 12px;
943 943 border-radius: 5px;
  944 + box-shadow: 0 2px 5px rgba(0,0,0,.1);
  945 + margin-bottom: 15px;
944 946 }
945 947  
946 948 .park-and-station-wrap select {
947 949 width: auto !important;
948 950 }
949 951  
  952 +.park-and-station-wrap>span{
  953 + vertical-align: middle;
  954 + margin-top: 9px;
  955 + display: inline-block;
  956 +}
  957 +
950 958 /** 安全驾驶相关css */
951 959 .safe_driv_pop_wrap {
952 960 position: absolute;
... ...
src/main/resources/static/real_control_v2/css/north.css
... ... @@ -330,6 +330,8 @@
330 330 padding-top: 20px;
331 331 overflow: auto;
332 332 padding-bottom: 20px;
  333 + position: relative;
  334 + padding-left: 45px;
333 335 }
334 336  
335 337 #nav-line_config-modal select,
... ... @@ -500,4 +502,43 @@ span.sm-red{
500 502 span.sm-grey{
501 503 font-size: 12px;
502 504 color: grey;
  505 +}
  506 +
  507 +.voip_call_info_panel{
  508 + width: 258px;
  509 + background: #ffffff;
  510 + display: inline-block;
  511 + vertical-align: bottom;
  512 + border-left: 1px solid #d8cece;
  513 +}
  514 +
  515 +.uk-lightbox-content>img{
  516 + display: inline-block;
  517 +}
  518 +
  519 +.voip_call_info_panel form{
  520 + padding: 15px 15px 0 15px;
  521 + vertical-align: bottom;
  522 +}
  523 +
  524 +.voip_call_info_panel .uk-form-horizontal .uk-form-label{
  525 + width: 70px;
  526 +}
  527 +
  528 +.voip_call_info_panel .uk-form-horizontal .uk-form-controls{
  529 + margin-left: 72px;
  530 +}
  531 +
  532 +.voip_call_info_panel .state_txt{
  533 + text-align: center;
  534 +}
  535 +
  536 +.voip_call_info_panel ._title{
  537 + padding: 15px;
  538 + background: #e6e6e6;
  539 +}
  540 +
  541 +#line_config_entity_wrap .uk-list{
  542 + display: block;
  543 + margin-top: 25px;
503 544 }
504 545 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/fragments/north/nav/line_config/line_config_entity.html
... ... @@ -108,13 +108,13 @@
108 108 </script>
109 109  
110 110 <script id="park-and-station-temp" type="text/html">
111   - 停车场
  111 + <span>停车场</span>
112 112 <select class="z-depth-input" name="twinsPark">
113 113 {{each parks as p i}}
114 114 <option value="{{p.code}}" {{if p.code==conf.twinsPark}}selected{{/if}}>{{p.name}}</option>
115 115 {{/each}}
116 116 </select>
117   - 既是站点
  117 + <span>&nbsp;既是站点</span>
118 118 <select class="z-depth-input" name="twinsStation">
119 119 {{each routes as r i}}
120 120 <option value="{{r.stationCode}}" {{if r.stationCode==conf.twinsStation}}selected{{/if}}>{{r.stationName}}
... ...
src/main/resources/static/real_control_v2/fragments/north/nav/safeDriving.html
... ... @@ -79,7 +79,7 @@
79 79 <a class="image_link" href="{{sd.url}}.gif" data-uk-lightbox="{group:'gif_group2'}" title="{{sd.title}}">查看</a>
80 80 </td>
81 81 <td>
82   - <a data-type="{{sd.yczltype}}" class="show_vedio_modal">DVR</a>
  82 + <a data-type="{{sd.yczltype}}" class="show_vedio_modal" style="color: grey">DVR</a>
83 83 </td>
84 84 </tr>
85 85 {{/each}}
... ... @@ -136,7 +136,11 @@
136 136 url = stm.format('YYYYMMDD')+'/'+p+'/'+p;
137 137 this.url = gb_safe_driv.urlPath + url;
138 138 //title
139   - this.title = this.clzbh+' '+stm.format('HH时mm分ss秒')+' '+this.yczlText;
  139 + var call_btn_html = '<button class="uk-button uk-button-mini uk-button-primary" ' +
  140 + 'id="m_voip_call_btn_001" ' +
  141 + 'type="button" ' +
  142 + 'data-nbbm="'+this.clzbh+'">打电话</button>';
  143 + this.title = this.clzbh+' '+stm.format('HH时mm分ss秒')+' '+this.yczlText + '&nbsp;' + call_btn_html;
140 144 });
141 145  
142 146 var bodyHtml = template('all-safe_dring-table-temp', {
... ...
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
... ... @@ -163,14 +163,12 @@ var gb_schedule_table = (function () {
163 163 //计算实发时间差值
164 164 var calc_sch_real_shift = function (sch) {
165 165 if (sch['fcsjActualTime']){
166   - var diff = sch['fcsjActualTime'] - sch['dfsjT'], fcsj_diff;
167   - fcsj_diff = parseInt(diff / 60000, 10);
168   - if(diff % 60000 != 0){
169   - /*if(fcsj_diff > 0)
170   - fcsj_diff ++;
171   - else */if(fcsj_diff < 0)
172   - fcsj_diff --;
173   - }
  166 + var fs = 'YYYY-MM-DD HH:mm'
  167 + ,m1 = moment(sch['fcsjActualTime']).format(fs)
  168 + ,m2 = moment(sch['dfsjT']).format(fs);//去掉秒
  169 +
  170 + var diff = moment(m1, fs).format('X') - moment(m2, fs).format('X')
  171 + ,fcsj_diff = parseInt(diff / 60, 10);;
174 172  
175 173 if(fcsj_diff > 0)
176 174 sch.fcsj_diff = '( +' + fcsj_diff + ' )';
... ... @@ -181,8 +179,6 @@ var gb_schedule_table = (function () {
181 179 }
182 180 };
183 181  
184   -
185   -
186 182 function arrayIsNull(array) {
187 183 return !array || array.length == 0;
188 184 }
... ...
src/main/resources/static/real_control_v2/js/modal_extend.js
... ... @@ -2,6 +2,7 @@
2 2 $(document).on('hide.uk.modal', '.uk-modal', function () {
3 3 //放过灯箱
4 4 if($('.uk-modal-dialog', this).hasClass('uk-modal-dialog-lightbox')){
  5 + gb_call_phone.hangup();
5 6 return;
6 7 }
7 8 $(this).trigger('ct-destroy').remove();
... ...
src/main/resources/static/real_control_v2/js/safe_driv/call_phone.js
1 1 var gb_call_phone = function () {
2 2  
3   - var basePath = "http://180.168.57.114:4244";
4   - var wsUri = "ws://180.168.57.114:21892/";
  3 + /**
  4 + * 0 已挂断
  5 + * 1 通话中
  6 + * @type {number}
  7 + */
  8 + var phoneStatus=0;
5 9  
6   - var nbbm2tel = {
7   - "S0E-178":"915618938041",
8   - "S0E-179":"915618937546",
9   - "S0E-182":"915618938047",
10   - "S0E-183":"915618937940",
11   - "S0E-186":"915601989452",
12   - "S0E-187":"915618846405",
13   - "S0E-043":"915618847457",
14   - "S0E-044":"915618845487",
15   - "S2F-070":"915618846479",
16   - "S2F-071":"915601989461",
17   - "S2F-072":"915618937945",
18   - "S2F-073":"915618937845",
19   - "S2F-075":"915618847416",
20   - "S2F-076":"915618847410",
21   - "S2F-077":"915618847413",
22   - "S2F-078":"915618847415",
23   - "S2F-079":"915618847417",
24   - "S2F-080":"915618847418",
25   - "S2F-083":"915618847420",
26   - "S2F-119":"915601987406",
27   - "W0F-018":"915618209534",
28   - "W0F-019":"915601987405",
29   - "W0F-020":"915618278604",
30   - "W0F-021":"915618278614",
31   - "W0F-022":"915618012546",
32   - "W0F-023":"915618278704",
33   - "W0F-024":"915618278594",
34   - "W0F-025":"915601989450",
35   - "W0F-026":"915618209194",
36   - "W0F-027":"915618208724",
37   - "W0F-028":"915618278624",
38   - "W0F-029":"915601988491",
39   - "W0F-030":"915618936848",
40   - "W0F-031":"915618928940",
41   - "W0F-069":"915618011142",
42   - "W0F-070":"915618279534",
43   - "W0F-071":"915601989439",
44   - "W0F-072":"915618011245",
45   - "W0F-073":"915618010242",
46   - "W0F-074":"915618279594",
47   - "W0F-075":"915618010947",
48   - "W0F-089":"915618011747",
49   - "W0F-090":"915618279574",
50   - "S2F-069":"915618938143",
51   - "S2F-081":"915601986481"
52   - };
  10 + var _nbbm;
  11 + var simNo;
  12 + var agentID;
  13 + var dn;
  14 + var wrap = '.voip_call_info_panel';
  15 + var storage = window.localStorage;
  16 + var loc_dn_key = 'control_sd_voip_dn';
  17 + var callMaxTime = 7;//拨号超时时间-秒
  18 + var $stateBtnTxt;
  19 + var init = function (nbbm) {
  20 + $stateBtnTxt = $('.state_txt>button', wrap);
53 21  
54   - var locData = window.localStorage.getItem('test_nbbm2tel_json');
55   - if(locData){
56   - nbbm2tel = JSON.parse(locData);
57   - }
  22 + _nbbm = nbbm;
  23 + agentID = $('[name=agentID]', wrap).val();
  24 + dn = $('[name=dn]', wrap).val();
58 25  
59   - var login = function (cb) {
60   - var agentID = '1002';
61   - var dn = '6002';
  26 + //从本地读取分机号
  27 + var locDn = storage.getItem(loc_dn_key);
  28 + if(!dn && locDn){
  29 + dn = locDn;
  30 + $('[name=dn]', wrap).val(locDn);
  31 + }
62 32  
63   - var options = {
64   - AgentID: agentID,
65   - DN: dn,
66   - wsUri: wsUri,
67   - setbtnStatus: function (stateName) {
68   - //setState(stateName);
69   - console.log('stateName', stateName);
  33 + if(!dn){
  34 + waitInputDn();
  35 + return;
  36 + }
70 37  
71   - cb && cb(stateName)
  38 + //将分机号写入本地
  39 + storage.setItem(loc_dn_key, $('[name=dn]', wrap).val());
  40 + var $simInput = $('[name=simNo]', wrap);
  41 + var eq = EventProxy.create('pluginInit', 'getSimNo', function () {
  42 + simNo = ('9' + simNo);
  43 + $simInput.val(simNo);
  44 + if(!simNo){
  45 + $stateBtnTxt.text('获取SIM卡号失败!');
  46 + return;
72 47 }
73   - };
74   - $.CallCenterInit(options);
  48 +
  49 + _t = 0;
  50 + $stateBtnTxt.text('正在拨号(0)')
  51 + .attr('disabled', 'disabled');
  52 + //拨号
  53 + $.PhonePluginFun.Dialing(simNo);
  54 + startTimer();
  55 + });
  56 +
  57 + //初始化插件
  58 + pluginInit(agentID, dn, function () {
  59 + eq.emitLater('pluginInit');
  60 + });
  61 +
  62 + //获取SIM
  63 + $.PhonePluginFun.GetSimCardNo(nbbm, function (no) {
  64 + simNo = no;
  65 + eq.emitLater('getSimNo');
  66 + });
  67 + };
  68 +
  69 + var waitInputDn = function () {
  70 + $stateBtnTxt.text('输入分机号,点击拨号!')
  71 + .removeAttr('disabled')
  72 + .addClass('uk-button-primary')
  73 + .one('click', function () {
  74 + init(_nbbm);
  75 + });;
  76 + $('[name=dn]', wrap).focus();
75 77 };
76 78  
77   - var call = function (nbbm, loginSucc, loginFailed, callSucc) {
78   - var telNumber = nbbm2tel[nbbm];
79   - if(!telNumber){
80   - alert('没有该车辆的对照表..');
81   - loginFailed && loginFailed();
  79 + /**
  80 + * 开始计时器
  81 + */
  82 + var _t = 0, timer;
  83 + var startTimer = function () {
  84 + if(_t >= callMaxTime){
  85 + shutdown();
82 86 return;
83 87 }
84   - login(function (sname) {
85   - if(sname=='login'){
86   - loginSucc && loginSucc();
  88 + _t ++;
  89 + $stateBtnTxt.text('正在拨号('+_t+')');
  90 + timer = setTimeout(startTimer, 1000);
  91 + };
  92 +
  93 + var shutdown = function () {
  94 + _hangup(true);
  95 + $stateBtnTxt.text('已超时,点击重拨!')
  96 + .removeAttr('disabled')
  97 + .addClass('uk-button-primary')
  98 + .one('click', function () {
  99 + init(_nbbm);
  100 + });;
  101 + };
87 102  
88   - $.CallCenterPublicFun.Dialing(telNumber);
89   - setTimeout(function () {
90   - callSucc && callSucc();
91   - }, 1000);
92   - }
93   - else{
94   - //loginFailed && loginFailed();
95   - }
96   - });
  103 + var talking = function () {
  104 + console.log('talking');
  105 + clearTimeout(timer);
  106 + timer = null;
  107 + phoneStatus = 1;
  108 + setTimeout(function () {
  109 + var $stateBtnTxt = $('.state_txt>button', wrap);
  110 + $stateBtnTxt.text('已接通,点击挂断!')
  111 + .removeClass('uk-button-primary')
  112 + .addClass('uk-button-danger')
  113 + .removeAttr('disabled')
  114 + .off('click')
  115 + .one('click', function () {
  116 + _hangup();
  117 + _hold();
  118 + });
  119 + }, 1000);
97 120 };
  121 +
  122 + var _hold = function () {
  123 + console.log('_hold');
  124 + phoneStatus = 0;
98 125  
99   - var hangup = function () {
  126 + var $stateBtnTxt = $('.state_txt>button', wrap);
  127 + $stateBtnTxt.text('点击拨号')
  128 + .removeClass('uk-button-danger')
  129 + .addClass('uk-button-primary')
  130 + .off('click')
  131 + .one('click', function () {
  132 + init(_nbbm);
  133 + });
  134 + };
  135 +
  136 + var pluginInit = function (agentID, dn, cb) {
  137 + var options = {
  138 + AgentID: agentID,
  139 + DN: dn,
  140 + /*接通事件*/
  141 + OnTalking: talking,
  142 + /*挂机事件*/
  143 + OnHold: _hold
  144 + };
  145 + $.PhonePluginFun.init(options);
  146 + cb && cb();
  147 + };
  148 +
  149 + var _hangup = function (flag) {
  150 + clearTimeout(timer);
  151 + timer = null;
  152 + if(!flag && phoneStatus==0)
  153 + return;
100 154 console.log('hangup...');
101 155 $.CallCenterPublicFun.Hangup();
102 156 $.CallCenterPublicFun.LoginOff();
103   - };
  157 + phoneStatus = 0;
  158 + }
104 159  
105 160 return {
106   - call: call,
107   - hangup: hangup,
108   - setNbbm2tel: function (json) {
109   - nbbm2tel = json;
110   -
111   - window.localStorage.setItem('test_nbbm2tel_json', JSON.stringify(nbbm2tel));
112   - },
113   - getNbbm2tel: function () {
114   - return nbbm2tel;
115   - }
  161 + init: init,
  162 + hangup: _hangup
116 163 }
117 164 }();
118 165 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/js/safe_driv/safeDriv.js
... ... @@ -20,11 +20,6 @@ var gb_safe_driv = (function () {
20 20 var max = 5;
21 21  
22 22 var pop = function (sd) {
23   - /*//只有admin用户能收到
24   - var user = gb_northToolbar.user();
25   - if (!user || user.userName.indexOf('admin') == -1)
26   - return;*/
27   -
28 23 //时间格式化
29 24 var stm = moment(sd.ts);
30 25 sd.timeStr = stm.format('HH时mm分ss秒');
... ... @@ -43,29 +38,22 @@ var gb_safe_driv = (function () {
43 38 $wrap.append(htmlStr);
44 39 };
45 40  
46   -/* var vedioModal = '<div id="ssspVedioModal" class="uk-modal ct_move_modal">' +
47   - '<div class="uk-modal-dialog uk-modal-dialog-large">' +
48   - '<button type="button" class="uk-modal-close uk-close"></button>' +
49   - '<div class="uk-modal-header"> <h2>实时视频</h2> </div> '+
50   - '<p class="loading"><i class="uk-icon-spinner uk-icon-spin"></i> 载入资源...</p><iframe id="vedioIframe" src="http://222.66.0.204:8910/transport_server/dvr_monitor1.jsp?deviceId=229L0650&channel=^^channel^^"></iframe>' +
51   - '</div>' +
52   - '</div>';*/
53   -
54   - var phoneModal = '<div id="callPhoneModal" class="uk-modal ct_move_modal">' +
55   - '<div class="uk-modal-dialog">' +
56   - '<button type="button" class="uk-modal-close uk-close"></button>' +
57   - '<div class="uk-modal-header"> <h2>打电话</h2> </div> '+
58   - '<p class="loading"><i class="uk-icon-spinner uk-icon-spin"></i> 载入资源...</p><iframe style="width: 100%;height: 280px;" id="phoneIframe" src="/real_control_v2/js/safe_driv/CallCenterPluginDemo.html"></iframe>' +
59   - '</div>' +
60   - '</div>';
  41 +
61 42  
62 43 $wrap.on('click', '.safe_driv_pop', function () {
63   - var title = $(this).data('title');// + '&nbsp;<button data-nbbm="'+$(this).data('nbbm')+'" class="uk-button uk-button-mini uk-button-primary" id="openPhoneModalBtn" type="button">打电话</button>';
  44 + var nbbm = $(this).data('nbbm');
  45 + var call_btn_html = '<button class="uk-button uk-button-mini uk-button-primary" ' +
  46 + 'id="m_voip_call_btn_001" ' +
  47 + 'type="button" ' +
  48 + 'data-nbbm="'+nbbm+'">打电话</button>';
  49 +
  50 + var title = $(this).data('title') + '&nbsp;' + call_btn_html;
64 51 var url = $(this).data('url');
65 52 $(this).remove();
  53 +
66 54 var lightbox = UIkit.lightbox.create([
67 55 {title: title, 'source': url}
68   - ]);
  56 + ], {keyboard: false});
69 57  
70 58 lightbox.show();
71 59 });
... ... @@ -80,7 +68,7 @@ var gb_safe_driv = (function () {
80 68 'A6': 2,
81 69 'A7': 2
82 70 };
83   - var showVedioModal = function (type) {
  71 +/* var showVedioModal = function (type) {
84 72 var channel = channelMap[type]?channelMap[type]:1;
85 73 open_modal_dom(vedioModal.replace('^^channel^^', channel) ,{}, {modal: false});
86 74 $('#ssspVedioModal #vedioIframe').on('load', function () {
... ... @@ -90,14 +78,14 @@ var gb_safe_driv = (function () {
90 78 $('#ssspVedioModal p.loading').remove();
91 79 }, 500);
92 80 });
93   - };
  81 + };*/
94 82  
95   - $(document).on('click', '#openVedioModalBtn', function () {
  83 +/* $(document).on('click', '#openVedioModalBtn', function () {
96 84 showVedioModal($(this).data('type'));
97   - });
  85 + });*/
98 86  
99 87  
100   - var showCallPhoneModal = function () {
  88 +/* var showCallPhoneModal = function () {
101 89 open_modal_dom(phoneModal ,{}, {modal: false});
102 90 $('#callPhoneModal #phoneIframe').on('load', function () {
103 91 var that = this;
... ... @@ -116,38 +104,30 @@ var gb_safe_driv = (function () {
116 104 $('#callPhoneModal p.loading').remove();
117 105 }, 700);
118 106 });
119   - };
  107 + };*/
  108 +
  109 + $(document).on('click', '#m_voip_call_btn_001', function () {
  110 + //debugger
  111 + var $lb = $('.uk-modal-dialog-lightbox');
  112 + var X = $lb.offset().top + $lb.height() - 240;
  113 + var Y = $lb.offset().left + $lb.width();
  114 +
  115 + var nbbm = $(this).data('nbbm');
120 116  
121   - $(document).on('click', '#openPhoneModalBtn', function () {
122   - var t = $(this).text();
123   - if(t == '挂断!'){
124   - gb_call_phone.hangup();
125   - $(this).text('打电话').removeClass('uk-button-danger');
126   - return;
127   - }
128   - else if(t == '打电话'){
129   - var nbbm = $(this).data('nbbm');
130   - var btn = this;
131   -
132   - $(btn).text('登录坐席..');
133   - gb_call_phone.call(nbbm, function () {
134   - $(btn).text('拨号中..');
135   - }, function () {
136   - $(btn).text('登录坐席失败');
137   - setTimeout(function () {
138   - $(btn).text('打电话');
139   - }, 1200);
140   - }, function () {
141   - $(btn).text('挂断!').addClass('uk-button-danger');
142   - });
143   - }
  117 + var style = 'top: '+X+'px;left: '+Y+'px;height: '+$lb.height()+'px';
  118 + var htmlStr = template('voip_call_info_panel-temp', {style: style, nbbm: nbbm});
  119 + $lb.css('width', ($lb.width() + 260) + 'px');
  120 + $('.uk-lightbox-content', $lb.parent()).append(htmlStr);
  121 +
  122 + $(this).remove();
  123 + gb_call_phone.init(nbbm);
144 124 });
145 125  
146 126  
147 127 return {
148 128 pop: pop,
149 129 safeCode: codes,
150   - urlPath: path,
151   - showVedioModal: showVedioModal
  130 + urlPath: path//,
  131 + //showVedioModal: showVedioModal
152 132 }
153 133 })();
154 134 \ No newline at end of file
... ...
src/main/resources/static/real_control_v2/main.html
... ... @@ -237,10 +237,47 @@
237 237 <script src="/real_control_v2/js/safe_driv/safeDriv.js" merge="custom_js"></script>
238 238 <!-- #### 安全驾驶 end ### -->
239 239  
240   -<!-- 打电话
241   -<script src="http://180.168.57.114:4244/Scripts/CallCenter.js" ></script>
  240 +<!-- 打电话 -->
  241 +<script src="http://114.80.178.12:9003/forward/voip/callCenterJs"></script>
  242 +<script src="http://114.80.178.12:9003/forward/voip/phonePluginJs"></script>
242 243 <script src="/real_control_v2/js/safe_driv/call_phone.js" ></script>
243   --->
  244 +
  245 +<script id="voip_call_info_panel-temp" type="text/html">
  246 + <div class="voip_call_info_panel" style="{{style}}">
  247 + <p class="_title">VOIP</p>
  248 + <form class="uk-form uk-form-horizontal">
  249 +
  250 + <div class="uk-form-row">
  251 + <label class="uk-form-label" >工号:</label>
  252 + <div class="uk-form-controls">
  253 + <input type="text" name="agentID" value="1002" disabled>
  254 + </div>
  255 + </div>
  256 + <div class="uk-form-row">
  257 + <label class="uk-form-label" ">分机号:</label>
  258 + <div class="uk-form-controls">
  259 + <input type="text" name="dn" value="" >
  260 + </div>
  261 + </div>
  262 + <div class="uk-form-row">
  263 + <label class="uk-form-label" >自编号:</label>
  264 + <div class="uk-form-controls">
  265 + <input type="text" value="{{nbbm}}" disabled>
  266 + </div>
  267 + </div>
  268 + <div class="uk-form-row">
  269 + <label class="uk-form-label" >SIM号:</label>
  270 + <div class="uk-form-controls">
  271 + <input type="text" name="simNo" disabled>
  272 + </div>
  273 + </div>
  274 + <hr>
  275 + <h4 class="state_txt">
  276 + <button class="uk-button uk-button-large" type="button" disabled>获取SIM卡号...</button>
  277 + </h4>
  278 + </form>
  279 + </div>
  280 +</script>
244 281 </body>
245 282  
246 283 </html>
... ...