Commit 9c5c2e3854aa875c4375672c05514b36d2c70519

Authored by 潘钊
1 parent 2d06de47

update...

src/main/java/com/bsth/controller/schedule/InOutScheduleController.java
1 package com.bsth.controller.schedule; 1 package com.bsth.controller.schedule;
2 2
  3 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
3 import com.bsth.data.schedule.dto.ScheduleInOut; 4 import com.bsth.data.schedule.dto.ScheduleInOut;
4 import com.bsth.service.schedule.ScheduleService; 5 import com.bsth.service.schedule.ScheduleService;
5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam; @@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam;
9 import org.springframework.web.bind.annotation.RestController; 10 import org.springframework.web.bind.annotation.RestController;
10 11
11 import java.util.Collection; 12 import java.util.Collection;
  13 +import java.util.HashMap;
12 import java.util.List; 14 import java.util.List;
13 import java.util.Map; 15 import java.util.Map;
14 16
@@ -81,4 +83,12 @@ public class InOutScheduleController { @@ -81,4 +83,12 @@ public class InOutScheduleController {
81 public Map<String, Object> cycc(@RequestParam Map<String, Object> map){ 83 public Map<String, Object> cycc(@RequestParam Map<String, Object> map){
82 return inOutScheduleService.cycc(map); 84 return inOutScheduleService.cycc(map);
83 } 85 }
  86 +
  87 + @RequestMapping("rates")
  88 + public Map<String, Object> allRates(){
  89 + Map<String, Object> rs = new HashMap();
  90 + rs.put("cczd", RateNCalculator.cczdRateNo);
  91 + rs.put("bdzd", RateNCalculator.bdzdRateNo);
  92 + return rs;
  93 + }
84 } 94 }
src/main/java/com/bsth/data/abnormal/handler/AttendanceHandler.java
@@ -116,8 +116,11 @@ public class AttendanceHandler { @@ -116,8 +116,11 @@ public class AttendanceHandler {
116 if(null == ae) 116 if(null == ae)
117 return null; 117 return null;
118 118
119 - if(!sio.getJsy().equals(ae.getJsy())) 119 + if(!sio.getJsy().equals(ae.getJsy())){
120 ae.setJsy(sio.getJsy()); 120 ae.setJsy(sio.getJsy());
  121 + return ae;
  122 + }
  123 +
121 124
122 if(null != sio.getAttSjTime()){ 125 if(null != sio.getAttSjTime()){
123 ae.setHandlerTime(sio.getAttSjTime()); 126 ae.setHandlerTime(sio.getAttSjTime());
@@ -126,7 +129,9 @@ public class AttendanceHandler { @@ -126,7 +129,9 @@ public class AttendanceHandler {
126 129
127 sio.reCalcAnStatus(); 130 sio.reCalcAnStatus();
128 schIdMap.remove(ae.getSchId()); 131 schIdMap.remove(ae.getSchId());
  132 +
  133 + return ae;
129 } 134 }
130 - return ae; 135 + return null;
131 } 136 }
132 } 137 }
src/main/java/com/bsth/data/abnormal/handler/InOutHandler.java
@@ -102,8 +102,11 @@ public class InOutHandler { @@ -102,8 +102,11 @@ public class InOutHandler {
102 if(null == ae) 102 if(null == ae)
103 return null; 103 return null;
104 104
105 - if(!sio.getNbbm().equals(ae.getNbbm())) 105 + if(!sio.getNbbm().equals(ae.getNbbm())){
106 ae.setNbbm(sio.getNbbm()); 106 ae.setNbbm(sio.getNbbm());
  107 + return ae;
  108 + }
  109 +
107 110
108 if(null != sio.getOutTimeRfid()){ 111 if(null != sio.getOutTimeRfid()){
109 ae.setHandlerTime(sio.getOutTimeRfid()); 112 ae.setHandlerTime(sio.getOutTimeRfid());
@@ -112,7 +115,9 @@ public class InOutHandler { @@ -112,7 +115,9 @@ public class InOutHandler {
112 115
113 sio.reCalcAnStatus(); 116 sio.reCalcAnStatus();
114 schIdMap.remove(ae.getSchId()); 117 schIdMap.remove(ae.getSchId());
  118 +
  119 + return ae;
115 } 120 }
116 - return ae; 121 + return null;
117 } 122 }
118 } 123 }
src/main/java/com/bsth/data/abnormal/rate_chart/RateNCalculator.java 0 → 100644
  1 +package com.bsth.data.abnormal.rate_chart;
  2 +
  3 +import com.bsth.data.schedule.dto.ScheduleInOut;
  4 +import com.bsth.data.schedule.real.ScheduleComparator;
  5 +import com.bsth.data.schedule.real.ScheduleDataBuffer;
  6 +import com.bsth.util.Arith;
  7 +import org.joda.time.format.DateTimeFormat;
  8 +import org.joda.time.format.DateTimeFormatter;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.text.DecimalFormat;
  12 +import java.util.Collections;
  13 +import java.util.List;
  14 +
  15 +/**
  16 + * 统计率值计算
  17 + * Created by panzhao on 2018/4/10.
  18 + */
  19 +@Component
  20 +public class RateNCalculator {
  21 +
  22 + //出场准点率
  23 + public static float cczdRateNo;
  24 +
  25 + //报到准点率
  26 + public static float bdzdRateNo;
  27 +
  28 + private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm");
  29 +
  30 + /**
  31 + * 计算 出场准点率(分钟级)
  32 + */
  33 + public static boolean calcCczdRateNo() {
  34 + long t = System.currentTimeMillis();
  35 + float sum = 0, v = 0, rs;
  36 +
  37 + List<ScheduleInOut> list = ScheduleDataBuffer.all_out();
  38 + if (null == list)
  39 + return false;
  40 +
  41 + Collections.sort(list, new ScheduleComparator());
  42 + for (ScheduleInOut s : list) {
  43 +
  44 + if (s.getDfsjT() < t)
  45 + sum++;
  46 + else
  47 + break;
  48 +
  49 + if (s.getOutTimeRfid() == null)
  50 + continue;
  51 +
  52 + if (eraseSecond(s.getOutTimeRfid()) <= s.getDfsjT()) {
  53 + v++;
  54 + }
  55 + }
  56 +
  57 + if (v > 0) {
  58 + rs = Float.parseFloat(new DecimalFormat("#.00").format(Arith.div(v, sum))) * 100;
  59 +
  60 + if (rs != cczdRateNo) {
  61 + cczdRateNo = rs;
  62 + return true;
  63 + }
  64 + } else
  65 + cczdRateNo = 0;
  66 +
  67 + return false;
  68 + }
  69 +
  70 +
  71 + /**
  72 + * 计算 报到准点率(分钟级)
  73 + */
  74 + public static boolean calcBdzdRateNo() {
  75 + long t = System.currentTimeMillis();
  76 + float sum = 0, v = 0, rs;
  77 +
  78 + List<ScheduleInOut> list = ScheduleDataBuffer.all_out();
  79 + if (null == list)
  80 + return false;
  81 +
  82 + Collections.sort(list, new ScheduleComparator());
  83 + for (ScheduleInOut s : list) {
  84 +
  85 + if (s.getAttJhTime() < t)
  86 + sum++;
  87 + else
  88 + break;
  89 +
  90 + if (s.getAttSjTime() == null)
  91 + continue;
  92 +
  93 + if (eraseSecond(s.getAttSjTime()) <= s.getAttJhTime()) {
  94 + v++;
  95 + }
  96 + }
  97 +
  98 + if (v > 0) {
  99 + rs = Float.parseFloat(new DecimalFormat("#.00").format(Arith.div(v, sum))) * 100;
  100 +
  101 + if (rs != bdzdRateNo) {
  102 + bdzdRateNo = rs;
  103 + return true;
  104 + }
  105 + } else
  106 + bdzdRateNo = 0;
  107 + return false;
  108 + }
  109 +
  110 + /**
  111 + * 抹掉时间戳上的秒
  112 + *
  113 + * @param t
  114 + * @return
  115 + */
  116 + private static long eraseSecond(long t) {
  117 + return fmtyyyyMMddHHmm.parseDateTime(fmtyyyyMMddHHmm.print(t)).toDate().getTime();
  118 + }
  119 +}
src/main/java/com/bsth/data/abnormal/rate_chart/thread/FixedCalcRateThread.java 0 → 100644
  1 +package com.bsth.data.abnormal.rate_chart.thread;
  2 +
  3 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
  4 +import com.bsth.websocket.handler.SendUtils;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + *
  12 + * Created by panzhao on 2018/4/10.
  13 + */
  14 +@Component
  15 +public class FixedCalcRateThread extends Thread{
  16 +
  17 + Logger logger = LoggerFactory.getLogger(this.getClass());
  18 +
  19 + @Autowired
  20 + SendUtils sendUtils;
  21 +
  22 + @Override
  23 + public void run() {
  24 + try{
  25 + int count=0;
  26 +
  27 + count += (RateNCalculator.calcCczdRateNo() ? 1 : 0);//出场准点率
  28 + count += (RateNCalculator.calcBdzdRateNo() ? 1 : 0);//报到准点率
  29 +
  30 + if(count > 0)
  31 + sendUtils.sendAllRates();
  32 + }catch (Exception e){
  33 + logger.error("", e);
  34 + }
  35 + }
  36 +}
src/main/java/com/bsth/data/attendance/RealAttendaceHandler.java
@@ -2,6 +2,7 @@ package com.bsth.data.attendance; @@ -2,6 +2,7 @@ package com.bsth.data.attendance;
2 2
3 import com.bsth.data.abnormal.MainAbnormalClient; 3 import com.bsth.data.abnormal.MainAbnormalClient;
4 import com.bsth.data.abnormal.entity.AbnormalEntity; 4 import com.bsth.data.abnormal.entity.AbnormalEntity;
  5 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
5 import com.bsth.data.attendance.entity.JsyAttendance; 6 import com.bsth.data.attendance.entity.JsyAttendance;
6 import com.bsth.data.schedule.dto.ScheduleInOut; 7 import com.bsth.data.schedule.dto.ScheduleInOut;
7 import com.bsth.data.schedule.real.ScheduleComparator; 8 import com.bsth.data.schedule.real.ScheduleComparator;
@@ -55,6 +56,10 @@ public class RealAttendaceHandler { @@ -55,6 +56,10 @@ public class RealAttendaceHandler {
55 56
56 //通知页面 57 //通知页面
57 sendUtils.scheduleAttendace(sio, ae); 58 sendUtils.scheduleAttendace(sio, ae);
  59 +
  60 + //重新计算签到准点率
  61 + if(RateNCalculator.calcBdzdRateNo())
  62 + sendUtils.sendAllRates();
58 } 63 }
59 64
60 /** 65 /**
src/main/java/com/bsth/data/in_out/RealInoutHandler.java
@@ -2,6 +2,7 @@ package com.bsth.data.in_out; @@ -2,6 +2,7 @@ package com.bsth.data.in_out;
2 2
3 import com.bsth.data.abnormal.MainAbnormalClient; 3 import com.bsth.data.abnormal.MainAbnormalClient;
4 import com.bsth.data.abnormal.entity.AbnormalEntity; 4 import com.bsth.data.abnormal.entity.AbnormalEntity;
  5 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
5 import com.bsth.data.in_out.carpark.RealBerthManager; 6 import com.bsth.data.in_out.carpark.RealBerthManager;
6 import com.bsth.data.schedule.dto.ScheduleInOut; 7 import com.bsth.data.schedule.dto.ScheduleInOut;
7 import com.bsth.data.schedule.real.ScheduleComparator; 8 import com.bsth.data.schedule.real.ScheduleComparator;
@@ -88,6 +89,8 @@ public class RealInoutHandler { @@ -88,6 +89,8 @@ public class RealInoutHandler {
88 * @param cio 89 * @param cio
89 */ 90 */
90 public void attachRfidTime(ScheduleInOut sio, CarInOutEntity cio) { 91 public void attachRfidTime(ScheduleInOut sio, CarInOutEntity cio) {
  92 + if(null == sio)
  93 + return;
91 if (sio.getBcType().equals("out")) {//出场班次 94 if (sio.getBcType().equals("out")) {//出场班次
92 if (sio.getOutTimeRfid() == null || 95 if (sio.getOutTimeRfid() == null ||
93 (null != sio.getOutTimeRfid() && outSignalMatch(sio, cio))) { 96 (null != sio.getOutTimeRfid() && outSignalMatch(sio, cio))) {
@@ -99,6 +102,10 @@ public class RealInoutHandler { @@ -99,6 +102,10 @@ public class RealInoutHandler {
99 102
100 //通知页面 103 //通知页面
101 sendUtils.scheduleOut(sio, ae); 104 sendUtils.scheduleOut(sio, ae);
  105 +
  106 + //重新计算出场准点率
  107 + if(RateNCalculator.calcCczdRateNo())
  108 + sendUtils.sendAllRates();
102 } 109 }
103 } 110 }
104 } 111 }
@@ -156,8 +163,8 @@ public class RealInoutHandler { @@ -156,8 +163,8 @@ public class RealInoutHandler {
156 */ 163 */
157 public void reCalcOutSignal(String name1, String nbbm2) { 164 public void reCalcOutSignal(String name1, String nbbm2) {
158 //获取车辆的出场计划 165 //获取车辆的出场计划
159 - List<ScheduleInOut> arrayA = ScheduleDataBuffer.getByNbbm(name1)  
160 - , arrayB = ScheduleDataBuffer.getByNbbm(nbbm2); 166 + List<ScheduleInOut> arrayA = ScheduleDataBuffer.getByNbbm(name1, "out")
  167 + , arrayB = ScheduleDataBuffer.getByNbbm(nbbm2, "out");
161 168
162 reCalcOutSignal(arrayA); 169 reCalcOutSignal(arrayA);
163 reCalcOutSignal(arrayB); 170 reCalcOutSignal(arrayB);
src/main/java/com/bsth/data/schedule/real/ScheduleDataBuffer.java
@@ -106,6 +106,17 @@ public class ScheduleDataBuffer implements CommandLineRunner { @@ -106,6 +106,17 @@ public class ScheduleDataBuffer implements CommandLineRunner {
106 return cMultimap.get(nbbm); 106 return cMultimap.get(nbbm);
107 } 107 }
108 108
  109 + public static List<ScheduleInOut> getByNbbm(String nbbm, String bcType){
  110 + List<ScheduleInOut> all = cMultimap.get(nbbm)
  111 + ,rs = new ArrayList<>();
  112 +
  113 + for(ScheduleInOut s : all){
  114 + if(s.getBcType().equals(bcType))
  115 + rs.add(s);
  116 + }
  117 + return rs;
  118 + }
  119 +
109 private void putAll(List<ScheduleInOut> list) { 120 private void putAll(List<ScheduleInOut> list) {
110 Long t = System.currentTimeMillis(); 121 Long t = System.currentTimeMillis();
111 for (ScheduleInOut sio : list) { 122 for (ScheduleInOut sio : list) {
@@ -218,6 +229,20 @@ public class ScheduleDataBuffer implements CommandLineRunner { @@ -218,6 +229,20 @@ public class ScheduleDataBuffer implements CommandLineRunner {
218 pMultimap = pMultimapCopy; 229 pMultimap = pMultimapCopy;
219 cMultimap = cMultimapCopy; 230 cMultimap = cMultimapCopy;
220 } 231 }
  232 + public static void p_mapps(){
  233 + ArrayListMultimap pMultimapCopy = ArrayListMultimap.create();
  234 + Collection<ScheduleInOut> vs = allMaps.values();
  235 + for (ScheduleInOut sio : vs)
  236 + pMultimapCopy.put(sio.getGsbm() + "-" + sio.getjGh(), sio);
  237 + pMultimap = pMultimapCopy;
  238 + }
  239 + public static void c_mapps(){
  240 + ArrayListMultimap cMultimapCopy = ArrayListMultimap.create();
  241 + Collection<ScheduleInOut> vs = allMaps.values();
  242 + for (ScheduleInOut sio : vs)
  243 + cMultimapCopy.put(sio.getNbbm(), sio);
  244 + cMultimap = cMultimapCopy;
  245 + }
221 246
222 private void update(ScheduleInOut old, ScheduleInOut now) { 247 private void update(ScheduleInOut old, ScheduleInOut now) {
223 old.setDfsjT(now.getDfsjT()); 248 old.setDfsjT(now.getDfsjT());
@@ -233,6 +258,8 @@ public class ScheduleDataBuffer implements CommandLineRunner { @@ -233,6 +258,8 @@ public class ScheduleDataBuffer implements CommandLineRunner {
233 String oldJgh = old.getjGh(); 258 String oldJgh = old.getjGh();
234 old.setJsy(now.getJsy()); 259 old.setJsy(now.getJsy());
235 old.setjGh(now.getjGh()); 260 old.setjGh(now.getjGh());
  261 +
  262 + p_mapps();
236 //重新匹配人员计划和实际报到 263 //重新匹配人员计划和实际报到
237 realAttendaceHandler.reCalcOutSignal(old.getGsbm(), oldJgh, now.getjGh()); 264 realAttendaceHandler.reCalcOutSignal(old.getGsbm(), oldJgh, now.getjGh());
238 } 265 }
@@ -240,6 +267,8 @@ public class ScheduleDataBuffer implements CommandLineRunner { @@ -240,6 +267,8 @@ public class ScheduleDataBuffer implements CommandLineRunner {
240 if (isCCar) { 267 if (isCCar) {
241 String oldNbbm = old.getNbbm(); 268 String oldNbbm = old.getNbbm();
242 old.setNbbm(now.getNbbm()); 269 old.setNbbm(now.getNbbm());
  270 +
  271 + c_mapps();
243 //重新匹配车辆计划和实际出场 272 //重新匹配车辆计划和实际出场
244 realInoutHandler.reCalcOutSignal(oldNbbm, now.getNbbm()); 273 realInoutHandler.reCalcOutSignal(oldNbbm, now.getNbbm());
245 } 274 }
src/main/java/com/bsth/service/schedule/impl/ScheduleServiceImpl.java
@@ -7,6 +7,7 @@ import com.bsth.common.Constants; @@ -7,6 +7,7 @@ import com.bsth.common.Constants;
7 import com.bsth.common.ResponseCode; 7 import com.bsth.common.ResponseCode;
8 import com.bsth.data.abnormal.MainAbnormalClient; 8 import com.bsth.data.abnormal.MainAbnormalClient;
9 import com.bsth.data.abnormal.entity.AbnormalEntity; 9 import com.bsth.data.abnormal.entity.AbnormalEntity;
  10 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
10 import com.bsth.data.basic.bus.BusDataBuffer; 11 import com.bsth.data.basic.bus.BusDataBuffer;
11 import com.bsth.data.basic.line.LineDataBuffer; 12 import com.bsth.data.basic.line.LineDataBuffer;
12 import com.bsth.data.basic.person.PersonDataBuffer; 13 import com.bsth.data.basic.person.PersonDataBuffer;
@@ -21,6 +22,7 @@ import com.bsth.entity.Person; @@ -21,6 +22,7 @@ import com.bsth.entity.Person;
21 import com.bsth.security.util.SecurityUtils; 22 import com.bsth.security.util.SecurityUtils;
22 import com.bsth.service.schedule.ScheduleService; 23 import com.bsth.service.schedule.ScheduleService;
23 import com.bsth.util.ConfigUtil; 24 import com.bsth.util.ConfigUtil;
  25 +import com.bsth.websocket.handler.SendUtils;
24 import com.google.common.base.Splitter; 26 import com.google.common.base.Splitter;
25 import org.apache.commons.lang3.StringEscapeUtils; 27 import org.apache.commons.lang3.StringEscapeUtils;
26 import org.apache.commons.lang3.StringUtils; 28 import org.apache.commons.lang3.StringUtils;
@@ -49,6 +51,9 @@ public class ScheduleServiceImpl implements ScheduleService { @@ -49,6 +51,9 @@ public class ScheduleServiceImpl implements ScheduleService {
49 @Autowired 51 @Autowired
50 ScheduleDataBuffer scheduleDataBuffer; 52 ScheduleDataBuffer scheduleDataBuffer;
51 53
  54 + @Autowired
  55 + SendUtils sendUtils;
  56 +
52 static { 57 static {
53 dataUrl = ConfigUtil.get("data.schedule.inout.url"); 58 dataUrl = ConfigUtil.get("data.schedule.inout.url");
54 } 59 }
@@ -195,12 +200,15 @@ public class ScheduleServiceImpl implements ScheduleService { @@ -195,12 +200,15 @@ public class ScheduleServiceImpl implements ScheduleService {
195 200
196 rs = JSON.parseObject(sb.toString()); 201 rs = JSON.parseObject(sb.toString());
197 202
198 -  
199 if ("SUCCESS".equals(rs.get("status"))) { 203 if ("SUCCESS".equals(rs.get("status"))) {
200 - List<ScheduleInOut> list = JSONArray.parseArray(rs.getString("list"), ScheduleInOut.class);//有更新的出场班次 204 + List<ScheduleInOut> remList = JSONArray.parseArray(rs.getString("list"), ScheduleInOut.class);//有更新的出场班次
  205 + List<ScheduleInOut> list = new ArrayList<>(remList.size());
  206 +
201 List<AbnormalEntity> aes = new ArrayList<>();//有更新的异常信息 207 List<AbnormalEntity> aes = new ArrayList<>();//有更新的异常信息
202 - for (ScheduleInOut sio : list) { 208 + for (ScheduleInOut sio : remList) {
203 scheduleDataBuffer.put(sio); 209 scheduleDataBuffer.put(sio);
  210 +
  211 + list.add(scheduleDataBuffer.findById(sio.getId()));
204 aes.addAll(mainAbnormalClient.updateTzrc(sio)); 212 aes.addAll(mainAbnormalClient.updateTzrc(sio));
205 } 213 }
206 214
@@ -246,6 +254,10 @@ public class ScheduleServiceImpl implements ScheduleService { @@ -246,6 +254,10 @@ public class ScheduleServiceImpl implements ScheduleService {
246 //处理掉异常 254 //处理掉异常
247 AbnormalEntity ae = mainAbnormalClient.rybd(id, timeStr, reason, remarks); 255 AbnormalEntity ae = mainAbnormalClient.rybd(id, timeStr, reason, remarks);
248 256
  257 + //重新计算签到准点率
  258 + if(RateNCalculator.calcBdzdRateNo())
  259 + sendUtils.sendAllRates();
  260 +
249 rs.put("status", ResponseCode.SUCCESS); 261 rs.put("status", ResponseCode.SUCCESS);
250 rs.put("t", sio); 262 rs.put("t", sio);
251 rs.put("ae", ae); 263 rs.put("ae", ae);
@@ -283,6 +295,9 @@ public class ScheduleServiceImpl implements ScheduleService { @@ -283,6 +295,9 @@ public class ScheduleServiceImpl implements ScheduleService {
283 295
284 //处理掉异常 296 //处理掉异常
285 AbnormalEntity ae = mainAbnormalClient.cycc(id, timeStr, reason, remarks); 297 AbnormalEntity ae = mainAbnormalClient.cycc(id, timeStr, reason, remarks);
  298 + //重新计算出场准点率
  299 + if(RateNCalculator.calcCczdRateNo())
  300 + sendUtils.sendAllRates();
286 301
287 rs.put("status", ResponseCode.SUCCESS); 302 rs.put("status", ResponseCode.SUCCESS);
288 rs.put("t", sio); 303 rs.put("t", sio);
src/main/java/com/bsth/websocket/handler/SendUtils.java
1 package com.bsth.websocket.handler; 1 package com.bsth.websocket.handler;
2 2
3 import com.bsth.data.abnormal.entity.AbnormalEntity; 3 import com.bsth.data.abnormal.entity.AbnormalEntity;
  4 +import com.bsth.data.abnormal.rate_chart.RateNCalculator;
4 import com.bsth.data.schedule.dto.ScheduleInOut; 5 import com.bsth.data.schedule.dto.ScheduleInOut;
5 import com.fasterxml.jackson.databind.ObjectMapper; 6 import com.fasterxml.jackson.databind.ObjectMapper;
6 import org.slf4j.Logger; 7 import org.slf4j.Logger;
@@ -110,4 +111,23 @@ public class SendUtils{ @@ -110,4 +111,23 @@ public class SendUtils{
110 logger.error("", e); 111 logger.error("", e);
111 } 112 }
112 } 113 }
  114 +
  115 + /**
  116 + * 全量推统计率值
  117 + */
  118 + public void sendAllRates(){
  119 + Map<String, Object> map = new HashMap<>();
  120 + map.put("fn", "all_rate_val");
  121 + map.put("cczd", RateNCalculator.cczdRateNo);
  122 + map.put("bdzd", RateNCalculator.bdzdRateNo);
  123 +
  124 +
  125 + ObjectMapper mapper = new ObjectMapper();
  126 +
  127 + try {
  128 + socketHandler.sendMessage(mapper.writeValueAsString(map));
  129 + } catch (Exception e) {
  130 + logger.error("", e);
  131 + }
  132 + }
113 } 133 }
src/main/resources/static/assets/css/abnormal_monitor.css
1 #abnormal_monitor_wrap{ 1 #abnormal_monitor_wrap{
2 height: 100%; 2 height: 100%;
  3 + position: relative;
  4 + overflow: hidden;
3 } 5 }
4 #abnormal_monitor_wrap>div{ 6 #abnormal_monitor_wrap>div{
5 font-size: 14px; 7 font-size: 14px;
@@ -710,6 +712,11 @@ table tr&gt;td.empty{ @@ -710,6 +712,11 @@ table tr&gt;td.empty{
710 fill: rgb(76, 131, 79) !important; 712 fill: rgb(76, 131, 79) !important;
711 } 713 }
712 714
  715 +
  716 +.data_charts .vz-skin-fire .vz-radial_progress-label{
  717 + fill: rgb(241, 56, 112) !important;
  718 +}
  719 +
713 .data_charts .vz-radial_progress-label{ 720 .data_charts .vz-radial_progress-label{
714 font-size: 16px !important; 721 font-size: 16px !important;
715 transform: translate(3px, -10px); 722 transform: translate(3px, -10px);
@@ -723,6 +730,10 @@ table tr&gt;td.empty{ @@ -723,6 +730,10 @@ table tr&gt;td.empty{
723 font-weight: 300; 730 font-weight: 300;
724 } 731 }
725 732
  733 +.vz-skin-fire ._chart_title text{
  734 + stroke: rgb(241, 56, 112);
  735 +}
  736 +
726 .data_charts>div>.chart_wrap{ 737 .data_charts>div>.chart_wrap{
727 height: 100%; 738 height: 100%;
728 padding-top: 5px; 739 padding-top: 5px;
@@ -736,4 +747,21 @@ table tr&gt;td.empty{ @@ -736,4 +747,21 @@ table tr&gt;td.empty{
736 747
737 .data_charts>div{ 748 .data_charts>div{
738 text-align: center; 749 text-align: center;
739 -}  
740 \ No newline at end of file 750 \ No newline at end of file
  751 +}
  752 +
  753 +#abnormal_monitor_wrap .empty-line-div {
  754 + position: absolute;
  755 + z-index: 2;
  756 + background: #f6f6f6;
  757 + width: 100%;
  758 + height: 100%;
  759 + text-align: center;
  760 + display: none;
  761 +}
  762 +
  763 +
  764 +#abnormal_monitor_wrap .empty-line-div p{
  765 + font-size: 16px;
  766 + font-family: 微软雅黑;
  767 +}
  768 +
src/main/resources/static/assets/css/system_manager.css
@@ -97,24 +97,24 @@ @@ -97,24 +97,24 @@
97 97
98 .fun_s_list .module span.item.active{ 98 .fun_s_list .module span.item.active{
99 color: #ffffff; 99 color: #ffffff;
100 - background: #ff8a65; 100 + background: #9c9c9c;
101 } 101 }
102 102
103 .fun_s_list .module span.item.active .uk-checkbox:checked, 103 .fun_s_list .module span.item.active .uk-checkbox:checked,
104 .fun_s_list .module span.item.active .uk-checkbox:indeterminate, 104 .fun_s_list .module span.item.active .uk-checkbox:indeterminate,
105 .fun_s_list .module span.item.active .uk-radio:checked{ 105 .fun_s_list .module span.item.active .uk-radio:checked{
106 - background-color: #ff8a65; 106 + background-color: #9c9c9c;
107 } 107 }
108 108
109 .fun_s_list .module span.root.item.active{ 109 .fun_s_list .module span.root.item.active{
110 color: #ffffff; 110 color: #ffffff;
111 - background: #FF5722; 111 + background: #9c9c9c;
112 } 112 }
113 113
114 .fun_s_list .module span.root.item.active .uk-checkbox:checked, 114 .fun_s_list .module span.root.item.active .uk-checkbox:checked,
115 .fun_s_list .module span.root.item.active .uk-checkbox:indeterminate, 115 .fun_s_list .module span.root.item.active .uk-checkbox:indeterminate,
116 .fun_s_list .module span.root.item.active .uk-radio:checked{ 116 .fun_s_list .module span.root.item.active .uk-radio:checked{
117 - background-color: #FF5722; 117 + background-color: #9c9c9c;
118 } 118 }
119 119
120 .footer_wrap{ 120 .footer_wrap{
src/main/resources/static/js/_websocket.js
@@ -56,6 +56,9 @@ var gb_websocket = (function () { @@ -56,6 +56,9 @@ var gb_websocket = (function () {
56 }, 56 },
57 abnormal_att: function (msg) { 57 abnormal_att: function (msg) {
58 gb_o_s_ws_handler.attendace(msg); 58 gb_o_s_ws_handler.attendace(msg);
  59 + },
  60 + all_rate_val: function (msg) {
  61 + gb_o_s_charts.changeVal(msg);
59 } 62 }
60 }; 63 };
61 64
src/main/resources/static/pages/abnormal/fragments/m_tzrc.html
@@ -283,6 +283,7 @@ @@ -283,6 +283,7 @@
283 283
284 UIkit.notification('操作成功!', 'success'); 284 UIkit.notification('操作成功!', 'success');
285 gb_os_card.update(rs.list); 285 gb_os_card.update(rs.list);
  286 + gb_o_s_abnormal.update(rs.aes);
286 UIkit.modal(modalId).hide(); 287 UIkit.modal(modalId).hide();
287 }); 288 });
288 } 289 }
src/main/resources/static/pages/abnormal/fragments/type_0/h_cont_hrcc.html
@@ -126,7 +126,7 @@ @@ -126,7 +126,7 @@
126 } 126 }
127 else{ 127 else{
128 //提交 128 //提交
129 - $(modalId).on('click', '.submit-btn', _submit); 129 + $(wrap).on('click', '.submit-btn', _submit);
130 } 130 }
131 }); 131 });
132 132
@@ -218,7 +218,7 @@ @@ -218,7 +218,7 @@
218 * 提交 218 * 提交
219 */ 219 */
220 function _submit() { 220 function _submit() {
221 - var f = $('form', modalId); 221 + var f = $('form', wrap);
222 var fData = f.serializeJSON(); 222 var fData = f.serializeJSON();
223 223
224 if(!fData['nbbm'] && !$('[name=nbbm]', f).attr('disabled')){ 224 if(!fData['nbbm'] && !$('[name=nbbm]', f).attr('disabled')){
@@ -248,7 +248,7 @@ @@ -248,7 +248,7 @@
248 }); 248 });
249 }); 249 });
250 250
251 - $('.submit-btn', modalId).attr('disabled', 'disabled'); 251 + $('.submit-btn', wrap).attr('disabled', 'disabled');
252 //先校验一下操作有效性 252 //先校验一下操作有效性
253 fData.line = ae.lineCode; 253 fData.line = ae.lineCode;
254 gb_common.$post('/in_out/tzrc_check', fData, function (rs) { 254 gb_common.$post('/in_out/tzrc_check', fData, function (rs) {
@@ -258,10 +258,10 @@ @@ -258,10 +258,10 @@
258 } 258 }
259 else { 259 else {
260 gb_common.$post('/in_out/tzrc', {cpcsJson: JSON.stringify(data)}, function (rs) { 260 gb_common.$post('/in_out/tzrc', {cpcsJson: JSON.stringify(data)}, function (rs) {
261 - console.log('rsrsrs', rs);  
262 261
263 UIkit.notification('操作成功!', 'success'); 262 UIkit.notification('操作成功!', 'success');
264 gb_os_card.update(rs.list); 263 gb_os_card.update(rs.list);
  264 + gb_o_s_abnormal.update(rs.aes);
265 UIkit.modal(modalId).hide(); 265 UIkit.modal(modalId).hide();
266 }); 266 });
267 } 267 }
src/main/resources/static/pages/abnormal/fragments/type_1/h_cont_hccc.html
@@ -125,7 +125,7 @@ @@ -125,7 +125,7 @@
125 } 125 }
126 else{ 126 else{
127 //提交 127 //提交
128 - $(modalId).on('click', '.submit-btn', _submit); 128 + $(wrap).on('click', '.submit-btn', _submit);
129 } 129 }
130 }); 130 });
131 131
@@ -217,7 +217,7 @@ @@ -217,7 +217,7 @@
217 * 提交 217 * 提交
218 */ 218 */
219 function _submit() { 219 function _submit() {
220 - var f = $('form', modalId); 220 + var f = $('form', wrap);
221 var fData = f.serializeJSON(); 221 var fData = f.serializeJSON();
222 222
223 if(!fData['nbbm'] && !$('[name=nbbm]', f).attr('disabled')){ 223 if(!fData['nbbm'] && !$('[name=nbbm]', f).attr('disabled')){
@@ -247,7 +247,7 @@ @@ -247,7 +247,7 @@
247 }); 247 });
248 }); 248 });
249 249
250 - $('.submit-btn', modalId).attr('disabled', 'disabled'); 250 + $('.submit-btn', wrap).attr('disabled', 'disabled');
251 //先校验一下操作有效性 251 //先校验一下操作有效性
252 fData.line = ae.lineCode; 252 fData.line = ae.lineCode;
253 gb_common.$post('/in_out/tzrc_check', fData, function (rs) { 253 gb_common.$post('/in_out/tzrc_check', fData, function (rs) {
@@ -257,10 +257,10 @@ @@ -257,10 +257,10 @@
257 } 257 }
258 else { 258 else {
259 gb_common.$post('/in_out/tzrc', {cpcsJson: JSON.stringify(data)}, function (rs) { 259 gb_common.$post('/in_out/tzrc', {cpcsJson: JSON.stringify(data)}, function (rs) {
260 - console.log('rsrsrs', rs);  
261 260
262 UIkit.notification('操作成功!', 'success'); 261 UIkit.notification('操作成功!', 'success');
263 gb_os_card.update(rs.list); 262 gb_os_card.update(rs.list);
  263 + gb_o_s_abnormal.update(rs.aes);
264 UIkit.modal(modalId).hide(); 264 UIkit.modal(modalId).hide();
265 }); 265 });
266 } 266 }
src/main/resources/static/pages/abnormal/js/o_s_abnormal.js
@@ -91,11 +91,25 @@ var gb_o_s_abnormal = (function () { @@ -91,11 +91,25 @@ var gb_o_s_abnormal = (function () {
91 } 91 }
92 }; 92 };
93 93
  94 + var update = function (array) {
  95 + if (!isArray(array))
  96 + array = [array];
  97 +
  98 + var htmlStr, id;
  99 + $.each(array, function () {
  100 + id = this.schId + '_' + this.type;
  101 + htmlStr = template('abnormal_card_list-temp', {list: [this]});
  102 +
  103 + $('div[data-id='+id+']', wrap).replaceWith(htmlStr);
  104 + });
  105 + };
  106 +
94 107
95 return { 108 return {
96 init: init, 109 init: init,
97 get: getByKey, 110 get: getByKey,
98 handle: handle, 111 handle: handle,
99 - renderErrorLinePanel: renderErrorLinePanel 112 + renderErrorLinePanel: renderErrorLinePanel,
  113 + update: update
100 } 114 }
101 })(); 115 })();
102 \ No newline at end of file 116 \ No newline at end of file
src/main/resources/static/pages/abnormal/js/o_s_charts.js
@@ -4,8 +4,12 @@ @@ -4,8 +4,12 @@
4 var gb_o_s_charts = (function () { 4 var gb_o_s_charts = (function () {
5 5
6 var init = function () { 6 var init = function () {
7 - renderCcCharts();  
8 - renderQdCharts(); 7 + $.get('/in_out/rates', function (rs) {
  8 +
  9 + lastData = rs;
  10 + renderCcCharts(rs['cczd']);
  11 + renderQdCharts(rs['bdzd']);
  12 + });
9 }; 13 };
10 14
11 //出场准点率 viz 15 //出场准点率 viz
@@ -13,36 +17,48 @@ var gb_o_s_charts = (function () { @@ -13,36 +17,48 @@ var gb_o_s_charts = (function () {
13 //签到准点率 viz 17 //签到准点率 viz
14 var qdRateChartViz; 18 var qdRateChartViz;
15 19
  20 + var lastData;
16 21
17 /** 22 /**
18 * 出场准点率 23 * 出场准点率
19 */ 24 */
20 - var renderCcCharts = function () { 25 + var renderCcCharts = function (v) {
21 var wrap = '#abnormal_monitor_wrap'; 26 var wrap = '#abnormal_monitor_wrap';
22 var v_cont = d3.selectAll(wrap + ' #ccRateChart>.chart_wrap'); 27 var v_cont = d3.selectAll(wrap + ' #ccRateChart>.chart_wrap');
23 28
24 - var viz = vizuly.viz.radial_progress($('#ccRateChart>.chart_wrap', wrap)[0])  
25 - ,theme = vizuly.theme.radial_progress(viz).skin(vizuly.skin.RADIAL_PROGRESS_ALERT); 29 + var viz = vizuly.viz.radial_progress($('#ccRateChart>.chart_wrap', wrap)[0]);
  30 + var theme = vizuly.theme.radial_progress(viz).skin(getTheme(v));
  31 + viz._themeObj = theme;
26 32
27 - drawArc(viz, v_cont, 80, '出场准点'); 33 + drawArc(viz, v_cont, v, '出场准点');
28 ccRateChartViz = viz; 34 ccRateChartViz = viz;
29 }; 35 };
30 36
31 /** 37 /**
32 * 签到准点率 38 * 签到准点率
33 */ 39 */
34 - var renderQdCharts = function () { 40 + var renderQdCharts = function (v) {
35 var wrap = '#abnormal_monitor_wrap'; 41 var wrap = '#abnormal_monitor_wrap';
36 var v_cont = d3.selectAll(wrap + ' #bdRateChart>.chart_wrap'); 42 var v_cont = d3.selectAll(wrap + ' #bdRateChart>.chart_wrap');
37 43
38 - var viz = vizuly.viz.radial_progress($('#bdRateChart>.chart_wrap', wrap)[0])  
39 - ,theme = vizuly.theme.radial_progress(viz).skin(vizuly.skin.RADIAL_PROGRESS_ALERT); 44 + var viz = vizuly.viz.radial_progress($('#bdRateChart>.chart_wrap', wrap)[0]);
  45 + vizuly.theme.radial_progress(viz).skin(getTheme(v));
40 46
41 - drawArc(viz, v_cont, 80, '报到准点'); 47 + drawArc(viz, v_cont, v, '报到准点');
42 qdRateChartViz = viz; 48 qdRateChartViz = viz;
43 }; 49 };
44 50
45 51
  52 + var getTheme = function (v) {
  53 + var themeStr = vizuly.skin.RADIAL_PROGRESS_ALERT;
  54 + if(v < 50)
  55 + themeStr = vizuly.skin.RADIAL_PROGRESS_FIRE;
  56 + else if(v > 50 && v < 80)
  57 + themeStr = vizuly.skin.RADIAL_PROGRESS_NEON;
  58 +
  59 + return themeStr;
  60 + };
  61 +
46 function changeSize(viz, val) { 62 function changeSize(viz, val) {
47 var s = String(val).split(","); 63 var s = String(val).split(",");
48 var divWidth = s[0] * 0.80 / 3; 64 var divWidth = s[0] * 0.80 / 3;
@@ -54,7 +70,7 @@ var gb_o_s_charts = (function () { @@ -54,7 +70,7 @@ var gb_o_s_charts = (function () {
54 .height(200) 70 .height(200)
55 .min(0) 71 .min(0)
56 .max(100) 72 .max(100)
57 - .on("tween",onTween) 73 + //.on("tween",onTween)
58 74
59 .startAngle(180) 75 .startAngle(180)
60 .endAngle(180) 76 .endAngle(180)
@@ -81,12 +97,33 @@ var gb_o_s_charts = (function () { @@ -81,12 +97,33 @@ var gb_o_s_charts = (function () {
81 .text(viz.label()(viz.data() * i)); 97 .text(viz.label()(viz.data() * i));
82 } 98 }
83 99
  100 + var changeVal = function (msg) {
  101 + console.log('changeValchangeVal', msg, lastData);
  102 + //出场准点率
  103 + if(msg.cczd!=lastData.cczd){
  104 + ccRateChartViz.data(Number(msg.cczd)).update();//更新数字
  105 + changeTheme(ccRateChartViz, msg.cczd);//更新颜色
  106 + lastData.cczd = msg.cczd;
  107 + }
  108 +
  109 + //报到准点率
  110 + if(msg.bdzd!=lastData.bdzd){
  111 + qdRateChartViz.data(Number(msg.bdzd)).update();//更新数字
  112 + changeTheme(qdRateChartViz, msg.bdzd);//更新颜色
  113 + lastData.bdzd = msg.bdzd;
  114 + }
  115 + };
  116 +
  117 + var changeTheme = function (viz, val) {
  118 + var themeObj = viz._themeObj;
  119 + var v = getTheme(val);
84 120
85 - /* function changeData(val) {  
86 - viz.data(Number(val)).update();  
87 - }*/ 121 + themeObj.skin(val);
  122 + themeObj.viz().update();
  123 + };
88 124
89 return { 125 return {
90 - init: init 126 + init: init,
  127 + changeVal: changeVal
91 } 128 }
92 })(); 129 })();
93 \ No newline at end of file 130 \ No newline at end of file
src/main/resources/static/pages/abnormal/main.html
1 <div id="abnormal_monitor_wrap" class=""> 1 <div id="abnormal_monitor_wrap" class="">
  2 + <div class="empty-line-div">
  3 + <div class="uk-alert-danger" uk-alert>
  4 + <p>当前账号没有可监管的线路,请至 “系统管理”——>“用户和账号” 分配线路监管权限。</p>
  5 + </div>
  6 + </div>
2 7
3 <div class="left_panel"> 8 <div class="left_panel">
4 <div class="red_line_bts"></div> 9 <div class="red_line_bts"></div>
@@ -359,6 +364,12 @@ @@ -359,6 +364,12 @@
359 var wrap = '#abnormal_monitor_wrap'; 364 var wrap = '#abnormal_monitor_wrap';
360 var lineIdx = '10146'; 365 var lineIdx = '10146';
361 window.localStorage.setItem("abnormal_line_idx", lineIdx); 366 window.localStorage.setItem("abnormal_line_idx", lineIdx);
  367 +
  368 + if(!lineIdx){
  369 + $('.empty-line-div',wrap).show();
  370 + return;
  371 + }
  372 +
362 var initFlag; 373 var initFlag;
363 374
364 var start = function (cb) { 375 var start = function (cb) {
src/main/resources/static/pages/system_manager/user/user_list.html
@@ -85,7 +85,8 @@ @@ -85,7 +85,8 @@
85 <td>{{user.lastLoginTimeStr}}</td> 85 <td>{{user.lastLoginTimeStr}}</td>
86 <td>{{user.enabled?'启用':'禁用'}}</td> 86 <td>{{user.enabled?'启用':'禁用'}}</td>
87 <td> 87 <td>
88 - <a class="edit_icon" data-code="{{user.id}}" uk-icon="icon: file-edit"></a> 88 + <a class="edit_icon" data-code="{{user.id}}" uk-icon="icon: file-edit"></a>&nbsp;
  89 + <button class="uk-button uk-button-small" style="font-size: 12px;">线路分配</button>
89 </td> 90 </td>
90 </tr> 91 </tr>
91 {{/each}} 92 {{/each}}