package cn.timer.api.controller.kqgl; import java.math.BigDecimal; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONObject; import cn.timer.api.bean.kqgl.AttConditions; import cn.timer.api.bean.kqgl.AttGroupBinPunchMode; import cn.timer.api.bean.kqgl.AttendanceMachine; import cn.timer.api.bean.kqgl.AttendanceWeeklySch; import cn.timer.api.bean.kqgl.PunchCardAddress; import cn.timer.api.bean.kqgl.PunchCardWiFi; import cn.timer.api.bean.kqgl.Schedule; import cn.timer.api.bean.kqmk.KqglAssoBcsz; import cn.timer.api.bean.kqmk.KqglAssoDkjl; import cn.timer.api.bean.kqmk.KqglAssoDkmx; import cn.timer.api.bean.kqmk.KqglAssoKqj; import cn.timer.api.bean.kqmk.KqglAssoKqzdkfs; import cn.timer.api.bean.kqmk.KqglAssoLeaveRules; import cn.timer.api.bean.kqmk.KqglAssoPbmx; import cn.timer.api.bean.kqmk.KqglAssoRelationSummary; import cn.timer.api.bean.kqmk.KqglAssoTeshu; import cn.timer.api.bean.kqmk.KqglAssoZhoupaiban; import cn.timer.api.bean.kqmk.KqglMainKqz; import cn.timer.api.bean.yggl.YgglMainEmp; import cn.timer.api.config.annotation.CurrentUser; import cn.timer.api.config.annotation.UserBean; import cn.timer.api.config.exception.CustomException; import cn.timer.api.dao.kqgl.AttGroupBinPunchModeMapper; import cn.timer.api.dao.kqgl.AttendanceMachineMapper; import cn.timer.api.dao.kqgl.AttendanceWeeklySchMapper; import cn.timer.api.dao.kqgl.PunchCardAddressMapper; import cn.timer.api.dao.kqgl.PunchCardWiFiMapper; import cn.timer.api.dao.kqgl.ScheduleMapper; import cn.timer.api.dao.kqmk.KqglAssoBcszMapper; import cn.timer.api.dao.kqmk.KqglAssoDkjlMapper; import cn.timer.api.dao.kqmk.KqglAssoDkmxMapper; import cn.timer.api.dao.kqmk.KqglAssoPbmxMapper; import cn.timer.api.dao.kqmk.KqglAssoRelationSummaryMapper; import cn.timer.api.dao.kqmk.KqglAssoTeshuMapper; import cn.timer.api.dao.kqmk.KqglMainKqzMapper; import cn.timer.api.dto.kqmk.AttClockMethod; import cn.timer.api.dto.kqmk.AttLateLate; import cn.timer.api.dto.kqmk.AttSchedule; import cn.timer.api.dto.kqmk.AttendanceCardListDto; import cn.timer.api.dto.kqmk.ClockCollectData; import cn.timer.api.dto.kqmk.KqglAssoPbmxDto; import cn.timer.api.dto.kqmk.TransactionApprovalDto; import cn.timer.api.dto.kqmk.WorkbenchCalendarDto; import cn.timer.api.utils.DateUtil; import cn.timer.api.utils.Result; import cn.timer.api.utils.ResultUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @Api(tags = "3.0[3]考勤打卡") @RestController @Transactional @RequestMapping(value = "/kqdk", produces = { "application/json", "multipart/form-data" }) public class ClockInController { @Autowired private KqglMainKqzMapper kqglmainkqzmapper; //打卡明细表 @Autowired private KqglAssoDkmxMapper kqglassodkmxmapper; @Autowired private KqglAssoDkjlMapper kqglassodkjlmapper; @Autowired private KqglAssoBcszMapper kqglassobcszmapper; @Autowired private KqglAssoRelationSummaryMapper kqglassorelationsummarymapper; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("EEE"); SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 考勤打卡 * * @param json dev_id : 考勤机id user_id : 打卡用户id verify_mode : 打卡方式(1:指纹、20:人脸) * io_time : 打卡时间 * @return */ @PostMapping(value = "/punchclock") @ApiOperation(value = "1:考勤机打卡", httpMethod = "POST", notes = "接口发布说明") @ApiOperationSupport(order = 1) public Result<Object> punchclock(@RequestParam String json) throws Exception { String current_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String current = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); String yesterday = ClockInTool.requires_extra_times(current,-1,3,1);//前一天 Long startDateyesterday = DateUtil.getStartTime(0,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long endDateyesterday = DateUtil.getnowEndTime(23,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long attendance_date = 0l;//考勤日期 String toweek = ""; String msg = "未知错误,请联系管理员"; int sbyf = 1;//0:失败;1:成功 int status_ = 0; JSONObject jsonArray = new JSONObject(json); String asDevId = jsonArray.get("dev_id").toString();//考勤机编码 String asUserId = jsonArray.get("user_id").toString();//打卡用户id String asVerifyMode = jsonArray.get("verify_mode").toString();//考勤机打卡方式(1:指纹;20:人脸;40:掌纹;60:密码(猜的^v^)) String sStdIoTime = jsonArray.get("io_time").toString();//打卡时间 **判断次日打卡情况** KqglAssoKqj kqjdev = KqglAssoKqj.builder().build().selectOne(new QueryWrapper<KqglAssoKqj>().lambda().eq(KqglAssoKqj::getCode, asDevId)); if (kqjdev == null) return ResultUtil.error("考勤机不存在!"); YgglMainEmp user = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, asUserId).eq(YgglMainEmp::getOrgCode, kqjdev.getQyid())); if(user != null) { int qyid = user.getOrgCode(); int userid = user.getEmpNum(); KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userid,qyid); //考勤组信息 //pbfs;// 排班方式 1:固定排班;2:自由排班;3:自由工时 /*******/ long time_ = DateUtil.getStringTime(sStdIoTime, "yyyy-MM-dd HH:mm:ss");//打卡时间戳 String putime = new SimpleDateFormat("yyyy-MM-dd").format(time_);//转换打卡时间格式 年月日 String putimehhmm = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_);//转换打卡时间格式 年月日 //打卡当天开始时间,打卡当天结束时间 Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(putime,"yyyy-MM-dd")).getTime(); Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(putime,"yyyy-MM-dd")).getTime(); int dkmx = 0; int shifid = 0; long punchcardtime = 0,punchstart = 0,punchend = 0;//应打卡时间,应打卡开始时间,应打卡结束时间 boolean isRange = true;//是否在打卡时间范围内 int atttype = 0; int execution_status = 0;//执行状态 boolean kskd = true;//识别是否更新最后一次打卡 针对于最后一次下班卡 boolean sbdkkd = false;//针对于上班 未超过上班卡打卡 视为无效打卡 ClockCollectData clockt = new ClockCollectData(); //putime: 根据日期 得到打卡所需的详细信息 AttendanceCardListDto attdate = MethodCall(qyid,userid,putime); /*******/ if(attgro != null) {//判断考勤组是否存在 List<KqglAssoKqzdkfs> kqjs = KqglAssoKqzdkfs.builder().build().selectList(new QueryWrapper<KqglAssoKqzdkfs>().lambda().eq(KqglAssoKqzdkfs::getKqzId, attgro.getId())); if(kqjs.size() > 0) { /** * 当考勤组为“固定排班”和“自定义排班”时 方可使用 */ if(attdate.getAttgrouptype() != 3) { //查询打卡当天是否有记录********************************** KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build(); String dakariqi = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(startDateyesterday))+" "+ClockInTool.dateToWeek2(yesterday); //检查昨日的班次是否存在次日打卡 KqglAssoDkjl balan = kqglassodkjlmapper.selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getUserId, userid).eq(KqglAssoDkjl::getQyid, qyid).eq(KqglAssoDkjl::getAttdate, dakariqi).ne(KqglAssoDkjl::getBcid, 0).orderByDesc(KqglAssoDkjl :: getSort).last("LIMIT 1")); boolean dnck = false; boolean crdk = false;//当次打卡是否存在次日打卡 if(balan != null) {//前一天是否打过卡 去班次id查询是否存在次日打卡 //班次信息 KqglAssoBcsz shif = kqglassobcszmapper.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, balan.getBcid())); int dkcs = shif.getSxbcs()*2; List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间 if(ashss.size() > 0) { Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(ashss.get(0).getTime())));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd1.after(sd2)) { dnck = true; } } int isXbdk1Cr = shif.getIsXbdk1Cr();//下班1是否次日(0:否;1:是) int isSbdk2Cr = shif.getIsSbdk2Cr();//上班2是否次日(0:否;1:是) int isXbdk2Cr = shif.getIsXbdk2Cr();//下班2是否次日(0:否;1:是) int isSbdk3Cr = shif.getIsSbdk3Cr();//上班3是否次日(0:否;1:是) int isXbdk3Cr = shif.getIsXbdk3Cr();//下班3是否次日(0:否;1:是) if(balan.getSort() < dkcs) { if((isXbdk1Cr + isSbdk2Cr +isXbdk2Cr + isSbdk3Cr + isXbdk3Cr) > 0) { crdk = true; } // if(balan.getSort()+1 == 2 && dkcs == 2) { // //次日 // if(isXbdk1Cr > 0) { crdk = true; } // } // if(balan.getSort()+1 == 3 && dkcs == 4) { // if(isSbdk2Cr > 0) {crdk = true; } // } // if(balan.getSort()+1 == 4 && dkcs == 4) { // if(isXbdk2Cr > 0) { crdk = true; } // } // if(balan.getSort()+1 == 5 && dkcs == 6) { // if(isSbdk3Cr > 0) { crdk = true; } // } // if(balan.getSort()+1 == 6 && dkcs == 6) { // if(isXbdk3Cr > 0) { crdk = true; } // } } }else { List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间 //无记录的话就找昨天的数据 AttendanceCardListDto attdate1 = MethodCall(qyid,userid,yesterday); List<AttSchedule> ashssyebo = attdate1.getAttsch();//获取昨天应打卡时间 if(ashssyebo.size() > 0) { Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(ashssyebo.get(0).getTime())));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd2.after(sd1)) {//大于 dnck = true; } } // crdk = true; // attdate = MethodCall(qyid,userid,yesterday); if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && ashss.get(0).getId() != 0) {//班次不为空 KqglAssoBcsz shifi = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ashss.get(0).getId())); int isXbdk1Cr = shifi.getIsXbdk1Cr();//下班1是否次日(0:否;1:是) int isSbdk2Cr = shifi.getIsSbdk2Cr();//上班2是否次日(0:否;1:是) int isXbdk2Cr = shifi.getIsXbdk2Cr();//下班2是否次日(0:否;1:是) int isSbdk3Cr = shifi.getIsSbdk3Cr();//上班3是否次日(0:否;1:是) int isXbdk3Cr = shifi.getIsXbdk3Cr();//下班3是否次日(0:否;1:是) if((isXbdk1Cr + isSbdk2Cr +isXbdk2Cr + isSbdk3Cr + isXbdk3Cr) > 0) { crdk = true; attdate = MethodCall(qyid,userid,yesterday); }else { crdk = false; } } } if(crdk && dnck) { dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday).eq(KqglAssoDkmx::getData, yesterday)); attdate = MethodCall(qyid,userid,yesterday); attendance_date = startDateyesterday; toweek = yesterday; }else { dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate).eq(KqglAssoDkmx::getData, putime)); attendance_date = startDate; toweek = putime; } if(EmptyUtil.isEmpty(attdate.getAttsch())) { msg = "当前未排班"; sbyf = 0; status_ = 2; }else { //排查请假是否在最后一次打卡范围内 查询当月的请假所有日期 KqglAssoRelationSummary leainv = kqglassorelationsummarymapper.leaveinvesti(userid, 2, putime,qyid); boolean adopt = false; if(leainv != null) { adopt = ClockInTool.hourMinuteBetween(putimehhmm, leainv.getStartTime().substring(0, 16), leainv.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm"); } if(adopt) { msg = "已请假"; sbyf = 0; status_ = 2; }else { long starttime1 = 0,starttime1ks = 0,starttime1js = 0,endtime1 = 0,endtime1ks = 0,endtime1js = 0,starttime2 = 0,starttime2ks = 0,starttime2js = 0,endtime2 = 0,endtime2ks = 0,endtime2js = 0,starttime3 = 0,starttime3ks = 0,starttime3js = 0, endtime3 = 0,endtime3ks = 0,endtime3js = 0; List<AttSchedule> ash = null; if(attdate.getAttsch().size() > 0) { ash = attdate.getAttsch(); int y = 0; clockt.setShifid(ash.get(y).getId()); shifid = ash.get(y).getId();//班次id if(attdate.getAttsch().size() == 2 || attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { starttime1 = ash.get(0).getTime();starttime1ks = ash.get(0).getStarttime();starttime1js = ash.get(0).getEndtime(); endtime1 = ash.get(1).getTime();endtime1ks = ash.get(1).getStarttime();endtime1js = ash.get(1).getEndtime(); } if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { starttime2 = ash.get(2).getTime();starttime2ks = ash.get(2).getStarttime();starttime2js = ash.get(2).getEndtime(); endtime2 = ash.get(3).getTime();endtime2ks = ash.get(3).getStarttime();endtime2js = ash.get(3).getEndtime(); } if(attdate.getAttsch().size() == 6) { starttime3 = ash.get(4).getTime();starttime3ks = ash.get(4).getStarttime();starttime3js = ash.get(4).getEndtime(); endtime3 = ash.get(5).getTime();endtime3ks = ash.get(5).getStarttime();endtime3js = ash.get(5).getEndtime(); } if(dkmc == null) { kskd = false; if(attdate.getAttsch().size() == 2) {//一套上下班 上班1 Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(starttime1)));//应打卡时间 Date sd2=df1.parse(sStdIoTime);//打卡时间 Date sd3=df1.parse(ClockInTool.stampToDate(String.valueOf(endtime1)));//应打卡时间 if(sd2.before(sd3)) { atttype = 1; } if(sd2.after(sd1) && sd2.after(sd3)) { atttype = 2; } }else { boolean getinto = true; //打卡时间 对比班次 接近哪个时间就打哪个时间的卡 if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { //punchstart 应打卡开始时间 punchend:应打卡结束时间 time_:打卡时间 boolean effectiveDate1 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate1) {//在范围内就打卡 atttype = 1; getinto = false; }else { if(getinto) { isRange = false; } } boolean effectiveDate2 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate2) {//在范围内就打卡 atttype = 2; isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } boolean effectiveDate3 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate3) {//在范围内就打卡 atttype = 3; isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } boolean effectiveDate4 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate4) {//在范围内就打卡 atttype = 4; isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } } if(attdate.getAttsch().size() == 6) { boolean effectiveDate5 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate5) {//在范围内就打卡 atttype = 5; isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } boolean effectiveDate6 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate6) {//在范围内就打卡 atttype = 6; isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } } } execution_status = 1; }else { boolean getinto2 = true; execution_status = 2; if(attdate.getAttsch().size() == 2) { //下班1 if(dkmc.getSbdk1() != null && dkmc.getXbdk1() == null){ //如果第二次后打卡,未超过上班时间 即为打卡失效 Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(starttime1)));//应打卡时间 Date sd2=df1.parse(sStdIoTime);//打卡时间 if(sd1.after(sd2)) { sbdkkd = true;//打卡无效 // atttype = 1; }else { kskd = false; atttype = 2; } }else { //最后一次卡的时候 再继续打视为更新最后一次打卡 kskd = true; atttype = 2; } } if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { boolean effectiveDate1 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate1) {//在范围内就打卡 if(dkmc.getSbdk1() != null) { sbdkkd = true;//打卡无效 // atttype = 1; }else { atttype = 1; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } boolean effectiveDate2 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate2) {//在范围内就打卡 if(dkmc.getXbdk1() != null) { kskd = true; atttype = 2; }else { kskd = false; atttype = 2; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } boolean effectiveDate3 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate3) {//在范围内就打卡 if(dkmc.getSbdk2() != null) { sbdkkd = true;// // atttype = 3; }else { atttype = 3; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } boolean effectiveDate4 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate4) {//在范围内就打卡 if(dkmc.getXbdk2() != null) { kskd = true;//更新最后一次打卡 atttype = 4; }else { kskd = false; atttype = 4; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } } if(attdate.getAttsch().size() == 6) { boolean effectiveDate5 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate5) {//在范围内就打卡 if(dkmc.getSbdk2() != null) { sbdkkd = true;// // atttype = 5; }else { atttype = 5; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } boolean effectiveDate6 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate6) {//在范围内就打卡 if(dkmc.getXbdk2() != null) { kskd = true;////更新最后一次打卡 atttype = 6; }else { kskd = false; atttype = 6; getinto2 = false; isRange = true;//在范围 } }else { if(getinto2) { isRange = false; } } } } } if(atttype == 1) { punchcardtime = starttime1; punchstart = starttime1ks; punchend = starttime1js; }else if(atttype == 2) { punchcardtime = endtime1; punchstart = endtime1ks; punchend = endtime1js; }else if(atttype == 3) { punchcardtime = starttime2; punchstart = starttime2ks; punchend = starttime2js; }else if(atttype == 4) { punchcardtime = endtime2; punchstart = endtime2ks; punchend = endtime2js; }else if(atttype == 5) { punchcardtime = starttime3; punchstart = starttime3ks; punchend = starttime3js; }else if(atttype == 6) { punchcardtime = endtime3; punchstart = endtime3ks; punchend = endtime3js; } if(clockt.getShifid() != 0) { boolean dddbdk = true;// boolean dak2 = true; //打卡无限制时 当前时间必须大于上班打卡时间 才能打下班卡 if(punchstart==0 && punchend==0 && (atttype == 2 || atttype == 4 || atttype == 6)) { String xbdk = ""; if(atttype == 2) { xbdk = String.valueOf(ash.get(0).getTime()); }else if(atttype == 4){ xbdk = String.valueOf(ash.get(2).getTime()); }else { xbdk = String.valueOf(ash.get(4).getTime()); } Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(xbdk)));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd2.before(sd1)) {//小于 dak2 = false; } } if(!dak2) { dddbdk = false; } if(dddbdk) { KqglAssoBcsz shif = KqglAssoBcsz.builder().build(); if(attdate.getAttsch().size() > 0 && clockt.getShifid() > 0){//有无班次 shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, clockt.getShifid())); } //打卡记录录入 -- 打卡是否有时间范围限制 if(attdate.getAttsch().size() == 2) { if(punchstart>0 && punchend>0) { String staputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(punchstart);//应打卡开始时间 String entputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(punchend);//应打卡结束时间 String DKputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_);//打卡时间 boolean effectiveDate = ClockInTool.hourMinuteBetween(DKputime, staputime, entputime,"yyyy-MM-dd HH:mm"); if (!effectiveDate) { System.out.println("当前打卡时间不在范围内"); // 手动抛出异常 isRange = false; // throw new Exception(); } } } if(isRange) { int yxcd = shif.getYxcdfzs();//允许迟到 int yzcd = shif.getYzcdfzs();//严重迟到分钟数 int kgcdfzs = shif.getKgcdfzs();//旷工迟到分钟数 int dkcs_ = shif.getSxbcs();//上下班打卡次数 int iswzwd = shif.getIsWzwd();//是否开启晚走晚到(0:否;1:是) long rest_time = 0; if(shif.getStartTime() != null && shif.getEndTime() != null) { long kaishixiuxi = Long.valueOf(ClockInTool.dateToStamp(putime + " " +shif.getStartTime()+":00")); long jieshuxiuxi = Long.valueOf(ClockInTool.dateToStamp(putime + " " +shif.getEndTime()+":00")); rest_time = (jieshuxiuxi - kaishixiuxi)/1000/60;//休息时间 } double xbwz1 = 0,xbwz2=0,xbwz3=0; int sbwd1=0,sbwd2=0,sbwd3=0; int arrive_late = 0;//晚到时间 String clock_date = "";//应打卡时间 Long latetime = 0l;//前天晚走时长(分钟) KqglAssoDkmx yesterdaymx = KqglAssoDkmx.builder().build(); AttendanceCardListDto attdateyesterday; long yesendtime1=0,yesendtime2=0,yesendtime3=0; //存在晚走玩到 if(iswzwd > 0) { //统一分钟数 xbwz1 = Double.valueOf(shif.getXbwz1()) * 60;//下班晚走1 String sbwd1_ = String.valueOf(Double.valueOf(shif.getSbwd1()) * 60); sbwd1 = Integer.valueOf(sbwd1_.substring(0, sbwd1_.lastIndexOf(".")));//上班晚到1 xbwz2 = Double.valueOf(shif.getXbwz2()) * 60;//下班晚走2 String sbwd2_ = String.valueOf(Double.valueOf(shif.getSbwd2()) * 60); sbwd2 = Integer.valueOf(sbwd2_.substring(0, sbwd2_.lastIndexOf(".")));//上班晚到2 xbwz3 = Double.valueOf(shif.getXbwz3()) * 60;//下班晚走3 String sbwd3_ = String.valueOf(Double.valueOf(shif.getSbwd3()) * 60); sbwd3 = Integer.valueOf(sbwd3_.substring(0, sbwd3_.lastIndexOf(".")));//上班晚到3 //获取前一天最后下班的时间 yesterdaymx = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday)); attdateyesterday = MethodCall(qyid,userid,yesterday); List<AttSchedule> ash1 = attdateyesterday.getAttsch(); if(attdateyesterday.getAttsch().size() == 2 || attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime1 = ash1.get(1).getTime(); } if(attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime2 = ash1.get(3).getTime(); } if(attdateyesterday.getAttsch().size() == 6) { yesendtime3 = ash1.get(5).getTime(); } } if(execution_status == 1) {//上班1 ****新增 KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).qyid(qyid).dksj(startDate).build(); int sbdkjg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst1 = 0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if((atttype)%2 > 0){//上班 if(time > 0){ sbdkjg = Integer.valueOf(time.toString()); }// 打卡结果 }else{//下班 if(time > 0){}else{ sbdkjg = Math.abs(Integer.valueOf(time.toString())); }// 打卡结果 } //存在晚走玩到 if(iswzwd > 0 && yesterdaymx != null) { if(dkcs_ == 1) { if(yesterdaymx.getXbdk1() != null && yesterdaymx.getXbdk1jg() == 0) { latetime = (yesterdaymx.getXbdk1() - yesendtime1)/1000/60; } }else if(dkcs_ == 2){ if(yesterdaymx.getXbdk2() != null && yesterdaymx.getXbdk2jg() == 0) { latetime = (yesterdaymx.getXbdk2() - yesendtime2)/1000/60; } }else { if(yesterdaymx.getXbdk3() != null && yesterdaymx.getXbdk3jg() == 0) { latetime = (yesterdaymx.getXbdk3() - yesendtime3)/1000/60; } } if(latetime != 0) { double latetime_ = Double.valueOf(String.valueOf(latetime));//前天晚走时长(分钟) if(latetime_ > xbwz1 && latetime_ < xbwz2) { arrive_late = sbwd1; }else if(latetime_ > xbwz2 && latetime_ < xbwz3) { arrive_late = sbwd2; }else if(latetime_ > xbwz3) { arrive_late = sbwd3; } clock_date = ClockInTool.stampToDate(String.valueOf(punchcardtime)); Long changed_time = Long.valueOf(ClockInTool.dateToStamp(ClockInTool.addtime(clock_date, "+"+arrive_late)));//晚到后应打卡时间 punchcardtime = changed_time;//更换当天打卡时间 Long timeyes = (time_ - changed_time)/1000/60;// if((atttype)%2 > 0){//上班 if(timeyes > 0){ sbdkjg = Integer.valueOf(timeyes.toString()); }else { sbdkjg = 0; } }else{//下班 if(timeyes > 0){ sbdkjg = 0; }else{ sbdkjg = Math.abs(Integer.valueOf(timeyes.toString())); } } } } } //允许迟到范围 if(sbdkjg <= yxcd) { sbdkjg = 0; } if(atttype == 1) { pcd.setSbdk1(time_); pcd.setSbdk1jg(sbdkjg); }else if(atttype == 2) { pcd.setXbdk1(time_); pcd.setXbdk1jg(sbdkjg); }else if(atttype == 3) { pcd.setSbdk2(time_); pcd.setSbdk2jg(sbdkjg); }else if(atttype == 4) { pcd.setXbdk2(time_); pcd.setXbdk2jg(sbdkjg); }else if(atttype == 5) { pcd.setSbdk3(time_); pcd.setSbdk3jg(sbdkjg); }else if(atttype == 6) { pcd.setXbdk3(time_); pcd.setXbdk3jg(sbdkjg); } int ydkcs = 0; if(shif != null){ ydkcs = shif.getSxbcs()*2; }//应打卡次数 pcd.setYdkcs(ydkcs); //严重迟到范围 if(sbdkjg>yzcd && sbdkjg < kgcdfzs && yzcd>0) { yzcdcs++; yzcdsc = sbdkjg; dkst1 = 1; } //旷工迟到 if(sbdkjg>kgcdfzs && kgcdfzs>0) { kgcdcs++; dkst1 = 2; } pcd.setDkst1(dkst1);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setYzcdcs(yzcdcs);//严重迟到次数 pcd.setYzcdsc(Double.valueOf(yzcdsc));//严重迟到时长(分钟) pcd.setKgcdfzs(kgcdcs);//旷工迟到次数 if (!pcd.insert()) { throw new CustomException("打卡明细-新增异常-1"); } dkmx = pcd.getId(); }else if(execution_status == 2){ //*****修改 dkmx = dkmc.getId(); KqglAssoDkmx pcd = KqglAssoDkmx.builder().build(); if(atttype == 2){//下班1 pcd.setId(dkmc.getId()); pcd.setXbdk1(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk1jg(0);// 打卡结果 }else{ pcd.setXbdk1jg(Math.abs(Integer.valueOf(time.toString()))); } } if(dkmc.getSbdk1() != null){ Long time = (time_ - dkmc.getSbdk1())/1000/60 - rest_time; pcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长 } kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 3){//上班2 int sbdk2jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst2=0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){sbdk2jg = Math.abs(Integer.valueOf(time.toString()));} } //允许迟到范围 if(sbdk2jg <= yxcd) { sbdk2jg = 0; } //严重迟到范围 if(sbdk2jg>yzcd && sbdk2jg < kgcdfzs && yzcd>0) { yzcdcs = dkmc.getYzcdcs()+1; yzcdsc = sbdk2jg; dkst2 = 1; } //旷工迟到 if(sbdk2jg>kgcdfzs && kgcdfzs>0) { kgcdcs++; kgcdcs = kgcdcs + dkmc.getKgcdfzs(); dkst2 = 2; } pcd.setDkst2(dkst2);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setId(dkmc.getId()); pcd.setSbdk2(time_);//上班1打卡时间 pcd.setSbdk2jg(sbdk2jg); pcd.setYzcdcs(yzcdcs); pcd.setYzcdsc(Double.valueOf(yzcdsc)); pcd.setKgcdfzs(kgcdcs); kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 4){//下班2 pcd.setId(dkmc.getId()); pcd.setXbdk2(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk2jg(0);// 打卡结果 }else{ pcd.setXbdk2jg(Math.abs(Integer.valueOf(time.toString()))); } } //班次为4次时,计算工作时长 if(dkmc.getSbdk2() != null){ Long time = (time_ - dkmc.getSbdk2())/1000/60; BigDecimal om = new BigDecimal(dkmc.getGzsc()); BigDecimal on = new BigDecimal(time); BigDecimal worktime_ = new BigDecimal(Math.abs(om.add(on).doubleValue())); BigDecimal xx = new BigDecimal(rest_time); double worktime = Math.abs(worktime_.subtract(xx).doubleValue()); pcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 5){//上班3 int sbdk3jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst3=0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){sbdk3jg = Math.abs(Integer.valueOf(time.toString()));} } //允许迟到范围 if(sbdk3jg <= yxcd) { sbdk3jg = 0; } //严重迟到范围 if(sbdk3jg>yzcd && sbdk3jg < kgcdfzs && yzcd>0) { yzcdcs = dkmc.getYzcdcs()+1; yzcdsc = sbdk3jg; dkst3 = 1; } //旷工迟到 if(sbdk3jg>kgcdfzs && kgcdfzs>0) { kgcdcs++; kgcdcs = kgcdcs + dkmc.getKgcdfzs(); dkst3 = 2; } pcd.setDkst3(dkst3);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setId(dkmc.getId()); pcd.setSbdk3(time_);//上班1打卡时间 pcd.setSbdk3jg(sbdk3jg); pcd.setYzcdcs(yzcdcs); pcd.setYzcdsc(Double.valueOf(yzcdsc)); pcd.setKgcdfzs(kgcdcs); kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 6){//下班3 pcd.setId(dkmc.getId()); pcd.setXbdk3(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk3jg(0);// 打卡结果 }else{ pcd.setXbdk3jg(Math.abs(Integer.valueOf(time.toString()))); } } //班次为6次时,计算工作时长 if(dkmc.getSbdk3() != null){ Long time = (time_ - dkmc.getSbdk3())/1000/60; BigDecimal om = new BigDecimal(dkmc.getGzsc());//第二次 BigDecimal on = new BigDecimal(time); BigDecimal worktime_ = new BigDecimal(Math.abs(om.add(on).doubleValue())); BigDecimal xx = new BigDecimal(rest_time); double worktime = Math.abs(worktime_.subtract(xx).doubleValue()); pcd.setGzsc(worktime); } } pcd.setId(dkmc.getId()); if(atttype <= 6 && atttype > 0 && !sbdkkd){ kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 } } }else { msg = "当前打卡时间不在范围内"; sbyf = 0; status_ = 2; } }else { msg = "当前时间必须大于上班打卡时间 才能打下班卡"; sbyf = 0; status_ = 2; } }else { msg = "当前是休息时间"; sbyf = 0; status_ = 2; } } } }else { //自由工时打卡 Long stapclotime = attdate.getStapclotime();// 今天考勤 自由排班开始时间 int canpunchworkdate = Integer.valueOf(String.valueOf(attdate.getCanpunchworkdate()).replaceAll("(\\d+)(?:(\\.\\d*[^0])|\\.)0*", "$1$2"));// 上班打卡后多久大下班卡 KqglAssoDkmx zydkmc = KqglAssoDkmx.builder().build(); Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(stapclotime)));//应打卡时间 2020-06-10 18:30:00 Date sd2=df1.parse(current_time);//当前时间 2020-06-10 16:06:58 if(sd1.after(sd2)) {//为true时 打的是昨天的卡 zydkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday)); attendance_date = startDateyesterday; toweek = yesterday; }else { zydkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate)); attendance_date = startDate; toweek = putime; } if(zydkmc == null) {//新增 KqglAssoDkmx pcd = KqglAssoDkmx.builder().build(); if(sd1.after(sd2)) { pcd = KqglAssoDkmx.builder().userid(userid).data(yesterday).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDateyesterday).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); }else { pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDate).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); } // KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDate).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); if (!pcd.insert()) { throw new CustomException("打卡明细-新增异常-1"); } dkmx = pcd.getId(); atttype = 1; }else {//修改 boolean zydk = true; dkmx = zydkmc.getId(); KqglAssoDkmx zypcd = KqglAssoDkmx.builder().build(); if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() == null)){//下班1 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk1())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk1(time_);//下班1打卡时间 if(zydkmc.getSbdk1() != null){ Long time = (time_ - zydkmc.getSbdk1())/1000/60; zypcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长 } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 2; } }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() == null)){//上班2 zypcd.setId(zydkmc.getId()); zypcd.setSbdk2(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 3; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() == null)){//下班2 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk2())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk2(time_);//下班1打卡时间 //班次为4次时,计算工作时长 if(zydkmc.getSbdk2() != null){ Long time = (time_ - zydkmc.getSbdk2())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc()); BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 4; } }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() == null)){//上班3 zypcd.setId(zydkmc.getId()); zypcd.setSbdk3(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 5; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (!("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() != null) && (("").equals(zydkmc.getXbdk3()) || zydkmc.getXbdk3() == null)){//下班3 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk3())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk3(time_);//下班1打卡时间 //班次为6次时,计算工作时长 if(zydkmc.getSbdk3() != null){ Long time = (time_ - zydkmc.getSbdk3())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc());//第二次 BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 6; } }else { atttype = 7; } } } }else { msg = "未检测到考勤机"; sbyf = 0; status_ = 2; } /*****************************************************************************************************************************************************************************************************/ /*******************************************************************原始打卡记录数据录入**************************************************************************************************************/ /*****************************************************************************************************************************************************************************************************/ String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(attendance_date));//转换打卡时间格式 //true:确认为最后一次打卡更新打卡时 之前打卡的一条数据变为“打卡更新数据” if(kskd && (atttype == 2 || atttype == 4 || atttype == 6) && attdate.getAttgrouptype() != 3) { KqglAssoDkjl dkjj = KqglAssoDkjl.builder().build().selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getUserId, userid).eq(KqglAssoDkjl::getType, 2) .eq(KqglAssoDkjl::getSort, atttype).eq(KqglAssoDkjl::getQyid, qyid).eq(KqglAssoDkjl::getAttdate, attdate_+" "+ClockInTool.dateToWeek2(toweek))); KqglAssoDkjl.builder().id(dkjj.getId()).status(0).sort(0).build().updateById(); msg = "打卡已更新数据"; sbyf = 0; // status_ = 2; } int results = 0; Long time = (time_ - punchcardtime)/1000/60; if(punchcardtime != 0){ if(isRange) { if((atttype)%2 > 0){//上班 if(time > 0){ results = Integer.valueOf(time.toString()); }// 打卡结果 }else{//下班 if(time > 0){}else{ results = Math.abs(Integer.valueOf(time.toString())); }// 打卡结果 } } } int type = 0,status = 0; if(atttype > 0) { if((atttype)%2 > 0){ type = 1;// 类型(类型 0:无排班打卡 1:上班 2:下班) punchcardtime == 0:无班次打卡 if(attdate.getAttgrouptype() != 3) { if(EmptyUtil.isNotEmpty(attdate.getAttsch())) { if(punchcardtime == 0 && clockt.getShifid() != 0){ status = 1; }if(punchcardtime == 0 && clockt.getShifid() == 0) { status = 2; }else{ if(isRange) {// 状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休) if(time > 0){ status = 3; }else if(results == 0){ status = 1; } }else { status = 2; } } }else if(EmptyUtil.isEmpty(attdate.getAttsch())) { status = 2; } }else { if(sbyf == 1) { status = 1; }else { status = 2; } } }else{ type = 2;// 类型(类型 0:无排班打卡 1:上班 2:下班) if(attdate.getAttgrouptype() != 3) { if(EmptyUtil.isNotEmpty(attdate.getAttsch())) { if(punchcardtime == 0 && clockt.getShifid() != 0){ status = 1; }if(punchcardtime == 0 && clockt.getShifid() == 0) { status = 2; }else{ if(isRange) { if(time < 0){ status = 4; }else if(results == 0){ status = 1; } }else { status = 2; } } }else if(EmptyUtil.isEmpty(attdate.getAttsch())) { status = 2; } }else { if(sbyf == 1) { status = 1; }else { status = 2; } } } } //第二次未超过应上班打卡时间 打卡为无效 if(sbdkkd) { sbyf = 0; status = 2; atttype = 0; msg = "已有最优的打卡记录存在"; } long attime; if(punchcardtime == 0){// 考勤时间(应打卡时间) attime = new Date().getTime(); }else{ attime = punchcardtime; } String remarks = ""; if(("1").equals(asVerifyMode)) { remarks = "考勤机指纹打卡"; }else if(("20").equals(asVerifyMode)) { remarks = "考勤机人脸打卡"; }else if(("40").equals(asVerifyMode)) { remarks = "考勤机掌纹打卡"; }else if(("60").equals(asVerifyMode)) { remarks = "考勤机密码打卡"; } String commentary = "未知"; if(sbyf == 1) { commentary = "打卡成功"; }else { commentary = msg; if(status_ == 2) { status = status_; } } //cardtype--1:GPS,2:WIFI,3:考勤机 KqglAssoDkjl pre = KqglAssoDkjl.builder().dktime(time_).results(results).userId(userid).type(type).status(status).sort(atttype) .cardType(3).qyid(qyid).attdate(attdate_+" "+ClockInTool.dateToWeek2(toweek)).attime(attime).dkmxid(dkmx).bcid(shifid).remarks(remarks).punchmode(Integer.valueOf(asVerifyMode)) .punchequipment(asDevId).commentary(commentary).build(); if (!pre.insert()) { throw new CustomException("打卡记录-新增异常-2"); } }else { msg="打卡失败!,未加入考勤组!"; sbyf = 0; } }else { return ResultUtil.error("打卡失败!,用户不存在!"); } if(sbyf == 1) { return ResultUtil.data(null, "打卡成功"); }else { return ResultUtil.data(msg, "打卡失败"); } } @Autowired private KqglAssoPbmxMapper kqglassopbmxmapper; /** * @param qyid * @param userid * @param date * @return * 获取当天打卡班次数据 */ public AttendanceCardListDto MethodCall(int qyid,int userid,String date) throws ParseException { AttendanceCardListDto attcar = new AttendanceCardListDto(); String str = null; if(!("").equals(date)){ str = date; }else{ Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); str = sdf.format(d); } KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userid,qyid); //考勤组信息 //pbfs:排班方式 1:固定排班;2:自由排班;3:自由工时 if(attgro != null){//判断当前用户是否加入到考勤组 //排班制 KqglAssoPbmxDto jrpb = kqglassopbmxmapper.getScheduleSpecificAttendance(attgro.getId(),userid,str); //固定排班 int week = Integer.valueOf(ClockInTool.dateToWeek(str));//4 KqglAssoZhoupaiban atwek = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId()) .eq(KqglAssoZhoupaiban::getType, week).ne(KqglAssoZhoupaiban::getBcid, 0)); if(attgro.getPbfs() == 1){//固定排班 if(atwek != null){//有固定周排班 KqglAssoTeshu rest = KqglAssoTeshu.builder().build().selectOne(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, attgro.getId()) .eq(KqglAssoTeshu::getTsrq, str).eq(KqglAssoTeshu::getBcid, 0)); if(rest != null){//今天休息 Sort返回0【特殊日期--休息】 List<AttSchedule> atts = new ArrayList<AttSchedule>(); AttSchedule as = AttSchedule.builder().id(0).sort(0).time(0l).starttime(0l).endtime(0l).build(); atts.add(as); attcar.setAttsch(atts); }else{//今天上班 KqglAssoBcsz bcz = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, atwek.getBcid())); if(bcz != null){ Getshiftinformationbatch(bcz,attcar,str); } } }else{//必须打卡 KqglAssoTeshu tsri = KqglAssoTeshu.builder().build().selectOne(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, attgro.getId()) .eq(KqglAssoTeshu::getTsrq, str).ne(KqglAssoTeshu::getBcid, 0)); if(tsri != null){ KqglAssoBcsz tsrq = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, tsri.getBcid())); if(tsrq!=null){ Getshiftinformationbatch(tsrq,attcar,str); } }else{//休息 List<AttSchedule> atts = new ArrayList<AttSchedule>(); AttSchedule as = AttSchedule.builder().id(0).sort(0).time(0l).starttime(0l).endtime(0l).build(); atts.add(as); attcar.setAttsch(atts); } } }else if(attgro.getPbfs() == 2){//自由排班 //未排班时,员工可选择班次打卡 // if(attgro.getIsXzbcdk() == 1){ // attcar.setOptscheduling(true); // }else{ // attcar.setOptscheduling(false); // } if(jrpb != null){ if(jrpb.getBcid() != 0){//有班次时("Bcid"不为0时) KqglAssoBcsz tsrq = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, jrpb.getBcid())); /**已简化**/ Getshiftinformationbatch(tsrq,attcar,str); }else{//当天排班为休息 List<AttSchedule> atts1 = new ArrayList<AttSchedule>(); AttSchedule as = AttSchedule.builder().id(0).sort(0).time(0l).starttime(0l).endtime(0l).build(); atts1.add(as); attcar.setAttsch(atts1); } } }else{//自由工时 KqglAssoZhoupaiban wekz = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId()) .eq(KqglAssoZhoupaiban::getBcid, 0).eq(KqglAssoZhoupaiban::getType, week)); if(wekz != null){// String dada = str+" "+attgro.getKqkssjTime()+":00"; attcar.setStapclotime(Long.valueOf(ClockInTool.dateToStamp(dada))); } if(!("").equals(attgro.getJbzdsc())){ attcar.setCanpunchworkdate(Double.valueOf(attgro.getJbzdsc()));//上班打卡后多久大下班卡 } } if(jrpb != null || atwek != null){ KqglAssoBcsz shif = KqglAssoBcsz.builder().build(); if(attgro.getPbfs() == 1){ shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, atwek.getBcid())); }else if(attgro.getPbfs() == 2){ shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, jrpb.getBcid())); } if(shif != null){ if(shif.getIsXbdk() == 1){ attcar.setNoclockout(true);// 下班不用打卡 }else{ attcar.setNoclockout(false);// 下班不用打卡 } attcar.setAllowlate(shif.getYxcdfzs());// 允许迟到分钟数 attcar.setSeriouslate(shif.getYzcdfzs());// 严重迟到分钟数 attcar.setAbsenteeismlate(shif.getKgcdfzs());// 旷工迟到分钟数 if(shif.getIsWzwd() == 1){ attcar.setIslatelate(true);// 晚走晚到 List<AttLateLate> atwzwd = new ArrayList<AttLateLate>(); int p = 0; if(!("").equals(shif.getXbwz1()) && !("").equals(shif.getSbwd1())){p = 2;} if(!("").equals(shif.getXbwz1()) && !("").equals(shif.getSbwd1()) && !("").equals(shif.getXbwz2()) && !("").equals(shif.getSbwd2())){p = 4;} if(!("").equals(shif.getXbwz1()) && !("").equals(shif.getSbwd1()) && !("").equals(shif.getXbwz2()) && !("").equals(shif.getSbwd2()) && !("").equals(shif.getXbwz3()) && !("").equals(shif.getSbwd3())){p = 6;} AttLateLate ala = AttLateLate.builder().build(); ala.setLatewalk(shif.getXbwz1()); ala.setArrivelate(shif.getSbwd1()); atwzwd.add(ala); if(p == 4 || p == 6){ AttLateLate alat = AttLateLate.builder().build(); alat.setLatewalk(shif.getXbwz2()); alat.setArrivelate(shif.getSbwd2()); atwzwd.add(alat); } if(p == 6){ AttLateLate alas = AttLateLate.builder().build(); alas.setLatewalk(shif.getXbwz3()); alas.setArrivelate(shif.getSbwd3()); atwzwd.add(alas); } attcar.setAttlat(atwzwd); }else{ attcar.setIslatelate(false);// 晚走晚到 } } } attcar.setAttgrouptype(attgro.getPbfs());//1:固定排班;2:自由排班;3:自由工时 }else{ attcar.setAttgrouptype(0);//1:固定排班;2:自由排班;3:自由工时 } return attcar; } /** * @param shiftm * @param attcar * @param str */ public void Getshiftinformationbatch(KqglAssoBcsz shiftm,AttendanceCardListDto attcar,String str){ int isXbdk1Cr = shiftm.getIsXbdk1Cr();//下班1是否次日(0:否;1:是) int isSbdk2Cr = shiftm.getIsSbdk2Cr();//上班2是否次日(0:否;1:是) int isXbdk2Cr = shiftm.getIsXbdk2Cr();//下班2是否次日(0:否;1:是) int isSbdk3Cr = shiftm.getIsSbdk3Cr();//上班3是否次日(0:否;1:是) int isXbdk3Cr = shiftm.getIsXbdk3Cr();//下班3是否次日(0:否;1:是) //次日专用 String next_day = ClockInTool.requires_extra_times(str,1,2,1); List<AttSchedule> atts = new ArrayList<AttSchedule>(); if(shiftm.getSxbcs() == 1 || shiftm.getSxbcs() == 2 || shiftm.getSxbcs() == 3){//1次上下班 for(int o=0;o<2;o++){ if(o==0){ AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(1).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbdk1()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getSbqjks1()) || shiftm.getSbqjks1() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjks1()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getSbqjjs1()) || shiftm.getSbqjjs1() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjjs1()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); }else{ //次日 if(isXbdk1Cr > 0) { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(2).time(Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbdk1()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks1()) || shiftm.getXbqjks1() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjks1()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs1()) || shiftm.getXbqjjs1() ==null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjjs1()+":00").replaceAll("\r|\n", "")))) .nextday(1).build(); atts.add(as); }else { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(2).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbdk1()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks1()) || shiftm.getXbqjks1() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjks1()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs1()) || shiftm.getXbqjjs1() ==null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjjs1()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); } } } attcar.setAttsch(atts); } if(shiftm.getSxbcs() == 2 || shiftm.getSxbcs() == 3){//2次上下班 for(int o=0;o<2;o++){ if(o==0){ if(isSbdk2Cr > 0) {//次日 AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(3).time(Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbdk2()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getSbqjks2())|| shiftm.getSbqjks2()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbqjks2()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getSbqjjs2()) || shiftm.getSbqjjs2()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbqjjs2()+":00").replaceAll("\r|\n", "")))) .nextday(1).build(); atts.add(as); }else { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(3).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbdk2()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getSbqjks2())|| shiftm.getSbqjks2()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjks2()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getSbqjjs2()) || shiftm.getSbqjjs2()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjjs2()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); } }else{ if(isXbdk2Cr > 0) {//次日 AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(4).time(Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbdk2()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks2()) || shiftm.getXbqjks2()== null? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjks2()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs2()) || shiftm.getXbqjjs2()== null? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjjs2()+":00").replaceAll("\r|\n", "")))) .nextday(1).build(); atts.add(as); }else { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(4).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbdk2()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks2()) || shiftm.getXbqjks2()== null? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjks2()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs2()) || shiftm.getXbqjjs2()== null? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjjs2()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); } } } attcar.setAttsch(atts); } if(shiftm.getSxbcs() == 3){//3次上下班 for(int o=0;o<2;o++){ if(o==0){ if(isSbdk3Cr > 0) {//次日 AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(5).time(Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbdk3()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getSbqjks3()) || shiftm.getSbqjks3() == null? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbqjks3()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getSbqjjs3()) || shiftm.getSbqjjs3() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getSbqjjs3()+":00").replaceAll("\r|\n", "")))) .nextday(1).build(); atts.add(as); }else { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(5).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbdk3()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getSbqjks3()) || shiftm.getSbqjks3() == null? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjks3()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getSbqjjs3()) || shiftm.getSbqjjs3() == null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getSbqjjs3()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); } }else{ if(isXbdk3Cr > 0) {//次日 AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(6).time(Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbdk3()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks3()) || shiftm.getXbqjks3()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjks3()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs3()) || shiftm.getXbqjjs3() ==null? 0 : Long.valueOf(ClockInTool.dateToStamp((next_day+" "+shiftm.getXbqjjs3()+":00").replaceAll("\r|\n", "")))) .nextday(1).build(); atts.add(as); }else { AttSchedule as = AttSchedule.builder().id(shiftm.getId()).sort(6).time(Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbdk3()+":00").replaceAll("\r|\n", "")))) .starttime(("").equals(shiftm.getXbqjks3()) || shiftm.getXbqjks3()== null ? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjks3()+":00").replaceAll("\r|\n", "")))) .endtime(("").equals(shiftm.getXbqjjs3()) || shiftm.getXbqjjs3() ==null? 0 : Long.valueOf(ClockInTool.dateToStamp((str+" "+shiftm.getXbqjjs3()+":00").replaceAll("\r|\n", "")))) .nextday(0).build(); atts.add(as); } } } attcar.setAttsch(atts); } } /************************************************************************************************************************************************************************************************/ /************************************************************************** APP打卡 *************************************************************************************************************/ /************************************************************************************************************************************************************************************************/ /** * 考勤打卡------APP打卡 * @throws ParseException */ @PostMapping(value = "/AttendanceCard") @ApiOperation(value = "考勤打卡------APP打卡", httpMethod = "POST", notes = "接口发布说明") @ApiOperationSupport(order = 2) public Result<Object> AttendanceCard(@CurrentUser UserBean userBean,@RequestBody ClockCollectData clock) throws ParseException { //当前时间 String current_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String current = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前用户打卡时间 String sStdIoTime = clock.getPunchtime(); //基于当前的前一天时间 和当天开始与结束时间戳 String yesterday = ClockInTool.requires_extra_times(current,-1,3,1); Long startDateyesterday = DateUtil.getStartTime(0,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long endDateyesterday = DateUtil.getnowEndTime(23,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long attendance_date = 0l;//考勤日期 String toweek = ""; String msg = "未知错误,请联系管理员"; int sbyf = 1;//0:失败;1:成功 int status_ = 0; int xiuxidaka = 0;//休息并打卡 YgglMainEmp user = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, clock.getUserid()).eq(YgglMainEmp::getOrgCode, userBean.getOrgCode())); if(user != null) { int qyid = user.getOrgCode(); int userid = user.getEmpNum(); // AttendanceGroup attgro = attendancegroupmapper.getAttendanceGroupInformationByUserid(userid,qyid); //考勤组信息 KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userid,qyid); //考勤组信息 // pbfs;// 排班方式 1:固定排班;2:自由排班;3:自由工时 long time_ = DateUtil.getStringTime(clock.getPunchtime(), "yyyy-MM-dd HH:mm:ss");//打卡时间戳 String putime = sStdIoTime.substring(0, 10);////转换打卡时间格式 yyyy-MM-dd String putimehhmm = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_);//转换打卡时间格式 年月日 Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(putime,"yyyy-MM-dd")).getTime();//打卡当天开始时间 Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(putime,"yyyy-MM-dd")).getTime();//打卡当天结束时间 int dkmx = 0;//打卡明细id int atttype = 0;//打卡顺序 int shifid = 0;//班次id boolean isRange = true;//是否在打卡时间范围内 int execution_status = 0;//执行状态 boolean kskd = true;//识别是否更新最后一次打卡 针对于最后一次下班卡 boolean sbdkkd = false;//针对于上班 未超过上班卡打卡 视为无效打卡 long punchcardtime = 0,punchstart = 0,punchend = 0;//应打卡时间,应打卡开始时间,应打卡结束时间 boolean chenexday = false; ClockCollectData clockt = new ClockCollectData(); // putime: 根据日期 得到打卡所需的详细信息 AttendanceCardListDto attdate = MethodCall(qyid,userid,putime); if(attgro != null) {//判断考勤组是否存在 if(attdate.getAttgrouptype() != 3) { List<AttSchedule> checknextday = attdate.getAttsch(); if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && checknextday.get(0).getId() != 0) { if(checknextday.size() > 0) { for(int c=0;c<checknextday.size();c++) { if(checknextday.get(c).getNextday() == 2) { chenexday = true; } } } } KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build(); boolean dnck = false; boolean crdk = false;//当次打卡是否存在次日打卡 if(chenexday) { //查询打卡当天是否有记录********************************** // KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build(); String dakariqi = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(startDateyesterday))+" "+ClockInTool.dateToWeek2(yesterday); //检查昨日的班次是否存在次日打卡 KqglAssoDkjl balan = kqglassodkjlmapper.selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getUserId, userid).eq(KqglAssoDkjl::getAttdate, dakariqi).eq(KqglAssoDkjl::getQyid, qyid).ne(KqglAssoDkjl::getBcid, 0).orderByDesc(KqglAssoDkjl :: getSort).last("LIMIT 1")); // boolean dnck = false; // boolean crdk = false;//当次打卡是否存在次日打卡 if(balan != null) {//前一天是否打过卡 去班次id查询是否存在次日打卡 //昨日的班次信息 KqglAssoBcsz shif = kqglassobcszmapper.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, balan.getBcid())); int dkcs = shif.getSxbcs()*2; List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间 if(ashss.size() > 0) { Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(ashss.get(0).getTime())));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd1.after(sd2)) {//大于 dnck = true; } } int isXbdk1Cr = shif.getIsXbdk1Cr();//下班1是否次日(0:否;1:是) int isSbdk2Cr = shif.getIsSbdk2Cr();//上班2是否次日(0:否;1:是) int isXbdk2Cr = shif.getIsXbdk2Cr();//下班2是否次日(0:否;1:是) int isSbdk3Cr = shif.getIsSbdk3Cr();//上班3是否次日(0:否;1:是) int isXbdk3Cr = shif.getIsXbdk3Cr();//下班3是否次日(0:否;1:是) if(balan.getSort() <= dkcs) { if((isXbdk1Cr + isSbdk2Cr +isXbdk2Cr + isSbdk3Cr + isXbdk3Cr) > 0) { crdk = true; } } }else { List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间 //无记录的话就找昨天的数据 AttendanceCardListDto attdate1 = MethodCall(qyid,userid,yesterday); List<AttSchedule> ashssyebo = attdate1.getAttsch();//获取昨天应打卡时间 if(ashssyebo.size() > 0) { Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(ashssyebo.get(0).getTime())));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd2.after(sd1)) {//大于 dnck = true; } } if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && ashss.get(0).getId() != 0) {//班次不为空 KqglAssoBcsz shifi = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ashss.get(0).getId())); int isXbdk1Cr = shifi.getIsXbdk1Cr();//下班1是否次日(0:否;1:是) int isSbdk2Cr = shifi.getIsSbdk2Cr();//上班2是否次日(0:否;1:是) int isXbdk2Cr = shifi.getIsXbdk2Cr();//下班2是否次日(0:否;1:是) int isSbdk3Cr = shifi.getIsSbdk3Cr();//上班3是否次日(0:否;1:是) int isXbdk3Cr = shifi.getIsXbdk3Cr();//下班3是否次日(0:否;1:是) if((isXbdk1Cr + isSbdk2Cr +isXbdk2Cr + isSbdk3Cr + isXbdk3Cr) > 0) { crdk = true; attdate = MethodCall(qyid,userid,yesterday); }else { crdk = false; } } } } if(crdk && dnck) { dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday).eq(KqglAssoDkmx::getData, yesterday)); attdate = MethodCall(qyid,userid,yesterday); attendance_date = startDateyesterday; toweek = yesterday; putime = toweek; }else { dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate).eq(KqglAssoDkmx::getData, putime)); attendance_date = startDate; toweek = putime; } if(EmptyUtil.isEmpty(attdate.getAttsch())) { msg = "当前未排班"; sbyf = 0; status_ = 2; }else { //排查请假是否在最后一次打卡范围内 查询当月的请假所有日期 KqglAssoRelationSummary leainv = kqglassorelationsummarymapper.leaveinvesti(userid, 2, putime,qyid); boolean adopt = false; if(leainv != null) { adopt = ClockInTool.hourMinuteBetween(putimehhmm, leainv.getStartTime().substring(0, 16), leainv.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm"); } if(adopt) { msg = "已请假"; sbyf = 0; status_ = 2; }else { long starttime1 = 0,starttime1ks = 0,starttime1js = 0,endtime1 = 0,endtime1ks = 0,endtime1js = 0,starttime2 = 0,starttime2ks = 0,starttime2js = 0,endtime2 = 0,endtime2ks = 0,endtime2js = 0,starttime3 = 0,starttime3ks = 0,starttime3js = 0, endtime3 = 0,endtime3ks = 0,endtime3js = 0; List<AttSchedule> ash =null; if(attdate.getAttsch().size() > 0) { ash = attdate.getAttsch(); int y = 0; clockt.setShifid(ash.get(y).getId()); shifid = ash.get(y).getId();//班次id if(attdate.getAttsch().size() == 2 || attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { starttime1 = ash.get(0).getTime();starttime1ks = ash.get(0).getStarttime();starttime1js = ash.get(0).getEndtime(); endtime1 = ash.get(1).getTime();endtime1ks = ash.get(1).getStarttime();endtime1js = ash.get(1).getEndtime(); } if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { starttime2 = ash.get(2).getTime();starttime2ks = ash.get(2).getStarttime();starttime2js = ash.get(2).getEndtime(); endtime2 = ash.get(3).getTime();endtime2ks = ash.get(3).getStarttime();endtime2js = ash.get(3).getEndtime(); } if(attdate.getAttsch().size() == 6) { starttime3 = ash.get(4).getTime();starttime3ks = ash.get(4).getStarttime();starttime3js = ash.get(4).getEndtime(); endtime3 = ash.get(5).getTime();endtime3ks = ash.get(5).getStarttime();endtime3js = ash.get(5).getEndtime(); } if(dkmc == null) { kskd = false; if(attdate.getAttsch().size() == 2) {//一套上下班 上班1 if(clock.getType() == 1) { if(starttime1ks == 0 && starttime1js == 0) { atttype = clock.getType(); isRange = true;//在范围 }else { boolean effectiveDate1 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate1) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 }else { isRange = false; } } }else if(clock.getType() == 2){ if(endtime1ks == 0 && endtime1js == 0) { atttype = clock.getType(); isRange = true;//在范围 }else { boolean effectiveDate2 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate2) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 }else { isRange = false; } } } }else { boolean getinto = true; //打卡时间 对比班次 接近哪个时间就打哪个时间的卡 if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { //punchstart 应打卡开始时间 punchend:应打卡结束时间 time_:打卡时间 if(clock.getType() == 1) { boolean effectiveDate1 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate1) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } }else if(clock.getType() == 2){ boolean effectiveDate2 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate2) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } }else if(clock.getType() == 3) { boolean effectiveDate3 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate3) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } }else if(clock.getType() == 4) { boolean effectiveDate4 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate4) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } } } if(attdate.getAttsch().size() == 6) { if(clock.getType() == 5) { boolean effectiveDate5 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate5) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } }else if(clock.getType() == 6) { boolean effectiveDate6 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate6) {//在范围内就打卡 atttype = clock.getType(); isRange = true;//在范围 getinto = false; }else { if(getinto) { isRange = false; } } } } } execution_status = 1; }else { boolean getinto2 = true; execution_status = 2; if(attdate.getAttsch().size() == 2) { //下班1 if(clock.getType() == 1) { if(clock.getDiffer() == 2) {//更新打卡 //如果第二次后打卡,未超过上班时间 即为打卡失效 // Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(starttime1)));//应打卡时间 // Date sd2=df1.parse(sStdIoTime);//打卡时间 // if(sd1.after(sd2)) {//大于 sbdkkd = true;//打卡无效 atttype = clock.getType(); // } } }else if(clock.getType() == 2){ if(dkmc.getSbdk1() != null && dkmc.getXbdk1() == null){ kskd = false; atttype = clock.getType(); }else { //最后一次卡的时候 再继续打视为更新最后一次打卡 kskd = true;//更新最后一次打卡 atttype = clock.getType(); } } } if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { if(clock.getType() == 1) { boolean effectiveDate1 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate1) {//在范围内就打卡 if(dkmc.getSbdk1() != null) { sbdkkd = true;//打卡无效 }else { atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; } }else { if(getinto2) { isRange = false; } } }else if(clock.getType() == 2) { boolean effectiveDate2 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime1js),"yyyy-MM-dd HH:mm"); if (effectiveDate2) {//在范围内就打卡 if(dkmc.getXbdk1() != null) { kskd = true;////更新最后一次打卡 atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; }else { kskd = false;//更新最后一次打卡 atttype = clock.getType(); } }else { if(getinto2) { isRange = false; } } }else if(clock.getType() == 3) { boolean effectiveDate3 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate3) {//在范围内就打卡 if(dkmc.getSbdk2() != null) { sbdkkd = true;//打卡无效 }else { atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; } }else { if(getinto2) { isRange = false; } } }else if(clock.getType() == 4) { boolean effectiveDate4 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime2js),"yyyy-MM-dd HH:mm"); if (effectiveDate4) {//在范围内就打卡 if(dkmc.getXbdk2() != null) { kskd = true;////更新最后一次打卡 atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; }else { kskd = false; atttype = clock.getType(); } }else { if(getinto2) { isRange = false; } } } } if(attdate.getAttsch().size() == 6) { if(clock.getType() == 5) { boolean effectiveDate5 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(starttime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate5) {//在范围内就打卡 if(dkmc.getSbdk2() != null) { sbdkkd = true;//打卡无效 }else { atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; } }else { if(getinto2) { isRange = false; } } }else if(clock.getType() == 6) { boolean effectiveDate6 = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3ks), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(endtime3js),"yyyy-MM-dd HH:mm"); if (effectiveDate6) {//在范围内就打卡 if(dkmc.getXbdk2() != null) { kskd = true;//更新最后一次打卡 atttype = clock.getType(); isRange = true;//在范围 getinto2 = false; }else { kskd = false; atttype = clock.getType(); } }else { if(getinto2) { isRange = false; } } } } } } if(atttype == 1) { punchcardtime = starttime1; punchstart = starttime1ks; punchend = starttime1js; }else if(atttype == 2) { punchcardtime = endtime1; punchstart = endtime1ks; punchend = endtime1js; }else if(atttype == 3) { punchcardtime = starttime2; punchstart = starttime2ks; punchend = starttime2js; }else if(atttype == 4) { punchcardtime = endtime2; punchstart = endtime2ks; punchend = endtime2js; }else if(atttype == 5) { punchcardtime = starttime3; punchstart = starttime3ks; punchend = starttime3js; }else if(atttype == 6) { punchcardtime = endtime3; punchstart = endtime3ks; punchend = endtime3js; } if(clockt.getShifid() != 0) { boolean dddbdk = true;// boolean dak2 = true; //打卡无限制时 当前时间必须大于上班打卡时间 才能打下班卡 if(punchstart==0 && punchend==0 && (atttype == 2 || atttype == 4 || atttype == 6)) { String xbdk = ""; if(atttype == 2) { xbdk = String.valueOf(ash.get(0).getTime()); }else if(atttype == 4){ xbdk = String.valueOf(ash.get(2).getTime()); }else { xbdk = String.valueOf(ash.get(4).getTime()); } Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(xbdk)));//当天应打的首次上班卡时间 Date sd2=df1.parse(current_time);//当前时间 if(sd2.before(sd1)) {//小于 dak2 = false; } } if(!dak2) { dddbdk = false; } if(dddbdk) { KqglAssoBcsz shif = KqglAssoBcsz.builder().build(); if(attdate.getAttsch().size() > 0 && clockt.getShifid() > 0){//有无班次 shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, clockt.getShifid())); } //打卡记录录入 -- 打卡是否有时间范围限制 if(attdate.getAttsch().size() == 2) { if(punchstart>0 && punchend>0) { String staputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(punchstart);//应打卡开始时间 String entputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(punchend);//应打卡结束时间 String DKputime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(time_);//打卡时间 boolean effectiveDate = ClockInTool.hourMinuteBetween(DKputime, staputime, entputime,"yyyy-MM-dd HH:mm"); if (!effectiveDate) { // System.out.println("当前打卡时间不在范围内"); isRange = false; } } } if(isRange) { int yxcd = shif.getYxcdfzs();//允许迟到 int yzcd = shif.getYzcdfzs();//严重迟到分钟数 int kgcdfzs = shif.getKgcdfzs();//旷工迟到分钟数 int dkcs_ = shif.getSxbcs();//上下班打卡次数 int iswzwd = shif.getIsWzwd();//是否开启晚走晚到(0:否;1:是) //班次的休息时间 long rest_time = 0; if(shif.getStartTime() != null && !("").equals(shif.getStartTime()) && shif.getEndTime() != null && !("").equals(shif.getEndTime())) { long kaishixiuxi = Long.valueOf(ClockInTool.dateToStamp(putime + " " +shif.getStartTime()+":00")); long jieshuxiuxi = Long.valueOf(ClockInTool.dateToStamp(putime + " " +shif.getEndTime()+":00")); rest_time = (jieshuxiuxi - kaishixiuxi)/1000/60;//休息时间 } double xbwz1 = 0,xbwz2=0,xbwz3=0; int sbwd1=0,sbwd2=0,sbwd3=0; int arrive_late = 0;//晚到时间 String clock_date = "";//应打卡时间 Long latetime = 0l;//前天晚走时长(分钟) KqglAssoDkmx yesterdaymx = KqglAssoDkmx.builder().build(); AttendanceCardListDto attdateyesterday; long yesendtime1=0,yesendtime2=0,yesendtime3=0; //存在晚走玩到 if(iswzwd > 0) { //统一分钟数 xbwz1 = Double.valueOf(shif.getXbwz1()) * 60;//下班晚走1 String sbwd1_ = String.valueOf(Double.valueOf(shif.getSbwd1()) * 60); sbwd1 = Integer.valueOf(sbwd1_.substring(0, sbwd1_.lastIndexOf(".")));//上班晚到1 xbwz2 = Double.valueOf(shif.getXbwz2()) * 60;//下班晚走2 String sbwd2_ = String.valueOf(Double.valueOf(shif.getSbwd2()) * 60); sbwd2 = Integer.valueOf(sbwd2_.substring(0, sbwd2_.lastIndexOf(".")));//上班晚到2 xbwz3 = Double.valueOf(shif.getXbwz3()) * 60;//下班晚走3 String sbwd3_ = String.valueOf(Double.valueOf(shif.getSbwd3()) * 60); sbwd3 = Integer.valueOf(sbwd3_.substring(0, sbwd3_.lastIndexOf(".")));//上班晚到3 //获取前一天最后下班的时间 yesterdaymx = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday)); attdateyesterday = MethodCall(qyid,userid,yesterday); List<AttSchedule> ash1 = attdateyesterday.getAttsch(); if(attdateyesterday.getAttsch().size() == 2 || attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime1 = ash1.get(1).getTime(); } if(attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime2 = ash1.get(3).getTime(); } if(attdateyesterday.getAttsch().size() == 6) { yesendtime3 = ash1.get(5).getTime(); } } if(execution_status == 1) {//上班1 ****新增 KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).qyid(qyid).dksj(startDate).build(); int sbdkjg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst1 = 0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if((atttype)%2 > 0){//上班 if(time > 0){ sbdkjg = Integer.valueOf(time.toString()); }// 打卡结果 }else{//下班 if(time > 0){}else{ sbdkjg = Math.abs(Integer.valueOf(time.toString())); }// 打卡结果 } //存在晚走玩到 if(iswzwd > 0 && yesterdaymx != null) { if(dkcs_ == 1) { if(yesterdaymx.getXbdk1() != null && yesterdaymx.getXbdk1jg() == 0) { latetime = (yesterdaymx.getXbdk1() - yesendtime1)/1000/60; } }else if(dkcs_ == 2){ if(yesterdaymx.getXbdk2() != null && yesterdaymx.getXbdk2jg() == 0) { latetime = (yesterdaymx.getXbdk2() - yesendtime2)/1000/60; } }else { if(yesterdaymx.getXbdk3() != null && yesterdaymx.getXbdk3jg() == 0) { latetime = (yesterdaymx.getXbdk3() - yesendtime3)/1000/60; } } if(latetime != 0) { double latetime_ = Double.valueOf(String.valueOf(latetime));//前天晚走时长(分钟) if(latetime_ > xbwz1 && latetime_ < xbwz2) { arrive_late = sbwd1; }else if(latetime_ > xbwz2 && latetime_ < xbwz3) { arrive_late = sbwd2; }else if(latetime_ > xbwz3) { arrive_late = sbwd3; } clock_date = ClockInTool.stampToDate(String.valueOf(punchcardtime)); Long changed_time = Long.valueOf(ClockInTool.dateToStamp(ClockInTool.addtime(clock_date, "+"+arrive_late)));//晚到后应打卡时间 punchcardtime = changed_time;//更换当天打卡时间 Long timeyes = (time_ - changed_time)/1000/60;// if((atttype)%2 > 0){//上班 if(timeyes > 0){ sbdkjg = Integer.valueOf(timeyes.toString()); }else { sbdkjg = 0; } }else{//下班 if(timeyes > 0){ sbdkjg = 0; }else{ sbdkjg = Math.abs(Integer.valueOf(timeyes.toString())); } } } } } //允许迟到范围 if(sbdkjg <= yxcd) { sbdkjg = 0; } if(atttype == 1) { pcd.setSbdk1(time_); pcd.setSbdk1jg(sbdkjg); }else if(atttype == 2) { pcd.setXbdk1(time_); pcd.setXbdk1jg(sbdkjg); }else if(atttype == 3) { pcd.setSbdk2(time_); pcd.setSbdk2jg(sbdkjg); }else if(atttype == 4) { pcd.setXbdk2(time_); pcd.setXbdk2jg(sbdkjg); }else if(atttype == 5) { pcd.setSbdk3(time_); pcd.setSbdk3jg(sbdkjg); }else if(atttype == 6) { pcd.setXbdk3(time_); pcd.setXbdk3jg(sbdkjg); } int ydkcs = 0; if(shif != null){ ydkcs = shif.getSxbcs()*2; }//应打卡次数 pcd.setYdkcs(ydkcs); //严重迟到范围 if(sbdkjg>yzcd && sbdkjg < kgcdfzs && yzcd>0) { yzcdcs++; yzcdsc = sbdkjg; dkst1 = 1; } //旷工迟到 if(sbdkjg>kgcdfzs && kgcdfzs>0) { kgcdcs++; dkst1 = 2; } pcd.setDkst1(dkst1);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setYzcdcs(yzcdcs);//严重迟到次数 pcd.setYzcdsc(Double.valueOf(yzcdsc));//严重迟到时长(分钟) pcd.setKgcdfzs(kgcdcs);//旷工迟到次数 if (!pcd.insert()) { throw new CustomException("打卡明细-新增异常-1"); } dkmx = pcd.getId(); }else if(execution_status == 2){ dkmx = dkmc.getId(); KqglAssoDkmx pcd = KqglAssoDkmx.builder().build(); if(atttype == 2){//下班1 pcd.setId(dkmc.getId()); pcd.setXbdk1(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk1jg(0);// 打卡结果 }else{ pcd.setXbdk1jg(Math.abs(Integer.valueOf(time.toString()))); } } if(dkmc.getSbdk1() != null){ Long time = (time_ - dkmc.getSbdk1())/1000/60 - rest_time; pcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长 } kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 3){//上班2 int sbdk2jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst2=0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){sbdk2jg = Math.abs(Integer.valueOf(time.toString()));} } //允许迟到范围 if(sbdk2jg <= yxcd) { sbdk2jg = 0; } //严重迟到范围 if(sbdk2jg>yzcd && sbdk2jg < kgcdfzs && yzcd>0) { yzcdcs = dkmc.getYzcdcs()+1; yzcdsc = sbdk2jg; dkst2 = 1; } //旷工迟到 if(sbdk2jg>kgcdfzs && kgcdfzs>0) { kgcdcs++; kgcdcs = kgcdcs + dkmc.getKgcdfzs(); dkst2 = 2; } pcd.setDkst2(dkst2);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setId(dkmc.getId()); pcd.setSbdk2(time_);//上班1打卡时间 pcd.setSbdk2jg(sbdk2jg); pcd.setYzcdcs(yzcdcs); pcd.setYzcdsc(Double.valueOf(yzcdsc)); pcd.setKgcdfzs(kgcdcs); kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 4){//下班2 pcd.setId(dkmc.getId()); pcd.setXbdk2(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk2jg(0);// 打卡结果 }else{ pcd.setXbdk2jg(Math.abs(Integer.valueOf(time.toString()))); } } //班次为4次时,计算工作时长 if(dkmc.getSbdk2() != null){ Long time = (time_ - dkmc.getSbdk2())/1000/60; BigDecimal om = new BigDecimal(dkmc.getGzsc()); BigDecimal on = new BigDecimal(time); BigDecimal worktime_ = new BigDecimal(Math.abs(om.add(on).doubleValue())); BigDecimal xx = new BigDecimal(rest_time); double worktime = Math.abs(worktime_.subtract(xx).doubleValue()); pcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 5){//上班3 int sbdk3jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0,dkst3=0; if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){sbdk3jg = Math.abs(Integer.valueOf(time.toString()));} } //允许迟到范围 if(sbdk3jg <= yxcd) { sbdk3jg = 0; } //严重迟到范围 if(sbdk3jg>yzcd && sbdk3jg < kgcdfzs && yzcd>0) { yzcdcs = dkmc.getYzcdcs()+1; yzcdsc = sbdk3jg; dkst3 = 1; } //旷工迟到 if(sbdk3jg>kgcdfzs && kgcdfzs>0) { kgcdcs++; kgcdcs = kgcdcs + dkmc.getKgcdfzs(); dkst3 = 2; } pcd.setDkst3(dkst3);//打卡时态(0:无;1:严重迟到;2:旷工迟到) pcd.setId(dkmc.getId()); pcd.setSbdk3(time_);//上班1打卡时间 pcd.setSbdk3jg(sbdk3jg); pcd.setYzcdcs(yzcdcs); pcd.setYzcdsc(Double.valueOf(yzcdsc)); pcd.setKgcdfzs(kgcdcs); kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 }else if(atttype == 6){//下班3 pcd.setId(dkmc.getId()); pcd.setXbdk3(time_);//下班1打卡时间 if(punchcardtime != 0){//有应打卡时间时 Long time = (time_ - punchcardtime)/1000/60; if(time > 0){ pcd.setXbdk3jg(0);// 打卡结果 }else{ pcd.setXbdk3jg(Math.abs(Integer.valueOf(time.toString()))); } } //班次为6次时,计算工作时长 if(dkmc.getSbdk3() != null){ Long time = (time_ - dkmc.getSbdk3())/1000/60; BigDecimal om = new BigDecimal(dkmc.getGzsc());//第二次 BigDecimal on = new BigDecimal(time); BigDecimal worktime_ = new BigDecimal(Math.abs(om.add(on).doubleValue())); BigDecimal xx = new BigDecimal(rest_time); double worktime = Math.abs(worktime_.subtract(xx).doubleValue()); pcd.setGzsc(worktime); } } pcd.setId(dkmc.getId()); if(atttype <= 6 && atttype > 0 && !sbdkkd){ kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录 } } }else { msg = "当前打卡时间不在范围内"; sbyf = 0; status_ = 2; } }else { msg = "当前时间必须大于上班打卡时间 才能打下班卡"; sbyf = 0; status_ = 2; } }else { //判断 考勤组是否开启休息日打卡 if(attgro.getRestdayclock().equals(0)) { msg = "当前是休息时间"; sbyf = 0; status_ = 2; }else { KqglAssoDkmx zydkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate)); if(zydkmc == null) {//新增 KqglAssoDkmx pcd = KqglAssoDkmx.builder().build(); pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDate).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); if (!pcd.insert()) { throw new CustomException("打卡明细-新增异常-1"); } dkmx = pcd.getId(); atttype = 1; xiuxidaka = 1; }else {//修改 dkmx = zydkmc.getId(); KqglAssoDkmx zypcd = KqglAssoDkmx.builder().build(); kskd = false; if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() == null)){//下班1 zypcd.setId(zydkmc.getId()); zypcd.setXbdk1(time_);//下班1打卡时间 if(zydkmc.getSbdk1() != null){ Long time = (time_ - zydkmc.getSbdk1())/1000/60; zypcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长 } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 2; xiuxidaka = 1; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() == null)){//上班2 zypcd.setId(zydkmc.getId()); zypcd.setSbdk2(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 3; xiuxidaka = 1; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() == null)){//下班2 zypcd.setId(zydkmc.getId()); zypcd.setXbdk2(time_);//下班1打卡时间 //班次为4次时,计算工作时长 if(zydkmc.getSbdk2() != null){ Long time = (time_ - zydkmc.getSbdk2())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc()); BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 4; xiuxidaka = 1; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() == null)){//上班3 zypcd.setId(zydkmc.getId()); zypcd.setSbdk3(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 5; xiuxidaka = 1; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (!("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() != null) && (("").equals(zydkmc.getXbdk3()) || zydkmc.getXbdk3() == null)){ zypcd.setId(zydkmc.getId()); zypcd.setXbdk3(time_);//下班1打卡时间 //班次为6次时,计算工作时长 if(zydkmc.getSbdk3() != null){ Long time = (time_ - zydkmc.getSbdk3())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc());//第二次 BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 6; xiuxidaka = 1; }else { atttype = 7; xiuxidaka = 1; } } } } } } }else { //需要再次调整******************** //自由工时打卡 Long stapclotime = attdate.getStapclotime();// 今天考勤 自由排班开始时间 int canpunchworkdate = Integer.valueOf(String.valueOf(attdate.getCanpunchworkdate()).replaceAll("(\\d+)(?:(\\.\\d*[^0])|\\.)0*", "$1$2"));// 上班打卡后多久大下班卡 KqglAssoDkmx zydkmc = KqglAssoDkmx.builder().build(); Date sd1=df1.parse(ClockInTool.stampToDate(String.valueOf(stapclotime)));//应打卡时间 2020-06-10 18:30:00 Date sd2=df1.parse(current_time);//当前时间 2020-06-10 16:06:58 if(sd1.after(sd2)) {//为true时 打的是昨天的卡 zydkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday)); attendance_date = startDateyesterday; toweek = yesterday; }else { zydkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid).eq(KqglAssoDkmx::getQyid, qyid) .ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate)); attendance_date = startDate; toweek = putime; } if(zydkmc == null) {//新增 KqglAssoDkmx pcd = KqglAssoDkmx.builder().build(); if(sd1.after(sd2)) { pcd = KqglAssoDkmx.builder().userid(userid).data(yesterday).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDateyesterday).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); }else { pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDate).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); } // KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(0).ydkcs(0).qyid(qyid).dksj(startDate).yzcdcs(0).yzcdsc(Double.valueOf(0)).kgcdfzs(0).build(); if (!pcd.insert()) { throw new CustomException("打卡明细-新增异常-1"); } dkmx = pcd.getId(); atttype = 1; }else {//修改 boolean zydk = true; dkmx = zydkmc.getId(); KqglAssoDkmx zypcd = KqglAssoDkmx.builder().build(); if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() == null)){//下班1 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk1())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk1(time_);//下班1打卡时间 if(zydkmc.getSbdk1() != null){ Long time = (time_ - zydkmc.getSbdk1())/1000/60; zypcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长 } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 2; } }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() == null)){//上班2 zypcd.setId(zydkmc.getId()); zypcd.setSbdk2(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 3; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() == null)){//下班2 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk2())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk2(time_);//下班1打卡时间 //班次为4次时,计算工作时长 if(zydkmc.getSbdk2() != null){ Long time = (time_ - zydkmc.getSbdk2())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc()); BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 4; } }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() == null)){//上班3 zypcd.setId(zydkmc.getId()); zypcd.setSbdk3(time_);//上班1打卡时间 kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 atttype = 5; }else if((!("").equals(zydkmc.getSbdk1()) || zydkmc.getSbdk1() != null) && (!("").equals(zydkmc.getXbdk1()) || zydkmc.getXbdk1() != null) && (!("").equals(zydkmc.getSbdk2()) || zydkmc.getSbdk2() != null) && (!("").equals(zydkmc.getXbdk2()) || zydkmc.getXbdk2() != null) && (!("").equals(zydkmc.getSbdk3()) || zydkmc.getSbdk3() != null) && (("").equals(zydkmc.getXbdk3()) || zydkmc.getXbdk3() == null)){//下班3 String clock_time = ClockInTool.requires_extra_times(ClockInTool.stampToDate(String.valueOf(zydkmc.getSbdk3())),canpunchworkdate,5,2); Date zysd1=df1.parse(clock_time);//上班打卡后多久大下班卡的时间 Date zysd2=df1.parse(current_time);//当前时间 if(zysd1.after(zysd2)) {//当zysd1大于zysd2时,返回TRUE,当小于等于时,返回false; msg = "自由工时:上班打卡后"+canpunchworkdate+"小时后,才可打下班卡"; sbyf = 0; zydk = false; atttype = 0; status_ = 2; }else { zypcd.setId(zydkmc.getId()); zypcd.setXbdk3(time_);//下班1打卡时间 //班次为6次时,计算工作时长 if(zydkmc.getSbdk3() != null){ Long time = (time_ - zydkmc.getSbdk3())/1000/60; BigDecimal om = new BigDecimal(zydkmc.getGzsc());//第二次 BigDecimal on = new BigDecimal(time); double worktime = Math.abs(om.add(on).doubleValue()); zypcd.setGzsc(worktime); } kqglassodkmxmapper.updateByPrimaryKeySelective(zypcd);//修改打卡记录 } if(zydk) { atttype = 6; } }else { atttype = 7; } } } /*****************************************************************************************************************************************************************************************************/ /*******************************************************************APP 原始打卡记录数据录入**************************************************************************************************************/ /*****************************************************************************************************************************************************************************************************/ String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(attendance_date));//转换打卡时间格式 //true:确认为最后一次打卡更新打卡时 之前打卡的一条数据变为“打卡更新数据” if(kskd && (atttype == 2 || atttype == 4 || atttype == 6) && attdate.getAttgrouptype() != 3) { KqglAssoDkjl dkjj = KqglAssoDkjl.builder().build().selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getUserId, userid).eq(KqglAssoDkjl::getType, 2) .eq(KqglAssoDkjl::getSort, atttype).eq(KqglAssoDkjl::getQyid, qyid).eq(KqglAssoDkjl::getAttdate, attdate_+" "+ClockInTool.dateToWeek2(toweek))); KqglAssoDkjl.builder().id(dkjj.getId()).status(0).sort(0).build().updateById(); msg = "打卡已更新数据"; sbyf = 0; // status_ = 2; } int results = 0; Long time = (time_ - punchcardtime)/1000/60; if(punchcardtime != 0){ if(isRange) { if((atttype)%2 > 0){//上班 if(time > 0){ results = Integer.valueOf(time.toString()); }// 打卡结果 }else{//下班 if(time > 0){}else{ results = Math.abs(Integer.valueOf(time.toString())); }// 打卡结果 } } } int type = 0,status = 0; if(atttype > 0) { if((atttype)%2 > 0){ type = 1;// 类型(类型 0:无排班打卡 1:上班 2:下班) punchcardtime == 0:无班次打卡 if(xiuxidaka > 0) { status = 1; }else { if(attdate.getAttgrouptype() != 3) { if(EmptyUtil.isNotEmpty(attdate.getAttsch())) { if(punchcardtime == 0 && clockt.getShifid() != 0){ status = 1; }if(punchcardtime == 0 && clockt.getShifid() == 0) { status = 2; }else{ if(isRange) {// 状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休) if(time > 0){ status = 3; }else if(results == 0){ status = 1; } }else { status = 2; } } }else if(EmptyUtil.isEmpty(attdate.getAttsch())) { status = 2; } }else { if(sbyf == 1) { status = 1; }else { status = 2; } } } }else{ type = 2;// 类型(类型 0:无排班打卡 1:上班 2:下班) if(xiuxidaka > 0) { status = 1; }else { if(attdate.getAttgrouptype() != 3) { if(EmptyUtil.isNotEmpty(attdate.getAttsch())) { if(punchcardtime == 0 && clockt.getShifid() != 0){ status = 1; }if(punchcardtime == 0 && clockt.getShifid() == 0) { status = 2; }else{ if(isRange) { if(time < 0){ status = 4; }else if(results == 0){ status = 1; } }else { status = 2; } } }else if(EmptyUtil.isEmpty(attdate.getAttsch())) { status = 2; } }else { if(sbyf == 1) { status = 1; }else { status = 2; } } } } } //第二次未超过应上班打卡时间 打卡为无效 if(sbdkkd) { sbyf = 0; status = 2; atttype = 0; msg = "已有最优的打卡记录存在"; } long attime; if(punchcardtime == 0){// 考勤时间(应打卡时间) attime = new Date().getTime(); }else{ attime = punchcardtime; } String remarks = "";//考勤备注 String punchequipment = "";//打卡设备 String commentary = "未知"; if(sbyf == 1) { commentary = "打卡成功"; msg = "打卡成功"; }else { commentary = msg; if(status_ == 2) { status = status_; } } KqglAssoDkjl pre = KqglAssoDkjl.builder().dktime(time_).results(results).userId(userid).type(type).status(status).sort(atttype) .qyid(qyid).attdate(attdate_+" "+ClockInTool.dateToWeek2(toweek)).attime(attime).dkmxid(dkmx).bcid(shifid).remarks(remarks) .punchequipment(punchequipment).commentary(commentary).build(); //cardtype--1:GPS,2:WIFI,3:考勤机,4:外勤 int cardtype = 0; if(clock.getPunchcardtype() == 1 || clock.getPunchcardtype() == 4) { pre.setAddress(clock.getAddress()); pre.setLat(Double.valueOf(clock.getLat())); pre.setLon(Double.valueOf(clock.getLon())); }else if(clock.getPunchcardtype() == 2) { pre.setMacname(clock.getMacname()); pre.setMac(clock.getMac()); } pre.setCardType(clock.getPunchcardtype()); if (!pre.insert()) { throw new CustomException("打卡记录-新增异常-2"); } }else { msg="打卡失败!,未加入考勤组!"; sbyf = 0; } }else { return ResultUtil.error("打卡失败!,用户不存在!"); } // if(sbyf == 1) { // return ResultUtil.data("打卡成功"); // }else { // return ResultUtil.data(msg, "打卡失败"); // } return ResultUtil.success(msg); } //****************************************************&&*******&&&******&&&****************************************************// //***************************************************&**&******&***&****&***&**************************************************// //**************************************************&&&&&&*****&&&******&&&****************************************************// //*************************************************&******&****&********&******************************************************// //考勤组绑定的打卡方式 @Autowired private AttGroupBinPunchModeMapper attgroupbinpunchmodemapper; //考勤机 @Autowired private AttendanceMachineMapper attendancemachinemapper; //考勤地址 @Autowired private PunchCardAddressMapper punchcardaddressmapper; //考勤WIFI @Autowired private PunchCardWiFiMapper punchcardwifimapper; /** * 获取考勤打卡数据------APP打卡 * @throws ParseException */ @PostMapping(value = "/ClockData") @ApiOperation(value = "获取考勤打卡数据------APP打卡", httpMethod = "POST", notes = "接口发布说明") @ApiOperationSupport(order = 3) public Result<Object> getAttClockData(@CurrentUser UserBean userBean,@RequestBody AttConditions attconditions) throws ParseException { long nowdate = new Date().getTime(); String str = null; if(!("").equals(attconditions.getDate())){ str = attconditions.getDate(); }else{ Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); str = sdf.format(d); } //前一天时间 String yesterday = ClockInTool.requires_extra_times(str,-1,3,1);//前一天 Long startDateyesterday = DateUtil.getStartTime(0,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long endDateyesterday = DateUtil.getnowEndTime(23,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(str,"yyyy-MM-dd")).getTime(); Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(str,"yyyy-MM-dd")).getTime(); String stampToDate = ClockInTool.stampToDate(String.valueOf(endDate));//当天打卡的最后时间 Timestamp d = Timestamp.valueOf(stampToDate); Timestamp b = Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));//当前时间 String now = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //考勤组信息 if(attgro != null) { //APP获取当前天的考勤信息 AttendanceCardListDto attdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),attconditions.getDate()); //打卡记录 // List<KqglAssoDkjl> dajllist = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDate,userBean.getEmpNum()); // attdate.setAttpr(dajllist); int dkcs = 0; int isxbdk = 0; String yymmdd = str.substring(2, 10); String nowattdate = yymmdd+" "+ClockInTool.dateToWeek2(str); //查询当天考勤记录 List<KqglAssoDkjl> dajllist_ = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDate,userBean.getEmpNum(),nowattdate,userBean.getOrgCode()); if(dajllist_.size() > 0) { dkcs = dajllist_.size(); isxbdk = dajllist_.get(dajllist_.size()-1).getSort(); } if(attdate.getAttgrouptype() != 3) { List<AttSchedule> attsch = attdate.getAttsch(); if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && attsch.get(0).getId() != 0) {//班次不为空 int bc = 0; int bsz = 0; int cr = 0; boolean iscrdk = true; String crlasttime = null;//次日最后打卡时间 boolean bycf = true; /****************昨日开始***************/ int sb1 = 0,xb1 = 0,sb2 = 0,xb2 = 0,sb3 = 0,xb3 = 0; //先判断前一天是否存在次日打卡的方式 KqglAssoBcsz jianchashif = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, attsch.get(0).getId())); if(jianchashif.getIsSbdk1Cr() == 1) { sb1 = 1; crlasttime = (str+" "+jianchashif.getSbdk1()+":00").replaceAll("\r|\n", "");} if(jianchashif.getIsXbdk1Cr() == 1) { xb1 = 1; crlasttime = (str+" "+jianchashif.getXbdk1()+":00").replaceAll("\r|\n", "");} if(jianchashif.getIsSbdk2Cr() == 1) { sb2 = 1; crlasttime = (str+" "+jianchashif.getSbdk2()+":00").replaceAll("\r|\n", "");} if(jianchashif.getIsXbdk2Cr() == 1) { xb2 = 1; crlasttime = (str+" "+jianchashif.getXbdk2()+":00").replaceAll("\r|\n", "");} if(jianchashif.getIsSbdk3Cr() == 1) { sb3 = 1; crlasttime = (str+" "+jianchashif.getSbdk3()+":00").replaceAll("\r|\n", "");} if(jianchashif.getIsXbdk3Cr() == 1) { xb3 = 1; crlasttime = (str+" "+jianchashif.getXbdk3()+":00").replaceAll("\r|\n", "");} // if(sb1 == 1 ||xb1 == 1 ||sb2 == 1 ||xb2 == 1 || sb3 == 1 ||xb3 == 1) { //前一天的班次 AttendanceCardListDto beforeattdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),yesterday); //前一天的打卡数据 // String yesterday = ClockInTool.requires_extra_times(now,-1,3,1);//前一天 // Long startDateyesterday = DateUtil.getStartTime(0,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime(); String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(startDateyesterday));//转换打卡时间格式 String yeboattdate = attdate_+" "+ClockInTool.dateToWeek2(yesterday); //次日查询昨日考勤时 时间范围扩大到 昨日开始到今日结束 List<KqglAssoDkjl> dajllistbefo = kqglassodkjlmapper.getDetailedRecordClock(startDateyesterday,endDate,userBean.getEmpNum(),yeboattdate,userBean.getOrgCode()); List<AttSchedule> beforeattsch = beforeattdate.getAttsch(); int p = 0; if(EmptyUtil.isNotEmpty(beforeattdate.getAttsch()) && beforeattsch.get(0).getId() != 0) { int g = 1; for(AttSchedule befo : beforeattsch) { boolean isdkjl = true; if(befo.getNextday() == 1) { iscrdk = false; cr++; AttSchedule attschbefo = AttSchedule.builder().build(); BeanUtil.copyProperties(befo, attschbefo,"nextdaycard","dajl"); attschbefo.setNextdaycard(1); attschbefo.setNextday(2);//昨日 KqglAssoDkjl dkjlbefo = KqglAssoDkjl.builder().build(); for(KqglAssoDkjl ka : dajllistbefo) { if(befo.getId() == ka.getBcid() && befo.getSort() == ka.getSort()) {//班次id和打卡顺序对应 BeanUtil.copyProperties(ka, dkjlbefo,"attdate","remarks","userId","attime","dkmxid","commentary","punchequipment","punchmode"); isdkjl = false; } } if(dkjlbefo.getDktime() != null) { bycf = false; bc++; attschbefo.setIsdk(1); }else { attschbefo.setIsdk(0); } if(beforeattdate.getAttsch().size() == 2) { if(befo.getStarttime() != 0 && befo.getEndtime() != 0) { boolean ectivedate = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(nowdate), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(befo.getStarttime()), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(befo.getEndtime()),"yyyy-MM-dd HH:mm"); if(g == 1) { if(ectivedate) { attschbefo.setIsdk(0); }else { bc++; attschbefo.setIsdk(1); } } if(g == 2) { if(ectivedate) { attschbefo.setIsdk(0); }else { bc++; attschbefo.setIsdk(1); } } g++; } }else { boolean ectivedate = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(nowdate), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(befo.getStarttime()), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(befo.getEndtime()),"yyyy-MM-dd HH:mm"); if(ectivedate) { if(isdkjl) { bsz = 1; bc--; attschbefo.setIsdk(0); } }else { if(bycf) { bc++; attschbefo.setIsdk(1); } } } Timestamp tt = Timestamp.valueOf(ClockInTool.stampToDate(String.valueOf(befo.getTime()))); if(attschbefo.getIsdk() == 1 && b.after(tt) && isdkjl) { dkjlbefo.setStatus(17);//缺卡 dkjlbefo.setSort(befo.getSort()); dkjlbefo.setId(888); //更新打卡关闭 attschbefo.setIsupdate(0); } attschbefo.setDajl(dkjlbefo); attsch.add(p,attschbefo); p++; } } } } /****************昨日结束***************/ int bccs = attdate.getAttsch().size(); int r = 1; // int bc = 0; // int bsz = 0; boolean dk1 = true;//上 boolean dk2 = true;//下 boolean dk3 = true; boolean dk4 = true; boolean dk5 = true; boolean dk6 = true; for(AttSchedule ash : attsch) { if(ash.getNextdaycard() == 0) { if(attdate.getAttsch().size() == 2) { //有范围 if(ash.getStarttime() != 0 && ash.getEndtime() != 0) { boolean ectivedate = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(nowdate), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(ash.getStarttime()), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(ash.getEndtime()),"yyyy-MM-dd HH:mm"); String timme = ClockInTool.stampToDate2(String.valueOf(ash.getTime())); if(r == 1) { if(ectivedate) { bsz = 1; ash.setIsdk(0); }else { dk1 = false; bc++; ash.setIsdk(1); if(!now.equals(timme)) { ash.setIsupdate(0); }else { ash.setIsupdate(1); } } } if(r == 2) { if(ectivedate) { bsz = 1; ash.setIsdk(0); }else { dk2 = false; bc++; ash.setIsdk(1); if(!now.equals(timme)) { ash.setIsupdate(0); }else { if(isxbdk == 2) { ash.setIsupdate(1); } } } } r++; //是否请假 KqglAssoRelationSummary leainv = kqglassorelationsummarymapper.leaveinvesti(userBean.getEmpNum(), 2, str,userBean.getOrgCode()); boolean adopt = false; if(leainv != null) { String time = ClockInTool.stampToDate4(String.valueOf(ash.getTime()));//当天打卡的最后时间 adopt = ClockInTool.hourMinuteBetween(time, leainv.getStartTime().substring(0, 16), leainv.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm"); } if(adopt) { ash.setIsleave(1); } }else { KqglAssoBcsz shif = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ash.getId())); String xbdk1 = (str+" "+shif.getXbdk1()+":00").replaceAll("\r|\n", ""); Timestamp a = Timestamp.valueOf(xbdk1);//下班 String sbdk1 = (str+" "+shif.getSbdk1()+":00").replaceAll("\r|\n", ""); Timestamp c = Timestamp.valueOf(sbdk1);//上班 if(r == 1) { if (b.after(a) && b.after(c)) {// 当前时间大于下班打卡时间 bc++; ash.setIsdk(1); if(b.before(d)) { ash.setIsupdate(1); } }else { bsz = 1; } } if(r == 2) { if(b.after(a) && b.after(c) && b.before(d)) { bsz = 1; ash.setIsdk(0); }else { bc++; ash.setIsdk(1); } } r++; //是否请假 KqglAssoRelationSummary leainv = kqglassorelationsummarymapper.leaveinvesti(userBean.getEmpNum(), 2, str,userBean.getOrgCode()); boolean adopt = false; if(leainv != null) { String time = ClockInTool.stampToDate4(String.valueOf(ash.getTime()));//当天打卡的最后时间 adopt = ClockInTool.hourMinuteBetween(time, leainv.getStartTime().substring(0, 16), leainv.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm"); } if(adopt) { ash.setIsleave(1); } } }else { boolean ectivedate = ClockInTool.hourMinuteBetween(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(nowdate), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(ash.getStarttime()), new SimpleDateFormat("yyyy-MM-dd HH:mm").format(ash.getEndtime()),"yyyy-MM-dd HH:mm"); if(ectivedate) { bsz = 1; ash.setIsdk(0); }else { bc++; ash.setIsdk(1); if(ash.getSort() == 1) { dk1 = false; } if(ash.getSort() == 2) { dk2 = false; } if(ash.getSort() == 3) { dk3 = false; } if(ash.getSort() == 4) { dk4 = false; } if(ash.getSort() == 5) { dk5 = false; } if(ash.getSort() == 6) { dk6 = false; } } //是否请假 KqglAssoRelationSummary leainv = kqglassorelationsummarymapper.leaveinvesti(userBean.getEmpNum(), 2, str,userBean.getOrgCode()); boolean adopt = false; if(leainv != null) { String time = ClockInTool.stampToDate4(String.valueOf(ash.getTime()));//当天打卡的最后时间 adopt = ClockInTool.hourMinuteBetween(time, leainv.getStartTime().substring(0, 16), leainv.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm"); } if(adopt) { ash.setIsleave(1); } } String afterday = ClockInTool.requires_extra_times(str,+1,3,1);//后一天 Long endDateafterday = DateUtil.getnowEndTime(23,DateUtil.getStringTime(afterday,"yyyy-MM-dd")).getTime(); if(sb1 == 1 ||xb1 == 1 || sb2 == 1 ||xb2 == 1 || sb3 == 1 ||xb3 == 1) {//当天存在次日打卡数据时 查询打卡记录范围应该是:当天的开始到后一天的结束 dajllist_ = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDateafterday,userBean.getEmpNum(),nowattdate,userBean.getOrgCode()); } KqglAssoDkjl dkjl = KqglAssoDkjl.builder().build(); for(KqglAssoDkjl daj : dajllist_) { if(ash.getId() == daj.getBcid() && ash.getSort() == daj.getSort()) {//班次id和打卡顺序对应 BeanUtil.copyProperties(daj, dkjl,"attdate","remarks","userId","attime","dkmxid","commentary","punchequipment","punchmode"); int bcid = dkjl.getBcid(); int results = dkjl.getResults(); KqglAssoBcsz bcsz = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, bcid)); if(now.equals(ClockInTool.stampToDate2(String.valueOf(ash.getTime())))) { if(attdate.getAttsch().size() == 2) { if(dkjl.getSort() == 2) { ash.setIsupdate(1); } }else if(attdate.getAttsch().size() == 4) { if(dkjl.getSort() == 4) { ash.setIsupdate(1); } }else if(attdate.getAttsch().size() == 6) { if(dkjl.getSort() == 6) { ash.setIsupdate(1); } } } if(bcsz != null && (dkjl.getSort())%2 > 0) { int yxcdfzs = bcsz.getYxcdfzs();//允许迟到分钟数 int yzcdfzs = bcsz.getYzcdfzs();//严重迟到分钟数 int kgcdfzs = bcsz.getKgcdfzs();//旷工迟到分钟数 //允许迟到范围 if(results < yxcdfzs) { dkjl.setResults(0); if(dkjl.getStatus() == 3) {//原本是迟到的 但是在“允许迟到”范围内 则更改为正常 dkjl.setStatus(1); } } //严重迟到范围 if(results>yzcdfzs && results < kgcdfzs && yzcdfzs>0) { dkjl.setStatus(15);//严重迟到 } //旷工迟到 if(results>kgcdfzs && kgcdfzs>0) { dkjl.setStatus(16);//旷工迟到 } } if(bsz == 1) { bc++; ash.setIsdk(1); }else { ash.setIsdk(1); } }else if(ash.getSort() == daj.getSort()){ BeanUtil.copyProperties(daj, dkjl,"attdate","remarks","userId","attime","dkmxid","commentary","punchequipment","punchmode"); } } KqglAssoBcsz shif = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ash.getId())); Timestamp tt = Timestamp.valueOf(ClockInTool.stampToDate(String.valueOf(ash.getTime()))); //处理下班不用打卡的数据 if(shif.getIsXbdk() == 1 && (ash.getSort())%2 == 0) { if(dkjl.getDktime() == null && b.after(tt)) { dkjl.setDktime(ash.getTime()); dkjl.setStatus(1); dkjl.setSort(ash.getSort()); dkjl.setId(999); }else if(dkjl.getDktime() != null){ dkjl.setStatus(1); } } //处理当天完全没打卡的数据 if(ash.getIsdk() == 1 && b.after(tt) && dkcs == 0 && iscrdk && dkjl.getCardType() == null) { dkjl.setDktime(null); dkjl.setStatus(17);//缺卡 dkjl.setSort(ash.getSort()); dkjl.setId(888); //更新打卡关闭 ash.setIsupdate(0); ash.setIsdk(1); } // if(ash.getIsdk() == 1 && b.after(tt) && dkjl.getDktime() == null && dkjl.getId() == null && dkcs > 0 && iscrdk) { dkjl.setStatus(17);//缺卡 dkjl.setSort(ash.getSort()); dkjl.setId(888); //更新打卡关闭 ash.setIsupdate(0); ash.setIsdk(1); }else if(ash.getIsdk() == 1 && b.after(tt) && dkjl.getDktime() == null && dkjl.getId() == null){ dkjl.setStatus(17);//缺卡 dkjl.setSort(ash.getSort()); dkjl.setId(888); } ash.setDajl(dkjl);//班次信息中插入打卡打卡 数据 /****/ //事务(请假,加班,调休,出差) KqglAssoRelationSummary asssum1 = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum()) .eq(KqglAssoRelationSummary::getAppTime, str).eq(KqglAssoRelationSummary::getOrgCode, userBean.getOrgCode()).last("LIMIT 1")); if(asssum1 != null) { if(asssum1.getApprovalType() != 5) { String startTime = asssum1.getStartTime();// String endTime = asssum1.getEndTime();// if(ash.getDajl().getCardType() != null) { boolean affair = ClockInTool.hourMinuteBetween(ClockInTool.stampToDate(String.valueOf(ash.getDajl().getDktime())), startTime, endTime,"yyyy-MM-dd HH:mm:ss"); if(affair && ash.getDajl().getStatus() != 9 && ash.getDajl().getStatus() != 10 && ash.getDajl().getStatus() != 11 && ash.getDajl().getStatus() != 12 && ash.getDajl().getStatus() != 13 && ash.getDajl().getStatus() != 14) { ash.getDajl().setStatus(1); } } } //0:无;1:事假;2:调休;3:病假;4:年假;5:产假;6:陪产假;7:婚假;8:例假;9:丧假;10:哺乳假;11:加班;12:出差;13:外出 if(asssum1.getApprovalType() == 1) { dkjl.setCalendar_status_type(11); ash.setCalendar_status_type(11); }else if(asssum1.getApprovalType() == 2) { //请假 KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getId,asssum1.getLeaveTypeId())); if(rul.getRulesType() != null) { if(rul.getRulesType() == 1) { dkjl.setCalendar_status_type(1); ash.setCalendar_status_type(1); }else if(rul.getRulesType() == 2) { dkjl.setCalendar_status_type(2); ash.setCalendar_status_type(2); }else if(rul.getRulesType() == 3) { dkjl.setCalendar_status_type(3); ash.setCalendar_status_type(3); }else if(rul.getRulesType() == 4) { dkjl.setCalendar_status_type(4); ash.setCalendar_status_type(4); }else if(rul.getRulesType() == 5) { dkjl.setCalendar_status_type(5); ash.setCalendar_status_type(5); }else if(rul.getRulesType() == 6) { dkjl.setCalendar_status_type(6); ash.setCalendar_status_type(6); }else if(rul.getRulesType() == 7) { dkjl.setCalendar_status_type(7); ash.setCalendar_status_type(7); }else if(rul.getRulesType() == 8) { dkjl.setCalendar_status_type(8); ash.setCalendar_status_type(8); }else if(rul.getRulesType() == 9) { dkjl.setCalendar_status_type(9); ash.setCalendar_status_type(9); }else if(rul.getRulesType() == 10) { dkjl.setCalendar_status_type(10); ash.setCalendar_status_type(10); } }else { dkjl.setCalendar_status_type(-1); dkjl.setCalendar_status_name(rul.getName()); ash.setCalendar_status_type(-1); dkjl.setCalendar_status_name(rul.getName()); } }else if(asssum1.getApprovalType() == 3) { dkjl.setCalendar_status_type(12); ash.setCalendar_status_type(12); }else if(asssum1.getApprovalType() == 4) { dkjl.setCalendar_status_type(13); ash.setCalendar_status_type(13); } }else { dkjl.setCalendar_status_type(0); ash.setCalendar_status_type(0); } /****/ // ash.setDajl(dkjl);//班次信息中插入打卡打卡 数据 } } boolean lcdkgb = true; if(attdate.getAttsch().size() == 2 && dkcs == 2 && now.equals(str)) { lcdkgb = false; KqglAssoDkjl dk = KqglAssoDkjl.builder().build().selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getQyid, userBean.getOrgCode()) .eq(KqglAssoDkjl::getUserId, userBean.getEmpNum()).ge(KqglAssoDkjl::getDktime, startDate).le(KqglAssoDkjl::getDktime, endDate) .ne(KqglAssoDkjl::getSort, 0).ne(KqglAssoDkjl::getStatus, 2).ne(KqglAssoDkjl::getStatus, 0) .orderByDesc(KqglAssoDkjl::getSort).last("LIMIT 1")); if(dk != null) { AttSchedule att = attsch.get(dk.getSort()-1); att.setIsupdate(1); AttSchedule attw = attsch.get(dk.getSort()-2); attw.setIsupdate(0); } } //全部为缺卡时 没有打卡按钮显示 if(attsch.get(0).getDajl().getId() != null && iscrdk) { if(attdate.getAttsch().size() == 2 || attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { if(attsch.get(0).getDajl().getId() != null && attsch.get(0).getDajl().getId() == 888 && attsch.get(0).getDajl().getStatus() == 17 && attsch.get(1).getDajl().getId() != null && attsch.get(1).getDajl().getId() == 888 && attsch.get(1).getDajl().getStatus() == 17) { lcdkgb = false; } }else if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { if(attsch.get(2).getDajl().getId() != null && attsch.get(2).getDajl().getId() == 888 && attsch.get(2).getDajl().getStatus() == 17 && attsch.get(3).getDajl().getId() != null && attsch.get(3).getDajl().getId() == 888 && attsch.get(3).getDajl().getStatus() == 17) { lcdkgb = false; } }else if(attdate.getAttsch().size() == 6) { if(attsch.get(4).getDajl().getId() != null && attsch.get(4).getDajl().getId() == 888 && attsch.get(4).getDajl().getStatus() == 17 && attsch.get(5).getDajl().getId()!= null && attsch.get(5).getDajl().getId() == 888 && attsch.get(5).getDajl().getStatus() == 17) { lcdkgb = false; } } } //当天最后一个班打完后 打卡按钮全部不显示(没打卡的显示缺卡) boolean isdkjj = true; if(attdate.getAttsch().size() == 2) { if(attsch.get(1).getDajl().getId() != null && attsch.get(1).getDajl().getDktime() != null) { isdkjj = false; if(attsch.get(0).getDajl().getId() == null && attsch.get(0).getDajl().getDktime() == null) { attsch.get(0).getDajl().setDktime(null); attsch.get(0).getDajl().setStatus(17);//缺卡 attsch.get(0).getDajl().setSort(attdate.getAttsch().get(0).getSort()); attsch.get(0).getDajl().setId(888); attdate.getAttsch().get(0).setIsdk(1); } } }else if(attdate.getAttsch().size() == 4) { if(attsch.get(3).getDajl().getId() != null && attsch.get(3).getDajl().getDktime() != null) { isdkjj = false; if(attsch.get(0).getDajl().getId() == null && attsch.get(0).getDajl().getDktime() == null) { attsch.get(0).getDajl().setDktime(null); attsch.get(0).getDajl().setStatus(17);//缺卡 attsch.get(0).getDajl().setSort(attdate.getAttsch().get(0).getSort()); attsch.get(0).getDajl().setId(888); attdate.getAttsch().get(0).setIsdk(1); } if(attsch.get(1).getDajl().getId() == null && attsch.get(1).getDajl().getDktime() == null && attsch.get(1).getDajl().getId() != 999) { attsch.get(1).getDajl().setDktime(null); attsch.get(1).getDajl().setStatus(17);//缺卡 attsch.get(1).getDajl().setSort(attdate.getAttsch().get(1).getSort()); attsch.get(1).getDajl().setId(888); attdate.getAttsch().get(1).setIsdk(1); } if(attsch.get(2).getDajl().getId() == null && attsch.get(2).getDajl().getDktime() == null) { attsch.get(2).getDajl().setDktime(null); attsch.get(2).getDajl().setStatus(17);//缺卡 attsch.get(2).getDajl().setSort(attdate.getAttsch().get(2).getSort()); attsch.get(2).getDajl().setId(888); attdate.getAttsch().get(2).setIsdk(1); } } }else if(attdate.getAttsch().size() == 6) { if(attsch.get(5).getDajl().getId() != null && attsch.get(5).getDajl().getDktime() != null) { isdkjj = false; if(attsch.get(0).getDajl().getId() == null && attsch.get(0).getDajl().getDktime() == null) { attsch.get(0).getDajl().setDktime(null); attsch.get(0).getDajl().setStatus(17);//缺卡 attsch.get(0).getDajl().setSort(attdate.getAttsch().get(0).getSort()); attsch.get(0).getDajl().setId(888); attdate.getAttsch().get(0).setIsdk(1); } if(attsch.get(1).getDajl().getId() == null && attsch.get(1).getDajl().getDktime() == null && attsch.get(1).getDajl().getId() != 999) { attsch.get(1).getDajl().setDktime(null); attsch.get(1).getDajl().setStatus(17);//缺卡 attsch.get(1).getDajl().setSort(attdate.getAttsch().get(1).getSort()); attsch.get(1).getDajl().setId(888); attdate.getAttsch().get(1).setIsdk(1); } if(attsch.get(2).getDajl().getId() == null && attsch.get(2).getDajl().getDktime() == null) { attsch.get(2).getDajl().setDktime(null); attsch.get(2).getDajl().setStatus(17);//缺卡 attsch.get(2).getDajl().setSort(attdate.getAttsch().get(2).getSort()); attsch.get(2).getDajl().setId(888); attdate.getAttsch().get(2).setIsdk(1); } if(attsch.get(3).getDajl().getId() == null && attsch.get(3).getDajl().getDktime() == null && attsch.get(3).getDajl().getId() != 999) { attsch.get(3).getDajl().setDktime(null); attsch.get(3).getDajl().setStatus(17);//缺卡 attsch.get(3).getDajl().setSort(attdate.getAttsch().get(3).getSort()); attsch.get(3).getDajl().setId(888); attdate.getAttsch().get(3).setIsdk(1); } if(attsch.get(4).getDajl().getId() == null && attsch.get(4).getDajl().getDktime() == null) { attsch.get(4).getDajl().setDktime(null); attsch.get(4).getDajl().setStatus(17);//缺卡 attsch.get(4).getDajl().setSort(attdate.getAttsch().get(4).getSort()); attsch.get(4).getDajl().setId(888); attdate.getAttsch().get(4).setIsdk(1); } } } // System.out.println(attsch.get(attdate.getAttsch().size()-1).getTime()); //全部为 1 时 iscrdk if(bccs == bc && b.before(d) && lcdkgb && isdkjj) { KqglAssoDkjl dk = KqglAssoDkjl.builder().build().selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().eq(KqglAssoDkjl::getQyid, userBean.getOrgCode()) .eq(KqglAssoDkjl::getUserId, userBean.getEmpNum()).ge(KqglAssoDkjl::getDktime, startDate).le(KqglAssoDkjl::getDktime, endDate) .ne(KqglAssoDkjl::getSort, 0).ne(KqglAssoDkjl::getStatus, 2).ne(KqglAssoDkjl::getStatus, 0) .orderByDesc(KqglAssoDkjl::getSort).last("LIMIT 1")); if(dk != null && attdate.getAttsch().size() != dk.getSort()) { AttSchedule att = attsch.get(dk.getSort()-cr); if(att.getDajl().getId() != null && att.getDajl().getStatus() != 17 && att.getDajl().getId() != 888) { att.setIsdk(0); AttSchedule attw = attsch.get(dk.getSort()-1); attw.setIsupdate(1); }else { AttSchedule att1 = attsch.get(dk.getSort()+cr); att1.setIsdk(0); AttSchedule attw = attsch.get(dk.getSort()+cr-1); attw.setIsupdate(1); } }else { if(iscrdk) { if(attdate.getAttsch().size() == 2) { AttSchedule attc = attsch.get(0); AttSchedule attcto = attsch.get(1); Timestamp tt1 = Timestamp.valueOf(ClockInTool.stampToDate(String.valueOf(attsch.get(0).getTime()))); Timestamp tt2 = Timestamp.valueOf(ClockInTool.stampToDate(String.valueOf(attsch.get(1).getTime()))); if(!dk1 && dk2) { attc.getDajl().setStatus(17);//缺卡 attc.getDajl().setSort(attc.getSort()); attc.getDajl().setId(888); attc.setIsdk(1); } if(!dk1 && !dk2 && b.after(tt1) && b.before(tt2)) { attcto.getDajl().setStatus(null);//缺卡 attcto.getDajl().setSort(null); attcto.getDajl().setId(null); attcto.setIsdk(0); } if(!dk1 && !dk2 && b.after(tt1) && b.after(tt2)) { attcto.getDajl().setStatus(17);//缺卡 attcto.getDajl().setSort(attc.getSort()); attcto.getDajl().setId(888); attcto.setIsdk(1); } }else if(attdate.getAttsch().size() == 4) { AttSchedule attc = attsch.get(0); if(attc.getDajl().getId() != null && attc.getDajl().getStatus() == 17 && attc.getDajl().getId() == 888) { attc.getDajl().setId(null); attc.getDajl().setSort(null); attc.getDajl().setStatus(null); } attc.setIsdk(0); } }else { if(crlasttime != null) { Timestamp dd = Timestamp.valueOf(crlasttime); if(dd.after(b)) {//after:大于 before:小于 AttSchedule attc = attsch.get(0); if(attc.getDajl().getId() != null && attc.getDajl().getStatus() == 17 && attc.getDajl().getId() == 888) { attc.getDajl().setId(null); attc.getDajl().setSort(null); attc.getDajl().setStatus(null); } attc.setIsdk(0); }else { AttSchedule attc = attsch.get(cr); Timestamp ag = Timestamp.valueOf(ClockInTool.stampToDate(String.valueOf(attc.getTime()))); if(ag.after(b)) { if(attc.getDajl().getId() != null && attc.getDajl().getStatus() == 17 && attc.getDajl().getId() == 888) { attc.getDajl().setId(null); attc.getDajl().setSort(null); attc.getDajl().setStatus(null); } attc.setIsdk(0); } } } } } //没有打卡按钮时 for(int y=0;y<bc;y++) { AttSchedule attc = attsch.get(y); if(attc.getDajl().getCardType() == null && attc.getDajl().getId() == null && attc.getDajl().getStatus() == null) { attc.setIsdk(0); break; } } } }else { //休息的时候 // List<AttSchedule> attsch_ = new ArrayList<AttSchedule>(); // attdate.setAttsch(attsch_); List<AttSchedule> attsch_ = new ArrayList<AttSchedule>(); if(dajllist_.size() > 0) { for(int i=1;i<=dajllist_.size();i++){ KqglAssoDkjl dkjl = KqglAssoDkjl.builder().build(); BeanUtil.copyProperties(dajllist_.get(i-1), dkjl,"attdate","bcid","remarks","userId","attime","dkmxid","commentary","punchequipment","punchmode"); AttSchedule ast = AttSchedule.builder().build(); ast.setId(0); ast.setIsdk(1); ast.setDajl(dkjl); ast.setSort(i); attsch_.add(ast); attdate.setAttsch(attsch_); } KqglAssoDkjl dkjj_ = KqglAssoDkjl.builder().build(); AttSchedule ast_ = AttSchedule.builder().build(); ast_.setId(0); ast_.setIsdk(0); ast_.setDajl(dkjj_); ast_.setSort(dajllist_.size() + 1); attsch_.add(ast_); attdate.setAttsch(attsch_); }else { KqglAssoDkjl dkjj = KqglAssoDkjl.builder().build(); AttSchedule ast = AttSchedule.builder().build(); ast.setId(0); ast.setIsdk(0); ast.setDajl(dkjj); ast.setSort(1); attsch_.add(ast); attdate.setAttsch(attsch_); } } }else { //自由工时 List<AttSchedule> attsch = new ArrayList<AttSchedule>(); if(dajllist_.size() > 0) { for(int i=1;i<=dajllist_.size();i++){ KqglAssoDkjl dkjl = KqglAssoDkjl.builder().build(); BeanUtil.copyProperties(dajllist_.get(i-1), dkjl,"attdate","bcid","remarks","userId","attime","dkmxid","commentary","punchequipment","punchmode"); AttSchedule ast = AttSchedule.builder().build(); ast.setId(0); ast.setIsdk(1); ast.setDajl(dkjl); ast.setSort(i); attsch.add(ast); attdate.setAttsch(attsch); } KqglAssoDkjl dkjj_ = KqglAssoDkjl.builder().build(); AttSchedule ast_ = AttSchedule.builder().build(); ast_.setId(0); ast_.setIsdk(0); ast_.setDajl(dkjj_); ast_.setSort(dajllist_.size() + 1); attsch.add(ast_); attdate.setAttsch(attsch); }else { KqglAssoDkjl dkjj = KqglAssoDkjl.builder().build(); AttSchedule ast = AttSchedule.builder().build(); ast.setId(0); ast.setIsdk(0); ast.setDajl(dkjj); ast.setSort(1); attsch.add(ast); attdate.setAttsch(attsch); } } List<TransactionApprovalDto> tranappr = new ArrayList<TransactionApprovalDto>(); //事务审批单 List<KqglAssoRelationSummary> trap = KqglAssoRelationSummary.builder().build().selectList(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum()) .eq(KqglAssoRelationSummary::getAppTime, str).eq(KqglAssoRelationSummary::getOrgCode, userBean.getOrgCode())); if(trap.size() > 0) { for(KqglAssoRelationSummary spnsw : trap) { if(spnsw.getApprovalType() != 5) { TransactionApprovalDto taap = TransactionApprovalDto.builder().build(); if(spnsw.getApprovalType() == 1) { taap.setCalendar_status_type(11); }else if(spnsw.getApprovalType() == 2) { KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getId,spnsw.getLeaveTypeId())); if(rul.getRulesType() != null) { if(rul.getRulesType() == 1) { taap.setCalendar_status_type(1); }else if(rul.getRulesType() == 2) { taap.setCalendar_status_type(2); }else if(rul.getRulesType() == 3) { taap.setCalendar_status_type(3); }else if(rul.getRulesType() == 4) { taap.setCalendar_status_type(4); }else if(rul.getRulesType() == 5) { taap.setCalendar_status_type(5); }else if(rul.getRulesType() == 6) { taap.setCalendar_status_type(6); }else if(rul.getRulesType() == 7) { taap.setCalendar_status_type(7); }else if(rul.getRulesType() == 8) { taap.setCalendar_status_type(8); }else if(rul.getRulesType() == 9) { taap.setCalendar_status_type(9); }else if(rul.getRulesType() == 10) { taap.setCalendar_status_type(10); } }else { taap.setCalendar_status_type(-1); taap.setCalendar_status_name(rul.getName()); } }else if(spnsw.getApprovalType() == 3) { taap.setCalendar_status_type(12); }else if(spnsw.getApprovalType() == 4) { taap.setCalendar_status_type(13); } taap.setApproval_form(spnsw.getApprovalId()); tranappr.add(taap); attdate.setTranappr(tranappr); } } }else { attdate.setTranappr(tranappr); } //外勤 true:开 false:关 if(attgro.getIsWq() == 1) { attdate.setFieldpersonnel(true); }else { attdate.setFieldpersonnel(false); } //打卡方式 List<AttGroupBinPunchMode> attmetlist = attgroupbinpunchmodemapper.selectByPrimaryByKqzId(attgro.getId()); for(AttGroupBinPunchMode agbp:attmetlist){ //类型(1:考勤机;2:地址;3:WIFI) if(agbp.getType() == 1){ attdate.setAttmachine(true); }else if(agbp.getType() == 2){ attdate.setAttaddress(true); }else{ attdate.setAttwifi(true); } } //详细打卡方式 List<AttClockMethod> akms = new ArrayList<AttClockMethod>(); for(AttGroupBinPunchMode abp:attmetlist){ if(abp.getType() == 1){ AttendanceMachine kqjs = attendancemachinemapper.selectByPrimaryKey(abp.getDkfsid()); AttClockMethod akm = AttClockMethod.builder().build(); if(kqjs != null) { akm.setName(kqjs.getName());// 打卡名称 akm.setMac("");// wifi【wifi】 akm.setAttrange(0);// 范围【地址】 akm.setType(1);// 类型(1:考勤机;2:地址;3:WIFI) akm.setLongitude(0);// 经度【地址】 akm.setLatitude(0);// 纬度【地址】 } akms.add(akm); }else if(abp.getType() == 2){ PunchCardAddress kqdzs = punchcardaddressmapper.selectByPrimaryKey(abp.getDkfsid()); AttClockMethod akm = AttClockMethod.builder().build(); if(kqdzs != null) { akm.setName(kqdzs.getName());// 打卡名称 akm.setMac("");// wifi【wifi】 akm.setAttrange(kqdzs.getDkfw());// 范围【地址】 akm.setType(2);// 类型(1:考勤机;2:地址;3:WIFI) akm.setLongitude(kqdzs.getLon());// 经度【地址】 akm.setLatitude(kqdzs.getLat());// 纬度【地址】 } akms.add(akm); }else{ PunchCardWiFi kqwfs = punchcardwifimapper.selectByPrimaryKey(abp.getDkfsid()); AttClockMethod akm = AttClockMethod.builder().build(); if(kqwfs != null) { akm.setName(kqwfs.getName());// 打卡名称 akm.setMac(kqwfs.getMac());// wifi【wifi】 akm.setAttrange(0);// 范围【地址】 akm.setType(3);// 类型(1:考勤机;2:地址;3:WIFI) akm.setLongitude(0);// 经度【地址】 akm.setLatitude(0);// 纬度【地址】 } akms.add(akm); } } attdate.setMachine(akms); //当天第一次打卡 前一天晚走小时************************************************** double latetime_ = 0;//前天晚走时长(分钟) Long changed_time = 0l;//晚到后应打卡时间 if(attdate.getAttgrouptype() != 3) { List<AttSchedule> ash = attdate.getAttsch(); if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && ash.get(0).getId() != 0) { KqglAssoBcsz shif = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ash.get(0).getId())); if(shif != null) { int dkcs_ = shif.getSxbcs();//上下班打卡次数 int iswzwd = shif.getIsWzwd();//是否开启晚走晚到(0:否;1:是) //统一分钟数 double xbwz1 = 0,xbwz2=0,xbwz3=0; int sbwd1=0,sbwd2=0,sbwd3=0; int arrive_late = 0;//晚到时间 String clock_date = "";//应打卡时间 Long latetime = 0l;//前天晚走时长(分钟) KqglAssoDkmx yesterdaymx = KqglAssoDkmx.builder().build(); AttendanceCardListDto attdateyesterday; long yesendtime1=0,yesendtime2=0,yesendtime3=0; String regex = "(\\d+)(?:(\\.\\d*[^0])|\\.)0*"; //存在晚走玩到 if(iswzwd > 0) { //统一分钟数 xbwz1 = Double.valueOf(shif.getXbwz1()) * 60;//下班晚走1 String as = String.valueOf(Double.valueOf(shif.getSbwd1()) * 60); sbwd1 = Integer.valueOf(as.replaceAll(regex, "$1$2"));//上班晚到1 xbwz2 = Double.valueOf(shif.getXbwz2()) * 60;//下班晚走2 String qw = String.valueOf(Double.valueOf(shif.getSbwd2()) * 60); sbwd2 = Integer.valueOf(qw.replaceAll(regex, "$1$2"));//上班晚到2 xbwz3 = Double.valueOf(shif.getXbwz3()) * 60;//下班晚走3 String ed = String.valueOf(Double.valueOf(shif.getSbwd3()) * 60); sbwd3 = Integer.valueOf(ed.replaceAll(regex, "$1$2"));//上班晚到3 //获取前一天最后下班的时间 yesterdaymx = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()) .ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())); attdateyesterday = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),yesterday); List<AttSchedule> ashyes = attdateyesterday.getAttsch(); if(attdateyesterday.getAttsch().size() == 2 || attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime1 = ashyes.get(1).getTime(); } if(attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) { yesendtime2 = ashyes.get(3).getTime(); } if(attdateyesterday.getAttsch().size() == 6) { yesendtime3 = ashyes.get(5).getTime(); } if(yesterdaymx != null) { if(dkcs_ == 1) { if(yesterdaymx.getXbdk1() != null && yesterdaymx.getXbdk1jg() == 0) { latetime = (yesterdaymx.getXbdk1() - yesendtime1)/1000/60; } }else if(dkcs_ == 2){ if(yesterdaymx.getXbdk2() != null && yesterdaymx.getXbdk2jg() == 0) { latetime = (yesterdaymx.getXbdk2() - yesendtime2)/1000/60; } }else { if(yesterdaymx.getXbdk3() != null && yesterdaymx.getXbdk3jg() == 0) { latetime = (yesterdaymx.getXbdk3() - yesendtime3)/1000/60; } } } if(latetime != 0) { latetime_ = Double.valueOf(String.valueOf(latetime));//前天晚走时长(分钟) if(latetime_ > xbwz1 && latetime_ < xbwz2) { arrive_late = sbwd1; }else if(latetime_ > xbwz2 && latetime_ < xbwz3) { arrive_late = sbwd2; }else if(latetime_ > xbwz3) { arrive_late = sbwd3; } //ash.get(0).getTime():当天第一次应打卡时间 clock_date = ClockInTool.stampToDate(String.valueOf(ash.get(0).getTime())); changed_time = Long.valueOf(ClockInTool.dateToStamp(ClockInTool.addtime(clock_date, "+"+arrive_late)));//晚到后应打卡时间 } } attdate.setLatetime(latetime_); attdate.setChanged_time(changed_time); } } } return ResultUtil.data(attdate); }else { AttendanceCardListDto attdate_ = AttendanceCardListDto.builder().build(); return ResultUtil.data(attdate_,"未加入考勤组"); } } private SimpleDateFormat mat = new SimpleDateFormat("yyyy-MM-dd"); @Autowired private KqglAssoTeshuMapper kqglassoteshumapper; @Autowired private AttendanceWeeklySchMapper attendanceweeklyschmapper; @Autowired private ScheduleMapper schedulemapper; /** * APP 手机日历数据 * @param userBean * @return * @throws ParseException */ @GetMapping(value = "/workbench_calendar/{date}") @ApiOperation(value = "手机日历数据", httpMethod = "GET", notes = "查询数据") public Result<Object> Workbench_calendar(@CurrentUser UserBean userBean,@PathVariable("date") String date) throws ParseException { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 String current = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); String yue = new SimpleDateFormat("yyyy-MM").format(new Date()); SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM"); Date date_; try { date_ = df1.parse(date); }catch (ParseException e){ e.printStackTrace(); date_=new Date(); } // int dateOne= ClockInTool.getYearMonth(date_); // 准备第一个模板,从字符串中提取出日期数字 String pat1 = "yyyy-MM" ; String pat = "yyyyMM"; SimpleDateFormat sdfi = new SimpleDateFormat(pat1) ; // 实例化模板对象 SimpleDateFormat sdf = new SimpleDateFormat(pat) ; // 实例化模板对象 Date d = null ; try{ d = sdfi.parse(date) ; // 将给定的字符串中的日期提取出来 }catch(Exception e){ // 如果提供的字符串格式有错误,则进行异常处理 e.printStackTrace() ; // 打印异常信息 } int dateOne = Integer.valueOf(sdf.format(d)); int dangqian = Integer.valueOf(new SimpleDateFormat("yyyyMM").format(new Date()));//当前 List<WorkbenchCalendarDto> workcal = new ArrayList<WorkbenchCalendarDto>(); if(dateOne<=dangqian){ Long startMonth = 0l; Long endMonth = 0l; if(date == null || ("").equals(date)) { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, 0); c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 String first = mat.format(c.getTime()); startMonth = DateUtil.getStartTime(0,DateUtil.getStringTime(first,"yyyy-MM-dd")).getTime(); endMonth = new Date().getTime(); }else { String time = date+"-01"; String sdaet = ClockInTool.getMinMonthDate(time); startMonth = ClockInTool.getStartTime(0,ClockInTool.getStringTime(sdaet,"yyyy-MM-dd")).getTime(); String edate = ClockInTool.getMaxMonthDate(time); endMonth = ClockInTool.getnowEndTime(23,ClockInTool.getStringTime(edate,"yyyy-MM-dd")).getTime(); if(date.equals(yue)) { endMonth = new Date().getTime(); } } String[] rangeArray=ClockInTool.listToString(ClockInTool.getDays(df.format(startMonth),df.format(endMonth))).split(";");//目前为止所有日期 String[] range=rangeArray[0].split(","); KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //考勤组信息 for(String num : range) { Long start_time = DateUtil.getStartTime(0,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime(); Long end_time = DateUtil.getnowEndTime(23,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime(); WorkbenchCalendarDto wocal = WorkbenchCalendarDto.builder().build(); wocal.setDate(num); if(attgro != null) {//有无考勤组 AttendanceCardListDto attdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),num);//获取当天所打卡班次 List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间 if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && attdate.getAttgrouptype() != 3) {//班次不为空 KqglAssoBcsz bcsts = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ashss.get(0).getId())); if(ashss.get(0).getId() != 0) { KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode()) .ge(KqglAssoDkmx::getDksj, start_time).le(KqglAssoDkmx::getDksj, end_time)); if(dkmc != null) { if(attdate.getAttsch().size() == 2 || attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { if(dkmc.getSbdk1() != null && dkmc.getSbdk1jg() == 0 && dkmc.getXbdk1() != null && dkmc.getXbdk1jg() == 0) { wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { if(dkmc.getXbdk1() == null && attdate.getAttsch().size() == 2) { if(bcsts.getIsXbdk()==1) {//下班不用打卡 wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } } } if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) { if(dkmc.getSbdk2() != null && dkmc.getSbdk2jg() == 0 && dkmc.getXbdk2() != null && dkmc.getXbdk2jg() == 0) { wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { if(dkmc.getXbdk2() == null && attdate.getAttsch().size() == 4) { if(bcsts.getIsXbdk()==1) {//下班不用打卡 wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } } } if(attdate.getAttsch().size() == 6) { if(dkmc.getSbdk3() != null && dkmc.getSbdk3jg() == 0 && dkmc.getXbdk3() != null && dkmc.getXbdk3jg() == 0) { wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { if(dkmc.getXbdk3() == null && attdate.getAttsch().size() == 6) { if(bcsts.getIsXbdk()==1) {//下班不用打卡 wocal.setCalendar_status(1);//打卡正常 wocal.setCalendar_status_type(0); }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } } } // KqglAssoRelationSummary asssum = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum()) // .eq(KqglAssoRelationSummary::getAppTime, num).last("LIMIT 1")); // if(asssum != null) { // wocal.setCalendar_status(2);//事务(请假,加班,调休,出差) // } }else { wocal.setCalendar_status(3);//打卡异常 wocal.setCalendar_status_type(0); } //事务(请假,加班,调休,出差) KqglAssoRelationSummary asssum = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum()) .eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getOrgCode, userBean.getOrgCode()).last("LIMIT 1")); if(asssum != null) { if(asssum.getApprovalType() == 5) {//补卡 wocal.setCalendar_status(1);//打卡正常 }else { wocal.setCalendar_status(2);//事务(请假,加班,调休,出差) } //0:无;1:事假;2:调休;3:病假;4:年假;5:产假;6:陪产假;7:婚假;8:例假;9:丧假;10:哺乳假;11:加班;12:出差;13:外出 if(asssum.getApprovalType() == 1) { wocal.setCalendar_status_type(11); }else if(asssum.getApprovalType() == 2) { //请假 KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getId,asssum.getLeaveTypeId())); if(rul.getRulesType() == 1) { wocal.setCalendar_status_type(1); }else if(rul.getRulesType() == 2) { wocal.setCalendar_status_type(2); }else if(rul.getRulesType() == 3) { wocal.setCalendar_status_type(3); }else if(rul.getRulesType() == 4) { wocal.setCalendar_status_type(4); }else if(rul.getRulesType() == 5) { wocal.setCalendar_status_type(5); }else if(rul.getRulesType() == 6) { wocal.setCalendar_status_type(6); }else if(rul.getRulesType() == 7) { wocal.setCalendar_status_type(7); }else if(rul.getRulesType() == 8) { wocal.setCalendar_status_type(8); }else if(rul.getRulesType() == 9) { wocal.setCalendar_status_type(9); }else if(rul.getRulesType() == 10) { wocal.setCalendar_status_type(10); } }else if(asssum.getApprovalType() == 3) { wocal.setCalendar_status_type(12); }else if(asssum.getApprovalType() == 4) { wocal.setCalendar_status_type(13); } } }else { wocal.setCalendar_status(4);//休息 wocal.setCalendar_status_type(0); } }else { wocal.setCalendar_status(0);//无排班 wocal.setCalendar_status_type(0); } }else { wocal.setCalendar_status(0);//无排班 wocal.setCalendar_status_type(0); } workcal.add(wocal); } //当月后续补贴数据 if(date == null || ("").equals(date) || date.equals(yue)) { int pbfs = 0; String next_day = ClockInTool.requires_extra_times(current,1,2,1); Calendar ca = Calendar.getInstance(); ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); String last = mat.format(ca.getTime()); Long endMonth_ = DateUtil.getnowEndTime(23,DateUtil.getStringTime(last,"yyyy-MM-dd")).getTime(); String[] nextrangeArray=ClockInTool.listToString(ClockInTool.getDays(next_day,sdf1.format(endMonth_))).split(";");//目前为止所有日期 String[] nextrange=nextrangeArray[0].split(","); String ttstr = date;// String[] ycqts = new String[31];//应上班的具体天数(yyyy-MM-dd) String[] xxts = new String[31];//休息的具体天数(yyyy-MM-dd) if(attgro != null){//该员工是否加入到考勤组 排班方式 1:固定排班;2:自由排班;3:自由工时 计算出应出勤,实际出勤,休息天数 if(attgro.getPbfs() == 1){ //固定排班 pbfs = 1; List<KqglAssoTeshu> bxdklist = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), ttstr,1);//当前月 必须打卡日期 int bxdk = bxdklist.size(); String[] bxdkss = new String[bxdk];////特殊-必须打卡天数(工作日) int b = 0; for(KqglAssoTeshu bxd : bxdklist) { bxdkss[b] = bxd.getTsrq(); b++; } List<KqglAssoTeshu> wxdk = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), ttstr,2);//当前月 无需打卡日期 String[] appmaps= new String[wxdk.size()];//特殊-无需打卡天数(休息日) int d1 = 0; for(KqglAssoTeshu spe:wxdk){ appmaps[d1] = spe.getTsrq(); d1++; } //应打卡周期时间 List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByUserid(userBean.getEmpNum(),userBean.getOrgCode()); String[] week= new String[atwek.size()]; String[] needfig = new String[atwek.size()];//应打卡周期时间 int e = 0; for(AttendanceWeeklySch awek : atwek){ week[e] = awek.getWekmc(); needfig[e] = String.valueOf(awek.getType());//获取设置的应打卡周几 e++; } //目前为止应出勤天数 int w = 0,x=0; int zj = 6; if(!(nextrange[0]).equals("")) { for(String num : nextrange) { if(Arrays.binarySearch(needfig, String.valueOf(ClockInTool.dateToWeek(num))) >= 0) {//对比排班应打卡时间 String[] ycqtst = new String[ycqts.length + zj]; System.arraycopy(ycqts, 0, ycqtst, 0, ycqts.length); ycqtst[w] = num; ycqts = ycqtst; w++; }else { String[] xxtst = new String[xxts.length + zj]; System.arraycopy(xxts, 0, xxtst, 0, xxts.length); xxtst[x] = num; xxts = xxtst; x++; } if(Arrays.binarySearch(bxdkss, num) >= 0) {//检查是否存在 必须打卡名单中 String[] ycqtst = new String[ycqts.length + zj]; System.arraycopy(ycqts, 0, ycqtst, 0, ycqts.length); ycqtst[w] = num; ycqts = ycqtst; w++; xxts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(xxts), num);//为必须上班的话从休息日期中去除 } if(Arrays.binarySearch(appmaps, num) >= 0) {//检查是否存在 无需打卡名单中 if(ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num) != null) { ycqts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num);//为必须休息的话从上班日期中去除 } String[] xxtst = new String[xxts.length + zj]; System.arraycopy(xxts, 0, xxtst, 0, xxts.length); xxtst[x] = num; xxts = xxtst; x++; } } } }else if(attgro.getPbfs() == 2){ //自由排班 pbfs = 2; DateFormat df11 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); List<Schedule> ycqs = schedulemapper.getAttendanceShouldList(userBean.getEmpNum(),startMonth,endMonth); int z=0; String[] ziyoupb = new String[ycqs.size()]; for(Schedule sc : ycqs){ String data = new SimpleDateFormat("yyyy-MM-dd").format(df11.parse(String.valueOf(sc.getData())));// 获得格式化后的日期字符串 ziyoupb[z] = data; z++; } //目前为止应出勤天数 int y = 0,x=0; for(String num : nextrange) { if(Arrays.binarySearch(ziyoupb, num) >= 0) { KqglAssoPbmx pbx = KqglAssoPbmx.builder().build().selectOne(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, userBean.getEmpNum()).eq(KqglAssoPbmx::getData, num).eq(KqglAssoPbmx::getKqzid, attgro.getId())); if(pbx!=null && pbx.getBcid()!=0) { ycqts[y] = num; y++; }else { xxts[x] = num; x++; } } } }else{ pbfs = 3; List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByUserid(userBean.getEmpNum(),userBean.getOrgCode()); String[] week= new String[atwek.size()]; int e = 0; String[] ziyoupb = new String[atwek.size()]; for(AttendanceWeeklySch awek : atwek){ week[e] = awek.getWekmc(); ziyoupb[e] = String.valueOf(awek.getType()); e++; } //目前为止应出勤天数 int g = 0,x=0; for(String num : nextrange) { if(Arrays.binarySearch(ziyoupb, String.valueOf(ClockInTool.dateToWeek(num))) >= 0) {//对比排班应打卡时间 ycqts[g] = num; g++; }else { xxts[x] = num; x++; } } } } if(!(nextrange[0]).equals("")) { for(String nus : nextrange) { WorkbenchCalendarDto wocal = WorkbenchCalendarDto.builder().build(); wocal.setDate(nus); if(pbfs == 3) { wocal.setCalendar_status(0);// wocal.setCalendar_status_type(0); }else { if(ClockInTool.contains(ClockInTool.deleteArrayNull(ycqts),nus)) { wocal.setCalendar_status(1);// wocal.setCalendar_status_type(0); } if(ClockInTool.contains(ClockInTool.deleteArrayNull(xxts),nus)) { wocal.setCalendar_status(4);// wocal.setCalendar_status_type(0); } } workcal.add(wocal); } } } }else { String time = date+"-01"; String sdaet = ClockInTool.getMinMonthDate(time); Long startMonth = ClockInTool.getStartTime(0,ClockInTool.getStringTime(sdaet,"yyyy-MM-dd")).getTime(); String edate = ClockInTool.getMaxMonthDate(time); Long endMonth = ClockInTool.getnowEndTime(23,ClockInTool.getStringTime(edate,"yyyy-MM-dd")).getTime(); //固定排班 String[] rangeArray=ClockInTool.listToString(ClockInTool.getDays(df.format(startMonth),df.format(endMonth))).split(";");//目前为止所有日期 String[] range=rangeArray[0].split(","); /******************/ String[] ycqts = new String[31];//应上班的具体天数(yyyy-MM-dd) String[] xxts = new String[31];//休息的具体天数(yyyy-MM-dd) //考勤组信息 KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //固定排班 if(attgro.getPbfs() == 1) { List<KqglAssoTeshu> bxdklist = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), date,1);//当前月 必须打卡日期 int bxdk = bxdklist.size(); String[] bxdkss = new String[bxdk];////特殊-必须打卡天数(工作日) int b = 0; for(KqglAssoTeshu bxd : bxdklist) { bxdkss[b] = bxd.getTsrq(); b++; } List<KqglAssoTeshu> wxdk = kqglassoteshumapper.ShouldSpecialDatessetByKqzid(attgro.getId(), date,2);//当前月 无需打卡日期 String[] appmaps= new String[wxdk.size()];//特殊-无需打卡天数(休息日) int d1 = 0; for(KqglAssoTeshu spe:wxdk){ appmaps[d1] = spe.getTsrq(); d1++; } //应打卡周期时间 List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByUserid(userBean.getEmpNum(),userBean.getOrgCode()); String[] week= new String[atwek.size()]; String[] needfig = new String[atwek.size()];//应打卡周期时间 int e = 0; for(AttendanceWeeklySch awek : atwek){ week[e] = awek.getWekmc(); needfig[e] = String.valueOf(awek.getType());//获取设置的应打卡周几 e++; } //目前为止应出勤天数 int w = 0,x=0; int zj = 6; for(String num : range) { if(ClockInTool.useArrayUtils(needfig, String.valueOf(ClockInTool.dateToWeek(num)))) {//对比排班应打卡时间 String[] ycqtst = new String[ycqts.length + zj]; System.arraycopy(ycqts, 0, ycqtst, 0, ycqts.length); ycqtst[w] = num; ycqts = ycqtst; w++; }else { String[] xxtst = new String[xxts.length + zj]; System.arraycopy(xxts, 0, xxtst, 0, xxts.length); xxtst[x] = num; xxts = xxtst; x++; } if(ClockInTool.useArrayUtils(bxdkss, num)) {//检查是否存在 必须打卡名单中 String[] ycqtst = new String[ycqts.length + zj]; System.arraycopy(ycqts, 0, ycqtst, 0, ycqts.length); ycqtst[w] = num; ycqts = ycqtst; w++; xxts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(xxts), num);//为必须上班的话从休息日期中去除 } if(ClockInTool.useArrayUtils(appmaps, num)) {//检查是否存在 无需打卡名单中 ycqts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num);//为必须休息的话从上班日期中去除 String[] xxtst = new String[xxts.length + zj]; System.arraycopy(xxts, 0, xxtst, 0, xxts.length); xxtst[x] = num; xxts = xxtst; x++; } } /******************/ for(String num : range) { WorkbenchCalendarDto wocal = WorkbenchCalendarDto.builder().build(); wocal.setDate(num); if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ycqts), num)) { wocal.setCalendar_status(1);// } if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xxts), num)) { wocal.setCalendar_status(4);// } if(!ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ycqts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xxts), num)) { wocal.setCalendar_status(0);// } workcal.add(wocal); } } } return ResultUtil.data(workcal, "操作成功!"); } }