目前公司有这么一个需求,查询指定月份正常打卡出勤的人数。正常出勤指的是一天打两次卡的人员,如果一天就打了上午或者下午一次卡不算入正常出勤。
思路:
由于只有打卡的数据才会存入数据库中,而且一天最多打卡两次,不可能出现重复打卡,所以我们可以把指定月份的打卡数据全部查出来,然后通过打卡时间进行分组,存入Map中,key为打卡时间,value为打卡实体,这样子如果value存在两个list则说明这个人是正常出勤,一天打了两次卡。
//正常出勤打卡次数
int attendanceCount = 0;
//查询指定月份用户所有的打卡数据
List<SigninDTO> signinDO = signinMapper.getSignListByMonth(154, "2021-06");
//将打卡记录按时间进行分组,存入Map
Map<Object, List<SigninDTO>> resultMap = new HashMap<>();
for (SigninDTO signin : signinDO) {
//该日期已存在,则放入该集合,signin.getTime()只需要年月日,时分秒无法进行分组
if (resultMap.containsKey(signin.getTime())) {
resultMap.get(signin.getTime()).add(signin);
} else {
//不存在,则新建日期key,用来存放数据
List<SigninDTO> itemList= new ArrayList<>();
itemList.add(signin);
resultMap.put(signin.getTime(),itemList);
}
}
for (List<SigninDTO> signinDTOList: resultMap.values()){
//两个List则代表正常出勤
if (signinDTOList.size() == 2){
attendanceCount ++;
}
}