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 io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; 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.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.modules.attendance.entity.Attendance; import org.springblade.modules.attendance.excel.AttendanceExcel; 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; /** * 考勤控制器 * @since 2023-03-03 */ @RestController @AllArgsConstructor @RequestMapping("/attendance") @Api(value = "", tags = "接口") public class AttendanceController extends BladeController { private final IAttendanceService attendanceService; private final IDictBizService iDictBizService; private final IUserService userService; /** * 详情 */ @GetMapping("/detail") @ApiOperationSupport(order = 1) @ApiOperation(value = "详情", notes = "传入attendance") public R detail(Attendance attendance) { Attendance detail = attendanceService.getOne(Condition.getQueryWrapper(attendance)); return R.data(detail); } /** * 分页 */ @GetMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入attendance") public R> list(Attendance attendance, Query query) { IPage pages = attendanceService.page(Condition.getPage(query), Condition.getQueryWrapper(attendance)); return R.data(AttendanceWrapper.build().pageVO(pages)); } /** * 自定义分页 */ @GetMapping("/page") @ApiOperationSupport(order = 3) @ApiOperation(value = "分页", notes = "传入attendance") public R> page(AttendanceVO attendance, Query query) { IPage pages = attendanceService.selectAttendancePage(Condition.getPage(query), attendance); return R.data(pages); } /** * 打卡(洪城义警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 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(); //判断上午上班之前半小时前打卡为无效打卡 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); } /** * 修改 */ @PostMapping("/update") @ApiOperationSupport(order = 5) @ApiOperation(value = "修改", notes = "传入attendance") public R update(@Valid @RequestBody Attendance attendance) { return R.status(attendanceService.updateById(attendance)); } /** * 新增或修改 */ @PostMapping("/submit") @ApiOperationSupport(order = 6) @ApiOperation(value = "新增或修改", notes = "传入attendance") public R submit(@Valid @RequestBody Attendance attendance) { return R.status(attendanceService.saveOrUpdate(attendance)); } /** * 删除 */ @PostMapping("/remove") @ApiOperationSupport(order = 8) @ApiOperation(value = "删除", notes = "传入ids") public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { return R.status(attendanceService.removeByIds(Func.toLongList(ids))); } /** * 导出考勤数据 * @param response * @param attendance */ @GetMapping("/export-Attendance") public void exportAttendane(AttendanceVO attendance, HttpServletResponse response) { List list = attendanceService.exportAttendane(attendance); ExcelUtil.export(response, "考勤数据" + DateUtil.time(), "考勤数据表", list, AttendanceExcel.class); } }