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.KqglAssoMonthPunchSummaryDto;
import cn.timer.api.dto.kqmk.KqglAssoPbmxDto;
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.ApiModelProperty;
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::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(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 {
								//无记录的话就找昨天的数据
//								AttendanceCardListDto attdate1 = MethodCall(qyid,userid,yesterday);
							}
							
							if(crdk && dnck) {
								dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid)
										.ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday));
								attdate = MethodCall(qyid,userid,yesterday);
								attendance_date = startDateyesterday;
								toweek = yesterday;
							}else {
								dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid)
										.ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate));
								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; 
									if(attdate.getAttsch().size() > 0) {
										 List<AttSchedule> 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) {
									 
										 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)
																.ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday));
													 attdateyesterday = MethodCall(qyid,userid,yesterday);
													 
													 List<AttSchedule> ash = attdateyesterday.getAttsch();
													 if(attdateyesterday.getAttsch().size() == 2 || attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) {
														 yesendtime1 = ash.get(1).getTime();
													 }
												 	 if(attdateyesterday.getAttsch().size() == 4 || attdateyesterday.getAttsch().size() == 6) {
												 		yesendtime2 = ash.get(3).getTime();
													 }
												 	 if(attdateyesterday.getAttsch().size() == 6) {
												 		yesendtime3 = ash.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 {
						//自由工时打卡
						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)
									.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)
									.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 {//修改	
							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;
									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);//修改打卡记录
								}
								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;
									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);//修改打卡记录
								}
								 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;
									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);//修改打卡记录
								}
								
								 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:成功
		 
		 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 putime = new SimpleDateFormat("yyyy-MM-dd").format(Double.valueOf(clock.getPunchtime()));//转换打卡时间格式
		     
			 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;//应打卡时间,应打卡开始时间,应打卡结束时间
		     
		     ClockCollectData clockt = new ClockCollectData();
//			 putime: 根据日期  得到打卡所需的详细信息
			 AttendanceCardListDto attdate = MethodCall(qyid,userid,putime);
			 if(attgro != null) {//判断考勤组是否存在
				 
				 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::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(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 {
						//无记录的话就找昨天的数据
//						AttendanceCardListDto attdate1 = MethodCall(qyid,userid,yesterday);
					}
					if(crdk && dnck) {
						dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid)
								.ge(KqglAssoDkmx::getDksj, startDateyesterday).le(KqglAssoDkmx::getDksj, endDateyesterday));
						attdate = MethodCall(qyid,userid,yesterday);
						attendance_date = startDateyesterday;
						toweek = yesterday;
					}else {
						dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userid)
								.ge(KqglAssoDkmx::getDksj, startDate).le(KqglAssoDkmx::getDksj, endDate));
						attendance_date = startDate;
						toweek = putime;
					}
					
					if(EmptyUtil.isEmpty(attdate.getAttsch())) {
						msg = "当前未排班";
						sbyf = 0;
					}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; 
						if(attdate.getAttsch().size() > 0) {
							 List<AttSchedule> 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_:打卡时间
							 			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();
										    	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 = 1;
											}
						 				}
						 			}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) {
							
							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 yzcd = shif.getYzcdfzs();//严重迟到分钟数
								 int kgcdfzs  = shif.getKgcdfzs();//旷工迟到分钟数 
								 
								 //班次的休息时间
								 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;//休息时间
								 }
								 
								 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;
									 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(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;}//应打卡次数
									 if(sbdkjg > yzcd && yzcd>0) {
										 yzcdcs++;
										 yzcdsc = sbdkjg - yzcd;
									 }
									 if(sbdkjg > kgcdfzs && kgcdfzs>0) {kgcdcs++;}
									 pcd.setYdkcs(ydkcs);
									 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;
										 if(punchcardtime != 0){//有应打卡时间时
											 Long time = (time_ - punchcardtime)/1000/60;
											 if(time > 0){sbdk2jg = Math.abs(Integer.valueOf(time.toString()));}
										 }
										 if(sbdk2jg > yzcd&& yzcd>0) {
											 yzcdcs = dkmc.getYzcdcs()+1;
											 yzcdsc = sbdk2jg - yzcd;
										 }
										 if(sbdk2jg > kgcdfzs&& kgcdfzs>0) {kgcdcs++;}
										 
										 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;
										 if(punchcardtime != 0){//有应打卡时间时
											 Long time = (time_ - punchcardtime)/1000/60;
											 if(time > 0){sbdk3jg = Math.abs(Integer.valueOf(time.toString()));}
										 }
										 if(sbdk3jg > yzcd&& yzcd>0) {
											 yzcdcs = dkmc.getYzcdcs()+1;
											 yzcdsc = sbdk3jg - yzcd;
										 }
										 if(sbdk3jg > kgcdfzs&& kgcdfzs>0) {kgcdcs++;}
										 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;
							 }
						}else {
						  msg = "当前是休息时间";
						  sbyf = 0;
						}
					}
				 }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)
								.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)
								.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;
							}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;
							}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;
							}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;
				}
				
				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 = "";//考勤备注
				String punchequipment = "";//打卡设备
				
				String commentary = "未知";
				if(sbyf == 1) {
					commentary = "打卡成功";
					msg = "打卡成功";
				}else {
					commentary = msg;
				}
				
				
				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 current = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		 
		 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());
		 
		 String nowtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").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;
			 List<KqglAssoDkjl> dajllist_ = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDate,userBean.getEmpNum());
			 
			 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 bccs = attdate.getAttsch().size();
					 int r = 1,bc = 0;
					 int bsz = 0;
					 for(AttSchedule ash : attsch) {
						 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 {
										 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 {
										 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);
							 }
							 
							//是否请假
					        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);
							}
						 }
						 
						 ////
//						 List<KqglAssoDkjl> dajllist_ = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDate,userBean.getEmpNum());
//						 dkcs = dajllist_.size();
						 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(bcsz != null) {
									 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);
								 }
							 }
						 }
						 
						 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) {
							 dkjl.setDktime(null);
							 dkjl.setStatus(17);//缺卡
							 dkjl.setSort(ash.getSort());
							 dkjl.setId(888);
							 //更新打卡关闭
							 ash.setIsupdate(0);
						 }
						 
						 //
						 if(ash.getIsdk() == 1 && b.after(tt) && dkjl.getDktime() == null && dkjl.getId() == null && dkcs > 0) {
							 dkjl.setStatus(17);//缺卡
							 dkjl.setSort(ash.getSort());
							 dkjl.setId(888);
							 //更新打卡关闭
							 ash.setIsupdate(0);
						 }
						 
						 /****/
							//事务(请假,加班,调休,出差)
	 		    			KqglAssoRelationSummary asssum1 = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum())
			    						.eq(KqglAssoRelationSummary::getAppTime, str).last("LIMIT 1"));
			    				if(asssum1 != null) {
			    					
			    					//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() == 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 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"));
						 
						 AttSchedule att = attsch.get(dk.getSort()-1);
						 att.setIsupdate(1);
						 
						 AttSchedule attw = attsch.get(dk.getSort()-2);
						 attw.setIsupdate(0);
					 }
					 
					 //全部为 1 时
					 if(bccs == bc && b.before(d) && lcdkgb) {
						 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());
							 att.setIsdk(0);
							 
							 AttSchedule attw = attsch.get(dk.getSort()-1);
							 attw.setIsupdate(1);
						 }else {
							 AttSchedule attc = attsch.get(0);
							 attc.setIsdk(0);
						 }
					 }
				 }else {
					 //休息的时候
					 List<AttSchedule> attsch_ = new ArrayList<AttSchedule>();
					 attdate.setAttsch(attsch_);
				 }
				 
				 
			 }else {
				 //自由工时
				 List<AttSchedule> attsch = new ArrayList<AttSchedule>();
				 
//				 List<KqglAssoDkjl> dajllist_ = kqglassodkjlmapper.getDetailedRecordClock(startDate,endDate,userBean.getEmpNum());
//				 KqglAssoDkjl dkjl = KqglAssoDkjl.builder().build();
				 
				 if(dajllist_.size() > 0) {
					 for(int i=1;i<=dajllist_.size();i++){
						 KqglAssoDkjl dkjl = KqglAssoDkjl.builder().build();
//						 for(KqglAssoDkjl ddk : dajllist_) {
							 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);
				 }
			 }
			 
			   //外勤   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();
			    		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();
			    		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();
			    		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));
							 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_);
	        int dangqian = ClockInTool.getYearMonth(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);
	    			    					}
//	    			    					wocal.setCalendar_status(3);//打卡异常
	    			    				}
	    			    			}
	    		    				
	    		    				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);
	    			    					}
//	    			    					wocal.setCalendar_status(3);//打卡异常
	    			    				}
	    		    				}
	    		    				
	    		    				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);
	    			    					}
//	    			    					wocal.setCalendar_status(3);//打卡异常
	    			    				}
	    		    				}
	    		    				
//	    		    				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).last("LIMIT 1"));
    		    				if(asssum != null) {
    		    					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) {//检查是否存在 无需打卡名单中
											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++;
								 }
						     }
						}
		    		}
					
					
		    		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);
		    		}
		    		
	    		}
	        }
			
			return ResultUtil.data(workcal, "操作成功!");
		}
	 
	 
	
}