| | |
| | | package org.springblade.modules.attendance.controller; |
| | | |
| | | import bsh.ParseException; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
| | | import io.swagger.annotations.Api; |
| | |
| | | import lombok.AllArgsConstructor; |
| | | import org.springblade.core.boot.ctrl.BladeController; |
| | | import org.springblade.core.excel.util.ExcelUtil; |
| | | import org.springblade.core.log.exception.ServiceException; |
| | | import org.springblade.core.mp.support.Condition; |
| | | import org.springblade.core.mp.support.Query; |
| | | import org.springblade.core.tool.api.R; |
| | |
| | | import org.springblade.modules.attendance.service.IAttendanceService; |
| | | import org.springblade.modules.attendance.vo.AttendanceVO; |
| | | import org.springblade.modules.attendance.wrapper.AttendanceWrapper; |
| | | import org.springblade.modules.system.entity.DictBiz; |
| | | import org.springblade.modules.system.entity.User; |
| | | import org.springblade.modules.system.service.IDictBizService; |
| | | import org.springblade.modules.system.service.IUserService; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.validation.Valid; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | |
| | | private final IAttendanceService attendanceService; |
| | | |
| | | // private final IEnclosureService iEnclosureService; |
| | | |
| | | private final IDictBizService iDictBizService; |
| | | |
| | | private final IUserService iUserService; |
| | | private final IUserService userService; |
| | | |
| | | /** |
| | | * 详情 |
| | |
| | | @GetMapping("/page") |
| | | @ApiOperationSupport(order = 3) |
| | | @ApiOperation(value = "分页", notes = "传入attendance") |
| | | public R<IPage<AttendanceVO>> page(AttendanceVO attendance, Query query, Long department) { |
| | | IPage<Attendance> pages = attendanceService.selectAttendancePage(Condition.getPage(query), department, attendance); |
| | | return R.data(AttendanceWrapper.build().pageVO(pages)); |
| | | public R<IPage<AttendanceVO>> page(AttendanceVO attendance, Query query) { |
| | | IPage<AttendanceVO> pages = attendanceService.selectAttendancePage(Condition.getPage(query), attendance); |
| | | return R.data(pages); |
| | | } |
| | | |
| | | // /** |
| | | // * 保安位置比对 |
| | | // */ |
| | | // @GetMapping("/positionThan") |
| | | // public R positionThan(@Valid Attendance attendance, HttpServletResponse response) { |
| | | // response.setHeader("Access-Control-Allow-Origin", "*"); |
| | | // response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); |
| | | // response.setHeader("Access-Control-Allow-Credentials", "true"); |
| | | // Enclosure enclosure = new Enclosure(); |
| | | // enclosure.setAnumber(attendance.getNumber()); |
| | | // //查询当前处警人员的电子围栏信息 |
| | | // Boolean onArea = iEnclosureService.isOnArea(attendance.getJd(),attendance.getWd(),enclosure); |
| | | // if (onArea){ |
| | | // return R.data(true); |
| | | // } |
| | | // return R.data(false); |
| | | // } |
| | | |
| | | /** |
| | | * 打卡(洪城义警app) |
| | | * @param response |
| | | * @param attendance |
| | | * @return |
| | | */ |
| | | @PostMapping("/AppSave") |
| | | public R AppSave(@Valid AttendanceVO attendance, HttpServletResponse response) { |
| | | response.setHeader("Access-Control-Allow-Origin", "*"); |
| | | response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); |
| | | response.setHeader("Access-Control-Allow-Credentials", "true"); |
| | | //先查询用户信息 |
| | | User user = new User(); |
| | | user.setCardid(attendance.getIdCardNo()); |
| | | user.setStatus(1); |
| | | user.setIsDeleted(0); |
| | | User user1 = userService.getOne(Condition.getQueryWrapper(user)); |
| | | if (null!=user1) { |
| | | attendance.setUserId(user1.getId()); |
| | | attendance.setClockTime(new Date()); |
| | | //查询当前考勤人员的部门信息 |
| | | attendance.setDeptId(Long.parseLong(user1.getDeptId())); |
| | | //获取当前日期是礼拜几 |
| | | attendance.setWeek(new SimpleDateFormat("EEEE").format(new Date())); |
| | | //获取打卡时间标准 |
| | | List<DictBiz> dictBizList = iDictBizService.getList("attendanceStandard"); |
| | | //定义打卡时间标准,上午,下午 |
| | | StringBuilder forenoon = new StringBuilder(); |
| | | StringBuilder afternoon = new StringBuilder(); |
| | | String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); |
| | | for (DictBiz dictBiz : dictBizList) { |
| | | if (dictBiz.getDictValue().contains("上午")) { |
| | | forenoon = forenoon.append(dictBiz.getDictKey()); |
| | | } |
| | | if (dictBiz.getDictValue().contains("下午")) { |
| | | afternoon = afternoon.append(dictBiz.getDictKey()); |
| | | } |
| | | } |
| | | //上午打卡时间标准 |
| | | String forenoonWorkTime = format + " " + forenoon.toString().split("-")[0] + ":00"; |
| | | String forenoonOfDutyTime = format + " " + forenoon.toString().split("-")[1] + ":00"; |
| | | //下午打卡时间标准 |
| | | String afternoonWorkTime = format + " " + afternoon.toString().split("-")[0] + ":00"; |
| | | String afternoonOfDutyTime = format + " " + afternoon.toString().split("-")[1] + ":00"; |
| | | //判断打卡时间 |
| | | try { |
| | | long time = attendance.getClockTime().getTime(); |
| | | |
| | | // /** |
| | | // * 新增 |
| | | // */ |
| | | // @PostMapping("/AppSave") |
| | | // @ApiOperationSupport(order = 4) |
| | | // @ApiOperation(value = "新增", notes = "传入attendance") |
| | | // public R AppSave(@Valid Attendance attendance, HttpServletResponse response) { |
| | | // response.setHeader("Access-Control-Allow-Origin", "*"); |
| | | // response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); |
| | | // response.setHeader("Access-Control-Allow-Credentials", "true"); |
| | | // Enclosure enclosure = new Enclosure(); |
| | | // enclosure.setAnumber(attendance.getNumber()); |
| | | // //查询当前处警人员的电子围栏信息 |
| | | // Boolean onArea = iEnclosureService.isOnArea(attendance.getJd(),attendance.getWd(),enclosure); |
| | | // //判断是否在所在区域打卡,返回数据 |
| | | // if (onArea) { |
| | | // //查询当前考勤人员的部门信息 |
| | | // attendance.setDepartment(iUserService.selUserByCode(attendance.getNumber()).getDeptId()); |
| | | // //获取当前日期是礼拜几 |
| | | // attendance.setWeek(new SimpleDateFormat("EEEE").format(new Date())); |
| | | // //获取打卡时间标准 |
| | | // List<DictBiz> dictBizList = iDictBizService.getList("attendanceStandard"); |
| | | // //定义打卡时间标准,上午,下午 |
| | | // StringBuilder forenoon = new StringBuilder(); |
| | | // StringBuilder afternoon = new StringBuilder(); |
| | | // String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); |
| | | // for (DictBiz dictBiz : dictBizList) { |
| | | // if (dictBiz.getDictValue().contains("上午")) { |
| | | // forenoon = forenoon.append(dictBiz.getDictKey()); |
| | | // } |
| | | // if (dictBiz.getDictValue().contains("下午")) { |
| | | // afternoon = afternoon.append(dictBiz.getDictKey()); |
| | | // } |
| | | // } |
| | | // //上午打卡时间标准 |
| | | // String forenoonWorkTime = format + " " + forenoon.toString().split("-")[0] + ":00"; |
| | | // String forenoonOfDutyTime = format + " " + forenoon.toString().split("-")[1] + ":00"; |
| | | // //下午打卡时间标准 |
| | | // String afternoonWorkTime = format + " " + afternoon.toString().split("-")[0] + ":00"; |
| | | // String afternoonOfDutyTime = format + " " + afternoon.toString().split("-")[1] + ":00"; |
| | | // //判断打卡时间 |
| | | // try { |
| | | // long time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(attendance.getClockTime()).getTime(); |
| | | // |
| | | // //判断上午上班之前半小时前打卡为无效打卡 |
| | | // if (time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime()-30*60*1000)<0){ |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("4"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //上午上班半小时前到上班时间打卡为正常打卡 |
| | | // if (time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime()-30*60*1000)>=0 |
| | | // && time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime()<=0) { |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("0"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //上午上班后到上班下班前打卡为正常打卡 |
| | | // if (time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime()>0 |
| | | // && time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime()<0) { |
| | | // //查询当前时间之前当前考勤人员的最新的一条考勤数据 |
| | | // Attendance attendanceNow = attendanceService.selAttendanceNewNow(attendance.getNumber()); |
| | | // if (null!=attendanceNow){ |
| | | // if (attendanceNow.getAttendancetype().equals("0") || attendanceNow.getClocktype().equals("1")) { |
| | | // //下班早退 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("2"); |
| | | // } |
| | | // if (attendanceNow.getAttendancetype().equals("4")){ |
| | | // //上班迟到 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("1"); |
| | | // } |
| | | // }else { |
| | | // //上班迟到 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("1"); |
| | | // } |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //正常下班时间-下班半小时后 |
| | | // if (time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime()>=0 |
| | | // && time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime()+30*60*1000)<=0){ |
| | | // //正常下班打卡 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("0"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //上午下班半小时后-下午上班之前半小時打卡为无效打卡 |
| | | // if (time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime()-30*60*1000)<0 |
| | | // && time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime()+30*60*1000)>0){ |
| | | // //无效打卡 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("4"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //下午上班之前半小時-下午上班时间之前打卡为下午正常上班打卡 |
| | | // if (time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime()-30*60*1000)>=0 |
| | | // && time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime()<=0){ |
| | | // //下午正常打卡 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("0"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //下午上班之后到下午下班之前 |
| | | // if (time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime()>0 |
| | | // && time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime()<0){ |
| | | // //查询当前时间之前当前考勤人员的最新的一条考勤数据 |
| | | // Attendance attendanceNow = attendanceService.selAttendanceNewNow(attendance.getNumber()); |
| | | // if (null!=attendanceNow){ |
| | | // if (attendanceNow.getAttendancetype().equals("0") && attendanceNow.getClocktype().equals("0")) { |
| | | // //下班早退 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("2"); |
| | | // } |
| | | // if (attendanceNow.getClocktype().equals("1")) { |
| | | // //下班早退 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("2"); |
| | | // } |
| | | // if (attendanceNow.getAttendancetype().equals("4")){ |
| | | // //上班迟到 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("1"); |
| | | // } |
| | | // }else { |
| | | // //上班迟到 |
| | | // attendance.setClocktype("0"); |
| | | // attendance.setAttendancetype("1"); |
| | | // } |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //正常打下午下班卡 |
| | | // if (time-new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime()>=0 |
| | | // && time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime()+30*60*1000)<=0 |
| | | // ){ |
| | | // //下午正常下班打卡 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("0"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // //打卡时间超过下午下班打卡时间后的半小时为无效打卡 |
| | | // if (time-(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime()+30*60*1000)>0){ |
| | | // //下午下班打卡无效 |
| | | // attendance.setClocktype("1"); |
| | | // attendance.setAttendancetype("4"); |
| | | // return R.status(attendanceService.save(attendance)); |
| | | // } |
| | | // |
| | | // } catch (ParseException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // return R.status(false); |
| | | // } |
| | | //判断上午上班之前半小时前打卡为无效打卡 |
| | | if (time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime() - 30 * 60 * 1000) < 0) { |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(5); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //上午上班半小时前到上班时间打卡为正常打卡 |
| | | if (time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime() - 30 * 60 * 1000) >= 0 |
| | | && time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime() <= 0) { |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(1); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //上午上班后到上班下班前打卡为正常打卡 |
| | | if (time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonWorkTime).getTime() > 0 |
| | | && time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime() < 0) { |
| | | //查询当前时间之前当前考勤人员的最新的一条考勤数据 |
| | | Attendance attendanceNow = attendanceService.selAttendanceNewNow(attendance.getUserId()); |
| | | if (null != attendanceNow) { |
| | | if (attendanceNow.getAttendanceType().equals(1) || attendanceNow.getClockType().equals(2)) { |
| | | //下班早退 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(3); |
| | | } |
| | | if (attendanceNow.getAttendanceType().equals(5)) { |
| | | //上班迟到 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(2); |
| | | } |
| | | } else { |
| | | //上班迟到 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(2); |
| | | } |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //正常下班时间-下班半小时后 |
| | | if (time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime() >= 0 |
| | | && time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime() + 30 * 60 * 1000) <= 0) { |
| | | //正常下班打卡 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(1); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //上午下班半小时后-下午上班之前半小時打卡为无效打卡 |
| | | if (time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime() - 30 * 60 * 1000) < 0 |
| | | && time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(forenoonOfDutyTime).getTime() + 30 * 60 * 1000) > 0) { |
| | | //无效打卡 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(5); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //下午上班之前半小時-下午上班时间之前打卡为下午正常上班打卡 |
| | | if (time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime() - 30 * 60 * 1000) >= 0 |
| | | && time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime() <= 0) { |
| | | //下午正常打卡 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(1); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //下午上班之后到下午下班之前 |
| | | if (time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonWorkTime).getTime() > 0 |
| | | && time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime() < 0) { |
| | | //查询当前时间之前当前考勤人员的最新的一条考勤数据 |
| | | Attendance attendanceNow = attendanceService.selAttendanceNewNow(attendance.getUserId()); |
| | | if (null != attendanceNow) { |
| | | if (attendanceNow.getAttendanceType().equals(1) && attendanceNow.getClockType().equals(1)) { |
| | | //下班早退 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(3); |
| | | } |
| | | if (attendanceNow.getClockType().equals(2)) { |
| | | //下班早退 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(3); |
| | | } |
| | | if (attendanceNow.getAttendanceType().equals(5)) { |
| | | //上班迟到 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(2); |
| | | } |
| | | } else { |
| | | //上班迟到 |
| | | attendance.setClockType(1); |
| | | attendance.setAttendanceType(2); |
| | | } |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //正常打下午下班卡 |
| | | if (time - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime() >= 0 |
| | | && time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime() + 30 * 60 * 1000) <= 0 |
| | | ) { |
| | | //下午正常下班打卡 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(1); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | //打卡时间超过下午下班打卡时间后的半小时为无效打卡 |
| | | if (time - (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(afternoonOfDutyTime).getTime() + 30 * 60 * 1000) > 0) { |
| | | //下午下班打卡无效 |
| | | attendance.setClockType(2); |
| | | attendance.setAttendanceType(5); |
| | | return R.status(attendanceService.save(attendance)); |
| | | } |
| | | |
| | | } catch (java.text.ParseException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return R.status(false); |
| | | } |
| | | |
| | | /** |
| | | * 修改 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 导出用户 |
| | | * 导出考勤数据 |
| | | * @param response |
| | | * @param attendance |
| | | */ |
| | | @GetMapping("/export-Attendance") |
| | | public void exportAttendane(String name, String beginTime, String endTime, String attendancetype, HttpServletResponse response) { |
| | | String beginTimes = null; |
| | | String endTimes = null; |
| | | String attendancetypes = null; |
| | | if (beginTime.equals("undefined ") && endTime.equals("undefined")) { |
| | | beginTimes=null; |
| | | endTimes=null; |
| | | attendancetypes=attendancetype; |
| | | } |
| | | else if (attendancetype.equals("undefined")){ |
| | | attendancetypes=null; |
| | | } |
| | | else { |
| | | beginTimes=beginTime; |
| | | endTimes=endTime; |
| | | attendancetypes=attendancetype; |
| | | } |
| | | |
| | | List<AttendanceExcel> list = attendanceService.exportAttendane(name, beginTimes, endTimes, attendancetypes); |
| | | public void exportAttendane(AttendanceVO attendance, HttpServletResponse response) { |
| | | List<AttendanceExcel> list = attendanceService.exportAttendane(attendance); |
| | | ExcelUtil.export(response, "考勤数据" + DateUtil.time(), "考勤数据表", list, AttendanceExcel.class); |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | } |