/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.modules.attendance.controller; 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.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.enclosure.entity.Enclosure; import org.springblade.modules.enclosure.service.IEnclosureService; import org.springblade.modules.system.entity.DictBiz; 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.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; /** * 控制器 * * @author BladeX * @since 2021-03-03 */ @RestController @AllArgsConstructor @RequestMapping("/attendance") @Api(value = "", tags = "接口") public class AttendanceController extends BladeController { private final IAttendanceService attendanceService; private final IEnclosureService iEnclosureService; private final IDictBizService iDictBizService; private final IUserService iUserService; /** * 详情 */ @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, Long department) { IPage pages = attendanceService.selectAttendancePage(Condition.getPage(query), department, attendance); return R.data(AttendanceWrapper.build().pageVO(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); } /** * 新增 */ @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 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); } /** * 修改 */ @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))); } /** * 导出用户 */ @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 list = attendanceService.exportAttendane(name, beginTimes, endTimes, attendancetypes); ExcelUtil.export(response, "考勤数据" + DateUtil.time(), "考勤数据表", list, AttendanceExcel.class); } }