RealAttendaceHandler.java
3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.bsth.data.attendance;
import com.bsth.data.abnormal.MainAbnormalClient;
import com.bsth.data.abnormal.entity.AbnormalEntity;
import com.bsth.data.abnormal.rate_chart.RateNCalculator;
import com.bsth.data.attendance.entity.JsyAttendance;
import com.bsth.data.schedule.dto.ScheduleInOut;
import com.bsth.data.schedule.real.ScheduleComparator;
import com.bsth.data.schedule.real.ScheduleDataBuffer;
import com.bsth.websocket.handler.SendUtils;
import com.google.common.collect.ArrayListMultimap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 实时签到退数据管理
* Created by panzhao on 2018/3/27.
*/
@Component
public class RealAttendaceHandler {
@Autowired
SendUtils sendUtils;
@Autowired
MainAbnormalClient mainAbnormalClient;
/**
* K:工号 V:签到信息
*/
private static ArrayListMultimap<String, JsyAttendance> qdListMap;
static {
qdListMap = ArrayListMultimap.create();
}
/**
* 签到
*/
public void attendace(JsyAttendance att){
qdListMap.put(att.getUserId(), att);
//驾驶员的出场计划
ScheduleInOut sio = ScheduleDataBuffer.getCurrExecOut(att.getCompany(), att.getUserId(), att.getAt());
//报到时间不覆盖
if (sio.getAttSjTime() != null)
return;
sio.setAttSjTime(att.getAt());
//处理掉相关异常
AbnormalEntity ae = mainAbnormalClient.qiandao(sio, att);
//通知页面
sendUtils.scheduleAttendace(sio, ae);
//重新计算签到准点率
if(RateNCalculator.calcBdzdRateNo())
sendUtils.sendAllRates();
}
/**
* 重新匹配驾驶员报到时间
* @param jGh1
* @param jGh2
*/
public void reCalcOutSignal(String company, String jGh1, String jGh2) {
//获取驾驶员的出场计划
List<ScheduleInOut> arrayA = ScheduleDataBuffer.getOutsByUserId(company, jGh1)
, arrayB = ScheduleDataBuffer.getOutsByUserId(company, jGh2);
reCalcOutSignal(arrayA);
reCalcOutSignal(arrayB);
}
private void reCalcOutSignal(List<ScheduleInOut> list) {
if (null == list || list.size() == 0)
return;
//清空班次上的签到时间
for (ScheduleInOut sio : list)
sio.setAttSjTime(null);
List<JsyAttendance> atts = qdListMap.get(list.get(0).getjGh());
if (null == atts || atts.size() == 0)
return;
Collections.sort(list, new ScheduleComparator());
Collections.sort(atts, new AttendanceComp());
for (JsyAttendance att : atts) {
for (ScheduleInOut sio : list)
matchJh2Sj(att, sio);
}
}
/**
* 匹配计划和实际
*
* @param att
* @param sio
*/
private void matchJh2Sj(JsyAttendance att, ScheduleInOut sio) {
if(Math.abs(att.getAttTime().getTime() - sio.getAttJhTime()) > ScheduleDataBuffer.SPACE_THRESHOLD)
return;//2小时内
if (null == sio.getOutTimeRfid())
sio.setAttSjTime(att.getAttTime().getTime());
}
class AttendanceComp implements Comparator<JsyAttendance>{
@Override
public int compare(JsyAttendance o1, JsyAttendance o2) {
return (int) (o1.getAttTime().getTime() - o2.getAttTime().getTime());
}
}
}