package cn.timer.api.controller.xcgl;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.annotation.Resource;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import cn.timer.api.dto.xcgl.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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 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 cn.hutool.json.JSONObject;
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.kqmk.KqglAssoDkjl;
import cn.timer.api.bean.kqmk.KqglAssoMonthPunchSummary;
import cn.timer.api.bean.kqmk.KqglAssoRelationSummary;
import cn.timer.api.bean.sbgjj.SbgjjAssoDetailed;
import cn.timer.api.bean.sbgjj.SbgjjAssoYjzd;
import cn.timer.api.bean.xcgl.XcglAdminXzz;
import cn.timer.api.bean.xcgl.XcglAssoBszqsz;
import cn.timer.api.bean.xcgl.XcglAssoGsjsmx;
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.XcglAssoTaxFormula;
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.config.validation.ValidList;
import cn.timer.api.controller.kqgl.ClockInTool;
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.kqmk.KqglAssoDkjlMapper;
import cn.timer.api.dao.kqmk.KqglAssoMonthPunchSummaryMapper;
import cn.timer.api.dao.kqmk.KqglAssoRelationSummaryMapper;
import cn.timer.api.dao.sbgjj.SbgjjAssoDetailedMapper;
import cn.timer.api.dao.sbgjj.SbgjjAssoYjzdMapper;
import cn.timer.api.dao.xcgl.XcglAdminXzzMapper;
import cn.timer.api.dao.xcgl.XcglAssoGsjsmxMapper;
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.kqmk.CalculatingCompensationDto;
import cn.timer.api.dto.sbgjj.InspersonnelDto;
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 {
	
	@Value("${config-8timer.prescription}")
	public double prescription; // 一天工作小时数
	
	// 薪酬管理-定薪
	@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;
	
	
	//考勤组
	@Resource
	private AttendanceGroupMapper attendancegroupservice;
	//打卡明细表
	@Resource
	private PunchCardDetailsMapper punchcarddetailsservice;
	//打卡记录
	@Resource
	private PunchRecordMapper punchrecordservice;	
	@Resource
	private SpecialDateMapper specialdateservice;
	//考勤周排班
	@Resource
	private AttendanceWeeklySchMapper attendanceweeklyschservice;
	//排班明细
	@Resource
	private ScheduleMapper scheduleservice;
	//专项附加扣除
	@Resource
	private XcglAssoZxfjkcMapper xcglassozxfjkcmapper;
	
	//工资条组内成员状态
	@Resource
	private XcglAssoGztztMapper xcglassogztztmapper;
	//工资条组-设置
	@Resource
	private XcglAssoGztszMapper xcglassogztszmapper;
	
	static SimpleDateFormat mat = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * 获取薪资组信息
	 */
	@GetMapping(value = "/paylist/{yemon}")
	@ApiOperation(value = "获取薪资组信息", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult selectpaylist(@CurrentUser UserBean userBean,@PathVariable String yemon) {
		List<XcglAdminXzz> xcgladminxzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).eq(XcglAdminXzz::getMonthtime, yemon).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());// 下
		
		Calendar lastm = Calendar.getInstance();
		lastm.setTime(SalaryTool.strToDateLong(paygro.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
		String lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
		
		String thismonth = paygro.getXzyf();// 本
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(SalaryTool.strToDateLong(paygro.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		calendar.set(Calendar.MONTH, calendar.get(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 = SalaryTool.getfirstlastTwo(paygro.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastlastTwo(paygro.getXzyf() + "-01 00:00:00");
			} 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 = SalaryTool.getfirstnowTwo(paygro.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastnowTwo(paygro.getXzyf() + "-01 00:00:00");
			} 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());//薪资月份
		xcglxzz.setXzyf(payrollcycle.substring(0, 7));//开始);//算薪月份
		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);}
				zzx.setDygk(0.0);//公式变量值1
				zzx.setDegk(0.0);//公式变量值2
				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);}
						zzx.setDygk(0.0);//公式变量值1
						zzx.setDegk(0.0);//公式变量值2
						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++) {
						XcglAssoXcjsgz xzxj = xcglassoxcjsgzmapper.QuerySalaryRules(fixed[f]);
						XcglAssoJsgzzx zzx = XcglAssoJsgzzx.builder().build();
						zzx.setSalaryitem(fixed[f]);//薪资项
						zzx.setYhmbzd(fixed[f]);//银行模板项 需与银行一一对应
//						XcglAssoXzdazdy daz = xcglassoxzdazdymapper.SalaryFixedWages(fixed[f]);
						if(xzxj != null) {//系统有规则
							zzx.setRule(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//公式格式 系统提供/自定义公式
							zzx.setRulestate(xzxj.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							zzx.setDygk(xzxj.getDygk() == null ? 0 : xzxj.getDygk());//公式变量值1 
							zzx.setDegk(xzxj.getDegk() == null ? 0 : xzxj.getDegk());//公式变量值2
							XcglAssoOption opt = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getOptionname, fixed[f]).one();
							zzx.setOptionid(opt.getId());
						}else {
							zzx.setRule("从薪资档案-"+fixed[f]+"自动提取数据");//规则********************************
							zzx.setGsid(0);//公式id  0:未关联规则
							zzx.setGsgs("从薪资档案-"+fixed[f]+"自动提取数据");//公式格式 系统提供/自定义公式
							zzx.setRulestate(1);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							zzx.setDygk(0.0);//公式变量值1
							zzx.setDegk(0.0);//公式变量值2
							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().replace("{{", "").replace("}}", ""));//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//公式格式 系统提供/自定义公式
							zzx.setRulestate(xzxj.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							
							zzx.setDygk(xzxj.getDygk() == null ? 0 : xzxj.getDygk());//公式变量值1 
							zzx.setDegk(xzxj.getDegk() == null ? 0 : xzxj.getDegk());//公式变量值2
						}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:每月自动导入]
							zzx.setDygk(0.0);//公式变量值1
							zzx.setDegk(0.0);//公式变量值2
						}
						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);
						zzx.setDygk(0.0);//公式变量值1
						zzx.setDegk(0.0);//公式变量值2
						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().replace("{{", "").replace("}}", ""));//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//公式格式 系统提供/自定义公式
							zzx.setRulestate(xzxj.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							
							zzx.setDygk(xzxj.getDygk() == null ? 0 : xzxj.getDygk());//公式变量值1 
							zzx.setDegk(xzxj.getDegk() == null ? 0 : xzxj.getDegk());//公式变量值2
						}else {
							zzx.setRule("每月手动导入");//规则********************************
							zzx.setGsid(0);//公式id  0:未关联规则
							zzx.setGsgs("每月手动导入");//公式格式 系统提供/自定义公式
							zzx.setRulestate(4);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							zzx.setDygk(0.0);//公式变量值1
							zzx.setDegk(0.0);//公式变量值2
						}
						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);
						zzx.setDygk(0.0);//公式变量值1
						zzx.setDegk(0.0);//公式变量值2
						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]);//银行模板项 需与银行一一对应
						
						if(xzxj != null) {
							zzx.setRule(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//规则********************************
							zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
							zzx.setGsgs(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//公式格式 系统提供/自定义公式
							zzx.setRulestate(xzxj.getRulestate());//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							
							zzx.setDygk(xzxj.getDygk() == null ? 0 : xzxj.getDygk());//公式变量值1 
							zzx.setDegk(xzxj.getDegk() == null ? 0 : xzxj.getDegk());//公式变量值2
						}else {
							zzx.setRule("每月手动导入");//规则********************************
							zzx.setGsid(0);//公式id  0:未关联规则
							zzx.setGsgs("每月手动导入");//公式格式 系统提供/自定义公式
							zzx.setRulestate(4);//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
							zzx.setDygk(0.0);//公式变量值1
							zzx.setDegk(0.0);//公式变量值2
						}
						
						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());
				
				zzx.setDygk(zxs.getDygk());//公式变量值1  
				zzx.setDegk(zxs.getDegk());//公式变量值2
				
				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(yzxs.getOptionid());
						
						zzx.setDygk(yzxs.getDygk());//公式变量值1
						zzx.setDegk(yzxs.getDegk());//公式变量值2
						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);
	}
	
	/**
	 * @param userBean
	 * @param modifysalaryruledto
	 * @return
	 */
	@PostMapping(value = "/modifysalaryrule")
	@ApiOperation(value = "修改薪资规则", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Modifysalaryrule(@CurrentUser UserBean userBean,@RequestBody ModifysalaryruleDto modifysalaryruledto) {
		
		XcglAssoXcjsgz xcjsgz = XcglAssoXcjsgz.builder().id(modifysalaryruledto.getXcjsgzid()).build().selectById();
		//11:应发工资   13:实发工资
		if(modifysalaryruledto.getXcjsgzid().equals(11) || modifysalaryruledto.getXcjsgzid().equals(13)) {
			if(!xcjsgz.getGsxs().equals(modifysalaryruledto.getFormula())) {
				XcglAssoJsgzzx.builder().gsid(modifysalaryruledto.getXcjsgzid()).gsgs(modifysalaryruledto.getFormula())
					.rule(modifysalaryruledto.getFormula()).rulestate(3).id(modifysalaryruledto.getJsgzzxid()).build().updateById();
			}else {
				XcglAssoJsgzzx.builder().gsid(modifysalaryruledto.getXcjsgzid()).gsgs(modifysalaryruledto.getFormula())
				.rule(modifysalaryruledto.getFormula()).rulestate(xcjsgz.getRulestate()).id(modifysalaryruledto.getJsgzzxid()).build().updateById();
			}
		}else {
			XcglAssoJsgzzx.builder().gsid(modifysalaryruledto.getXcjsgzid()).gsgs(modifysalaryruledto.getFormula())
					.dygk(modifysalaryruledto.getDygk()).degk(modifysalaryruledto.getDegk())
					.rule(modifysalaryruledto.getFormula()).rulestate(xcjsgz.getRulestate())
					.id(modifysalaryruledto.getJsgzzxid()).build().updateById();
		}
		
		return ResultUtil.success("操作成功!");
	}
	
	/**
	 * 弹出薪资规则
	 * @param userBean
	 * @param id 薪资选项id
	 * @return
	 */
	@GetMapping(value="/popupsalaryrule/{id}")
	@ApiOperation(value = "弹出薪资规则", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> Popupsalaryrule(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		
		List<XcglAssoXcjsgz> gzgs = XcglAssoXcjsgz.builder().build().selectList(new QueryWrapper<XcglAssoXcjsgz>().lambda().eq(XcglAssoXcjsgz::getOptionid, id));
		
		return ResultUtil.data(gzgs,"操作成功!");
	}
	
	
	
	/**
	 * 	删除薪资组  ***********
	 */
	@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(SalaryTool.strToDateLong(paygro.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
		String lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
		
		String thismonth = paygro.getXzyf();// 本
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(SalaryTool.strToDateLong(paygro.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		calendar.set(Calendar.MONTH, calendar.get(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 = SalaryTool.getfirstlastTwo(paygro.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastlastTwo(paygro.getXzyf() + "-01 00:00:00");
			} 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 = SalaryTool.getfirstnowTwo(paygro.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastnowTwo(paygro.getXzyf() + "-01 00:00:00");
			} 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.setXzyf(payrollcycle.substring(0, 7));//算薪月份
		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 Result<Object> FixedSalarStaff(@CurrentUser UserBean userBean,@RequestBody SearchSalariedPeopleDto search) {
		search.setOrgcode(userBean.getOrgCode());
		Page<FixedSalaryStaffDto> page = new Page<FixedSalaryStaffDto>(
				search.getCurrentPage() == null ? 1 : search.getCurrentPage(),
				search.getTotalPage() == null ? 10 : search.getTotalPage());

		long total = xcglassoxzdazdymapper.selectFixedSalaryStaffCount(search);
		List<FixedSalaryStaffDto> dxrylist = xcglassoxzdazdymapper.selectFixedSalaryStaff(search);
		page.setTotal(total);
		return ResultUtil.data(page, dxrylist, "获取自定义薪资组表头信息");
	}


	/**
	 * 	查询定薪人员+模糊查询*******
	 */
	@PostMapping(value = "/fixedstaffAll")
	@ApiOperation(value = "查询定薪人员 不分页", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> FixedSalarStaffAll(@CurrentUser UserBean userBean,@RequestBody SearchSalariedPeopleDto search) {
		search.setOrgcode(userBean.getOrgCode());
		List<FixedSalaryStaffDto> dxrylist = xcglassoxzdazdymapper.selectFixedSalaryStaffAll(search);
		return ResultUtil.data(dxrylist, "获取自定义薪资组表头信息");
	}
	
	/**
	 * 	核对算薪人员及薪资档案*******
	 */
	@PostMapping(value = "/check_staff_file")
	@ApiOperation(value = "核对算薪人员及薪资档案", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult Check_staff_file(@CurrentUser UserBean userBean,@RequestBody CheckSalaryStaffDto checksalary) {
		
		checksalary.setOrgcode(userBean.getOrgCode());
		
		List<FixedSalaryStaffDto> dxrylist = xcglassoxzdazdymapper.selectPaygroupStaff(checksalary);//
		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() != null) {// 修改
					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);

		// 同时删除已添加到薪资组(未锁定的组)中的薪资项
		xcglassojsgzzxmapper.deleteByxzdazdyid(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.getUserid()));//用户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();
		
		List<XcglAssoXzdazdy> xzs = XcglAssoXzdazdy.builder().build().selectList(new QueryWrapper<XcglAssoXzdazdy>().lambda().eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode()));
		for(XcglAssoXzdazdy xz : xzs) {
			XcglAssoXzdaz xzdaz = XcglAssoXzdaz.builder().build();
			xzdaz.setXzdazdyid(xz.getId());//薪资档案自定义id
			xzdaz.setRsz("0");//输入值
			xzdaz.setXzdadxid(zdyid);//薪资档案-定薪id
			xzdaz.insert();
		}
		
		if(cus.length>0){
			for(int p=0;p<cus.length;p++){
				XcglAssoXzdaz.builder().build().delete(new QueryWrapper<XcglAssoXzdaz>().lambda().eq(XcglAssoXzdaz::getXzdazdyid, cus[p].getId()).eq(XcglAssoXzdaz::getXzdadxid, zdyid));
				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);
	}
	
	/**
	 *	调薪
	 */
	@SneakyThrows(Exception.class)
	@PostMapping(value = "/payensaad")
	@ApiOperation(value = "调薪", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult EnterSalaryAdjustment(@CurrentUser UserBean userBean,@RequestBody FixedsalaryDto fixedsalarydto) {
		// 当前日期
		String curDate = DateUtil.getStringFormat(new Date().getTime());
		// 未生效的调薪记录同一天只能有一条
		XcglAssoXzdadx tmp = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
				.eq(XcglAssoXzdadx::getUserid, Integer.valueOf(fixedsalarydto.getUserid()))
				.eq(XcglAssoXzdadx::getTxzt, 2)
				.eq(XcglAssoXzdadx::getSxrq, fixedsalarydto.getSxrq())
				.one();
		if (!Objects.isNull(tmp)) {
			return new ResponseResult().fail("调薪成功失败, 已存在生效日期" + fixedsalarydto.getSxrq() + "的待生效记录, 请到调薪记录页面查看!");
		}
		int txzt = 2;
		if (DateUtil.getFormat(fixedsalarydto.getSxrq()) <= DateUtil.getFormat(curDate)) {
			// 生效日期在当天或之前的, 立即生效, 原使用中的记录变成历史记录
			XcglAssoXzdadx xzds = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
					.eq(XcglAssoXzdadx::getUserid, Integer.valueOf(fixedsalarydto.getUserid()))
					.eq(XcglAssoXzdadx::getTxzt, 0)
					.one();
			if(xzds != null) {
				XcglAssoXzdadx txrz = XcglAssoXzdadx.builder().build();
				txrz.setTxzt(1);//0:使用中;1:历史, 2: 未生效
				txrz.setId(xzds.getId());
				txrz.updateById();
			}
			txzt = 0;
		}
		XcglAssoXzdadx xzdadx = XcglAssoXzdadx.builder().build();
		xzdadx.setUserid(Integer.valueOf(fixedsalarydto.getUserid()));//用户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(txzt);
		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 = "/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);
	}

	/**
	 *	调薪记录编辑保存
	 */
	@SneakyThrows(Exception.class)
	@PostMapping(value = "/saveTXjlEdit")
	@ApiOperation(value = "调薪", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult saveTXjlEdit(@CurrentUser UserBean userBean,@RequestBody FixedsalaryDto fixedsalarydto) {
		// 当前日期
		String curDate = DateUtil.getStringFormat(new Date().getTime());
		// 未生效的调薪记录同一天只能有一条
		XcglAssoXzdadx tmp = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
				.eq(XcglAssoXzdadx::getUserid, Integer.valueOf(fixedsalarydto.getUserid()))
				.eq(XcglAssoXzdadx::getTxzt, 2)
				.eq(XcglAssoXzdadx::getSxrq, fixedsalarydto.getSxrq())
				.one();
		if (!Objects.isNull(tmp) && !tmp.getId().equals(fixedsalarydto.getId())) {
			return new ResponseResult().fail("调薪成功失败, 已存在生效日期" + fixedsalarydto.getSxrq() + "的待生效记录, 请到调薪记录页面查看!");
		}
		int txzt = 2;
		if (DateUtil.getFormat(fixedsalarydto.getSxrq()) <= DateUtil.getFormat(curDate)) {
			// 生效日期在当天或之前的, 立即生效, 原使用中的记录变成历史记录
			XcglAssoXzdadx xzds = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
					.eq(XcglAssoXzdadx::getUserid, Integer.valueOf(fixedsalarydto.getUserid()))
					.eq(XcglAssoXzdadx::getTxzt, 0)
					.one();
			if(xzds != null) {
				XcglAssoXzdadx txrz = XcglAssoXzdadx.builder().build();
				txrz.setTxzt(1);//0:使用中;1:历史, 2: 未生效
				txrz.setId(xzds.getId());
				txrz.updateById();
			}
			txzt = 0;
		}
		XcglAssoXzdadx xzdadx = new XcglAssoXzdadx();
		xzdadx.setId(fixedsalarydto.getId());
		xzdadx.setSxrq(fixedsalarydto.getSxrq());//生效日期
		xzdadx.setAddtime(new Date().getTime());
		xzdadx.setXgyhid(userBean.getEmpNum());//修改用户id
		xzdadx.setRemarks(fixedsalarydto.getRemarks());
		xzdadx.setTxzt(txzt);
		xcglassoxzdadxmapper.updateById(xzdadx);

		CustomDto[] cus = fixedsalarydto.getCus();
		if(cus.length > 0){
			for(int p = 0; p < cus.length; p++){
				XcglAssoXzdaz xzdaz = new XcglAssoXzdaz();
				xzdaz.setId(cus[p].getId());
				xzdaz.setRsz(cus[p].getVal());//输入值

				xcglassoxzdazmapper.updateById(xzdaz);
			}
		}
		return new ResponseResult().success("保存成功");
	}
	
	/**
	 *	删除调薪记录
	 */
	@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);
	}
	
	/**payrulegroupitem
	 *	获取薪资选项
	 */
	@PostMapping(value = "/salaryoptions")
	@ApiOperation(value = "获取薪资选项", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult SalaryOoptions(@CurrentUser UserBean userBean, @RequestBody SalaryoptionsDto dto) {
		List<XcglAssoOptionDto> itemlist = xcglsalaryitemmapper.selectxcglsalaryitemList(dto);
		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().replace("{{", "").replace("}}", ""));//规则********************************
					zzx.setGsid(xzxj.getId());//公式id  0:未关联规则
					zzx.setGsgs(xzxj.getGsxs().replace("{{", "").replace("}}", ""));//公式格式 系统提供/自定义公式
					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:每月自动导入]
						XcglAssoXzdazdy xzd = XcglAssoXzdazdy.builder().build().selectOne(new QueryWrapper<XcglAssoXzdazdy>().lambda().eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode())
								.eq(XcglAssoXzdazdy::getZdmc, term[a].getOptname()));
						int xzdazdyid = 0;
						if(xzd != null) {
							xzdazdyid = xzd.getId();
						}
						zzx.setXzdazdyid(xzdazdyid);
					}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:每月自动导入]
						
						zzx.setXzdazdyid(0);
					}
				}
				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());
				if(xzxj != null) {
					zzx.setDygk(xzxj.getDygk() == null ? 0 : xzxj.getDygk());
					zzx.setDegk(xzxj.getDegk() == null ? 0 : xzxj.getDegk());
				}else {
					zzx.setDygk(0.0);
					zzx.setDegk(0.0);
				}
				
				gzzxlist.add(zzx);
			}
		}
		if(gzzxlist.size() > 0) {
			xcglassojsgzzxmapper.insertxcglassojsgzzxListTwo(gzzxlist);
		}
		return new ResponseResult().success("创建薪资组成功", gzzxlist);
	}
	
	/**
	 *	创建自定义计薪规则组项
	 */
	@PostMapping(value = "/payCustomitem")
	@ApiOperation(value = "创建自定义计薪规则组项", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult PayCustomRuleGroupItem(@CurrentUser UserBean userBean,@RequestBody PayCustomZDYDto payc) {
		
		XcglAssoJsgzzx sfcz = XcglAssoJsgzzx.builder().build().selectOne(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, payc.getGid()).eq(XcglAssoJsgzzx::getSalaryitem, payc.getName()));
		if(sfcz == null) {
			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);
			zzx.setIsCustom(1);//是否自定义项(0:否;1:是)
			xcglassojsgzzxmapper.jsgzzxinsert(zzx);
			return new ResponseResult().success("创建薪资组成功", zzx);
		}else {
			return new ResponseResult().error(payc.getName()+"重复添加");
		}
	}
	
	@PostMapping(value = "/duplicatedetection")
	@ApiOperation(value = "检测重复", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult DuplicateDetection(@CurrentUser UserBean userBean,@RequestBody PayCustomZDYDto payc) {
		
		XcglAssoXzdazdy xzd = XcglAssoXzdazdy.builder().build().selectOne(new QueryWrapper<XcglAssoXzdazdy>().lambda().eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode())
				.eq(XcglAssoXzdazdy::getZdmc, payc.getName()));
		if(xzd != null) {
			return new ResponseResult().error(payc.getName()+"重复添加");
		}else {
			return new ResponseResult().success("", null);
		}
		
	}
	
	
	/**
	 *	获取薪资项公式
	 */
	@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 = "/monthly_manual_import/{id}")
	@ApiOperation(value = "每月手动导入所需导出的表头数据", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> MonthlyManualImport(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		
		FloatingDataDto data = new FloatingDataDto();
		//rulestate:规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		List<XcglAssoJsgzzx> jsgzzx = XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, id)
				.eq(XcglAssoJsgzzx::getRulestate, 4));
		data.setJsgzzx(jsgzzx);
		
		List<UserPersonnelDto> sonn = xcglassoxzbmapper.UserPersonnel(id, userBean.getOrgCode());
		data.setUsers(sonn);
		
		return ResultUtil.data(data);
	}
	
	/**
	 *	导入浮动数据薪资
	 */
	@PostMapping(value = "/payimport")
	@ApiOperation(value = "导入薪资", httpMethod = "POST", notes = "接口发布说明")
	public Result<ImportDescriptionDto> ImportSalaryData(@CurrentUser UserBean userBean,@RequestBody ImportSalarySetDto impor) {
		int toinsert = 0;//新增
		int toupdate = 0;//更新
		int failure = 0;//失败
		List<Map<String, String>> reasons = Lists.newArrayList();
		ImportSalaryDto[] ims = impor.getImsalary();//
		if (ims.length > 0) {
			for( int p=0; p < ims.length; p++) {
				Map<String, String> map = Maps.newHashMap();
				String name = ims[0].getUsername();
				try {
					//用户工号来匹配入库
					XcglAssoXzury xzuryone = new LambdaQueryChainWrapper<XcglAssoXzury>(xcglassoxzurymapper).eq(XcglAssoXzury::getQyid, userBean.getOrgCode())
							.eq(XcglAssoXzury::getXzzid, impor.getGid()).eq(XcglAssoXzury::getUserid, ims[p].getUsernum()).one();
					if(xzuryone != null) {
						XcglAssoXzb xzb = XcglAssoXzb.builder().build();
						xzb.setUserid(xzuryone.getUserid());//
						xzb.setXzyf(impor.getSxrq());//
						xzb.setXzxid(ims[p].getJsgzzx());//
						xzb.setXzxjg(ims[p].getSrz());//
						xzb.setQyid(userBean.getOrgCode());
						xcglassoxzbmapper.ModifyImportedSalary(xzb);
						toupdate++;
					}
				} catch (Exception e) {
					failure++;
					map.put("name", name);
					map.put("msg", StringUtils.isBlank(e.getMessage()) ? "必填数据出现空值" : e.getMessage());
				} finally {
					reasons.add(map);
				}
			}
		}
		ImportDescriptionDto imds = new ImportDescriptionDto();
		imds.setSuccess(toinsert + toupdate);//成功
		imds.setToinsert(toinsert);
		imds.setToupdate(toupdate);//更新
		imds.setFailure(failure);//失败
		imds.setReasons(reasons);
		return ResultUtil.data(imds,"导入成功");
	}
	
	
	/**
	 *	导入薪资
	 * @throws ParseException 
	 */
	@PostMapping(value = "/paysalaryfile")
	@ApiOperation(value = "导入薪资", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> paySalaryfile(@CurrentUser UserBean userBean,@Validated @RequestBody ValidList<ImportSalaryfileDto> impor) {
		
		int toinsert = 0;//新增
		int toupdate = 0;//更新
		int failure = 0;//失败
		List<Map<String, String>> reasons = Lists.newArrayList();
		for(ImportSalaryfileDto file : impor) {
			String name = file.getEmpname();
			
			Map<String, String> map = Maps.newHashMap();
			
			try {
				YgglMainEmp emp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getName, file.getEmpname()).eq(YgglMainEmp::getPhone, file.getPhone())
						.eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()));
				if(emp != null) {
					
					if(ClockInTool.isLegalDate(file.getSxrq())) {
						
						//0:定薪  1:调薪
						if(file.getSfdx() == 0) {
							XcglAssoXzdadx xzdadx = XcglAssoXzdadx.builder().build();
							xzdadx.setUserid(emp.getEmpNum());//用户id
							xzdadx.setSxrq(file.getSxrq());//生效日期
							xzdadx.setAddtime(new Date().getTime());
							xzdadx.setRemarks("");
							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 = file.getCus();
							
							List<XcglAssoXzdazdy> xzs = XcglAssoXzdazdy.builder().build().selectList(new QueryWrapper<XcglAssoXzdazdy>().lambda().eq(XcglAssoXzdazdy::getQyid, userBean.getOrgCode()));
							for(XcglAssoXzdazdy xz : xzs) {
								XcglAssoXzdaz xzdaz = XcglAssoXzdaz.builder().build();
								xzdaz.setXzdazdyid(xz.getId());//薪资档案自定义id
								xzdaz.setRsz("0");//输入值
								xzdaz.setXzdadxid(zdyid);//薪资档案-定薪id
								xzdaz.insert();
							}
							
							if(cus.length>0){
								for(int p=0;p<cus.length;p++){
									XcglAssoXzdaz.builder().build().delete(new QueryWrapper<XcglAssoXzdaz>().lambda().eq(XcglAssoXzdaz::getXzdazdyid, cus[p].getId()).eq(XcglAssoXzdaz::getXzdadxid, zdyid));
									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);
							}
							toinsert++;
						}else {
							// 当前日期
							String curDate = DateUtil.getStringFormat(new Date().getTime());
							// 未生效的调薪记录同一天只能有一条
							XcglAssoXzdadx tmp = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
									.eq(XcglAssoXzdadx::getUserid, emp.getEmpNum())
									.eq(XcglAssoXzdadx::getTxzt, 2)
									.eq(XcglAssoXzdadx::getSxrq, file.getSxrq())
									.one();
							if (!Objects.isNull(tmp)) {
								return ResultUtil.error("调薪成功失败, 已存在生效日期" + file.getSxrq() + "的待生效记录, 请到调薪记录页面查看!");
							}
							int txzt = 2;
							if (DateUtil.getFormat(file.getSxrq()) <= DateUtil.getFormat(curDate)) {
								// 生效日期在当天或之前的, 立即生效, 原使用中的记录变成历史记录
								XcglAssoXzdadx xzds = new LambdaQueryChainWrapper<XcglAssoXzdadx>(xcglassoxzdadxmapper)
										.eq(XcglAssoXzdadx::getUserid, emp.getEmpNum())
										.eq(XcglAssoXzdadx::getTxzt, 0)
										.one();
								if(xzds != null) {
									XcglAssoXzdadx txrz = XcglAssoXzdadx.builder().build();
									txrz.setTxzt(1);//0:使用中;1:历史, 2: 未生效
									txrz.setId(xzds.getId());
									txrz.updateById();
								}
								txzt = 0;
							}
							XcglAssoXzdadx xzdadx = XcglAssoXzdadx.builder().build();
							xzdadx.setUserid(emp.getEmpNum());//用户id
							String sxrq = file.getSxrq().substring(0,5) + "20" + file.getSxrq().substring(5,7);
							if(sxrq.contains("/")) {
								xzdadx.setSxrq(SalaryTool.SlashDate(sxrq));//生效日期
							}else {
								xzdadx.setSxrq(file.getSxrq());//生效日期
							}
							xzdadx.setAddtime(new Date().getTime());
							xzdadx.setXgyhid(userBean.getEmpNum());//修改用户id
							xzdadx.setRemarks("");
							xzdadx.setQyid(userBean.getOrgCode());
							xzdadx.setTxzt(txzt);
							xcglassoxzdadxmapper.xzdadxinsert(xzdadx);
							int zdyid = xzdadx.getId();
							List<XcglAssoXzdaz> xzdazlist=new ArrayList<XcglAssoXzdaz>();
							CustomDto[] cus = file.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);
							}
							toinsert++;
						}
					
					}else {
						failure++;
						map.put("name", name);
						map.put("msg", "日期格式不对(必须是:YYYY-MM-dd)");
						reasons.add(map);
					}
				}else {
					failure++;
					map.put("name", name);
					map.put("msg", "该员工不存在");
					reasons.add(map);
				}
			}catch (Exception e) {
				failure++;
				map.put("name", name);
				map.put("msg", StringUtils.isBlank(e.getMessage()) ? "必填数据出现空值" : e.getMessage());
				reasons.add(map);
			}
		}
		
		ImportDescriptionDto imds = new ImportDescriptionDto();
		imds.setSuccess(toinsert + toupdate);//成功
		imds.setToinsert(toinsert);
		imds.setToupdate(toupdate);//更新
		imds.setFailure(failure);//失败
		imds.setReasons(reasons);
		
		return ResultUtil.data(imds,"成功");
	}
	
	
	@PostMapping(value = "/determinesalaryrules")
	@ApiOperation(value = "是否确定薪资规则", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> DetermineSalaryRules(@CurrentUser UserBean userBean,@RequestBody SalaryRulesDto salaryrulesdto) {
		XcglAdminXzz.builder().id(salaryrulesdto.getXzzid()).isXzgz(salaryrulesdto.getState()).build().updateById();
		return ResultUtil.success("操作成功!");
	}
	
	@PostMapping(value = "/locksalary")
	@ApiOperation(value = "是否锁定薪资", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> LockSalary(@CurrentUser UserBean userBean,@RequestBody SalaryRulesDto salaryrulesdto) {
		XcglAdminXzz.builder().id(salaryrulesdto.getXzzid()).isXzsd(salaryrulesdto.getState()).build().updateById();
		return ResultUtil.success("操作成功!");
	}
	
	
	/**
	 *	查看薪资
	 */
	@PostMapping(value = "/checksalary")
	@ApiOperation(value = "查看薪资", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult CheckSalary(@CurrentUser UserBean userBean, @RequestBody CheckSalaryStaffDto checksalary) {
		//计算完成 返回数据
		checksalary.setOrgcode(userBean.getOrgCode());
		List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(checksalary);
		return new ResponseResult().success("查看薪资成功", jswsj);
	}
	
	/**
	 *	获取计薪规则组项
	 */
	@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<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(id,userBean.getOrgCode());
		CheckSalaryStaffDto checksalary = new CheckSalaryStaffDto();
		checksalary.setPaygroupid(id);
		// checksalary.setXzyf(xzyf);
		checksalary.setOrgcode(userBean.getOrgCode());
		List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(checksalary);
		salfie.setComuser(jswsj);
		
		return new ResponseResult().success("获取计薪规则组项成功", salfie);
	}
	
	
	@Autowired
	private KqglAssoMonthPunchSummaryMapper kqglassomonthpunchsummarymapper;
	@Autowired
	private SbgjjAssoYjzdMapper sbgjjassoyjzdmapper;
	@Autowired
	private SbgjjAssoDetailedMapper sbgjjassodetailedmapper;
	/**
	 *	(保存,下一步)计算薪资  ()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
	 */
	@GetMapping(value = "/calculatesalary/{id}")
	@ApiOperation(value = "计算薪资", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult CalculateSalary(@CurrentUser UserBean userBean,@PathVariable Integer id) {
		int orgcode = userBean.getOrgCode();
		String xzyf = "";
		
		//typeid--1:计算   2:重新计算
		//已知薪资组id****
		//规则状态[0:系统自动提取;1:系统固定值;2:固定公式计算;3:自定义公式计算;4:每月自动导入]
		//计算薪资改变薪资组计算状态
		XcglAdminXzz yjs = XcglAdminXzz.builder().build();
		yjs.setCountstate(1);//计算状态 0:未计算;1:已计算
		yjs.setId(id);
		yjs.updateById();
		
		//薪资组信息
		XcglAdminXzz xzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getId, id).one();
//		sxrq = xzz.getXzyf();
		xzyf = xzz.getXzyf();
		//当前薪资组内人员
		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) {
				
				xcglassoxzbmapper.deleteByuserid(znr.getUserid(),id,xzyf);//删除已经计算的薪资
				
				//查询员工定薪数据
				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(xzyf);//薪资月
						xzb.setXzxid(cal.getId());//薪资项id
						xzb.setXzxjg(StringUtils.isBlank(cal.getRsz()) ? 0 : Double.valueOf(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(xzyf);//薪资月
						xzb.setXzxid(cal.getId());//薪资项id
						xzb.setXzxjg(0.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)
						.eq(XcglAssoJsgzzx::getType, 2).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;
							double vacation = 0;//假期
							int numover = 0;
							double workover = 0;//加班
							if(tablename.equals("yggl_main_emp")) {//员工管理
								QueryWrapper<YgglMainEmp> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("emp_num", znr.getUserid()).eq("org_code", userBean.getOrgCode());//select #{tablename} from yggl_main_emp where emp_num = ?
								list = ygglmainempmapper.selectMaps(queryWrapper);
							}else if(tablename.equals("kqgl_asso_month_punch_summary")) {
								QueryWrapper<KqglAssoMonthPunchSummary> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("num", znr.getUserid()).eq("org_code", userBean.getOrgCode()).eq("belong_year", xzyf.substring(0, 4)).eq("belong_month", Integer.valueOf(xzyf.substring(5, 7)));//select #{tablename} from yggl_main_emp where emp_num = ?
								list = kqglassomonthpunchsummarymapper.selectMaps(queryWrapper);
							}else if(tablename.equals("sbgjj_asso_yjzd")) {
								QueryWrapper<SbgjjAssoYjzd> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("user_num", znr.getUserid()).eq("qyid", userBean.getOrgCode()).eq("zymonth", xzyf);//select #{tablename} from yggl_main_emp where emp_num = ?
								list = sbgjjassoyjzdmapper.selectMaps(queryWrapper);
							}else if(tablename.equals("sbgjj_asso_detailed")) {//社保公积金
								QueryWrapper<SbgjjAssoDetailed> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("coverage_name", lbcx.getOptionname().substring(0, 2)).eq("user_id", znr.getUserid()).eq("org_code", userBean.getOrgCode()).eq("attribution_time", xzyf);//select #{tablename} from yggl_main_emp where emp_num = ?
								list = sbgjjassodetailedmapper.selectMaps(queryWrapper);
							}else if(tablename.equals("kqgl_asso_relation_summary")) {//假期(32~41)[请假的总小时数]、补卡次数15、工作日加班24、休息日加班25、节假日加班26
								if(lbcx.getId() == 32) { 
									HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 1, znr.getUserid()); 
									vacation = balance.getBalance();
								}
								if(lbcx.getId() == 33) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 2, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 34) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 3, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 35) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 4, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 36) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 5, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 37) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 6, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 38) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 7, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 39) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 8, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 40) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 9, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 41) { HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(orgcode, xzyf, 10, znr.getUserid()); vacation = balance.getBalance();}
								if(lbcx.getId() == 15) { HolidayInquiryDto num = xcglassoxzbmapper.NumberOvertime(orgcode, xzyf, znr.getUserid()); numover = num.getNum();}
								if(lbcx.getId() == 24) { HolidayInquiryDto worov = xcglassoxzbmapper.PeriodsOvertime(orgcode, xzyf, 1, znr.getUserid()); workover = worov.getBalance();}
								if(lbcx.getId() == 25) { HolidayInquiryDto worov = xcglassoxzbmapper.PeriodsOvertime(orgcode, xzyf, 2, znr.getUserid()); workover = worov.getBalance();}
								if(lbcx.getId() == 26) { HolidayInquiryDto worov = xcglassoxzbmapper.PeriodsOvertime(orgcode, xzyf, 3, znr.getUserid()); workover = worov.getBalance();}
							}else if(tablename.equals("xcgl_asso_gsjsmx")) {
								QueryWrapper<XcglAssoGsjsmx> queryWrapper = new QueryWrapper<>();
								queryWrapper.select(fieldname).eq("user_num", znr.getUserid()).eq("qyid", userBean.getOrgCode()).eq("salary_month", xzyf);//select #{tablename} from yggl_main_emp where emp_num = ?
								list = xcglassogsjsmxmapper.selectMaps(queryWrapper);
							}
							
					        String autacq = "";
					        if(list != null) {
					        	for(Map<String, Object> aut:list) {
					        		if(aut != null) {
					        			autacq = aut.toString().substring(aut.toString().indexOf("=")+1).replace("}", "");
					        		}
					        	}
					        }else {
					        	if(lbcx.getId() == 15) {
					        		autacq = String.valueOf(numover);
					        	}else if(lbcx.getId() == 24 || lbcx.getId() == 25 || lbcx.getId() == 26) {
					        		autacq = String.valueOf(workover);
					        	}else {
					        		autacq = String.valueOf(vacation);
					        	}
					        }
					        //处理结果
					        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(xzyf);//薪资月
							}
							xzb.setXzxid(xtzd.getId());//薪资项id
							xzb.setXzxjg(("").equals(autacq) ? 0.0 : Double.valueOf(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(xzyf);//薪资月
								}
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg(null);//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
							}else {
								//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(xzyf);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg(0.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 || xtzd.getIsCustom() == 1) {//说明阔以根据表查出结果
							XcglAssoOption lbcx = new LambdaQueryChainWrapper<XcglAssoOption>(xcglassooptionmapper).eq(XcglAssoOption::getId,xtzd.getOptionid()).one(); 
							if(lbcx != null && 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;
					        	
					        	//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(xzyf);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg(0.0);//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
					        	
							}else {
								//入[薪资表]
						        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
								xzb.setUserid(znr.getUserid());//用户id
								xzb.setXzyf(xzyf);//薪资月
								xzb.setXzxid(xtzd.getId());//薪资项id
								xzb.setXzxjg(0.0);//薪资项结果
								xzb.setQyid(userBean.getOrgCode());
								xcglassoxzbmapper.xzbinsert(xzb);
							}
						}
					}
				}
			}
			
			//计算完成 返回数据
//			jswsj = xcglassoxzbmapper.CalculationResults(id,userBean.getOrgCode());
			CheckSalaryStaffDto checksalary = new CheckSalaryStaffDto();
			checksalary.setPaygroupid(id);
			checksalary.setXzyf(xzyf);
			checksalary.setOrgcode(userBean.getOrgCode());
			jswsj = xcglassoxzbmapper.CalculationResults(checksalary);
			
			return new ResponseResult().success("计算完成", jswsj);
		}else {//该组无人
			return new ResponseResult().error("请先添加算薪人员");
		}
		
	}
	
	
	/**
	 *	 计算薪资!@#$%^&*()_+
	 * @param userBean
	 * @param calcomtiondto
	 * @return
	 * @throws ScriptException 
	 * @throws NumberFormatException 
	 */
	@PostMapping(value = "/salary_calculation")
	@ApiOperation(value = "计算薪资", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> SalaryCalculation(@CurrentUser UserBean userBean, @RequestBody CalculatingCompensationDto calcomtiondto) throws NumberFormatException, ScriptException {
		int orgcode = userBean.getOrgCode();
		String strY = new SimpleDateFormat("yyyy").format(new Date());
		ScriptEngine js = new ScriptEngineManager().getEngineByName("JavaScript");
		
		//查询出薪资组内成员
		List<XcglAssoXzury> paygrlist = XcglAssoXzury.builder().build().selectList(new QueryWrapper<XcglAssoXzury>().lambda().eq(XcglAssoXzury::getXzzid, calcomtiondto.getPay_group_id()));
		//查询出当前薪资组里所有列表头   计薪规则组项  固定数值
		//32:事假、33:调休、34:病假、35:年假、36:产假、37:陪产假、38:婚假、39:例假、40:丧假、41:哺乳假;
		List<XcglAssoJsgzzx> sjbt = xcglassojsgzzxmapper.SalaryRuleGroupItem(calcomtiondto.getPay_group_id());//XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id()));
		
		//薪资组信息
		XcglAdminXzz xzz = XcglAdminXzz.builder().id(calcomtiondto.getPay_group_id()).build().selectById();
		//算薪月周期
		String startcycle = xzz.getPayrollcycle().substring(0, 10);//开始
		String endcycle = xzz.getPayrollcycle().substring(11, 21);//结束
		//算薪月份
		String salary_month = xzz.getXzyf();//算薪月份
				
		//基本工资,岗位津贴,应出勤天数,实出勤天数,事假,病假
		double base_salary = 0;//底薪######
		double base_pay = 0;//基本工资
		
		double post_allowance = 0;//岗位津贴
		double attendance_days = 0;//应出勤天数
//		double actual_attendance_days = 0;//实出勤天数
		double matter_leave = 0;//事假
		double sick_leave = 0;//病假
		double absenteeism_days = 0;//旷工天数
		double personal_income_tax = 0;//个税
		double other_deductions = 0;//其他扣除
		double wages_payable = 0;//应发工资
		double late_cs = 0;//迟到次数
		double leave_early_cs = 0;//早退次数
		double late_sc = 0;//迟到时长
		double leave_early_sc = 0;//早退时长
		
		double achievement_bonus = 0;//绩效奖金##
		double performance_commission = 0;//业绩提成###
		double pre_taxmakediff = 0;//税前补差###
		
		double matter_leave_deduction = 0;//事假扣款
		double sick_leave_deduction = 0;//病假扣款
		double secretary_ling = 0;//司龄
		double grsb = 0;//个人社保
		double grgjj = 0;//个人公积金
		double net_salary = 0;//实发工资
		
		int matter_leave_num = 0;//事假次数
		int sick_leave_num = 0;//病假次数
		
		//薪资组内成员
		for(XcglAssoXzury pag : paygrlist) {
			
			//存在的计薪规则组项数据对应   写入薪资表
			for(XcglAssoJsgzzx xzx : sjbt) {
				if(xzx.getRulestate() == 1 && xzx.getIsCustom() == 0 && xzx.getOptionid() == 0 && xzx.getSalaryitem().equals("底薪")) {
					XcglAssoXzb xzb = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
					base_salary = xzb.getXzxjg();
				}
				if(xzx.getRulestate() == 1 && xzx.getIsCustom() == 0 && xzx.getOptionid() == 0 && xzx.getSalaryitem().equals("岗位津贴")) {
					XcglAssoXzb xzb = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
					post_allowance = xzb.getXzxjg();
				}
				
				XcglAssoXzb xzb = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 10) { attendance_days = xzb.getXzxjg(); }//实出勤天数
//				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 11) { actual_attendance_days = xzb.getXzxjg(); }//实出勤天数
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 32) { 
						matter_leave = xzb.getXzxjg(); //
						
						HolidayInquiryDto balance = xcglassoxzbmapper.HolidayamountNum(orgcode, salary_month, 1, pag.getUserid()); 
						matter_leave_num = balance.getNum();
				}//事假
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 34) { 
					sick_leave = xzb.getXzxjg(); //
					
					HolidayInquiryDto balance = xcglassoxzbmapper.HolidayamountNum(orgcode, salary_month, 3, pag.getUserid()); 
					sick_leave_num = balance.getNum();
				}//病假
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 12) { absenteeism_days = xzb.getXzxjg(); }//旷工天数
				
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 46) { achievement_bonus = xzb.getXzxjg(); }//绩效奖金
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 47) { performance_commission = xzb.getXzxjg(); }//业绩提成
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 49) { pre_taxmakediff = xzb.getXzxjg(); }//税前补差
				
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 72) { other_deductions = xzb.getXzxjg(); }//其他扣除
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 13) { late_cs = xzb.getXzxjg(); }//迟到次数
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 14) { leave_early_cs = xzb.getXzxjg(); }//早退次数
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 18) { late_sc = xzb.getXzxjg(); }//迟到时长
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 22) { leave_early_sc = xzb.getXzxjg(); }//早退时长
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 50) { grsb = xzb.getXzxjg(); }//个人社保
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 51) { grgjj = xzb.getXzxjg(); }//个人公积金
				
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 43) {//司龄
					YgglMainEmp xzrz = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, pag.getUserid()).eq(YgglMainEmp::getOrgCode, orgcode));
					int entry_date = Integer.valueOf(ClockInTool.SunNovCSTY(xzrz.getRzTime()));//yyyy
					if(Integer.valueOf(strY) - entry_date >= 0) {
						secretary_ling = Integer.valueOf(strY) - entry_date;
					}
					XcglAssoXzb.builder().xzxjg(secretary_ling).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}
				
				//基本工资
				if(xzx.getRulestate().equals(3) && xzx.getIsCustom() == 0 && xzx.getOptionid() == 73) {
					double result = 0;
					//计薪规则组项中自定义项
					List<XcglAssoJsgzzx> zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id()).eq(XcglAssoJsgzzx::getIsCustom, 1));
					String formula = xzx.getGsgs();//#底薪#+#岗位津贴#?
					String qaz = formula.replace("#底薪#", String.valueOf(base_salary)).replace("#岗位津贴#", String.valueOf(post_allowance));
						
					for(XcglAssoJsgzzx zdy : zdyx) {
						double custom_ = 0;//自定义
						boolean status = qaz.contains("#"+zdy.getSalaryitem()+"#");//公式中是否存在自定义
						if(status) {//存在
							XcglAssoJsgzzx zdygsx = XcglAssoJsgzzx.builder().build().selectOne(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getRulestate, 4).eq(XcglAssoJsgzzx::getIsCustom, 1)
									.eq(XcglAssoJsgzzx::getOptionid, 0).eq(XcglAssoJsgzzx::getSalaryitem, zdy.getSalaryitem()));
							XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, zdygsx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
							custom_ = xzb_custom.getXzxjg();
							qaz = qaz.replace("#"+zdy.getSalaryitem()+"#", String.valueOf(custom_));
						}
					}
					boolean status = qaz.contains("#");//再次确认公式中是否存在系统数据项
					if(status) {
						List<XcglAssoJsgzzx> system_zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id())
								.eq(XcglAssoJsgzzx::getIsCustom, 0).ne(XcglAssoJsgzzx::getType, 1));
						for(XcglAssoJsgzzx sys : system_zdyx) {
							if(qaz.contains("#"+sys.getSalaryitem()+"#")) {
								XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, sys.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
								double custom_two = xzb_custom.getXzxjg();
								qaz = qaz.replace("#"+sys.getSalaryitem()+"#", String.valueOf(custom_two));
							}
						}
					}
					
					if(!qaz.contains("#")) {
						result = Double.valueOf(String.valueOf(js.eval(qaz)));
					}else {
						System.err.println(xzx.getOptionid() + ":"+qaz+"有误!!!");
					}
					
					
					base_pay = result;
					XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
					
				}
				
				
				//公式计算
				//(固定公式计算):迟到早退扣款、事假扣款、病假扣款、旷工扣款、司龄工资、应发工资、实发工资
				if(xzx.getRulestate().equals(2)) {
					double result = 0;
					if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 31) {//司龄工资
						String formula = xzx.getGsgs();//#司龄#*100
						String qaz = formula.replace("#司龄#", String.valueOf(secretary_ling));
						result = Double.valueOf(String.valueOf(js.eval(qaz)));
					}
					if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 27) {//事假扣款
						String formula = xzx.getGsgs();//#基本工资#/#应出勤天数#*#事假天数#      
						
						if(xzx.getGsid() == 3) {//事假天数
							matter_leave = matter_leave/prescription;//转化天数
							String qaz = formula.replace("#基本工资#", String.valueOf(base_pay)).replace("#应出勤天数#", String.valueOf(attendance_days)).replace("#事假天数#", String.valueOf(matter_leave));
						    if(attendance_days > 0) {
						    	result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
						    }
						}else if(xzx.getGsid() == 4) {//事假次数  #事假次数#*200
							String qaz = formula.replace("#事假次数#", String.valueOf(matter_leave_num));
						    if(attendance_days > 0) {
						    	result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
						    }
						}
					    
					    matter_leave_deduction = result;
					}
					if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 28) {//病假扣款
						String formula = xzx.getGsgs();//#基本工资#/#应出勤天数#*#病假天数#*0.4     
						
						if(xzx.getGsid() == 5) {//病假天数
							sick_leave = sick_leave/prescription;//转化天数
							String qaz = formula.replace("#基本工资#", String.valueOf(base_pay)).replace("#应出勤天数#", String.valueOf(attendance_days)).replace("#病假天数#", String.valueOf(sick_leave));
							if(attendance_days > 0) {
								result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
							}
						}else if(xzx.getGsid() == 6) {//病假次数   #病假次数#*100
							String qaz = formula.replace("#病假次数#", String.valueOf(sick_leave_num));
						    if(attendance_days > 0) {
						    	result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
						    }
						}
						
					    sick_leave_deduction = result;
					}
					if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 29) {//旷工扣款
						String formula = xzx.getGsgs();//#基本工资#/#应出勤天数#*#旷工天数#*3    #旷工天数#*100
						String qaz = formula.replace("#基本工资#", String.valueOf(base_pay)).replace("#应出勤天数#", String.valueOf(attendance_days)).replace("#旷工天数#", String.valueOf(absenteeism_days));
						if(attendance_days > 0) {
							result = SalaryTool.formatDouble(Double.valueOf(String.valueOf(js.eval(qaz))));
						}
					}
					if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 30) {//迟到早退扣款
						String qaz = "";
						if(xzx.getGsid().equals(1)) {
							String formula = xzx.getGsgs();//#迟到次数#*20+#早退次数#*15
							qaz = formula.replace("#迟到次数#", String.valueOf(late_cs)).replace("#早退次数#", String.valueOf(leave_early_cs));
						}else {
							String formula = xzx.getGsgs();//#迟到时长#*10+#早退时长#*5
							qaz = formula.replace("#迟到时长#", String.valueOf(late_sc)).replace("#早退时长数#", String.valueOf(leave_early_sc));
						}
						if(!("").equals(qaz)) {
							result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
						}
					}
					
					XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}
				
				//应发工资
				if(xzx.getRulestate().equals(2) && xzx.getIsCustom() == 0 && xzx.getOptionid() == 48) {
					String formula = xzx.getGsgs();//#基本工资#+#绩效奖金#+#业绩提成#+#税前补差#-#事假扣款#-#病假扣款#
					String qaz = formula.replace("#基本工资#", String.valueOf(base_pay)).replace("#绩效奖金#", String.valueOf(achievement_bonus))
							.replace("#业绩提成#", String.valueOf(performance_commission)).replace("#税前补差#", String.valueOf(pre_taxmakediff))
							.replace("#事假扣款#", String.valueOf(matter_leave_deduction)).replace("#病假扣款#", String.valueOf(sick_leave_deduction));
				    double result = SalaryTool.formatDouble(Double.valueOf(String.valueOf(js.eval(qaz))));
				    wages_payable = result;
				    
				    XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}else if(xzx.getRulestate() == 3 && xzx.getIsCustom() == 0 && xzx.getOptionid() == 48) {//(自定义公式计算): 应发工资
					double result = 0;
					//计薪规则组项中自定义项
					List<XcglAssoJsgzzx> zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id()).eq(XcglAssoJsgzzx::getIsCustom, 1));
					String formula = xzx.getGsgs();//#基本工资#+#绩效奖金#+#业绩提成#+#税前补差#-#事假扣款#-#病假扣款#?
					String qaz = formula.replace("#基本工资#", String.valueOf(base_pay)).replace("#绩效奖金#", String.valueOf(achievement_bonus))
							.replace("#业绩提成#", String.valueOf(performance_commission)).replace("#税前补差#", String.valueOf(pre_taxmakediff))
							.replace("#事假扣款#", String.valueOf(matter_leave_deduction)).replace("#病假扣款#", String.valueOf(sick_leave_deduction));
						
					for(XcglAssoJsgzzx zdy : zdyx) {
						double custom_ = 0;//自定义
						boolean status = qaz.contains("#"+zdy.getSalaryitem()+"#");//公式中是否存在自定义
						if(status) {//存在
							XcglAssoJsgzzx zdygsx = XcglAssoJsgzzx.builder().build().selectOne(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getRulestate, 4).eq(XcglAssoJsgzzx::getIsCustom, 1)
									.eq(XcglAssoJsgzzx::getOptionid, 0).eq(XcglAssoJsgzzx::getSalaryitem, zdy.getSalaryitem()));
							XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, zdygsx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
							custom_ = xzb_custom.getXzxjg();
							qaz = qaz.replace("#"+zdy.getSalaryitem()+"#", String.valueOf(custom_));
						}
					}
					boolean status = qaz.contains("#");//再次确认公式中是否存在系统数据项
					if(status) {
						List<XcglAssoJsgzzx> system_zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id())
								.eq(XcglAssoJsgzzx::getIsCustom, 0).ne(XcglAssoJsgzzx::getType, 1));
						for(XcglAssoJsgzzx sys : system_zdyx) {
							if(qaz.contains("#"+sys.getSalaryitem()+"#")) {
								XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, sys.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
								double custom_two = xzb_custom.getXzxjg();
								qaz = qaz.replace("#"+sys.getSalaryitem()+"#", String.valueOf(custom_two));
							}
						}
					}
					
					if(!qaz.contains("#")) {
						result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
					}else {
						System.err.println(xzx.getOptionid() + ":"+qaz+"有误!!!");
					}
					
					wages_payable = result;
					XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}
				
				
				
				if(xzx.getIsCustom() == 0 && xzx.getOptionid() == 69) {//个税
					//个税计算
					try {
						personal_income_tax = CalculationOfIndividualIncomeTax(String.valueOf(pag.getUserid()), salary_month, orgcode, wages_payable, other_deductions);
					} catch (ParseException e) {
						e.printStackTrace();
						System.out.println("个税计算错误");
					}
					double result = personal_income_tax < 0 ? 0.0 : personal_income_tax;
					XcglAssoXzb.builder().xzxjg(SalaryTool.formatDouble_(result)).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}
				
				
				//实发工资
				if(xzx.getRulestate().equals(2) && xzx.getIsCustom() == 0 && xzx.getOptionid() == 70) {
					String formula = xzx.getGsgs();//#应发工资#-#个人社保#-#个人公积金#-#个税#
					String qaz = formula.replace("#应发工资#", String.valueOf(wages_payable)).replace("#个人社保#", String.valueOf(grsb)).replace("#个人公积金#", String.valueOf(grgjj)).replace("#个税#", String.valueOf(personal_income_tax < 0 ? 0.0 : personal_income_tax));
					double result = SalaryTool.formatDouble(Double.valueOf(String.valueOf(js.eval(qaz))));
					net_salary = result;
					
					XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}else if(xzx.getRulestate().equals(3) && xzx.getIsCustom() == 0 && xzx.getOptionid() == 70) {
					double result = 0;
					//计薪规则组项中自定义项
					List<XcglAssoJsgzzx> zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id()).eq(XcglAssoJsgzzx::getIsCustom, 1));
					String formula = xzx.getGsgs();//#应发工资#-#个人社保#-#个人公积金#-#个税#
					String qaz = formula.replace("#应发工资#", String.valueOf(wages_payable)).replace("#个人社保#", String.valueOf(grsb)).replace("#个人公积金#", String.valueOf(grgjj)).replace("#个税#", String.valueOf(personal_income_tax < 0 ? 0.0 : personal_income_tax));
					
					for(XcglAssoJsgzzx zdy : zdyx) {
						double custom_ = 0;//自定义
						boolean status = qaz.contains("#"+zdy.getSalaryitem()+"#");//公式中是否存在自定义
						if(status) {//存在
							XcglAssoJsgzzx zdygsx = XcglAssoJsgzzx.builder().build().selectOne(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getRulestate, 4).eq(XcglAssoJsgzzx::getIsCustom, 1)
									.eq(XcglAssoJsgzzx::getOptionid, 0).eq(XcglAssoJsgzzx::getSalaryitem, zdy.getSalaryitem()));
							XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, zdygsx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
							custom_ = xzb_custom.getXzxjg();
							qaz = qaz.replace("#"+zdy.getSalaryitem()+"#", String.valueOf(custom_));
						}
					}
					boolean status = qaz.contains("#");//再次确认公式中是否存在系统数据项
					if(status) {
						List<XcglAssoJsgzzx> system_zdyx =  XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, calcomtiondto.getPay_group_id())
								.eq(XcglAssoJsgzzx::getIsCustom, 0).ne(XcglAssoJsgzzx::getType, 1));
						for(XcglAssoJsgzzx sys : system_zdyx) {
							if(qaz.contains("#"+sys.getSalaryitem()+"#")) {
								XcglAssoXzb xzb_custom = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, sys.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
								double custom_two = xzb_custom.getXzxjg();
								qaz = qaz.replace("#"+sys.getSalaryitem()+"#", String.valueOf(custom_two));
							}
						}
					}
					
					if(!qaz.contains("#")) {
						result = SalaryTool.formatDouble_(Double.valueOf(String.valueOf(js.eval(qaz))));
					}else {
						System.err.println(xzx.getOptionid() + ":"+qaz+"有误!!!");
					}
					net_salary = result;
					
					XcglAssoXzb.builder().xzxjg(result).build().update(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getXzxid, xzx.getId()).eq(XcglAssoXzb::getUserid, pag.getUserid()));
				}
				
			}//存在的计薪规则组项数据对应   写入薪资表  --结束
			
			XcglAssoGztzt.builder().build().delete(new QueryWrapper<XcglAssoGztzt>().lambda().eq(XcglAssoGztzt::getUserid, pag.getUserid()).eq(XcglAssoGztzt::getXzyf, salary_month)
					.eq(XcglAssoGztzt::getQyid, orgcode));
			
			//xcgl_asso_gztzt
			XcglAssoGztzt gzt = XcglAssoGztzt.builder().build();
			gzt.setUserid(pag.getUserid());
			gzt.setXzyf(salary_month);//薪资月
			gzt.setFsType(0);
			gzt.setCkType(0);
			gzt.setQrType(0);
			gzt.setFkyj(null);
			gzt.setYhqm(null);
			gzt.setSfgz(net_salary);
			gzt.setQyid(orgcode);
			gzt.setXzzid(calcomtiondto.getPay_group_id());
			gzt.insert();
		}//薪资组内成员--结束
		
		return ResultUtil.data(null, "计算完成");
	}
	
	/**
	 * 个税计算明细
	 * @param gsus 用户id
	 * @param salary_month 计算薪资月
	 * @param orgcode 企业id
	 * @param wages_payable 应发工资
	 * @param other_deductions 其他扣除
	 * @return
	 * @throws ParseException 
	 */
	public double CalculationOfIndividualIncomeTax(String gsus,String salary_month,int orgcode,double wages_payable,double other_deductions) throws ParseException {
		double personalincome = 0;
		String strY = new SimpleDateFormat("yyyy").format(new Date());
		
		XcglAssoGsjsmx.builder().build().delete(new QueryWrapper<XcglAssoGsjsmx>().lambda().eq(XcglAssoGsjsmx::getUserNum, gsus).eq(XcglAssoGsjsmx::getSalaryMonth, salary_month)
				.eq(XcglAssoGsjsmx::getQyid, orgcode));
		
		//当月个税存在则直接获取  无则根据计算薪资月的上月个税为基准计算
		XcglAssoGsjsmx dyxzgs = XcglAssoGsjsmx.builder().build().selectOne(new QueryWrapper<XcglAssoGsjsmx>().lambda().eq(XcglAssoGsjsmx::getUserNum, gsus).eq(XcglAssoGsjsmx::getQyid, orgcode)
				.eq(XcglAssoGsjsmx::getSalaryMonth, salary_month));
		if(dyxzgs != null) {
			personalincome = dyxzgs.getThmonthPersonal();
		}else {
			//#(上月)# 对应薪资月的-1 个税对标数据     (九月工资:对应8月的个税来计算九月的个税)
			XcglAssoGsjsmx sygs = XcglAssoGsjsmx.builder().build().selectOne(new QueryWrapper<XcglAssoGsjsmx>().lambda().eq(XcglAssoGsjsmx::getUserNum, gsus).eq(XcglAssoGsjsmx::getQyid, orgcode)
					.eq(XcglAssoGsjsmx::getSalaryMonth, SalaryTool.getfirstlastMo(salary_month+"-01 00:00:00")));
			
			boolean status = salary_month.contains("-01");
			double childrenedu_ = 0;//累计子女教育
			double houseloans_ = 0;//累计住房贷款利息
			double houserents_ = 0;//累计住房租金
			double supportolder_ = 0;//累计赡养老人
			double continueedu_ = 0;//累计继续教育
			double totalmoney_ = 0;//累计专项附加扣除
			if(!status && sygs != null) {
				childrenedu_ = sygs.getCumZljy() == null ? 0 : sygs.getCumZljy(); 
				houseloans_ = sygs.getCumZfdklx() == null ? 0 : sygs.getCumZfdklx();  
				houserents_ = sygs.getCumZfzj() == null ? 0 : sygs.getCumZfzj();  
				supportolder_ = sygs.getCumSylr() == null ? 0 : sygs.getCumSylr();
				continueedu_ = sygs.getCumJxjy() == null ? 0 : sygs.getCumJxjy(); 
				totalmoney_ = sygs.getCumZxfjkc() == null ? 0 : sygs.getCumZxfjkc();  
			}
			YgglMainEmp yh = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, gsus).eq(YgglMainEmp::getOrgCode, orgcode));
			//对应算薪月份的专项附加扣除
			XcglAssoZxfjkc zxf = XcglAssoZxfjkc.builder().build().selectOne(new QueryWrapper<XcglAssoZxfjkc>().lambda().eq(XcglAssoZxfjkc::getUserid, gsus)
					.eq(XcglAssoZxfjkc::getQyid, orgcode).eq(XcglAssoZxfjkc::getTaxmonth, salary_month));
			//写入个税明细表*****************
			XcglAssoGsjsmx gsmx = XcglAssoGsjsmx.builder().build();
			gsmx.setUserNum(gsus);//用户id
			gsmx.setUserName(yh.getName());//用户姓名
			gsmx.setSalaryMonth(salary_month);//薪资月
			//报税周期:(1:当月报税;2:次月报税)
			XcglAssoBszqsz bssz = XcglAssoBszqsz.builder().build().selectOne(new QueryWrapper<XcglAssoBszqsz>().lambda().eq(XcglAssoBszqsz::getQyid, orgcode));
			String taxmonth = "";
			if(bssz.getTaxReturnCycle().equals(1)) {
				taxmonth = salary_month;
			}else{
				taxmonth = SalaryTool.getfirstnextMo(salary_month+"-01 00:00:00");
			}
			gsmx.setTaxMonth(taxmonth);//税款所属月份
			gsmx.setCumZljy(zxf == null ? 0 : (zxf.getChildrenedu() == null ? 0 : zxf.getChildrenedu()) + childrenedu_);//累计子女教育
			gsmx.setCumZfdklx(zxf == null ? 0 : (zxf.getHouseloans() == null ? 0 : zxf.getHouseloans()) + houseloans_);//累计住房贷款利息
			gsmx.setCumZfzj(zxf == null ? 0 : (zxf.getHouserents() == null ? 0 : zxf.getHouserents()) + houserents_);//累计住房租金
			gsmx.setCumSylr(zxf == null ? 0 : (zxf.getSupportolder() == null ? 0 : zxf.getSupportolder()) + supportolder_);//累计赡养老人
			gsmx.setCumJxjy(zxf == null ? 0 : (zxf.getContinueedu() == null ? 0 : zxf.getContinueedu()) + continueedu_);//累计继续教育
			gsmx.setCumZxfjkc(zxf == null ? 0 : (zxf.getTotalmoney() == null ? 0 : zxf.getTotalmoney()) + totalmoney_);//累计专项附加扣除
			gsmx.setTaxType("工资薪金所得");//计税类型
			gsmx.setCurrentIncome(wages_payable);//本期收入  【应发工资】
				SbgjjAssoYjzd cuspde = sbgjjassoyjzdmapper.IndividualTotalsbgjj(gsus, orgcode, salary_month);
			gsmx.setCurrentSpecialDeduction(cuspde == null ? 0 : Double.valueOf(cuspde.getGrjltotal()));//本期专项扣除 【个人的社保公积金缴纳扣除】
			gsmx.setCumSre(wages_payable+(sygs == null ? 0 : sygs.getCumSre()));//累计收入额 【本期收入+累计收入额(上月)】
			double cumjcfy = 0;			
			if(sygs != null && sygs.getCumJcfy() > 0) {
				cumjcfy = sygs.getCumJcfy() + 5000;
			}else {
				int xcy = 0;
				YgglMainEmp xzrz = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, gsus).eq(YgglMainEmp::getOrgCode, orgcode));
				if(xzrz != null) {
//					String entry_date = ClockInTool.SunNovCSTYMD(xzrz.getRzTime());//yyyyMMdd
					String entry_date = ClockInTool.SunNovCSTYM(xzrz.getRzTime());//yyyyMM
					if(bssz.getTaxReturnCycle().equals(1)) {//当月报税
						if(entry_date.substring(0,4).equals(strY)) {//判断是否是本年
							xcy = SalaryTool.getMonthDiff(entry_date+"-01", salary_month+"-01");
						}else {
							xcy = SalaryTool.getMonthDiff(strY+"-01-01", salary_month+"-01");
						}
						cumjcfy = xcy*5000;
					}else {//次月报税
						if(entry_date.substring(0,4).equals(strY)) {//判断是否是本年
							xcy = SalaryTool.getMonthDiff(entry_date+"-01", salary_month+"-01")+1;
						}else {
							xcy = SalaryTool.getMonthDiff(strY+"-01-01", salary_month+"-01")+1;
						}
						cumjcfy = xcy*5000;
					}
				}
			}
			gsmx.setCumJcfy(cumjcfy);//累计减除费用 【5000*在职月份数】
			
			gsmx.setCumZxkc((cuspde == null ? 0 : Double.valueOf(cuspde.getGrjltotal())) + (sygs == null ? 0 : (sygs.getCumZxkc() == null ? 0 : sygs.getCumZxkc())));//累计专项扣除 【本期专项扣除+累计专项扣除(上月)】
			gsmx.setCumQtkc(other_deductions+(sygs == null ? 0 : (sygs.getCumQtkc() == null ? 0 : sygs.getCumQtkc())));//累计其他扣除 【其他扣除+累计其他扣除(上月)】
			
			double cumynssde = 0;
			cumynssde = gsmx.getCumSre() - cumjcfy - gsmx.getCumZxkc() - gsmx.getCumZxfjkc() - gsmx.getCumQtkc();
			gsmx.setCumYnssde(SalaryTool.formatDouble_(cumynssde));//累计应纳税所得额 【累计收入额-累计减除费用-累计专项扣除-累计专项附加扣除-累计其他扣除】
			
			String[] miscalculation = getPersonalincometax(cumynssde);
			gsmx.setTaxRate(Double.valueOf(miscalculation[0]));//税率
			gsmx.setQuickCalculationDeduction(Double.valueOf(miscalculation[1]));//速算扣除数
			gsmx.setCumYnse(SalaryTool.formatDouble_(Double.valueOf(miscalculation[2])));//累计应纳税额 【累计应纳税所得额*税率-速算扣除数】
			
			double cumyyjse = 0;
			cumyyjse = (sygs == null ? 0 : (sygs.getCumYyjse() == null ? 0 : sygs.getCumYyjse())) + (sygs == null ? 0 : (sygs.getCumYbtse() == null ? 0 : sygs.getCumYbtse()));
			gsmx.setCumYyjse(cumyyjse);//累计已预缴纳税额 【累计已预缴税额(上月)+累计应补(退)税额(上月)】
			
			double cumybtse = 0;
			cumybtse = gsmx.getCumYnse() - gsmx.getCumYyjse();
			gsmx.setCumYbtse(SalaryTool.formatDouble_(cumybtse));//累计应补(退)税额(本月个税)   【累计应纳税额-累计已预缴纳税额】
			gsmx.setThmonthPersonal(SalaryTool.formatDouble_(cumybtse));//本月个税
			gsmx.setQyid(orgcode);//企业id
			gsmx.insert();
			
			if(cumybtse > 0) {
				personalincome = cumybtse;
			}
			
		}
		return personalincome;
	}
	
	
	/**
	 * 计算个税
	 * @param taxpayroll 累计应纳税所得额
	 */
	public String[] getPersonalincometax(double taxpayroll){
		String[] perinctax = new String[3];
		List<XcglAssoTaxFormula> taxratelist = XcglAssoTaxFormula.builder().build().selectList(new QueryWrapper<XcglAssoTaxFormula>().lambda().eq(XcglAssoTaxFormula::getQyid, 0));
		double personalIncomeTax=0;//个税
		double money=36000;//应交税工资最低点
		if(taxpayroll>0){//应交税
			for (XcglAssoTaxFormula  tax : taxratelist) {//计算个税
				if(tax.getTaxablestart()<=taxpayroll&&taxpayroll<tax.getTaxableend()){
					//个人所得税=计税工资*税率-速算扣除数
					BigDecimal aa = new BigDecimal(tax.getTaxrate());
					BigDecimal bb = new BigDecimal(100);
					double taxrate = aa.divide(bb,2,BigDecimal.ROUND_HALF_UP).doubleValue();
					personalIncomeTax = taxpayroll*taxrate-tax.getDeductions();
					
					perinctax[0] = String.valueOf(tax.getTaxrate());//税率
					perinctax[1] = String.valueOf(tax.getDeductions());//速算扣除数
					perinctax[2] = String.valueOf(SalaryTool.formatDouble(personalIncomeTax));//累计应纳税额
				}
			}
		}else{
			
			perinctax[0] = "0";
			perinctax[1] = "0";
			perinctax[2] = "0";
		}
		return perinctax;
	}
	
	
	@GetMapping(value = "/gettaxreturncycle")
	@ApiOperation(value = "查询报税周期信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> gettaxreturncycle(@CurrentUser UserBean userBean) {
		XcglAssoBszqsz bszq = XcglAssoBszqsz.builder().build().selectOne(new QueryWrapper<XcglAssoBszqsz>().lambda().eq(XcglAssoBszqsz::getQyid, userBean.getOrgCode()));
		if(bszq == null) {
			XcglAssoBszqsz.builder().taxReturnCycle(1).qyid(userBean.getOrgCode()).build().insert();
		}
		bszq = XcglAssoBszqsz.builder().build().selectOne(new QueryWrapper<XcglAssoBszqsz>().lambda().eq(XcglAssoBszqsz::getQyid, userBean.getOrgCode()));
		
		return ResultUtil.data(bszq, "完成");
	}
	
	

	/**
	 * 	新增/修改--报税周期信息
	 */
	@PostMapping(value = "/taxreturncycle")
	@ApiOperation(value = "新增/修改--报税周期信息", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Taxreturncycle(@CurrentUser UserBean userBean,@RequestBody XcglAssoBszqsz xcglassobszqsz) {
		xcglassobszqsz.setQyid(userBean.getOrgCode());
		return xcglassobszqsz.insertOrUpdate() ? ResultUtil.success("操作成功!") : ResultUtil.error("操作失败!");
	}
	
	
	/** 构建薪资组
	 * @param userBean
	 * @param budpaygr
	 * @return
	 */
	@PostMapping(value = "/buildpaygroup")
	@ApiOperation(value = "构建薪资组", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> Buildpaygroup(@CurrentUser UserBean userBean, @RequestBody BuildPayGroupDto budpaygr) {
		Integer empNum = userBean.getEmpNum();
		Integer orgCode = userBean.getOrgCode();
		
		Calendar lastm = Calendar.getInstance();
		lastm.setTime(SalaryTool.strToDateLong(budpaygr.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		lastm.set(Calendar.MONTH, lastm.get(Calendar.MONTH) - 1);
		String lastmonth = new SimpleDateFormat("yyyy-MM").format(lastm.getTime());// 上
		
		String thismonth = budpaygr.getXzyf();// 本
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(SalaryTool.strToDateLong(budpaygr.getXzyf() + "-01 00:00:00")); // 设置为当前时间
		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
		String nextMonth = new SimpleDateFormat("yyyy-MM").format(calendar.getTime());// 下
		
		//查询系统现有的薪资组
		List<XcglAdminXzz> xcxz = XcglAdminXzz.builder().build().selectList(new QueryWrapper<XcglAdminXzz>().lambda().eq(XcglAdminXzz::getQyid, userBean.getOrgCode()));
		for(XcglAdminXzz xzz : xcxz) {
			
			XcglAdminXzz xcglxzz = XcglAdminXzz.builder().build();
			xcglxzz.setName(xzz.getName());// 薪资组命名
			xcglxzz.setPayperiod(xzz.getPayperiod());// 算薪月周期 0:上月;1:当月
			xcglxzz.setPaydayperiod(xzz.getPaydayperiod());// 算薪日周期 全月
			String payper = String.format("%02d", xzz.getPaydayperiod());
			String payrollcycle = null;
			if (xzz.getPayperiod() == 0) {// 上月
				if (xzz.getPaydayperiod() == 1) {
					payrollcycle = SalaryTool.getfirstlastTwo(budpaygr.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastlastTwo(budpaygr.getXzyf() + "-01 00:00:00");
				} else {
					String firstnext = lastmonth + "-" + payper;
					int jgs = xzz.getPaydayperiod() - 1;
					String lastnext = thismonth + "-" + String.format("%02d", jgs);
					payrollcycle = firstnext + "到" + lastnext;
				}
			} else {// 当月
				if (xzz.getPaydayperiod() == 1) {
					payrollcycle = SalaryTool.getfirstnowTwo(budpaygr.getXzyf() + "-01 00:00:00") + "到" + SalaryTool.getlastnowTwo(budpaygr.getXzyf() + "-01 00:00:00");
				} else {
					String firstnow = thismonth + "-" + payper;
					int jgs = xzz.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(xzz.getPxfs());// 选择配薪方式(0:	空白模板;df:默认)
			xcglxzz.setAdduserid(empNum);// 员工工号
			xcglxzz.setQyid(orgCode);// 企业编码
			xcglxzz.setAddtime(new Date().getTime());// 添加时间
			xcglxzz.setMonthtime(budpaygr.getXzyf());//薪资月份
			xcglxzz.setXzyf(payrollcycle.substring(0, 7));//算薪月份
			xcgladminxzzmapper.insert(xcglxzz);
			int payid = xcglxzz.getId();
			
			
			//从其他薪资组复制规则
			/*****************/
			//未加入分组
			List<XcglAssoJsgzzx> wjrfzlist = new LambdaQueryChainWrapper<XcglAssoJsgzzx>(xcglassojsgzzxmapper).eq(XcglAssoJsgzzx::getXzzid, xzz.getId()).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());
				
				zzx.setDygk(zxs.getDygk());//公式变量值1
				zzx.setDegk(zxs.getDegk());//公式变量值2
				wjrfzzzxlist.add(zzx);
			}
			if(wjrfzzzxlist.size() > 0) {
				xcglassojsgzzxmapper.insertxcglassojsgzzxList(wjrfzzzxlist);
			}
			/*************/
			
			//计薪规则组
			List<XcglAssoJxgz> jxgzlist = new LambdaQueryChainWrapper<XcglAssoJxgz>(xcglassojxgzmapper).eq(XcglAssoJxgz::getXzzid, xzz.getId()).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, xzz.getId()).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(yzxs.getOptionid());
						
						zzx.setDygk(yzxs.getDygk());//公式变量值1
						zzx.setDegk(yzxs.getDegk());//公式变量值2
						yjrfzzzxlist.add(zzx);
					}
					if(yjrfzzzxlist.size() > 0) {
						xcglassojsgzzxmapper.insertxcglassojsgzzxList(yjrfzzzxlist);
					}
				}
			}
		
			
			List<XcglAssoXzury> zxzus = XcglAssoXzury.builder().build().selectList(new QueryWrapper<XcglAssoXzury>().lambda().eq(XcglAssoXzury::getXzzid, xzz.getId()));
			
			List<XcglAssoXzury> xcgllist = new ArrayList<XcglAssoXzury>();
		
			for (XcglAssoXzury xzr : zxzus) {
//				xcglassoxzurymapper.deleteByuseridoqyid(Integer.valueOf(attser[u]), orgCode);
				XcglAssoXzury kquser = new XcglAssoXzury();
				kquser.setXzzid(payid);// 薪资组id
				kquser.setUserid(xzr.getUserid());
				kquser.setQyid(orgCode);
				xcgllist.add(kquser);
			}
			
			if (xcgllist.size() > 0) {
				xcglassoxzurymapper.insertxcglassoxzuryList(xcgllist);
			}
			
		}//循环结束
		
		
		
		return ResultUtil.data(null, "完成");
	}
	
	
	
	/**
	 *	同步考勤   XXXXXXX
	 */
	@GetMapping(value = "/SynchroAtt/{id}/{xzyf}")
	@ApiOperation(value = "同步考勤", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SynchroAttendance(@CurrentUser UserBean userBean,@PathVariable Integer id,@PathVariable String xzyf) {
		//已知薪资组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,xzyf);
				//计算得出考勤相关数据
				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(xzyf);//薪资月
							xzb.setXzxid(payatt.getId());//薪资项id
							xzb.setXzxjg(Double.valueOf(autacq));//薪资项结果
							xzb.setQyid(userBean.getOrgCode());
							xcglassoxzbmapper.xzbinsert(xzb);
						}else {
							
							//入[薪资表]
					        XcglAssoXzb xzb = XcglAssoXzb.builder().build();
							xzb.setUserid(znr.getUserid());//用户id
							xzb.setXzyf(xzyf);//薪资月
							xzb.setXzxid(payatt.getId());//薪资项id
							xzb.setXzxjg(0.0);//薪资项结果
							xzb.setQyid(userBean.getOrgCode());
							xcglassoxzbmapper.xzbinsert(xzb);
							
						}
					}
				}
				
				
			}
			
			//计算完成 返回数据
//			List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(id,userBean.getOrgCode());
			CheckSalaryStaffDto checksalary = new CheckSalaryStaffDto();
			checksalary.setPaygroupid(id);
			checksalary.setXzyf(xzyf);
			checksalary.setOrgcode(userBean.getOrgCode());
			List<CalculationDto> jswsj = xcglassoxzbmapper.CalculationResults(checksalary);
			
			return new ResponseResult().success("考勤数据同步成功", jswsj);
			
		}else {//该组无人
			return new ResponseResult().error("请先添加算薪人员");
		}
		
	}
	
	
	/***************/
	/***考勤****/
	/**
	 * @param orgCode 企业id
	 * @param userid	用户id	
	 * @param payrolldate 计薪日期
	 * @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 = SalaryTool.getMinMonthDate(start);
		   startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaet,"yyyy-MM-dd")).getTime();
		       
		   String edate = SalaryTool.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,orgCode);
		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 <= SalaryTool.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 = SalaryTool.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 <= SalaryTool.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 = SalaryTool.getDaysByYearMonth(year,month) - y;
				 attrep.setRestday(xiuxi);//休息天数
				 attrep.setAnswerday(y);//应出勤
			}
		    List<PunchCardDetails> attendance = punchcarddetailsservice.selectAttendanceDays(userid, startDate, endDate,orgCode);//打卡记录
		    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;
			
	}
	
	
	/**
	 *	切换薪资日期
	 */
	@GetMapping(value = "/switchsalarydate/{sxrq}")
	@ApiOperation(value = "切换薪资日期", httpMethod = "GET", notes = "接口发布说明")
	public ResponseResult SwitchSalaryDate(@CurrentUser UserBean userBean,@PathVariable String sxrq) {
		List<XcglAdminXzz> xcgladminxzz = new LambdaQueryChainWrapper<XcglAdminXzz>(xcgladminxzzmapper).eq(XcglAdminXzz::getQyid, userBean.getOrgCode()).eq(XcglAdminXzz::getMonthtime, sxrq).list();
		
		return new ResponseResult().success("成功", xcgladminxzz);
	}
	
	
	/**
	 *	切换薪资日期
	 */
//	@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 = SalaryTool.getMinMonthDate(date);
//			   Long startDate = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaet,"yyyy-MM-dd")).getTime();
//			   strstartdate = new SimpleDateFormat("yyyy-MM-dd").format(startDate);// 上
//			   String edate = SalaryTool.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 = SalaryTool.getMinMonthDate(lasdate);
//			    Long startDatelas = DateUtil.getStartTime(0,DateUtil.getStringTime(sdaetlas,"yyyy-MM-dd")).getTime();
//			    lasstrstartdate = new SimpleDateFormat("yyyy-MM-dd").format(startDatelas);// 上
//			    String edatelas = SalaryTool.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);
//	}
	
	/**
	 *	获取附加扣除数据
	 */
	@PostMapping(value = "/obtainidedu")
	@ApiOperation(value = "获取附加扣除数据", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult ObtainAdditionalDeduction(@CurrentUser UserBean userBean,@RequestBody SearchSalariedPeopleDto search) {
		search.setOrgcode(userBean.getOrgCode());
		
		List<AdditionalDeductionDto> fjkclist = xcglassozxfjkcmapper.selectAdditionalDeductiontwo(search);
		return new ResponseResult().success("获取附加扣除数据成功", fjkclist);
	}
	
	/**
	 * 	查询列表-获取附加扣除数据-分页
	 */
	@PostMapping(value = "/select_leave_rules")
	@ApiOperation(value = "获取附加扣除数据-分页", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> selectleaverules(@CurrentUser UserBean userBean, @RequestBody SearchSalariedPeopleDto search) {
			IPage<AdditionalDeductionDto> page = new Page<AdditionalDeductionDto>(
			search.getCurrentPage() == null ? 1 : search.getCurrentPage(),
			search.getTotalPage() == null ? 10 : search.getTotalPage());
			
			search.setOrgcode(userBean.getOrgCode());
			
			IPage<AdditionalDeductionDto> pageAs = xcglassozxfjkcmapper.selectAdditionalDeduction(page, search);
			List<AdditionalDeductionDto> listAs = pageAs.getRecords();
			
			return ResultUtil.data(pageAs, listAs, "操作成功!");
	}
	
	
	
	/**
	 *	专项附加扣除
	 */
	@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);
	}
	
	@PostMapping(value = "/payslipSearch")
	@ApiOperation(value = "工资条搜索", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult payslipSearch(@CurrentUser UserBean userBean, @RequestBody PayslipSearchDto dto) {
		dto.setOrgcode(userBean.getOrgCode());
		List<PayslipDetailsDto> paydetlist = xcglassogztztmapper.payslipSearch(dto);
		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 = "/import_special_additional_deduction")
	@ApiOperation(value = "导入专项附加扣除", httpMethod = "POST", notes = "接口发布说明")
	public Result<ImportDescriptionDto> importSpecialAdditionalDeduction(@CurrentUser UserBean userBean,
			@Validated @RequestBody ValidList<SpecialDeductionDto> specialdeductiondto) throws Exception {

		Integer orgCode = userBean.getOrgCode();

		int toinsert = 0;//新增
		int toupdate = 0;//更新
		int failure = 0;//失败
		List<Map<String, String>> reasons = Lists.newArrayList();
		for (SpecialDeductionDto spec : specialdeductiondto) {
			String name = spec.getName();
			String phone = spec.getPhone();
			String date = spec.getDate();
			Map<String, String> map = Maps.newHashMap();
			try {
				YgglMainEmp ygl = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getName, name)
						.eq(YgglMainEmp::getPhone, phone).eq(YgglMainEmp::getOrgCode, orgCode));

				XcglAssoZxfjkc xcg = XcglAssoZxfjkc.builder().build().selectOne(new QueryWrapper<XcglAssoZxfjkc>().lambda().eq(XcglAssoZxfjkc::getTaxmonth, date)
						.eq(XcglAssoZxfjkc::getQyid, userBean.getOrgCode()).eq(XcglAssoZxfjkc::getUserid, ygl.getEmpNum()));

				if(xcg == null) {
					XcglAssoZxfjkc xcglas = XcglAssoZxfjkc.builder().build();
					xcglas.setUserid(ygl.getEmpNum());
					xcglas.setTaxmonth(date);
					xcglas.setChildrenedu(spec.getZljy() == null ? 0 : Double.valueOf(spec.getZljy()));//子女教育
					xcglas.setHouseloans(spec.getZfdk() == null ? 0 : Double.valueOf(spec.getZfdk()));//住房贷款利息
					xcglas.setHouserents(spec.getZfzj() == null ? 0 : Double.valueOf(spec.getZfzj()));//住房租金
					xcglas.setSupportolder(spec.getSylr() == null ? 0 : Double.valueOf(spec.getSylr()));//赡养老人
					xcglas.setContinueedu(spec.getJxjy() == null ? 0 : Double.valueOf(spec.getJxjy()));//继续教育

					BigDecimal num1 = new BigDecimal(spec.getZljy() == null ? 0 : Double.valueOf(spec.getZljy()));
					BigDecimal num2 = new BigDecimal(spec.getZfdk() == null ? 0 : Double.valueOf(spec.getZfdk()));
					double result1 = num1.add(num2).doubleValue();
					BigDecimal num3 = new BigDecimal(result1);
					BigDecimal num4 = new BigDecimal(spec.getZfzj() == null ? 0 : Double.valueOf(spec.getZfzj()));
					double result2 = num3.add(num4).doubleValue();

					BigDecimal num5 = new BigDecimal(result2);
					BigDecimal num6 = new BigDecimal(spec.getSylr() == null ? 0 : Double.valueOf(spec.getSylr()));
					double result3 = num5.add(num6).doubleValue();

					BigDecimal num7 = new BigDecimal(result3);
					BigDecimal num8 = new BigDecimal(spec.getJxjy() == null ? 0 : Double.valueOf(spec.getJxjy()));
					double result = num7.add(num8).doubleValue();

					xcglas.setTotalmoney(result);//累计专项附加扣除
					xcglas.setQyid(userBean.getOrgCode());
					xcglas.setAddtime(new Date().getTime());
					xcglassozxfjkcmapper.insertXcglAssoZxfjkc(xcglas);
					toinsert++;
				}else {
					XcglAssoZxfjkc fjkc = XcglAssoZxfjkc.builder().build();
					fjkc.setId(xcg.getId());
					fjkc.setChildrenedu(spec.getZljy() == null ? 0 : Double.valueOf(spec.getZljy()));//子女教育
					fjkc.setHouseloans(spec.getZfdk() == null ? 0 : Double.valueOf(spec.getZfdk()));//住房贷款利息
					fjkc.setHouserents(spec.getZfzj() == null ? 0 : Double.valueOf(spec.getZfzj()));//住房租金
					fjkc.setSupportolder(spec.getSylr() == null ? 0 : Double.valueOf(spec.getSylr()));//赡养老人
					fjkc.setContinueedu(spec.getJxjy() == null ? 0 : Double.valueOf(spec.getJxjy()));//继续教育

					BigDecimal num1 = new BigDecimal(spec.getZljy() == null ? 0 : Double.valueOf(spec.getZljy()));
					BigDecimal num2 = new BigDecimal(spec.getZfdk() == null ? 0 : Double.valueOf(spec.getZfdk()));
					double result1 = num1.add(num2).doubleValue();
					BigDecimal num3 = new BigDecimal(result1);
					BigDecimal num4 = new BigDecimal(spec.getZfzj() == null ? 0 : Double.valueOf(spec.getZfzj()));
					double result2 = num3.add(num4).doubleValue();

					BigDecimal num5 = new BigDecimal(result2);
					BigDecimal num6 = new BigDecimal(spec.getSylr() == null ? 0 : Double.valueOf(spec.getSylr()));
					double result3 = num5.add(num6).doubleValue();

					BigDecimal num7 = new BigDecimal(result3);
					BigDecimal num8 = new BigDecimal(spec.getJxjy() == null ? 0 : Double.valueOf(spec.getJxjy()));
					double result = num7.add(num8).doubleValue();

					fjkc.setTotalmoney(Double.valueOf(result));//累计专项附加扣除
					xcglassozxfjkcmapper.updateXcglAssoZxfjkc(fjkc);
					toupdate++;
				}
			} catch (Exception e) {
//				e.printStackTrace();
				failure++;
				map.put("name", name);
				map.put("msg", StringUtils.isBlank(e.getMessage()) ? "用户信息错误(例如:电话号码不正确等)" : e.getMessage());
			} finally {
				if(!map.isEmpty()) {
					reasons.add(map);
				}
			}
		}
		ImportDescriptionDto imds = new ImportDescriptionDto();
		imds.setSuccess(toinsert + toupdate);//成功
		imds.setToinsert(toinsert);
		imds.setToupdate(toupdate);//更新
		imds.setFailure(failure);//失败
		imds.setReasons(reasons);
		return ResultUtil.data(imds, "成功");
	}
	
	
	
	/**	
	 * 导入个税明细
	 */
	@PostMapping(value = "/individual_income_tax_details")
	@ApiOperation(value = "导入个税明细", httpMethod = "POST", notes = "接口发布说明")
	public Result<ImportDescriptionDto> IndividualIncomeTaxDetails(@CurrentUser UserBean userBean,
			@Validated @RequestBody ValidList<IndividualTaxDetailsDto> individualtaxdetailsdto) throws Exception {
		
		Integer orgCode = userBean.getOrgCode();
		
		int toinsert = 0;//新增
		int toupdate = 0;//更新
		int failure = 0;//失败
		
		List<Map<String, String>> reasons = Lists.newArrayList();
		for (IndividualTaxDetailsDto indv : individualtaxdetailsdto) {
			String userName = indv.getUserName();
			String phone = indv.getPhone();
			String date = indv.getSalaryMonth();//薪资月
			Map<String, String> map = Maps.newHashMap();
			try {
				XcglAssoBszqsz bssz = XcglAssoBszqsz.builder().build().selectOne(new QueryWrapper<XcglAssoBszqsz>().lambda().eq(XcglAssoBszqsz::getQyid, orgCode));
				String taxmonth = "";
				if(bssz.getTaxReturnCycle().equals(1)) {
//					taxmonth = indv.getTaxMonth();
					taxmonth = indv.getSalaryMonth();
				}else{
					taxmonth = SalaryTool.getfirstnextMo(indv.getSalaryMonth()+"-01 00:00:00");
				}
				YgglMainEmp ygl = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getName, userName)
						.eq(YgglMainEmp::getPhone, phone).eq(YgglMainEmp::getOrgCode, orgCode));
				
				if(ygl != null) {
					XcglAssoGsjsmx gsjs = XcglAssoGsjsmx.builder().build().selectOne(new QueryWrapper<XcglAssoGsjsmx>().lambda().eq(XcglAssoGsjsmx::getUserNum, ygl.getEmpNum())
							.eq(XcglAssoGsjsmx::getQyid, ygl.getOrgCode()).eq(XcglAssoGsjsmx::getSalaryMonth, date));
					
					if(gsjs == null) {
						XcglAssoGsjsmx gsgs = XcglAssoGsjsmx.builder().build();
						gsgs.setUserNum(String.valueOf(ygl.getEmpNum()));
						gsgs.setUserName(indv.getUserName());
						gsgs.setSalaryMonth(indv.getSalaryMonth());
						gsgs.setTaxMonth(taxmonth);//税款所属月份
						gsgs.setThmonthPersonal(indv.getThmonthPersonal() == null ? null : Double.valueOf(indv.getThmonthPersonal()));
						gsgs.setCumZljy(indv.getCumZljy() == null ? null : Double.valueOf(indv.getCumZljy()));
						gsgs.setCumZfdklx(indv.getCumZfdklx() == null ? null : Double.valueOf(indv.getCumZfdklx()));
						gsgs.setCumZfzj(indv.getCumZfzj() == null ? null : Double.valueOf(indv.getCumZfzj()));
						gsgs.setCumSylr(indv.getCumSylr() == null ? null : Double.valueOf(indv.getCumSylr()));
						gsgs.setCumJxjy(indv.getCumJxjy() == null ? null : Double.valueOf(indv.getCumJxjy()));
						gsgs.setCumZxfjkc(indv.getCumZxfjkc() == null ? null : Double.valueOf(indv.getCumZxfjkc()));
						gsgs.setTaxType(indv.getTaxType());
						gsgs.setCurrentIncome(indv.getCurrentIncome() == null ? null : Double.valueOf(indv.getCurrentIncome()));
						gsgs.setCurrentSpecialDeduction(indv.getCurrentSpecialDeduction() == null ? null : Double.valueOf(indv.getCurrentSpecialDeduction()));
						gsgs.setCumSre(indv.getCumSre() == null ? null : Double.valueOf(indv.getCumSre()));
						gsgs.setCumJcfy(indv.getCumJcfy() == null ? null : Double.valueOf(indv.getCumJcfy()));
						gsgs.setCumZxkc(indv.getCumZxkc() == null ? null : Double.valueOf(indv.getCumZxkc()));
						gsgs.setCumQtkc(indv.getCumQtkc() == null ? null : Double.valueOf(indv.getCumQtkc()));
						gsgs.setCumYnssde(indv.getCumYnssde() == null ? null : Double.valueOf(indv.getCumYnssde()));
						gsgs.setTaxRate(indv.getTaxRate() == null ? null : Double.valueOf(indv.getTaxRate()));
						gsgs.setQuickCalculationDeduction(indv.getQuickCalculationDeduction() == null ? null : Double.valueOf(indv.getQuickCalculationDeduction()));
						gsgs.setCumYnse(indv.getCumYnse() == null ? null : Double.valueOf(indv.getCumYnse()));
						gsgs.setCumYyjse(indv.getCumYyjse() == null ? null : Double.valueOf(indv.getCumYyjse()));
						gsgs.setCumYbtse(indv.getCumYbtse() == null ? null : Double.valueOf(indv.getCumYbtse()));
						gsgs.setQyid(ygl.getOrgCode());
						gsgs.insert();
						toinsert++;
					}else {
						XcglAssoGsjsmx gsgs = XcglAssoGsjsmx.builder().build();
						gsgs.setUserNum(String.valueOf(ygl.getEmpNum()));
						gsgs.setUserName(indv.getUserName());
						gsgs.setSalaryMonth(indv.getSalaryMonth());
						gsgs.setTaxMonth(taxmonth);//税款所属月份
						gsgs.setThmonthPersonal(indv.getThmonthPersonal() == null ? null : Double.valueOf(indv.getThmonthPersonal()));
						gsgs.setCumZljy(indv.getCumZljy() == null ? null : Double.valueOf(indv.getCumZljy()));
						gsgs.setCumZfdklx(indv.getCumZfdklx() == null ? null : Double.valueOf(indv.getCumZfdklx()));
						gsgs.setCumZfzj(indv.getCumZfzj() == null ? null : Double.valueOf(indv.getCumZfzj()));
						gsgs.setCumSylr(indv.getCumSylr() == null ? null : Double.valueOf(indv.getCumSylr()));
						gsgs.setCumJxjy(indv.getCumJxjy() == null ? null : Double.valueOf(indv.getCumJxjy()));
						gsgs.setCumZxfjkc(indv.getCumZxfjkc() == null ? null : Double.valueOf(indv.getCumZxfjkc()));
						gsgs.setTaxType(indv.getTaxType());
						gsgs.setCurrentIncome(indv.getCurrentIncome() == null ? null : Double.valueOf(indv.getCurrentIncome()));
						gsgs.setCurrentSpecialDeduction(indv.getCurrentSpecialDeduction() == null ? null : Double.valueOf(indv.getCurrentSpecialDeduction()));
						gsgs.setCumSre(indv.getCumSre() == null ? null : Double.valueOf(indv.getCumSre()));
						gsgs.setCumJcfy(indv.getCumJcfy() == null ? null : Double.valueOf(indv.getCumJcfy()));
						gsgs.setCumZxkc(indv.getCumZxkc() == null ? null : Double.valueOf(indv.getCumZxkc()));
						gsgs.setCumQtkc(indv.getCumQtkc() == null ? null : Double.valueOf(indv.getCumQtkc()));
						gsgs.setCumYnssde(indv.getCumYnssde() == null ? null : Double.valueOf(indv.getCumYnssde()));
						gsgs.setTaxRate(indv.getTaxRate() == null ? null : Double.valueOf(indv.getTaxRate()));
						gsgs.setQuickCalculationDeduction(indv.getQuickCalculationDeduction() == null ? null : Double.valueOf(indv.getQuickCalculationDeduction()));
						gsgs.setCumYnse(indv.getCumYnse() == null ? null : Double.valueOf(indv.getCumYnse()));
						gsgs.setCumYyjse(indv.getCumYyjse() == null ? null : Double.valueOf(indv.getCumYyjse()));
						gsgs.setCumYbtse(indv.getCumYbtse() == null ? null : Double.valueOf(indv.getCumYbtse()));
						gsgs.setQyid(ygl.getOrgCode());
						gsgs.setId(gsjs.getId());
						gsgs.updateById();
						toupdate++;
					}
				}else {
					failure++;
					map.put("name", userName);
					map.put("msg", "员工不存在");
				}
			} catch (Exception e) {
				failure++;
				map.put("name", userName);
				map.put("msg", StringUtils.isBlank(e.getMessage()) ? "必填数据出现空值" : e.getMessage());
			}finally {
				reasons.add(map);
			}
		}
		
		ImportDescriptionDto imds = new ImportDescriptionDto();
		imds.setSuccess(toinsert + toupdate);//成功
		imds.setToinsert(toinsert);
		imds.setToupdate(toupdate);//更新
		imds.setFailure(failure);//失败
		imds.setReasons(reasons);
		
		return ResultUtil.data(imds,"导入个税明细");
	}
	
	
	@Autowired
	private XcglAssoGsjsmxMapper xcglassogsjsmxmapper;
	
	/**
	 * 	查询列表-获取个税明细数据-分页
	 */
	@PostMapping(value = "/individual_income_details")
	@ApiOperation(value = "获取个税明细数据-分页", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> IndividualIncomeDetails(@CurrentUser UserBean userBean, @RequestBody SearchSalariedPeopleDto search) {
			IPage<XcglAssoGsjsmxDto> page = new Page<XcglAssoGsjsmxDto>(
			search.getCurrentPage() == null ? 1 : search.getCurrentPage(),
			search.getTotalPage() == null ? 10 : search.getTotalPage());
			
			search.setOrgcode(userBean.getOrgCode());

			page.setTotal(xcglassogsjsmxmapper.listPageCount(search));
			List<XcglAssoGsjsmxDto> listAs = xcglassogsjsmxmapper.listPage(search);
			
			return ResultUtil.data(page, listAs, "操作成功!");
	}

	/**
	 * 	查询列表-获取个税明细数据
	 */
	@PostMapping(value = "/individual_income_details_all")
	@ApiOperation(value = "获取个税明细数据", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> IndividualIncomeDetailsAll(@CurrentUser UserBean userBean, @RequestBody SearchSalariedPeopleDto search) {
		search.setOrgcode(userBean.getOrgCode());
		List<XcglAssoGsjsmxDto> listAs = xcglassogsjsmxmapper.SelectIndividualincomedetailsAll(search);
		return ResultUtil.data(listAs, "操作成功!");
	}
	
	
	@GetMapping(value="/allyearround/{year}/{usernum}")
	@ApiOperation(value = "获取全年信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> AllyearroundList(@CurrentUser UserBean userBean,@PathVariable("year") String year,@PathVariable("usernum") String usernum) {
		
		List<XcglAssoGsjsmx> allyearround = xcglassogsjsmxmapper.Allyearround(year, usernum, userBean.getOrgCode());
		
		return ResultUtil.data(allyearround,"操作成功!");
	}
	
	@GetMapping(value="/justone/{id}")
	@ApiOperation(value = "获取单个信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> justone(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		
		XcglAssoGsjsmx allyearround = XcglAssoGsjsmx.builder().id(id).build().selectById();
		
		return ResultUtil.data(allyearround,"操作成功!");
	}
	
	@PostMapping(value = "/modifyindividualincometaxdetails")
	@ApiOperation(value = "修改个税明细", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> ModifyIndividualIncomeTaxDetails(@CurrentUser UserBean userBean, @RequestBody XcglAssoGsjsmx xcglassogsjsmx) {
		
		xcglassogsjsmx.updateById();
		
		return ResultUtil.data(xcglassogsjsmx,"操作成功!");
	}
	
	/**
	 * 	新增或编辑
	 */
	@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);
	}

	@PostMapping(value = "/saveSalaryDetails")
	@ApiOperation(value = "保存薪资明细修改", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult saveSalaryDetails(@CurrentUser UserBean userBean,@RequestBody List<XcglAssoXzb> list) {
		xcglassoxzbmapper.updateBatchXzxjg(list);
		
		XcglAssoGztzt gzt = XcglAssoGztzt.builder().build().selectOne(new QueryWrapper<XcglAssoGztzt>().lambda().eq(XcglAssoGztzt::getUserid, list.get(0).getUserid()).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode())
				.eq(XcglAssoGztzt::getXzyf, list.get(0).getXzyf()));
		if(gzt != null) {
			XcglAssoXzb paycol = xcglassoxzbmapper.PayInColumn(list.get(0).getXzxid(), list.get(0).getUserid(), list.get(0).getXzyf());
			
			XcglAssoGztzt.builder().sfgz(paycol.getXzxjg()).id(gzt.getId()).build().updateById();
		}
		
		return new ResponseResult().success("保存成功");
	}

	@PostMapping(value = "/sendpayslip/{id}/{fsType}")
	@ApiOperation(value = "发送工资条--操作", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult sendpayslip(@CurrentUser UserBean userBean, @PathVariable Integer id, @PathVariable Integer fsType) {
		xcglassogztztmapper.payslipSend(id, fsType);
		return new ResponseResult().success("成功");
	}

	@PostMapping(value = "/sendpayslipBatch")
	@ApiOperation(value = "发送工资条--一键发送", httpMethod = "POST", notes = "接口发布说明")
	public ResponseResult sendpayslipBatch(@CurrentUser UserBean userBean, @RequestBody SendpayslipBatchDto dto) {
		xcglassogztztmapper.payslipSendBatch(dto);
		return new ResponseResult().success("成功");
	}
	
	
	/***************************APP*************************************************/
	
	@GetMapping(value="/wageconfirmation/{id}")
	@ApiOperation(value = "工资确认", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> WageConfirmation(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		XcglAssoGztzt.builder().qrType(1).id(id).build().updateById();
		return ResultUtil.success("成功");
	}
	
	
	
	
	@PostMapping(value="/appacquisition")
	@ApiOperation(value = "APP获取工资前期预备数据", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> AppAcquisition(@CurrentUser UserBean userBean,@RequestBody APPPayslipPeriodDto apppays) {
		PushPayslipDto pays = new PushPayslipDto();
		
		XcglAssoGztzt gzt = XcglAssoGztzt.builder().build().selectOne(new QueryWrapper<XcglAssoGztzt>().lambda().eq(XcglAssoGztzt::getUserid, apppays.getUserid())
				.eq(XcglAssoGztzt::getXzyf, apppays.getXzyf()).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode()));
		if(gzt != null) {
			pays.setGztid(gzt.getId());
			pays.setXzzid(gzt.getXzzid());
			pays.setUserid(gzt.getUserid());
			pays.setXzyf(gzt.getXzyf());
		}else {
			pays.setGztid(0);
			pays.setXzzid(0);
			pays.setUserid(0);
			pays.setXzyf("");
		}
		
		return ResultUtil.data(pays,"操作成功!");
	}
	
	@Autowired
	private KqglAssoRelationSummaryMapper kqglassorelationsummarymapper;
	
	@Autowired
	private KqglAssoDkjlMapper kqglassodkjlmapper;
	
	@PostMapping(value = "/pushpayslip")
	@ApiOperation(value = "发送工资条", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> PushPayslip(@CurrentUser UserBean userBean,@RequestBody APPPayslipPeriodDto apppays) {
		
		PushPayslipDto pays = new PushPayslipDto();
		
		XcglAssoGztzt gzt = XcglAssoGztzt.builder().build().selectOne(new QueryWrapper<XcglAssoGztzt>().lambda().eq(XcglAssoGztzt::getUserid, apppays.getUserid())
				.eq(XcglAssoGztzt::getXzyf, apppays.getXzyf()).eq(XcglAssoGztzt::getQyid, userBean.getOrgCode()));
		if(gzt != null) {
			pays.setGztid(gzt.getId());
			pays.setXzzid(gzt.getXzzid());
			pays.setUserid(gzt.getUserid());
			pays.setXzyf(gzt.getXzyf());
		}
		
		
		String strY = new SimpleDateFormat("yyyy").format(new Date());
//		double prescription = 8;
		//顶层
		AppPayslipDetailsDto top = new AppPayslipDetailsDto();
		//工资条数据
//		XcglAssoGztzt gzt = XcglAssoGztzt.builder().id(pays.getGztid()).build().selectById();
		if(gzt != null && gzt.getFsType() == 1) {//已发送的工资条
			top.setId(gzt.getId());
			top.setNetsalary(gzt.getSfgz());//实发工资
			top.setWagetime(gzt.getXzyf());//工资时间
			top.setUserid(gzt.getUserid());
			top.setSfyqrgz(gzt.getQrType());
			//薪资组里项
			List<XcglAssoJsgzzx> jsgs = XcglAssoJsgzzx.builder().build().selectList(new QueryWrapper<XcglAssoJsgzzx>().lambda().eq(XcglAssoJsgzzx::getXzzid, pays.getXzzid()).eq(XcglAssoJsgzzx::getType, 2)
					.orderByAsc(XcglAssoJsgzzx::getId));
			//第一层集合
			List<AppPaysSalaryOneDto> specific = new ArrayList<AppPaysSalaryOneDto>();
			
			for(XcglAssoJsgzzx xzx : jsgs) {
				//第二层集合
				List<AppPaysSalaryTwoDto> detailed = new ArrayList<AppPaysSalaryTwoDto>();
				
				//第一层
				AppPaysSalaryOneDto spe = new AppPaysSalaryOneDto();
				
				XcglAssoXzb xzb = XcglAssoXzb.builder().build().selectOne(new QueryWrapper<XcglAssoXzb>().lambda().eq(XcglAssoXzb::getUserid, pays.getUserid()).eq(XcglAssoXzb::getXzyf, pays.getXzyf())
						.eq(XcglAssoXzb::getXzxid, xzx.getId()));
				//事假扣款、病假扣款、旷工扣款、迟到早退扣款、司龄工资、个税
				if(xzx.getOptionid() != 27 && xzx.getOptionid() != 28 && xzx.getOptionid() != 29 && xzx.getOptionid() != 30 && xzx.getOptionid() != 31  && xzx.getOptionid() != 69) {
					spe.setItemname(xzx.getSalaryitem());//
					spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//
					spe.setFieldone("");
					spe.setFieldtwo("");
					spe.setDetailed(detailed);
					specific.add(spe);
				}else {
					//事假扣款
					if(xzx.getOptionid() == 27) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//扣款金额
						
						if(xzx.getGsid() == 3) {//天数
							HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(userBean.getOrgCode(), pays.getXzyf(), 1, pays.getUserid()); 
							double ts = 0;
							if(balance.getBalance() > 0) {
								ts = balance.getBalance()/prescription;
							}
							spe.setFieldone("共"+balance.getBalance()+"小时="+SalaryTool.formatDouble_(ts)+"天");
						}else if(xzx.getGsid() == 4) {//次数
							HolidayInquiryDto balance = xcglassoxzbmapper.HolidayamountNum(userBean.getOrgCode(), pays.getXzyf(), 1, pays.getUserid()); 
							spe.setFieldone("共"+balance.getNum()+"次");
						}
						
						spe.setFieldtwo("");
						//事假详细
						List<KqglAssoRelationSummary> holdet = kqglassorelationsummarymapper.HolidayDetails(userBean.getOrgCode(), pays.getXzyf(), 1, pays.getUserid());
						for(KqglAssoRelationSummary sjxx : holdet) {
							AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
							two.setTerm("事假日期");
							two.setSpecifictime(sjxx.getStartTime().substring(5, 16)+"至"+sjxx.getEndTime().substring(5, 16));
							two.setField(sjxx.getDuration());
							detailed.add(two);
						}
						
						spe.setDetailed(detailed);
					}
					//病假扣款
					if(xzx.getOptionid() == 28) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//
						
						if(xzx.getGsid() == 5) {//天数
							HolidayInquiryDto balance = xcglassoxzbmapper.Holidayamount(userBean.getOrgCode(), pays.getXzyf(), 3, pays.getUserid()); 
							double ts = 0;
							if(balance.getBalance() > 0) {
								ts = balance.getBalance()/prescription;
							}
							spe.setFieldone("共"+balance.getBalance()+"小时="+SalaryTool.formatDouble_(ts)+"天");
						}else if(xzx.getGsid() == 6) {//次数
							HolidayInquiryDto balance = xcglassoxzbmapper.HolidayamountNum(userBean.getOrgCode(), pays.getXzyf(), 3, pays.getUserid()); 
							spe.setFieldone("共"+balance.getNum()+"次");
						}
						
						spe.setFieldtwo("");
						//病假详细
						List<KqglAssoRelationSummary> holdet = kqglassorelationsummarymapper.HolidayDetails(userBean.getOrgCode(), pays.getXzyf(), 3, pays.getUserid());
						for(KqglAssoRelationSummary sjxx : holdet) {
							AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
							two.setTerm("病假日期");
							two.setSpecifictime(sjxx.getStartTime().substring(5, 16)+"至"+sjxx.getEndTime().substring(5, 16));
							two.setField(sjxx.getDuration());
							detailed.add(two);
						}
						spe.setDetailed(detailed);
					}
					//旷工扣款
					if(xzx.getOptionid() == 29) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//
						
						KqglAssoMonthPunchSummary kgts = KqglAssoMonthPunchSummary.builder().build().selectOne(new QueryWrapper<KqglAssoMonthPunchSummary>().lambda().eq(KqglAssoMonthPunchSummary::getNum, pays.getUserid())
								.eq(KqglAssoMonthPunchSummary::getOrgCode, userBean.getOrgCode()).eq(KqglAssoMonthPunchSummary::getBelongYear, pays.getXzyf().substring(0, 4)).eq(KqglAssoMonthPunchSummary::getBelongMonth, pays.getXzyf().substring(5, 7)));
						if(xzx.getGsid() == 7) {//天数
							spe.setFieldone("共"+kgts == null ? "0" : String.valueOf(kgts.getAbsenteeismDays())+"天");
						}else if(xzx.getGsid() == 8) {
							spe.setFieldone("共"+kgts == null ? "0" : String.valueOf(kgts.getAbsenteeismDays())+"次");
						}
						spe.setFieldtwo("");
						
						com.alibaba.fastjson.JSONObject jo= (com.alibaba.fastjson.JSONObject) com.alibaba.fastjson.JSONObject.toJSON(kgts); 
						//旷工具体天数
						for(String str:jo.keySet()){
							if(jo.get(str).equals("旷工") && str.contains("day")) {
								AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
								two.setTerm("旷工日期");
								String rq = str.substring(str.indexOf("y")+1);
								int qq = Integer.valueOf(str.substring(str.indexOf("y")+1));
								if(qq <= 9) {
									rq = "0"+qq;
								}
								two.setSpecifictime(pays.getXzyf().substring(5, 7)+"-"+rq);
								two.setField(0.0);
								detailed.add(two);
							}
						}
						spe.setDetailed(detailed);
					}
					//迟到早退扣款
					if(xzx.getOptionid() == 30) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//扣款金额
						
						if(xzx.getGsid() == 1) {//次数
							HolidayInquiryDto cdcs = kqglassodkjlmapper.TimesBeingLateLeavingEarly(userBean.getOrgCode(), pays.getUserid(), 1, pays.getXzyf().substring(2, 7));
							HolidayInquiryDto ztcs = kqglassodkjlmapper.TimesBeingLateLeavingEarly(userBean.getOrgCode(), pays.getUserid(), 2, pays.getXzyf().substring(2, 7));
							
							spe.setFieldone("迟到"+cdcs.getNum()+"次");//迟到
							spe.setFieldtwo("早退"+ztcs.getNum()+"次");//早退
						}else if(xzx.getGsid() == 2) {//分钟
							HolidayInquiryDto cdfz = kqglassodkjlmapper.MinutesLateLeaveEarly(userBean.getOrgCode(), pays.getUserid(), 1, pays.getXzyf().substring(2, 7));
							HolidayInquiryDto ztfz = kqglassodkjlmapper.MinutesLateLeaveEarly(userBean.getOrgCode(), pays.getUserid(), 2, pays.getXzyf().substring(2, 7));
							
							spe.setFieldone("迟到"+cdfz.getBalance()+"分钟");//迟到
							spe.setFieldtwo("早退"+ztfz.getBalance()+"分钟");//早退
						}
						
						List<KqglAssoDkjl> cdzts = kqglassodkjlmapper.LateleaveEarly(userBean.getOrgCode(), pays.getUserid(), pays.getXzyf().substring(2, 7));
						for(KqglAssoDkjl cz : cdzts) {
							AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
							if(cz.getType() == 1) {//上班
								two.setTerm("迟到日期");
							}else if(cz.getType() == 2) {//下班
								two.setTerm("早退日期");
							}
							two.setSpecifictime(ClockInTool.stampToDate5(String.valueOf(cz.getDktime())));
							two.setField(Double.valueOf(String.valueOf(cz.getResults())));
							detailed.add(two);
						}
						
						spe.setDetailed(detailed);
					}
					
					//司龄工资
					if(xzx.getOptionid() == 31) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//
						spe.setFieldone("");
						spe.setFieldtwo("");
						YgglMainEmp xzrz = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getEmpNum, pays.getUserid()).eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()));
						String entry_date = ClockInTool.SunNovCSTYMD(xzrz.getRzTime());//yyyyMMdd
						int jssl = Integer.valueOf(ClockInTool.SunNovCSTY(xzrz.getRzTime()));//yyyy
						double slage = 0;
						if(Integer.valueOf(strY) - jssl >= 0) {
							slage = Integer.valueOf(strY) - jssl;
						}
						AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
						two.setTerm("入职日期");
						two.setSpecifictime(entry_date);
						two.setField(slage);
						detailed.add(two);
						spe.setDetailed(detailed);
					}
					
					//个税
					if(xzx.getOptionid() == 69) {
						spe.setItemname(xzx.getSalaryitem());//
						spe.setDeduction(xzb == null ? 0 : xzb.getXzxjg());//
						spe.setFieldone("");
						spe.setFieldtwo("");
						String[] remarks = {"本月个税","税款所属月份","累计专项附加扣除","本期收入","本期专项扣除","累计收入额","累计减除费用","累计专项扣除","累计其他扣除","累计应纳税所得额","税率","速算扣除数","累计应纳税额","累计已预缴税额","累计应补(退)税额"};
						String[] field = {"thmonth_personal","tax_month","cum_zxfjkc","current_income","current_special_deduction","cum_sre","cum_jcfy","cum_zxkc","cum_qtkc","cum_ynssde","tax_rate","quick_calculation_deduction","cum_ynse","cum_yyjse","cum_ybtse"};
						//个税详情
						for(int i=0;i<remarks.length;i++) {
							AppPaysSalaryTwoDto two = new AppPaysSalaryTwoDto();
							two.setTerm(remarks[i]);
							
							QueryWrapper<XcglAssoGsjsmx> queryWrapper = new QueryWrapper<>();
							queryWrapper.select(field[i]).eq("user_num", pays.getUserid()).eq("salary_month", pays.getXzyf()).eq("qyid", userBean.getOrgCode());
							List<Map<String, Object>> list = xcglassogsjsmxmapper.selectMaps(queryWrapper);
							String autacq = "";
							if(list != null) {
					        	for(Map<String, Object> aut:list) {
					        		if(aut != null) {
					        			autacq = aut.toString().substring(aut.toString().indexOf("=")+1).replace("}", "");
					        		}
					        	}
					        }
							two.setSpecifictime(("").equals(autacq) ? "0" : autacq);
							two.setField(0.0);
							detailed.add(two);
						}
						spe.setDetailed(detailed);
					}
					specific.add(spe);
				}
				top.setSpecific(specific);
			}
			
		}
		return ResultUtil.data(top,"操作成功!");
	}
}