package cn.edu.scau.employee.service.impl;
import cn.edu.scau.common.constant.PageConstant;
import cn.edu.scau.common.result.CommonResult;
import cn.edu.scau.common.result.PageCommonResult;
import cn.edu.scau.common.util.CollectionUtil;
import cn.edu.scau.common.util.ConvertUtil;
import cn.edu.scau.common.util.DateUtil;
import cn.edu.scau.common.util.ObjectUtil;
import cn.edu.scau.employee.common.constant.EmpInfoConstant;
import cn.edu.scau.employee.common.model.request.AttendCountRequest;
import cn.edu.scau.employee.common.model.request.AttendanceQueryRequest;
import cn.edu.scau.employee.common.model.response.AttendCountResponse;
import cn.edu.scau.employee.common.model.response.AttendanceResponse;
import cn.edu.scau.employee.config.exception.EmployeeException;
import cn.edu.scau.employee.dao.*;
import cn.edu.scau.employee.entity.*;
import cn.edu.scau.employee.service.AttendanceService;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @author chen.jiale
* @Description
* @date 2020/2/5 14:37
*/
@Service
public class AttendanceServiceImpl implements AttendanceService {
private static final Logger logger = LoggerFactory.getLogger(AttendanceServiceImpl.class);
@Autowired
private AttendanceDao attendanceDao;
@Autowired
private UserDetailDao userDetailDao;
@Autowired
private DepartmentDao departmentDao;
@Autowired
private LeavesDao leavesDao;
@Autowired
private BusinessTripDao businessTripDao;
@Override
public CommonResult countByEmpNo(AttendCountRequest request, String empNo) {
UserDetail userDetail = userDetailDao.findByEmpNo(empNo);
AttendCountResponse response = this.doCountAttendRecord(userDetail, request);
return CommonResult.success(response);
}
@Override
public CommonResult count(AttendCountRequest request) {
List<AttendCountResponse> responses = new ArrayList<>();
List<UserDetail> userDetails = userDetailDao.findAll();
if (!CollectionUtil.isEmpty(userDetails)) {
for (UserDetail userDetail : userDetails) {
AttendCountResponse response = this.doCountAttendRecord(userDetail, request);
if (!ObjectUtil.isEmpty(response)) {
responses.add(response);
}
}
}
return CommonResult.success(responses);
}
/**
* 统计考勤
*
* @param userDetail
* @param request
* @return
*/
private AttendCountResponse doCountAttendRecord(UserDetail userDetail, AttendCountRequest request) {
String empNo = userDetail.getEmpNo();
AttendCountResponse response = new AttendCountResponse();
List<Attendance> attendances = null;
List<Leaves> leaves = null;
List<BusinessTrip> businessTrips = null;
Integer year = request.getYear();
Integer attendDays = 0;
//按月查询
if (EmpInfoConstant.MONTH_RANGE == request.getRange()) {
Integer month = request.getMonth();
attendances = attendanceDao.findByEmpNoAndMonth(year, month, empNo);
attendDays = DateUtil.getWorkDaysOfMonth(year, month);
leaves = leavesDao.findByEmpNoAndMonth(year, month, empNo);
businessTrips = businessTripDao.findByEmpNoAndMonth(year, month, empNo);
} else if (EmpInfoConstant.QUARTER_RANGE == request.getRange()) {
//按季度查询
Integer quarter = request.getQuarter();
attendances = attendanceDao.findByEmpNoAndQuarter(year, quarter, empNo);
attendDays = DateUtil.getWorkDaysOfQuarter(year, quarter);
leaves = leavesDao.findByEmpNoAndQuarter(year, quarter, empNo);
businessTrips = businessTripDao.findByEmpNoAndQuarter(year, quarter, empNo);
}
//没有对应的记录
if (CollectionUtil.isEmpty(attendances) && CollectionUtil.isEmpty(leaves) && CollectionUtil.isEmpty(businessTrips)) {
return null;
}
//统计实际出勤天数,迟到天数,早退天数
Integer actualAttendDays = 0, lateDays = 0, earlyDays = 0;
if (!CollectionUtil.isEmpty(attendances)) {
Map<String, Integer> attendMap = countAttendDays(attendances);
actualAttendDays = attendMap.get("actualAttendDays");
earlyDays = attendMap.get("earlyDays");
lateDays = attendMap.get("lateDays");
}
//统计请假天数
Integer leaveDays = 0;
if (!CollectionUtil.isEmpty(leaves)) {
leaveDays = countLeaveDays(leaves, request);
}
//统计出差天数
Integer businessDays = 0;
if (!CollectionUtil.isEmpty(businessTrips)) {
businessDays = countBusinessDays(businessTrips, request);
}
//旷工天数
Integer skiDays = this.countSkiDays(request, attendDays, actualAttendDays, leaveDays, businessDays);
response.setEmpNo(empNo);
response.setName(userDetail.getName());
Department department = departmentDao.findById(userDetail.getDeptId());
response.setDept(department.getName());
response.setAttendDays(attendDays);
response.setActualAttendDays(actualAttendDays);
response.setLateDays(earlyDays);
response.setEarlyDays(lateDays);
response.setLeaveDays(leaveDays);
response.setBusinessDays(businessDays);
response.setSkiDays(skiDays);
return response;
}
/**
* 统计每日考勤结果
*
* @param attendances
* @return
*/
private Map<String, Integer> countAttendDays(List<Attendance> attendances) {
Integer lateDays, earlyDays, actualAttendDays;
lateDays = earlyDays = actualAttendDays = 0;
//统计实际出勤天数
for (Attendance attendance : attendances) {
actualAttendDays++;
if (attendance.isLate()) {
lateDays++;
continue;
} else if (attendance.isLeaveEarly()) {
earlyDays++;
}
}
Map<String, Integer> map = new HashMap<>(3);
map.put("actualAttendDays", actualAttendDays);
map.put("earlyDays", earlyDays);
map.put("lateDays", lateDays);
return map;
}
/**
* 统计某月请假天数或某季度请假天数
*
* @param leaves
* @param request
* @return
*/
private Integer countLeaveDays(List<Leaves> leaves, AttendCountRequest request) {
Integer leaveDays = 0;
//统计月份请假数
if (EmpInfoConstant.MONTH_RANGE == request.getRange()) {
for (Leaves leave : leaves) {
//请假时间跨越月份,不跨月份
if ((DateUtil.getMonth(leave.getStartTime()) == request.getMonth())
&& (DateUtil.getMonth(leave.getEndTime()) != request.getMonth())) {
leaveDays += (int) DateUtil.getDaysOfTwoDate(leave.getStartTime(),
DateUtil.getLastDayOfMonth(request.getYear(), request.getMonth()));
} else if ((DateUtil.getMonth(leave.getStartTime()) != request.getMonth())
&& (DateUtil.getMonth(leave.getEndTime()) == request.getMonth())) {
leaveDays += (int) DateUtil.getDaysOfTwoDate(DateUtil.getFirstDayOfMonth(request.getYear(), request.getMonth()),
leave.getEndTime());
} else {
leaveDays += (int) DateUtil.getDaysOfTwoDate(leave.getStartTime(), leave.getEndTime());
}
leaveDays++;
}
} else if (EmpInfoConstant.QUARTER_RANGE == request.getRange()) {
for (Leaves leave : leaves) {
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
员工信息管理系统1.0.zip (170个子文件)
AttendanceServiceImpl.java 15KB
SalaryServiceImpl.java 8KB
UserDetailServiceImpl.java 7KB
ResourceServiceImpl.java 7KB
ShiroConfig.java 6KB
UserServiceImpl.java 6KB
RoleServiceImpl.java 5KB
AttendController.java 5KB
UserDetailController.java 5KB
SalaryController.java 4KB
UserController.java 4KB
DepartmentServiceImpl.java 4KB
UserRealm.java 4KB
ResourceController.java 3KB
ManageRecordAspect.java 3KB
DepartmentController.java 3KB
RoleController.java 3KB
MeritsController.java 3KB
LoginCheckFilter.java 2KB
ValidatorUtil.java 2KB
SystemLogAspect.java 2KB
GlobalExceptionHandler.java 2KB
BusinessTripServiceImpl.java 2KB
UserDetailDao.java 2KB
ResourceDao.java 2KB
LeaveServiceImpl.java 2KB
TokenDao.java 2KB
PermissionCheckFilter.java 2KB
FileController.java 2KB
AttendanceDao.java 2KB
UserDetailService.java 2KB
CorsConfig.java 2KB
KafkaConsumer.java 2KB
RoleResourceDao.java 2KB
UserDao.java 2KB
GenderConverter.java 1KB
TableStyleStrategy.java 1KB
ExcelUtil.java 1KB
AttendanceExtendMapper.java 1KB
UserDetailAddRequest.java 1KB
RoleResourceMapper.java 1KB
DepartmentDao.java 1KB
UserService.java 1KB
SalaryExcelItem.java 1KB
ResourceService.java 1KB
SwaggerConfig.java 1KB
SalaryResponse.java 1KB
SalaryAddRequest.java 1KB
SalaryService.java 1KB
BusinessTripDao.java 1KB
UserDetailExcelItem.java 1KB
UserDetailResponse.java 1KB
BusinessTripExtendMapper.java 1KB
LeavesExtendMapper.java 1KB
LeavesDao.java 1KB
ShiroWildcardPermission.java 1KB
ShiroResourceServiceImpl.java 1KB
UserDetailExtendMapper.java 1KB
ResourceExtendMapper.java 1KB
AttendanceService.java 1KB
SalaryDao.java 1KB
RoleDao.java 1KB
AttendCountResponse.java 1KB
DepartmentService.java 1KB
MessageUtil.java 1KB
RoleService.java 1KB
ManageRecord.java 1KB
ResourceResponse.java 988B
LeaveResponse.java 973B
BusinessTripResponse.java 904B
UserResponse.java 880B
UserExtendMapper.java 856B
RoleResponse.java 832B
BusinessStatusEnum.java 829B
ManageTypeEnum.java 819B
ResourceAddRequest.java 796B
ManageRecordServiceImpl.java 789B
KafkaMessage.java 782B
SalaryQueryRequest.java 772B
ManageRecordMapper.java 765B
LeaveStatusEnum.java 762B
EmpInfoConstant.java 758B
AttendanceResponse.java 757B
BusinessTripAddRequest.java 750B
LeaveAddRequest.java 736B
DepartmentResponse.java 735B
LeaveTypeEnum.java 728B
AttendCountRequest.java 720B
SalaryExtendMapper.java 719B
ShiroUserDao.java 707B
EmployeeApplication.java 688B
BusinessTripMapper.java 687B
AttendanceQueryRequest.java 686B
RoleAddRequest.java 682B
SalaryMapper.java 667B
UserDetailMapper.java 666B
DepartmentMapper.java 661B
LeavesMapper.java 652B
UserAddRequest.java 652B
UserDetailQueryRequest.java 649B
共 170 条
- 1
- 2
资源评论
博士僧小星
- 粉丝: 1931
- 资源: 5894
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功