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.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

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.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

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.PunchCardDetails;
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.KqglAssoLeaveRules;
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.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.dao.kqgl.PunchCardDetailsMapper;
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.KqglAssoDkjlMapper;
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.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.AttMemberSettings;
import cn.timer.api.dto.kqmk.AttSchedulingDto;
import cn.timer.api.dto.kqmk.AttendanceAssistantDto;
import cn.timer.api.dto.kqmk.AttendanceSummaryQueryDto;
import cn.timer.api.dto.kqmk.AttqueryCriteriaDto;
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.EmployeeLeaveBalanceDto;
import cn.timer.api.dto.kqmk.IndividualOvertimeRuleDto;
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.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.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;
	
	/**
	 * 查询列表-获取班次数据-分页
	 */
	@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()));
			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("新增班次失败");
			}
	}
	
	/**
	 * 删除班次信息
	 */
	@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;
				if(listAs.get(i).getAppliedScope() == 0) {//全公司
					nary = new String[1];//用户名
					nary[0] = "全公司";
				}else {
					List<KqglAssoOvertimeRange> overtim = kqglassoovertimerangemapper.selectList(new QueryWrapper<KqglAssoOvertimeRange>().lambda().eq(KqglAssoOvertimeRange::getOvertimeRulesId, listAs.get(i).getId()));
					nary = 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();
					}
				}
				KqglAssoOvertimeRulesDto ruldto = KqglAssoOvertimeRulesDto.builder().build();
				ruldto.setApplyrange(nary);
				BeanUtil.copyProperties(listAs.get(i), ruldto , "starttime","applyrange");
				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.getApplyrange();
		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 vice = KqglAssoOvertimeRange.builder().build();
				vice.setOvertimeRulesId(id);
				vice.setAttgroupId(Integer.valueOf(launchs[p]));
				overatts.add(vice);
			}
		}
		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++){
				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);
			}
		}
		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 {
			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) {
		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);
		
		KqglAssoLeaveBalance.builder().build().delete(new QueryWrapper<KqglAssoLeaveBalance>().lambda().eq(KqglAssoLeaveBalance::getLeaveRulesId, id)
				.eq(KqglAssoLeaveBalance :: 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) {
				KqglAssoLeaveBalance.builder().leaveRulesId(id).userid(ye.getEmpNum()).modifyAction(1).balanceDays("+0")
						.reason("系统按照规则自动").modifyUserid(userBean.getEmpNum()).modifyTimer(new Date().getTime()).orgCode(userBean.getOrgCode()).isAutomatic(1).modifyNumber(1).build().insert();//员工假期余额
			}
		}else {
			for(YgglMainEmp ye:yggl) {
				KqglAssoLeaveBalance.builder().leaveRulesId(id).userid(ye.getEmpNum()).modifyAction(1).balanceDays("-1-1")
						.reason("不限制余额").modifyUserid(userBean.getEmpNum()).modifyTimer(new Date().getTime()).orgCode(userBean.getOrgCode()).isAutomatic(1).modifyNumber(1).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,"操作成功!");
	}
	
	
	@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,"操作成功!");
	}
	
	@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);
			System.err.print(request.getBody());
		} catch (RestClientException e) {
			System.err.println("提示:考勤机服务出错");
			return ResultUtil.success("失败");
		}
		return ResultUtil.success("成功");
	}
	
	/**
	 * 	移除考勤机管理员
	 */
	@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);
						System.err.print(request.getBody());
					} catch (RestClientException e) {
						System.err.println("提示:考勤机服务出错");
						return ResultUtil.success("失败");
					}
			        KqglAssoYhsb.builder().id(id).isGly(0).build().updateById();
			 }
		 }
		return ResultUtil.success("成功");
	}
	
	 @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);
					System.err.print(request.getBody());
				} catch (RestClientException e) {
					System.err.println("提示:考勤机服务出错");
					return ResultUtil.success("失败");
				}
		        
		        UserEquiRelation kqjry = new UserEquiRelation();
		        kqjry.setId(id);
		        kqjry.setIsGly(1);
		        userequirelationmapper.updateByPrimaryKeySelective(kqjry);
			}
		}
		return ResultUtil.success("成功");
		 
	}
	
	
	/**
	 * 新增考勤机
	 */
	@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) {
			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);
				System.err.print(request.getBody());
			} catch (RestClientException e) {
				System.err.println("提示:考勤机服务出错");
				return ResultUtil.success("失败");
			}
			
			return ResultUtil.data(kqglassokqj,"操作成功!");
		}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()));
			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()));
			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) {
		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());
		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);
		}
		return balance.insert() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}
	
	/**
	 * 根据 组织机构代码获取员工假期余额表头
	 */
	@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>();
		for(KqglAssoLeaveRules rul : balheas) {
			LeaveTypeDto lea = LeaveTypeDto.builder().build();
			lea.setId(rul.getId());
			lea.setValue(rul.getName());
			leas.add(lea);
		}
		return ResultUtil.data(leas, "操作成功!");
	}
	
	/**
	 * 	根据组织机构代码 获取考勤组
	 */
	@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();
			return ResultUtil.data(pageAs, listAs, "操作成功!");
	}
	
	/**
	 * 	获取打卡地址数据
	 */
	@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) {
			List<YgglMainEmp> yggl = YgglMainEmp.builder().build().selectList(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).eq(YgglMainEmp::getJobStatus, "1"));
			return ResultUtil.data(yggl);
	}
	
	//用户与设备关系表
	@Autowired
	private UserEquiRelationMapper userequirelationmapper;
	/**
	 *	 删除考勤组
	 */
	@DeleteMapping(value = "/AttendanceGroup/{id}")
	@ApiOperation(value = "39:删除考勤组", httpMethod = "DELETE", notes = "接口发布说明")
	@ApiOperationSupport(order = 39)
	public Result<Integer> DelAttendanceGroup(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		 if(KqglMainKqz.builder().id(id).build().deleteById()) {
				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);
					        ResponseEntity<String> request = restTemplate.postForEntity(url, httpEntity, String.class);
					        System.err.print(request.getBody());
						}
					}
					
				}
			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));
			
			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;
	/**
	 * 	新建考勤组
	 */
	@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()).build();
		
//		if (!attgro.insertOrUpdate()) 
		if (!attgro.insert()) 
			return ResultUtil.error("操作失败--新增考勤组");
		
		Integer attid = attgro.getId();
		Console.log("新增--考勤组id: " + attid);
		
		//添加加班规则
		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])));
				
				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) {
						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("操作失败--新增用户与设备关系");
						
						
						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);
				        System.err.print(request.getBody());
					}
				}
			}
			
		}
		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();// 不用打卡的日期【固定排班】
		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]).bcid(0).lusjTime(new Date().getTime()).luryid(userBean.getEmpNum()).type(2).build();
				speclist.add(non);
			}
		}
		if(speclist.size()>0){
			kqglassoteshumapper.insertKqglAssoTeshuList(speclist);
		}
		
		//记录排班(排班制)
		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);
		}
		
		return ResultUtil.data(attgro,"操作成功!");
	}
	
	
	
	/**
	 * 	获取当前考勤组所有人员
	 */
	@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);
	}
	
	@PostMapping(value = "/setmembers")
	@ApiOperation(value = "考勤设置成员", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Attsetmembers(@CurrentUser UserBean userBean,@RequestBody AttMemberSettings attsetuser) {
		
		//确认当前考勤组是否存在考勤机打卡
		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();//查询考勤机“序列号”
				DevId = kqj.getCode();
				kqjid = kqj.getId();
				
				//考勤组新增员工
				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);
			        System.err.print(request.getBody());
			        
			        //需要改下下
			        KqglAssoYhsb uskqj = KqglAssoYhsb.builder().userId(Integer.valueOf(addmember[a])).kqjid(kqjid).type(1).isGly(0).build();
					if (!uskqj.insert()) 
						return ResultUtil.error("操作失败--新增用户与设备关系");
					
					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);
		            System.err.print(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]));
				}
			}
			
		}
		
        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 KqglAssoDkjlMapper kqglassodkjlmapper;
	
	//打卡记录
	@Autowired
	private PunchRecordMapper punchrecordmapper;
	//打卡明细表
	@Autowired
	private PunchCardDetailsMapper punchcarddetailsservice;
	/**
	 * 修改考勤组排班(修改排班后,需判断是否有打卡记录,有则匹配当天修改后的班次,无则不需要修改)
	 * @throws ParseException 
	 */
	@PutMapping(value = "/attscheduling")
	@ApiOperation(value = "44:修改考勤组排班", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 44)
	public Result<Object> updateAttscheduling(@CurrentUser UserBean userBean,@RequestBody AttendanceAssistantDto attass) throws ParseException {
		int id = Integer.valueOf(attass.getAttgroupid());//修改数据id
		
		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(Integer.valueOf(attass.getAttgroupid())).build();
				schlist.add(sch);
				String data = mat.format(new Date(schedules[p].getData().toString()));
				Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(data,"yyyy-MM-dd")).getTime();
				Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(data,"yyyy-MM-dd")).getTime();
				
				KqglAssoBcsz banci = KqglAssoBcsz.builder().build().selectOne(new QueryWrapper<KqglAssoBcsz>().lambda().eq(KqglAssoBcsz::getId, schedules[p].getBcid()));
				Long sbdk1 = 0l,xbdk1 = 0l,sbdk2 = 0l,xbdk2 = 0l,sbdk3 = 0l,xbdk3 = 0l;
				if(banci != null){
					if(banci.getSxbcs()== 1 || banci.getSxbcs()== 2 || banci.getSxbcs()== 3){
						sbdk1 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getSbdk1(),2)+":00"));
						xbdk1 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getXbdk1(),2)+":00"));
					}
					if(banci.getSxbcs()== 2 || banci.getSxbcs()== 3){
						sbdk2 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getSbdk2(),2)+":00"));
						xbdk2 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getXbdk2(),2)+":00"));
					}
					if(banci.getSxbcs()== 3){
						sbdk3 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getSbdk3(),2)+":00"));
						xbdk3 = Long.valueOf(ClockInTool.dateToStamp(data+" "+ClockInTool.dealDateFormat(banci.getXbdk3(),2)+":00"));
					}
				}
				
				KqglAssoDkjl mapuca = KqglAssoDkjl.builder().build().selectOne(new QueryWrapper<KqglAssoDkjl>().lambda().gt(KqglAssoDkjl::getAttime, startDate).lt(KqglAssoDkjl::getAttime, endDate).eq(KqglAssoDkjl::getUserId, schedules[p].getUserid()).last("LIMIT 1"));
				
				List<KqglAssoDkjl> mapucalist = kqglassodkjlmapper.selectList(new QueryWrapper<KqglAssoDkjl>().lambda().gt(KqglAssoDkjl::getAttime, startDate).lt(KqglAssoDkjl::getAttime, endDate).eq(KqglAssoDkjl::getUserId, schedules[p].getUserid()).orderByAsc(KqglAssoDkjl::getId));
				
				if(mapuca != null && !(schedules[p].getBcid()).equals(mapuca.getBcid())){
//					List<KqglAssoDkjl> initial = kqglassodkjlmapper.selectList(new QueryWrapper<KqglAssoDkjl>().lambda().gt(KqglAssoDkjl::getAttime, startDate).lt(KqglAssoDkjl::getAttime, endDate).eq(KqglAssoDkjl::getUserId, schedules[p].getUserid()).orderByAsc(KqglAssoDkjl::getId));
					if(mapucalist.size() > 0){
						RestMethod(mapucalist,mapucalist.get(0).getDkmxid());
					}
				}
				KqglAssoDkjl minAttid = null,maxAttid = null;
				int dkmxid = 0;
				if(mapucalist.size() > 0){
					//最小值
			        minAttid = mapucalist.stream().min(Comparator.comparing(KqglAssoDkjl::getId)).get();
					//最大值
					maxAttid = mapucalist.stream().max(Comparator.comparing(KqglAssoDkjl::getId)).get();
					//对应打卡明细表id
					dkmxid = maxAttid.getDkmxid();
				}
				//当天有打卡记录且当天打卡班次和当前修改后的班次不匹配再进行重新维护
				if(mapuca != null && !(schedules[p].getBcid()).equals(mapuca.getBcid())){
					if(banci != null){//修改后有班次打卡
						if(banci.getSxbcs() == 1){//修改后一天打两次
							if(mapucalist.size() > 2){/////当天打卡多条的话 取最开始打的卡和最后打的卡 作为新一轮的上下班考勤
								for(KqglAssoDkjl pre : mapucalist){
									if(pre.getId() != minAttid.getId() && pre.getId() != maxAttid.getId()){//去除最大和最小 其他均改为“打卡无效:此记录已被更新”
										int results=0;long attime;
										if((pre.getSort())%2 > 0){
											Long time = (pre.getDktime() - sbdk1)/1000/60;
											if(time > 0){ results= Integer.valueOf(time.toString());}
											attime= sbdk1;//上班应打卡时间
										}else{
											Long time = (pre.getDktime() - xbdk1)/1000/60;
											if(time > 0){}else{results = Math.abs(Integer.valueOf(time.toString()));}
											attime = xbdk1;//下班应打卡时间
										}
										KqglAssoDkjl.builder().id(pre.getId()).status(0).sort(0).results(results).attime(attime).bcid(banci.getId()).build().updateById();
									}else {
										if(pre.getId() == minAttid.getId()){//上班
											Long time = (pre.getDktime() - sbdk1)/1000/60;
											int status=0,results=0;//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
											if(time > 0){ status=3; results=Integer.valueOf(time.toString());}else{ status = 1; results = 0;}
											KqglAssoDkjl.builder().id(pre.getId()).type(1).status(status).results(results).attime(sbdk1).bcid(banci.getId()).build().updateById();
										}else if(pre.getId() == maxAttid.getId()){//下班
											Long time = (pre.getDktime() - xbdk1)/1000/60;
											int status=0,results=0;
											if(time > 0){ status = 1; results = 0;}else{ status = 4; results = Math.abs(Integer.valueOf(time.toString()));}
											KqglAssoDkjl.builder().id(pre.getId()).type(2).status(status).results(results).attime(xbdk1).bcid(banci.getId()).sort(2).build().updateById();
										}
									}
								}
								KqglAssoDkjl mindata = KqglAssoDkjl.builder().id(minAttid.getId()).build().selectById();
								KqglAssoDkmx.builder().id(dkmxid).sbdk1(mindata.getDktime()).sbdk1jg(mindata.getResults()).xbdk1(null).xbdk1jg(0).sbdk2(null).sbdk2jg(0).xbdk2(null)
										.xbdk2jg(0).sbdk3(null).sbdk3jg(0).ydkcs(banci.getSxbcs()*2).gzsc(Double.valueOf("0")).build().updateById();
								
								KqglAssoDkjl maxdata = KqglAssoDkjl.builder().id(maxAttid.getId()).build().selectById();
								Long woktimes = (maxdata.getDktime() - mindata.getDktime())/1000/60;
								KqglAssoDkmx.builder().id(dkmxid).xbdk1(maxdata.getDktime()).xbdk1jg(maxdata.getResults()).gzsc(Double.valueOf(woktimes)).build().updateById();
							}else {
								KqglAssoDkjl mindataone = null;
								if(minAttid != null || maxAttid != null){
									int status=0,results=0;
									Long time = (mapucalist.get(0).getDktime() - sbdk1)/1000/60;
									if(time > 0){ status = 3; results = Integer.valueOf(time.toString()); }else{ status = 1; results=0; }
									KqglAssoDkjl.builder().id(mapucalist.get(0).getId()).type(1).status(status).results(results).attime(sbdk1).bcid(banci.getId()).build().updateById();
									mindataone = KqglAssoDkjl.builder().id(minAttid.getId()).build().selectById();
									KqglAssoDkmx.builder().id(dkmxid).sbdk1(mindataone.getDktime()).sbdk1jg(mindataone.getResults()).ydkcs(banci.getSxbcs()*2).gzsc(Double.valueOf("0")).build().updateById();
								}
								
								if(maxAttid != null && minAttid.getId() != maxAttid.getId()){
									int status=0,results=0;
									Long time = (mapucalist.get(1).getDktime() - xbdk1)/1000/60;
									if(time > 0){ status = 1; results=0; }else{ status = 4; results = Math.abs(Integer.valueOf(time.toString())); }
									KqglAssoDkjl.builder().id(mapucalist.get(1).getId()).type(2).status(status).results(results).attime(xbdk1).bcid(banci.getId()).sort(2).build().updateById();
									KqglAssoDkjl maxdata = KqglAssoDkjl.builder().id(maxAttid.getId()).build().selectById();
									Long woktimes = (maxdata.getDktime() - mindataone.getDktime())/1000/60;
									KqglAssoDkmx.builder().id(dkmxid).xbdk1(maxdata.getDktime()).xbdk1jg(maxdata.getResults()).gzsc(Double.valueOf(woktimes)).build().updateById();
								}
							}
						}else if(banci.getSxbcs() == 2){//修改后一天打四次
							if(mapucalist.size() > 4){//当天打卡多次
								String[] str= new String[3];
								for(int y=0;y<mapucalist.size();y++){
									if(y == 0){//上班
										PunchRecord mindata = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										Long time = (mindata.getDktime() - sbdk1)/1000/60;
										if(time > 0){
											record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
											record.setResults(Integer.valueOf(time.toString()));// 打卡结果
										}else{
											record.setStatus(1);
											record.setResults(0);// 打卡结果
										}
										record.setAttime(sbdk1);
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
									if(y == 1 || y == 2){
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										if((mapucalist.get(y).getSort())%2 == 0){//下班
											Long time = (mapucalist.get(y).getDktime() - xbdk1)/1000/60;
											if(time > 0){
												record.setStatus(1);
												record.setResults(0);// 打卡结果
											}else{
												record.setStatus(4);
												record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
											}
											record.setAttime(xbdk1);//下班应打卡时间
											str[0] = String.valueOf(mapucalist.get(y).getId());
										}else{//上班
											Long time = (mapucalist.get(y).getDktime() - sbdk2)/1000/60;
											if(time > 0){
												record.setStatus(3);
												record.setResults(Integer.valueOf(time.toString()));// 打卡结果
											}else{
												record.setStatus(1);
												record.setResults(0);// 打卡结果
											}
											record.setAttime(sbdk2);//上班应打卡时间
											
											str[1] = String.valueOf(mapucalist.get(y).getId());
										}
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
									PunchRecord maxdata = punchrecordmapper.selectByPrimaryKey(maxAttid.getId());//下班
									if(mapucalist.get(y).getId() == maxdata.getId()){//下班
										PunchRecord record = new PunchRecord();
										record.setId(maxdata.getId());
										record.setType(2);//下班
										Long time = (maxdata.getDktime() - xbdk2)/1000/60;
										if(time > 0){
											record.setStatus(1);
											record.setResults(0);// 打卡结果
										}else{
											record.setStatus(4);
											record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
										}
										record.setSort(4);
										record.setAttime(xbdk2);
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
										
										str[2] = String.valueOf(maxdata.getId());
									}
									if(y == 3 || y > 3 && mapucalist.get(y).getId() != maxdata.getId()){
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										record.setStatus(0);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setSort(0);//序号(0:打卡无效:此记录已被更新)
										record.setResults(0);// 打卡结果
										record.setAttime(mapucalist.get(y).getDktime());//上班应打卡时间
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
								}
								//修改打卡明细
								PunchRecord mindata = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
								PunchCardDetails record = new PunchCardDetails();
								record.setId(dkmxid);//需修改的明细id
								record.setSbdk1(mindata.getDktime());
								record.setSbdk1jg(mindata.getResults());// 上班1打卡结果
								record.setXbdk1(null);
								record.setXbdk1jg(0);// 下班1打卡结果
								record.setSbdk2(null);
								record.setSbdk2jg(0);// 上班2打卡结果
								record.setXbdk2(null);
								record.setXbdk2jg(0);// 下班2打卡结果
								record.setSbdk3(null);
								record.setSbdk3jg(0);// 上班3打卡结果
								record.setXbdk3(null);
								record.setXbdk3jg(0);// 下班3打卡结果
								record.setYdkcs(banci.getSxbcs()*2);//应打卡次数
								record.setGzsc(Double.valueOf("0"));
								punchcarddetailsservice.ModifyPunchDetails(record);
								for(int t=0;t<str.length;t++){
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(Integer.valueOf(str[t]));//单条打卡明细
									
									PunchCardDetails dkmx = new PunchCardDetails();
									dkmx.setId(dkmxid);//需修改的明细id
									if(t == 0){
										dkmx.setXbdk1(dtdkmx.getDktime());
										dkmx.setXbdk1jg(dtdkmx.getResults());// 下班1打卡结果
									}else if(t == 1){
										dkmx.setSbdk2(dtdkmx.getDktime());
										dkmx.setSbdk2jg(dtdkmx.getResults());// 上班2打卡结果
									}else{
										dkmx.setXbdk2(dtdkmx.getDktime());
										dkmx.setXbdk2jg(dtdkmx.getResults());// 下班2打卡结果
									}
									Long woktimes = (dtdkmx.getDktime() - mindata.getDktime())/1000/60;
									dkmx.setGzsc(Double.valueOf(woktimes));
									punchcarddetailsservice.updateByPrimaryKeySelective(dkmx);
								}
							}else{//打卡小于4次
								PunchRecord mindataone = null;
								if(minAttid != null || maxAttid != null){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(0).getId());//当天一条记录的id
									record.setType(1);//上班
									Long time = (mapucalist.get(0).getDktime() - sbdk1)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(sbdk1);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									mindataone = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
									PunchCardDetails dan = new PunchCardDetails();
									dan.setId(dkmxid);//需修改的明细id
									dan.setSbdk1(mindataone.getDktime());
									dan.setSbdk1jg(mindataone.getResults());// 上班1打卡结果
									dan.setYdkcs(banci.getSxbcs()*2);//应打卡次数
									dan.setGzsc(Double.valueOf("0"));
									punchcarddetailsservice.updateByPrimaryKeySelective(dan);
								}
								PunchCardDetails pcd = new PunchCardDetails();
								if(mapucalist.size() >= 2){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(1).getId());//当天一条记录的id
									record.setType(2);
									Long time = (mapucalist.get(1).getDktime() - xbdk1)/1000/60;
									if(time > 0){
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}else{
										record.setStatus(4);
										record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
									}
									record.setAttime(xbdk1);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(1).getId());//单条打卡明细
									pcd.setXbdk1(dtdkmx.getDktime());
									pcd.setXbdk1jg(dtdkmx.getResults());
								}
								if(mapucalist.size() >= 3){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(2).getId());//当天一条记录的id
									record.setType(1);
									Long time = (mapucalist.get(2).getDktime() - sbdk2)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(sbdk2);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(2).getId());//单条打卡明细
									pcd.setSbdk2(dtdkmx.getDktime());
									pcd.setSbdk2jg(dtdkmx.getResults());
								}
								if(mapucalist.size() >= 4){
									PunchRecord record = new PunchRecord();
									record.setId(maxAttid.getId());//当天一条记录的id
									record.setType(2);
									Long time = (maxAttid.getDktime() - xbdk2)/1000/60;
									if(time > 0){
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}else{
										record.setStatus(4);
										record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
									}
									record.setAttime(xbdk2);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(maxAttid.getId());//单条打卡明细
									pcd.setXbdk2(dtdkmx.getDktime());
									pcd.setXbdk2jg(dtdkmx.getResults());
								}
								pcd.setId(dkmxid);
								punchcarddetailsservice.updateByPrimaryKeySelective(pcd);
							}
						}else if(banci.getSxbcs() == 3){//修改后一天打六次
							if(mapucalist.size() > 6){//当天打卡多次
								String[] str= new String[5];
								for(int y=0;y<mapucalist.size();y++){
									if(y == 0){//上班
										PunchRecord mindata = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										Long time = (mindata.getDktime() - sbdk1)/1000/60;
										if(time > 0){
											record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
											record.setResults(Integer.valueOf(time.toString()));// 打卡结果
										}else{
											record.setStatus(1);
											record.setResults(0);// 打卡结果
										}
										record.setAttime(sbdk1);
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
									if(y == 1 || y == 2 || y == 3 || y == 4){
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										if((mapucalist.get(y).getSort())%2 == 0){//下班
											if(y == 1){
												Long time = (mapucalist.get(y).getDktime() - xbdk1)/1000/60;
												if(time > 0){
													record.setStatus(1);
													record.setResults(0);// 打卡结果
												}else{
													record.setStatus(4);
													record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
												}
												record.setAttime(xbdk1);//下班应打卡时间
												str[0] = String.valueOf(mapucalist.get(y).getId());
											}
											if(y == 3){
												Long time = (mapucalist.get(y).getDktime() - xbdk2)/1000/60;
												if(time > 0){
													record.setStatus(1);
													record.setResults(0);// 打卡结果
												}else{
													record.setStatus(4);
													record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
												}
												record.setAttime(xbdk2);//下班应打卡时间
												str[2] = String.valueOf(mapucalist.get(y).getId());
											}
										}else{//上班
											if(y == 2){
												Long time = (mapucalist.get(y).getDktime() - sbdk2)/1000/60;
												if(time > 0){
													record.setStatus(3);
													record.setResults(Integer.valueOf(time.toString()));// 打卡结果
												}else{
													record.setStatus(1);
													record.setResults(0);// 打卡结果
												}
												record.setAttime(sbdk2);//上班应打卡时间
												str[1] = String.valueOf(mapucalist.get(y).getId());
											}
											if(y == 4){
												Long time = (mapucalist.get(y).getDktime() - sbdk3)/1000/60;
												if(time > 0){
													record.setStatus(3);
													record.setResults(Integer.valueOf(time.toString()));// 打卡结果
												}else{
													record.setStatus(1);
													record.setResults(0);// 打卡结果
												}
												record.setAttime(sbdk3);//上班应打卡时间
												str[3] = String.valueOf(mapucalist.get(y).getId());
											}
										}
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
									PunchRecord maxdata = punchrecordmapper.selectByPrimaryKey(maxAttid.getId());//下班
									if(mapucalist.get(y).getId() == maxdata.getId()){//下班
										PunchRecord record = new PunchRecord();
										record.setId(maxdata.getId());
										record.setType(2);//下班
										Long time = (maxdata.getDktime() - xbdk3)/1000/60;
										if(time > 0){
											record.setStatus(1);
											record.setResults(0);// 打卡结果
										}else{
											record.setStatus(4);
											record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
										}
										record.setSort(6);
										record.setAttime(xbdk3);
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
										
										str[4] = String.valueOf(maxdata.getId());
									}
									if(y == 5 || y > 5 && mapucalist.get(y).getId() != maxdata.getId()){
										PunchRecord record = new PunchRecord();
										record.setId(mapucalist.get(y).getId());
										record.setStatus(0);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setSort(0);//序号(0:打卡无效:此记录已被更新)
										record.setResults(0);// 打卡结果
										record.setAttime(mapucalist.get(y).getDktime());//上班应打卡时间
										record.setBcid(banci.getId());//班次id
										punchrecordmapper.updateByPrimaryKeySelective(record);
									}
								}
								//修改打卡明细
								PunchRecord mindata = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
								PunchCardDetails record = new PunchCardDetails();
								record.setId(dkmxid);//需修改的明细id
								record.setSbdk1(mindata.getDktime());
								record.setSbdk1jg(mindata.getResults());// 上班1打卡结果
								record.setXbdk1(null);
								record.setXbdk1jg(0);// 下班1打卡结果
								record.setSbdk2(null);
								record.setSbdk2jg(0);// 上班2打卡结果
								record.setXbdk2(null);
								record.setXbdk2jg(0);// 下班2打卡结果
								record.setSbdk3(null);
								record.setSbdk3jg(0);// 上班3打卡结果
								record.setXbdk3(null);
								record.setXbdk3jg(0);// 下班3打卡结果
								record.setYdkcs(banci.getSxbcs()*2);//应打卡次数
								record.setGzsc(Double.valueOf("0"));
								punchcarddetailsservice.ModifyPunchDetails(record);
								for(int t=0;t<str.length;t++){
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(Integer.valueOf(str[t]));//单条打卡明细
									PunchCardDetails dkmx = new PunchCardDetails();
									dkmx.setId(dkmxid);//需修改的明细id
									if(t == 0){
										dkmx.setXbdk1(dtdkmx.getDktime());
										dkmx.setXbdk1jg(dtdkmx.getResults());// 下班1打卡结果
									}else if(t == 1){
										dkmx.setSbdk2(dtdkmx.getDktime());
										dkmx.setSbdk2jg(dtdkmx.getResults());// 上班2打卡结果
									}else if(t == 2){
										dkmx.setXbdk2(dtdkmx.getDktime());
										dkmx.setXbdk2jg(dtdkmx.getResults());// 下班2打卡结果
									}else if(t == 3){
										dkmx.setSbdk3(dtdkmx.getDktime());
										dkmx.setSbdk3jg(dtdkmx.getResults());// 上班3打卡结果
									}else{
										dkmx.setXbdk3(dtdkmx.getDktime());
										dkmx.setXbdk3jg(dtdkmx.getResults());// 下班3打卡结果
									}
									Long woktimes = (dtdkmx.getDktime() - mindata.getDktime())/1000/60;
									dkmx.setGzsc(Double.valueOf(woktimes));
									punchcarddetailsservice.updateByPrimaryKeySelective(dkmx);
								}
							}else{
								PunchRecord mindataone = null;
								if(minAttid != null || maxAttid != null){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(0).getId());//当天一条记录的id
									record.setType(1);//上班
									Long time = (mapucalist.get(0).getDktime() - sbdk1)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(sbdk1);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									mindataone = punchrecordmapper.selectByPrimaryKey(minAttid.getId());//上班
									PunchCardDetails dan = new PunchCardDetails();
									dan.setId(dkmxid);//需修改的明细id
									dan.setSbdk1(mindataone.getDktime());
									dan.setSbdk1jg(mindataone.getResults());// 上班1打卡结果
									dan.setYdkcs(banci.getSxbcs()*2);//应打卡次数
									dan.setGzsc(Double.valueOf("0"));
									punchcarddetailsservice.updateByPrimaryKeySelective(dan);
								}
								PunchCardDetails pcd = new PunchCardDetails();
								if(mapucalist.size() >= 2){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(1).getId());//当天一条记录的id
									record.setType(2);
									Long time = (mapucalist.get(1).getDktime() - xbdk1)/1000/60;
									if(time > 0){
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}else{
										record.setStatus(4);
										record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
									}
									record.setAttime(xbdk1);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(1).getId());//单条打卡明细
									pcd.setXbdk1(dtdkmx.getDktime());
									pcd.setXbdk1jg(dtdkmx.getResults());
								}
								if(mapucalist.size() >= 3){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(2).getId());//当天一条记录的id
									record.setType(1);
									Long time = (mapucalist.get(2).getDktime() - sbdk2)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(sbdk2);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(2).getId());//单条打卡明细
									pcd.setSbdk2(dtdkmx.getDktime());
									pcd.setSbdk2jg(dtdkmx.getResults());
								}
								if(mapucalist.size() >= 4){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(3).getId());//当天一条记录的id
									record.setType(1);
									Long time = (mapucalist.get(3).getDktime() - xbdk2)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(xbdk2);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(3).getId());//单条打卡明细
									pcd.setXbdk2(dtdkmx.getDktime());
									pcd.setXbdk2jg(dtdkmx.getResults());
								}
								if(mapucalist.size() >= 5){
									PunchRecord record = new PunchRecord();
									record.setId(mapucalist.get(4).getId());//当天一条记录的id
									record.setType(1);
									Long time = (mapucalist.get(4).getDktime() - sbdk3)/1000/60;
									if(time > 0){
										record.setStatus(3);//状态(0:打卡无效:此记录已被更新 1:正常 2:异常 3:迟到 4:早退 5:补卡 6:请假 7:加班 8:调休)
										record.setResults(Integer.valueOf(time.toString()));// 打卡结果
									}else{
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}
									record.setAttime(sbdk3);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(mapucalist.get(4).getId());//单条打卡明细
									pcd.setSbdk3(dtdkmx.getDktime());
									pcd.setSbdk3jg(dtdkmx.getResults());
									
								}
								if(mapucalist.size() >= 6){
									PunchRecord record = new PunchRecord();
									record.setId(maxAttid.getId());//当天一条记录的id
									record.setType(2);
									Long time = (maxAttid.getDktime() - xbdk3)/1000/60;
									if(time > 0){
										record.setStatus(1);
										record.setResults(0);// 打卡结果
									}else{
										record.setStatus(4);
										record.setResults(Math.abs(Integer.valueOf(time.toString())));// 打卡结果
									}
									record.setAttime(xbdk3);//当天应打卡时间
									record.setBcid(banci.getId());//班次id
									punchrecordmapper.updateByPrimaryKeySelective(record);
									PunchRecord dtdkmx = punchrecordmapper.selectByPrimaryKey(maxAttid.getId());//单条打卡明细
									pcd.setXbdk3(dtdkmx.getDktime());
									pcd.setXbdk3jg(dtdkmx.getResults());
								}
								pcd.setId(dkmxid);
								punchcarddetailsservice.updateByPrimaryKeySelective(pcd);
							}
						}
					}else{////修改后班次为休息的
						RestMethod(mapucalist,dkmxid);
					}
				}
			}
		}
		
		if(schlist.size()>0){
			//删除排班明细表(自由排班)
			KqglAssoPbmx.builder().build().delete(new QueryWrapper<KqglAssoPbmx>().lambda().eq(KqglAssoPbmx::getKqzid, id));
			kqglassopbmxmapper.insertKqglAssoPbmxList(schlist);
			return ResultUtil.data(schlist,"修改考勤组排班成功");
		}
		
		return ResultUtil.error("修改考勤组排班失败");
	}
	
	/**
	 *	班次修改调用方法
	 */
	public void RestMethod(List<KqglAssoDkjl> mapucalist,int dkmxid){
		int q = 1;
		for(KqglAssoDkjl pres : mapucalist){
			int type = 0;
			if(q%2 > 0){type= 1;}else{type = 2;}
			KqglAssoDkjl.builder().id(pres.getId()).results(0).type(type).status(1).sort(q).attime(pres.getDktime()).bcid(0).build().updateById();
			q++;
		}
		if(mapucalist.size() > 0){/*******修改打卡明细数据****/
			KqglAssoDkmx pcd = KqglAssoDkmx.builder().build();
			if(mapucalist.size() >= 1){ pcd.setSbdk1(mapucalist.get(0).getDktime());pcd.setSbdk1jg(0);}
			if(mapucalist.size() >= 2){ pcd.setXbdk1(mapucalist.get(1).getDktime());pcd.setXbdk1jg(0);}
			if(mapucalist.size() >= 3){ pcd.setSbdk2(mapucalist.get(2).getDktime());pcd.setSbdk2jg(0);}
			if(mapucalist.size() >= 4){ pcd.setXbdk2(mapucalist.get(3).getDktime()); pcd.setXbdk2jg(0);}
			if(mapucalist.size() >= 5){ pcd.setSbdk3(mapucalist.get(4).getDktime()); pcd.setSbdk3jg(0);}
			if(mapucalist.size() >= 6){ pcd.setXbdk3(mapucalist.get(5).getDktime()); pcd.setXbdk3jg(0);}
			pcd.setId(dkmxid);
			pcd.updateById();
		}
	}
	
	
	@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() == null ? 1 : attquerycriteriadto.getCurrentPage(),
				attquerycriteriadto.getTotalPage() == null ? 10 : attquerycriteriadto.getTotalPage());
				attquerycriteriadto.setOrgCode(userBean.getOrgCode());
				attquerycriteriadto.setEmpNum(userBean.getEmpNum());
				// 缺-部门id 搜索
				IPage<EmployeeLeaveBalanceDto> pageAs = kqglassoleavebalancemapper.selectPageByQueryLeaveBalance(page, attquerycriteriadto);
				List<EmployeeLeaveBalanceDto> listAs = pageAs.getRecords();
				return ResultUtil.data(pageAs, listAs, "操作成功!");
	}
	
	
	/**
	 * 	根据用户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,"操作成功!");
	}
	
	
	/**
	 * 	考勤原始记录-根据 模糊 + 高級查詢-分页
	 */
	@PostMapping(value = "/attendancecalendar")
	@ApiOperation(value = "考勤原始记录-根据 模糊 + 高級查詢-分页", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 34)
	public Result<Object> AttendanceCalendar(@CurrentUser UserBean userBean, @Validated @RequestBody OriginalRecordDto originalrecorddto){
		
			IPage<PunchRecord> page = new Page<PunchRecord>(
					originalrecorddto.getCurrentPage() == null ? 1 : originalrecorddto.getCurrentPage(),
					originalrecorddto.getTotalPage() == null ? 10 : originalrecorddto.getTotalPage());
			originalrecorddto.setQyid(userBean.getOrgCode());
			
			IPage<PunchRecord> pageAs = punchrecordmapper.QueryOriginalRecord(page, originalrecorddto);
			List<PunchRecord> listAs = pageAs.getRecords();
			return ResultUtil.data(pageAs, 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() == null ? 1 : attesummqueto.getCurrentPage(),
				attesummqueto.getTotalPage() == null ? 10 : attesummqueto.getTotalPage());
				attesummqueto.setOrgCode(userBean.getOrgCode());
				
				String year = null,month = null;
				String staapptime = null,endapptime = null;
				if(attesummqueto.getTimes() != null && !("").equals(attesummqueto.getTimes())) {
					year = attesummqueto.getTimes().substring(0, 4);
					month = attesummqueto.getTimes().substring(5, 7);
					staapptime = ClockInTool.getFirstDayOfMonth1(Integer.valueOf(year),Integer.valueOf(month));
					endapptime = ClockInTool.getLastDayOfMonth1(Integer.valueOf(year),Integer.valueOf(month));
				}else {
					year =  new SimpleDateFormat("yyyy").format(new Date()).toString();
					month = new SimpleDateFormat("MM").format(new Date()).toString();
					
					Calendar c = Calendar.getInstance();    
					c.add(Calendar.MONTH, 0);
					c.set(Calendar.DAY_OF_MONTH,1);
					staapptime = DateUtil.getStringFormat(DateUtil.getStringTime(mat.format(c.getTime()),"yyyy-MM-dd"));
					Calendar ca = Calendar.getInstance();    
					ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));  
					endapptime = DateUtil.getStringFormat(DateUtil.getStringTime(mat.format(ca.getTime()),"yyyy-MM-dd"));
				}
				
				attesummqueto.setYear(year);
				attesummqueto.setMonth(month);
				attesummqueto.setStaapptime(staapptime);
				attesummqueto.setEndapptime(endapptime);
				// 缺-部门id 搜索
				IPage<KqglAssoMonthPunchSummaryDto> pageAs = kqglassomonthpunchsummarymapper.AttendanceSummaryData(page, attesummqueto);
				List<KqglAssoMonthPunchSummaryDto> listAs = pageAs.getRecords();
				return ResultUtil.data(pageAs, listAs, "操作成功!");
	}
	
	@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();
				return ResultUtil.data(pageAs, listAs, "操作成功!");
		
		
	}
	
	
	@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
		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;
			
			//kqgl_asso_dkmx 打卡明细是否存在打卡记录
			KqglAssoDkmx dkmx = kqglassodkmxmapper.selectOne(new QueryWrapper<KqglAssoDkmx>().lambda().eq(KqglAssoDkmx::getData, chpunchr.getData()).eq(KqglAssoDkmx::getUserid, chpunchr.getNum()));
			if(dkmx != null) {
				if(chpunchr.getClocktype() == 1) {
					sbdk1 = changed_time;
					sbdk1jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk1(sbdk1).sbdk1jg(sbdk1jg).build().updateById();
				}else if(chpunchr.getClocktype() == 2) {
					xbdk1 = changed_time;
					xbdk1jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk1(xbdk1).xbdk1jg(xbdk1jg).build().updateById();
				}else if(chpunchr.getClocktype() == 3) {
					sbdk2 = changed_time;
					sbdk2jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk2(sbdk2).sbdk2jg(sbdk2jg).build().updateById();
				}else if(chpunchr.getClocktype() == 4) {
					xbdk2 = changed_time;
					xbdk2jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk2(xbdk2).xbdk2jg(xbdk2jg).build().updateById();
				}else if(chpunchr.getClocktype() == 5) {
					sbdk3 = changed_time;
					sbdk3jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).sbdk3(sbdk3).sbdk3jg(sbdk3jg).build().updateById();
				}else {
					xbdk3 = changed_time;
					xbdk3jg = results;
					
					KqglAssoDkmx.builder().id(dkmx.getId()).xbdk3(xbdk3).xbdk3jg(xbdk3jg).build().updateById();
				}
			}
			
			//打卡记录表
			clock_time_ = Long.valueOf(ClockInTool.dateToStamp(clock_time));
			
			Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(data,"yyyy-MM-dd")).getTime();
			String attdate_ = new SimpleDateFormat("yy-MM-dd").format(Double.valueOf(startDate));//转换打卡时间格式
			int type = 0;
			if((chpunchr.getClocktype())%2 > 0){
				type = 1;
			}else {
				type = 2;
			}
			
			KqglAssoDkjl pre = KqglAssoDkjl.builder().dktime(changed_time).results(results).userId(chpunchr.getNum()).type(type).status(9).sort(chpunchr.getClocktype())
					.cardType(3).qyid(userBean.getOrgCode()).attdate(attdate_+" "+ClockInTool.dateToWeek2(data)).attime(clock_time_).dkmxid(dkmx.getId()).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 = "/list_compensate")
	@ApiOperation(value = "222: 查询列表-加班补偿方式", httpMethod = "GET", notes = " 查询列表-加班补偿方式")
	public Result<Object> selectListCompensate() {

		List<CompensateDto> coms = new ArrayList<CompensateDto>();
		CompensateDto com = CompensateDto.builder().build();
		com.setId(1);
		com.setValue("加班费");
		coms.add(com);
		CompensateDto coms2 = CompensateDto.builder().build();
		coms2.setId(2);
		coms2.setValue("调休");
		coms.add(coms2);

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