package cn.timer.api.controller.kqgl;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.dzht.DzhtAssoMbzj;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Console;
import cn.timer.api.bean.kqgl.KqglAssoKqjgly;
import cn.timer.api.bean.kqgl.PunchRecord;
import cn.timer.api.bean.kqgl.UserAttendanceRel;
import cn.timer.api.bean.kqgl.UserEquiRelation;
import cn.timer.api.bean.kqmk.KqglAssOvertimeVice;
import cn.timer.api.bean.kqmk.KqglAssoBcsz;
import cn.timer.api.bean.kqmk.KqglAssoDkdz;
import cn.timer.api.bean.kqmk.KqglAssoDkjl;
import cn.timer.api.bean.kqmk.KqglAssoDkmx;
import cn.timer.api.bean.kqmk.KqglAssoDkwx;
import cn.timer.api.bean.kqmk.KqglAssoKqj;
import cn.timer.api.bean.kqmk.KqglAssoKqzdkfs;
import cn.timer.api.bean.kqmk.KqglAssoLeaveBalance;
import cn.timer.api.bean.kqmk.KqglAssoLeaveEmployeeBalance;
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.KqglAssoOvertimeRange;
import cn.timer.api.bean.kqmk.KqglAssoOvertimeRules;
import cn.timer.api.bean.kqmk.KqglAssoPbmx;
import cn.timer.api.bean.kqmk.KqglAssoRelationSummary;
import cn.timer.api.bean.kqmk.KqglAssoRulesVice;
import cn.timer.api.bean.kqmk.KqglAssoTeshu;
import cn.timer.api.bean.kqmk.KqglAssoYhkqz;
import cn.timer.api.bean.kqmk.KqglAssoYhsb;
import cn.timer.api.bean.kqmk.KqglAssoZhoupaiban;
import cn.timer.api.bean.kqmk.KqglMainKqz;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.exception.CustomException;
import cn.timer.api.controller.kqgl.atttimer.RealTimeUpdate;
import cn.timer.api.dao.kqgl.PunchRecordMapper;
import cn.timer.api.dao.kqgl.UserAttendanceRelMapper;
import cn.timer.api.dao.kqgl.UserEquiRelationMapper;
import cn.timer.api.dao.kqmk.KqglAssOvertimeViceMapper;
import cn.timer.api.dao.kqmk.KqglAssoBcszMapper;
import cn.timer.api.dao.kqmk.KqglAssoDkdzMapper;
import cn.timer.api.dao.kqmk.KqglAssoDkmxMapper;
import cn.timer.api.dao.kqmk.KqglAssoDkwxMapper;
import cn.timer.api.dao.kqmk.KqglAssoKqjMapper;
import cn.timer.api.dao.kqmk.KqglAssoKqzdkfsMapper;
import cn.timer.api.dao.kqmk.KqglAssoLeaveBalanceMapper;
import cn.timer.api.dao.kqmk.KqglAssoLeaveRulesMapper;
import cn.timer.api.dao.kqmk.KqglAssoMonthPunchSummaryMapper;
import cn.timer.api.dao.kqmk.KqglAssoOvertimeRangeMapper;
import cn.timer.api.dao.kqmk.KqglAssoOvertimeRulesMapper;
import cn.timer.api.dao.kqmk.KqglAssoPbmxMapper;
import cn.timer.api.dao.kqmk.KqglAssoRelationSummaryMapper;
import cn.timer.api.dao.kqmk.KqglAssoRulesViceMapper;
import cn.timer.api.dao.kqmk.KqglAssoTeshuMapper;
import cn.timer.api.dao.kqmk.KqglAssoYhkqzMapper;
import cn.timer.api.dao.kqmk.KqglAssoYhsbMapper;
import cn.timer.api.dao.kqmk.KqglAssoZhoupaibanMapper;
import cn.timer.api.dao.kqmk.KqglMainKqzMapper;
import cn.timer.api.dto.kqmk.AdditionalDto;
import cn.timer.api.dto.kqmk.AttLateLate;
import cn.timer.api.dto.kqmk.AttMemberSettings;
import cn.timer.api.dto.kqmk.AttSchedule;
import cn.timer.api.dto.kqmk.AttSchedulingDto;
import cn.timer.api.dto.kqmk.AttendanceAssistantDto;
import cn.timer.api.dto.kqmk.AttendanceCardListDto;
import cn.timer.api.dto.kqmk.AttendanceMachineStatus;
import cn.timer.api.dto.kqmk.AttendanceSummaryQueryDto;
import cn.timer.api.dto.kqmk.AttqueryCriteriaDto;
import cn.timer.api.dto.kqmk.AttstateDate;
import cn.timer.api.dto.kqmk.BalanceSheetDataDto;
import cn.timer.api.dto.kqmk.CalendarDetailsDto;
import cn.timer.api.dto.kqmk.CalendarPunchDetailsDto;
import cn.timer.api.dto.kqmk.CalendarTableDataDto;
import cn.timer.api.dto.kqmk.ChangePunchResultsDto;
import cn.timer.api.dto.kqmk.CompensateDto;
import cn.timer.api.dto.kqmk.DailyDetailsDto;
import cn.timer.api.dto.kqmk.DetailsofbusinessDto;
import cn.timer.api.dto.kqmk.EmployeeLeaveBalanceDto;
import cn.timer.api.dto.kqmk.IndividualOvertimeRuleDto;
import cn.timer.api.dto.kqmk.JiaqibalanceDto;
import cn.timer.api.dto.kqmk.KqglAssoLeaveRulesDto;
import cn.timer.api.dto.kqmk.KqglAssoMonthPunchSummaryDto;
import cn.timer.api.dto.kqmk.KqglAssoOvertimeRulesDto;
import cn.timer.api.dto.kqmk.KqglAssoPbmxDto;
import cn.timer.api.dto.kqmk.KqglAssoRulesViceDto;
import cn.timer.api.dto.kqmk.KqglMainKqzDto;
import cn.timer.api.dto.kqmk.KqzAttendanceGroupSearchDto;
import cn.timer.api.dto.kqmk.LeaveTypeDto;
import cn.timer.api.dto.kqmk.MachinememberDto;
import cn.timer.api.dto.kqmk.ModifyEmployeeBalanceDto;
import cn.timer.api.dto.kqmk.OriginalRecordDto;
import cn.timer.api.dto.kqmk.ResttryfixdayDto;
import cn.timer.api.dto.kqmk.SetConditionsDto;
import cn.timer.api.dto.kqmk.StartTimeRestDto;
import cn.timer.api.dto.kqmk.UserAttendanceRelDto;
import cn.timer.api.dto.kqmk.VacationInformationDto;
import cn.timer.api.dto.kqmk.WorkbenchCalendarDto;
import cn.timer.api.utils.DateUtil;
import cn.timer.api.utils.ResponseResult;
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[1]考勤模块")
@RestController
@Transactional
@RequestMapping(value = "/kqmk", produces = { "application/json", "multipart/form-data" })
public class TimeCardController {

	@Value("${config-8timer.machine8timerUrl}")
	public String mac_command; // 回调地址


	@Autowired
	private KqglAssoBcszMapper kqglassobcszmapper;
	@Autowired
	private KqglAssoOvertimeRulesMapper kqglassoovertimerulesmapper;
	@Autowired
	private KqglAssOvertimeViceMapper kqglassovertimevicemapper;

	//用户和考勤组关系
	@Autowired
	private UserAttendanceRelMapper userattendancerelmapper;

	private static  ReentrantLock lock= new ReentrantLock();
	/**
	 * 查询列表-获取班次数据-分页
	 */
	@PostMapping(value = "/ShiftDataList")
	@ApiOperation(value = "1.获取班次数据-根据 组织机构代码-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectShifts(@CurrentUser UserBean userBean, @RequestBody AttqueryCriteriaDto attquerycriteriadto) {
		IPage<KqglAssoBcsz> page = new Page<KqglAssoBcsz>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());
		IPage<KqglAssoBcsz> pageAs = kqglassobcszmapper.selectPage(page, new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getQyid, userBean.getOrgCode()).orderByDesc(KqglAssoBcsz::getId));
		List<KqglAssoBcsz> listAs = pageAs.getRecords();
		return ResultUtil.data(pageAs, listAs, "操作成功!");
	}

	/**
	 * 新增班次信息
	 */
	@PostMapping(value = "/Shif")
	@ApiOperation(value = "2:新增班次信息", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 2)
	public Result<KqglAssoBcsz> ShiftInformation(@CurrentUser UserBean userBean,@RequestBody KqglAssoBcsz shif) {

		String sdf = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		shif.setQyid(userBean.getOrgCode());
		shif.setLusjTime(new Date().getTime());
		shif.setLuryid(userBean.getEmpNum());//录入人员

		boolean xbbydk = false;
		if(shif.getIsXbdk() == 1) {
			xbbydk = true;
		}

		if(shif.getSxbcs() == 1) {
			if(xbbydk) {
				shif.setXbdk1("");
				String asd = ClockInTool.addtime(sdf+" "+shif.getSbdk1()+":00", "1").substring(11, 16);
				shif.setXbdk1(asd);
			}
		}else if(shif.getSxbcs() == 2) {
			if(xbbydk) {
				shif.setXbdk2("");
				String asd = ClockInTool.addtime(sdf+" "+shif.getSbdk2()+":00", "1").substring(11, 16);
				shif.setXbdk2(asd);
			}
		}else {
			if(xbbydk) {
				shif.setXbdk3("");
				String asd = ClockInTool.addtime(sdf+" "+shif.getSbdk3()+":00", "1").substring(11, 16);
				shif.setXbdk3(asd);
			}
		}

//			if(kqglassobcszmapper.insert(shif)>0){
//				return ResultUtil.data(shif, "新增班次成功");
//			}else{
//				return ResultUtil.error("新增班次失败");
//			}

		if (!shif.insert())
			return ResultUtil.error("操作失败");


		return ResultUtil.data(shif, "新增班次成功");
	}

	/**
	 * 删除班次信息
	 */
	@DeleteMapping(value = "/Shif/{id}")
	@ApiOperation(value = "3:删除班次信息", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 3)
	public Result<Integer> deleteShiftInformation(@PathVariable("id") Integer id) {
		return KqglAssoBcsz.builder().id(id).build().deleteById() ? ResultUtil.success("删除成功!") : ResultUtil.error("没有找到该对象");
	}

	/**
	 * 根据班次id获取班次信息
	 */
	@GetMapping(value="/Shifts/{id}")
	@ApiOperation(value = "4:获取班次信息-根据班次id", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 4)
	public Result<Object> getShiftCenter(@PathVariable("id") Integer id) {
		return ResultUtil.data(KqglAssoBcsz.builder().id(id).build().selectById(),"操作成功!");
	}

	/**
	 * 修改班次信息
	 */
	@PutMapping(value = "/Shif")
	@ApiOperation(value = "5:修改班次信息", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 5)
	public Result<KqglAssoBcsz> updateShiftInformation(@CurrentUser UserBean userBean,@RequestBody KqglAssoBcsz shif) {
		shif.setQyid(userBean.getOrgCode());//企业id
		if (kqglassobcszmapper.update(shif) > 0) {
			return ResultUtil.data(shif,"修改班次信息成功");
		}
		return ResultUtil.error("修改班次信息失败");
	}

	/**
	 * 查询列表-获取加班规则数据-分页
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	@PostMapping(value = "/select_overtime_rules")
	@ApiOperation(value = "6.获取加班规则数据-根据 组织机构代码-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 6)
	public Result<Object> selectOvertimeRules(@CurrentUser UserBean userBean, @RequestBody AttqueryCriteriaDto attquerycriteriadto) throws IllegalAccessException, InvocationTargetException {
		IPage<KqglAssoOvertimeRules> page = new Page<KqglAssoOvertimeRules>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());
		IPage<KqglAssoOvertimeRules> pageAs = kqglassoovertimerulesmapper.selectPage(page, new QueryWrapper<KqglAssoOvertimeRules>().lambda().eq(KqglAssoOvertimeRules::getOrgCode, userBean.getOrgCode()));
		List<KqglAssoOvertimeRules> listAs = pageAs.getRecords();
		List<KqglAssoOvertimeRulesDto> rulesdto = new ArrayList<KqglAssoOvertimeRulesDto>();
		for (int i = 0, n = listAs.size(); i < n; i++) {
			String[] nary = null;
			String[] naryid = null;
			if(listAs.get(i).getAppliedScope() == 0) {//全公司
				nary = new String[1];//用户名
//					naryid = new String[1];//用户名
				nary[0] = "未使用";
//					naryid[0] = "0";
			}else {
				List<KqglAssoOvertimeRange> overtim = kqglassoovertimerangemapper.selectList(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, listAs.get(i).getId()));
				nary = new String[overtim.size()];//用户名
				naryid = new String[overtim.size()];//用户名
				for(int y = 0,l = overtim.size(); y < l ; y++) {
					KqglMainKqz kqzmc = kqglmainkqzmapper.selectOne(new QueryWrapper<KqglMainKqz>().lambda().eq(KqglMainKqz::getId, overtim.get(y).getAttgroupId()));
					nary[y] = kqzmc.getName();
					naryid[y] = String.valueOf(kqzmc.getId());
				}
			}


			List<KqglAssOvertimeVice> vice = kqglassovertimevicemapper.selectList(new QueryWrapper<KqglAssOvertimeVice>().lambda().eq(KqglAssOvertimeVice::getOvertimeRulesId, listAs.get(i).getId()));

			StartTimeRestDto[] starttime = new StartTimeRestDto[vice.size()];//用户名;

			for(int r = 0,t = vice.size(); r < t ; r++) {
				StartTimeRestDto startt = new StartTimeRestDto(vice.get(r).getBreakStartTime(),vice.get(r).getBreakEndTime(),vice.get(r).getOverType());
				starttime[r] = startt;
			}



			KqglAssoOvertimeRulesDto ruldto = KqglAssoOvertimeRulesDto.builder().build();
			ruldto.setApplyrange(nary);
			ruldto.setApplyrangeid(naryid);
			ruldto.setStarttime(starttime);
			BeanUtil.copyProperties(listAs.get(i), ruldto , "starttime","applyrange","applyrangeid");
			rulesdto.add(ruldto);
		}
		return ResultUtil.data(pageAs, rulesdto, "操作成功!");
	}


	@Autowired
	private KqglAssoOvertimeRangeMapper kqglassoovertimerangemapper;
	/**
	 * 新增/修改--加班规则
	 */
	@PostMapping(value = "/overtime_rules")
	@ApiOperation(value = "7:新增/修改--加班规则", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 7)
	public Result<Object> InOvertimerules(@CurrentUser UserBean userBean,@RequestBody KqglAssoOvertimeRulesDto overrules) {
		overrules.setCreateTime(new Date().getTime());
		overrules.setOrgCode(userBean.getOrgCode());
		overrules.setCreateUserid(userBean.getEmpNum());
		KqglAssoOvertimeRules rul = KqglAssoOvertimeRules.builder().build();
		BeanUtil.copyProperties(overrules, rul , "starttime","applyrange");
		if (!rul.insertOrUpdate())
			return ResultUtil.error("操作失败");
		Integer id = rul.getId();
		Console.log("新增/修改加班规则id: " + id);
		List<KqglAssoOvertimeRange> overatts=new ArrayList<KqglAssoOvertimeRange>();
		String[] launchs = overrules.getApplyrangeid();
		if(launchs.length == 0) {
			KqglAssoOvertimeRange.builder().build().delete(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, id));
		}else if(launchs != null && launchs.length>0){
			for(int p=0;p<launchs.length;p++){
				KqglAssoOvertimeRange.builder().build().delete(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, id));

				KqglAssoOvertimeRange.builder().build().delete(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getAttgroupId, Integer.valueOf(launchs[p])));

				KqglAssoOvertimeRange vice = KqglAssoOvertimeRange.builder().build();
				vice.setOvertimeRulesId(id);
				vice.setAttgroupId(Integer.valueOf(launchs[p]));
				overatts.add(vice);

				//应用范围应用到相对应的考勤组************
				KqglMainKqz.builder().id(Integer.valueOf(launchs[p])).overtimeRulesId(id).build().updateById();
			}
		}
		if(overatts.size() > 0) {
			kqglassoovertimerangemapper.insertovertimerangelist(overatts);
		}


		List<KqglAssOvertimeVice> overtimes=new ArrayList<KqglAssOvertimeVice>();
		StartTimeRestDto[] rest = overrules.getStarttime();
		if(rest != null && rest.length>0){
			for(int p=0;p<rest.length;p++){
				if(rest[p].getStarttime() != null) {
					KqglAssOvertimeVice.builder().build().delete(new QueryWrapper<KqglAssOvertimeVice>().lambda().eq(KqglAssOvertimeVice::getOvertimeRulesId, id));
					KqglAssOvertimeVice vice = new KqglAssOvertimeVice();
					vice.setOvertimeRulesId(id);
					vice.setBreakStartTime(rest[p].getStarttime());
					vice.setBreakEndTime(rest[p].getEndtime());
					vice.setOverType(rest[p].getOvertype());
					overtimes.add(vice);
				}else {
					continue;
				}

			}
		}
		if(overtimes.size()>0){
			kqglassovertimevicemapper.insertovertimeviceList(overtimes);
		}
		return  ResultUtil.data(rul, "操作成功!");
	}

	/**
	 * 	根据加班规则id获取加班规则信息
	 */
	@GetMapping(value="/Overtime/{id}")
	@ApiOperation(value = "8:根据加班规则id获取加班规则信息", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 8)
	public Result<IndividualOvertimeRuleDto> getOvertimeRules(@PathVariable("id") Integer id) {
		IndividualOvertimeRuleDto overrule = IndividualOvertimeRuleDto.builder().build();
		KqglAssoOvertimeRules rules = KqglAssoOvertimeRules.builder().id(id).build().selectById();
		List<KqglAssoOvertimeRange> overtim = kqglassoovertimerangemapper.selectList(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, rules.getId()));
		String[] arr = new String[overtim.size()];//用户名
		for (int i = 0, n = overtim.size(); i < n; i++) {
			arr[i] = overtim.get(i).getAttgroupId().toString();
		}
		KqglAssoOvertimeRulesDto ruldto = KqglAssoOvertimeRulesDto.builder().build();
		ruldto.setApplyrange(arr);
		BeanUtil.copyProperties(rules, ruldto , "starttime","applyrange");
		overrule.setRules(ruldto);
		List<KqglAssOvertimeVice> vice = new LambdaQueryChainWrapper<KqglAssOvertimeVice>(kqglassovertimevicemapper).eq(KqglAssOvertimeVice::getOvertimeRulesId, id).list();
		overrule.setStarttime(vice);
		return ResultUtil.data(overrule,"操作成功!");
	}

	/**
	 * 	删除加班规则
	 * @throws Exception
	 */
	@DeleteMapping(value = "/Overtime/{id}")
	@ApiOperation(value = "9:删除加班规则", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 9)
	public Result<Integer> deleteOvertimeRules(@PathVariable("id") Integer id) throws Exception {
		if(!KqglAssoOvertimeRules.builder().id(id).build().deleteById()) {
			throw new Exception();
		}else {

			List<KqglAssoOvertimeRange> rans = kqglassoovertimerangemapper.selectList(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, id));
			for(KqglAssoOvertimeRange ran:rans) {
				KqglMainKqz.builder().id(ran.getAttgroupId()).overtimeRulesId(0).build().updateById();
			}

			KqglAssoOvertimeRange.builder().build().delete(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, id));
			KqglAssOvertimeVice.builder().build().delete(new QueryWrapper<KqglAssOvertimeVice>().lambda().eq(KqglAssOvertimeVice::getOvertimeRulesId, id));
			return ResultUtil.success("删除成功!");
		}
	}

	/**
	 * 	编辑加班基础设置
	 */
	@PostMapping(value = "/overtime_basic_settings")
	@ApiOperation(value = "10:编辑加班基础设置", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 10)
	public Result<Object> OvertimeBasicSettings(@CurrentUser UserBean userBean,@RequestBody KqglAssoOvertimeBasics overtiasics) {
		overtiasics.setModifyUserid(userBean.getEmpNum());
		overtiasics.setModifyTime(new Date().getTime());
		overtiasics.setOrgCode(userBean.getOrgCode());
		return overtiasics.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}

	@Autowired
	private KqglAssoLeaveRulesMapper kqglassoleaverulesmapper;
	/**
	 * 初始化假期数据
	 */
	@PostMapping(value = "/initialization_data")
	@ApiOperation(value = "11:初始化假期数据", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 11)
	public Result<Object> InitializationData(@CurrentUser UserBean userBean) {
		//获取模板数据
		List<KqglAssoLeaveRules> ruless = new LambdaQueryChainWrapper<KqglAssoLeaveRules>(kqglassoleaverulesmapper).eq(KqglAssoLeaveRules::getOrgCode, 0).list();
		//查询当前公司是否已初始化
		KqglAssoLeaveRules rule = kqglassoleaverulesmapper.selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getOrgCode, userBean.getOrgCode())
				.eq(KqglAssoLeaveRules::getLeaveType, 1).last("LIMIT 1"));
		if(rule == null) {
			List<KqglAssoLeaveRules> rullist = new ArrayList<KqglAssoLeaveRules>();
			for(KqglAssoLeaveRules rul : ruless){
				KqglAssoLeaveRules vice = KqglAssoLeaveRules.builder().name(rul.getName()).company(rul.getCompany()).leaveType(rul.getLeaveType())
						.apply(rul.getApply()).createTime(new Date().getTime()).createUserid(userBean.getEmpNum()).orgCode(userBean.getOrgCode())
						.isOpen(rul.getIsOpen()).leaveBalance(rul.getLeaveBalance()).rulesType(rul.getRulesType()).build();
				rullist.add(vice);
			}
			if(rullist.size() > 0) {
				kqglassoleaverulesmapper.insertleaverulesList(rullist);
			}
			return ResultUtil.success("操作成功!");
		}else {
			return ResultUtil.success("重复初始化数据!");
		}

	}

	@Autowired
	private KqglAssoRulesViceMapper kqglassorulesvicemapper;

	/**
	 *	 新增/修改--假期规则
	 */
	@PostMapping(value = "/leave_rules")
	@ApiOperation(value = "12:新增/修改--假期规则", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 12)
	public Result<Object> LeaveRules(@CurrentUser UserBean userBean,@RequestBody KqglAssoLeaveRulesDto leaverules) {
		String current_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

		leaverules.setCreateTime(new Date().getTime());
		leaverules.setOrgCode(userBean.getOrgCode());
		leaverules.setCreateUserid(userBean.getEmpNum());
		leaverules.setIsOpen(1);//是否开启 0:否;1:是  [只针对系统项]
		KqglAssoLeaveRules learul = KqglAssoLeaveRules.builder().build();
		// 克隆 KqglAssoOvertimeRulesDto对象 到 KqglAssoOvertimeRules对象
		BeanUtil.copyProperties(leaverules, learul , "starttime");
		if (!learul.insertOrUpdate())
			return ResultUtil.error("操作失败");
		Integer id = learul.getId();
		Console.log("新增/修改--假期规则id: " + id);

		KqglAssoLeaveEmployeeBalance.builder().build().delete(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getLeaveRulesId, id)
				.eq(KqglAssoLeaveEmployeeBalance :: getOrgCode, userBean.getOrgCode()));
		List<YgglMainEmp> yggl = YgglMainEmp.builder().build().selectList(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()));

		if(leaverules.getLeaveBalance() == 1) {//假期余额 0:关(该项余额为“不限余额”);1:开(该项余额为“0”)
			//该项公司员工余额为“0”
			for(YgglMainEmp ye:yggl) {
				KqglAssoLeaveEmployeeBalance.builder().leaveRulesId(id).userid(ye.getEmpNum()).balanceDays(0.0).modifyUserid(userBean.getEmpNum()).modifyTimer(current_time).orgCode(userBean.getOrgCode()).build().insert();
			}
		}else {
			for(YgglMainEmp ye:yggl) {
				KqglAssoLeaveEmployeeBalance.builder().leaveRulesId(id).userid(ye.getEmpNum()).balanceDays(-1).modifyUserid(userBean.getEmpNum()).modifyTimer(current_time).orgCode(userBean.getOrgCode()).build().insert();
			}
		}

		List<KqglAssoRulesVice> vices = new ArrayList<KqglAssoRulesVice>();
		String[] rest = leaverules.getRange();
		if(rest.length == 0) {
			KqglAssoRulesVice.builder().build().delete(new QueryWrapper<KqglAssoRulesVice>().lambda().eq(KqglAssoRulesVice::getLeaveRulesId, id));
		}else if(rest != null && rest.length>0){
			for(int p=0;p<rest.length;p++){
				KqglAssoRulesVice.builder().build().delete(new QueryWrapper<KqglAssoRulesVice>().lambda().eq(KqglAssoRulesVice::getLeaveRulesId, id));
				KqglAssoRulesVice vice = KqglAssoRulesVice.builder().build();
				vice.setLeaveRulesId(id);
				vice.setAttgroupId(Integer.valueOf(rest[p]));
				vices.add(vice);
			}
		}
		if(vices.size()>0){
			kqglassorulesvicemapper.insertrulesviceList(vices);
		}
		return  ResultUtil.data(learul, "操作成功!");
	}

	/**
	 *	 删除假期规则
	 * @throws Exception
	 */
	@DeleteMapping(value = "/leave_rule/{id}")
	@ApiOperation(value = "13: 删除假期规则", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 13)
	public Result<Integer> Deleteleaverule(@PathVariable("id") Integer id) throws Exception {
		if(!KqglAssoLeaveRules.builder().id(id).build().deleteById()) {
			throw new Exception();
		}else {
			KqglAssoRulesVice.builder().build().delete(new QueryWrapper<KqglAssoRulesVice>().lambda().eq(KqglAssoRulesVice::getLeaveRulesId, id));
			return ResultUtil.success("删除成功!");
		}
	}

	/**
	 * 	根据假期规则id获取假期规则信息
	 */
	@GetMapping(value="/Vacation_information/{id}")
	@ApiOperation(value = "14:根据假期规则id获取假期规则信息", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 14)
	public Result<VacationInformationDto> VacationInformation(@PathVariable("id") Integer id) {
		VacationInformationDto overrule = VacationInformationDto.builder().build();
		KqglAssoLeaveRules rules = KqglAssoLeaveRules.builder().id(id).build().selectById();
		overrule.setRules(rules);
		List<KqglAssoRulesViceDto> vice = kqglassorulesvicemapper.leaveRulesIdload(id);

		overrule.setRange(vice);
		return ResultUtil.data(overrule,"操作成功!");
	}
	/**
	 *	 是否开启假期规则
	 */
	@PutMapping(value = "/leave_rules_open")
	@ApiOperation(value = "14.1:是否开启假期规则 ", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 14)
	public Result<Object> leaveRulesOpen(@RequestBody KqglAssoLeaveRulesDto kqglAssoLeaveRulesDto) {
		UpdateWrapper<KqglAssoLeaveRules> updateWrapper = new UpdateWrapper<>();
		updateWrapper.eq("id", kqglAssoLeaveRulesDto.getId()).set("is_open", kqglAssoLeaveRulesDto.getIsOpen());
		KqglAssoLeaveRules.builder().build().update(updateWrapper);
		return  ResultUtil.success();
	}


	@Autowired
	private KqglAssoKqjMapper kqglassokqjmapper;
	@Autowired
	private KqglAssoYhsbMapper kqglassoyhsbmapper;
	@Autowired
	private KqglMainKqzMapper kqglmainkqzmapper;
	/**
	 * 获取考勤机数据
	 */
	@GetMapping(value="/AttMachine")
	@ApiOperation(value = "15:获取考勤机数据-根据 组织机构代码", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 15)
	public Result<Object> getAttMachineEquipment(@CurrentUser UserBean userBean){
		List<KqglAssoKqj> attendanList = new LambdaQueryChainWrapper<KqglAssoKqj>(kqglassokqjmapper).eq(KqglAssoKqj::getQyid, userBean.getOrgCode()).list();
		return ResultUtil.data(attendanList,"操作成功!");
	}

	@PostMapping(value = "/att_machine_status")
	@ApiOperation(value = "15.1:获取考勤机状态", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 28)
	public Result<Object> AttendanceMachineStatus(@CurrentUser UserBean userBean,@RequestBody AttendanceMachineStatus balance) {

		String msg = "";
		List<AttstateDate> stas = new ArrayList<AttstateDate>();

		String[] state = balance.getState();
		if(state.length > 0) {
			for(int p=0;p<state.length;p++){
				AttstateDate sta = AttstateDate.builder().build();

				String url = mac_command+"/getDevInfo";
				HttpHeaders headers = new HttpHeaders();
				MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
				params.add("devId", state[p]);
				RestTemplate restTemplate = new RestTemplate();
				HttpEntity httpEntity = new HttpEntity(params, headers);
				try {
					ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
					com.alibaba.fastjson.JSONObject object = JSON.parseObject(request.getBody());
					msg = object.get("message").toString();
					sta.setCode(state[p]);
					sta.setState(Integer.valueOf(object.get("data").toString()));
					stas.add(sta);
				} catch (RestClientException e) {
					Logoutput("提示:考勤机服务出错-1");
					return ResultUtil.success("失败");
				}
			}
		}

		return ResultUtil.data(stas,"获取成功");
	}


	@SuppressWarnings("all")
	@GetMapping(value="/synchrotime/{code}")
	@ApiOperation(value = "考勤机一键同步", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> SynchronizationTime(@CurrentUser UserBean userBean,@PathVariable("code") String code) {

		String url = mac_command+"/setTime";
		HttpHeaders headers = new HttpHeaders();
		MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
		params.add("devId", code);
		RestTemplate restTemplate = new RestTemplate();
		HttpEntity httpEntity = new HttpEntity(params, headers);
		try {
			ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
			Logoutput(request.getBody());
		} catch (RestClientException e) {
			Logoutput("提示:考勤机服务出错-2");
			return ResultUtil.success("失败");
		}
		return ResultUtil.success("成功");
	}

	/**
	 * 	移除考勤机管理员
	 */
	@SuppressWarnings("all")
	@PostMapping(value = "/removeadministrator/{kqjid}/{id}")
	@ApiOperation(value = "移除考勤机管理员", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> RemoveAdministrator(@PathVariable int kqjid,@PathVariable int id, @RequestBody Map<String,String> mmd) {
		String[] xgyh = mmd.get("a").split(",");
		if(xgyh.length > 0){
			KqglAssoKqj kqj = KqglAssoKqj.builder().id(kqjid).build().selectById();//查询考勤机“序列号”
			for(int a=0;a<xgyh.length;a++){

				String url = mac_command+"/addUserPrivilege";
				HttpHeaders headers = new HttpHeaders();
				MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
				params.add("devId", kqj.getCode());
				params.add("userId", xgyh[a]);
				params.add("privilege", 1);
				RestTemplate restTemplate = new RestTemplate();
				HttpEntity httpEntity = new HttpEntity(params, headers);
				try {
					ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
					Logoutput(request.getBody());
				} catch (RestClientException e) {
					Logoutput("提示:考勤机服务出错-3");
					return ResultUtil.success("失败");
				}
				KqglAssoYhsb.builder().id(id).isGly(0).build().updateById();
			}
		}
		return ResultUtil.success("成功");
	}

	@SuppressWarnings("all")
	@PostMapping(value = "/modifyauthority/{kqjid}/{id}")
	@ApiOperation(value = "添加考勤机管理员", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> ModifyAuthority(@CurrentUser UserBean userBean,@PathVariable int kqjid,@PathVariable int id, @RequestBody Map<String,String> mmd) {
		String[] xgyh = mmd.get("a").split(",");
		if(xgyh.length > 0){
			KqglAssoKqj kqj = KqglAssoKqj.builder().id(kqjid).build().selectById();//查询考勤机“序列号”

			for(int a=0;a<xgyh.length;a++){


				String url = mac_command+"/addUserPrivilege";
				HttpHeaders headers = new HttpHeaders();
				MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
				params.add("devId", kqj.getCode());
				params.add("userId", xgyh[a]);
				params.add("privilege", 2);
				RestTemplate restTemplate = new RestTemplate();
				HttpEntity httpEntity = new HttpEntity(params, headers);
				try {
					ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
					Logoutput(request.getBody());
				} catch (RestClientException e) {
					Logoutput("提示:考勤机服务出错-4");
					return ResultUtil.success("失败");
				}

				UserEquiRelation kqjry = new UserEquiRelation();
				kqjry.setId(id);
				kqjry.setIsGly(1);
				userequirelationmapper.updateByPrimaryKeySelective(kqjry);
			}
		}
		return ResultUtil.success("成功");

	}


	/**
	 * 新增考勤机
	 */
	@SuppressWarnings("all")
	@PostMapping(value = "/Attendance_machine")
	@ApiOperation(value = "16:新增考勤机", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 16)
	public Result<Object> AttendanceMachine(@CurrentUser UserBean userBean,@RequestBody KqglAssoKqj kqglassokqj) {
		kqglassokqj.setLuryid(userBean.getEmpNum());
		kqglassokqj.setLusjTime(new Date().getTime());
		kqglassokqj.setQyid(userBean.getOrgCode());

		KqglAssoKqj kqj = KqglAssoKqj.builder().build().selectOne(new QueryWrapper<KqglAssoKqj>().lambda().eq(KqglAssoKqj::getCode, kqglassokqj.getCode()));
		if(kqj == null) {
			String msg = "";
			if(!kqglassokqj.insert())
				return ResultUtil.error("操作失败--新增考勤机");

			String url = mac_command+"/addDev";
			HttpHeaders headers = new HttpHeaders();
			MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
			params.add("orgCode", kqglassokqj.getType());
			params.add("devId", kqglassokqj.getCode());
			RestTemplate restTemplate = new RestTemplate();
			HttpEntity httpEntity = new HttpEntity(params, headers);
			try {
				ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
				com.alibaba.fastjson.JSONObject object = JSON.parseObject(request.getBody());
				msg = object.get("message").toString();
			} catch (RestClientException e) {
//				Logoutputln("提示:考勤机服务出错");
				return ResultUtil.success(msg);
			}

			return ResultUtil.data(kqglassokqj,msg);
		}else {
			return ResultUtil.error("考勤机已存在或已被使用");
		}


	}

	/**
	 * 删除考勤机信息
	 */
	@DeleteMapping(value = "/attmachine/{id}")
	@ApiOperation(value = "17:删除考勤机信息", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 17)
	public Result<Integer> deattmachine(@PathVariable("id") Integer id) {

		return KqglAssoKqj.builder().id(id).build().deleteById() ? ResultUtil.success("删除成功!") : ResultUtil.error("没有找到该对象");
	}

	/**
	 * 考勤机内成员
	 */
	@GetMapping(value="/aircraftmembers/{id}")
	@ApiOperation(value = "18:考勤机成员", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 18)
	public ResponseResult selectAircraftMembers(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		List<MachinememberDto> kqjcys = kqglassoyhsbmapper.selectAircraftMembers(id,userBean.getOrgCode());
		return new ResponseResult().success("考勤机成员", kqjcys);
	}

	/**
	 * 获取考勤机数据-根据 组织机构代码
	 */
	@GetMapping(value="/AttGroupMachine")
	@ApiOperation(value = "19:获取考勤机数据-根据 组织机构代码", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 19)
	public Result<Object> getAttGroupMachineList(@CurrentUser UserBean userBean) {
		List<KqglMainKqzDto> attmacList = kqglmainkqzmapper.selectAttGroupMachineByQyid(userBean.getOrgCode());
		return ResultUtil.data(attmacList);
	}

	/*********打卡地址***********/
	@Autowired
	private KqglAssoDkdzMapper kqglassodkdzmapper;
	/**
	 * 获取打卡地址数据
	 */
	@PostMapping(value = "/PunchAddress")
	@ApiOperation(value = "20:获取打卡地址数据-根据 组织机构代码-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 20)
	public Result<Object> getPunchCardAddress(@CurrentUser UserBean userBean, @RequestBody AttqueryCriteriaDto attquerycriteriadto) {
		IPage<KqglAssoDkdz> page = new Page<KqglAssoDkdz>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());

		IPage<KqglAssoDkdz> pageAs = kqglassodkdzmapper.selectPage(page, new QueryWrapper<KqglAssoDkdz>().lambda().eq(KqglAssoDkdz::getQyid, userBean.getOrgCode()).orderByDesc(KqglAssoDkdz::getId));
		List<KqglAssoDkdz> listAs = pageAs.getRecords();
		return ResultUtil.data(pageAs, listAs, "操作成功!");
	}

	/**
	 * 根据打卡地址id获取打卡地址信息
	 */
	@GetMapping(value="/PuAddress/{id}")
	@ApiOperation(value = "21:获取打卡地址信息-根据打卡地址id", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 21)
	public Result<Object> getPunchAddressByid(@PathVariable("id") Integer id) {

		return ResultUtil.data(KqglAssoDkdz.builder().id(id).build().selectById(),"操作成功!");
	}

	/**
	 * 新增/修改--打卡地址信息
	 */
	@PostMapping(value = "/PunchAddress_addmod")
	@ApiOperation(value = "22:新增/修改--打卡地址信息", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 22)
	public Result<Object> PunchCardAddress(@CurrentUser UserBean userBean,@RequestBody KqglAssoDkdz kqglassodkdz) {
		kqglassodkdz.setLuryid(userBean.getEmpNum());
		kqglassodkdz.setLusjTime(new Date().getTime());
		kqglassodkdz.setQyid(userBean.getOrgCode());
		return kqglassodkdz.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}

	/**
	 * 删除打卡地址信息
	 */
	@DeleteMapping(value = "/PunchAddress/{id}")
	@ApiOperation(value = "23:删除打卡地址信息", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 23)
	public Result<Integer> deletePunchCardAddress(@PathVariable("id") Integer id) {

		return KqglAssoDkdz.builder().id(id).build().deleteById() ? ResultUtil.success("删除成功!") : ResultUtil.error("没有找到该对象");
	}

	/*********打卡WIFI***********/
	/**
	 * 获取打卡WIFI数据
	 */
	@Autowired
	private KqglAssoDkwxMapper kqglassodkwxmapper;

	@PostMapping(value = "/PunchWIFI")
	@ApiOperation(value = "24:获取打卡WIFI数据-根据 组织机构代码-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 24)
	public Result<Object> getPunchCardWIFI(@CurrentUser UserBean userBean, @RequestBody AttqueryCriteriaDto attquerycriteriadto) {

		IPage<KqglAssoDkwx> page = new Page<KqglAssoDkwx>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());

		IPage<KqglAssoDkwx> pageAs = kqglassodkwxmapper.selectPage(page, new QueryWrapper<KqglAssoDkwx>().lambda().eq(KqglAssoDkwx::getQyid, userBean.getOrgCode()).orderByDesc(KqglAssoDkwx::getId));
		List<KqglAssoDkwx> listAs = pageAs.getRecords();
		return ResultUtil.data(pageAs, listAs, "操作成功!");
	}

	/**
	 * 根据打卡WIFIid获取打卡WIFI信息
	 */
	@GetMapping(value="/PuWIFI/{id}")
	@ApiOperation(value = "25:获取打卡WIFI信息-根据打卡WIFIid", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 25)
	public Result<Object> getPunchWIFIByid(@PathVariable("id") Integer id) {

		return ResultUtil.data(KqglAssoDkwx.builder().id(id).build().selectById(),"操作成功!");
	}

	/**
	 * 新增/修改--打卡WIFI信息
	 */
	@PostMapping(value = "/PunchWIFI_addmod")
	@ApiOperation(value = "26:新增/修改--打卡WIFI信息", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 26)
	public Result<Object> PunchCardWIFI(@CurrentUser UserBean userBean,@RequestBody KqglAssoDkwx kqglassodkwx) {

		List<KqglAssoDkwx> cxwifi = KqglAssoDkwx.builder().build().selectList(new QueryWrapper<KqglAssoDkwx>().lambda().eq(KqglAssoDkwx::getQyid, userBean.getOrgCode()).eq(KqglAssoDkwx::getMac, kqglassodkwx.getMac()));
		if(cxwifi.size() > 0 && kqglassodkwx.getId() == null) {
			return ResultUtil.error("此WiFi已存在");
		}

		kqglassodkwx.setLuryid(userBean.getEmpNum());
		kqglassodkwx.setLusjTime(new Date().getTime());
		kqglassodkwx.setQyid(userBean.getOrgCode());
		return kqglassodkwx.insertOrUpdate() ? ResultUtil.success("添加成功!") : ResultUtil.error("添加失败!");

	}

	/**
	 * 删除打卡WIFI信息
	 */
	@DeleteMapping(value = "/PunchWIFI/{id}")
	@ApiOperation(value = "27:删除打卡地址信息", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 27)
	public Result<Integer> deletePunchCardWIFI(@PathVariable("id") Integer id) {

		return KqglAssoDkwx.builder().id(id).build().deleteById() ? ResultUtil.success("删除成功!") : ResultUtil.error("没有找到该对象");
	}

	@Autowired
	private KqglAssoLeaveBalanceMapper kqglassoleavebalancemapper;
	/**
	 * 新增/修改--员工假期余额
	 */
	@PostMapping(value = "/Leave_balance")
	@ApiOperation(value = "28:新增/修改--员工假期余额", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 28)
	public Result<Object> LeaveBalance(@CurrentUser UserBean userBean,@RequestBody KqglAssoLeaveBalance balance) {
		balance.setModifyUserid(userBean.getEmpNum());
		balance.setModifyTimer(new Date().getTime());
		balance.setOrgCode(userBean.getOrgCode());
		String balanceDays = "0";
		if(balance.getModifyAction() == 1) {//增加
			balanceDays = "+" + balance.getBalanceDays();
		}else {
			balanceDays = "-" + balance.getBalanceDays();
		}

		balance.setBalanceDays(balanceDays);

		KqglAssoLeaveBalance balan = kqglassoleavebalancemapper.selectOne(new QueryWrapper<KqglAssoLeaveBalance>().lambda().eq(KqglAssoLeaveBalance::getUserid, balance.getUserid())
				.orderByDesc(KqglAssoLeaveBalance :: getModifyNumber).last("LIMIT 1"));
		if(balan != null) {
			balance.setModifyNumber(balan.getModifyNumber()+1);
		}else {
			balance.setModifyNumber(1);
		}

		//添加成功
		if(balance.insert()) {
			//查询员工假期余额表中所对应的假期id
			KqglAssoLeaveEmployeeBalance emba = KqglAssoLeaveEmployeeBalance.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getLeaveRulesId, balance.getLeaveRulesId())
					.eq(KqglAssoLeaveEmployeeBalance::getUserid, balance.getUserid()).eq(KqglAssoLeaveEmployeeBalance::getOrgCode, userBean.getOrgCode()));

			//获取最后得到的最终余额
			double balance_days = kqglassoleavebalancemapper.Sumbalancedays(balance.getUserid(), userBean.getOrgCode(),balance.getLeaveRulesId());
			if(emba != null && balance_days > 0) {

				if(emba.getBalanceDays() != -1) {//确认为限制余额的
					//修改最终的余额数
					KqglAssoLeaveEmployeeBalance.builder().id(emba.getId()).balanceDays(balance_days).build().updateById();
				}
			}else{
				if(emba.getBalanceDays() != -1) {//确认为限制余额的
					//修改最终的余额数
					KqglAssoLeaveEmployeeBalance.builder().id(emba.getId()).balanceDays(0).build().updateById();
				}
			}
		}


		return ResultUtil.success("操作成功!") ;

//		return balance.insert() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}

	/**
	 * 根据考勤余额id获取信息  ||大于“0”为有数字限制   ||为“-1”时为无数字限制
	 */
	@GetMapping(value="/hqleavebalance/{id}")
	@ApiOperation(value = "根据考勤余额id获取信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> hqleavebalance(@PathVariable("id") Integer id,@CurrentUser UserBean userBean) {
//		JiaqibalanceDto leanemp = kqglassoleavebalancemapper.selectleavebalanceList(id,userBean.getEmpNum());

		JiaqibalanceDto leanemp = JiaqibalanceDto.builder().build();

		KqglAssoLeaveEmployeeBalance emba = KqglAssoLeaveEmployeeBalance.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getUserid, userBean.getEmpNum())
				.eq(KqglAssoLeaveEmployeeBalance::getLeaveRulesId, id).eq(KqglAssoLeaveEmployeeBalance::getOrgCode, userBean.getOrgCode()));
		if(emba != null) {
			leanemp.setBalancedays(String.valueOf(emba.getBalanceDays()));
		}

		return ResultUtil.data(leanemp, "操作成功!");
	}


	/**
	 * 根据 组织机构代码获取员工假期余额表头
	 */
	@GetMapping(value="/balance_header")
	@ApiOperation(value = "29:根据 组织机构代码获取员工假期余额表头", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 29)
	public Result<Object> BalanceHeader(@CurrentUser UserBean userBean) {
//		List<KqglAssoLeaveRules> balheas = new LambdaQueryChainWrapper<KqglAssoLeaveRules>(kqglassoleaverulesmapper).eq(KqglAssoLeaveRules :: getOrgCode,userBean.getOrgCode())
//				.eq(KqglAssoLeaveRules :: getLeaveType, 2).or().eq(KqglAssoLeaveRules :: getIsOpen, 1).list();
		List<KqglAssoLeaveRules> balheas = kqglassoleaverulesmapper.selHeaderdata(userBean.getOrgCode(), 2, 1);
		return ResultUtil.data(balheas, "操作成功!");
	}

	/**
	 * 	查询列表-假期规则*******************************************
	 */
	@GetMapping(value = "/list_leave_rules")
	@ApiOperation(value = "30: 查询列表-假期规则", httpMethod = "GET", notes = " 查询列表-假期规则")
	@ApiOperationSupport(order = 30)
	public Result<Object> selectListLeaveRules(@CurrentUser UserBean userBean) {
//		List<KqglAssoLeaveRules> balheas = new LambdaQueryChainWrapper<KqglAssoLeaveRules>(kqglassoleaverulesmapper).eq(KqglAssoLeaveRules :: getOrgCode,userBean.getOrgCode())
//				.eq(KqglAssoLeaveRules :: getLeaveType, 2).or().eq(KqglAssoLeaveRules :: getIsOpen, 1).list();
		List<LeaveTypeDto> leas = new ArrayList<LeaveTypeDto>();
		KqglAssoYhkqz yhd = KqglAssoYhkqz.builder().build().selectOne(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, userBean.getEmpNum()).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));

		if(yhd != null) {
			//获取假期适用全公司的
			String company = "";
			List<KqglAssoLeaveRules> whole = kqglassoleaverulesmapper.selCompanywidedata(userBean.getOrgCode(), 2, 1);
			for(KqglAssoLeaveRules rul : whole) {
				LeaveTypeDto lea = LeaveTypeDto.builder().build();
				lea.setId(rul.getId());
				lea.setValue(rul.getName());
				if(rul.getCompany() == 1) {
					company = "天";
				}else if(rul.getCompany() == 2) {
					company = "半天";
				}else {
					company = "小时";
				}
				lea.setCompany(company);
				leas.add(lea);
			}

			List<KqglAssoLeaveRules> assholi = kqglassoleaverulesmapper.AssociatedHolidays(yhd.getKqzid());
			for(KqglAssoLeaveRules rul1 : assholi) {
				LeaveTypeDto lea = LeaveTypeDto.builder().build();
				lea.setId(rul1.getId());
				lea.setValue(rul1.getName());
				if(rul1.getCompany() == 1) {
					company = "天";
				}else if(rul1.getCompany() == 2) {
					company = "半天";
				}else {
					company = "小时";
				}
				lea.setCompany(company);
				leas.add(lea);
			}
			return ResultUtil.data(leas, "操作成功!");
		}else {
			return ResultUtil.success("请先加入考勤组") ;
		}

//		List<KqglAssoLeaveRules> balheas = kqglassoleaverulesmapper.selHeaderdata(userBean.getOrgCode(), 2, 1);
//		List<LeaveTypeDto> leas = new ArrayList<LeaveTypeDto>();
//		for(KqglAssoLeaveRules rul : balheas) {
//			LeaveTypeDto lea = LeaveTypeDto.builder().build();
//			lea.setId(rul.getId());
//			lea.setValue(rul.getName());
//			leas.add(lea);
//		}

	}

	/**
	 * 	根据组织机构代码 获取考勤组
	 */
	@GetMapping(value="/check_workatt")
	@ApiOperation(value = "31:根据组织机构代码 获取考勤组", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 31)
	public Result<Object> CheckWorkatt(@CurrentUser UserBean userBean) {
		List<KqglMainKqz> kqzs = KqglMainKqz.builder().build().selectList(new QueryWrapper<KqglMainKqz>().lambda().eq(KqglMainKqz::getQyid, userBean.getOrgCode()));
		List<LeaveTypeDto> leas = new ArrayList<LeaveTypeDto>();
		for(KqglMainKqz rul : kqzs) {
			LeaveTypeDto lea = LeaveTypeDto.builder().build();
			lea.setId(rul.getId());
			lea.setValue(rul.getName());
			leas.add(lea);
		}
		return ResultUtil.data(leas, "操作成功!");
	}

	/**
	 * 	根据组织机构代码 获取加班基础设置信息
	 */
	@PostMapping(value = "/overtime_basic_information")
	@ApiOperation(value = "32:根据组织机构代码 获取加班基础设置信息", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 32)
	public Result<Object> overtimebasicinformation(@CurrentUser UserBean userBean) {
		KqglAssoOvertimeBasics kqjdev = KqglAssoOvertimeBasics.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeBasics>().lambda().eq(KqglAssoOvertimeBasics::getOrgCode, userBean.getOrgCode()));
		return ResultUtil.data(kqjdev, "操作成功!");
	}

	/**
	 * 	查询列表-获取假期规则数据-分页
	 */
	@PostMapping(value = "/select_leave_rules")
	@ApiOperation(value = "33:获取假期规则数据-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 33)
	public Result<Object> selectleaverules(@CurrentUser UserBean userBean, @RequestBody AttqueryCriteriaDto attquerycriteriadto) {
		IPage<KqglAssoLeaveRules> page = new Page<KqglAssoLeaveRules>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());
		IPage<KqglAssoLeaveRules> pageAs = kqglassoleaverulesmapper.selectPage(page, new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getOrgCode, userBean.getOrgCode()));
		List<KqglAssoLeaveRules> listAs = pageAs.getRecords();
		List<KqglAssoLeaveRulesDto> leadto = new ArrayList<KqglAssoLeaveRulesDto>();
		for (int i = 0, n = listAs.size(); i < n; i++) {
			String[] nary = null;
			if(listAs.get(i).getApply() == 0) {//全公司
				nary = new String[1];//用户名
				nary[0] = "全公司";
			}else {//考勤组
				List<KqglAssoRulesVice> vice = kqglassorulesvicemapper.selectList(new QueryWrapper<KqglAssoRulesVice>().lambda().eq(KqglAssoRulesVice::getLeaveRulesId, listAs.get(i).getId()));
				nary = new String[vice.size()];//用户名
				for(int y = 0,l = vice.size(); y < l ; y++) {
					KqglMainKqz kqzmc = kqglmainkqzmapper.selectOne(new QueryWrapper<KqglMainKqz>().lambda().eq(KqglMainKqz::getId, vice.get(y).getAttgroupId()));
					nary[y] = kqzmc.getName();
				}
			}
			KqglAssoLeaveRulesDto learul = KqglAssoLeaveRulesDto.builder().build();
			learul.setApplyrange(nary);
			BeanUtil.copyProperties(listAs.get(i), learul , "range","applyrange");
			leadto.add(learul);
		}
		return ResultUtil.data(pageAs, leadto, "操作成功!");
	}

	/*****************考勤组***********************/
	/**
	 * 	查询列表-考勤组-分页
	 */
	@PostMapping(value = "/attendance_group")
	@ApiOperation(value = "34:查询列表-考勤组-分页", httpMethod = "POST", notes = "查询列表-考勤组-分页")
	@ApiOperationSupport(order = 34)
	public Result<Object> AttendanceGroup(@CurrentUser UserBean userBean, @Validated @RequestBody AttqueryCriteriaDto attquerycriteriadto){
		IPage<KqglMainKqzDto> page = new Page<KqglMainKqzDto>(
				attquerycriteriadto.getCurrentPage() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());
		// 缺-部门id 搜索
		IPage<KqglMainKqzDto> pageAs = kqglmainkqzmapper.selectPageByQueryKqglMain(page, attquerycriteriadto);
		List<KqglMainKqzDto> listAs = pageAs.getRecords();

		List<KqglMainKqzDto> sumlistAs = new ArrayList<KqglMainKqzDto>();

		for(KqglMainKqzDto makq : listAs) {
			KqglMainKqzDto mas = KqglMainKqzDto.builder().build();
			BeanUtil.copyProperties(makq, mas , "kqzdkfslist");

			QueryWrapper<KqglAssoKqzdkfs> queryWrapper = new QueryWrapper<>();
			queryWrapper.select("kqz_id","type","qyid","state").eq("qyid", userBean.getOrgCode())
					.eq("kqz_id", mas.getId()).groupBy("kqz_id","type","qyid","state");
			List<KqglAssoKqzdkfs> assfs = KqglAssoKqzdkfs.builder().build().selectList(queryWrapper);

			List<KqglAssoKqzdkfs> kqzdkfslist = new ArrayList<KqglAssoKqzdkfs>();
			for(KqglAssoKqzdkfs fs : assfs) {
				KqglAssoKqzdkfs dkfs = KqglAssoKqzdkfs.builder().build();
				dkfs.setKqzId(fs.getKqzId());
				dkfs.setType(fs.getType());
				kqzdkfslist.add(dkfs);
			}
			mas.setKqzdkfslist(kqzdkfslist);
			sumlistAs.add(mas);
		}

		return ResultUtil.data(pageAs, sumlistAs, "操作成功!");
	}

	/**
	 * 	获取打卡地址数据
	 */
	@GetMapping(value="/InGroupPunchAddress")
	@ApiOperation(value = "35:获取打卡地址数据", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 35)
	public Result<Object> getInGroupPunchAddress(@CurrentUser UserBean userBean) {
		List<KqglAssoDkdz> shiftList = KqglAssoDkdz.builder().build().selectList(new QueryWrapper<KqglAssoDkdz>().lambda().eq(KqglAssoDkdz::getQyid, userBean.getOrgCode()));
		return ResultUtil.data(shiftList);
	}

	/**
	 * 	获取打卡WIFI数据
	 */
	@GetMapping(value="/InGroupPunchWIFI")
	@ApiOperation(value = "36:获取打卡WIFI数据", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 36)
	public Result<Object> getInGroupPunchWIFI(@CurrentUser UserBean userBean) {
		List<KqglAssoDkwx> shiftList = KqglAssoDkwx.builder().build().selectList(new QueryWrapper<KqglAssoDkwx>().lambda().eq(KqglAssoDkwx::getQyid, userBean.getOrgCode()));
		return ResultUtil.data(shiftList);
	}

	/**
	 * 获取班次
	 */
	@GetMapping(value="/AttShift")
	@ApiOperation(value = "37:获取班次-根据 组织机构代码", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 37)
	public Result<Object> getAttShiftList(@CurrentUser UserBean userBean) {
		List<KqglAssoBcsz> attshiftList = KqglAssoBcsz.builder().build().selectList(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getQyid, userBean.getOrgCode()));
		return ResultUtil.data(attshiftList);
	}

	/**
	 * 获取员工数据
	 */
	@GetMapping(value="/Employee")
	@ApiOperation(value = "38:获取员工数据-根据 组织机构代码", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 38)
	public Result<Object> getEmployeeData(@CurrentUser UserBean userBean)  {

		lock.lock();

		List<YgglMainEmp> yggl = YgglMainEmp.builder().build().selectList(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).ne(YgglMainEmp::getJobStatus, "3"));
		lock.unlock();
		return ResultUtil.data(yggl);
	}


	//用户与设备关系表
	@Autowired
	private UserEquiRelationMapper userequirelationmapper;
	/**
	 *	 删除考勤组
	 */
	@SuppressWarnings("all")
	@DeleteMapping(value = "/AttendanceGroup/{id}")
	@ApiOperation(value = "39:删除考勤组", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 39)
	@Log(title = "考勤设置-删除考勤组", businessType = BusinessType.DELETE)
	public Result<Integer> DelAttendanceGroup(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {

		List<UserAttendanceRel> attusers = userattendancerelmapper.selectAttendanceOfficerByKqzid(id, userBean.getOrgCode());//该考勤组人数
		//该考勤组所绑定的考勤机
		List<KqglAssoKqzdkfs> kqjs = kqglassokqzdkfsmapper.selectList(new QueryWrapper<KqglAssoKqzdkfs>().lambda().eq(KqglAssoKqzdkfs::getKqzId, id).eq(KqglAssoKqzdkfs::getType, 1));
		String DevId = "";
		for(KqglAssoKqzdkfs abp:kqjs) {
			KqglAssoKqj kqj = KqglAssoKqj.builder().id(abp.getDkfsid()).build().selectById();//查询考勤机“序列号”
			if(kqj != null) {
				DevId = kqj.getCode();
				for(UserAttendanceRel user:attusers) {
					String user_id = user.getEmpnum();//"1692";//要删除的考勤组里面用户ID

					String url = mac_command+"/deleteUser";
					HttpHeaders headers = new HttpHeaders();
					MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
					params.add("devId", DevId);
					params.add("userId", user_id);
					RestTemplate restTemplate = new RestTemplate();
					HttpEntity httpEntity = new HttpEntity(params, headers);
					try {
						ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
						Logoutput(request.getBody());
					} catch (RestClientException e) {
						Logoutput("提示:考勤机服务出错-5");

						return ResultUtil.error("删除失败:提示:考勤机服务出错");
					}
				}
			}

		}

		List<AdditionalDto> userlist = kqglassoleavebalancemapper.RealTimeUpdate(userBean.getOrgCode(),id);

		if(KqglMainKqz.builder().id(id).build().deleteById()) {

			userequirelationmapper.deleteBykqzid(id);

			//删除考勤组绑定的打卡方式
			KqglAssoKqzdkfs.builder().build().delete(new QueryWrapper<KqglAssoKqzdkfs>().lambda().eq(KqglAssoKqzdkfs::getKqzId, id));
			//删除用户和考勤组关系表
			KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getKqzid, id));
			//删除特殊日期表
			KqglAssoTeshu.builder().build().delete(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, id));
			//删除排班明细表(自由排班)
			KqglAssoPbmx.builder().build().delete(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getKqzid, id));
			//删除考勤周排班
			KqglAssoZhoupaiban.builder().build().delete(new QueryWrapper<KqglAssoZhoupaiban>().lambda().eq(KqglAssoZhoupaiban::getKqzid, id));


			//刪除加班规则-应用范围
			KqglAssoOvertimeRange.builder().build().delete(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getAttgroupId, id));
			//刪除假期规则-适用范围
			KqglAssoRulesVice.builder().build().delete(new QueryWrapper<KqglAssoRulesVice>().lambda().eq(KqglAssoRulesVice::getAttgroupId, id));

			try {
				realtimeupdate.AttendanceTask(userBean.getOrgCode(), 0, 3,userlist);
			} catch (ParseException e) {
				e.printStackTrace();
			}

			return ResultUtil.data(id,"删除成功");
		}
		return ResultUtil.error("删除失败");
	}

	@Autowired
	private KqglAssoKqzdkfsMapper kqglassokqzdkfsmapper;
	@Autowired
	private KqglAssoYhkqzMapper kqglassoyhkqzmapper;
	@Autowired
	private KqglAssoZhoupaibanMapper kqglassozhoupaibanmapper;
	@Autowired
	private KqglAssoTeshuMapper kqglassoteshumapper;
	@Autowired
	private KqglAssoPbmxMapper kqglassopbmxmapper;

	@Autowired
	private RealTimeUpdate realtimeupdate;
	/**
	 * 	新建考勤组
	 */
	@SuppressWarnings("all")
	@PostMapping(value = "/AttendanceGroup")
	@ApiOperation(value = "40:新增考勤组数据", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 40)
	public Result<Object> AttendanceGroupList(@CurrentUser UserBean userBean,@RequestBody AttendanceAssistantDto attass) {
		KqglMainKqz attgro = KqglMainKqz.builder().name(attass.getName()).kqbz(attass.getRemarks()).pbfs(attass.getAtttype()).qyid(userBean.getOrgCode())
				.isWq(attass.getFieldpersonnel()).isFdjjr(attass.getLegalholidays()).isXzbcdk(attass.getOptscheduling()).sybc(String.join(",",attass.getAttShifts()))
				.isDqtx(attass.getAttRemind()).txry(String.join(",",attass.getAttRemindUserids())).txfs(attass.getAdvanceDays()).txxhts(attass.getRemCycleDays())
				.txsjTime(attass.getReminderTime()).tsfs(String.join(",",attass.getPromptingMode())).isWpbsdk(attass.getAttRemind()).kqkssjTime(attass.getNewAttTime())
				.zsgzsc(attass.getLeastworkTime()).zcgzsc(attass.getNormalWorkTime()).jbzdsc(attass.getMaxOvertimeTime()).overtimeRulesId(attass.getOvertimeRulesId())
				.restdayclock(attass.getRestdayclock()).build();

//		if (!attgro.insertOrUpdate())
		if (!attgro.insert())
			return ResultUtil.error("操作失败--新增考勤组");

		Integer attid = attgro.getId();
		Console.log("新增--考勤组id: " + attid);

		//添加加班规则
		if(attass.getOvertimeRulesId() > 0) {
			KqglAssoOvertimeRange.builder().overtimeRulesId(attass.getOvertimeRulesId()).attgroupId(attid).build().insert();
		}

		List<KqglAssoKqzdkfs> kqzdkfslist = new ArrayList<KqglAssoKqzdkfs>();
		String[] attmac = attass.getAttmachines();//考勤机
		if(attmac.length>0){
			for (int i = 0; i < attmac.length; i++) {
				KqglAssoKqzdkfs attgbpmac = KqglAssoKqzdkfs.builder().dkfsid(Integer.valueOf(attmac[i])).kqzId(attid).type(1).qyid(userBean.getOrgCode()).state(1).build();
				kqzdkfslist.add(attgbpmac);
			}
		}
		String[] atad = attass.getAttadds();//考勤地址
		if(atad.length > 0){
			for(int a=0;a<atad.length;a++){
				KqglAssoKqzdkfs attgbpadd = KqglAssoKqzdkfs.builder().dkfsid(Integer.valueOf(atad[a])).kqzId(attid).type(2).qyid(userBean.getOrgCode()).state(1).build();
				kqzdkfslist.add(attgbpadd);
			}
		}
		String[] atwf = attass.getAttwifis();//考勤WIFI
		if(atwf.length > 0){
			for(int f=0;f<atwf.length;f++){
				KqglAssoKqzdkfs attgbpwf = KqglAssoKqzdkfs.builder().dkfsid(Integer.valueOf(atwf[f])).kqzId(attid).type(3).qyid(userBean.getOrgCode()).state(1).build();
				kqzdkfslist.add(attgbpwf);
			}
		}
		if(kqzdkfslist.size()>0){
			kqglassokqzdkfsmapper.insertKqglAssokqzdKfsList(kqzdkfslist);
		}

		//用户和考勤组关系
		List<KqglAssoYhkqz> yhkqzlist = new ArrayList<KqglAssoYhkqz>();
		String[] attser = attass.getAttuserids();
		if(attser.length>0){
			for(int u=0;u<attser.length;u++){
				if(attass.getAtttype() == 2){
					KqglAssoPbmx.builder().build().delete(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, Integer.valueOf(attser[u])));
				}

				KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, Integer.valueOf(attser[u])).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));

				KqglAssoYhkqz kquser = KqglAssoYhkqz.builder().kqzid(attid).userid(Integer.valueOf(attser[u])).qyid(userBean.getOrgCode()).build();
				yhkqzlist.add(kquser);

				List<KqglAssoKqzdkfs> kqjs = kqglassokqzdkfsmapper.selectList(new QueryWrapper<KqglAssoKqzdkfs>().lambda().eq(KqglAssoKqzdkfs::getKqzId, attid).eq(KqglAssoKqzdkfs::getType, 1));

				for(KqglAssoKqzdkfs abp:kqjs) {
					KqglAssoKqj kqj = KqglAssoKqj.builder().id(abp.getDkfsid()).build().selectById();
					KqglAssoYhsb kqjry = KqglAssoYhsb.builder().build().selectOne(new QueryWrapper<KqglAssoYhsb>().lambda().eq(KqglAssoYhsb::getUserId, Integer.valueOf(attser[u])).eq(KqglAssoYhsb::getKqjid, kqj.getId()));
					if(kqjry == null) {

						YgglMainEmp yggluser = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).eq(YgglMainEmp::getEmpNum, attser[u]));
						String url = mac_command+"/addUserName";
						HttpHeaders headers = new HttpHeaders();
						MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
						params.add("devId", kqj.getCode());
						params.add("userId", attser[u]);
						params.add("userName", yggluser.getName());
						RestTemplate restTemplate = new RestTemplate();
						HttpEntity httpEntity = new HttpEntity(params, headers);
						ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
						Logoutput(request.getBody());

						KqglAssoYhsb.builder().build().delete(new QueryWrapper<KqglAssoYhsb>().lambda().eq(KqglAssoYhsb::getUserId, attser[u]).eq(KqglAssoYhsb::getKqjid, kqj.getId()));

						KqglAssoYhsb uskqj = KqglAssoYhsb.builder().userId(Integer.valueOf(attser[u])).kqjid(kqj.getId()).type(1).build();

						UserEquiRelation isgly = userequirelationmapper.selectByuserId(Integer.valueOf(attser[u]));
						if(isgly != null) {
							uskqj.setIsGly(isgly.getIsGly());
						}else {
							uskqj.setIsGly(0);
						}
						if (!uskqj.insert())
							return ResultUtil.error("操作失败--新增用户与设备关系");
					}
				}
			}

		}
		if(yhkqzlist.size()>0){
			kqglassoyhkqzmapper.insertKqglAssoKqzdkfsList(yhkqzlist);
		}

		List<KqglAssoZhoupaiban> attweeklist = new ArrayList<KqglAssoZhoupaiban>();//固定排版周记录
		String[] weektime = attass.getAttWeekdays();//周工作日【固定排班】
		String[] weekshif = attass.getAttWeekdaysShifts();//周工作日班次【固定排班】
		if(weektime.length>0 && weekshif.length>0 && attass.getAtttype() == 1){
			for(int h=0;h<weektime.length;h++){
				KqglAssoZhoupaiban attweek = KqglAssoZhoupaiban.builder().kqzid(attid).type(Integer.valueOf(weektime[h])).bcid(Integer.valueOf(weekshif[h])).build();
				attweeklist.add(attweek);
			}
		}
		String[] attFrWorkdays = attass.getAttFreeWorkdays();// 周工作日【自由工时】
		if(attFrWorkdays.length>0 && attass.getAtttype() == 3){
			for(int w=0;w<attFrWorkdays.length;w++){
				KqglAssoZhoupaiban attfrwor = KqglAssoZhoupaiban.builder().kqzid(attid).type(Integer.valueOf(attFrWorkdays[w])).bcid(0).build();
				attweeklist.add(attfrwor);
			}
		}
		if(attweeklist.size()>0){
			kqglassozhoupaibanmapper.insertKqglAssoZhoupaibanList(attweeklist);
		}


		List<KqglAssoTeshu> speclist = new ArrayList<KqglAssoTeshu>();
		String[] attmuspudata = attass.getAttMustPunchData();// 必须打卡的日期【固定排班】
		String[] attmuspushifid = attass.getAttMustPunchShifid();// 必须打卡的班次id【固定排班】
//		String[] attnonpudata = attass.getAttNonPunchData();// 不用打卡的日期【固定排班】
		ResttryfixdayDto[] attnonpudata = attass.getAttNonPunchData();// 不用打卡的日期【固定排班】

		if(attmuspudata.length>0 && attmuspushifid.length>0 && attass.getAtttype() == 1){
			for(int m=0;m<attmuspudata.length;m++){
				KqglAssoTeshu mut = KqglAssoTeshu.builder().kqzid(attid).tsrq(attmuspudata[m]).bcid(Integer.valueOf(attmuspushifid[m])).lusjTime(new Date().getTime()).luryid(userBean.getEmpNum()).type(1).build();
				speclist.add(mut);
			}
		}

		if(attnonpudata.length>0 && attass.getAtttype() == 1){
			for(int n=0;n<attnonpudata.length;n++){
				KqglAssoTeshu non = KqglAssoTeshu.builder().kqzid(attid).tsrq(attnonpudata[n].getDate()).legalday(attnonpudata[n].getWhether()).bcid(0).lusjTime(new Date().getTime()).luryid(userBean.getEmpNum()).type(2).build();
				speclist.add(non);
			}
		}
		if(speclist.size()>0){
			speclist.forEach(t ->{
				kqglassoteshumapper.insert(t);
			});
		}


		//记录排班(排班制)
		List<KqglAssoPbmxDto> schlist=new ArrayList<KqglAssoPbmxDto>();
		KqglAssoPbmxDto[] schedules = attass.getSchedules();// 排班日期【排班制】--班次id、日期
		if(schedules.length>0 && attass.getAtttype() == 2){
			for(int p=0;p<schedules.length;p++){
				KqglAssoPbmxDto sch = KqglAssoPbmxDto.builder().userid(schedules[p].getUserid()).data(schedules[p].getData()).bcid(schedules[p].getBcid()).kqzid(attid).build();
				schlist.add(sch);
			}
		}
		if(schlist.size()>0){
			kqglassopbmxmapper.insertKqglAssoPbmxList(schlist);
		}


		try {
			realtimeupdate.AttendanceTask(userBean.getOrgCode(), attid, 1,null);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return ResultUtil.data(attgro,"操作成功!");
	}

	@GetMapping(value="/Overtime_rule_default")
	@ApiOperation(value = "获取当前公司的默认加班规则", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> Overtime_rule_default(@CurrentUser UserBean userBean) {

		KqglAssoOvertimeRules defovwe = KqglAssoOvertimeRules.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRules>().lambda().eq(KqglAssoOvertimeRules::getOrgCode, userBean.getOrgCode())
				.eq(KqglAssoOvertimeRules::getOvertimeruledefault, 1));

		return ResultUtil.data(defovwe,"操作成功!");
	}


	/**
	 * 	获取当前考勤组所有人员
	 */
	@GetMapping(value="/AttUserGroupList/{id}")
	@ApiOperation(value = "获取当前考勤组所有人员", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> getAttUserGroupList(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {

		UserAttendanceRelDto usatt = UserAttendanceRelDto.builder().build();
		List<UserAttendanceRel> userattgor = userattendancerelmapper.selectAttendanceOfficerByKqzid(id,userBean.getOrgCode());
		usatt.setUseratts(userattgor);

		KqglMainKqz kqztypeid = kqglmainkqzmapper.selectOne(new QueryWrapper<KqglMainKqz>().lambda().eq(KqglMainKqz::getId, id));
		usatt.setTypeid(kqztypeid.getPbfs());

		return ResultUtil.data(usatt);
	}

	//	@SuppressWarnings("all")
	@PostMapping(value = "/setmembers")
	@ApiOperation(value = "考勤设置成员", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Attsetmembers(@CurrentUser UserBean userBean,@RequestBody AttMemberSettings attsetuser) {

		KqglMainKqz kqzm = KqglMainKqz.builder().id(attsetuser.getAttgroupid()).build().selectById();

		List<AdditionalDto> userlist = new ArrayList<AdditionalDto>();

		List<KqglAssoKqzdkfs> qtdkfs = kqglassokqzdkfsmapper.selectList(new QueryWrapper<KqglAssoKqzdkfs>().lambda().ne(KqglAssoKqzdkfs::getType, 1).eq(KqglAssoKqzdkfs::getKqzId, attsetuser.getAttgroupid()));
		if(qtdkfs.size() > 0) {
			//考勤组新增员工
			String[] addmember = attsetuser.getAddMember();
			for(int a=0;a<addmember.length;a++){

				if(kqzm.getPbfs() == 2){
					KqglAssoPbmx.builder().build().delete(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, Integer.valueOf(addmember[a])));
				}
				KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, Integer.valueOf(addmember[a])).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));

				KqglAssoYhkqz.builder().kqzid(attsetuser.getAttgroupid()).userid(Integer.valueOf(addmember[a])).qyid(userBean.getOrgCode()).build().insert();
			}

			//考勤组减少员工
			String[] removemember = attsetuser.getRemoveMember();
			for(int r=0;r<removemember.length;r++){
				//用户和考勤组关系表
				KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getKqzid, attsetuser.getAttgroupid()).eq(KqglAssoYhkqz::getUserid, removemember[r]));
			}
		}

		//确认当前考勤组是否存在考勤机打卡
		List<KqglAssoKqzdkfs> dkfs = kqglassokqzdkfsmapper.selectList(new QueryWrapper<KqglAssoKqzdkfs>().lambda().eq(KqglAssoKqzdkfs::getType, 1).eq(KqglAssoKqzdkfs::getKqzId, attsetuser.getAttgroupid()));
		if(dkfs.size() > 0) {
			for(KqglAssoKqzdkfs fss:dkfs) {
				String DevId = null;
				int kqjid = 0;
				KqglAssoKqj kqj = KqglAssoKqj.builder().id(fss.getDkfsid()).build().selectById();//查询考勤机“序列号”
				if(kqj != null) {
					DevId = kqj.getCode();
					kqjid = kqj.getId();
				}else {
					return ResultUtil.error("考勤机不存在");
				}

				//考勤组新增员工
				String[] addmember = attsetuser.getAddMember();
				String urladd = mac_command+"/addUserName";
				for(int a=0;a<addmember.length;a++){
					HttpHeaders headers = new HttpHeaders();
					MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
					params.add("devId", DevId);
					params.add("userId", addmember[a]);
					YgglMainEmp yggluser = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).eq(YgglMainEmp::getEmpNum, addmember[a]));
					params.add("userName", yggluser.getName());
					RestTemplate restTemplate = new RestTemplate();
					HttpEntity httpEntity = new HttpEntity(params, headers);
					ResponseEntity<String> request = restTemplate.postForEntity(urladd, httpEntity, String.class);
					Logoutput(request.getBody());

					//需要改下下
					KqglAssoYhsb uskqj = KqglAssoYhsb.builder().userId(Integer.valueOf(addmember[a])).kqjid(kqjid).type(1).isGly(0).build();
					if (!uskqj.insert())
						return ResultUtil.error("操作失败--新增用户与设备关系");

					if(kqzm.getPbfs() == 2){
						KqglAssoPbmx.builder().build().delete(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getUserid, Integer.valueOf(addmember[a])));
					}
					KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, Integer.valueOf(addmember[a])).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));

					KqglAssoYhkqz.builder().kqzid(attsetuser.getAttgroupid()).userid(Integer.valueOf(addmember[a])).qyid(userBean.getOrgCode()).build().insert();
				}

				//考勤组减少员工
				String[] removemember = attsetuser.getRemoveMember();
				String urlre = mac_command+"/deleteUser";
				for(int r=0;r<removemember.length;r++){
					HttpHeaders headers = new HttpHeaders();
					MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
					params.add("devId", DevId);
					params.add("userId", removemember[r]);
					RestTemplate restTemplate = new RestTemplate();
					HttpEntity httpEntity = new HttpEntity(params, headers);
					ResponseEntity<String> request = restTemplate.postForEntity(urlre, httpEntity, String.class);
					Logoutput(request.getBody());

					//用户与设备关系表
					KqglAssoYhsb.builder().build().delete(new QueryWrapper<KqglAssoYhsb>().lambda().eq(KqglAssoYhsb::getUserId, removemember[r]).eq(KqglAssoYhsb::getKqjid, kqjid).eq(KqglAssoYhsb::getType, 1));
					//考勤机管理员
					KqglAssoKqjgly.builder().build().delete(new QueryWrapper<KqglAssoKqjgly>().lambda().eq(KqglAssoKqjgly::getKqjid, kqjid).eq(KqglAssoKqjgly::getUserid, removemember[r]));
					//用户和考勤组关系表
					KqglAssoYhkqz.builder().build().delete(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getKqzid, attsetuser.getAttgroupid()).eq(KqglAssoYhkqz::getUserid, removemember[r]));
				}
			}

		}

		try {
			realtimeupdate.AttendanceTask(userBean.getOrgCode(), attsetuser.getAttgroupid(), 1,null);
		} catch (ParseException e) {
			e.printStackTrace();
		}



		return ResultUtil.success("成功");
	}


	@PutMapping(value="/switch")
	@ApiOperation(value = "41:设置假期规则开关", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 41)
	public Result<Object> setswitch(@CurrentUser UserBean userBean, @RequestBody SetConditionsDto setconditionsdto) {
		return KqglAssoLeaveRules.builder().id(setconditionsdto.getId()).isOpen(setconditionsdto.getParameters()).build().updateById() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}


	/**
	 * 获取修改的排班明细--【修改考勤组】--------------------------------------------------------------------------------------
	 */
	@PostMapping(value = "/AttGroupSchedulingList")
	@ApiOperation(value = "42:获取修改的排班明细", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 42)
	public Result<Object> getAttGroupSchedulingList(@CurrentUser UserBean userBean,@RequestBody AttSchedulingDto attscheduling) {
		String str = new SimpleDateFormat("yyyy-MM").format(new Date());
		if(("").equals(attscheduling.getDate()) || attscheduling.getDate() == null){
			attscheduling.setDate(str);
		}
		attscheduling.setQyid(userBean.getOrgCode());
		List<KqglAssoPbmxDto> schlist = kqglassopbmxmapper.selectAttGroupScheduling(attscheduling);
		return ResultUtil.data(schlist);
	}

	/**
	 * 根据考勤组id获取班次信息--【修改考勤组】
	 */
	@GetMapping(value="/roster/{id}/{date}")
	@ApiOperation(value = "43:根据考勤组id获取班次信息", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 43)
	public Result<Object> getRosterList(@PathVariable("id") Integer id,@PathVariable("date") String date) {

		KqzAttendanceGroupSearchDto jycx = KqzAttendanceGroupSearchDto.builder().overall(date).qyid(id).build();

		List<KqglAssoBcsz> shifs = kqglassobcszmapper.selectRosterByKqzid(jycx);
		return ResultUtil.data(shifs);
	}

	private SimpleDateFormat mat = new SimpleDateFormat("yyyy-MM-dd");

	//打卡记录
	@Autowired
	private PunchRecordMapper punchrecordmapper;




	@PostMapping(value = "/leave_balance_list")
	@ApiOperation(value = "45:获取假期余额列表数据", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 45)
	public Result<Object> LeaveBalanceList(@CurrentUser UserBean userBean, @Validated @RequestBody AttqueryCriteriaDto attquerycriteriadto) {
		IPage<EmployeeLeaveBalanceDto> page = new Page<EmployeeLeaveBalanceDto>(attquerycriteriadto.getCurrentPage(),attquerycriteriadto.getTotalPage());

		attquerycriteriadto.setOrgCode(userBean.getOrgCode());
		attquerycriteriadto.setEmpNum(userBean.getEmpNum());
		// 缺-部门id 搜索
		IPage<EmployeeLeaveBalanceDto> pageAs = kqglassoleavebalancemapper.selectPageByQueryLeaveBalance(page, attquerycriteriadto);

		List<EmployeeLeaveBalanceDto> listAs = pageAs.getRecords();

		List<EmployeeLeaveBalanceDto> sumlist = new ArrayList<EmployeeLeaveBalanceDto>();
		for(EmployeeLeaveBalanceDto endo : listAs) {
			EmployeeLeaveBalanceDto dets = EmployeeLeaveBalanceDto.builder().build();
			BeanUtil.copyProperties(endo, dets , "balanceTo");

			List<KqglAssoLeaveEmployeeBalance> empye = KqglAssoLeaveEmployeeBalance.builder().build().selectList(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getUserid, endo.getEmpnum())
					.eq(KqglAssoLeaveEmployeeBalance::getOrgCode, endo.getOrgcode()));
			List<BalanceSheetDataDto> balanceTo = new ArrayList<BalanceSheetDataDto>();
			for(KqglAssoLeaveEmployeeBalance empyes : empye) {
				BalanceSheetDataDto bal = BalanceSheetDataDto.builder().build();
				bal.setBalancedays(empyes.getBalanceDays());
				bal.setLeaverulesid(empyes.getLeaveRulesId());
				balanceTo.add(bal);
			}
			dets.setBalanceTo(balanceTo);
			sumlist.add(dets);

		}

		return ResultUtil.data(pageAs, sumlist, "操作成功!");
	}


	/**
	 * 	移除考勤机管理员
	 */
	@SuppressWarnings("all")
	@PostMapping(value = "/removeemp/{kqjid}/{id}")
	@ApiOperation(value = "删除考勤机内成员", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 46)
	public Result<Object> RemoveEmp(@PathVariable int kqjid,@PathVariable int id, @RequestBody Map<String,String> mmd) {
		String[] xgyh = mmd.get("a").split(",");
		if(xgyh.length > 0){
			KqglAssoKqj kqj = KqglAssoKqj.builder().id(kqjid).build().selectById();//查询考勤机“序列号”
			for(int a=0;a<xgyh.length;a++){

				String url = mac_command+"/deleteUser";
				HttpHeaders headers = new HttpHeaders();
				MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
				params.add("devId", kqj.getCode());
				params.add("userId", xgyh[a]);
				RestTemplate restTemplate = new RestTemplate();
				HttpEntity httpEntity = new HttpEntity(params, headers);
				try {
					ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
					if (!StringUtils.isEmpty(request) && request.getStatusCode() == HttpStatus.OK) {
						Logoutput(request.getBody());
						JSONObject jsonObj = JSON.parseObject(request.getBody());
						if (!"200".equals(jsonObj.getString("code"))) {
							return ResultUtil.error(jsonObj.getString("message"));
						}
					}
				} catch (RestClientException e) {
					Logoutput("提示:考勤机服务出错-3");
					return ResultUtil.success("失败");
				}
				KqglAssoYhsb.builder().id(id).build().deleteById();
			}
		}
		return ResultUtil.success("成功");
	}
	/**
	 * 	根据用户id和假期id查询余额具体数据
	 */
	@PostMapping(value = "/modify_employee_balance")
	@ApiOperation(value = "根据用户id和假期id查询余额具体数据", httpMethod = "POST", notes = "接口发布说明")
//	@ApiOperationSupport(order = 45)
	public Result<Object> ModifyEmployeeBalance(@RequestBody ModifyEmployeeBalanceDto bala) {
		List<KqglAssoLeaveBalance> ballist = kqglassoleavebalancemapper.selectList(new QueryWrapper<KqglAssoLeaveBalance>().lambda().eq(KqglAssoLeaveBalance::getLeaveRulesId, bala.getLeaverulesid()).eq(KqglAssoLeaveBalance::getUserid, bala.getEmpnum()));
		return ResultUtil.data(ballist,"操作成功!");
	}


	/**
	 * 	考勤原始记录-根据 模糊 + 高級查詢-分页
	 * @throws ParseException
	 */
	@PostMapping(value = "/attendancecalendar")
	@ApiOperation(value = "考勤原始记录-根据 模糊 + 高級查詢-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 34)
	public Result<Object> AttendanceCalendar(@CurrentUser UserBean userBean, @Validated @RequestBody OriginalRecordDto originalrecorddto) throws ParseException{

			IPage<PunchRecord> page = new Page<PunchRecord>(
				originalrecorddto.getCurrentPage() == null ? 1 : originalrecorddto.getCurrentPage(),
				originalrecorddto.getTotalPage() == null ? 10 : originalrecorddto.getTotalPage());
		originalrecorddto.setQyid(userBean.getOrgCode());
		if(!originalrecorddto.getStart().equals("") && !originalrecorddto.getEnd().equals("") && originalrecorddto.getStart() != null && originalrecorddto.getEnd() != null) {

			String sdaet = originalrecorddto.getStart() + " 00:00:00";
			String staapptime = ClockInTool.dateToStamp(sdaet);
			originalrecorddto.setStart(staapptime);

			String edate = originalrecorddto.getEnd() + " 23:59:59";
			String endapptime = ClockInTool.dateToStamp(edate);
			originalrecorddto.setEnd(endapptime);
		}


		IPage<PunchRecord> pageAs = punchrecordmapper.QueryOriginalRecord(page, originalrecorddto);
		List<PunchRecord> listAs = pageAs.getRecords();
		return ResultUtil.data(pageAs, listAs, "操作成功!");
	}


	@PostMapping(value = "/exportattendancecalendar")
	@ApiOperation(value = "", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 34)
	public Result<Object> exportattendancecalendar(@CurrentUser UserBean userBean, @Validated @RequestBody OriginalRecordDto originalrecorddto) throws ParseException{

		originalrecorddto.setQyid(userBean.getOrgCode());
		if(!originalrecorddto.getStart().equals("") && !originalrecorddto.getEnd().equals("") && originalrecorddto.getStart() != null && originalrecorddto.getEnd() != null) {
			String sdaet = originalrecorddto.getStart() + " 00:00:00";
			String staapptime = ClockInTool.dateToStamp(sdaet);
			originalrecorddto.setStart(staapptime);

			String edate = originalrecorddto.getEnd() + " 23:59:59";
			String endapptime = ClockInTool.dateToStamp(edate);
			originalrecorddto.setEnd(endapptime);
		}

		List<PunchRecord> listAs = punchrecordmapper.exportQueryOriginalRecord(originalrecorddto);

		return ResultUtil.data(listAs,"操作成功!");
	}


	/**
	 * 获取考勤组所需加班规则
	 */
	@GetMapping(value="/attovertimerules")
	@ApiOperation(value = "获取考勤组所需加班规则", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 15)
	public Result<Object> getAttOvertimeRules(@CurrentUser UserBean userBean){

		List<KqglAssoOvertimeRules> attoverrul = new LambdaQueryChainWrapper<KqglAssoOvertimeRules>(kqglassoovertimerulesmapper).eq(KqglAssoOvertimeRules::getOrgCode, userBean.getOrgCode()).list();

		return ResultUtil.data(attoverrul,"操作成功!");
	}

	@Autowired
	private KqglAssoMonthPunchSummaryMapper kqglassomonthpunchsummarymapper;
	@PostMapping(value = "/Summary_data")
	@ApiOperation(value = "获取考勤报表汇总数据", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> SummarydataList(@CurrentUser UserBean userBean, @Validated @RequestBody AttendanceSummaryQueryDto attesummqueto) throws ParseException {

		IPage<KqglAssoMonthPunchSummaryDto> page = new Page<KqglAssoMonthPunchSummaryDto>( attesummqueto.getCurrentPage(),attesummqueto.getTotalPage());
		attesummqueto.setOrgCode(userBean.getOrgCode());

		String year = null,month = null;
		String staapptime = null,endapptime = null,time_ = null;
		if(attesummqueto.getTimes() != null && !("").equals(attesummqueto.getTimes())) {
			year = attesummqueto.getTimes().substring(0, 4);
			month = attesummqueto.getTimes().substring(5, 7);

			time_ = attesummqueto.getTimes();

			String time = attesummqueto.getTimes()+"-01";
			String sdaet = ClockInTool.getMinMonthDate(time);
			staapptime = String.valueOf(ClockInTool.getStartTime(0,ClockInTool.getStringTime(sdaet,"yyyy-MM-dd")).getTime());
			String edate = ClockInTool.getMaxMonthDate(time);
			endapptime = String.valueOf(ClockInTool.getnowEndTime(23,ClockInTool.getStringTime(edate,"yyyy-MM-dd")).getTime());
		}else {
			year =  new SimpleDateFormat("yyyy").format(new Date()).toString();
			month = new SimpleDateFormat("MM").format(new Date()).toString();

			time_ = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();

			Calendar c = Calendar.getInstance();
			c.add(Calendar.MONTH, 0);
			c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
			String first = mat.format(c.getTime());
			staapptime = String.valueOf(DateUtil.getStartTime(0,DateUtil.getStringTime(first,"yyyy-MM-dd")).getTime());

			//获取当前月最后一天
			Calendar ca = Calendar.getInstance();
			ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
			String last = mat.format(ca.getTime());
			endapptime = String.valueOf(DateUtil.getnowEndTime(23,DateUtil.getStringTime(last,"yyyy-MM-dd")).getTime());
		}


		attesummqueto.setYear(year);
		attesummqueto.setMonth(month);
		attesummqueto.setStaapptime(staapptime);
		attesummqueto.setEndapptime(endapptime);

		attesummqueto.setTimes(time_);

		// 缺-部门id 搜索
		IPage<KqglAssoMonthPunchSummaryDto> pageAs = kqglassomonthpunchsummarymapper.AttendanceSummaryData(page, attesummqueto);

		List<KqglAssoMonthPunchSummaryDto> listAs = pageAs.getRecords();

		List<KqglAssoMonthPunchSummaryDto> sumlist = new ArrayList<KqglAssoMonthPunchSummaryDto>();

		for(KqglAssoMonthPunchSummaryDto endo : listAs) {
			KqglAssoMonthPunchSummaryDto dets = KqglAssoMonthPunchSummaryDto.builder().build();

			BeanUtil.copyProperties(endo, dets , "balanceTo");

//					List<KqglAssoLeaveEmployeeBalance> empye = KqglAssoLeaveEmployeeBalance.builder().build().selectList(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getUserid, endo.getNum())
//							.eq(KqglAssoLeaveEmployeeBalance::getOrgCode, endo.getOrgCode()));


			List<BalanceSheetDataDto> empye = kqglassomonthpunchsummarymapper.MonthlySummaryLeave(endo.getOrgCode(), endo.getNum(), attesummqueto.getTimes());

			List<BalanceSheetDataDto> balanceTo = new ArrayList<BalanceSheetDataDto>();
			for(BalanceSheetDataDto empyes : empye) {
				BalanceSheetDataDto bal = BalanceSheetDataDto.builder().build();
				bal.setBalancedays(empyes.getBalancedays());
				bal.setLeaverulesid(empyes.getLeaverulesid());
				balanceTo.add(bal);
			}
			dets.setBalanceTo(balanceTo);
			sumlist.add(dets);

		}

		return ResultUtil.data(pageAs, sumlist, "操作成功!");
	}

	@PostMapping(value = "/Daily_details")
	@ApiOperation(value = "获取考勤每日详情数据", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> DailydetailsList(@CurrentUser UserBean userBean, @Validated @RequestBody AttendanceSummaryQueryDto attesummqueto) throws ParseException {

		IPage<DailyDetailsDto> page = new Page<DailyDetailsDto>(
				attesummqueto.getCurrentPage() == null ? 1 : attesummqueto.getCurrentPage(),
				attesummqueto.getTotalPage() == null ? 10 : attesummqueto.getTotalPage());
		attesummqueto.setOrgCode(userBean.getOrgCode());

		String year = null,month = null,time = null;
		if(attesummqueto.getTimes() != null && !("").equals(attesummqueto.getTimes())) {
			year = attesummqueto.getTimes().substring(0, 4);
			month = attesummqueto.getTimes().substring(5, 7);
			time = attesummqueto.getTimes();
		}else {
			year =  new SimpleDateFormat("yyyy").format(new Date()).toString();
			month = new SimpleDateFormat("MM").format(new Date()).toString();

			time = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString();
		}

		attesummqueto.setYear(year);
		attesummqueto.setMonth(month);
		attesummqueto.setTimes(time);
		// 缺-部门id 搜索
		IPage<DailyDetailsDto> pageAs = kqglassomonthpunchsummarymapper.Dailydetails(page, attesummqueto);

		List<DailyDetailsDto> listAs = pageAs.getRecords();

		List<DailyDetailsDto> sumlist = new ArrayList<DailyDetailsDto>();

		//多条

		for(DailyDetailsDto endo : listAs) {
			DailyDetailsDto dets = DailyDetailsDto.builder().build();

			BeanUtil.copyProperties(endo, dets , "balanceTo");

//					List<KqglAssoLeaveEmployeeBalance> empye = KqglAssoLeaveEmployeeBalance.builder().build().selectList(new QueryWrapper<KqglAssoLeaveEmployeeBalance>().lambda().eq(KqglAssoLeaveEmployeeBalance::getUserid, endo.getNum())
//							.eq(KqglAssoLeaveEmployeeBalance::getOrgCode, endo.getOrgcode()));

			List<BalanceSheetDataDto> empye = kqglassomonthpunchsummarymapper.AttenSumDailyDetails(endo.getOrgcode(), endo.getNum(), attesummqueto.getTimes());

			List<BalanceSheetDataDto> balanceTo = new ArrayList<BalanceSheetDataDto>();
			for(BalanceSheetDataDto empyes : empye) {
				BalanceSheetDataDto bal = BalanceSheetDataDto.builder().build();
				bal.setBalancedays(empyes.getBalancedays());
				bal.setLeaverulesid(empyes.getLeaverulesid());
				balanceTo.add(bal);
			}
			dets.setBalanceTo(balanceTo);
			sumlist.add(dets);
		}

		return ResultUtil.data(pageAs, sumlist, "操作成功!");
	}


	@Autowired
	private KqglAssoDkmxMapper kqglassodkmxmapper;
	/**
	 * 	更改打卡结果
	 * @throws ParseException
	 */
	@PostMapping(value = "/change_punch_results")
	@ApiOperation(value = "更改打卡结果", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> ChangePunchResults(@CurrentUser UserBean userBean,@RequestBody ChangePunchResultsDto chpunchr) throws ParseException {
		String data = chpunchr.getData();//应更改时间yyyy-MMM-dd

		Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(data,"yyyy-MM-dd")).getTime();
		String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(startDate));//转换打卡时间格式

		String punchattdate = new SimpleDateFormat("yyyy-MM-dd").format(Double.valueOf(startDate));//转换打卡时间格式

		String minutes = chpunchr.getMinutes();//更改分钟数

		KqglAssoBcsz dkbc = kqglassobcszmapper.selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, chpunchr.getBcszid()));
		String clock_time = null;//应打卡时间
		long clock_time_ = 0l;
		long changed_time = 0l;//改过的最终时间
		int results = 0;//打卡结果

		if(dkbc != null){
			if(chpunchr.getClocktype() == 1) {
				clock_time = (data+" "+dkbc.getSbdk1()+":00").replaceAll("\r|\n", "");
			}else if(chpunchr.getClocktype() == 2) {
				clock_time = (data+" "+dkbc.getXbdk1()+":00").replaceAll("\r|\n", "");
			}else if(chpunchr.getClocktype() == 3) {
				clock_time = (data+" "+dkbc.getSbdk2()+":00").replaceAll("\r|\n", "");
			}else if(chpunchr.getClocktype() == 4) {
				clock_time = (data+" "+dkbc.getXbdk2()+":00").replaceAll("\r|\n", "");
			}else if(chpunchr.getClocktype() == 5) {
				clock_time = (data+" "+dkbc.getSbdk3()+":00").replaceAll("\r|\n", "");
			}else {
				clock_time = (data+" "+dkbc.getXbdk3()+":00").replaceAll("\r|\n", "");
			}

			if(chpunchr.getAtttype() == 1) {//正常
				changed_time = Long.valueOf(ClockInTool.dateToStamp(clock_time));
			}else if(chpunchr.getAtttype() == 2) {//迟到
				changed_time = Long.valueOf(ClockInTool.dateToStamp(ClockInTool.addtime(clock_time, minutes)));
				results = Integer.valueOf(minutes);
			}else {//早退
				changed_time = Long.valueOf(ClockInTool.dateToStamp(ClockInTool.addtime(clock_time, "-"+minutes)));
				results = Integer.valueOf(minutes);
			}

			long sbdk1 = 0,xbdk1 = 0,sbdk2 = 0,xbdk2 = 0,sbdk3 = 0,xbdk3 = 0;
			int sbdk1jg = 0,xbdk1jg = 0,sbdk2jg = 0,xbdk2jg = 0,sbdk3jg = 0,xbdk3jg = 0;

			int dkmxid = 0;

			//kqgl_asso_dkmx 打卡明细是否存在打卡记录
			KqglAssoDkmx dkmx = kqglassodkmxmapper.selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getData, chpunchr.getData()).eq(KqglAssoDkmx::getUserid, chpunchr.getNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode()));
			if(dkmx != null) {
				dkmxid = dkmx.getId();
				if(chpunchr.getClocktype() == 1) {
					sbdk1 = changed_time;
					sbdk1jg = results;
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk1(sbdk1).sbdk1jg(sbdk1jg).dktj1(2).build().updateById();
				}else if(chpunchr.getClocktype() == 2) {
					xbdk1 = changed_time;
					xbdk1jg = results;

					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk1(xbdk1).xbdk1jg(xbdk1jg).dktj2(2).build().updateById();
				}else if(chpunchr.getClocktype() == 3) {
					sbdk2 = changed_time;
					sbdk2jg = results;
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk2(sbdk2).sbdk2jg(sbdk2jg).dktj3(2).build().updateById();
				}else if(chpunchr.getClocktype() == 4) {
					xbdk2 = changed_time;
					xbdk2jg = results;
					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk2(xbdk2).xbdk2jg(xbdk2jg).dktj4(2).build().updateById();
				}else if(chpunchr.getClocktype() == 5) {
					sbdk3 = changed_time;
					sbdk3jg = results;
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk3(sbdk3).sbdk3jg(sbdk3jg).dktj5(2).build().updateById();
				}else {
					xbdk3 = changed_time;
					xbdk3jg = results;
					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk3(xbdk3).xbdk3jg(xbdk3jg).dktj6(2).build().updateById();
				}
			}else {

				KqglAssoDkmx pcd = KqglAssoDkmx.builder().userid(chpunchr.getNum()).data(data).qyid(userBean.getOrgCode()).dksj(startDate).ydkcs(dkbc.getSxbcs()*2)
						.gzsc(0d).build();
				if(chpunchr.getClocktype() == 1) {
					sbdk1 = changed_time;
					sbdk1jg = results;

					pcd.setSbdk1(sbdk1);
					pcd.setSbdk1jg(sbdk1jg);
					pcd.setDktj1(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}
				}else if(chpunchr.getClocktype() == 2) {
					xbdk1 = changed_time;
					xbdk1jg = results;

					pcd.setXbdk1(xbdk1);
					pcd.setXbdk1jg(xbdk1jg);
					pcd.setDktj2(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}

				}else if(chpunchr.getClocktype() == 3) {
					sbdk2 = changed_time;
					sbdk2jg = results;

					pcd.setSbdk2(sbdk2);
					pcd.setSbdk2jg(sbdk2jg);
					pcd.setDktj3(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}
				}else if(chpunchr.getClocktype() == 4) {
					xbdk2 = changed_time;
					xbdk2jg = results;

					pcd.setXbdk2(xbdk2);
					pcd.setXbdk2jg(xbdk2jg);
					pcd.setDktj4(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}
				}else if(chpunchr.getClocktype() == 5) {
					sbdk3 = changed_time;
					sbdk3jg = results;

					pcd.setSbdk3(sbdk3);
					pcd.setSbdk3jg(sbdk3jg);
					pcd.setDktj5(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}
				}else {
					xbdk3 = changed_time;
					xbdk3jg = results;

					pcd.setXbdk3(xbdk3);
					pcd.setXbdk3jg(xbdk3jg);
					pcd.setDktj6(2);
					if (!pcd.insert()) {
						throw new CustomException("打卡明细-新增异常-1");
					}
				}

				dkmxid = pcd.getId();
			}

			double gzsc = 0;

			long rest_time = 0;
			if(dkbc.getStartTime() != null && !("").equals(dkbc.getStartTime()) && dkbc.getEndTime() != null && !("").equals(dkbc.getEndTime())) {
				long kaishixiuxi = Long.valueOf(ClockInTool.dateToStamp(punchattdate + " " +dkbc.getStartTime()+":00"));
				long jieshuxiuxi = Long.valueOf(ClockInTool.dateToStamp(punchattdate + " " +dkbc.getEndTime()+":00"));
				rest_time = (jieshuxiuxi - kaishixiuxi)/1000/60;//休息时间
			}

			//请假时长
			KqglAssoRelationSummary qjsc = kqglassorelationsummarymapper.Businessdayclockin(userBean.getEmpNum(), 2, punchattdate, userBean.getOrgCode());

			//计算工作时长
			KqglAssoDkmx dkgzsc = KqglAssoDkmx.builder().id(dkmxid).build().selectById();
			if(dkgzsc.getYdkcs() == 2 || dkgzsc.getYdkcs() == 4 || dkgzsc.getYdkcs() == 6) {
				if(dkgzsc.getSbdk1() != null && dkgzsc.getXbdk1() != null) {
					gzsc = gzsc + (dkgzsc.getXbdk1() - dkgzsc.getSbdk1())/1000/60;
				}
			}
			if(dkgzsc.getYdkcs() == 4 || dkgzsc.getYdkcs() == 6) {
				if(dkgzsc.getSbdk2() != null && dkgzsc.getXbdk2() != null) {
					gzsc = gzsc + (dkgzsc.getXbdk2() - dkgzsc.getSbdk2())/1000/60;
				}
			}
			if(dkgzsc.getYdkcs() == 6) {
				if(dkgzsc.getSbdk3() != null && dkgzsc.getXbdk3() != null) {
					gzsc = gzsc + (dkgzsc.getXbdk3() - dkgzsc.getSbdk3())/1000/60;
				}
			}
			gzsc = gzsc - rest_time - qjsc.getDuration();

			KqglAssoDkmx.builder().id(dkmxid).gzsc(gzsc).build().updateById();

			//打卡记录表
			clock_time_ = Long.valueOf(ClockInTool.dateToStamp(clock_time));


			int type = 0;
			//0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休
			//9:管理员改为正常 10:管理员改为迟到 11:管理员改为早退  12:补卡通过/正常 13:补卡通过/迟到 14:补卡通过/早退
			int status = 2;
			if((chpunchr.getClocktype())%2 > 0){
				type = 1;

				if(results == 0) {
					status = 9;
				}else {
					status = 10;
				}
			}else {
				type = 2;

				if(results == 0) {
					status = 9;
				}else {
					status = 11;
				}
			}

			KqglAssoDkjl pre = KqglAssoDkjl.builder().dktime(changed_time).results(results).userId(chpunchr.getNum()).type(type).status(status).sort(chpunchr.getClocktype())
					.cardType(0).qyid(userBean.getOrgCode()).attdate(attdate_+" "+ClockInTool.dateToWeek2(data)).attime(clock_time_).dkmxid(dkmxid).bcid(chpunchr.getBcszid()).remarks("管理员更改操作").punchmode(0)
					.punchequipment("").build();
			if (!pre.insert()) {
				throw new CustomException("打卡记录-新增异常");
			}

			return ResultUtil.success("操作成功!");
		}else {

			return ResultUtil.error("操作失败,检查班次是否存在");
		}
	}



//	@GetMapping(value = "/summary_report")
//	@ApiOperation(value = "考勤汇总报表(暂时不用)", httpMethod = "GET", notes = "接口发布说明")
//	public Result<Object> attendance_summary_report() {
//		Map<String, Object> map = new HashMap<String, Object>();
//
//		return ResultUtil.data(map);
//	}

	/**
	 * 	查询列表-加班补偿方式
	 */
	@GetMapping(value = "/overtime_type")
	@ApiOperation(value = "222: 加班类型", httpMethod = "GET", notes = " 查询列表-加班补偿方式")
	public Result<Object> overtimetypelist(@CurrentUser UserBean userBean) {

		KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //考勤组信息
		if(attgro != null) {
			List<CompensateDto> coms = new ArrayList<CompensateDto>();

			KqglAssoYhkqz yhd = KqglAssoYhkqz.builder().build().selectOne(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, userBean.getEmpNum()).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));
			if(yhd != null) {
				KqglAssoOvertimeRange timeran = KqglAssoOvertimeRange.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getAttgroupId, yhd.getKqzid()));
				if(timeran != null) {
					KqglAssoOvertimeRules rul = KqglAssoOvertimeRules.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRules>().lambda().eq(KqglAssoOvertimeRules::getId, timeran.getOvertimeRulesId()).eq(KqglAssoOvertimeRules::getOrgCode, userBean.getOrgCode()));
					if(rul != null) {
						if(rul.getIsWorkovertime() == 1) {
							CompensateDto com = CompensateDto.builder().build();
							com.setId(1);
							com.setValue("工作日加班");
							coms.add(com);
						}
						if(rul.getIsRestovertime() == 1) {
							CompensateDto com2 = CompensateDto.builder().build();
							com2.setId(2);
							com2.setValue("休息日加班");
							coms.add(com2);
						}
						if(rul.getIsHolidays() == 1) {
							CompensateDto com3 = CompensateDto.builder().build();
							com3.setId(3);
							com3.setValue("节假日加班");
							coms.add(com3);
						}
					}
				}
			}
			return ResultUtil.data(coms, "操作成功!");
		}else {
			return ResultUtil.success("操作失败,请先加入考勤组");
		}
	}


	/**************************/
	/**
	 * 	查询列表-加班补偿方式   id:
	 */
	@GetMapping(value = "/list_compensate/{id}")
	@ApiOperation(value = "222: 查询列表-加班补偿方式", httpMethod = "GET", notes = " 查询列表-加班补偿方式")
	public Result<Object> selectListCompensate(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {

		KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //考勤组信息
		if(attgro != null) {

			List<CompensateDto> coms = new ArrayList<CompensateDto>();
			KqglAssoYhkqz yhd = KqglAssoYhkqz.builder().build().selectOne(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, userBean.getEmpNum()).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));
			if(yhd != null) {
				KqglAssoOvertimeRange timeran = KqglAssoOvertimeRange.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getAttgroupId, yhd.getKqzid()));
				if(timeran != null) {
					KqglAssoOvertimeRules rul = KqglAssoOvertimeRules.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRules>().lambda().eq(KqglAssoOvertimeRules::getId, timeran.getOvertimeRulesId()));
					if(rul != null) {
						if(id == 1) {
							if(rul.getIsWorkovertime() == 1 && rul.getWorkSwitch() == 1) {
								if(!("0").equals(rul.getWorkOne())) {
									CompensateDto com = CompensateDto.builder().build();
									com.setId(1);
									com.setValue("调休");
									coms.add(com);
								}
								if(rul.getWorkTwo() != 0) {
									CompensateDto com2 = CompensateDto.builder().build();
									com2.setId(2);
									com2.setValue("加班费");
									coms.add(com2);
								}
								if(!("0").equals(rul.getWorkThree())) {
									CompensateDto com3 = CompensateDto.builder().build();
									com3.setId(3);
									com3.setValue("调休");
									coms.add(com3);

									CompensateDto com4 = CompensateDto.builder().build();
									com4.setId(4);
									com4.setValue("加班费");
									coms.add(com4);
								}
							}
						}else if(id == 2) {
							if(rul.getIsRestovertime() == 1 && rul.getRestSwitch() == 1) {
								if(!("0").equals(rul.getRestOne())) {
									CompensateDto com = CompensateDto.builder().build();
									com.setId(1);
									com.setValue("调休");
									coms.add(com);
								}
								if(rul.getRestTwo() != 0) {
									CompensateDto com2 = CompensateDto.builder().build();
									com2.setId(2);
									com2.setValue("加班费");
									coms.add(com2);
								}
								if(!("0").equals(rul.getRestThree())) {
									CompensateDto com3 = CompensateDto.builder().build();
									com3.setId(3);
									com3.setValue("调休");
									coms.add(com3);

									CompensateDto com4 = CompensateDto.builder().build();
									com4.setId(4);
									com4.setValue("加班费");
									coms.add(com4);
								}
							}
						}else {
							if(rul.getIsHolidays() == 1 && rul.getHolidaysSwitch() == 1) {
								if(!("0").equals(rul.getHolidaysOne())) {
									CompensateDto com = CompensateDto.builder().build();
									com.setId(1);
									com.setValue("调休");
									coms.add(com);
								}
								if(rul.getHolidaysTwo() != 0) {
									CompensateDto com2 = CompensateDto.builder().build();
									com2.setId(2);
									com2.setValue("加班费");
									coms.add(com2);
								}
								if(!("0").equals(rul.getHolidaysThree())) {
									CompensateDto com3 = CompensateDto.builder().build();
									com3.setId(3);
									com3.setValue("调休");
									coms.add(com3);

									CompensateDto com4 = CompensateDto.builder().build();
									com4.setId(4);
									com4.setValue("加班费");
									coms.add(com4);
								}
							}
						}

					}
				}
			}

			return ResultUtil.data(coms, "操作成功!");
		}else {
			return ResultUtil.error("操作失败,请先加入考勤组");
		}
	}




	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);
		}
	}

	/**
	 * 	工作台日历数据
	 * @param userBean
	 * @return
	 * @throws ParseException
	 */
	@GetMapping(value = "/workbench_calendar/{date}")
	@ApiOperation(value = "999: 工作台日历数据", httpMethod = "GET", notes = "查询数据")
	public Result<Object> Workbench_calendar(@CurrentUser UserBean userBean,@PathVariable("date") String date) throws ParseException {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式

		String current = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		String yue = new SimpleDateFormat("yyyy-MM").format(new Date());

		SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM");
		Date date_;
		try {
			date_ = df1.parse(date);
		}catch (ParseException e){
			e.printStackTrace();
			date_=new Date();
		}
		int dateOne= ClockInTool.getYearMonth(date_);
		int dangqian = ClockInTool.getYearMonth(new Date());//当前

		List<WorkbenchCalendarDto> workcal = new ArrayList<WorkbenchCalendarDto>();

		if(dateOne<=dangqian){
			Long startMonth = 0l;
			Long endMonth = 0l;
			if(date == null || ("").equals(date)) {
				Calendar c = Calendar.getInstance();
				c.add(Calendar.MONTH, 0);
				c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
				String first = mat.format(c.getTime());
				startMonth = DateUtil.getStartTime(0,DateUtil.getStringTime(first,"yyyy-MM-dd")).getTime();

				endMonth = new Date().getTime();

//    	        //获取当前月最后一天
//    	        Calendar ca = Calendar.getInstance();
//    	        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
//    	        String last = mat.format(ca.getTime());
//    	        endMonth = DateUtil.getnowEndTime(23,DateUtil.getStringTime(last,"yyyy-MM-dd")).getTime();
			}else {
				String time = date+"-01";
				String sdaet = ClockInTool.getMinMonthDate(time);
				startMonth = ClockInTool.getStartTime(0,ClockInTool.getStringTime(sdaet,"yyyy-MM-dd")).getTime();
				String edate = ClockInTool.getMaxMonthDate(time);
				endMonth = ClockInTool.getnowEndTime(23,ClockInTool.getStringTime(edate,"yyyy-MM-dd")).getTime();

				if(date.equals(yue)) {
					endMonth = new Date().getTime();
				}

			}

			String[] rangeArray=ClockInTool.listToString(ClockInTool.getDays(df.format(startMonth),df.format(endMonth))).split(";");//目前为止所有日期


			String[] range=rangeArray[0].split(",");

			KqglMainKqz attgro = kqglmainkqzmapper.getAttendanceGroupInformationByUserid(userBean.getEmpNum(),userBean.getOrgCode()); //考勤组信息

			int bcid = 0;

//    		List<WorkbenchCalendarDto> workcal = new ArrayList<WorkbenchCalendarDto>();
			for(String num : range) {
				Long start_time = DateUtil.getStartTime(0,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime();
				Long end_time = DateUtil.getnowEndTime(23,DateUtil.getStringTime(num,"yyyy-MM-dd")).getTime();

				WorkbenchCalendarDto wocal = WorkbenchCalendarDto.builder().build();
				wocal.setDate(num);
				if(attgro != null) {//有无考勤组
					AttendanceCardListDto attdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),num);//获取当天所打卡班次
					List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间

					if(EmptyUtil.isNotEmpty(attdate.getAttsch())) {//班次不为空

						if(date == null || ("").equals(date)) {//未输入  当月
							if(current.equals(num)) {
								bcid = ashss.get(0).getId();//班次id
							}
						}else {//输入
							if(date.equals(yue)) {//输入为当月
								if(current.equals(num)) {
									bcid = ashss.get(0).getId();//班次id
								}
							}else {//输入不是当月
								String time = date+"-01";
								if(time.equals(num)) {
									bcid = ashss.get(0).getId();//班次id
								}
							}
						}

						KqglAssoBcsz bcsts = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, ashss.get(0).getId()));

						if(ashss.get(0).getId() != 0) {
							KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
									.ge(KqglAssoDkmx::getDksj, start_time).le(KqglAssoDkmx::getDksj, end_time));
							if(dkmc != null) {
								if(attdate.getAttsch().size() == 2 || attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) {
									if(dkmc.getSbdk1() != null && dkmc.getSbdk1jg() == 0 && dkmc.getXbdk1() != null && dkmc.getXbdk1jg() == 0) {
										wocal.setCalendar_status(1);//打卡正常
									}else {
										if(dkmc.getXbdk1() == null && attdate.getAttsch().size() == 2) {
											if(bcsts.getIsXbdk()==1) {//下班不用打卡
												wocal.setCalendar_status(1);//打卡正常
											}else {
												wocal.setCalendar_status(3);//打卡异常
											}
										}else {
											wocal.setCalendar_status(3);//打卡异常
										}

									}
								}

								if(attdate.getAttsch().size() == 4 || attdate.getAttsch().size() == 6) {
									if(dkmc.getSbdk2() != null && dkmc.getSbdk2jg() == 0 && dkmc.getXbdk2() != null && dkmc.getXbdk2jg() == 0) {
										wocal.setCalendar_status(1);//打卡正常
									}else {
										if(dkmc.getXbdk2() == null && attdate.getAttsch().size() == 4) {
											if(bcsts.getIsXbdk()==1) {//下班不用打卡
												wocal.setCalendar_status(1);//打卡正常
											}else {
												wocal.setCalendar_status(3);//打卡异常
											}
										}else {
											wocal.setCalendar_status(3);//打卡异常
										}

									}
								}

								if(attdate.getAttsch().size() == 6) {
									if(dkmc.getSbdk3() != null && dkmc.getSbdk3jg() == 0 && dkmc.getXbdk3() != null && dkmc.getXbdk3jg() == 0) {
										wocal.setCalendar_status(1);//打卡正常
									}else {
										if(dkmc.getXbdk3() == null && attdate.getAttsch().size() == 6) {
											if(bcsts.getIsXbdk()==1) {//下班不用打卡
												wocal.setCalendar_status(1);//打卡正常
											}else {
												wocal.setCalendar_status(3);//打卡异常
											}
										}else {
											wocal.setCalendar_status(3);//打卡异常
										}
									}
								}

//    		    				KqglAssoRelationSummary asssum = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum())
//    		    						.eq(KqglAssoRelationSummary::getAppTime, num).last("LIMIT 1"));
//    		    				if(asssum != null) {
//    		    					wocal.setCalendar_status(2);//事务(请假,加班,调休,出差)
//    		    				}
							}else {
								wocal.setCalendar_status(3);//打卡异常
							}


							//事务(请假,加班,调休,出差)
							KqglAssoRelationSummary asssum = KqglAssoRelationSummary.builder().build().selectOne(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum())
									.eq(KqglAssoRelationSummary::getAppTime, num).last("LIMIT 1"));
							if(asssum != null) {
								if(asssum.getApprovalType() == 5) {//补卡
									wocal.setCalendar_status(1);//打卡正常
								}else {
									wocal.setCalendar_status(2);//事务(请假,加班,调休,出差)
								}

								//0:无;1:事假;2:调休;3:病假;4:年假;5:产假;6:陪产假;7:婚假;8:例假;9:丧假;10:哺乳假;11:加班;12:出差;13:外出
								if(asssum.getApprovalType() == 1) {
									wocal.setCalendar_status_type(11);
								}else if(asssum.getApprovalType() == 2) {
									//请假
									KqglAssoLeaveRules rul = KqglAssoLeaveRules.builder().build().selectOne(new QueryWrapper<KqglAssoLeaveRules>().lambda().eq(KqglAssoLeaveRules::getId,asssum.getLeaveTypeId()));
									if(rul.getRulesType() == 1) {
										wocal.setCalendar_status_type(1);
									}else if(rul.getRulesType() == 2) {
										wocal.setCalendar_status_type(2);
									}else if(rul.getRulesType() == 3) {
										wocal.setCalendar_status_type(3);
									}else if(rul.getRulesType() == 4) {
										wocal.setCalendar_status_type(4);
									}else if(rul.getRulesType() == 5) {
										wocal.setCalendar_status_type(5);
									}else if(rul.getRulesType() == 6) {
										wocal.setCalendar_status_type(6);
									}else if(rul.getRulesType() == 7) {
										wocal.setCalendar_status_type(7);
									}else if(rul.getRulesType() == 8) {
										wocal.setCalendar_status_type(8);
									}else if(rul.getRulesType() == 9) {
										wocal.setCalendar_status_type(9);
									}else if(rul.getRulesType() == 10) {
										wocal.setCalendar_status_type(10);
									}
								}else if(asssum.getApprovalType() == 3) {
									wocal.setCalendar_status_type(12);
								}else if(asssum.getApprovalType() == 4) {
									wocal.setCalendar_status_type(13);
								}
							}


						}else {
							wocal.setCalendar_status(4);//休息
						}
					}else {
						wocal.setCalendar_status(0);//无排班
					}
				}else {
					wocal.setCalendar_status(0);//无排班
				}
				workcal.add(wocal);
			}

			List<CalendarPunchDetailsDto> detailed = new ArrayList<CalendarPunchDetailsDto>();
			CalendarPunchDetailsDto dets = CalendarPunchDetailsDto.builder().build();
//    	    dets.setDate(current);
//    	    detailed.add(dets1);

			Long starttime = DateUtil.getStartTime(0,DateUtil.getStringTime(current,"yyyy-MM-dd")).getTime();
			Long endtime = DateUtil.getnowEndTime(23,DateUtil.getStringTime(current,"yyyy-MM-dd")).getTime();

			KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build();
			if(date == null || ("").equals(date)) {//未输入  当月
				dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
						.ge(KqglAssoDkmx::getDksj, starttime).le(KqglAssoDkmx::getDksj, endtime));
				dets.setDate(current);
			}else {//输入
				if(date.equals(yue)) {//输入为当月
					dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
							.ge(KqglAssoDkmx::getDksj, starttime).le(KqglAssoDkmx::getDksj, endtime));
					dets.setDate(current);
				}else {//输入不是当月
					String time = date+"-01";
					Long starttime_ = DateUtil.getStartTime(0,DateUtil.getStringTime(time,"yyyy-MM-dd")).getTime();
					Long endtime_ = DateUtil.getnowEndTime(23,DateUtil.getStringTime(time,"yyyy-MM-dd")).getTime();

					dets.setDate(time);

					dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
							.ge(KqglAssoDkmx::getDksj, starttime_).le(KqglAssoDkmx::getDksj, endtime_));
				}
			}

//    	    KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
//    				.ge(KqglAssoDkmx::getDksj, starttime).le(KqglAssoDkmx::getDksj, endtime));

			if(dkmc!=null && dkmc.getData() != null) {
//    	    	CalendarPunchDetailsDto dets = CalendarPunchDetailsDto.builder().build();
				dets.setSbdksj1(dkmc.getSbdk1() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk1())));
				dets.setSbdksj1jg(dkmc.getSbdk1jg());
				dets.setXbdksj1(dkmc.getXbdk1() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk1())));
				dets.setXbdksj1jg(dkmc.getXbdk1jg());

				dets.setSbdksj2(dkmc.getSbdk2() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk2())));
				dets.setSbdksj2jg(dkmc.getSbdk2jg());
				dets.setXbdksj2(dkmc.getXbdk2() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk2())));
				dets.setXbdksj2jg(dkmc.getXbdk2jg());

				dets.setSbdksj3(dkmc.getSbdk3() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk3())));
				dets.setSbdksj3jg(dkmc.getSbdk3jg());
				dets.setXbdksj3(dkmc.getXbdk3() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk3())));
				dets.setXbdksj3jg(dkmc.getXbdk3jg());
//    	    	detailed.add(dets);
			}

			if(bcid > 0) {
				KqglAssoBcsz bcs = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, bcid));
				if(bcs != null) {
//    	    		CalendarPunchDetailsDto dets = CalendarPunchDetailsDto.builder().build();
					dets.setClock_num(bcs.getSxbcs()*2);
					dets.setBcsbdk1(bcs.getSbdk1() == null ? "" : bcs.getSbdk1().replaceAll("\r|\n", ""));
					dets.setBcxbdk1(bcs.getXbdk1() == null ? "" : bcs.getXbdk1().replaceAll("\r|\n", ""));
					dets.setBcsbdk2(bcs.getSbdk2() == null ? "" : bcs.getSbdk2().replaceAll("\r|\n", ""));
					dets.setBcxbdk2(bcs.getXbdk2() == null ? "" : bcs.getXbdk2().replaceAll("\r|\n", ""));
					dets.setBcsbdk3(bcs.getSbdk3() == null ? "" : bcs.getSbdk3().replaceAll("\r|\n", ""));
					dets.setBcxbdk3(bcs.getXbdk3() == null ? "" : bcs.getXbdk3().replaceAll("\r|\n", ""));
//    	    		detailed.add(dets);
				}
			}
			detailed.add(dets);
			WorkbenchCalendarDto wocal1 = WorkbenchCalendarDto.builder().build();
			wocal1.setDetailed(detailed);

			workcal.add(wocal1);
		}



		return ResultUtil.data(workcal, "操作成功!");
	}


	/**
	 * @param userBean
	 * @param date 日历年月日
	 * @return
	 * @throws ParseException
	 */
	@GetMapping(value = "/Calendar_punch_details/{date}")
	@ApiOperation(value = "999: 日历打卡详情", httpMethod = "GET", notes = "查询数据")
	public Result<Object> Calendar_punch_details(@CurrentUser UserBean userBean,@PathVariable("date") String date) throws ParseException {

		KqglMainKqz kqza = null;
		KqglAssoYhkqz yhz = KqglAssoYhkqz.builder().build().selectOne(new QueryWrapper<KqglAssoYhkqz>().lambda().eq(KqglAssoYhkqz::getUserid, userBean.getEmpNum()).eq(KqglAssoYhkqz::getQyid, userBean.getOrgCode()));
		if(yhz != null) {
			kqza = KqglMainKqz.builder().id(yhz.getKqzid()).build().selectById();
		}

		AttendanceCardListDto attdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),date);//获取当天所打卡班次

		List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间
		int bcid = 0;
		if(EmptyUtil.isNotEmpty(attdate.getAttsch())) {//班次不为空
			bcid = ashss.get(0).getId();//班次id
		}

		List<DetailsofbusinessDto> ils = new ArrayList<DetailsofbusinessDto>();
		DetailsofbusinessDto iness = DetailsofbusinessDto.builder().build();


		List<CalendarPunchDetailsDto> detslist = new ArrayList<CalendarPunchDetailsDto>();
		CalendarPunchDetailsDto dets = CalendarPunchDetailsDto.builder().build();
		dets.setDate(date);
		Long starttime = DateUtil.getStartTime(0,DateUtil.getStringTime(date,"yyyy-MM-dd")).getTime();
		Long endtime = DateUtil.getnowEndTime(23,DateUtil.getStringTime(date,"yyyy-MM-dd")).getTime();
		KqglAssoDkmx dkmc = KqglAssoDkmx.builder().build().selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getUserid, userBean.getEmpNum()).eq(KqglAssoDkmx::getQyid, userBean.getOrgCode())
				.ge(KqglAssoDkmx::getDksj, starttime).le(KqglAssoDkmx::getDksj, endtime));
		if(dkmc!=null) {
			dets.setSbdksj1(dkmc.getSbdk1() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk1())));
			dets.setSbdksj1jg(dkmc.getSbdk1jg());
			dets.setXbdksj1(dkmc.getXbdk1() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk1())));
			dets.setXbdksj1jg(dkmc.getXbdk1jg());
			dets.setSbdksj2(dkmc.getSbdk2() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk2())));
			dets.setSbdksj2jg(dkmc.getSbdk2jg());
			dets.setXbdksj2(dkmc.getXbdk2() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk2())));
			dets.setXbdksj2jg(dkmc.getXbdk2jg());
			dets.setSbdksj3(dkmc.getSbdk3() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getSbdk3())));
			dets.setSbdksj3jg(dkmc.getSbdk3jg());
			dets.setXbdksj3(dkmc.getXbdk3() == null ? "" : ClockInTool.stampToDate3(String.valueOf(dkmc.getXbdk3())));
			dets.setXbdksj3jg(dkmc.getXbdk3jg());
		}

		if(kqza != null && kqza.getPbfs() == 1) {
			KqglAssoTeshu tss = KqglAssoTeshu.builder().build().selectOne(new QueryWrapper<KqglAssoTeshu>().lambda().eq(KqglAssoTeshu::getKqzid, kqza.getId()).eq(KqglAssoTeshu::getTsrq, date));
			if(tss != null) {
				bcid = tss.getBcid();
			}
		}

		if(bcid > 0) {
			KqglAssoBcsz bcs = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, bcid));
			if(bcs != null) {
				dets.setClock_num(bcs.getSxbcs()*2);
				dets.setBcsbdk1(bcs.getSbdk1() == null ? "" : bcs.getSbdk1().replaceAll("\r|\n", ""));
				dets.setBcxbdk1(bcs.getXbdk1() == null ? "" : bcs.getXbdk1().replaceAll("\r|\n", ""));
				dets.setBcsbdk2(bcs.getSbdk2() == null ? "" : bcs.getSbdk2().replaceAll("\r|\n", ""));
				dets.setBcxbdk2(bcs.getXbdk2() == null ? "" : bcs.getXbdk2().replaceAll("\r|\n", ""));
				dets.setBcsbdk3(bcs.getSbdk3() == null ? "" : bcs.getSbdk3().replaceAll("\r|\n", ""));
				dets.setBcxbdk3(bcs.getXbdk3() == null ? "" : bcs.getXbdk3().replaceAll("\r|\n", ""));
			}
		}
		detslist.add(dets);
		iness.setCaldet(detslist);//当天打卡详情

		KqglAssoOvertimeBasics bais = KqglAssoOvertimeBasics.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeBasics>().lambda().eq(KqglAssoOvertimeBasics::getOrgCode, userBean.getOrgCode()));
		String company = "";
		if(bais != null) {
			if(bais.getMinimumUnit() == 1) {
				company = "分钟";
			}else if(bais.getMinimumUnit() == 2) {
				company = "半小时";
			}else if(bais.getMinimumUnit() == 3) {
				company = "小时";
			}else if(bais.getMinimumUnit() == 4) {
				company = "半天";
			}else if(bais.getMinimumUnit() == 5) {
				company = "天";
			}
		}

		List<CalendarDetailsDto> tais = new ArrayList<CalendarDetailsDto>();


		List<KqglAssoRelationSummary> sums = KqglAssoRelationSummary.builder().build().selectList(new QueryWrapper<KqglAssoRelationSummary>().lambda().eq(KqglAssoRelationSummary::getUserId, userBean.getEmpNum())
				.eq(KqglAssoRelationSummary::getAppTime, date).eq(KqglAssoRelationSummary::getOrgCode, userBean.getOrgCode()));
		if(sums.size() > 0) {
			for(KqglAssoRelationSummary suu : sums) {
				CalendarDetailsDto ta = CalendarDetailsDto.builder().build();
				String content = "";
				if(suu.getApprovalType() == 1) {//加班
					ta.setAffair_type(1);
					content = suu.getStartTime()+"-"+suu.getEndTime()+"加班"+suu.getDuration()+company;
				}else if(suu.getApprovalType() == 2) {//请假
					ta.setAffair_type(2);
					content = suu.getStartTime()+"-"+suu.getEndTime()+"请假"+suu.getDuration()+"天";
				}else if(suu.getApprovalType() == 3) {//出差
					ta.setAffair_type(3);
					content = suu.getStartTime()+"-"+suu.getEndTime()+"出差"+suu.getDuration()+"天";
				}else if(suu.getApprovalType() == 4) {//外出
					ta.setAffair_type(4);
					content = suu.getStartTime()+"-"+suu.getEndTime()+"外出"+suu.getDuration()+"天";
				}else if(suu.getApprovalType() == 5) {//补卡
					ta.setAffair_type(5);
					ta.setStart_time(suu.getStartTime());
					content = suu.getStartTime()+"已补卡";
				}
				ta.setDuration(String.valueOf(suu.getDuration()));
				if(suu.getApprovalType() != 5) {
					ta.setStart_time(suu.getStartTime());
					ta.setEnd_time(suu.getEndTime());
				}
				ta.setContent(content);
				tais.add(ta);
			}
		}

		iness.setCalils(tais);

		ils.add(iness);

		return ResultUtil.data(ils, "操作成功!");
	}

	@Autowired
	private KqglAssoRelationSummaryMapper kqglassorelationsummarymapper;

	@GetMapping(value = "/worktable_attendance_from/{date}")
	@ApiOperation(value = "999:工作台考勤表格", httpMethod = "GET", notes = "查询数据")
	public Result<Object> worktable_attendance_from(@CurrentUser UserBean userBean,@PathVariable("date") String date) throws ParseException {
		CalendarTableDataDto tabl = CalendarTableDataDto.builder().build();
		String belongyear = null;
		String belongmonth = null;
		String ttstr = null;//
		if(date == null || ("").equals(date)) {
			belongyear = new SimpleDateFormat("yyyy").format(new Date());
			belongmonth = new SimpleDateFormat("MM").format(new Date());
			ttstr = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();//
		}else {
			belongyear = date.substring(0, 4);
			belongmonth = date.substring(5, 7);
			ttstr = date;
		}
		//1:加班 2:请假 3:出差 4:外出 5:补卡
		KqglAssoRelationSummary qjj = kqglassorelationsummarymapper.selectTabledata(userBean.getEmpNum(), 2, ttstr);

		KqglAssoMonthPunchSummary punsum = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda().eq(KqglAssoMonthPunchSummary::getNum, userBean.getEmpNum())
				.eq(KqglAssoMonthPunchSummary::getOrgCode, userBean.getOrgCode()).eq(KqglAssoMonthPunchSummary::getBelongYear, belongyear).eq(KqglAssoMonthPunchSummary::getBelongMonth, belongmonth));

		BalanceSheetDataDto empye = kqglassomonthpunchsummarymapper.FormMonthlySummaryLeave(userBean.getOrgCode(), userBean.getEmpNum(), ttstr);

		tabl.setAttendance(punsum == null ? "" : String.valueOf(punsum.getDaysOnDuty()));// 应出勤
		tabl.setAttended(punsum == null ? "" : String.valueOf(punsum.getActualAttDays()));// 已出勤
		tabl.setLeave(qjj == null ? "" : String.valueOf(empye.getBalancedays()));// 请假*******************
		tabl.setLackworkcard(punsum == null ? "" : String.valueOf(punsum.getNumberWorkCardShortage()));// 上班缺卡
		tabl.setWorkovertime(punsum == null ? "" : String.valueOf(punsum.getTotalOvertimeHours()));// 加班
		tabl.setCompensatoryleave(punsum == null ? "" : String.valueOf(punsum.getDaysOff()));// 休息天数
		tabl.setEvection(punsum == null ? "" : String.valueOf(punsum.getLengthBusinessTrip()));// 出差
		tabl.setOffdutycardshortage(punsum == null ? "" : String.valueOf(punsum.getNumberDutyCardShortage()));// 下班缺卡

		return ResultUtil.data(tabl, "操作成功!");
	}


	@PostMapping(value = "/isitused")
	@ApiOperation(value = "(加班规则)当选择加班规则范围中存在已使用的考勤组时,在用户确认后给用户一个提示,提示用户哪个考勤组已被使用,是否修改", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Isitused(@CurrentUser UserBean userBean,@RequestBody KqglAssoOvertimeRulesDto overrules) {

		String msg = "";

		String[] launchs = overrules.getApplyrangeid();
		if(launchs.length > 0) {
			for(int p=0;p<launchs.length;p++){
				KqglAssoOvertimeRange ran = KqglAssoOvertimeRange.builder().build().selectOne(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getAttgroupId, launchs[p]));
				if(ran != null) {
					KqglMainKqz kqz = KqglMainKqz.builder().build().selectOne(new QueryWrapper<KqglMainKqz>().lambda().eq(KqglMainKqz::getId, ran.getAttgroupId()));
					if(p == 0) {
						msg += kqz.getName();
					}else {
						msg += "、"+kqz.getName();
					}

				}
			}
		}

		return ResultUtil.data(msg, "操作成功!");
	}



	@GetMapping(value="/overtime_verification/{workovertimetype}/{starttime}/{endtime}")
	@ApiOperation(value = "加班验证", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> Overtime_verification(@CurrentUser UserBean userBean,@PathVariable("workovertimetype") Integer workovertimetype,
												@PathVariable("starttime") String starttime,@PathVariable("endtime") String endtime) {

		String msg = "";
		//workovertimetype:1=工作日加班  2=休息日加班 3=节假日加班
		Integer ending = 0;
		String starttime_ = ClockInTool.Str_Time_formatting(starttime,"yyyy-MM-dd");
		String endtime_ = ClockInTool.Str_Time_formatting(endtime,"yyyy-MM-dd");

		if((starttime_).equals(endtime_)) {
			try {
				AttendanceCardListDto attdate = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),starttime_);//获取当天所打卡班次
				List<AttSchedule> ashss = attdate.getAttsch();//获取今天应打卡时间
				if(EmptyUtil.isNotEmpty(attdate.getAttsch())) {//班次不为空
					if(ashss.get(0).getId() != 0) {
						//工作日
						ending = 1;
					}else {
						//休息
						ending = 2;
					}
				}else {
					//未排班
					ending = 99;
				}
			} catch (ParseException e) {
				e.printStackTrace();
			}

		}else {//不同日期
			try {
				AttendanceCardListDto attdateone = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),starttime_);//获取当天所打卡班次
				AttendanceCardListDto attdatetwo = MethodCall(userBean.getOrgCode(),userBean.getEmpNum(),endtime_);//获取当天所打卡班次
				List<AttSchedule> ashone = attdateone.getAttsch();//获取今天应打卡时间
				List<AttSchedule> ashtwo = attdatetwo.getAttsch();//获取今天应打卡时间
				if(EmptyUtil.isNotEmpty(attdateone.getAttsch()) && EmptyUtil.isNotEmpty(attdatetwo.getAttsch())) {//班次不为空
					if(ashone.get(0).getId() != 0 && ashtwo.get(0).getId() != 0) {
						//工作日
						ending = 1;
					}else {
						//休息
						ending = 2;
					}
				}else {
					//未排班
					ending = 99;
				}
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}

		if(ending != workovertimetype) {
			//所选日期范围与加班类型不匹配,请重新选择
			msg = "所选日期范围与加班类型不匹配,请重新选择";
		}

		if(ending == 99) {
			//所选日期范围暂无排班,请联系管理员
			msg = "所选日期范围暂无排班,请联系管理员";
		}

		return ResultUtil.data(msg,"操作成功!");
	}


	@GetMapping(value = "/Weekly_attendance_data/{date}")
	@ApiOperation(value = "考勤周数据--app接口", httpMethod = "GET", notes = "查询数据")
	public Result<Object> Weekly_attendance_data(@CurrentUser UserBean userBean,@PathVariable("date") String date) throws ParseException {


		return ResultUtil.data(null,"操作成功!");
	}


	/**
	 * 	删除考勤机
	 */
	@DeleteMapping(value = "/attendance/{code}")
	@ApiOperation(value = "删除考勤机", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 3)
	public Result<Integer> DeleteAttendance(@PathVariable("code") String code) {

		KqglAssoKqj kqj = KqglAssoKqj.builder().build().selectOne(new QueryWrapper<KqglAssoKqj>().lambda().eq(KqglAssoKqj::getCode, code));
		int kqjid = kqj.getId();

		if(KqglAssoKqj.builder().id(kqjid).build().deleteById()) {
			KqglAssoYhsb.builder().build().delete(new QueryWrapper<KqglAssoYhsb>().lambda().eq(KqglAssoYhsb::getKqjid, kqjid));
			KqglAssoKqjgly.builder().build().delete(new QueryWrapper<KqglAssoKqjgly>().lambda().eq(KqglAssoKqjgly::getKqjid, kqjid));
		}

		return ResultUtil.data(null,"操作成功!");
	}





	@Value("${config-8timer.environmental-science}")
	public String environmental_science;

	public void Logoutput(String science) {

		if(!("pro").equals(environmental_science)) {

			System.out.println(science);
		}else {
			System.out.println("");
		}

	}



}