package cn.timer.api.controller.kqgl.atttimer;

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.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import cn.timer.api.bean.kqgl.AttendanceWeeklySch;
import cn.timer.api.bean.kqgl.PunchCardDetails;
import cn.timer.api.bean.kqgl.PunchRecord;
import cn.timer.api.bean.kqgl.Schedule;
import cn.timer.api.bean.kqmk.KqglAssoBcsz;
import cn.timer.api.bean.kqmk.KqglAssoDkmx;
import cn.timer.api.bean.kqmk.KqglAssoLeaveRules;
import cn.timer.api.bean.kqmk.KqglAssoMonthPunchSummary;
import cn.timer.api.bean.kqmk.KqglAssoOvertimeBasics;
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.kqmk.KqmkRedletterDay;
import cn.timer.api.controller.kqgl.ClockInController;
import cn.timer.api.controller.kqgl.ClockInTool;
import cn.timer.api.controller.kqgl.EmptyUtil;
import cn.timer.api.dao.kqgl.AttendanceWeeklySchMapper;
import cn.timer.api.dao.kqgl.PunchCardDetailsMapper;
import cn.timer.api.dao.kqgl.PunchRecordMapper;
import cn.timer.api.dao.kqgl.ScheduleMapper;
import cn.timer.api.dao.kqmk.KqglAssoDkmxMapper;
import cn.timer.api.dao.kqmk.KqglAssoLeaveBalanceMapper;
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.dao.qyzx.QyzxEntInfoMMapper;
import cn.timer.api.dto.kqmk.AdditionalDto;
import cn.timer.api.dto.kqmk.AttLateLate;
import cn.timer.api.dto.kqmk.AttSchedule;
import cn.timer.api.dto.kqmk.AttSubsidiaryDto;
import cn.timer.api.dto.kqmk.AttendanceCardListDto;
import cn.timer.api.dto.kqmk.KqglAssoPbmxDto;
import cn.timer.api.utils.DateUtil;

/**
 * @author lal
 *	考勤报表实时更新
 */

@RestController
@Transactional
public class RealTimeUpdate{
	
	static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
	static SimpleDateFormat sdf2 = new SimpleDateFormat("EEE",Locale.CHINA);

	static String tablename = null;
	@Autowired
	private KqglMainKqzMapper kqglmainkqzmapper;
	@Autowired
	private KqglAssoLeaveBalanceMapper kqglassoleavebalancemapper;
	@Autowired
	private KqglAssoTeshuMapper kqglassoteshumapper;
	@Autowired
	private PunchCardDetailsMapper punchcarddetailsmapper;
	@Autowired
	private AttendanceWeeklySchMapper attendanceweeklyschmapper;
	@Autowired
	private ScheduleMapper schedulemapper;
	@Autowired
	private KqglAssoRelationSummaryMapper kqglassorelationsummarymapper;
	@Autowired
	private PunchRecordMapper punchrecordmapper;
	@Autowired
	private KqglAssoDkmxMapper kqglassodkmxmapper;
	
	
	/**
	 * @param orgCode 公司组织代码
	 * @param numcode 考勤组id或者添加员工id
	 * @param typeid 1:考勤组 2:添加员工
	 * @throws ParseException
	 */
	public void AttendanceTask(int orgCode,int numcode,int typeid,List<AdditionalDto> userlist_) throws ParseException {
			
		Calendar c = Calendar.getInstance();    
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
		Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdf1.format(c.getTime()),"yyyy-MM-dd")).getTime();
		//获取当前月最后一天
		Calendar ca = Calendar.getInstance();    
		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));  
		Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(sdf1.format(ca.getTime()),"yyyy-MM-dd")).getTime();
		
		String str = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString();//
		String ttstr = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();//
		
		
		String yesterday = str;//ClockInTool.requires_extra_times(str,-1,3,1);//前一天
		String[] rangeArray=ClockInTool.listToString(ClockInTool.getDays(sdf1.format(c.getTime()),yesterday)).split(";");//目前为止所有日期
		String[] range=rangeArray[0].split(",");
		Long endDateyesterday = DateUtil.getnowEndTime(23,DateUtil.getStringTime(yesterday,"yyyy-MM-dd")).getTime();
		
		int year = Calendar.getInstance().get(Calendar.YEAR);
		int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
		int summaryid = 0;//汇总id
		
			int org_code = orgCode;//企业组织代码
			List<AdditionalDto> userlist = null;
			if(typeid == 1) {//考勤组
				userlist = kqglassoleavebalancemapper.RealTimeUpdate(org_code,numcode);
			}else if(typeid == 2) {//添加员工  离职员工
				userlist = kqglassoleavebalancemapper.selectAdditionalByempnum(org_code,numcode);
			}else if(typeid == 3) {
				userlist = userlist_;
			}
			
			for(AdditionalDto user : userlist) {
				
				KqglAssoMonthPunchSummary sum = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda().eq(KqglAssoMonthPunchSummary::getOrgCode, org_code)
						.eq(KqglAssoMonthPunchSummary::getBelongYear, year).eq(KqglAssoMonthPunchSummary::getBelongMonth, month).eq(KqglAssoMonthPunchSummary::getNum, user.getEmpnum()));
				
				if(sum != null) {
					summaryid = sum.getId();
				}
				
				double traveltotal = 0,egresstotal = 0,overtimetotal = 0;
				//出差总时长
				KqglAssoRelationSummary travel = kqglassorelationsummarymapper.SecondaryValue(user.getEmpnum(), 3, ttstr);
				if(travel !=null) { traveltotal = travel.getDuration(); }
				//外出总时长
				KqglAssoRelationSummary egress = kqglassorelationsummarymapper.SecondaryValue(user.getEmpnum(), 4, ttstr);
				if(egress!=null) { egresstotal = egress.getDuration(); }
				//加班总时长
				KqglAssoRelationSummary overtime = kqglassorelationsummarymapper.SecondaryValue(user.getEmpnum(), 1, ttstr);
				if(overtime!= null) { overtimetotal = overtime.getDuration(); }
					//考勤组信息
					KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(user.getEmpnum(),org_code); 
					//目前为止打卡记录
					List<PunchCardDetails> attendance = punchcarddetailsmapper.selectAttendanceDays(user.getEmpnum(), startDate, endDateyesterday,org_code);
					
					
					int fdjjrnum = 0;
					if(attgro != null) {
						//特殊日期中 为法定带薪休假的
						List<KqglAssoTeshu> fdjjr = KqglAssoTeshu.builder().build().selectList(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, attgro.getId()).eq(KqglAssoTeshu::getLegalday, 1).eq(KqglAssoTeshu::getType, 2));
						fdjjrnum = fdjjr.size();
					}
					
					int dkjl = 0;//目前为止打卡次数
					int sbqkcs = 0,xbqkcs = 0,dk=0;
					String[] sblacks = new String[31];//上班缺卡天数
					String[] xblacks = new String[31];//下班缺卡天数
					String[] dkjtts = new String[attendance.size()];//目前打卡日期明细
					int bccs = 0;
					if(attendance.size() > 0) { 
						dkjl = attendance.size() + fdjjrnum;
						for(PunchCardDetails pcd:attendance){
							AttendanceCardListDto attdate = MethodCall(org_code, user.getEmpnum(), pcd.getData());
							List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间
							if(EmptyUtil.isNotEmpty(attdate.getAttsch()) && ashss.get(0).getId() != 0) {//班次不为空
								bccs = attdate.getAttsch().size();
							}
							dkjtts[dk] = pcd.getData();
							dk++;
			            	if(bccs == 2 || bccs == 4 || bccs == 6){
			            		if(pcd.getSbdk1() == null){ 
			            			sblacks[sbqkcs] = pcd.getData(); 
			            			sbqkcs++; 
			            		}
			            		if(pcd.getXbdk1() == null){ 
			            			xblacks[xbqkcs] = pcd.getData(); 
			            			xbqkcs++; 
			            		}
			            	}
			            	if(bccs == 4 || bccs == 6){
			            		if(pcd.getSbdk2() == null){ 
			            			sblacks[sbqkcs] = pcd.getData(); 
			            			sbqkcs++; 
			            		}
			            		if(pcd.getXbdk2() == null){ 
			            			xblacks[xbqkcs] = pcd.getData(); 
			            			xbqkcs++; 
			            		}
			            	}
			            	if(bccs == 6){
			            		if(pcd.getSbdk3() == null){ 
			            			sblacks[sbqkcs] = pcd.getData(); 
			            			sbqkcs++; 
			            		}
			            		if(pcd.getXbdk3() == null){ 
			            			xblacks[xbqkcs] = pcd.getData(); 
			            			xbqkcs++; 
			            		}
			            	}
			            }
						
						sblacks = ClockInTool.deleteArrayNull(sblacks);
						sbqkcs= sblacks.length;
						
						xblacks = ClockInTool.deleteArrayNull(xblacks);
						xbqkcs = xblacks.length;
					}
					//具体打卡时间入汇总表(打卡成功才会录入汇总表)
//						 KqglAssoMonthPunchSummary isyessum = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda()
//								 .eq(KqglAssoMonthPunchSummary::getNum, user.getEmpnum()).eq(KqglAssoMonthPunchSummary::getOrgCode, org_code));
					 String[] ycqts = new String[31];//应上班的具体天数(yyyy-MM-dd)
					 String[] xxts = new String[31];//休息的具体天数(yyyy-MM-dd)
					 String[] fdxx = new String[10];//法定休息的具体天数(yyyy-MM-dd)
					 List<String> rowData = new ArrayList<String>();
					//休息天数,应出勤天数,实际出勤
					double daysOff = 0,daysOnDuty = 0;//,actualAttDays = 0;
					int zjgzts = 0;//目前为止应该出勤的天数
					//工作时长(分钟)、严重迟到次数、严重迟到时长(分钟)、旷工迟到次数
					double workinghours = 0,seriouslatetimes = 0,seriouslatehours = 0,absenlatetimes = 0;
					// 迟到次数  迟到时长  早退次数  早退时长
				    int latenum = 0,latehours = 0,leanum = 0,leahours = 0;// 迟到次数
				    int answer =0;//班次ID
				    //工作日(转调休)、休息日(转调休)、节假日(转调休)
				    double workingturncompenleave = 0,restturncompenleave = 0,holidayturncompenleave = 0;//工作日(转调休)
				    //工作日(转加班费)、休息日(转加班费)、节假日(转加班费)
				    double workingtransferovertime = 0,resttransferovertime = 0,holidaytransferovertime = 0;
				    int attgroid = 0;
					if(attgro != null){//该员工是否加入到考勤组  排班方式 1:固定排班;2:自由排班;3:自由工时         计算出应出勤,实际出勤,休息天数
						attgroid = attgro.getId();
//								KqglAssoBcsz shif = KqglAssoBcsz.builder().build();
//								//休息天数,应出勤天数,实际出勤
//								double daysOff = 0,daysOnDuty = 0;//,actualAttDays = 0;
//								int zjgzts = 0;//目前为止应该出勤的天数
						if(attgro.getPbfs() == 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(user.getEmpnum(),org_code);
							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++;
							}
							
							//法定節假日
							List<KqmkRedletterDay> etter = KqmkRedletterDay.builder().build().selectList(new QueryWrapper<KqmkRedletterDay>().lambda().eq(KqmkRedletterDay::getHolidayStatus, 1).eq(KqmkRedletterDay::getBelongYearmonth, ttstr));
							String[] holidays = new String[etter.size()];//法定节假日沦为休息日计算
							int h = 0;
							for(KqmkRedletterDay spe:etter){
								holidays[h] = spe.getHoliday();
								h++;
							}
							
							String yemo = year + "-" + month;
							sdf1.setLenient(false);
							int y = 0,q = 0,jj = 0,xx = 0;//jj:节假日
							String[] zdxx = new String[31];//法定休息的具体天数(yyyy-MM-dd)
							 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
								 boolean xixi = true;
									Date date1 = sdf1.parse(yemo + "-" + i);
									for(int u=0;u<week.length;u++){
										if(sdf2.format(date1).equals(week[u])){
											q++;
											y++;
											if(Arrays.asList(appmaps).contains(String.valueOf(sdf1.format(date1)))){
												y = y-1;
											}
											
											if(attgro.getIsFdjjr().equals(1111)) {
												if(Arrays.asList(holidays).contains(String.valueOf(sdf1.format(date1)))){
													y = y-1;
													jj ++;
												}
											}
											xixi = false;
										}
									}
									
									if(xixi) {
										zdxx[xx] = yemo + "-" + i;
										xx++;
									}
							 }
							 if(appmaps.length > 0) {
								 for(String aa : ClockInTool.deleteArrayNull(zdxx)) {
									 if(appmaps.length > 0) {
										 appmaps = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(appmaps), aa);
									 }
									
								 }
							 }
							 
							 //全月时间 - 应打卡时间 - 必须打卡时间 + 无需打卡时间
							 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - q - bxdk + appmaps.length+jj;//ClockInTool.getDaysByYearMonth(year,month) - q - bxdk + wxdk.size()+jj;
							 daysOff = xiuxi;
							 daysOnDuty = y+bxdk;
//								 String[] range=ClockInTool.listToString(ClockInTool.getDays(sdf1.format(c.getTime()),str)).split(";");//目前为止所有日期
//								 int zjgzts = 0;//目前为止应该出勤的天数
							//目前为止应出勤天数
							 int w = 0,x=0;
							 int zj = 6;
							 int fd = 0;
							 for(String num : range) {
								 boolean xxr = true;
								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;
									
									//ycqts[w] = num;
									w++;
									zjgzts++;
								}else {
									String[] xxtst = new String[xxts.length + zj];
									System.arraycopy(xxts, 0, xxtst, 0, xxts.length);
									xxtst[x] = num;
									xxts = xxtst;
									
									//xxts[x] = num;
									x++;
									
									xxr = false;
								}
								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;
									
									//ycqts[w] = num;
									w++;
									zjgzts++;
									xxts =	ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(xxts), num);//为必须上班的话从休息日期中去除
								}
								if(Arrays.binarySearch(appmaps, num) >= 0) {//检查是否存在 无需打卡名单中
									ycqts = ClockInTool.doChinFilters(ycqts, num);//为必须休息的话从上班日期中去除
//									ycqts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num);//为必须休息的话从上班日期中去除
									
									//防止休息日重复减
									if(xxr) {
										zjgzts = zjgzts - 1;
									}
									
									String[] xxtst = new String[xxts.length + zj];
									System.arraycopy(xxts, 0, xxtst, 0, xxts.length);
									xxtst[x] = num;
									
									//xxts[x] = num;
									xxts = xxtst;
									x++;
								}
								
								//当前考勤组开启法定节假日休息开关
								if(attgro.getIsFdjjr().equals(1111)) {
									//法定节假日
									if(ClockInTool.useArrayUtils(holidays, num)) {//法定节假日沦为休息日计算
//										ycqts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num);//为必须休息的话从上班日期中去除
										
										if(ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num) != null) {
											ycqts = ClockInTool.doChinFilters(ClockInTool.deleteArrayNull(ycqts), num);//为必须休息的话从上班日期中去除
										}
										
										fdxx[fd] = num;
										fd ++;
										
										zjgzts = zjgzts - 1;
										
										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){	//自由排班
							DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
							List<Schedule> ycqs = schedulemapper.getAttendanceShouldList(user.getEmpnum(),startDate,endDate);
							int xiuxi = 0,shangban = 0,z=0;
							String[] ziyoupb = new String[ycqs.size()];
							for(Schedule sc : ycqs){
								String data = new SimpleDateFormat("yyyy-MM-dd").format(df.parse(String.valueOf(sc.getData())));// 获得格式化后的日期字符串
								ziyoupb[z] = data;
								z++;
								if(sc.getBcid().equals(0)){
									xiuxi++;
								}else{
									shangban++;
								}
							}
							daysOff = xiuxi;
							daysOnDuty = shangban;
							//目前为止应出勤天数
							int y = 0,x=0;
							for(String num : range) {
								if(Arrays.binarySearch(ziyoupb, num) >= 0) {
									KqglAssoPbmx pbx = KqglAssoPbmx.builder().build().selectOne(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, user.getEmpnum()).eq(KqglAssoPbmx::getData, num).eq(KqglAssoPbmx::getKqzid, attgro.getId()));
									if(pbx!=null && pbx.getBcid()!=0) {
										ycqts[y] = num;
										y++;
										zjgzts++;
									}else {
										xxts[x] = num;
										x++;
									}
								}
							}
						}else{
							List<AttendanceWeeklySch> atwek = attendanceweeklyschmapper.selectAttendanceMadeByZhou(user.getEmpnum(),org_code);
							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++;
							}
							String yemo = year + "-" + month;
							sdf1.setLenient(false);
							int y = 0;
							 for(int i = 1; i <= ClockInTool.getDaysByYearMonth(year,month); i++){
									Date date1 = sdf1.parse(yemo + "-" + i);
									for(int u=0;u<week.length;u++){
										if(sdf2.format(date1).equals(week[u])){
											y++;
										}
									}
							 }
							 int xiuxi = ClockInTool.getDaysByYearMonth(year,month) - y;
							 daysOff = xiuxi;
						     daysOnDuty = y;
						     //目前为止应出勤天数
						     int g = 0,x=0;
						     for(String num : range) {
						    	 if(Arrays.binarySearch(ziyoupb, String.valueOf(ClockInTool.dateToWeek(num))) >= 0) {//对比排班应打卡时间
						    		 ycqts[g] = num;	
						    		 g++;
						    		 zjgzts++;
								 }else {
									xxts[x] = num;
									x++;
								 }
						     }
						}
					List<PunchRecord> initial = punchrecordmapper.getMaintenancePunchCardList(startDate,endDateyesterday,user.getEmpnum(),orgCode);
//					    // 迟到次数  迟到时长  早退次数  早退时长
//					    int latenum = 0,latehours = 0,leanum = 0,leahours = 0;// 迟到次数
				    String[] cdts = new String[31];//迟到的具体天数
				    String[] ztts = new String[31];//早退的具体天数
					if(initial.size() > 0){
						for(PunchRecord prd : initial){
							if(prd.getType() == 1 && prd.getResults() > 0){
								cdts[latenum] = new SimpleDateFormat("yyyy-MM-dd").format(prd.getDktime());
								latenum++;
								latehours += prd.getResults();
							}
							if(prd.getType() == 2 && prd.getResults() > 0){
								ztts[leanum] = new SimpleDateFormat("yyyy-MM-dd").format(prd.getDktime());
								leanum++;
								leahours += prd.getResults();
							}
						}
					}
					AttSubsidiaryDto subs = kqglassodkmxmapper.subsidiary(user.getEmpnum(), ttstr,org_code);
//							//工作时长(分钟)、严重迟到次数、严重迟到时长(分钟)、旷工迟到次数
//							double workinghours = 0,seriouslatetimes = 0,seriouslatehours = 0,absenlatetimes = 0;
					if(subs != null) {
						workinghours = subs.getGzsctotalgzsc();
						seriouslatetimes = subs.getYzcdcstotal();
						seriouslatehours = subs.getYzcdsctotal();
						absenlatetimes = subs.getKgcdfzstotal();
					}
					//具体请假天数
					List<KqglAssoRelationSummary> leavetotal = kqglassorelationsummarymapper.SpecificLeave(user.getEmpnum(), 2, ttstr,org_code);
					String[] leaves = new String[leavetotal.size()];
					int l = 0;
					if(leavetotal.size()>0) {
						for(KqglAssoRelationSummary lea : leavetotal){
							leaves[l] = lea.getAppTime();
							l++;
						} 
					}
					//具体加班天数
					List<KqglAssoRelationSummary> overtitotal = kqglassorelationsummarymapper.SpecificLeave(user.getEmpnum(), 1, ttstr,org_code);
					String[] overtimes = new String[overtitotal.size()];
					int o = 0;
					if(overtitotal.size() > 0) {
						for(KqglAssoRelationSummary over : overtitotal) {
							overtimes[o] = over.getAppTime();
							o++;
						}
					}
					//具体出差天数
					List<KqglAssoRelationSummary> trtotal = kqglassorelationsummarymapper.SpecificLeave(user.getEmpnum(), 3, ttstr,org_code);
					String[] travels = new String[trtotal.size()];
					int cx = 0;
					if(trtotal.size()>0) {
						for(KqglAssoRelationSummary trt : trtotal) {
							travels[cx] = trt.getAppTime();
							cx++;
						}
					}
					//具体外出天数
					List<KqglAssoRelationSummary> goouttotal = kqglassorelationsummarymapper.SpecificLeave(user.getEmpnum(), 4, ttstr,org_code);
					String[] goouts = new String[goouttotal.size()];
					int wc = 0;
					if(goouttotal.size()>0) {
						for(KqglAssoRelationSummary go:goouttotal) {
							goouts[wc] = go.getAppTime();
							wc++;
						}
					}
					//具体补卡天数
					List<KqglAssoRelationSummary> cardtotal = kqglassorelationsummarymapper.SpecificLeave(user.getEmpnum(), 5, ttstr,org_code);
					String[] cards = new String[cardtotal.size()]; 
					int bk = 0;
					if(cardtotal.size()>0) {
						for(KqglAssoRelationSummary car : cardtotal) {
							cards[bk] = car.getAppTime();
							bk++;
						}
					}
					
					//排查请假是否在最后一次打卡范围内  查询当月的请假所有日期
					List<KqglAssoRelationSummary> leainv = kqglassorelationsummarymapper.LeaveInvestigation(user.getEmpnum(), 2, ttstr,org_code);
//						KqglAssoBcsz shif = KqglAssoBcsz.builder().build();
					String beginTime = sdf1.format(new Date());
//							List<String> rowData = new ArrayList<String>();
					//遍历目前为止所有日期 结合该用户发起的审批进行结合
					//1:加班 2:请假 3:出差 4:外出 5:补卡
					int u = 0;
					int p = 1;
					for(String num : range) {
						
						try {
							String sjs = "",qinjia = "",chuaca = "",waichu = "",buka = "",jiaban = "";
							if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xxts), num) && ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(dkjtts),num)) {
								rowData.add("休息并打卡");
							}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xxts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(fdxx), num)){
								rowData.add("休息");
							}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(fdxx), num)){
								rowData.add("法定节假日休息");
							}else {
								if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ycqts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(dkjtts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(leaves), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(travels), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(goouts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(cards), num)) {
									rowData.add("旷工");
								}else if(!ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ycqts), num) && !ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xxts), num)) {//日期不在上班也不在休息里面即为未排班
									rowData.add("未排班");
								}else if(sdf1.parse(beginTime).getTime() < sdf1.parse(num).getTime()) {
									rowData.add("未到班期");
								}else {
									if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(sblacks), num)) {
										rowData.add("上班缺卡");
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(sblacks), num) && ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ztts), num)) {
										rowData.add("上班缺卡,下班早退");
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(cdts), num)) {
//									rowData.add("上班迟到");
										KqglAssoDkmx dkm = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, user.getEmpnum())
												.eq(KqglAssoDkmx::getQyid, org_code).eq(KqglAssoDkmx::getData, num));
										if(dkm.getYdkcs() == 2 || dkm.getYdkcs() == 4 || dkm.getYdkcs() == 6) {
											if(dkm.getSbdk1jg() > 0) {
												rowData.add("上班1迟到,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getSbdk1()))+",迟到"+dkm.getSbdk1jg()+"分钟");
											}
										} 
										if(dkm.getYdkcs() == 4 || dkm.getYdkcs() == 6) {
											if(dkm.getSbdk2jg() > 0) {
												rowData.add("上班2迟到,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getSbdk2()))+",迟到"+dkm.getSbdk2jg()+"分钟");
											}
										}
										if(dkm.getYdkcs() == 6) {
											if(dkm.getSbdk3jg() > 0) {
												rowData.add("上班3迟到,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getSbdk3()))+",迟到"+dkm.getSbdk3jg()+"分钟");
											}
										}
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(cdts), num) && ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xblacks), num)) {
										rowData.add("上班迟到,下班缺卡");
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(cdts), num) && ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ztts), num)) {
										rowData.add("上班迟到,下班早退");
//								}else if(Arrays.binarySearch(ClockInTool.deleteArrayNull(xblacks), num) >= 0) {
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(xblacks),num)) {
										rowData.add("下班缺卡");
									}else if(ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(ztts), num)) {
//									rowData.add("下班早退");
										KqglAssoDkmx dkm = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, user.getEmpnum())
												.eq(KqglAssoDkmx::getQyid, org_code).eq(KqglAssoDkmx::getData, num));
										if(dkm.getYdkcs() == 2 || dkm.getYdkcs() == 4 || dkm.getYdkcs() == 6) {
											if(dkm.getXbdk1jg() > 0) {
												rowData.add("下班1早退,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getXbdk1()))+",早退"+dkm.getXbdk1jg()+"分钟");
											}
										}
										if(dkm.getYdkcs() == 4 || dkm.getYdkcs() == 6) {
											if(dkm.getXbdk2jg() > 0) {
												rowData.add("下班2早退,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getXbdk2()))+",早退"+dkm.getXbdk2jg()+"分钟");
											}
										}
										if(dkm.getYdkcs() == 6) {
											if(dkm.getXbdk3jg() > 0) {
												rowData.add("下班3早退,打卡时间:"+ClockInTool.stampToDate3(String.valueOf(dkm.getXbdk3()))+",早退"+dkm.getXbdk3jg()+"分钟");
											}
										}
									}else {
										rowData.add("正常");
									}
								}
							}
							
							/******/
							if(ClockInTool.contains(ClockInTool.deleteArrayNull(leaves),num)) {
								KqglAssoRelationSummary lea = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, user.getEmpnum()).eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getApprovalType, 2).eq(KqglAssoRelationSummary::getOrgCode, org_code));
								String leavetype = "未知";//请假类型
								String company = "未知";//请假单位
								if(lea != null) {
									KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getId, lea.getLeaveTypeId()));
									if(rul != null) {
										leavetype = rul.getName();
										//1:按天请假;2:按半天;3:按小时
										if(rul.getCompany() == 1) { company = "天"; }
										else if(rul.getCompany() == 2) { company = "半天"; }
										else { company = "小时"; }
									}
								}
								qinjia = "#"+(lea.getStartTime()).substring(5, 16) +"到"+ (lea.getEndTime()).substring(5, 16)+"请"+leavetype+lea.getDuration()+company;
							}
							if(ClockInTool.contains(ClockInTool.deleteArrayNull(travels),num)) {
								KqglAssoRelationSummary lea = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, user.getEmpnum()).eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getApprovalType, 3).eq(KqglAssoRelationSummary::getOrgCode, org_code));
								
								chuaca = "#"+(lea.getStartTime()).substring(5, 16) +"到"+ (lea.getEndTime()).substring(5, 16)+"出差"+lea.getDuration()+"天";
							}
							if(ClockInTool.contains(ClockInTool.deleteArrayNull(goouts),num)) {
								KqglAssoRelationSummary lea = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, user.getEmpnum()).eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getApprovalType, 4).eq(KqglAssoRelationSummary::getOrgCode, org_code));
								
								waichu = "#"+(lea.getStartTime()).substring(5, 16) +"到"+ (lea.getEndTime()).substring(5, 16)+"外出"+lea.getDuration()+"天";
							}
							if(ClockInTool.contains(ClockInTool.deleteArrayNull(cards),num)) {
								KqglAssoRelationSummary lea = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, user.getEmpnum()).eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getApprovalType, 5).eq(KqglAssoRelationSummary::getOrgCode, org_code));
								
								buka = "#"+"已补卡:"+(lea.getStartTime()).substring(5, 16);
							}
							if(ClockInTool.contains(ClockInTool.deleteArrayNull(overtimes),num)) {
								
								String company = "未知",method = "无";//加班单位、加班补偿方式
								
								List<KqglAssoRelationSummary> leas = KqglAssoRelationSummary.builder().build().selectList(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, user.getEmpnum()).eq(KqglAssoRelationSummary::getAppTime, num).eq(KqglAssoRelationSummary::getApprovalType, 1).eq(KqglAssoRelationSummary::getOrgCode, org_code));
								for(KqglAssoRelationSummary lea : leas) {
									
										//最小加班单位 1:按分钟加班、2:按半小时加班、3:按小时加班、4:按半天加班、5:按天加班
										KqglAssoOvertimeBasics basics = KqglAssoOvertimeBasics.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeBasics>().lambda().eq(KqglAssoOvertimeBasics::getOrgCode, org_code));
										if(basics.getMinimumUnit() == 1) { company = "分钟"; }
										else if(basics.getMinimumUnit() == 2) { company = "半小时";}
										else if(basics.getMinimumUnit() == 3) { company = "小时";}
										else if(basics.getMinimumUnit() == 4) { company = "半天";}
										else if(basics.getMinimumUnit() == 5) { company = "天";}
										//1:转调休;2:转加班费;3:转调休或加班费
										if(lea.getCompensateId() == 1) { method="转调休"; }
										else if(lea.getCompensateId() == 2) { method="转加班费"; }
										else {method="转调休或加班费";}
										
										jiaban = "#"+(lea.getStartTime()).substring(5, 16) +"到"+ (lea.getEndTime()).substring(5, 16)+"加班"+lea.getDuration()+company+"["+method+"]";
									//防止多运算
									if(lea.getOrdernum() == lea.getTotals()) {
										//加班补偿方式 1:转调休;2:转加班费;3:转调休或加班费
										//工作日
										if(ClockInTool.contains(ClockInTool.deleteArrayNull(ycqts),num)) {
											if(lea.getOvertimeTypeId() == 1) {
												if(lea.getCompensateId() == 1 || lea.getCompensateId() == 3) {
													workingturncompenleave = workingturncompenleave + lea.getDuration();
												}else if(lea.getCompensateId() == 2 || lea.getCompensateId() == 4) {
													workingtransferovertime = workingtransferovertime +  + lea.getDuration();
												}
											}
										}
										//休息日
										if(ClockInTool.contains(ClockInTool.deleteArrayNull(xxts),num)) {
											if(lea.getOvertimeTypeId() == 2) {
												if(lea.getCompensateId() == 1 || lea.getCompensateId() == 3) {
													restturncompenleave = restturncompenleave + lea.getDuration();
												}else if(lea.getCompensateId() == 2 || lea.getCompensateId() == 4) {
													resttransferovertime = resttransferovertime + lea.getDuration();
												}
											}
										}
										if(!ClockInTool.contains(ClockInTool.deleteArrayNull(ycqts),num) && !ClockInTool.contains(ClockInTool.deleteArrayNull(xxts),num)) {
											if(lea.getOvertimeTypeId() == 3) {
												if(lea.getCompensateId() == 1 || lea.getCompensateId() == 3) {
													holidayturncompenleave = holidayturncompenleave + lea.getDuration();
												}else if(lea.getCompensateId() == 2 || lea.getCompensateId() == 4) {
													holidaytransferovertime = holidaytransferovertime + lea.getDuration();
												}
											}
										}
									}
								}
							}
							
							if(rowData.size() == p) {
								sjs = "";
								if(("").equals(qinjia) && ("").equals(chuaca) && ("").equals(waichu) && ("").equals(buka) && ("").equals(jiaban)) {
									sjs = rowData.get(u);
								}else {
									sjs = rowData.get(u)+";";
								}
								
							}
							rowData.remove(u);
							rowData.add(u,sjs + qinjia+chuaca+waichu+buka+jiaban);
							
							/****/
							
							////////
							
							KqglAssoBcsz shif = KqglAssoBcsz.builder().build();
							
							if(attgro.getPbfs() == 1){
								int several = Integer.valueOf(ClockInTool.dateToWeek(num));//
								KqglAssoTeshu tesu = KqglAssoTeshu.builder().build().selectOne(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, attgro.getId()).eq(KqglAssoTeshu::getTsrq, num));
								if(tesu == null) {
									//获取该员工最新班次
									KqglAssoZhoupaiban gudingpb = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId())
											.eq(KqglAssoZhoupaiban::getType, several));
									if(gudingpb!=null) {
										shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, gudingpb.getBcid()));
									}
								}else {
									if(tesu.getBcid() > 0) {
										shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, tesu.getBcid()));
									}
									
								}
								//获取该员工最新班次
								KqglAssoZhoupaiban gudingpb = KqglAssoZhoupaiban.builder().build().selectOne(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, attgro.getId())
										.eq(KqglAssoZhoupaiban::getType, several));
								if(gudingpb != null) {
									    shif = KqglAssoBcsz.builder().build();
										shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, gudingpb.getBcid()));
								}
							}else if(attgro.getPbfs() == 2){
								KqglAssoPbmx pbmxx = KqglAssoPbmx.builder().build().selectOne(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, user.getEmpnum()).eq(KqglAssoPbmx::getData, num).eq(KqglAssoPbmx::getKqzid, attgro.getId()));
								if(pbmxx != null && pbmxx.getBcid() != 0) {
									shif = shif.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, pbmxx.getBcid()));
								}
							}
							
							if(shif != null && shif.getSxbcs() != null) {
								System.out.println(shif.getSxbcs());
								answer = shif.getSxbcs();//1=2次  2=4次  3=6次
								//未打最后一次卡的时候  判断最后一次打卡时间是否在请假范围内    相对应减少下班缺卡次数
								//最后一次应打卡时间
								String latimeclock = "";
								if(answer == 1) {
									latimeclock = num +" "+ shif.getXbdk1();//ClockInTool.dealDateFormat(shif.getXbdk1(),3);
								}else if(answer == 2) {
									latimeclock = num +" "+ shif.getXbdk2();//ClockInTool.dealDateFormat(shif.getXbdk2(),3);
								}else {
									latimeclock = num +" "+ shif.getXbdk3();//ClockInTool.dealDateFormat(shif.getXbdk3(),3);
								}
								for(KqglAssoRelationSummary learel:leainv) {
									boolean adopt = ClockInTool.hourMinuteBetween(latimeclock, learel.getStartTime().substring(0, 16), learel.getEndTime().substring(0, 16),"yyyy-MM-dd HH:mm");
									if(adopt) {
										xbqkcs = xbqkcs-1;
									}
								}
							}
							
							u++;
							p++;
						} catch (Exception e) {
							System.err.println("出错");
						}
					}
				}else {
					for (String num2 : range) { 
						if (Arrays.binarySearch(dkjtts, num2) >= 0) {
		    				rowData.add("未排班并打卡");
		    			}else{
		    				rowData.add("未排班");
		    			}
					}
					System.err.print("该员工未加入考勤组");
				}
					
				String[] range1=ClockInTool.listToString(rowData).split(";");
				String[] noticesArray=range1[0].split(",");
				noticesArray = ClockInTool.arrycopy(noticesArray);
				for(int ct=noticesArray.length-1;ct<31;ct++) {
					noticesArray[ct] = "";
					if(ct<30) {
						noticesArray = ClockInTool.arrycopy(noticesArray);
					}
				}
				String department = "",position="";
				if(user.getDepartment() != null) {
					department = user.getDepartment();
				}
				if(user.getPosition() != null) {
					position = user.getPosition();
				}
				
				
				
				 KqglAssoMonthPunchSummary summary = KqglAssoMonthPunchSummary.builder().name(user.getEmpname()).num(user.getEmpnum()).dept(department)
						 .post(position).attGroup(attgroid).shift(answer).build();
				 summary.setDaysOnDuty(daysOnDuty);//应出勤天数
				 summary.setActualAttDays(Double.valueOf(dkjl));//实际出勤天数
				 summary.setDaysOff(daysOff);//休息天数
				 summary.setWorkingHours(workinghours);
				 summary.setLateTimes(Double.valueOf(latenum));//迟到次数
				 summary.setLateHours(Double.valueOf(latehours));//迟到时长(分钟)
				 summary.setSeriousLateTimes(seriouslatetimes);//严重迟到次数
				 summary.setSeriousLateHours(seriouslatehours);//严重迟到时长(分钟)
				 summary.setAbsenLateTimes(absenlatetimes);//旷工迟到次数
				 summary.setEarlyLeaveTimes(Double.valueOf(leanum));//早退次数
				 summary.setLengthEarlyLeave(Double.valueOf(leahours));//早退时长(分钟)
				 summary.setNumberWorkCardShortage(Double.valueOf(sbqkcs));//上班缺卡次数
				 summary.setNumberDutyCardShortage(Double.valueOf(xbqkcs < 0 ? 0 : xbqkcs));//下班缺卡次数
				 summary.setLengthBusinessTrip(traveltotal);//出差时长
				 summary.setTimeOut(egresstotal);//外出时长
				 summary.setTotalOvertimeHours(overtimetotal);//加班总时长
				 summary.setBelongYear(ca.get(Calendar.YEAR));
				 summary.setBelongMonth(ca.get(Calendar.MONTH)+1);
				 summary.setOrgCode(org_code);
				 summary.setLastModified(new Date().getTime());
				 
				 int absenteeismdays=0;
				 if(zjgzts-dkjl > 0) { absenteeismdays = zjgzts-dkjl; }
				 summary.setAbsenteeismDays(Double.valueOf(absenteeismdays));//旷工天数
				 
				 summary.setWorkingTurnCompenLeave(workingturncompenleave);//工作日(转调休)
				 summary.setRestTurnCompenLeave(restturncompenleave);//休息日(转调休)
				 summary.setHolidayTurnCompenLeave(holidayturncompenleave);//节假日(转调休)
				 summary.setWorkingTransferOvertime(workingtransferovertime);//工作日(转加班费)
				 summary.setRestTransferOvertime(resttransferovertime);//休息日(转加班费)
				 summary.setHolidayTransferOvertime(holidaytransferovertime);//节假日(转加班费)
				 summary.setDay1(noticesArray[0]);
				 summary.setDay2(noticesArray[1]);
				 summary.setDay3(noticesArray[2]);
				 summary.setDay4(noticesArray[3]);
				 summary.setDay5(noticesArray[4]);
				 summary.setDay6(noticesArray[5]);
				 summary.setDay7(noticesArray[6]);
				 summary.setDay8(noticesArray[7]);
				 summary.setDay9(noticesArray[8]);
				 summary.setDay10(noticesArray[9]);
				 summary.setDay11(noticesArray[10]);
				 summary.setDay12(noticesArray[11]);
				 summary.setDay13(noticesArray[12]);
				 summary.setDay14(noticesArray[13]);
				 summary.setDay15(noticesArray[14]);
				 summary.setDay16(noticesArray[15]);
				 summary.setDay17(noticesArray[16]);
				 summary.setDay18(noticesArray[17]);
				 summary.setDay19(noticesArray[18]);
				 summary.setDay20(noticesArray[19]);
				 summary.setDay21(noticesArray[20]);
				 summary.setDay22(noticesArray[21]);
				 summary.setDay23(noticesArray[22]);
				 summary.setDay24(noticesArray[23]);
				 summary.setDay25(noticesArray[24]);
				 summary.setDay26(noticesArray[25]);
				 summary.setDay27(noticesArray[26]);
				 summary.setDay28(noticesArray[27]);
				 summary.setDay29(noticesArray[28]);
				 summary.setDay30(noticesArray[29]);
				 summary.setDay31(noticesArray[30]);
				 
//				 if(summaryid > 0) {
					 summary.setId(summaryid);
//				 }
				 summary.insertOrUpdate();
			}
				
 	}
	
	
	
	
	@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);
	    	}
	 }
}