package cn.timer.api.controller.kqgl;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
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.json.JSONObject;
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.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.exception.CustomException;
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.KqglMainKqzMapper;
import cn.timer.api.dto.kqmk.AttLateLate;
import cn.timer.api.dto.kqmk.AttSchedule;
import cn.timer.api.dto.kqmk.AttendanceCardListDto;
import cn.timer.api.dto.kqmk.ClockCollectData;
import cn.timer.api.dto.kqmk.KqglAssoPbmxDto;
import cn.timer.api.utils.DateUtil;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = "3.0[3]考勤打卡")
@RestController
@Transactional
@RequestMapping(value = "/kqdk", produces = { "application/json", "multipart/form-data" })
public class ClockInController {
	@Autowired
	private KqglMainKqzMapper kqglmainkqzmapper;
	
	//打卡明细表
	@Autowired
	private KqglAssoDkmxMapper kqglassodkmxmapper;
	
	@Autowired
	private KqglAssoDkjlMapper kqglassodkjlmapper;
	
	@Autowired
	private KqglAssoBcszMapper kqglassobcszmapper;
	
	
	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:成功
		
		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_);//转换打卡时间格式 年月日
			//打卡当天开始时间,打卡当天结束时间
			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,punchend = 0;//应打卡时间,应打卡开始时间,应打卡结束时间
			boolean isRange = true;
			int atttype = 0;
			
			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();
							
							//putime: 根据日期  得到打卡所需的详细信息
		//					AttendanceCardListDto attdate = MethodCall(qyid,userid,putime);
							
							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();//获取今天应打卡时间
//								boolean dnck = false;
								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:是)
//								boolean crdk = false;//当次打卡是否存在次日打卡
								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));
	//							attdate = MethodCall(qyid,userid,putime);
								attendance_date = startDate;
								toweek = putime;
							}
							
							//putime: 根据日期  得到打卡所需的详细信息
		//					AttendanceCardListDto attdate = MethodCall(qyid,userid,putime);
		//					ClockCollectData clockt = new ClockCollectData();
					
							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();
									 }
								 }
								
			//					 long punchcardtime,punchstart,punchend = 0;//应打卡时间,应打卡开始时间,应打卡结束时间
			//					 int atttype = 0;
								 if(dkmc == null) {//上班1   ****新增
									 punchcardtime = starttime1;
									 punchstart = starttime1ks;
							    	 punchend = starttime1js;
									 atttype = 1;
								 }else {
									 if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() == null)){	//下班1
										 punchcardtime = endtime1;
										 punchstart = endtime1ks;
										 punchend = endtime1js;
										 atttype = 2;
								     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
								    		 && (("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() == null)){	//上班2
								    	 punchcardtime = starttime2;
								    	 punchstart = starttime2ks;
								    	 punchend = starttime2js;
								    	 atttype = 3;
								     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
								    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() == null)){	//下班2
								    	 punchcardtime = endtime2;
								    	 punchstart = endtime2ks;
								    	 punchend = endtime2js;
								    	 atttype = 4;
								     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
								    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
								    		 && (("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() == null)){	//上班3
								    	 punchcardtime = starttime3;
								    	 punchstart = starttime3ks;
								    	 punchend = starttime3js;
								    	 atttype = 5;
								     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
								    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
								    		 && (!("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() != null) && (("").equals(dkmc.getXbdk3()) || dkmc.getXbdk3() == null)){	//下班3
								    	 punchcardtime = endtime3;
								    	 punchstart = endtime3ks;
								    	 punchend = endtime3js;
								    	 atttype = 6;
								     }else {
								    	 punchcardtime = 0;punchstart = 0;punchend = 0;atttype = 7;
								     }
								 }
								 
								 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()));
									 }
								 
									//打卡记录录入 -- 打卡是否有时间范围限制
			//							boolean isRange = true;
										if(punchstart>0 && punchend>0) {
											 String staputime = new SimpleDateFormat("HH:mm").format(punchstart);//应打卡开始时间
											 String entputime = new SimpleDateFormat("HH:mm").format(punchend);//应打卡结束时间
											 String DKputime = new SimpleDateFormat("HH:mm").format(time_);//打卡时间
											 boolean effectiveDate = ClockInTool.hourMinuteBetween(DKputime, staputime, entputime,"HH:mm");
											 if (!effectiveDate) {
												 System.out.println("当前打卡时间不在范围内");
												// 手动抛出异常
												 isRange = false;
			//									throw new Exception();
											 }
										 }
										if(isRange) {
											int yzcd = shif.getYzcdfzs();//严重迟到分钟数
											int kgcdfzs  = shif.getKgcdfzs();//旷工迟到分钟数 
											 if(dkmc == null) {//上班1   ****新增
												 int sbdk1jg = 0,yzcdsc = 0,yzcdcs = 0,kgcdcs = 0;
												 if(punchcardtime != 0){//有应打卡时间时
													 Long time = (time_ - punchcardtime)/1000/60;
													 if(time > 0){sbdk1jg = Math.abs(Integer.valueOf(time.toString()));}//上班1打卡结果
												 }
												 int ydkcs = 0;
												 if(shif != null){ydkcs = shif.getSxbcs()*2;}//应打卡次数
												 if(sbdk1jg > yzcd) {
													 yzcdcs++;
													 yzcdsc = sbdk1jg - yzcd;
												 }
												 if(sbdk1jg > kgcdfzs) {kgcdcs++;}
												 KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(userid).data(putime).sbdk1(time_).sbdk1jg(sbdk1jg).ydkcs(ydkcs).qyid(qyid).dksj(startDate).yzcdcs(yzcdcs).yzcdsc(Double.valueOf(yzcdsc)).kgcdfzs(kgcdcs).build();
												 if (!pcd.insert()) {
													throw new CustomException("打卡明细-新增异常-1");
												 }
												 dkmx = pcd.getId();
											 }else { //*****修改
												 dkmx = dkmc.getId();
												 KqglAssoDkmx pcd = KqglAssoDkmx.builder().build();
												 
												 if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() == null)){//下班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())));//上班1打卡结果
														 }
													 }
													 
													 if(dkmc.getSbdk1() != null){
														Long time = (time_ - dkmc.getSbdk1())/1000/60;
														pcd.setGzsc(Math.abs(Double.valueOf(time.toString())));//只打一次卡时计算工作时长
													 }
													 kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录
													 
											     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
											    		 && (("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() == null)){//上班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) {
														 yzcdcs = dkmc.getYzcdcs()+1;
														 yzcdsc = sbdk2jg - yzcd;
													 }
													 if(sbdk2jg > kgcdfzs) {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((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
											    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() == null)){//下班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);
														 double worktime = Math.abs(om.add(on).doubleValue());
														 pcd.setGzsc(worktime);
													 }
													 kqglassodkmxmapper.updateByPrimaryKeySelective(pcd);//修改打卡记录
													 
											     }else if((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
											    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
											    		 && (("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() == null)){//上班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) {
														 yzcdcs = dkmc.getYzcdcs()+1;
														 yzcdsc = sbdk3jg - yzcd;
													 }
													 if(sbdk3jg > kgcdfzs) {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((!("").equals(dkmc.getSbdk1()) || dkmc.getSbdk1() != null) && (!("").equals(dkmc.getXbdk1()) || dkmc.getXbdk1() != null)
											    		 && (!("").equals(dkmc.getSbdk2()) || dkmc.getSbdk2() != null) && (!("").equals(dkmc.getXbdk2()) || dkmc.getXbdk2() != null)
											    		 && (!("").equals(dkmc.getSbdk3()) || dkmc.getSbdk3() != null) && (("").equals(dkmc.getXbdk3()) || dkmc.getXbdk3() == null)){//下班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);
														 double worktime = Math.abs(om.add(on).doubleValue());
														 pcd.setGzsc(worktime);
													 }
													 
											     }
												 pcd.setId(dkmc.getId());
												 if(atttype <= 6){
													 int update = 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 {//修改	
							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;
								}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;
								}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;
								}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;
				}
				
/*************************************************************************************************************************************************************************************/
/*************************************************************************************************************************************************************************************/
					//	原始打卡记录数据录入
					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,status = 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;
							}
						}
					}
					
					String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(attendance_date));//转换打卡时间格式
					long attime;
//					if(punchcardtime == 0 && !isRange){attime = new Date().getTime();}else{attime = punchcardtime;}// 考勤时间(应打卡时间)
					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;
					}
					//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;
	
	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);
		 }
//		 Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(str,"yyyy-MM-dd")).getTime();
//	     Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(str,"yyyy-MM-dd")).getTime();
		 
	     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;
	 }
	
	//
	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);
	    	}
	 }
}