package cn.timer.api.controller.xcgl;

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

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;

import cn.timer.api.bean.kqgl.AttendanceGroup;
import cn.timer.api.bean.kqgl.AttendanceReport;
import cn.timer.api.bean.kqgl.AttendanceWeeklySch;
import cn.timer.api.bean.kqgl.PunchCardDetails;
import cn.timer.api.bean.kqgl.PunchRecord;
import cn.timer.api.bean.kqgl.Schedule;
import cn.timer.api.bean.kqgl.SpecialDate;
import cn.timer.api.bean.xcgl.XcglAdminXzz;
import cn.timer.api.bean.xcgl.XcglAssoGztsz;
import cn.timer.api.bean.xcgl.XcglAssoGztzt;
import cn.timer.api.bean.xcgl.XcglAssoJsgzzx;
import cn.timer.api.bean.xcgl.XcglAssoJxgz;
import cn.timer.api.bean.xcgl.XcglAssoOption;
import cn.timer.api.bean.xcgl.XcglAssoXcjsgz;
import cn.timer.api.bean.xcgl.XcglAssoXzb;
import cn.timer.api.bean.xcgl.XcglAssoXzdadx;
import cn.timer.api.bean.xcgl.XcglAssoXzdaz;
import cn.timer.api.bean.xcgl.XcglAssoXzdazdy;
import cn.timer.api.bean.xcgl.XcglAssoXzury;
import cn.timer.api.bean.xcgl.XcglAssoZxfjkc;
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.dao.kqgl.AttendanceGroupMapper;
import cn.timer.api.dao.kqgl.AttendanceWeeklySchMapper;
import cn.timer.api.dao.kqgl.PunchCardDetailsMapper;
import cn.timer.api.dao.kqgl.PunchRecordMapper;
import cn.timer.api.dao.kqgl.ScheduleMapper;
import cn.timer.api.dao.kqgl.SpecialDateMapper;
import cn.timer.api.dao.xcgl.XcglAdminXzzMapper;
import cn.timer.api.dao.xcgl.XcglAssoGztszMapper;
import cn.timer.api.dao.xcgl.XcglAssoGztztMapper;
import cn.timer.api.dao.xcgl.XcglAssoJsgzzxMapper;
import cn.timer.api.dao.xcgl.XcglAssoJxgzMapper;
import cn.timer.api.dao.xcgl.XcglAssoOptionMapper;
import cn.timer.api.dao.xcgl.XcglAssoXcjsgzMapper;
import cn.timer.api.dao.xcgl.XcglAssoXzbMapper;
import cn.timer.api.dao.xcgl.XcglAssoXzdadxMapper;
import cn.timer.api.dao.xcgl.XcglAssoXzdazMapper;
import cn.timer.api.dao.xcgl.XcglAssoXzdazdyMapper;
import cn.timer.api.dao.xcgl.XcglAssoXzuryMapper;
import cn.timer.api.dao.xcgl.XcglAssoZxfjkcMapper;
import cn.timer.api.dao.xcgl.XcglSalaryItemMapper;
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
import cn.timer.api.dto.sbgjj.InspersonnelDto;
import cn.timer.api.dto.xcgl.AdditionalDeductionDto;
import cn.timer.api.dto.xcgl.CalculatedFieldDto;
import cn.timer.api.dto.xcgl.CalculationDto;
import cn.timer.api.dto.xcgl.CalculationOptionsDto;
import cn.timer.api.dto.xcgl.ChangeSalaryDto;
import cn.timer.api.dto.xcgl.CjPayrollGroupDto;
import cn.timer.api.dto.xcgl.ComputeUserDto;
import cn.timer.api.dto.xcgl.CustomDto;
import cn.timer.api.dto.xcgl.FixedSalaryStaffDto;
import cn.timer.api.dto.xcgl.FixedsalaryDto;
import cn.timer.api.dto.xcgl.ImportSalaryDto;
import cn.timer.api.dto.xcgl.ImportSalarySetDto;
import cn.timer.api.dto.xcgl.ModifyPayslipDto;
import cn.timer.api.dto.xcgl.PayCustomDto;
import cn.timer.api.dto.xcgl.PayCustomZDYDto;
import cn.timer.api.dto.xcgl.PayGroupedDataDto;
import cn.timer.api.dto.xcgl.PayTermDto;
import cn.timer.api.dto.xcgl.PayrollExceptionDto;
import cn.timer.api.dto.xcgl.PayrollGroupDto;
import cn.timer.api.dto.xcgl.PayslipDetailsDto;
import cn.timer.api.dto.xcgl.PayslipListDto;
import cn.timer.api.dto.xcgl.SalaryCustomizationDto;
import cn.timer.api.dto.xcgl.SalaryFieldDto;
import cn.timer.api.dto.xcgl.SalaryGroupGroupingDto;
import cn.timer.api.dto.xcgl.SalaryItemRulesDto;
import cn.timer.api.dto.xcgl.SalaryPersonFieldDto;
import cn.timer.api.dto.xcgl.SearchSalariedPeopleDto;
import cn.timer.api.dto.xcgl.SwitchSalaryDateDto;
import cn.timer.api.dto.xcgl.TjSalaryItemDot;
import cn.timer.api.dto.xcgl.XcglAssoOptionDto;
import cn.timer.api.dto.xcgl.YdMobilePacketDto;
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 = "薪酬管理Api")
@RestController
@RequestMapping(value = "/sala", produces = { "application/json" })
public class SalaryManagementController {
	// 薪酬管理-定薪
	@Autowired
	private XcglAssoXzdadxMapper xcglassoxzdadxmapper;

	// 薪资档案自定义
	@Autowired
	private XcglAssoXzdazdyMapper xcglassoxzdazdymapper;

	// 薪资档案值
	@Autowired
	private XcglAssoXzdazMapper xcglassoxzdazmapper;

	// 薪资组
	@Autowired
	private XcglAdminXzzMapper xcgladminxzzmapper;

	// 薪资组内人员
	@Autowired
	private XcglAssoXzuryMapper xcglassoxzurymapper;

	//计薪规则组项
	@Autowired
    private XcglAssoJsgzzxMapper xcglassojsgzzxmapper;
	
	//计薪规则组
	@Autowired
	private XcglAssoJxgzMapper xcglassojxgzmapper;
	
	//薪酬计算规则公式
	@Autowired
    private XcglAssoXcjsgzMapper xcglassoxcjsgzmapper;
	
	//薪资项名
	@Autowired
	private XcglSalaryItemMapper xcglsalaryitemmapper;
	
	//薪资选项
	@Autowired
	private XcglAssoOptionMapper xcglassooptionmapper;
	
	//薪资表
	@Autowired
	private XcglAssoXzbMapper xcglassoxzbmapper;
	
	@Resource
    private YgglMainEmpMapper ygglmainempmapper;
	
	
	//考勤组
	@Autowired
	private AttendanceGroupMapper attendancegroupservice;
	//打卡明细表
	@Autowired
	private PunchCardDetailsMapper punchcarddetailsservice;
	//打卡记录
	@Autowired
	private PunchRecordMapper punchrecordservice;	
	@Autowired
	private SpecialDateMapper specialdateservice;
	//考勤周排班
	@Autowired
	private AttendanceWeeklySchMapper attendanceweeklyschservice;
	//排班明细
	@Autowired
	private ScheduleMapper scheduleservice;
	//专项附加扣除
	@Autowired
	private XcglAssoZxfjkcMapper xcglassozxfjkcmapper;
	
	//工资条组内成员状态
	@Autowired
	private XcglAssoGztztMapper xcglassogztztmapper;
	//工资条组-设置
	@Autowired
	private XcglAssoGztszMapper xcglassogztszmapper;
	
	static SimpleDateFormat mat = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * 获取薪资组信息
	 */
	@GetMapping(value = "/paylist")
	@ApiOperation(value = "获取薪资组信息", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult selectpaylist(@CurrentUser UserBean userBean) {
		List<XcglAdminXzz> xcgladminxzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).list();
		return new ResponseResult().success("获取薪资组信息成功", xcgladminxzz);
	}
	
	/**
	 *	获取薪资组人员数据
	 */
	@GetMapping(value = "/paygroupdate/{id}")
	@ApiOperation(value = "获取薪资组人员数据", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult Getpaygroupstaff(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		List<XcglAssoXzury> xzurylist = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getQyid, userBean.getOrgCode()).eq(XcglAssoXzury::getXzzid, id).list();
		return new ResponseResult().success("获取薪资组人员数据成功", xzurylist);
	}
	
	/**
	 *	获取薪资组数据
	 */
	@GetMapping(value = "/salarygroupdata/{id}")
	@ApiOperation(value = "获取薪资组数据", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult Salarygroupdata(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		XcglAdminXzz xzzlist = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).eq(XcglAdminXzz::getId, id).one();
		return new ResponseResult().success("获取薪资组数据成功", xzzlist);
	}
	

	/**
	 * 	添加薪资组(选择配薪方式:0-空白模板   df-默认模板)
	 */
	@PostMapping(value = "/paygro")
	@ApiOperation(value = "添加薪资组", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult PayrollGroup(@CurrentUser UserBean userBean, @RequestBody PayrollGroupDto paygro) {
		Integer empNum = userBean.getEmpNum();
		Integer orgCode = userBean.getOrgCode();
		Calendar lastm = Calendar.getInstance();
		lastm.setTime(new Date()); // 设置为当前时间
		lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
		String lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
		Calendar thism = Calendar.getInstance();
		lastm.set(Calendar.MONTH, thism.get(Calendar.MONTH) + 1);
		String thismonth = new SimpleDateFormat("yyyy-MM").format(thism.getTime());// 本
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 1);
		String nextMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());// 下
		XcglAdminXzz xcglxzz = XcglAdminXzz.builder().build();
		xcglxzz.setName(paygro.getName());// 薪资组命名
		xcglxzz.setPayperiod(paygro.getPayperiod());// 算薪月周期 0:上月;1:当月
		xcglxzz.setPaydayperiod(paygro.getPaydayperiod());// 算薪日周期 全月
		String payper = String.format("%02d", paygro.getPaydayperiod());
		String payrollcycle = null;
		if (paygro.getPayperiod() == 0) {// 上月
			if (paygro.getPaydayperiod() == 1) {
				payrollcycle = getfirstlast() + "到" + getlastlast();
			} else {
				String firstnext = lastmonth + "-" + payper;
				int jgs = paygro.getPaydayperiod() - 1;
				String lastnext = thismonth + "-" + String.format("%02d", jgs);
				payrollcycle = firstnext + "到" + lastnext;
			}
		} else {// 当月
			if (paygro.getPaydayperiod() == 1) {
				payrollcycle = getfirstnow() + "到" + getlastnow();
			} else {
				String firstnow = thismonth + "-" + payper;
				int jgs = paygro.getPaydayperiod() - 1;
				String lastnow = nextMonth + "-" + String.format("%02d", jgs);
				payrollcycle = firstnow + "到" + lastnow;
			}
		}
		xcglxzz.setPayrollcycle(payrollcycle);// 算薪周期
		xcglxzz.setDeletestate(1);// 状态 0:已删除;1:使用中
		xcglxzz.setCountstate(0);// 计算状态 0:未计算;1:已计算
		xcglxzz.setPxfs(paygro.getPxfs());// 选择配薪方式(0:	空白模板;df:默认)
		xcglxzz.setAdduserid(empNum);// 员工工号
		xcglxzz.setQyid(orgCode);// 企业编码
		xcglxzz.setAddtime(new Date().getTime());// 添加时间
		xcglxzz.setMonthtime(paygro.getXzyf());//薪资月份
		xcgladminxzzmapper.insert(xcglxzz);
		int payid = xcglxzz.getId();
		
		String[][] mrzd = {{"姓名","从人事花名册-姓名自动提取数据"},{"部门","从人事花名册-部门自动提取数据"},{"职位","从人事花名册-职位自动提取数据"},{"工号","从人事花名册-工号自动提取数据"}};
		if(("0").contentEquals(paygro.getPxfs())) {//空白模板
			List<XcglAssoJsgzzx> zzxlist = new ArrayList<XcglAssoJsgzzx>();
			for(String[] q : mrzd) {
				XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
				zzx.setSalaryitem(q[0]);//薪资项
				zzx.setYhmbzd(q[0]);//银行模板项 需与银行一一对应
				zzx.setRule(q[1]);//规则
				zzx.setType(1);//类型 1:系统项;2:非系统项
				zzx.setAddtime(new Date().getTime());//添加时间
				zzx.setAdduserid(empNum);//添加人员id
				zzx.setJxgzid(0);//计薪规则组id 0:未加入组
				zzx.setRemarks("");//备注
				zzx.setGsid(0);//公式id  0:未关联规则
				zzx.setGsgs("");//公式格式 系统提供/自定义公式
				zzx.setXzzid(payid);
				zzx.setRulestate(0);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
				XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, q[0]).one();
				if(opt != null) {
					zzx.setOptionid(opt.getId());
				}else {zzx.setOptionid(0);}
				zzxlist.add(zzx);
			}
			if(zzxlist.size() > 0) {
				xcglassojsgzzxmapper.insertxcglassojsgzzxList(zzxlist);
			}
		}else if(("df").contentEquals(paygro.getPxfs())){//默认
			//创建分组    
			//1、人事信息;2、固定工资;3、考勤;4、绩效奖金;5、应发;6、社保公积金;7、个税及实发
			String[] grouping = {"人事信息","固定工资","考勤","绩效奖金","应发","社保公积金","个税及实发"};
			for(int g=0;g<grouping.length;g++) {
				XcglAssoJxgz jxgz = new XcglAssoJxgz();
				jxgz.setXzzid(payid);
				jxgz.setName(grouping[g]);
				jxgz.setRemarks("");
				jxgz.setAddtime(new Date().getTime());
				jxgz.setAdduserid(empNum);
				jxgz.setQyid(orgCode);
				xcglassojxgzmapper.jxgzinsert(jxgz);
				int groid = jxgz.getId();
				if(("人事信息").equals(grouping[g])) {
					String[][] mrzd1 = {{"姓名","从人事花名册-姓名自动提取数据"},{"部门","从人事花名册-部门自动提取数据"},{"职位","从人事花名册-职位自动提取数据"},{"工号","从人事花名册-工号自动提取数据"}};
					List<XcglAssoJsgzzx> zzxlist = new ArrayList<XcglAssoJsgzzx>();
					for(String[] q : mrzd1) {
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(q[0]);//薪资项
						zzx.setYhmbzd(q[0]);//银行模板项 需与银行一一对应
						zzx.setRule(q[1]);//规则
						zzx.setType(1);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs("");//公式格式 系统提供/自定义公式
						zzx.setXzzid(payid);
						zzx.setRulestate(0);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, q[0]).one();
						if(opt != null) {
							zzx.setOptionid(opt.getId());
						}else {zzx.setOptionid(0);}
						zzxlist.add(zzx);
					}
					if(zzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(zzxlist);
					}
				}else if(("固定工资").equals(grouping[g])) {
					String[] fixed = {"基本工资","岗位津贴"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int f=0;f<fixed.length;f++) {
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(fixed[f]);//薪资项
						zzx.setYhmbzd(fixed[f]);//银行模板项 需与银行一一对应
						@SuppressWarnings("unused")
						XcglAssoXzdazdy daz = xcglassoxzdazdymapper.SalaryFixedWages(fixed[f]);
						zzx.setRule("从薪资档案-"+fixed[f]+"自动提取数据");//规则********************************
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs("从薪资档案-"+fixed[f]+"自动提取数据");//公式格式 系统提供/自定义公式
						zzx.setRulestate(1);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						zzx.setOptionid(0);
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}else if(("考勤").equals(grouping[g])) {
					String[] att = {"病假","事假","入离职缺勤天数","入离职缺勤扣款","病假扣款","事假扣款","实出勤天数"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int a=0;a<att.length;a++) {
						XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(att[a]);
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(att[a]);//薪资项
						zzx.setYhmbzd(att[a]);//银行模板项 需与银行一一对应
						if(xzxj != null) {//系统有规则
							zzx.setRule(xzxj.getGsxs());//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs());//公式格式 系统提供/自定义公式
							zzx.setRulestate(2);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						}else {
							String xxs = "自动提取数据";
							String[] strxz = {"从考勤报表-"};
							zzx.setRule(strxz[0] + att[a] + xxs);//规则********************************
							zzx.setGsid(0);//公式id  0:未关联规则
							zzx.setGsgs(strxz[0] + att[a] + xxs);//公式格式 系统提供/自定义公式
							zzx.setRulestate(0);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						}
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, att[a]).one();
						zzx.setOptionid(opt.getId());
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}else if(("绩效奖金").equals(grouping[g])) {
					String[] jxjj = {"绩效奖金","业绩提成"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int a=0;a<jxjj.length;a++) {
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(jxjj[a]);//薪资项
						zzx.setYhmbzd(jxjj[a]);//银行模板项 需与银行一一对应
						zzx.setRule("每月手动导入");//规则********************************
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs("每月手动导入");//公式格式 系统提供/自定义公式
						zzx.setRulestate(4);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, jxjj[a]).one();
						zzx.setOptionid(opt.getId());
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}else if(("应发").equals(grouping[g])) {
					String[] yingfa = {"应发工资","税前补差"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int a=0;a<yingfa.length;a++) {
						XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(yingfa[a]);
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(yingfa[a]);//薪资项
						zzx.setYhmbzd(yingfa[a]);//银行模板项 需与银行一一对应
						if(xzxj != null) {//系统有规则
							zzx.setRule(xzxj.getGsxs());//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs());//公式格式 系统提供/自定义公式
							zzx.setRulestate(2);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						}else {
							zzx.setRule("每月手动导入");//规则********************************
							zzx.setGsid(0);//公式id  0:未关联规则
							zzx.setGsgs("每月手动导入");//公式格式 系统提供/自定义公式
							zzx.setRulestate(4);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						}
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, yingfa[a]).one();
						zzx.setOptionid(opt.getId());
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}else if(("社保公积金").equals(grouping[g])) {
					String[] sbgjj = {"个人社保","个人公积金"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int a=0;a<sbgjj.length;a++) {
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(sbgjj[a]);//薪资项
						zzx.setYhmbzd(sbgjj[a]);//银行模板项 需与银行一一对应
						String xxs = "自动提取数据";
						String[] strxz = {"从社保账单-"};
						zzx.setRule(strxz[0] + sbgjj[a]+"部分合计" + xxs);//规则********************************
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs(strxz[0] + sbgjj[a]+"部分合计" + xxs);//公式格式 系统提供/自定义公式
						zzx.setRulestate(0);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, sbgjj[a]).one();
						zzx.setOptionid(opt.getId());
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}else if(("个税及实发").equals(grouping[g])) {
					String[] jsjsf = {"个税","实发工资"};
					List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
					for(int a=0;a<jsjsf.length;a++) {
						XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(jsjsf[a]);
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(jsjsf[a]);//薪资项
						zzx.setYhmbzd(jsjsf[a]);//银行模板项 需与银行一一对应
						zzx.setRule(xzxj.getGsxs());//规则********************************
						zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
						zzx.setGsgs(xzxj.getGsxs());//公式格式 系统提供/自定义公式
						zzx.setRulestate(2);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, jsjsf[a]).one();
						zzx.setOptionid(opt.getId());
						zzx.setType(2);//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(groid);//计薪规则组id 0:未加入组
						zzx.setRemarks("");//备注
						zzx.setXzzid(payid);
						gzzxlist.add(zzx);
					}
					if(gzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
					}
				}
			}
		}else {//从其他薪资组复制规则
			/*****************/
			//未加入分组
			List<XcglAssoJsgzzx> wjrfzlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, paygro.getPxfs()).eq(XcglAssoJsgzzx::getJxgzid,0).list();
			
			List<XcglAssoJsgzzx> wjrfzzzxlist = new ArrayList<XcglAssoJsgzzx>();
			for(XcglAssoJsgzzx zxs : wjrfzlist) {
				XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
				zzx.setSalaryitem(zxs.getSalaryitem());//薪资项
				zzx.setYhmbzd(zxs.getYhmbzd());//银行模板项 需与银行一一对应
				zzx.setRule(zxs.getRule());//规则
				zzx.setType(zxs.getType());//类型 1:系统项;2:非系统项
				zzx.setAddtime(new Date().getTime());//添加时间
				zzx.setAdduserid(empNum);//添加人员id
				zzx.setJxgzid(zxs.getJxgzid());//计薪规则组id 0:未加入组
				zzx.setRemarks(zxs.getRemarks());//备注
				zzx.setGsid(zxs.getGsid());//公式id  0:未关联规则
				zzx.setGsgs(zxs.getGsgs());//公式格式 系统提供/自定义公式
				zzx.setXzzid(payid);
				zzx.setRulestate(zxs.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
				
				zzx.setOptionid(zxs.getOptionid());
				wjrfzzzxlist.add(zzx);
			}
			if(wjrfzzzxlist.size() > 0) {
				xcglassojsgzzxmapper.insertxcglassojsgzzxList(wjrfzzzxlist);
			}
			/*************/
			
			//计薪规则组
			List<XcglAssoJxgz> jxgzlist = new LambdaQueryChainWrapper<XcglAssoJxgz>(xcglassojxgzmapper).eq(XcglAssoJxgz::getXzzid, paygro.getPxfs()).list();
			@SuppressWarnings("unused")
			List<XcglAssoJxgz> jxgzs = new ArrayList<XcglAssoJxgz>();
			for(XcglAssoJxgz jxgzl : jxgzlist) {
				
				XcglAssoJxgz jxgz = new XcglAssoJxgz();
				jxgz.setXzzid(payid);
				jxgz.setName(jxgzl.getName());
				jxgz.setRemarks(jxgzl.getRemarks());
				jxgz.setAddtime(new Date().getTime());
				jxgz.setAdduserid(empNum);
				jxgz.setQyid(orgCode);
//				jxgzs.add(jxgz);
				xcglassojxgzmapper.jxgzinsert(jxgz);
				int jxgzid = jxgz.getId();
				
				List<XcglAssoJsgzzx> yjrfzlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, paygro.getPxfs()).eq(XcglAssoJsgzzx::getJxgzid,jxgzl.getId()).list();
				if(yjrfzlist.size() > 0) {
					List<XcglAssoJsgzzx> yjrfzzzxlist = new ArrayList<XcglAssoJsgzzx>();
					for(XcglAssoJsgzzx yzxs : yjrfzlist) {
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(yzxs.getSalaryitem());//薪资项
						zzx.setYhmbzd(yzxs.getYhmbzd());//银行模板项 需与银行一一对应
						zzx.setRule(yzxs.getRule());//规则
						zzx.setType(yzxs.getType());//类型 1:系统项;2:非系统项
						zzx.setAddtime(new Date().getTime());//添加时间
						zzx.setAdduserid(empNum);//添加人员id
						zzx.setJxgzid(jxgzid);//计薪规则组id 0:未加入组
						zzx.setRemarks(yzxs.getRemarks());//备注
						zzx.setGsid(yzxs.getGsid());//公式id  0:未关联规则
						zzx.setGsgs(yzxs.getGsgs());//公式格式 系统提供/自定义公式
						zzx.setXzzid(payid);
						zzx.setRulestate(yzxs.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
						zzx.setOptionid(zzx.getOptionid());
						yjrfzzzxlist.add(zzx);
					}
					if(yjrfzzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(yjrfzzzxlist);
					}
				}
			}
		}
		List<XcglAssoXzury> xcgllist = new ArrayList<XcglAssoXzury>();
		String[] attser = paygro.getPayuserids();
		if (attser.length > 0) {
			for (int u = 0; u < attser.length; u++) {
				xcglassoxzurymapper.deleteByuseridoqyid(Integer.valueOf(attser[u]), orgCode);
				XcglAssoXzury kquser = new XcglAssoXzury();
				kquser.setXzzid(payid);// 薪资组id
				kquser.setUserid(Integer.valueOf(attser[u]));
				kquser.setQyid(orgCode);
				xcgllist.add(kquser);
			}
		}
		if (xcgllist.size() > 0) {
			xcglassoxzurymapper.insertxcglassoxzuryList(xcgllist);
		}
		return new ResponseResult().success("添加/修改薪资组成功", xcglxzz);
	}
	
	/**
	 * 	删除薪资组
	 */
	@DeleteMapping(value = "/paydelete/{id}")
	@ApiOperation(value = "删除薪资组", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult paydelete(@PathVariable Integer id) {
		XcglAdminXzz.builder().build().deleteById(id);
		List<XcglAssoXzury> znrylist = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getXzzid, id).list();
		for(XcglAssoXzury qcjs:znrylist) {
			xcglassoxzbmapper.deleteXcglAssoXzb(qcjs.getUserid());
		}
		xcglassoxzurymapper.xzurydelete(id);
		xcglassojxgzmapper.deleteByxzzid(id);//计薪规则组
		xcglassojsgzzxmapper.deleteByxzzid(id);//计薪规则组项
		
		xcglassogztztmapper.deletegztztByxzzid(id);
		
		xcglassogztszmapper.deletexcglassogztszByxzzid(id);
		
		return new ResponseResult().success("删除成功", id);
	}

	/**
	 *	修改薪资组
	 */
	@PutMapping(value = "/salarygroup")
	@ApiOperation(value = "修改薪资组", httpMethod = "PUT", notes = "接口发布说明")
	public ResponseResult ModifySalaryGroup(@CurrentUser UserBean userBean, @RequestBody PayrollGroupDto paygro) {
		@SuppressWarnings("unused")
		Integer empNum = userBean.getEmpNum();
		Integer orgCode = userBean.getOrgCode();
		
		Calendar lastm = Calendar.getInstance();
		lastm.setTime(new Date()); // 设置为当前时间
		lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
		String lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
		Calendar thism = Calendar.getInstance();
		lastm.set(Calendar.MONTH, thism.get(Calendar.MONTH) + 1);
		String thismonth = new SimpleDateFormat("yyyy-MM").format(thism.getTime());// 本
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 1);
		String nextMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());// 下
		
		XcglAdminXzz xcglxzz = XcglAdminXzz.builder().build();
		xcglxzz.setName(paygro.getName());// 薪资组命名
		xcglxzz.setPayperiod(paygro.getPayperiod());// 算薪月周期 0:上月;1:当月
		xcglxzz.setPaydayperiod(paygro.getPaydayperiod());// 算薪日周期 全月
		
		String payper = String.format("%02d", paygro.getPaydayperiod());
		String payrollcycle = null;
		if (paygro.getPayperiod() == 0) {// 上月
			if (paygro.getPaydayperiod() == 1) {
				payrollcycle = getfirstlast() + "到" + getlastlast();
			} else {
				String firstnext = lastmonth + "-" + payper;
				int jgs = paygro.getPaydayperiod() - 1;
				String lastnext = thismonth + "-" + String.format("%02d", jgs);
				payrollcycle = firstnext + "到" + lastnext;
			}
		} else {// 当月
			if (paygro.getPaydayperiod() == 1) {
				payrollcycle = getfirstnow() + "到" + getlastnow();
			} else {
				String firstnow = thismonth + "-" + payper;
				int jgs = paygro.getPaydayperiod() - 1;
				String lastnow = nextMonth + "-" + String.format("%02d", jgs);
				payrollcycle = firstnow + "到" + lastnow;
			}
		}
		xcglxzz.setPayrollcycle(payrollcycle);// 算薪周期
		xcglxzz.setDeletestate(1);// 状态 0:已删除;1:使用中
		xcglxzz.setCountstate(0);// 计算状态 0:未计算;1:已计算
		xcglxzz.setPxfs(paygro.getPxfs());// 选择配薪方式(0:空白模板;df:默认)
		xcglxzz.setQyid(orgCode);// 企业编码
		xcglxzz.setId(paygro.getId());
		xcglxzz.updateById();
		int payid = paygro.getId();
		xcglassoxzurymapper.xzurydelete(payid);
		List<XcglAssoXzury> xcgllist = new ArrayList<XcglAssoXzury>();
		String[] attser = paygro.getPayuserids();
		if (attser.length > 0) {
			for (int u = 0; u < attser.length; u++) {
				XcglAssoXzury kquser = new XcglAssoXzury();
				kquser.setXzzid(payid);// 薪资组id
				kquser.setUserid(Integer.valueOf(attser[u]));
				kquser.setQyid(orgCode);
				xcgllist.add(kquser);
			}
		}
		if (xcgllist.size() > 0) {
			xcglassoxzurymapper.insertxcglassoxzuryList(xcgllist);
		}
		return new ResponseResult().success("修改薪资组成功", xcglxzz);
	}
	
	/**
	 * 	获取自定义薪资组表头信息
	 */
	@GetMapping(value = "/paycustom")
	@ApiOperation(value = "获取自定义薪资组信息", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult selectpaycustomlist(@CurrentUser UserBean userBean) {
		List<XcglAssoXzdazdy> Xzdazdy = new LambdaQueryChainWrapper<XcglAssoXzdazdy>(xcglassoxzdazdymapper).eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode()).list();
		return new ResponseResult().success("获取自定义薪资组表头信息", Xzdazdy);
	}

	/**
	 * 	查询定薪人员+模糊查询
	 */
	@PostMapping(value = "/fixedstaff")
	@ApiOperation(value = "查询定薪人员", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult FixedSalarStaff(@CurrentUser UserBean userBean,@RequestBody SearchSalariedPeopleDto search) {
		search.setOrgcode(userBean.getOrgCode());
		if(("0").equals(search.getStatus())) {//全部
			search.setStatus("");
		}else if(("1").equals(search.getStatus())) {//在职
			search.setStatus("0");
		}else {
			search.setStatus("3");
		}
		List<FixedSalaryStaffDto> dxrylist = xcglassoxzdazdymapper.selectFixedSalaryStaff(search);//
		return new ResponseResult().success("获取自定义薪资组表头信息", dxrylist);
	}

	/**
	 * 	自定义薪资表头
	 */
	@PostMapping(value = "/Custsave")
	@ApiOperation(value = "添加/修改薪资档案自定义", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult Customheadersave(@CurrentUser UserBean userBean,@RequestBody SalaryCustomizationDto salarycustomizationdto) {
		List<XcglAssoXzdazdy> xzdazdy = new LambdaQueryChainWrapper<XcglAssoXzdazdy>(xcglassoxzdazdymapper).eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode()).list();
		List<XcglAssoXzdazdy> zdylist = new ArrayList<XcglAssoXzdazdy>();
		PayCustomDto[] paycus = salarycustomizationdto.getPaycustomdto();//
		if (paycus.length > 0) {
			int z = xzdazdy.size() + 1;
			for (int p = 0; p < paycus.length; p++) {
				if (paycus[p].getId() != 0) {// 修改
					XcglAssoXzdazdy zdy = new XcglAssoXzdazdy();
					zdy.setId(paycus[p].getId());
					zdy.setZdmc(paycus[p].getTitle());// 字段名
					int zdsrklx = 2;
					if (paycus[p].getType() == "文字") {
						zdsrklx = 1;
					}
					zdy.setZdsrklx(zdsrklx);// 字段输入框类型 1:文本 2:数字
					xcglassoxzdazdymapper.dazdyupdate(zdy);
				} else {// 新增
					XcglAssoXzdazdy zdy = new XcglAssoXzdazdy();
					zdy.setQyid(userBean.getOrgCode());// 企业
					zdy.setXhpx(z);// 序号
					zdy.setZdmc(paycus[p].getTitle());// 字段名
					int zdsrklx = 2;
					if (paycus[p].getType() == "文字") {
						zdsrklx = 1;
					}
					zdy.setZdsrklx(zdsrklx);// 字段输入框类型 1:文本 2:数字
					zdy.setZdlx(1);// 字段类型 0:系统项 1:自定义
					zdylist.add(zdy);
					z++;
				}
			}
		}
		if (zdylist.size() > 0) {
			xcglassoxzdazdymapper.insertxcglassoxzdazdyList(zdylist);
		}
		//薪资档案-定薪
		List<XcglAssoXzdadx> xzdxlist = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper).eq(XcglAssoXzdadx::getQyid, userBean.getOrgCode()).list();
		for(XcglAssoXzdazdy xzd:zdylist) {//26 测试字段
			
			for(XcglAssoXzdadx dad:xzdxlist) { //
				XcglAssoXzdaz daz = new LambdaQueryChainWrapper<XcglAssoXzdaz>(xcglassoxzdazmapper).eq(XcglAssoXzdaz::getXzdazdyid, xzd.getId()).eq(XcglAssoXzdaz::getXzdadxid,dad.getId()).one();
				if(daz == null) {
					XcglAssoXzdaz xzdaz = new XcglAssoXzdaz();
					xzdaz.setXzdazdyid(xzd.getId());
					xzdaz.setRsz("");
					xzdaz.setXzdadxid(dad.getId());
					xzdaz.insert();
				}
			}
		}
		return new ResponseResult().success("添加/修改成功", zdylist);
	}

	/**
	 * 	删除薪资组自定义表头
	 */
	@DeleteMapping(value = "/customdelete/{id}")
	@ApiOperation(value = "删除薪资组自定义表头", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult customdelete(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		XcglAssoXzdazdy.builder().build().deleteById(id);
		return new ResponseResult().success("删除成功", id);
	}

	/**
	 * 	初始化数据
	 */
	@GetMapping(value = "/initialization")
	@ApiOperation(value = "初始化薪资档案自定义", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult Initialization(@CurrentUser UserBean userBean) {
		List<XcglAssoXzdazdy> cshsj = xcglassoxzdazdymapper.selectxcglassoxzdazdy(userBean.getOrgCode());
			String[] zdmc = { "基本工资", "绩效工资", "岗位津贴", "加班工资" };
			// 检查是否有初始化数据
			if (cshsj.size() == 0) {
				for (int z = 0; z < zdmc.length; z++) {
					XcglAssoXzdazdy zdy = new XcglAssoXzdazdy();
					zdy.setZdmc(zdmc[z]);// 字段名
					zdy.setZdsrklx(2);// 字段输入框类型 1:文本 2:数字
					zdy.setZdlx(0);// 字段类型 0:系统项 1:自定义
					zdy.setQyid(userBean.getOrgCode());// 企业id
					zdy.setXhpx(z + 1);// 序号
					zdy.insert();
				}
			}
			return new ResponseResult().success("初始化成功", null);
	}
	
	/**
	 *	定薪
	 */
	@PostMapping(value = "/fixedsalary")
	@ApiOperation(value = "定薪", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult fixedsalary(@CurrentUser UserBean userBean,@RequestBody FixedsalaryDto fixedsalarydto) {
		XcglAssoXzdadx xzdadx = XcglAssoXzdadx.builder().build();
		xzdadx.setUserid(Integer.valueOf(fixedsalarydto.getId()));//用户id
		xzdadx.setSxrq(fixedsalarydto.getSxrq());//生效日期
		xzdadx.setAddtime(new Date().getTime());
		xzdadx.setRemarks(fixedsalarydto.getRemarks());
		xzdadx.setQyid(userBean.getOrgCode());
		xzdadx.setTxzt(0);//0:使用中;1:最近使用;2:历史
		xcglassoxzdadxmapper.xzdadxinsert(xzdadx);
		int zdyid = xzdadx.getId();
		List<XcglAssoXzdaz> xzdazlist=new ArrayList<XcglAssoXzdaz>();
		CustomDto[] cus = fixedsalarydto.getCus();
		if(cus.length>0){
			for(int p=0;p<cus.length;p++){
				XcglAssoXzdaz xzdaz = new XcglAssoXzdaz();
				xzdaz.setXzdazdyid(cus[p].getId());//薪资档案自定义id
				xzdaz.setRsz(cus[p].getVal());//输入值
				xzdaz.setXzdadxid(zdyid);//薪资档案-定薪id
				xzdazlist.add(xzdaz);
			}
		}
		if(xzdazlist.size()>0){
			xcglassoxzdazmapper.insertxcglassoxzdazList(xzdazlist);
		}
		return new ResponseResult().success("成功", xzdadx); 
	}

	/**
	 *	获取调薪数据
	 */
	@GetMapping(value = "/getsalaryadjustment/{empnum}")
	@ApiOperation(value = "获取调薪数据", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult GetSalaryAdjustment(@CurrentUser UserBean userBean,@PathVariable Integer empnum) {
		List<ChangeSalaryDto> hqtxsj = xcglassoxzdazdymapper.AchieveSalaryAdjustment(userBean.getOrgCode(),empnum);
		return new ResponseResult().success("获取自定义薪资组表头信息", hqtxsj);
	}
	
	/**
	 *	调薪
	 */
	@PostMapping(value = "/payensaad")
	@ApiOperation(value = "调薪", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult EnterSalaryAdjustment(@CurrentUser UserBean userBean,@RequestBody FixedsalaryDto fixedsalarydto) {
		XcglAssoXzdadx xzds = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper).eq(XcglAssoXzdadx::getUserid, Integer.valueOf(fixedsalarydto.getId())).eq(XcglAssoXzdadx::getTxzt, 0).one();
			if(xzds != null) {
				XcglAssoXzdadx txrz = XcglAssoXzdadx.builder().build();
				txrz.setTxzt(1);//使用状态(0:使用中;1:历史
				txrz.setId(xzds.getId());
				txrz.updateById();
				XcglAssoXzdadx xzdadx = XcglAssoXzdadx.builder().build();
				xzdadx.setUserid(Integer.valueOf(fixedsalarydto.getId()));//用户id
				xzdadx.setSxrq(fixedsalarydto.getSxrq());//生效日期
				xzdadx.setAddtime(new Date().getTime());
				xzdadx.setXgyhid(userBean.getEmpNum());//修改用户id
				xzdadx.setRemarks(fixedsalarydto.getRemarks());
				xzdadx.setQyid(userBean.getOrgCode());
				xzdadx.setTxzt(0);//0:使用中;1:历史
				xcglassoxzdadxmapper.xzdadxinsert(xzdadx);
				int zdyid = xzdadx.getId();
				List<XcglAssoXzdaz> xzdazlist=new ArrayList<XcglAssoXzdaz>();
				CustomDto[] cus = fixedsalarydto.getCus();
				if(cus.length>0){
					for(int p=0;p<cus.length;p++){
						XcglAssoXzdaz xzdaz = new XcglAssoXzdaz();
						xzdaz.setXzdazdyid(cus[p].getId());//薪资档案自定义id
						xzdaz.setRsz(cus[p].getVal());//输入值
						xzdaz.setXzdadxid(zdyid);//薪资档案-定薪id
						xzdazlist.add(xzdaz);
					}
				}
				if(xzdazlist.size()>0){
					xcglassoxzdazmapper.insertxcglassoxzdazList(xzdazlist);
				}
				return new ResponseResult().success("调薪成功", xzdadx);
			}
			return new ResponseResult().error("调薪失败");
	}
	
	/**
	 *	调薪记录
	 */
	@GetMapping(value = "/payzdysj/{id}")
	@ApiOperation(value = "获取调薪记录信息", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SalaryAdjustmentRecord(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		List<FixedSalaryStaffDto> txjllist = xcglassoxzdazdymapper.SalaryAdjustmentRecord(userBean.getOrgCode(),id);
			return new ResponseResult().success("获取调薪记录信息", txjllist);
	}
	
	/**
	 *	删除调薪记录
	 */
	@DeleteMapping(value = "/delSalaryAdjustmentRecord/{id}")
	@ApiOperation(value = "删除调薪记录", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult delSalaryAdjustmentRecord(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		XcglAssoXzdadx.builder().build().deleteById(id);//薪资档案-定薪
		xcglassoxzdazmapper.Recorddelete(id);//薪资档案值
		return new ResponseResult().success("删除成功", id);
	}
	
	/**
	 *	获取薪资选项
	 */
	@GetMapping(value = "/salaryoptions")
	@ApiOperation(value = "获取薪资选项", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SalaryOoptions(@CurrentUser UserBean userBean) {
		List<XcglAssoOptionDto> itemlist = xcglsalaryitemmapper.selectxcglsalaryitemList();
		return new ResponseResult().success("获取薪资选项信息", itemlist);
	}
	
	/**
	 *	创建薪资组
	 */
	@PostMapping(value = "/paycreategro")
	@ApiOperation(value = "创建薪资组", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult CreatePayGroup(@CurrentUser UserBean userBean,@RequestBody CjPayrollGroupDto cjpaygro) {
		XcglAssoJxgz jxgz = new XcglAssoJxgz();
			jxgz.setXzzid(cjpaygro.getId());
			jxgz.setName(cjpaygro.getName());
			jxgz.setRemarks(cjpaygro.getRemarks());
			jxgz.setAddtime(new Date().getTime());
			jxgz.setAdduserid(userBean.getEmpNum());
			jxgz.setQyid(userBean.getOrgCode());
			xcglassojxgzmapper.jxgzinsert(jxgz);
			return new ResponseResult().success("创建薪资组成功", jxgz);
	}

	/**
	 *	修改薪资组
	 */
	@PutMapping(value = "/movecreatepaygroup")
	@ApiOperation(value = "修改薪资组", httpMethod = "PUT", notes = "接口发布说明")
	public Result<XcglAssoJxgz> MoveCreatePayGroup(@RequestBody CjPayrollGroupDto cjpaygro) {
		XcglAssoJxgz jxgz = XcglAssoJxgz.builder().build();
			jxgz.setId(cjpaygro.getId());
			jxgz.setName(cjpaygro.getName());
			jxgz.setRemarks(cjpaygro.getRemarks());
			jxgz.updateById();
			return ResultUtil.data(jxgz,"编辑员工权限成功");
	}
	
	/**
	 *	删除薪资组	
	 */
	@DeleteMapping(value = "/delcreatepaygroup/{id}")
	@ApiOperation(value = "删除薪资组", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult deleteCreatePayGroup(@PathVariable Integer id) {
		List<XcglAssoJsgzzx> jsgzzx = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getJxgzid, id).list();
		if(jsgzzx.size() > 0) {//
			for(XcglAssoJsgzzx jsgz:jsgzzx) {
				XcglAssoJsgzzx jsg = XcglAssoJsgzzx.builder().build();
				jsg.setId(jsgz.getId());
				jsg.setJxgzid(0);
				jsg.updateById();
			}	
		}
		XcglAssoJxgz.builder().build().deleteById(id);
		return new ResponseResult().success("解散成功", id);
	}

	/**
	 *	删除薪资项
	 */
	@DeleteMapping(value = "/deletesalaryitem/{id}/{ident}")
	@ApiOperation(value = "删除薪资项", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult deleteSalaryItem(@PathVariable Integer id,@PathVariable Integer ident) {
		if(ident == 1) {
			XcglAssoJsgzzx zx = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getId, id).one();
			XcglAdminXzz yjs = XcglAdminXzz.builder().build();
			yjs.setCountstate(0);//计算状态 0:未计算;1:已计算
			yjs.setId(zx.getXzzid());
			yjs.updateById();
			List<XcglAssoXzury> znrylist = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getXzzid, zx.getXzzid()).list();
			for(XcglAssoXzury qcjs:znrylist) {
				xcglassoxzbmapper.deleteXcglAssoXzb(qcjs.getUserid());
			}
		}
		XcglAssoJsgzzx.builder().build().deleteById(id);
		return new ResponseResult().success("删除成功", id);
	}
	
	
	@GetMapping(value = "/paysettings/{id}")
	@ApiOperation(value = "计薪规则设置", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SalaryCalculationRuleSettings(@PathVariable Integer id) {
		SalaryGroupGroupingDto salgr = new SalaryGroupGroupingDto();
		//#薪资组里未加入分组的字段
		List<PayTermDto> jsgzzx = xcglassojsgzzxmapper.selectxcglassojxgzList(id);
		salgr.setJsgzzx(jsgzzx);
		//#加入分组的字段
		List<PayGroupedDataDto> jrxzzs = xcglassojxgzmapper.selectPayrollGroupList(id);
		salgr.setPaygrte(jrxzzs);
		return new ResponseResult().success("获取调薪记录信息", salgr);
	}
	
	/**	
	 *	创建计薪规则组项【非自定义】
	 */
	@PostMapping(value = "/payrulegroupitem")
	@ApiOperation(value = "创建计薪规则组项", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult PayRuleGroupItem(@CurrentUser UserBean userBean,@RequestBody TjSalaryItemDot tjsal) {
		if(tjsal.getIdent() == 1) {//
			XcglAdminXzz yjs = XcglAdminXzz.builder().build();
			yjs.setCountstate(0);//计算状态 0:未计算;1:已计算
			yjs.setId(tjsal.getId());
			yjs.updateById();
			List<XcglAssoXzury> znrylist = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getXzzid, tjsal.getId()).eq(XcglAssoXzury::getQyid,userBean.getOrgCode()).list();
			for(XcglAssoXzury qcjs:znrylist) {
				xcglassoxzbmapper.deleteXcglAssoXzb(qcjs.getUserid());
			}
		}
		List<XcglAssoJsgzzx> gzzxlist=new ArrayList<XcglAssoJsgzzx>();
		//optitemid;//类型  1:人事信息、2:考勤、3:绩效奖金、4:应发、5:社保公积金、6:个税及实发
		SalaryItemRulesDto[] term = tjsal.getTerm();
		if(term.length > 0){
			for(int a=0;a<term.length;a++){
				XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(term[a].getOptname());
				XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
				zzx.setSalaryitem(term[a].getOptname());//薪资项
				zzx.setYhmbzd(term[a].getOptname());//银行模板项 需与银行一一对应
				if(xzxj != null && term[a].getOptitemid() != 0) {//系统有规则
					zzx.setRule(xzxj.getGsxs());//规则********************************
					zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
					zzx.setGsgs(xzxj.getGsxs());//公式格式 系统提供/自定义公式
					zzx.setRulestate(2);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
				}else {//系统无规则
					//薪资档案自定义
					XcglAssoXzdazdy daz = xcglassoxzdazdymapper.SalaryFixedWages(term[a].getOptname());
					if(daz!=null && term[a].getOptitemid() == 0) {//系统有固定设值  ==>  term[a].getOptitemid() == 0
						zzx.setRule("从薪资档案-"+term[a].getOptname()+"自动提取数据");//规则********************************
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs("从薪资档案-"+term[a].getOptname()+"自动提取数据");//公式格式 系统提供/自定义公式
						zzx.setRulestate(1);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
					}else {//
						String xxs = "自动提取数据";
						String[] strxz = {"从人事花名册-","从考勤报表-","从社保账单-"};
						String describe = "";
						int rule = 0;//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月手动导入]
						if(term[a].getOptitemid() == 1) {//人事信息
							describe = strxz[0] + term[a].getOptname() + xxs;
						}else if(term[a].getOptitemid() == 2){//考勤
							describe = strxz[1] + term[a].getOptname() + xxs;
						}else if(term[a].getOptitemid() == 3){//绩效奖金
							describe = "每月手动导入";
							rule = 4;
						}else if(term[a].getOptitemid() == 4){//应发
							describe = "每月手动导入";
							rule = 4;
						}else if(term[a].getOptitemid() == 5){//社保公积金
							describe = strxz[2] + term[a].getOptname()+"部分合计" + xxs;
						}
						zzx.setRule(describe);//规则********************************
						zzx.setGsid(0);//公式id  0:未关联规则
						zzx.setGsgs(describe);//公式格式 系统提供/自定义公式
						zzx.setRulestate(rule);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
					}
				}
				if(term[a].getOptitemid() != 0) {
					XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, term[a].getOptname()).one();
					zzx.setOptionid(opt.getId());
				}else {
					zzx.setOptionid(0);
				}
				zzx.setType(2);//类型 1:系统项;2:非系统项
				zzx.setAddtime(new Date().getTime());//添加时间
				zzx.setAdduserid(userBean.getEmpNum());//添加人员id
				zzx.setJxgzid(tjsal.getGroid());//计薪规则组id 0:未加入组
				zzx.setRemarks("");//备注
				zzx.setXzzid(tjsal.getId());
				gzzxlist.add(zzx);
			}
		}
		if(gzzxlist.size() > 0) {
			xcglassojsgzzxmapper.insertxcglassojsgzzxList(gzzxlist);
		}
		return new ResponseResult().success("创建薪资组成功", gzzxlist);
	}
	
	/**
	 *	创建自定义计薪规则组项
	 */
	@PostMapping(value = "/payCustomitem")
	@ApiOperation(value = "创建自定义计薪规则组项", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult PayCustomRuleGroupItem(@CurrentUser UserBean userBean,@RequestBody PayCustomZDYDto payc) {
		XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
		zzx.setSalaryitem(payc.getName());//薪资项
		zzx.setYhmbzd(payc.getName());//银行模板项 需与银行一一对应
		if(payc.getSource() == 1) {//自定义公式
			zzx.setRule(payc.getFormula());//规则********************************
			zzx.setGsid(0);//公式id  0:未关联规则
			zzx.setGsgs(payc.getFormula());//公式格式 系统提供/自定义公式
			zzx.setRulestate(3);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		}else if(payc.getSource() == 2){
			zzx.setRule("每月手动导入");//规则********************************
			zzx.setGsid(0);//公式id  0:未关联规则
			zzx.setGsgs("每月手动导入");//公式格式 系统提供/自定义公式
			zzx.setRulestate(4);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		}
		zzx.setType(2);//类型 1:系统项;2:非系统项
		zzx.setAddtime(new Date().getTime());//添加时间
		zzx.setAdduserid(userBean.getEmpNum());//添加人员id
		zzx.setJxgzid(payc.getFgid());//计薪规则组id 0:未加入组
		zzx.setRemarks(payc.getRemarks());//备注
		zzx.setXzzid(payc.getGid());//
		zzx.setOptionid(0);
		xcglassojsgzzxmapper.jsgzzxinsert(zzx);
		return new ResponseResult().success("创建薪资组成功", zzx);
	}
	
	/**
	 *	获取薪资项公式
	 */
	@GetMapping(value = "/salaryitemformula")
	@ApiOperation(value = "获取薪资项公式", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SalaryItemFormula(@PathVariable String text) {
		XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(text);
		return new ResponseResult().success("创建薪资组成功", xzxj);
	}
	
	/**
	 *	移动薪资项
	 */
	@PutMapping(value = "/movesalaryitem")
	@ApiOperation(value = "移动薪资项", httpMethod = "PUT", notes = "接口发布说明")
	public ResponseResult MoveSalaryItem(@RequestBody YdMobilePacketDto ydmob) {
		if(ydmob.getYdgid() != 0) {//踢出当前薪资组
			XcglAssoJsgzzx jsgzzx = XcglAssoJsgzzx.builder().build();
			jsgzzx.setJxgzid(ydmob.getYdgid());
			jsgzzx.setId(ydmob.getXid());
			jsgzzx.updateById();
		}else {
			XcglAssoJsgzzx jsgzzx = XcglAssoJsgzzx.builder().build();
			jsgzzx.setJxgzid(0);
			jsgzzx.setId(ydmob.getXid());
			jsgzzx.updateById();
		}
		return new ResponseResult().success("移动薪资项成功", null);
	}
	
	
	/*******计算薪资*********/
	
	/**
	 *	获取计薪规则组项
	 */
	@GetMapping(value = "/payrulegroupitem/{id}")
	@ApiOperation(value = "获取计薪规则组项", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult Payrulegroupitem(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		SalaryFieldDto salfie = new SalaryFieldDto();
		List<XcglAssoJsgzzx> jsgzzxlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, id).eq(XcglAssoJsgzzx::getType,2).list();
		List<CalculatedFieldDto> fielist = new ArrayList<CalculatedFieldDto>();
		for(XcglAssoJsgzzx jsg : jsgzzxlist) {
			CalculatedFieldDto fie = new CalculatedFieldDto();
			fie.setId(jsg.getId());
			fie.setTitle(jsg.getSalaryitem());
			fie.setFormula(jsg.getGsgs());//公式
			fielist.add(fie);
		}
		if(fielist.size() > 0) {
			salfie.setCalfie(fielist);
		}
		List<SalaryPersonFieldDto> userfies = xcglassoxzurymapper.selectpersonfieldList(id,userBean.getOrgCode());
		List<ComputeUserDto> usfil = new ArrayList<ComputeUserDto>();
		for(SalaryPersonFieldDto usfl:userfies) {
			ComputeUserDto ufd = new ComputeUserDto();
//			ufd.setName(usfl.getUsername());
//			ufd.setUsernum(usfl.getUsernum());
			ufd.setEmpname(usfl.getUsername());
			ufd.setDept(usfl.getDept());//部门
			ufd.setPost(usfl.getPost());//职位
			ufd.setEmpnum(usfl.getUsernum());
			usfil.add(ufd);
		}
		if(usfil.size() > 0) {
			salfie.setComuser(usfil);
		}
		return new ResponseResult().success("获取计薪规则组项成功", salfie);
	}
	
	/**
	 *	计算薪资
	 */
	@GetMapping(value = "/calculatesalary/{id}/{typeid}/{sxrq}")
	@ApiOperation(value = "计算薪资", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult CalculateSalary(@CurrentUser UserBean userBean,@PathVariable Integer id,@PathVariable Integer typeid,@PathVariable String sxrq) {
		//typeid--1:计算   2:重新计算
		//已知薪资组id****
		//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		//计算薪资改变薪资组计算状态
		XcglAdminXzz yjs = XcglAdminXzz.builder().build();
		yjs.setCountstate(1);//计算状态 0:未计算;1:已计算
		yjs.setId(id);
		yjs.updateById();
		
//		List<XcglAssoJsgzzx> attsect = xcglassojsgzzxmapper.selectSalarySectionList(id);
		
		//薪资组信息
		@SuppressWarnings("unused")
		XcglAdminXzz xzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getId, id).one();
		//当前薪资组内人员
		List<XcglAssoXzury> znrys = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getXzzid, id).eq(XcglAssoXzury::getQyid,userBean.getOrgCode()).list();
		List<CalculationDto> jswsj = null;
		if(znrys.size() > 0) {//该薪资组有成员
			
			for(XcglAssoXzury znr:znrys) {
				
//				if(typeid.equals(1)) {//计算
					//如果是重新计算   就不要删除同步考勤的数据
//					xcglassoxzbmapper.deleteXcglAssoXzb(znr.getUserid());//删除已经计算的薪资
//				}else {//重新计算
					//如果是重新计算   就不要删除同步考勤的数据
					xcglassoxzbmapper.deleteByuserid(znr.getUserid(),id,sxrq);//删除已经计算的薪资
//				}
				
				//查询员工定薪数据
				XcglAssoXzdadx isdx = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper).eq(XcglAssoXzdadx::getUserid,znr.getUserid()).eq(XcglAssoXzdadx::getQyid, userBean.getOrgCode()).eq(XcglAssoXzdadx::getTxzt, 0).one();
				if(isdx != null) {
					//查询 “1:系统固定值”数据----入[薪资表]
					List<CalculationOptionsDto> gdxzx = xcglassojsgzzxmapper.selectCalculationOptionsList(id,znr.getUserid());
					for(CalculationOptionsDto cal:gdxzx) {
						XcglAssoXzb xzb = XcglAssoXzb.builder().build();
						xzb.setUserid(znr.getUserid());//用户id
						xzb.setXzyf(sxrq);//薪资月
						xzb.setXzxid(cal.getId());//薪资项id
						xzb.setXzxjg(cal.getRsz());//薪资项结果
						xzb.setQyid(userBean.getOrgCode());
						xcglassoxzbmapper.xzbinsert(xzb);
					}
				}else {
					//未定薪人员   薪资表内“1:系统固定值”全为-->0
					List<XcglAssoJsgzzx> jsgzzxlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, id).eq(XcglAssoJsgzzx::getRulestate,1).list();
					for(XcglAssoJsgzzx cal:jsgzzxlist) {
						XcglAssoXzb xzb = XcglAssoXzb.builder().build();
						xzb.setUserid(znr.getUserid());//用户id
						xzb.setXzyf(sxrq);//薪资月
						xzb.setXzxid(cal.getId());//薪资项id
						xzb.setXzxjg("0");//薪资项结果
						xzb.setQyid(userBean.getOrgCode());
						xcglassoxzbmapper.xzbinsert(xzb);
					}
				}
				//查询“0:系统自动提取”数据----入[薪资表]   200---姓名
				List<XcglAssoJsgzzx> xtzdtqlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, id).eq(XcglAssoJsgzzx::getRulestate,0).list();
				for(XcglAssoJsgzzx xtzd:xtzdtqlist) {
					if(xtzd.getOptionid() > 0) {//说明阔以根据表查出结果
						XcglAssoOption lbcx = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getId,xtzd.getOptionid()).one(); 
						if(lbcx.getTablename() != null && !lbcx.getTablename().equals("") && lbcx.getFieldname() != null && !lbcx.getFieldname().equals("")) {
							String tablename = lbcx.getTablename();//对应库表名
							String fieldname = lbcx.getFieldname();//对应库字段名
							List<Map<String, Object>> list = null;
							if(tablename.equals("yggl_main_emp")) {//员工管理
								QueryWrapper<YgglMainEmp> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("emp_num", znr.getUserid());//select #{tablename} from yggl_main_emp where emp_num = ?
								list = ygglmainempmapper.selectMaps(queryWrapper);
							}
					        String autacq = "";
				        	for(Map<String, Object> aut:list) {
				        		if(aut != null) {
				        			autacq = aut.toString().substring(aut.toString().indexOf("=")+1).replace("}", "");
				        		}
				        	}
					        //处理结果
					        if(fieldname.equals("job_type")) {
					        	if(autacq.equals("0")) {autacq="全职";}else
								if(autacq.equals("1")) {autacq="实习生";}else
								if(autacq.equals("2")) {autacq="兼职";}else		
								if(autacq.equals("3")) {autacq="劳务派遣";}else		
								if(autacq.equals("4")) {autacq="劳务";}else		
								if(autacq.equals("5")) {autacq="派遣";}else		
								if(autacq.equals("6")) {autacq="外包";}else {autacq="退休返聘";}		
					        }else if(fieldname.equals("job_status")) {
					        	if(autacq.equals("0")) {autacq="试用";}else
								if(autacq.equals("1")) {autacq="正式";}else
								if(autacq.equals("2")) {autacq="离职中";}else {autacq="已离职";}	
				        	}else if(fieldname.equals("rz_time") || fieldname.equals("zz_time")) {
				        		autacq = autacq.substring(0, 10);
				        	}
					        //入[薪资表]
					        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
							xzb.setUserid(znr.getUserid());//用户id
							if(fieldname.equals("name") || fieldname.equals("emp_num")) {
								xzb.setXzyf("");//薪资月
							}else {
								xzb.setXzyf(sxrq);//薪资月
							}
							xzb.setXzxid(xtzd.getId());//薪资项id
							xzb.setXzxjg(autacq);//薪资项结果
							xzb.setQyid(userBean.getOrgCode());
							xcglassoxzbmapper.xzbinsert(xzb);
						}else {
							if(lbcx.getItemid() == 1) {//人事
								//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								if(("部门").equals(lbcx.getOptionname()) || ("职位").equals(lbcx.getOptionname())) {
									xzb.setXzyf("");//薪资月
								}else {
									xzb.setXzyf(sxrq);//薪资月
								}
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg("");//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
							}else {
								//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(sxrq);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg("0");//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
							}
						}
					}
				}
				
				
				//查询“0:系统自动提取”数据----入[薪资表]   200---姓名
				List<XcglAssoJsgzzx> xtzdtqother = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, id).list();
				for(XcglAssoJsgzzx xtzd:xtzdtqother) {
					if(xtzd.getRulestate() == 2 || xtzd.getRulestate() == 3 || xtzd.getRulestate() == 4) {
						if(xtzd.getOptionid() > 0) {//说明阔以根据表查出结果
							XcglAssoOption lbcx = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getId,xtzd.getOptionid()).one(); 
							if(lbcx.getTablename() != null && !lbcx.getTablename().equals("") && lbcx.getFieldname() != null && !lbcx.getFieldname().equals("")) {
								@SuppressWarnings("unused")
								String tablename = lbcx.getTablename();//对应库表名
								@SuppressWarnings("unused")
								String fieldname = lbcx.getFieldname();//对应库字段名
								@SuppressWarnings("unused")
								List<Map<String, Object>> list = null;
//								if(tablename.equals("yggl_main_emp")) {//员工管理
//									QueryWrapper<YgglMainEmp> queryWrapper = new QueryWrapper<>();
//									queryWrapper.select(fieldname).eq("emp_num", znr.getUserid());//select #{tablename} from yggl_main_emp where emp_num = ?
//									list = ygglmainempmapper.selectMaps(queryWrapper);
//								}
//						        String autacq = "";
//					        	for(Map<String, Object> aut:list) {
//					        		if(aut != null) {
//					        			autacq = aut.toString().substring(aut.toString().indexOf("=")+1).replace("}", "");
//					        		}
//					        	}
					        	
					        	//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(sxrq);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg("0");//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
					        	
							}else {
								//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(sxrq);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg("0");//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
							}
						}
					}
				}
				
				
			}
			
			//计算完成 返回数据
			jswsj = xcglassoxzbmapper.CalculationResults(id,sxrq,userBean.getOrgCode());
			
			return new ResponseResult().success("计算完成", jswsj);
		}else {//该组无人
			return new ResponseResult().error("请先添加算薪人员");
		}
		
	}

	/**
	 *	查看薪资
	 */
	@GetMapping(value = "/checksalary/{id}/{sxrq}")
	@ApiOperation(value = "查看薪资", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult CheckSalary(@CurrentUser UserBean userBean,@PathVariable Integer id,@PathVariable String sxrq) {
		//计算完成 返回数据
		List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(id,sxrq,userBean.getOrgCode());
		return new ResponseResult().success("查看薪资成功", jswsj);
	}
	
	/**
	 *	同步考勤
	 */
	@GetMapping(value = "/SynchroAtt/{id}/{sxrq}")
	@ApiOperation(value = "同步考勤", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SynchroAttendance(@CurrentUser UserBean userBean,@PathVariable Integer id,@PathVariable String sxrq) {
		//已知薪资组id****
		//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		//薪资组信息
		XcglAdminXzz xzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getId, id).one();
		//薪资组项--考勤
		List<XcglAssoJsgzzx> attsect = xcglassojsgzzxmapper.selectSalarySectionList(id);
		//当前薪资组内人员
		List<XcglAssoXzury> znrys = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getXzzid, id).eq(XcglAssoXzury::getQyid,userBean.getOrgCode()).list();
		if(znrys.size() > 0) {//该薪资组有成员
			for(XcglAssoXzury znr:znrys) {
				//删除已经计算的考勤薪资
				xcglassoxzbmapper.deleteByAttendance(znr.getUserid(), id,sxrq);
				//计算得出考勤相关数据
				AttendanceReport attrep = getAttendanceReport(userBean.getOrgCode(),znr.getUserid(),xzz.getPayrollcycle());
				
				for(XcglAssoJsgzzx payatt:attsect) {//查询同步考勤时所需要的字段
					if(payatt.getOptionid() > 0) {//说明阔以根据表查出结果
						XcglAssoOption lbcx = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getId,payatt.getOptionid()).one();
						if(lbcx.getFieldname() != null && !lbcx.getFieldname().equals("")) {//关于考勤的只有 -- 字段名:“fieldname”
							@SuppressWarnings("unused")
							String tablename = lbcx.getTablename();//对应库表名
							String fieldname = lbcx.getFieldname();//对应库字段名
							
							int autacq = 0;
							if(fieldname.equals("days_duty")) {//应出勤天数
								autacq = attrep.getAnswerday();
							}else if(fieldname.equals("actual_days")) {//实际出勤天数
								autacq = attrep.getActualday();
							}else if(fieldname.equals("rest_days")) {//休息天数
								autacq = attrep.getRestday();
							}else if(fieldname.equals("gzsc")) {//工作时长
								autacq = attrep.getWorkhours();
							}else if(fieldname.equals("late_num")) {//迟到次数
								autacq = attrep.getLatenum();
							}else if(fieldname.equals("late_time")) {//迟到时长
								autacq = attrep.getLatehours();
							}else if(fieldname.equals("absen_days ")) {//矿工天数
								autacq = attrep.getMinerday();
							}else if(fieldname.equals("early_num")) {//早退次数
								autacq = attrep.getLeanum();
							}else if(fieldname.equals("early_time")) {//早退时长
								autacq = attrep.getLeahours();
							}else if(fieldname.equals("sbqk_num")) {//上班缺卡次数
								autacq = attrep.getGoworkmissingcard();
							}else if(fieldname.equals("xbqk_num")) {//下班缺卡次数
								autacq = attrep.getOffworkmissingcard();
							}
							
							//入[薪资表]
					        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
							xzb.setUserid(znr.getUserid());//用户id
							xzb.setXzyf(sxrq);//薪资月
							xzb.setXzxid(payatt.getId());//薪资项id
							xzb.setXzxjg(String.valueOf(autacq));//薪资项结果
							xzb.setQyid(userBean.getOrgCode());
							xcglassoxzbmapper.xzbinsert(xzb);
						}else {
							
							//入[薪资表]
					        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
							xzb.setUserid(znr.getUserid());//用户id
							xzb.setXzyf(sxrq);//薪资月
							xzb.setXzxid(payatt.getId());//薪资项id
							xzb.setXzxjg("0");//薪资项结果
							xzb.setQyid(userBean.getOrgCode());
							xcglassoxzbmapper.xzbinsert(xzb);
							
						}
					}
				}
				
				
			}
			
			//计算完成 返回数据
			List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(id,sxrq,userBean.getOrgCode());
			
			return new ResponseResult().success("考勤数据同步成功", jswsj);
			
		}else {//该组无人
			return new ResponseResult().error("请先添加算薪人员");
		}
		
	}
	
	
	/***************/
	/***考勤****/
	/**
	 * @param orgCode 企业id
	 * @param userid	用户id	
	 * @param payrolldate 计薪日期
	 * @param attendancedetails
	 * @return
	 */
	public AttendanceReport getAttendanceReport(int orgCode,int userid,String payrolldate) {
		
		String start = payrolldate.substring(0, 10);
		String end = payrolldate.substring(11, 21);
		
		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH) + 1;
		int date = cal.get(Calendar.DATE);
		
	    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		
		Long startDate = 0l;
		Long endDate = 0l;
		

	   try {
		   String sdaet = getMinMonthDate(start);
		   startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaet,"yyyy-MM-dd")).getTime();
		       
		   String edate = getMaxMonthDate(end);
		   endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(edate,"yyyy-MM-dd")).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	
		int gzsc = punchcarddetailsservice.selectWorkingHours(userid,startDate,endDate);
		
		List<PunchRecord> initial = punchrecordservice.getMaintenancePunchCardList(startDate,endDate,userid);
		int latenum = 0;// 迟到次数
		int latehours = 0;// 迟到时长
		int leanum = 0;// 早退次数
		int leahours = 0;// 早退时长
		if(initial.size() > 0){
			for(PunchRecord prd : initial){
				if(prd.getType() == 1 && prd.getResults() > 0){
					latenum++;
					latehours += prd.getResults();
				}
				if(prd.getType() == 2 && prd.getResults() > 0){
					leanum++;
					leahours += prd.getResults();
				}
			}
		}
		
		AttendanceReport attrep = new AttendanceReport();
		attrep.setId(0);
		attrep.setName("");//姓名
		attrep.setJobnumber(userid);//工号
		attrep.setWorkhours(gzsc);//工作时长
		
		attrep.setLatenum(latenum);//
		attrep.setLatehours(latehours);//
		attrep.setLeanum(leanum);//
		attrep.setLeahours(leahours);//
		/**********/
		AttendanceGroup attgro = attendancegroupservice.getAttendanceGroupInformationByUserid(userid,orgCode); //考勤组信息
		//pbfs;// 排班方式 1:固定排班;2:自由排班;3:自由工时
		if(attgro != null){//该员工是否加入到考勤组
			if(attgro.getPbfs() == 1){
				//当前月     必须打卡日期
				List<SpecialDate> bxdklist = specialdateservice.ShouldSpecialDatessetByKqzid(attgro.getId(),startDate,endDate);
				int bxdk = bxdklist.size();
				//当前月     无需打卡日期
				List<SpecialDate> wxdk = specialdateservice.RestSpecialDatessetByKqzid(attgro.getId(),startDate,endDate);
				String[] appmaps= new String[wxdk.size()];
				int d1 = 0;
				for(SpecialDate spe:wxdk){
					appmaps[d1] = spe.getTsrq();
					d1++;
				}
				List<AttendanceWeeklySch> atwek = attendanceweeklyschservice.selectAttendanceMadeByUserid(userid,orgCode);
				String[] week= new String[atwek.size()];
				int e = 0;
				for(AttendanceWeeklySch awek : atwek){
					week[e] = awek.getWekmc();
					e++;
				}
				String yemo = year + "-" + month;
				String datetime = year + "-" + month + "-" + date;
				SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
				sdf1.setLenient(false);
				SimpleDateFormat sdf2 = new SimpleDateFormat("EEE");
				try {
					Date parse = sdf.parse(datetime);
					Calendar lastDate = Calendar.getInstance();
					 lastDate.setTime(parse);
					 lastDate.set(Calendar.DATE, 1);
					 lastDate.add(Calendar.MONTH, 1);
					 lastDate.add(Calendar.DATE, -1);
				} catch (ParseException e1) {
					e1.printStackTrace();
				}
				int y = 0;
				int q = 0;
				 for(int i = 1; i <= getDaysByYearMonth(year,month); i++){
					 try {
						Date date1 = sdf1.parse(yemo + "-" + i);
						for(int u=0;u<week.length;u++){
							if(sdf2.format(date1).equals(week[u])){
								
								q++;
								
								y++;
								if(Arrays.asList(appmaps).contains(String.valueOf(sdf1.format(date1)))){
									y = y-1;
								}
							}
						}
					} catch (ParseException c) {
						c.printStackTrace();
					}
				 }
				 
				 int xiuxi = getDaysByYearMonth(year,month) - q - bxdk + wxdk.size();
				 attrep.setRestday(xiuxi);//休息天数
				 attrep.setAnswerday(y+bxdk);//应出勤
				/***********/
			}else if(attgro.getPbfs() == 2){
				List<Schedule> ycqs = scheduleservice.getAttendanceShouldList(userid,startDate,endDate);
				int xiuxi = 0;
				int shangban = 0;
				for(Schedule sc : ycqs){
					if(sc.getBcid().equals(0)){
						xiuxi++;
					}else{
						shangban++;
					}
				}
				attrep.setRestday(xiuxi);//休息天数
				attrep.setAnswerday(shangban);//应出勤
			}else{
				List<AttendanceWeeklySch> atwek = attendanceweeklyschservice.selectAttendanceMadeByUserid(userid,orgCode);
				String[] week= new String[atwek.size()];
				int e = 0;
				for(AttendanceWeeklySch awek : atwek){
					week[e] = awek.getWekmc();
					e++;
				}
				String yemo = year + "-" + month;
				String datetime = year + "-" + month + "-" + date;
				SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
				sdf1.setLenient(false);
				SimpleDateFormat sdf2 = new SimpleDateFormat("EEE");
				try {
					Date parse = sdf.parse(datetime);
					Calendar lastDate = Calendar.getInstance();
					 lastDate.setTime(parse);
					 lastDate.set(Calendar.DATE, 1);
					 lastDate.add(Calendar.MONTH, 1);
					 lastDate.add(Calendar.DATE, -1);
				} catch (ParseException e1) {
					e1.printStackTrace();
				}
				int y = 0;
				 for(int i = 1; i <= getDaysByYearMonth(year,month); i++){
					 try {
						Date date1 = sdf1.parse(yemo + "-" + i);
						for(int u=0;u<week.length;u++){
							if(sdf2.format(date1).equals(week[u])){
								y++;
							}
						}
					} catch (ParseException c) {
						c.printStackTrace();
					}
				 }
				 
				 int xiuxi = getDaysByYearMonth(year,month) - y;
				 attrep.setRestday(xiuxi);//休息天数
				 attrep.setAnswerday(y);//应出勤
			}
		    List<PunchCardDetails> attendance = punchcarddetailsservice.selectAttendanceDays(userid, startDate, endDate);//打卡记录
		    attrep.setActualday(attendance.size());//已出勤
			if(attrep.getAnswerday() > 0){
				BigDecimal g = new BigDecimal(attrep.getAnswerday());  
				BigDecimal h = new BigDecimal(attrep.getActualday()); 
				int lack = g.subtract(h).intValue();  
				attrep.setMinerday(lack);//缺勤
			}
            int sbqk = 0;
            int xbqk = 0;
            for(PunchCardDetails pcd:attendance){
            	if(pcd.getYdkcs() == 2 || pcd.getYdkcs() == 4 || pcd.getYdkcs() == 6){
            		if(pcd.getSbdk1() == null){
            			sbqk++;
            		}
            		if(pcd.getXbdk1() == null){
            			xbqk++;
            		}
            	}
            	if(pcd.getYdkcs() == 4 || pcd.getYdkcs() == 6){
            		if(pcd.getSbdk2() == null){
            			sbqk++;
            		}
            		if(pcd.getXbdk2() == null){
            			xbqk++;
            		}
            	}
            	if(pcd.getYdkcs() == 6){
            		if(pcd.getSbdk3() == null){
            			sbqk++;
            		}
            		if(pcd.getXbdk3() == null){
            			xbqk++;
            		}
            	}
            }
            attrep.setGoworkmissingcard(sbqk);//上班缺卡
            attrep.setOffworkmissingcard(xbqk);//下班缺卡
		}
		/**********/
		
		
		return attrep;
			
	}
	
	/**
     * 	根据 年、月 获取对应的月份 的 天数
     */
	 public static int getDaysByYearMonth(int year, int month)
	 {
	     Calendar a = Calendar.getInstance();
	     a.set(Calendar.YEAR, year);
	     a.set(Calendar.MONTH, month - 1);
	     a.set(Calendar.DATE, 1);
	     a.roll(Calendar.DATE, -1);
	     int maxDate = a.get(Calendar.DATE);
	     return maxDate;
	 }
	
	 /**
	 *	 获取月份起始日期
	 * 
	 * @param date
	 * @return
	 * @throws ParseException
	 */
	public String getMinMonthDate(String date) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(mat.parse(date));
		calendar.set(Calendar.DAY_OF_MONTH,
				calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
		return mat.format(calendar.getTime());
	}

	/**
	 *	 获取月份最后日期
	 * 
	 * @param date
	 * @return
	 * @throws ParseException
	 */
	public String getMaxMonthDate(String date) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(mat.parse(date));
		calendar.set(Calendar.DAY_OF_MONTH,
				calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return mat.format(calendar.getTime());
	}
	
	/**
	 *	导入薪资
	 */
	@PostMapping(value = "/payimport")
	@ApiOperation(value = "导入薪资", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult ImportSalaryData(@CurrentUser UserBean userBean,@RequestBody ImportSalarySetDto impor) {
		// XcglAdminXzz xzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getId, impor.getGid()).one();
		//用户工号来匹配入库
			//XcglAssoXzury xzuryone = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getQyid, orgCode).eq(XcglAssoXzury::getXzzid, impor.getGid()).eq(XcglAssoXzury::getUserid, impor.getUsernum()).one();
			//用户名称来匹配入库
			//XcglAssoXzury yhmpp = xcglassoxzurymapper.selectImportedSalary(impor.getGid(),impor.getUsername(),String.valueOf(orgCode));
			
			
			ImportSalaryDto[] ims = impor.getImsalary();//
			if(ims.length>0){
				for(int p=0;p<ims.length;p++){
					
					//用户工号来匹配入库
					XcglAssoXzury xzuryone = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getQyid, userBean.getOrgCode()).eq(XcglAssoXzury::getXzzid, impor.getGid()).eq(XcglAssoXzury::getUserid, ims[p].getUsernum()).one();
					
					//用户名称来匹配入库
					XcglAssoXzury yhmpp = xcglassoxzurymapper.selectImportedSalary(impor.getGid(),ims[p].getUsername(),String.valueOf(userBean.getOrgCode()));
					
					int k = 0;
					if(xzuryone != null) {
						XcglAssoXzb xzb = XcglAssoXzb.builder().build();
						xzb.setUserid(xzuryone.getUserid());//
						xzb.setXzyf(impor.getSxrq());//
						xzb.setXzxid(ims[p].getJsgzzx());//
						xzb.setXzxjg(String.valueOf(ims[p].getSrz()));//
						xzb.setQyid(userBean.getOrgCode());
						xcglassoxzbmapper.ModifyImportedSalary(xzb);
						k++;
					}
					if(yhmpp != null && k == 0) {
						XcglAssoXzb xzb = XcglAssoXzb.builder().build();
						xzb.setUserid(yhmpp.getUserid());//
						xzb.setXzyf(impor.getSxrq());//
						xzb.setXzxid(ims[p].getJsgzzx());//
						xzb.setXzxjg(String.valueOf(ims[p].getSrz()));//
						xzb.setQyid(userBean.getOrgCode());
						xcglassoxzbmapper.ModifyImportedSalary(xzb);
					}
				}
			}
			return new ResponseResult().success("考勤数据同步成功");
		
	}
	
	/**
	 *	切换薪资日期
	 */
	@GetMapping(value = "/switchsalarydate/{sxrq}")
	@ApiOperation(value = "切换薪资日期", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SwitchSalaryDate(@CurrentUser UserBean userBean,@PathVariable String sxrq) {
		List<SwitchSalaryDateDto> ssd = new ArrayList<SwitchSalaryDateDto>();
		List<XcglAdminXzz> xcgladminxzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).list();
		for(XcglAdminXzz xzx : xcgladminxzz) {
			XcglAssoXzury isck = xcglassoxzurymapper.selectISswitchdate(xzx.getId(),sxrq);
			// int payperiod = xzx.getPayperiod();//算薪月周期 0:上月;1:当月
			// int paydayperiod = xzx.getPaydayperiod();//算薪日周期 全月
			//输入月份的开始于结束
			String strstartdate = "";
			String strendDate = "";
			String lastmonth = "";
			String nextMonth = "";
			
			String lasstrstartdate = "";
			String lasstrendDate = "";
			try {
			   String date = sxrq+"-01";
			   String sdaet = getMinMonthDate(date);
			   Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaet,"yyyy-MM-dd")).getTime();
			   strstartdate = new SimpleDateFormat("yyyy-MM-dd").format(startDate);// 上
			   String edate = getMaxMonthDate(date);
			   Long endDate = DateUtil.getnowEndTime(23,DateUtil.getStringTime(edate,"yyyy-MM-dd")).getTime();
			   strendDate = new SimpleDateFormat("yyyy-MM-dd").format(endDate);// 上
			   
				String dateStr = date+" 00:00:00";
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date transDate = sdf.parse(dateStr);
				
				Calendar lastm = Calendar.getInstance();
				lastm.setTime(transDate); // 设置为当前时间
				lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
				lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
				
				Calendar lastmtow = Calendar.getInstance();
				lastmtow.setTime(transDate); // 设置为当前时间
				lastmtow.add(Calendar.MONTH, 1);
				nextMonth = new SimpleDateFormat("yyyy-MM").format(lastmtow.getTime());// 下
				
				String lasdate = lastmonth+"-01";
			    String sdaetlas = getMinMonthDate(lasdate);
			    Long startDatelas = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaetlas,"yyyy-MM-dd")).getTime();
			    lasstrstartdate = new SimpleDateFormat("yyyy-MM-dd").format(startDatelas);// 上
			    String edatelas = getMaxMonthDate(lasdate);
			    Long endDatelas = DateUtil.getnowEndTime(23,DateUtil.getStringTime(edatelas,"yyyy-MM-dd")).getTime();
			    lasstrendDate = new SimpleDateFormat("yyyy-MM-dd").format(endDatelas);// 上
			} catch (ParseException e) {
				e.printStackTrace();
			}
			
			
			String payper = String.format("%02d", xzx.getPaydayperiod());
			String payrollcycle = "";
			if (xzx.getPayperiod() == 0) {// 上月
				if (xzx.getPaydayperiod() == 1) {
					//上个月开始  --- 上个月结束
					payrollcycle = lasstrstartdate + "到" + lasstrendDate;
				} else {
					String firstnext = lastmonth + "-" + payper;
					int jgs = xzx.getPaydayperiod() - 1;
					String lastnext = sxrq + "-" + String.format("%02d", jgs);
					payrollcycle = firstnext + "到" + lastnext;
				}
			} else {// 当月
				if (xzx.getPaydayperiod() == 1) {
					//本月开始 -- 本月结束
					payrollcycle = strstartdate + "到" + strendDate;//*********
				} else {
					String firstnow = sxrq + "-" + payper;
					int jgs = xzx.getPaydayperiod() - 1;
					String lastnow = nextMonth + "-" + String.format("%02d", jgs);
					payrollcycle = firstnow + "到" + lastnow;
				}
			}
			
			SwitchSalaryDateDto sds = new SwitchSalaryDateDto();
			if(isck != null) {
				sds.setGid(xzx.getId());
				sds.setState(1);//已计算
				sds.setCycle(payrollcycle);
				ssd.add(sds);
			}else {
				sds.setGid(xzx.getId());
				sds.setState(0);//未计算
				sds.setCycle(payrollcycle);
				ssd.add(sds);
			}
		}
		
		return new ResponseResult().success("成功", ssd);
	}
	
	/**
	 *	获取附加扣除数据
	 */
//	@GetMapping(value = "/obtainidedu")
//	@ApiOperation(value = "获取附加扣除数据", httpMethod = "GET", notes = "接口发布说明")
	@PostMapping(value = "/obtainidedu")
	@ApiOperation(value = "获取附加扣除数据", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult ObtainAdditionalDeduction(@CurrentUser UserBean userBean,@RequestBody SearchSalariedPeopleDto search) {
		
		search.setOrgcode(userBean.getOrgCode());
		if(("0").equals(search.getStatus())) {//全部
			search.setStatus("");
		}else if(("1").equals(search.getStatus())) {//在职
			search.setStatus("0");
		}else {
			search.setStatus("3");
		}
		
		List<AdditionalDeductionDto> fjkclist = xcglassozxfjkcmapper.selectAdditionalDeduction(search);
		return new ResponseResult().success("获取附加扣除数据成功", fjkclist);
	}
	
	
//	@PostMapping(value = "/programme")
//	@ApiOperation(value = "获取附加扣除数据搜索/分页", httpMethod = "POST", notes = "接口发布说明")
//	public Result<Object> programme(@CurrentUser UserBean userBean,@RequestBody AdditionalkcDto kcdto) {
//		
//		String n = kcdto.getName();
//		int s = kcdto.getState();
//		String d = kcdto.getDate();
//		
//
//		/*
//		 * Page<AdditionalDeductionDto> page = new Page<AdditionalDeductionDto>(
//		 * kcdto.getCurrentPage() == null ? 1 : kcdto.getCurrentPage(),
//		 * kcdto.getTotalPage() == null ? 10 : kcdto.getTotalPage());
//		 */
//		
//		PageHelper.startPage(kcdto.getCurrentPage() == null ? 1 : kcdto.getCurrentPage(), kcdto.getTotalPage() == null ? 10 : kcdto.getTotalPage());
//		
//		
//		//List<AdditionalDeductionDto> fjkclist = xcglassozxfjkcmapper.selectAdditionalDeduction(userBean.getOrgCode());
//		
//		Page<AdditionalDeductionDto>  fjkcpage = xcglassozxfjkcmapper.selectAdditionalDeduction(userBean.getOrgCode());
//		
//		List<AdditionalDeductionDto> fjkclist = fjkcpage.getRecords();
//		
//		fjkcpage.getCurrent();
//		fjkcpage.getPages();
//		fjkcpage.getTotal();
//		fjkcpage.getSize();
//		
//		
////		QueryWrapper<SbgjjAssoCbfa> queryWrapper = new QueryWrapper<>();
////		queryWrapper.eq("qyid",userBean.getOrgCode()).and(!StrUtil.hasBlank(c), wq -> wq.likeRight("cbcs", c));
////		
////		IPage<SbgjjAssoCbfa> sbgjjassocbfaPage = SbgjjAssoCbfa.builder().build().selectPage(page, queryWrapper);
////		
////		IPage<AdditionalDeductionDto> sbgjjassocbfaPage =
////		List<SbgjjAssoCbfa> sbgjjassocbfaEmps = sbgjjassocbfaPage.getRecords();
////		sbgjjassocbfaPage.getCurrent();
////		sbgjjassocbfaPage.getPages();
////		sbgjjassocbfaPage.getTotal();
////		sbgjjassocbfaPage.getSize();
//		
//		return ResultUtil.data2(fjkcpage, fjkclist, "方案搜索成功");
//	}
	
	
	/**
	 *	专项附加扣除
	 */
	@PostMapping(value = "/addduction")
	@ApiOperation(value = "专项附加扣除", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult AdditionalDeduction(@CurrentUser UserBean userBean,@RequestBody XcglAssoZxfjkc xcglas) {
		if(xcglas.getId() == 0) {
			xcglas.setQyid(userBean.getOrgCode());
			xcglas.setAddtime(new Date().getTime());
			xcglassozxfjkcmapper.insertXcglAssoZxfjkc(xcglas);
		}else {
			XcglAssoZxfjkc fjkc = XcglAssoZxfjkc.builder().build();
			fjkc.setId(xcglas.getId());
			fjkc.setChildrenedu(xcglas.getChildrenedu());
			fjkc.setHouseloans(xcglas.getHouseloans());
			fjkc.setHouserents(xcglas.getHouserents());
			fjkc.setSupportolder(xcglas.getSupportolder());
			fjkc.setContinueedu(xcglas.getContinueedu());
			fjkc.setTotalmoney(xcglas.getTotalmoney());
			xcglassozxfjkcmapper.updateXcglAssoZxfjkc(fjkc);
		}
		
		
		return new ResponseResult().success("成功", xcglas);
	}

	@GetMapping(value = "/payslip/{id}/{sxrq}")
	@ApiOperation(value = "工资条", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult EnterPayslip(@CurrentUser UserBean userBean,@PathVariable Integer id,@PathVariable String sxrq) {
		int xscgztszid = 0;
		XcglAssoGztsz xscid = new LambdaQueryChainWrapper<XcglAssoGztsz>(xcglassogztszmapper).eq(XcglAssoGztsz::getQyid, userBean.getOrgCode())
				.eq(XcglAssoGztsz::getGztyf, sxrq).eq(XcglAssoGztsz::getXzzid,id).one();
		if(xscid != null) {
			xscgztszid = xscid.getId();
			xcglassogztszmapper.deletexcglassogztsz(sxrq,id);
		}
		
		XcglAdminXzz xzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).eq(XcglAdminXzz::getId, id).one();
		
		XcglAssoGztsz gztsz = XcglAssoGztsz.builder().build();
		gztsz.setMbmc(sxrq+"工资条("+xzz.getName()+")");//模板名称
		gztsz.setGztyf(sxrq);
		gztsz.setIsWxts(1);//温馨提示开关 (0:关;1:开)
		gztsz.setWxtslr("工资条属于敏感信息,请注意保密");//温馨提示内容
		gztsz.setTop(0);//实发金额(头部显示) 实发金额是指员工实际到手的工资,将显示在员工工资条的顶部蓝色区域
		gztsz.setIsYcksj(0);//隐藏空数据项开关-(0:关;1:开) 在员工收到的工资条上,隐藏数值为空(或数值为0)的薪资项
		gztsz.setXsxzx("");//显示薪资项(数组)
		gztsz.setIsYhjf(0);//阅后即焚开关-(0:关;1:开) 在员工查看工资条一定时间之后,将变为不可查阅
		gztsz.setYhjfdw(1);//阅后即焚单位 1:分钟;2:小时;3:天
		gztsz.setYhjfTime("");//阅后即焚时间(分钟)
		gztsz.setQmqr(0);//签名确认-(0:关;1:开) 开启后,员工确认工资条时需要手写签名
		gztsz.setIsYgfk(0);//员工反馈开关-(0:关;1:开) 允许员工在工资条上反馈工资问题
		gztsz.setXzzid(id);//薪资组id
		gztsz.setQyid(userBean.getOrgCode());//企业id
		xcglassogztszmapper.insertxcglassogztsz(gztsz);
		int gztszid = gztsz.getId();
		
		if(xscgztszid > 0) {
			xcglassogztztmapper.deletexcglassogztzt(xscgztszid);//
		}
		
		List<PayrollExceptionDto> payrolllist = xcgladminxzzmapper.PayrollException(userBean.getOrgCode(), id, sxrq);
		List<XcglAssoGztzt> gztzs = new ArrayList<XcglAssoGztzt>();
		for(PayrollExceptionDto ped:payrolllist) {
			XcglAssoGztzt gztz = XcglAssoGztzt.builder().build();
			gztz.setUserid(ped.getUserid());//用户ID
			gztz.setXzyf(ped.getXzyf());//薪资月
			gztz.setFsType(0);//发送状态 0:未发送 1:已发送
			gztz.setCkType(0);//查看状态 0:未 1:已
			gztz.setQrType(0);//确认状态 0:未 1:已
			gztz.setFkyj("");//反馈意见
			gztz.setYhqm("");//用户签名
			gztz.setQyid(userBean.getOrgCode());
			gztz.setGztszid(gztszid);
			gztzs.add(gztz);
		}
		
		if(gztzs.size()>0) {
			xcglassogztztmapper.insertxcglassogztztList(gztzs);
		}
		
		
		return new ResponseResult().success("成功", gztzs);
	}

	
	@PostMapping(value = "/paysliplist")
	@ApiOperation(value = "工资条数据", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult Paysliplist(@CurrentUser UserBean userBean,@RequestBody InspersonnelDto inspers) {
		List<PayslipListDto> paydan = new ArrayList<PayslipListDto>();
		List<XcglAssoGztsz> gztzlist = new LambdaQueryChainWrapper<XcglAssoGztsz>(xcglassogztszmapper).eq(XcglAssoGztsz::getQyid, userBean.getOrgCode()).eq(XcglAssoGztsz::getGztyf, inspers.getTitle()).list();
		for(XcglAssoGztsz dzts:gztzlist) {
			PayslipListDto pagz = new PayslipListDto();
			pagz.setGztszid(dzts.getId());
			pagz.setGztname(dzts.getMbmc());
			pagz.setGztyf(dzts.getGztyf());
			pagz.setXzzid(dzts.getXzzid());
			List<XcglAssoGztzt> zrs = new LambdaQueryChainWrapper<XcglAssoGztzt>(xcglassogztztmapper).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode())
					.eq(XcglAssoGztzt::getGztszid, dzts.getId()).list();
			if(zrs.size() > 0) {
				pagz.setUsertotal(zrs.size());//
			}else {
				pagz.setUsertotal(0);//
			}
			
			List<XcglAssoGztzt> yfs = new LambdaQueryChainWrapper<XcglAssoGztzt>(xcglassogztztmapper).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode())
					.eq(XcglAssoGztzt::getGztszid, dzts.getId()).eq(XcglAssoGztzt::getFsType,1).list();
			if(yfs.size() > 0) {
				pagz.setYfsnum(yfs.size());
			}else {
				pagz.setYfsnum(0);
			}
			
			List<XcglAssoGztzt> yck = new LambdaQueryChainWrapper<XcglAssoGztzt>(xcglassogztztmapper).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode())
					.eq(XcglAssoGztzt::getGztszid, dzts.getId()).eq(XcglAssoGztzt::getCkType,1).list();
			if(yck.size()>0) {
				pagz.setYckrs(yck.size());
			}else {
				pagz.setYckrs(0);
			}
			
			List<XcglAssoGztzt> yqr = new LambdaQueryChainWrapper<XcglAssoGztzt>(xcglassogztztmapper).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode())
					.eq(XcglAssoGztzt::getGztszid, dzts.getId()).eq(XcglAssoGztzt::getQrType,1).list();
			if(yqr.size()>0) {
				pagz.setYqrrs(yqr.size());
			}else {
				pagz.setYqrrs(0);
			}
			
			paydan.add(pagz);
		}
		
		return new ResponseResult().success("成功", paydan);
	}
	
	@GetMapping(value = "/details/{id}")
	@ApiOperation(value = "工资条明细", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult PayslipDetails(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		List<PayslipDetailsDto> paydetlist = xcglassogztztmapper.PayslipDetails(id,userBean.getOrgCode());
		return new ResponseResult().success("成功", paydetlist);
	}
	
	
	/**
	 * 	删除工资条
	 */
	@DeleteMapping(value = "/deletepayslip/{id}")
	@ApiOperation(value = "删除工资条", httpMethod = "DELETE", notes = "接口发布说明")
	public ResponseResult Deletepayslip(@PathVariable Integer id) {
		
		XcglAssoGztsz.builder().build().deleteById(id);
		xcglassogztztmapper.deletexcglassogztzt(id);//
		
		return new ResponseResult().success("删除成功", id);
	}
	
	@GetMapping(value = "/payslipsetti/{id}")
	@ApiOperation(value = "获取工资条设置", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult PayslipSetti(@CurrentUser UserBean userBean,@PathVariable Integer id) {  
		XcglAssoGztsz gztz = new LambdaQueryChainWrapper<XcglAssoGztsz>(xcglassogztszmapper).eq(XcglAssoGztsz::getQyid, userBean.getOrgCode()).eq(XcglAssoGztsz::getId, id).one(); 
		return new ResponseResult().success("成功", gztz);
	}
	
	
	
	@PutMapping(value = "/modifypayslip")
	@ApiOperation(value = "修改工资条", httpMethod = "PUT", notes = "接口发布说明")
	public ResponseResult ModifyPayslip(@CurrentUser UserBean userBean, @RequestBody ModifyPayslipDto modifypay) {
		
		XcglAssoGztsz gztz = XcglAssoGztsz.builder().build();
		gztz.setId(modifypay.getId());
//		gztz.setMbmc(mbmc);//模板名称
		if(modifypay.getSwitchs()) {
			gztz.setIsWxts(1);//温馨提示开关
			gztz.setWxtslr(modifypay.getTip());//温馨提示内容
		}else {
			gztz.setIsWxts(0);//温馨提示开关
			gztz.setWxtslr("");//温馨提示内容
		}
		gztz.setTop(modifypay.getSfje());//实发金额(头部显示)
		if(modifypay.getYc()) {
			gztz.setIsYcksj(1);//隐藏空数据项开关
		}else {
			gztz.setIsYcksj(0);//隐藏空数据项开关
		}
//		gztz.setXsxzx(xsxzx);//显示薪资项(数组)
		if(modifypay.getYhjf()) {
			gztz.setIsYhjf(1);//阅后即焚开关 在员工查看工资条一定时间之后,将变为不可查阅
			gztz.setYhjfTime(modifypay.getJfinp());//阅后即焚时间(分钟) 
			gztz.setYhjfdw(modifypay.getJfsel());//阅后即焚单位 1:分钟;2:小时;3:天
		}else {
			gztz.setIsYhjf(0);//阅后即焚开关 在员工查看工资条一定时间之后,将变为不可查阅
			gztz.setYhjfTime("");//阅后即焚时间(分钟) 
			gztz.setYhjfdw(1);//阅后即焚单位 1:分钟;2:小时;3:天
		}
		if(modifypay.getAutograph()) {
			gztz.setQmqr(1);//签名确认 开启后,员工确认工资条时需要手写签名
		}else{
			gztz.setQmqr(0);//签名确认 开启后,员工确认工资条时需要手写签名
		}
		
		if(modifypay.getFeedback()) {
			gztz.setIsYgfk(1);//员工反馈开关 允许员工在工资条上反馈工资问题
		}else {
			gztz.setIsYgfk(0);//员工反馈开关 允许员工在工资条上反馈工资问题
		}
		gztz.updateById();
		
		return new ResponseResult().success("成功", gztz);
	}
	
	/****************************************************************************/
	/****************************************************************************/

	/**
	 * 	新增或编辑
	 */
	@PostMapping(value = "/paysave")
	@ApiOperation(value = "添加/修改薪资组", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult paysave(@CurrentUser UserBean userBean,@RequestBody XcglAdminXzz obj) { 
		obj.setAdduserid(userBean.getEmpNum());// 员工工号
		obj.setQyid(userBean.getOrgCode());// 企业编码
		obj.setAddtime(new Date().getTime());// 添加时间 
		obj.insertOrUpdate();
		return new ResponseResult().success("添加/修改成功", obj);
	}

	// 上个月
	public static String getfirstlast() {
		String firstnext;
		Calendar c1 = Calendar.getInstance();
		c1.add(Calendar.MONTH, -1);
		c1.set(Calendar.DAY_OF_MONTH, 1);
		firstnext = mat.format(c1.getTime());
		return firstnext;
	}

	public static String getlastlast() {
		String lastnext;
		Calendar ca1 = Calendar.getInstance();
		ca1.add(Calendar.MONTH, -1);
		ca1.set(Calendar.DAY_OF_MONTH, ca1.getActualMaximum(Calendar.DAY_OF_MONTH));
		lastnext = mat.format(ca1.getTime());
		return lastnext;
	}

	// 本月
	public static String getfirstnow() {
		String firstnow;
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH, 1);
		firstnow = mat.format(c.getTime());
		return firstnow;
	}

	public static String getlastnow() {
		String lastnow;
		Calendar ca = Calendar.getInstance();
		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
		lastnow = mat.format(ca.getTime());
		return lastnow;
	}

	// 下个月
	public static String getfirstnext() {
		String firstnext;
		Calendar c1 = Calendar.getInstance();
		c1.add(Calendar.MONTH, 1);
		c1.set(Calendar.DAY_OF_MONTH, 1);
		firstnext = mat.format(c1.getTime());
		return firstnext;
	}

	public static String getlastnext() {
		String lastnext;
		Calendar ca1 = Calendar.getInstance();
		ca1.add(Calendar.MONTH, 1);
		ca1.set(Calendar.DAY_OF_MONTH, ca1.getActualMaximum(Calendar.DAY_OF_MONTH));
		lastnext = mat.format(ca1.getTime());
		return lastnext;
	}
}