package com.engine.kq.biz;

import com.engine.kq.cmd.hrmAttProcSet.KqTempletEnum;
import com.engine.kq.log.KQLog;
import com.engine.kq.wfset.attendance.manager.HrmAttProcSetManager;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import weaver.common.DateUtil;
import weaver.common.StringUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.hrm.attendance.domain.HrmPaidLeaveTime;
import weaver.hrm.attendance.manager.HrmPaidLeaveTimeManager;
import weaver.hrm.company.DepartmentComInfo;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.moduledetach.ManageDetachComInfo;
import weaver.hrm.resource.ResourceComInfo;
import weaver.systeminfo.SystemEnv;
import weaver.workflow.action.WorkflowActionManager;
import weaver.workflow.workflow.WorkflowBillComInfo;

/**
 * E9新考勤 兼容升级E8考勤数据
 */
public class KQOneStopUp {

  public String separator = "#";
  public static KQLog kqLog = new KQLog();

  /**
   * 根据新版考勤的请假类型更新旧版本的考勤请假类型
   */
  public void upFlowLeaveType() {
    WorkflowBillComInfo workflowBillComInfo = new WorkflowBillComInfo();
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    String sql = "select * from hrm_att_proc_set where field006=0 ";
    Map<String,String> tableMap = new HashMap<>();
    rs.executeQuery(sql);
    while(rs.next()){
      String setid = rs.getString("id");
      String formid = rs.getString("field002");
      String tablename = workflowBillComInfo.getTablename(formid);
      String fieldnameSql = " select * from hrm_att_proc_relation where field002 in(select id from hrm_att_proc_fields where field001 = 180 and field002='newLeaveType') and field001 = "+setid;
      String fieldname = "";
      rs1.executeQuery(fieldnameSql);
      if(rs1.next()){
        fieldname = rs1.getString("field004");
      }
      if(tablename.length() > 0 && fieldname.length() > 0){
        tableMap.put(tablename, fieldname);
      }
    }
    List<String> updateSqls = new ArrayList<>();
    String leavetypeSql = "select * from  hrm_to_kq_LeaveRules ";
    rs2.executeQuery(leavetypeSql);
    while(rs2.next()){
      String hrmleaveid = rs2.getString("hrmleaveid");
      String kqleaveid = rs2.getString("kqleaveid");
      for(Map.Entry<String,String> me: tableMap.entrySet()){
        String upSql = "update "+me.getKey()+" set "+me.getValue()+" = " +kqleaveid+ " where "+me.getValue()+"="+hrmleaveid;
        updateSqls.add(upSql);
      }
    }
    for(String upSql : updateSqls){
      rs.executeUpdate(upSql);
    }

  }

  /**
   * 在流程數據拆分前，需要初始化出差规则、公出规则和加班规则
   * @return
   */
  public boolean upFLowRule() {
    boolean isDone = false;
    isDone = upEvectionRule();
    if(!isDone){
      return isDone;
    }
    isDone = upOutRule();
    if(!isDone){
      return isDone;
    }
    isDone = upOvertimeRuleUnit();
    if(!isDone){
      return isDone;
    }
    isDone = upOvertimeRule("",null,"");
    if(!isDone){
      return isDone;
    }
    return isDone;
  }

  /**
   * 初始化加班规则单位
   * @return
   */
  public boolean upOvertimeRuleUnit() {

    int id = 1;////暂为备用字段，加班单位ID，固定为1
    int organizationType = 0;//暂为备用字段，所属机构类型：0-总部、1-分部、2-部门
    int organizationId = -1;//暂为备用字段，所属机构的ID（机构类型为分部时为分部ID）
    int minimumUnit = 1;//最小加班单位：1-按天加班、2-按半天加班、3-按小时加班、4-按整天加班
    double hoursToday = 8.00;//日折算时长

    boolean flag = true;
    String sql = "update kq_OvertimeUnit set minimumUnit=?,hoursToday=? where id=?";
    RecordSet recordSet = new RecordSet();
    flag = recordSet.executeUpdate(sql, minimumUnit, hoursToday, id);
    return flag;
  }

  /**
   * 升级初始化加班规则
   */
  public boolean upOvertimeRule(String groupids, User user,String rulefrom) {
    RecordSet rs = new RecordSet();
    if(groupids.length() > 0){
      groupids = groupids.substring(1);
      Map<String, Object> params = new HashMap<>();
      if("scheduleset".equalsIgnoreCase(rulefrom)){
        params.put("name", "一般工作时间升级加班规则");
      }else{
        params.put("name", "排班升级加班规则");
      }
      params.put("groupIds", groupids);
      params.put("minimumLen2", "1");
      params.put("startTime2", "0");
      params.put("minimumLen3", "1");
      params.put("minimumLen1", "1");

      params.put("paidLeaveEnableType2", "2");
      params.put("paidLeaveEnableType3", "2");
      params.put("paidLeaveEnableType1", "2");
      params.put("paidLeaveEnableFlowType2", "1");
      params.put("paidLeaveEnableFlowType3", "1");
      params.put("paidLeaveEnableFlowType1", "1");
      int ruleId = KQOvertimeRulesBiz.addOvertimeRules(params, user);
      if(ruleId > 0){
        String overRuleSql = "insert into hrm_to_kq_OverRules(kqid,rulefrom) values(?,?)";
        return rs.executeUpdate(overRuleSql, ruleId,rulefrom);
      }else{
        kqLog.info("upOvertimeRule 生成加班规则失败 ："+params);
        return false;
      }
    }else{
      kqLog.info("upOvertimeRule 生成加班规则失败 ：groupids为空");
      return false;
    }
  }

  /**
   * 升级初始化公出规则
   */
  public boolean upOutRule() {
    RecordSet recordSet = new RecordSet();
    String exit_ruleId = "1";//暂为备用字段，规则ID，固定为1
    String exit_name = "出差";//暂为备用字段，规则名称，目前固定为出差
    int exit_organizationType = 0;//暂为备用字段，所属机构类型：0-总部、1-分部、2-部门
    int exit_organizationId = 0;//暂为备用字段，所属机构的ID（机构类型为分部时为分部ID）
    int exit_minimumUnit = 1;//最小公出单位：1-按天公出、2-按半天公出、3-按小时公出、4-按整天公出
    double exit_proportion = 8.00;//换算比例(当单位由天、半天、整天切换成小时或者由小时切换成天、半天、整天时，历史数据的转换比例)
    int exit_computingMode = 1;//计算公出时长方式：1-按工作日计算公出时长、2-按自然日计算公出时长
    double exit_hoursToDay = 8.00;//日折算时长(当按天公出、按半天公出且按自然日计算公出时长时有效)

    String sql = "update kq_exitRules set minimumUnit=?,proportion=?,computingMode=?,hoursToDay=? where id=?";
    boolean flag = recordSet.executeUpdate(sql, exit_minimumUnit, exit_proportion, exit_computingMode, exit_hoursToDay, exit_ruleId);

    return flag;
  }

  /**
   * 升级初始化出差规则
   */
  public boolean upEvectionRule() {
    String ruleId = "1";//暂为备用字段，规则ID，固定为1
    String name = "出差";//暂为备用字段，规则名称，目前固定为出差
    int organizationType = 0;//暂为备用字段，所属机构类型：0-总部、1-分部、2-部门
    int organizationId = 0;//暂为备用字段，所属机构的ID（机构类型为分部时为分部ID）
    int minimumUnit = 1;//最小出差单位：1-按天出差、2-按半天出差、3-按小时出差、4-按整天出差
    double proportion = 8.00;//换算比例(当单位由天、半天、整天切换成小时或者由小时切换成天、半天、整天时，历史数据的转换比例)
    int computingMode = 1;//计算公出时长方式：1-按工作日计算出差时长、2-按自然日计算出差时长
    double hoursToDay = 8.00;//折算时长(当按天出差、按半天出差且按自然日计算出差时长时有效)

    boolean flag = true;
    String sql = "update kq_travelRules set minimumUnit=?,proportion=?,computingMode=?,hoursToDay=? where id=?";
    RecordSet recordSet = new RecordSet();
    flag = recordSet.executeUpdate(sql, minimumUnit, proportion, computingMode, hoursToDay, ruleId);

    return flag;
  }

  /**
   * 所有相關的緩存需要刷新下
   */
  public void refreshCominfo() {

    try{
      SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo();
      subCompanyComInfo.removeCompanyCache();
      DepartmentComInfo departmentComInfo = new DepartmentComInfo();
      departmentComInfo.removeCompanyCache();
      ResourceComInfo resourceComInfo = new ResourceComInfo();
      resourceComInfo.removeResourceCache();
    }catch (Exception e){
    }
    KQAttFlowSetComInfo kqAttFlowSetComInfo = new KQAttFlowSetComInfo();
    KQShiftManagementComInfo kqShiftManagementComInfo = new KQShiftManagementComInfo();
    KQShiftOnOffWorkSectionComInfo onOffWorkSectionComInfo = new KQShiftOnOffWorkSectionComInfo();
    KQShiftRestTimeSectionComInfo restTimeSectionComInfo = new KQShiftRestTimeSectionComInfo();
    KQGroupMemberComInfo groupMemberComInfo = new KQGroupMemberComInfo();
    KQFixedSchedulceComInfo kqFixedSchedulceComInfo = new KQFixedSchedulceComInfo();
    KQShiftScheduleComInfo kqShiftScheduleComInfo = new KQShiftScheduleComInfo();
    KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo();
    KQHolidaySetComInfo holidaySetComInfo = new KQHolidaySetComInfo();
    KQTravelRulesComInfo travelRulesComInfo = new KQTravelRulesComInfo();
    KQExitRulesComInfo exitRulesComInfo = new KQExitRulesComInfo();
    KQLeaveRulesDetailComInfo rulesDetailComInfo = new KQLeaveRulesDetailComInfo();
    KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();

    kqShiftManagementComInfo.removeShiftManagementCache();
    onOffWorkSectionComInfo.removeShiftWorkSectionCache();
    restTimeSectionComInfo.removeShiftRestTimeSectionCache();
    groupMemberComInfo.removeCache();
    kqFixedSchedulceComInfo.removeCache();
    kqShiftScheduleComInfo.removeCache();
    kqLeaveRulesComInfo.removeCache();
    holidaySetComInfo.removeCache();
    travelRulesComInfo.removeCache();
    exitRulesComInfo.removeCache();
    kqAttFlowSetComInfo.removeKQAttFlowSetComInfoCache();
    kqLeaveRulesComInfo.removeCache();
    rulesDetailComInfo.removeCache();
    kqGroupComInfo.removeCache();
  }

  public void upReportData(String startdate,String enddate) {
    KQFormatData kqFormatData = new KQFormatData();
    LocalDate localFromDate = LocalDate.parse(startdate);
    LocalDate localToDate = LocalDate.parse(enddate);
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
    for (int i = 0; i <= betweenDays; i++) {
      LocalDate curLocalDate = localFromDate.plusDays(i);
      String kqDate = curLocalDate.format(dateFormatter);
      new KQFormatBiz().formatDateByKQDate(kqDate);
    }
  }

  /**
   * 升級流程數據  對流程數據進行拆分
   * @param startdate
   * @param enddate
   * @return
   */
  public void upFlowData(String startdate,String enddate) {

    try{
      RecordSet rs = new RecordSet();
      KQFlowActiontBiz kqFlowActiontBiz = new KQFlowActiontBiz();

      String sql1 = " select * from kq_ATT_PROC_SET where id in(select kqid from hrm_to_attSet)  ";
      rs.executeQuery(sql1);
      while(rs.next()){
        String proc_set_id = rs.getString("id");
        //得到这个考勤流程设置是否使用明细
        String usedetails = rs.getString("usedetail");

        String workflowid = rs.getString("field001");

        int kqtype = Util.getIntValue(rs.getString("field006"));
        String valueWhere = " and ( fromDate between '"+startdate+"' and '"+enddate+"' or toDate between '"+startdate+"' and '"+enddate+"' "
          + " or '"+startdate+"' between fromDate and toDate or '"+enddate+"' between fromDate and toDate) ";

        Map<String, String> map = new HashMap<String, String>();
        if(kqtype != 5 && kqtype != 6 && kqtype != 7){
          map.put("fromDate", valueWhere);
          map.put("currentNodeType", " and currentNodeType = '3' ");
        }

        Map<String,String> result = kqFlowActiontBiz.handleKQFlowAction(proc_set_id, usedetails, 0, kqtype, Util.getIntValue(workflowid), false,true,map);

        if(!result.isEmpty()){
          String error = Util.null2String(result.get("message"));
          kqLog.info("升级考勤流程拆分："+error);
          continue;
        }

      }

    }catch (Exception e){
      e.printStackTrace();
    }

  }

  /**
   * 生成处理的sql
   * @param proc_set_id
   * @param usedetails
   * @param kqtype
   * @return
   */
  public Map<String,String> handleSql(String proc_set_id,String usedetails,int kqtype) {

    HrmAttProcSetManager hrmAttProcSetManager= new HrmAttProcSetManager();
    Map<String, String> map = new HashMap<String, String>();
    Map<String,String> sqlMap = new HashMap<>();
    sqlMap = hrmAttProcSetManager.getSQLByField006Map(kqtype, map, true, true, proc_set_id,usedetails);

    return sqlMap;
  }

  /**
   * 升级考勤流程设置
   */
  public boolean upAttSet() {

    boolean isDone = false;
    try{

      //1、考勤流程基本信息
      upAttProcSet();
      //2、新/老 考勤流程字段生成映射
      upAttProcField();
      //3、新考勤流程字段對應
      isDone  = upKQAttProcField();
      //4、考勤流程動作設置
      isDone  = upAttProcAction();
    }catch (Exception e){
      isDone = false;
      e.printStackTrace();
    }

    return isDone;
  }

  /**
   * 考勤流程動作設置對應
   */
  public boolean upAttProcAction() throws Exception{
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    RecordSet rs3 = new RecordSet();
    boolean isDone = false;

    //请假加班的先做一下
    String sql4 = "select a.*,b.field001 as workflowid,b.field006 as kqtype from hrm_ATT_PROC_ACTION a left join HRM_ATT_PROC_SET b on a.FIELD001=b.id where a.FIELD001 >0 and b.FIELD006 in (0,3) ";
    rs.executeQuery(sql4);
    while(rs.next()){
      String att_proc_action_id = rs.getString("id");
      String field001 = rs.getString("field001");
      String field002 = rs.getString("field002");
      String field003 = rs.getString("field003");
      String field004 = rs.getString("field004");
      String field005 = rs.getString("field005");
      String field006 = rs.getString("field006");
      String field007 = rs.getString("field007");
      String field008 = rs.getString("field008");
      String kqtype = rs.getString("kqtype");
      String workflowid = rs.getString("workflowid");
      long mfid =  UUID.randomUUID().getMostSignificantBits();

      String att_proc_set_id = "";
      String attsetIdSql = "select * from hrm_to_attSet where hrmid="+field001;
      rs2.executeQuery(attsetIdSql);
      if(rs2.next()){
        att_proc_set_id = Util.null2String(rs2.getString("kqid"));
      }
      if(att_proc_set_id.length() == 0){
        continue;
      }
      String actionname = "";
      switch (field002){
        case "deduction":
          actionname ="KqDeductionVacationAction";
          break;
        case "freeze":
          actionname ="KqFreezeVacationAction";
          break;
        case "release":
          actionname ="KqReleaseVacationAction";
          break;
        case "HrmScheduleShift":
          actionname ="KqSplitShiftAction";
          break;
        case "HrmPaidLeaveAction":
          actionname ="KqPaidLeaveAction";
          break;
        default:
          break;
      }

      if(actionname.length() > 0){
        String updateSql = "update kq_ATT_PROC_ACTION set field003=?,field004=?,field005=?,field006=?,field007=?,field008=? where field001=? and field002= ? ";
        isDone = rs1.executeUpdate(updateSql,field003,field004,field005,field006,field007,field008,att_proc_set_id,actionname);
        if(!isDone){
          break;
        }
        rs2.executeSql("delete from workflowactionset where workflowid = "+workflowid+" and interfaceid in ('"+actionname+"')");

        int preoperator = 0;
        if(StringUtil.parseToInt(field005) == 2){
          preoperator = 1;
        }
        String field003Name = SystemEnv.getHtmlLabelNames(field003,7);
        WorkflowActionManager workflowActionManager = new WorkflowActionManager();
        workflowActionManager.setActionid(0);
        workflowActionManager.setActionname(field003Name);
        workflowActionManager.setWorkflowid(StringUtil.parseToInt(workflowid));
        workflowActionManager.setNodeid(StringUtil.parseToInt(field006));
        workflowActionManager.setNodelinkid(0);
        workflowActionManager.setIspreoperator(preoperator);
        workflowActionManager.setActionorder(1);
        workflowActionManager.setInterfaceid(actionname);
        workflowActionManager.setInterfacetype(3);
        workflowActionManager.setIsused(1);
        if(field007.equalsIgnoreCase("1")){
          workflowActionManager.setDrawbackflag(1);
        }
        workflowActionManager.doSaveWsAction();
      }
      if(workflowid.length() > 0){
        String nodeid = "";
        String getNodeSql = "select * from workflow_flownode where workflowid = ? and nodetype=3 ";
        rs3.executeQuery(getNodeSql, workflowid);
        if(rs3.next()){
          nodeid = rs3.getString("nodeid");
          String updateSql = "update kq_ATT_PROC_ACTION set field005=?,field006=?,field007=?,field008=? where field001=? and field002= ? ";
          isDone = rs1.executeUpdate(updateSql,"2",nodeid,"1","1",att_proc_set_id,"KqSplitAction");

          int preoperator = 0;
          if(StringUtil.parseToInt(field005) == 2){
            preoperator = 1;
          }
          rs2.executeSql("delete from workflowactionset where workflowid = "+workflowid+" and interfaceid in ('KqSplitAction')");

          String field003Name = SystemEnv.getHtmlLabelName(81543,weaver.general.Util.getIntValue(7));
          WorkflowActionManager workflowActionManager = new WorkflowActionManager();
          workflowActionManager.setActionid(0);
          workflowActionManager.setActionname(field003Name);
          workflowActionManager.setWorkflowid(StringUtil.parseToInt(workflowid));
          workflowActionManager.setNodeid(StringUtil.parseToInt(nodeid));
          workflowActionManager.setNodelinkid(0);
          workflowActionManager.setIspreoperator(preoperator);
          workflowActionManager.setActionorder(1);
          workflowActionManager.setInterfaceid("KqSplitAction");
          workflowActionManager.setInterfacetype(3);
          workflowActionManager.setIsused(1);
          workflowActionManager.doSaveWsAction();
        }
      }
    }
    //再处理下出差，公出和异常流程的
    String sql_5 = "select * from  HRM_ATT_PROC_SET where FIELD006 in (1,2,4) ";
    rs.executeQuery(sql_5);
    while(rs.next()){
      String workflowid = rs.getString("field001");
      String attid = rs.getString("id");
      String att_proc_set_id = "";
      String attsetIdSql = "select * from hrm_to_attSet where hrmid="+attid;
      rs2.executeQuery(attsetIdSql);
      if(rs2.next()){
        att_proc_set_id = Util.null2String(rs2.getString("kqid"));
      }
      if(att_proc_set_id.length() == 0){
        continue;
      }
      if(workflowid.length() > 0){
        String nodeid = "";
        String getNodeSql = "select * from workflow_flownode where workflowid = ? and nodetype=3 ";
        rs3.executeQuery(getNodeSql, workflowid);
        if(rs3.next()){
          nodeid = rs3.getString("nodeid");
        }
        String updateSql = "update kq_ATT_PROC_ACTION set field005=?,field006=?,field007=?,field008=? where field001=? and field002= ? ";
        isDone = rs1.executeUpdate(updateSql,"2",nodeid,"1","1",att_proc_set_id,"KqSplitAction");

        rs2.executeSql("delete from workflowactionset where workflowid = "+workflowid+" and interfaceid in ('KqSplitAction')");

        String field003Name = SystemEnv.getHtmlLabelName(81543,weaver.general.Util.getIntValue(7));
        WorkflowActionManager workflowActionManager = new WorkflowActionManager();
        workflowActionManager.setActionid(0);
        workflowActionManager.setActionname(field003Name);
        workflowActionManager.setWorkflowid(StringUtil.parseToInt(workflowid));
        workflowActionManager.setNodeid(StringUtil.parseToInt(nodeid));
        workflowActionManager.setNodelinkid(0);
        workflowActionManager.setIspreoperator(1);
        workflowActionManager.setActionorder(1);
        workflowActionManager.setInterfaceid("KqSplitAction");
        workflowActionManager.setInterfacetype(3);
        workflowActionManager.setIsused(1);
        workflowActionManager.doSaveWsAction();
      }

    }

    return isDone;
  }

  /**
   * 新考勤流程字段對應
   */
  public boolean upKQAttProcField() throws Exception{
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    boolean isDone = false;

    String sql3 = "select * from hrm_ATT_PROC_RELATION ";
    rs.executeQuery(sql3);
    while(rs.next()){
      String att_proc_relation_id = rs.getString("id");
      String field001 = rs.getString("field001");
      String field002 = rs.getString("field002");
      String field003 = rs.getString("field003");
      String field004 = rs.getString("field004");
      long mfid =  UUID.randomUUID().getMostSignificantBits();
      String att_proc_set_id = "";
      String attsetIdSql = "select * from hrm_to_attSet where hrmid="+field001;
      rs2.executeQuery(attsetIdSql);
      if(rs2.next()){
        att_proc_set_id = Util.null2String(rs2.getString("kqid"));
      }
      String att_proc_field_id = "";
      String attfieldIdSql = "select * from hrm_to_attfield where hrmid="+field002;
      rs2.executeQuery(attfieldIdSql);
      if(rs2.next()){
        att_proc_field_id = Util.null2String(rs2.getString("kqid"));
      }

      if(att_proc_set_id.length() == 0 || att_proc_field_id.length() == 0){
        continue;
      }

      String insertSql = "insert into kq_ATT_PROC_RELATION(mfid,field001,field002,field003,field004) "
          + " values(?,?,?,?,?) ";
      isDone = rs1.executeUpdate(insertSql,mfid,att_proc_set_id,att_proc_field_id,field003,field004);
      if(!isDone){
        break;
      }
    }
    return isDone;
  }

  /**
   * 新/老 考勤流程字段生成映射
   */
  public void upAttProcField() throws Exception{
    Map<String,String> fieldMap = new HashMap<>();
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();

    String sql2 = "select * from HRM_ATT_PROC_FIELDS ";
    rs.executeQuery(sql2);
    while(rs.next()){
      String att_proc_field_id = rs.getString("id");
      String field001 = rs.getString("field001");
      String field002 = rs.getString("field002");
      if("leaveDays".equalsIgnoreCase(field002)){
        field002 = "duration";
      }
      if("tilldate".equalsIgnoreCase(field002)){
        field002 = "toDate";
      }
      if("tilltime".equalsIgnoreCase(field002)){
        field002 = "toTime";
      }
      if("overtimeDays".equalsIgnoreCase(field002)){
        field002 = "duration";
      }
      if("otype".equalsIgnoreCase(field002)){
        field002 = "overtime_type";
      }
      field001 = field001.toLowerCase();
      field002 = field002.toLowerCase();
      String key = field001+"_"+field002;
      fieldMap.put(key, att_proc_field_id);
    }

    sql2 = "select * from kq_ATT_PROC_FIELDS ";
    rs.executeQuery(sql2);
    while(rs.next()){
      String att_proc_field_kqid = rs.getString("id");
      String field001 = rs.getString("field001");
      String field002 = rs.getString("field002");
      field001 = field001.toLowerCase();
      field002 = field002.toLowerCase();
      String key = field001+"_"+field002;
      if(fieldMap.get(key) != null){
        String att_proc_field_id = fieldMap.get(key);
        String bindSql = "insert into hrm_to_attfield(hrmid,kqid) values("+att_proc_field_id+","+att_proc_field_kqid+") ";
        boolean isBinded = rs1.executeUpdate(bindSql);
      }
    }
  }

  /**
   * 考勤流程設置基本信息
   */
  public void upAttProcSet() throws Exception{
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    RecordSet rs3 = new RecordSet();
    RecordSet rs4 = new RecordSet();

    Map<String,String> tableMap = new HashMap<>();

    String tablenameSql = "select * from workflow_bill where id in(select field002 from hrm_att_proc_set)";
    rs4.execute(tablenameSql);
    while(rs4.next()){
      String formid = rs4.getString("id");
      String tablename = rs4.getString("tablename");
      tableMap.put(formid, tablename);
    }

    String sql1 = "select * from hrm_att_proc_set ";
    rs.executeQuery(sql1);
    while(rs.next()){
      String att_proc_set_id = rs.getString("id");
      String field001 = rs.getString("field001");
      String field002 = rs.getString("field002");
      String field003 = rs.getString("field003");
      String field004 = rs.getString("field004");
      String field005 = rs.getString("field005");
      String field006 = rs.getString("field006");
      String field007 = rs.getString("field007");
      String field008 = rs.getString("field008");
      String field009 = rs.getString("field009");
      String field010 = rs.getString("field010");
      String field011 = rs.getString("field011");
      String field012 = rs.getString("field012");
      String field013 = rs.getString("field013");
      String field014 = rs.getString("field014");
      String field015 = rs.getString("field015");
      long mfid =  UUID.randomUUID().getLeastSignificantBits();
      int ishalfday = Util.getIntValue(rs.getString("ishalfday"),-1);

      String tablename = Util.null2String(tableMap.get(field002));

      String usedetail = "0";
      String custompage = "";
      String custompage4Emoble = "";
      String templetroute = "";
      switch (field006){
        case "0" :
          custompage = KqTempletEnum.LEAVE.getTempletfile();
          custompage4Emoble = KqTempletEnum.LEAVE.getTempletmobilefile();
          templetroute = KqTempletEnum.LEAVE.getTempletroute();
          break;
        case "1" :
          custompage = KqTempletEnum.EVECTION.getTempletfile();
          custompage4Emoble = KqTempletEnum.EVECTION.getTempletmobilefile();
          templetroute = KqTempletEnum.EVECTION.getTempletroute();
          break;
        case "2" :
          custompage = KqTempletEnum.OUT.getTempletfile();
          custompage4Emoble = KqTempletEnum.OUT.getTempletmobilefile();
          templetroute = KqTempletEnum.OUT.getTempletroute();
          break;
        case "3" :
          custompage = KqTempletEnum.OVERTIME.getTempletfile();
          custompage4Emoble = KqTempletEnum.OVERTIME.getTempletmobilefile();
          templetroute = KqTempletEnum.OVERTIME.getTempletroute();
          break;
        case "4" :
          custompage = KqTempletEnum.OTHER.getTempletfile();
          custompage4Emoble = KqTempletEnum.OTHER.getTempletmobilefile();
          templetroute = KqTempletEnum.OTHER.getTempletroute();
          break;
        case "5" :
          custompage = KqTempletEnum.SHIFT.getTempletfile();
          custompage4Emoble = KqTempletEnum.SHIFT.getTempletmobilefile();
          templetroute = KqTempletEnum.SHIFT.getTempletroute();
          break;
        case "6" :
          custompage = KqTempletEnum.LEAVEBACK.getTempletfile();
          custompage4Emoble = KqTempletEnum.LEAVEBACK.getTempletmobilefile();
          templetroute = KqTempletEnum.LEAVEBACK.getTempletroute();
          break;
        default:
          break;
      }

      String insertSql = "insert into kq_ATT_PROC_SET(field001,field002,field003,field004,field005,"
          + "field006,field007,field008,field009,field010,field011,field012,field013,field014,field015,"
          + "mfid,ishalfday,usedetail,templetroute,templetmobilefile,templetfile,tablename) "
          + " values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
      boolean isUpdated = rs1.executeUpdate(insertSql,field001,field002,field003,field004,field005,
          field006,field007,field008,field009,field010,field011,field012,
          field013,field014,field015,mfid,ishalfday,usedetail,templetroute,
          custompage4Emoble,custompage,tablename);

      if(isUpdated){
        rs2.executeQuery("select max(id) from kq_ATT_PROC_SET ");
        if(rs2.next()){
          String kq_att_set_id = rs2.getString(1);
          String actionSql = "";
          String actionSql1 = "";
          String actionSql2 = "";
          String actionSql3 = "";
          switch (field006){
            case "0" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,4)";
              actionSql1 = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqDeductionVacationAction','82823,25842',0,-1,-1,1,1)";
              actionSql2 = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqFreezeVacationAction','1232,25842',0,-1,-1,1,2)";
              actionSql3 = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqReleaseVacationAction','82824,25842',0,-1,-1,1,3)";
              break;
            case "1" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,1)";
              break;
            case "2" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,1)";
              break;
            case "3" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,2)";
              actionSql1 = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqPaidLeaveAction','126739',0,-1,-1,1,1)";
              break;
            case "4" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,1)";
              break;
            case "5" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','390737',0,-1,-1,1,1)";
              break;
            case "6" :
              actionSql = "insert into kq_ATT_PROC_ACTION(mfid,field001,field002,field003,field004,field005,field006,field007,field008) values(-1,"+kq_att_set_id+",'KqSplitAction','81543',0,-1,-1,1,1)";
              break;
            default:
              break;
          }
          if(actionSql.length() > 0){
            rs3.execute(actionSql);
          }
          if(actionSql1.length() > 0){
            rs3.execute(actionSql1);
          }
          if(actionSql2.length() > 0){
            rs3.execute(actionSql2);
          }
          if(actionSql3.length() > 0){
            rs3.execute(actionSql3);
          }
          HrmAttProcSetManager attProcSetManager = new HrmAttProcSetManager();
          attProcSetManager.welcomeToSet(Util.getIntValue(field001), Util.getIntValue(field006),custompage,custompage4Emoble,templetroute);
          String bindSql = "insert into hrm_to_attSet(hrmid,kqid) values("+att_proc_set_id+","+kq_att_set_id+") ";
          boolean isBinded = rs4.executeUpdate(bindSql);
        }
      }

    }
  }

  /**
   * 请假类型数据迁移
   * @param year
   */
  public boolean upLeave(String year) {

    boolean isLeaveDone = true;
    try {
      Map<String, String> leaveMap = new HashMap<>();
      upLeaveRule();
      //TODO 正式系统的历史数据excel导入，这里不做处理
      if(!leaveMap.isEmpty() && false){
        isLeaveDone = upLeaveData(leaveMap,year);
      }
    }catch (Exception e){
      isLeaveDone = false;
      e.printStackTrace();
    }
    return isLeaveDone;
  }

  /**
   * 根据假期规则生成相应的假期数据
   * @param leaveMap
   * @param year
   */
  public boolean upLeaveData(Map<String,String> leaveMap,String year) throws Exception{
    boolean isLeaveDataDone = true;
    for(Map.Entry<String,String> me : leaveMap.entrySet()){
      String leaveid = me.getKey();
      String leavecode = me.getValue();
      switch (leavecode){
        case "annualLeave":
          upAnnual();
          break;
        case "vacationLeave":
          upOvertimePiad();
          break;
        default:
          upPaid();
          break;
      }
    }

    return isLeaveDataDone;
  }

  /**
   * 迁移带薪数据
   */
  public void upPaid() {
    RecordSet rs = new RecordSet();
    String insertSql = "insert into kq_BalanceOfLeave(leaverulesid,resourceid,belongyear,extraAmount,status) select leavetype,resourceid,pslyear,psldays,0 from hrmpslmanagement where status = 1 and pslyear is not null or pslyear !='' ";
    rs.executeUpdate(insertSql);
  }

  /**
   * 迁移调休数据
   */
  public void upOvertimePiad() {
    RecordSet rs = new RecordSet();
    String curYear = DateUtil.getYear(DateUtil.getCalendar());
    String firstdate = DateUtil.getFirstDayOfYear(DateUtil.getCurrentDate());
    String enddate = DateUtil.getLastDayOfYear(DateUtil.getCurrentDate());
    String insertSql = "insert into kq_BalanceOfLeave(leaverulesid,resourceid,belongyear,extraAmount,status) values(?,?,?,?,?)";
    List<List> params = new ArrayList<List>();
    HrmPaidLeaveTimeManager paidLeaveTimeManager = new HrmPaidLeaveTimeManager();
    Map<String,String> otherparams = new HashMap<>();
    otherparams.put("fromdate", firstdate);
    otherparams.put("enddate", enddate);
    otherparams.put("sql_field001", " and field001 >0 ");
    Map<String,Comparable> paramMap = new HashMap<String,Comparable>();
    Iterator it = otherparams.entrySet().iterator();
    while(it.hasNext()){
      Map.Entry entry = (Map.Entry) it.next();
      paramMap.put((String)entry.getKey(), (String)entry.getValue());
    }
    List<HrmPaidLeaveTime> tList = paidLeaveTimeManager.find(paramMap);
    for(HrmPaidLeaveTime paidLeaveTime : tList){
      Long resourceid = paidLeaveTime.getId();
      String extraVal = String.valueOf(paidLeaveTime.getField004());
      List<Object> beanParams =  new ArrayList<Object>();
      beanParams.add("-13");
      beanParams.add(resourceid);
      beanParams.add(curYear);
      beanParams.add(extraVal);
      beanParams.add("0");
      params.add(beanParams);
    }
    boolean isOk = rs.executeBatchSql(insertSql, params);
  }

  /**
   * 迁移年假数据
   */
  public void upAnnual() {
    RecordSet rs = new RecordSet();
    String insertSql = "insert into kq_BalanceOfLeave(leaverulesid,resourceid,belongyear,extraAmount,status) select -6,resourceid,annualyear,annualdays,0 from HrmAnnualManagement where status = 1";
    rs.executeUpdate(insertSql);
  }

  /**
   * 升级假期规则
   * @return
   * @throws Exception
   */
  public void upLeaveRule() throws Exception{
    RecordSet rs = new RecordSet();
    RecordSet recordSet = new RecordSet();

    //请假类型 数据迁移
    String leaveSql = " select * from hrmleavetypecolor order by field006 ";
    rs.execute(leaveSql);
    while (rs.next()) {
      String leaveid = rs.getString("id");
      String leaveName = ""+Util.formatMultiLang(rs.getString("field001"),"7")+"";
      String isuse = rs.getString("field002");
      String leavecode = rs.getString("field004");
      String iscalworkday = rs.getString("iscalworkday");
      //自然日调配按照周几计算时长无法迁移，这个地方定死一个值吧 hoursToDay
      int relateweekday = Util.getIntValue(rs.getString("relateweekday"));
      String ispaidleave = rs.getString("ispaidleave");
      String leavecodeRule = "";
      int scopeType = 0;
      String scopeValue = "";
      int minimumUnit = 1;
      int hoursToDay = 8;
      int computingMode = 1;
      int isEnable = 1;
      int balanceEnable = 0;

      int distributionMode = 1;
      int annualAmount = 0;
      int priority = 1;
      int validityRule = 0;//不限制
      String expirationMonth = "";
      String expirationDay = "";
      int extensionEnable = 0;
      int extendedDays = 0;
      int releaseRule = 0;
      if (!"1".equalsIgnoreCase(isuse)) {
        isEnable = 0;
      }
      if ("0".equalsIgnoreCase(iscalworkday)) {
        computingMode = 2;
      }
      if ("1".equalsIgnoreCase(ispaidleave)) {
        balanceEnable = 1;
      }
      if ("-6".equalsIgnoreCase(leavecode)) {
        balanceEnable = 1;
        leavecodeRule = "annualLeave";
      }
      if ("-12".equalsIgnoreCase(leavecode)) {
        leavecodeRule = "paidSickLeave";
        balanceEnable = 1;
      }
      if ("-13".equalsIgnoreCase(leavecode)) {
        balanceEnable = 1;
        leavecodeRule = "vacationLeave";
        distributionMode = 5;
        minimumUnit = 3;
      }

      boolean flag = false;//数据是否插入成功

      String sql = "insert into kq_LeaveRules(Id,leaveName,scopeType,scopeValue,minimumUnit,computingMode,hoursToDay,balanceEnable,isEnable,isDelete,leavecode) values(?,?,?,?,?,?,?,?,?,?,?)";
      flag = recordSet.executeUpdate(sql, leavecode, leaveName, scopeType, scopeValue, minimumUnit, computingMode, hoursToDay, balanceEnable, isEnable, 0,leavecodeRule);

      if (!flag) {
        kqLog.info("升级假期规则 upLeaveRule 失败 ：hrmleavetypecolor：field004:  "+leavecode);
        break;
      }
      String bindSql = "insert into hrm_to_kq_LeaveRules(hrmid,kqid) values(?,?) ";
      boolean isBind = recordSet.executeUpdate(bindSql,leaveid,leavecode);
      if(isBind && balanceEnable == 1){
        //带薪假和系统假期都需要处理下请假类型明细设置
        sql = "insert into kq_LeaveRulesDetail(ruleId,ruleName,scopeType,scopeValue," +
            "distributionMode,annualAmount,priority,validityRule,expirationMonth,expirationDay,extensionEnable,extendedDays,releaseRule,calcMethod,isDelete) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0)";
        flag = recordSet.executeUpdate(sql, leavecode, leaveName+"规则", scopeType, scopeValue,
            distributionMode, annualAmount, priority, validityRule, expirationMonth, expirationDay, extensionEnable, extendedDays, releaseRule, 0);
      }
    }
    refreshCominfo();
  }


  /**
   * 如果升级错了，或者需要重新升级需要先删除数据
   * @return
   */
  public boolean refreshData(){
    try{
      List<String>  delSql = new ArrayList<>();
      delSql.add("delete from kq_group ");
      delSql.add("delete from kq_fixedschedulce ");
      delSql.add("delete from kq_groupmember ");
      delSql.add("delete from kq_ShiftManagement ");
      delSql.add("delete from kq_ShiftRestTimeSections ");
      delSql.add("delete from kq_ShiftOnOffWorkSections ");

      delSql.add("delete from kq_shiftschedule ");

      delSql.add("delete from kq_LeaveRules ");
      delSql.add("delete from kq_balanceOfLeave ");
      delSql.add("delete from KQ_HOLIDAYSET ");
      delSql.add("delete from kq_OvertimeRules ");
      delSql.add("delete from kq_OvertimeRulesDetail ");

      delSql.add("delete from kq_att_proc_set ");
      delSql.add("delete from kq_ATT_PROC_RELATION ");
      delSql.add("delete from kq_ATT_PROC_ACTION where field001 <>'-1' ");

      delSql.add("delete from kq_flow_split_leave ");
      delSql.add("delete from kq_flow_split_evection ");
      delSql.add("delete from kq_flow_split_out ");
      delSql.add("delete from kq_flow_split_overtime ");
      RecordSet rs = new RecordSet();
      for(String del : delSql){
        rs.executeUpdate(del);
      }
      return true;
    }catch (Exception e){
      e.printStackTrace();
      return false;
    }
  }

  /**
   * 排班人员升级
   * 升级 考勤组+班次
   * @return
   */
  public void upScheduleGroupData() throws Exception{
    RecordSet rs0 = new RecordSet();
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    RecordSet rs3 = new RecordSet();
    RecordSet rs4 = new RecordSet();
    RecordSet rs5 = new RecordSet();
    RecordSet rs6 = new RecordSet();
    RecordSet rs7 = new RecordSet();
    RecordSet rs8 = new RecordSet();
    RecordSet rs9 = new RecordSet();

    ManageDetachComInfo manageDetachComInfo = new ManageDetachComInfo();
    boolean hrmdetachable = manageDetachComInfo.isUseHrmManageDetach();//是否开启了人力资源模块的管理分权
    String hrmdftsubcomid = manageDetachComInfo.getHrmdftsubcomid();//分权默认分部
    String shiftsetSql = "select * from hrm_schedule_shifts_set where delflag=0 ";
    rs0.executeQuery(shiftsetSql);
    while (rs0.next()) {
      String shifts_set_id = rs0.getString("id");
      String groupname = "排班("+Util.formatMultiLang(rs0.getString("field001"),"7")+")";
      int subcompanyid = Util.getIntValue(rs0.getString("field002"), 0);
      if(hrmdetachable){
        subcompanyid = Util.getIntValue(hrmdftsubcomid);
      }
      boolean is4worklen = false;
      String shiftOnOffWorkCount = "1";
      String isresttimeopen = "0";
      String[] worktimeids = null;
      String getworkTimeSql = "select * from hrm_schedule_shifts_detail where field001='" + shifts_set_id
          + "' and delflag=0 ";
      rs1.executeQuery(getworkTimeSql);
      kqLog.info("upScheduleGroupData getworkTimeSql:"+getworkTimeSql);
      if (rs1.next()) {
        String worktimeid = rs1.getString("field002");
        worktimeids = worktimeid.split(";");
        if (worktimeids.length == 1) {
          shiftOnOffWorkCount = "1";
        }else if(worktimeids.length == 2){
          shiftOnOffWorkCount = "2";
        }else if(worktimeids.length == 3){
          shiftOnOffWorkCount = "3";
        }else{
          is4worklen = true;
        }
      }
      if(is4worklen){
        continue;
      }
      String worktimes = "";
      if(worktimeids != null){
        for(String workid : worktimeids){
          worktimes += ","+workid;
        }
      }
      if(worktimes.length() > 0){
        worktimes = worktimes.substring(1);
      }

      if(worktimes.length() > 0){
        List<Object> timesList = new ArrayList<>();
        String uuid = UUID.randomUUID().toString();
        int worktime = 0;
        String serials = "排班";
        String serialname= "";
        String serialcontent= "";
        String punchsettings= "1";
        String isoffdutyfreecheck= "0";
        String worktimeSql = "select * from hrm_schedule_worktime where delflag=0 and  id in ("+worktimes+")  order by field002";
        rs.execute(worktimeSql);
        while(rs.next()) {
          String worktimename = Util.null2s(rs.getString("field001"),"");
          String starttime = Util.null2s(rs.getString("field002"),"");
          String endtime = Util.null2s(rs.getString("field003"),"");
          String starttime_min = Util.null2s(rs.getString("field004"),"");
          String endtime_min = Util.null2s(rs.getString("field005"),"");
          String workhour = Util.null2s(rs.getString("field007"),"");
          worktime += Util.getDoubleValue(workhour)*60;
          if(serialname.length() > 0){
            serialname += ";"+worktimename;
            serialcontent += ";"+(starttime+"-"+endtime);
          }else {
            serialname += worktimename;
            serialcontent += (starttime+"-"+endtime);
          }
          Map<String,String> timeMap = new HashMap<>();
          timeMap.put("starttime", starttime);
          timeMap.put("endtime", endtime);
          timeMap.put("starttime_min", starttime_min);
          timeMap.put("endtime_min", endtime_min);
          timesList.add(timeMap);
        }
        if(serialname.length() > 0){
          serials += "("+Util.formatMultiLang(serialname,"7")+")";
        }

        String serialSql = "insert into kq_ShiftManagement(serial,subcompanyid,shiftonoffworkcount,punchsettings,isoffdutyfreecheck,isresttimeopen,worktime,uuid,color)"
            + " values('"+serials+"',"+subcompanyid+","+shiftOnOffWorkCount+","+punchsettings+","+isoffdutyfreecheck+","+isresttimeopen+","+worktime+",'"+uuid+"',null)";
        boolean isSerial = rs2.executeUpdate(serialSql);
        kqLog.info("upScheduleGroupData serialSql:"+serialSql+":isSerial:"+isSerial);
        if(isSerial) {
          int serialid = 0;
          String getSerialIdSql = "select max(id)  from kq_ShiftManagement ";
          rs4.execute(getSerialIdSql);
          if(rs4.next()) {
            serialid = Util.getIntValue(rs4.getString(1));
            if(serialid > 0){
              String bindSql =
                  "insert into hrm_to_kq_serial(hrmid,kqid,serial,serialfrom) values(" + shifts_set_id
                      + "," + serialid + ",'"+serialcontent+"','shiftset') ";
              boolean isBinded = rs3.executeUpdate(bindSql);
              kqLog.info("upScheduleGroupData bindSql:"+bindSql+":isBinded:"+isBinded);

              for(int i = 0 ; i < timesList.size() ; i++){
                Map<String,String> tmpTimeMap = (Map<String, String>) timesList.get(i);
                String starttime = Util.null2s(tmpTimeMap.get("starttime"),"");
                String endtime = Util.null2s(tmpTimeMap.get("endtime"),"");
                String starttime_min = Util.null2s(tmpTimeMap.get("starttime_min"),"30");
                String endtime_min = Util.null2s(tmpTimeMap.get("endtime_min"),"30");
                String across = "0";
                String workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                    + "values("+serialid+","+across+","+starttime_min+",'"+starttime+"','start',"+i+")";
                boolean isSection = rs3.executeUpdate(workSql);
                kqLog.info("upScheduleGroupData workSql:"+workSql+":isSection:"+isSection);
                if(starttime.compareTo(endtime) > 0){
                  across = "1";
                }
                workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                    + "values("+serialid+","+across+","+endtime_min+",'"+endtime+"','end',"+i+")";
                isSection = rs3.executeUpdate(workSql);
                kqLog.info("upScheduleGroupData workSql:"+workSql+":isSection:"+isSection);
              }

              String groupSql = " insert into kq_group (" +
                  " groupname,subcompanyid,excludeid,kqtype,shiftcyclename,shiftcycleday,shiftcycleserialids,serialids," +
                  " weekday,signstart,workhour,signintype,validity,validityfromdate,validityenddate,locationcheckscope) " +
                  " values('"+groupname+"',"+subcompanyid+",null,2,null,null,null,'"+serialid+"',null,null,null,1,0,null,null,300)";
              boolean isOk = rs5.executeUpdate(groupSql);
              kqLog.info("groupSql:"+groupSql);
              if(isOk){
                int groupid = 0;
                String getGroupIdSql = "select max(id)  from kq_group ";
                rs6.execute(getGroupIdSql);
                if(rs6.next()){
                  groupid = Util.getIntValue(rs6.getString(1));
                }
                if(groupid > 0) {
                  bindSql ="insert into hrm_to_kq_group(hrmid,kqid,groupfrom) values("
                      + shifts_set_id + "," + groupid + ",'shiftset') ";
                  isBinded = rs6.executeUpdate(bindSql);
                  if (isBinded) {
                    String memSql = " INSERT INTO kq_groupmember ( groupid ,typevalue ,type ,alllevel ," +
                        " seclevel ,seclevelto ,jobtitlelevelvalue ,jobtitlelevel) " +
                        " VALUES  (? ,? ,? ,?,? ,? ,? ,?)";
                    List<List> params = new ArrayList<List>();
                    List<String> resourceids = new ArrayList<>();
                    String shiftDetail =" select * from hrm_schedule_set_detail where delflag=0 and field001 = '" + shifts_set_id + "'";;
                    rs7.executeQuery(shiftDetail);
                    kqLog.info("shiftDetail:"+shiftDetail);
                    while (rs7.next()) {
                      String resourceid = rs7.getString("field002");
                      if (!resourceids.contains(resourceid)) {
                        List<Object> beanParams = new ArrayList<Object>();
                        beanParams.add(groupid);
                        beanParams.add(resourceid);
                        beanParams.add(1);
                        beanParams.add(null);
                        beanParams.add(0);
                        beanParams.add(100);
                        beanParams.add(null);
                        beanParams.add(null);
                        params.add(beanParams);
                        resourceids.add(resourceid);
                      }
                    }
                    kqLog.info("params:"+params);
                    boolean isMemDone = rs8.executeBatchSql(memSql, params);
                    if (isMemDone) {
                      String detailsql = "";
                      if(rs.getDBType().equals("oracle")){
                        detailsql = "insert into kq_shiftschedule(kqdate,serialid,resourceid,groupid) " +
                            "select field003,(case when nvl(FIELD005,'-1')='-1' then '-1' when nvl(FIELD005,'')='' then '-1' else '"+serialid+"' end  ),field002," + groupid
                            + " from hrm_schedule_set_detail  where delflag=0 and field001 = '" + shifts_set_id + "'";

                      }else if(rs.getDBType().equals("mysql")){
                        detailsql = "insert into kq_shiftschedule(kqdate,serialid,resourceid,groupid) " +
                            "select field003,(case when ifnull(FIELD005,'-1')='-1' then '-1' when ifnull(FIELD005,'')='' then '-1' else '"+serialid+"' end  ),field002," + groupid
                            + " from hrm_schedule_set_detail  where delflag=0 and field001 = '" + shifts_set_id + "'";

                      }else{
                        detailsql = "insert into kq_shiftschedule(kqdate,serialid,resourceid,groupid) " +
                            "select field003,(case when isnull(FIELD005,'-1')='-1' then '-1' when isnull(FIELD005,'')='' then '-1' else '"+serialid+"' end  ),field002," + groupid
                            + " from hrm_schedule_set_detail  where delflag=0 and field001 = '" + shifts_set_id + "'";

                      }

                      kqLog.info("detailsql:"+detailsql);
                      boolean isDetailDone = rs8.executeUpdate(detailsql);
                    }
                  }
                }

              }
            }
          }
        }
      }
    }

    refreshCominfo();
  }

  /**
   * 排班人员 更新考勤组成员和具体设置排班数据
   * @param groupidMap
   * @param year
   */
  public boolean upScheduleGroupMem(Map<String, String> groupidMap,Map<String, String> groupSerialMap,String year) {
    RecordSet rs_shiftdetail = new RecordSet();
    RecordSet rs_groupmem = new RecordSet();
    RecordSet rs_scheduledetail = new RecordSet();

    String firstdate = DateUtil.getFirstDayOfYear(year + "-01-01");
    String enddate = DateUtil.getLastDayOfYear(year + "-01-01");
    boolean isDetailDone = true;
    //3、考勤组成员搞一波
    for (Map.Entry<String, String> groupdetail : groupidMap.entrySet()) {
      List<List> params = new ArrayList<List>();
      List<String> resourceids = new ArrayList<>();
      String groupid = groupdetail.getKey();
      String shifts_set_id = groupdetail.getValue();
      String shiftDetail =
          " select * from hrm_schedule_set_detail where delflag=0 and field003 between '"
              + firstdate + "' and '" + enddate + "'";
      if (shifts_set_id.length() == 0) {
        continue;
      }
      String serialid = Util.null2String(groupSerialMap.get(groupid), "-1");
      shiftDetail += " and field001 = '" + shifts_set_id + "'";
      rs_shiftdetail.executeQuery(shiftDetail);
      while (rs_shiftdetail.next()) {
        String resourceid = rs_shiftdetail.getString("field002");
        if (!resourceids.contains(resourceid)) {
          List<Object> beanParams = new ArrayList<Object>();
          beanParams.add(groupid);
          beanParams.add(resourceid);
          beanParams.add(1);
          beanParams.add(null);
          beanParams.add(0);
          beanParams.add(100);
          beanParams.add(null);
          beanParams.add(null);
          params.add(beanParams);
          resourceids.add(resourceid);
        }
      }
      String memSql = " INSERT INTO kq_groupmember ( groupid ,typevalue ,type ,alllevel ," +
          " seclevel ,seclevelto ,jobtitlelevelvalue ,jobtitlelevel) " +
          " VALUES  (? ,? ,? ,?,? ,? ,? ,?)";
      if (!params.isEmpty()) {
        boolean isMemDone = rs_groupmem.executeBatchSql(memSql, params);
        if (isMemDone) {
          String detailsql = "insert into kq_shiftschedule(kqdate,serialid,resourceid,groupid) " +
              "select field003," + serialid + ",field002," + groupid
              + " from hrm_schedule_set_detail  where delflag=0 and field003 between '"
              + firstdate + "' and '" + enddate + "' and field001 = '" + shifts_set_id + "'";
          isDetailDone = rs_scheduledetail.executeUpdate(detailsql);
          if (!isDetailDone) {
            break;
          }
        }
      }
    }
    return isDetailDone;
  }

  /**
   * 排班人员 考勤组里设置下班次
   * @param groupSerialMap
   * @return
   */
  public boolean upScheduleGroupSerial(Map<String, String> groupSerialMap) {
    RecordSet rs_groupschedule = new RecordSet();
    boolean isUpGroupDone = true;
    for (Map.Entry<String, String> me : groupSerialMap.entrySet()) {
      String groupid = me.getKey();
      String serialid = me.getValue();

      String updteGroupSrial = "update kq_group set serialids = ? where id= ? ";
      isUpGroupDone = rs_groupschedule.executeUpdate(updteGroupSrial, serialid, groupid);
      if (!isUpGroupDone) {
        break;
      }
    }
    return isUpGroupDone;
  }

  /**
   * 升级排班人员 班次数据
   * @param groupidMap
   * @param groupidShiftMap
   * @param groupSerialMap
   * @param worktimeSerialMap
   * @param year
   * @param upSignSql
   */
  public void upScheduleSerial(Map<String, String> groupidMap,Map<String, String> groupidShiftMap,
      Map<String, String> groupSerialMap, Map<String, String> worktimeSerialMap,
      String year,List<String> upSignSql) {

    String worktimeSep = ";";
    RecordSet rs = new RecordSet();
    RecordSet rs_shift = new RecordSet();
    RecordSet rs_shift1 = new RecordSet();
    RecordSet rs_shift2 = new RecordSet();
    RecordSet rs_shift3 = new RecordSet();

    String mainSql =
        "insert into kq_ShiftManagement(serial,subcompanyid,shiftonoffworkcount,punchsettings,isoffdutyfreecheck,isresttimeopen,worktime,uuid,color)"
            + " values(?,?,?,?,?,?,?,?,?)";

    String shiftOnOffWorkCount = "1";

    //针对考勤组 然后对应班次
    for (Map.Entry<String, String> me : groupidShiftMap.entrySet()) {
      String groupid = me.getKey();
      String worktimeid = me.getValue();
      String shifts_set_id = groupidMap.get(groupid);
      String[] worktimeids = worktimeid.split(worktimeSep);
      String shiftworktimeSql = "select * from hrm_schedule_worktime where delflag=0 ";
      if (worktimeids.length == 3) {
        String worktimeid1 = worktimeids[0];
        String worktimeid2 = worktimeids[1];
        String worktimeid3 = worktimeids[2];
        shiftworktimeSql +=
            " and id in (" + worktimeid1 + "," + worktimeid2 + "," + worktimeid3 + ") ";
        shiftOnOffWorkCount = "3";
      } else if (worktimeids.length == 2) {
        String worktimeid1 = worktimeids[0];
        String worktimeid2 = worktimeids[1];
        shiftworktimeSql += " and id in (" + worktimeid1 + "," + worktimeid2 + ") ";
        shiftOnOffWorkCount = "2";
      } else if (worktimeids.length == 1) {
        String worktimeid1 = worktimeids[0];
        shiftworktimeSql += " and id in (" + worktimeid1 + ") ";
        shiftOnOffWorkCount = "1";
      } else {
        //当前E9就支持最多三个班次
        rs.writeLog("班次创建失败，当前E9就支持最多三个班次");
      }
      shiftworktimeSql += " order by field002 ";

      List<Map<String, String>> workserctionList = new ArrayList<>();

      String serailname = "";
      int workminTotal = 0;

      rs.executeQuery(shiftworktimeSql);
      while (rs.next()) {
        Map<String, String> workserctionMap = new HashMap<>();
        String serial = rs.getString("field001");
        serailname += "," + serial;
        String starttime = rs.getString("field002");
        String endtime = rs.getString("field003");
        String starttime_min = rs.getString("field004");
        String endtime_min = rs.getString("field005");
        String workhour = rs.getString("field007");
        workminTotal += (Util.getDoubleValue(workhour, 0.0) * 60.0);
        String startacross = "0";
        String endacross = "0";
        if (starttime.compareTo(endtime) > 0) {
          endacross = "1";
        }

        workserctionMap.put("starttime", starttime);
        workserctionMap.put("endtime", endtime);
        workserctionMap.put("starttime_min", starttime_min);
        workserctionMap.put("endtime_min", endtime_min);
        workserctionMap.put("startacross", startacross);
        workserctionMap.put("endacross", endacross);

        workserctionList.add(workserctionMap);
      }

      //获取更新签到签退的sql
      upScheduleSignSql(workserctionList,year,upSignSql,shifts_set_id);

      if (serailname.length() > 0) {
        serailname = serailname.substring(1);
      }
      String subcompanyid = null;
      String punchSettings = null;
      String isOffDutyFreeCheck = null;
      String isRestTimeOpen = null;
      String uuid = UUID.randomUUID().toString();
      String color = null;
      String worktime = workminTotal + "";

      boolean isUpdated = rs_shift
          .executeUpdate(mainSql, serailname, subcompanyid, shiftOnOffWorkCount, punchSettings,
              isOffDutyFreeCheck, isRestTimeOpen, worktime, uuid, color);
      if (isUpdated) {
        int serialid = 0;
        String idSql = "select id from kq_ShiftManagement where uuid=? ";
        rs_shift1.executeQuery(idSql, uuid);
        if (rs_shift1.next()) {
          serialid = rs_shift1.getInt("id");
        }
        if (serialid > 0) {
          String workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) values(?,?,?,?,?,?)";
          int record = 0;
          for (Map<String, String> workMap : workserctionList) {
            String starttime = workMap.get("starttime");
            String endtime = workMap.get("endtime");
            String starttime_min = workMap.get("starttime_min");
            String endtime_min = workMap.get("endtime_min");
            String startacross = workMap.get("startacross");
            String endacross = workMap.get("endacross");

            boolean issectionOK = rs_shift3
                .executeUpdate(workSql, serialid, startacross, starttime_min, starttime,
                    "start", record + "");
            if (issectionOK) {
              issectionOK = rs_shift3
                  .executeUpdate(workSql, serialid, endacross, endtime_min, endtime, "end",
                      record + "");
            }
            record++;
          }
          groupSerialMap.put(groupid, serialid + "");
          worktimeSerialMap.put(worktimeid, serialid + "");
        }
      }

    }

  }

  /**
   * 更新排班人员的签到签退数据
   * @param workserctionList
   * @param year
   * @param upSignSql
   * @param shifts_set_id
   */
  public void upScheduleSignSql(List<Map<String, String>> workserctionList, String year,
      List<String> upSignSql, String shifts_set_id) {
    String firstdate = DateUtil.getFirstDayOfYear(year + "-01-01");
    String enddate = DateUtil.getLastDayOfYear(year + "-01-01");
    int cnt = workserctionList.size();
    for(int i = 0 ; i < cnt ;i++){
      Map<String, String> workserctionMap = workserctionList.get(i);
      String starttime = workserctionMap.get("starttime");
      String endtime = workserctionMap.get("endtime");
      int starttime_min = Util.getIntValue(workserctionMap.get("starttime_min"),0);
      int endtime_min = Util.getIntValue(workserctionMap.get("endtime_min"),0);
      String startacross = workserctionMap.get("startacross");
      String endacross = workserctionMap.get("endacross");
      if("1".equalsIgnoreCase(endacross)){
        new BaseBean().writeLog("排班数据存在跨天，不处理跨天的签到签退数据！");
      }
      if(endtime.length() == 0){
        return ;
      }
      String worksection = starttime + "-" + endtime;
      DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
      LocalTime canStartTime = LocalTime.parse(starttime+":00",dateTimeFormatter).minusMinutes(starttime_min);
      LocalTime canEndTime = LocalTime.parse(endtime+":00",dateTimeFormatter).plusMinutes(endtime_min);
      String canSignInTime = canStartTime.format(dateTimeFormatter);
      String canSignOutTime = canEndTime.format(dateTimeFormatter);
      String signWhere = " and userid in (select field002 from hrm_schedule_set_detail where delflag=0  and field001 in(select id from hrm_schedule_shifts_set where delflag=0 and id='"+shifts_set_id+"') and field003 between '"+firstdate+"' and '"+enddate+"')  and signdate between '"+firstdate+"' and '"+enddate+"'";

      String signSql1 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+starttime+"' where signtype=1 and signtime >= '"+canSignInTime+"' and signtime <= '"+canSignOutTime+"' "+signWhere;
      upSignSql.add(signSql1);
      String signSql2 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+endtime+"' where signtype=2 and signtime >= '"+canSignInTime+"' and signtime <= '"+canSignOutTime+"' "+signWhere;
      upSignSql.add(signSql2);
    }

  }

  /**
   * 一般工作时间
   * 升级三类数据 考勤组 + 班次
   * @return
   */
  public void upCommonGroupData() throws Exception{

    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    RecordSet rs4 = new RecordSet();
    RecordSet rs5 = new RecordSet();

    SubCompanyComInfo sci = new SubCompanyComInfo();
    ManageDetachComInfo manageDetachComInfo = new ManageDetachComInfo();
    boolean hrmdetachable = manageDetachComInfo.isUseHrmManageDetach();//是否开启了人力资源模块的管理分权
    String hrmdftsubcomid = manageDetachComInfo.getHrmdftsubcomid();//分权默认分部

    String scheduleSql = "select * from hrmschedule where scheduletype >= 3 ORDER BY scheduletype ";
    rs.execute(scheduleSql);
    while(rs.next()) {
      String id = rs.getString("id");
      String scheduletype = rs.getString("scheduletype");
      String relatedid = Util.null2String(rs.getString("relatedid"), "0");
      String validedatefrom = rs.getString("validedatefrom");
      String validedateto = rs.getString("validedateto");
      String needsign = rs.getString("needsign");
      String onlyworkday = rs.getString("onlyworkday");
      String signtimescope = rs.getString("signtimescope");
      String signipscope = rs.getString("signipscope");
      String sign_type = rs.getString("sign_type");
      String sign_start_time = rs.getString("sign_start_time");
      String subcompanyid = "0";
      if(hrmdetachable){
        subcompanyid = hrmdftsubcomid;
      }

//            0周一 1周二 2周三 3周四 4周五 5周六 6周日
      String monstarttime1 = rs.getString("monstarttime1");
      String monendtime1 = rs.getString("monendtime1");
      String monstarttime2 = rs.getString("monstarttime2");
      String monendtime2 = rs.getString("monendtime2");

      if(monstarttime1.length() > 0 && monendtime1.length() > 0 &&
          monstarttime2.length() > 0 && monendtime2.length() > 0){
        setSerial(monstarttime1, monendtime1, monstarttime2, monendtime2, subcompanyid, sign_type, id, "0",sign_start_time);
      }

      String tuestarttime1 = rs.getString("tuestarttime1");
      String tueendtime1 = rs.getString("tueendtime1");
      String tuestarttime2 = rs.getString("tuestarttime2");
      String tueendtime2 = rs.getString("tueendtime2");

      if(tuestarttime1.length() > 0 && tueendtime1.length() > 0 &&
          tuestarttime2.length() > 0 && tueendtime2.length() > 0){
        setSerial(tuestarttime1, tueendtime1, tuestarttime2, tueendtime2, subcompanyid, sign_type, id, "1",sign_start_time);
      }

      String wedstarttime1 = rs.getString("wedstarttime1");
      String wedendtime1 = rs.getString("wedendtime1");
      String wedstarttime2 = rs.getString("wedstarttime2");
      String wedendtime2 = rs.getString("wedendtime2");

      if(wedstarttime1.length() > 0 && wedendtime1.length() > 0 &&
          wedstarttime2.length() > 0 && wedendtime2.length() > 0){
        setSerial(wedstarttime1, wedendtime1, wedstarttime2, wedendtime2, subcompanyid, sign_type, id, "2",sign_start_time);
      }

      String thustarttime1 = rs.getString("thustarttime1");
      String thuendtime1 = rs.getString("thuendtime1");
      String thustarttime2 = rs.getString("thustarttime2");
      String thuendtime2 = rs.getString("thuendtime2");

      if(thustarttime1.length() > 0 && thuendtime1.length() > 0 &&
          thustarttime2.length() > 0 && thuendtime2.length() > 0){
        setSerial(thustarttime1, thuendtime1, thustarttime2, thuendtime2, subcompanyid, sign_type, id, "3",sign_start_time);
      }

      String fristarttime1 = rs.getString("fristarttime1");
      String friendtime1 = rs.getString("friendtime1");
      String fristarttime2 = rs.getString("fristarttime2");
      String friendtime2 = rs.getString("friendtime2");

      if(fristarttime1.length() > 0 && friendtime1.length() > 0 &&
          fristarttime2.length() > 0 && friendtime2.length() > 0){
        setSerial(fristarttime1, friendtime1, fristarttime2, friendtime2, subcompanyid, sign_type, id, "4",sign_start_time);
      }

      String satstarttime1 = rs.getString("satstarttime1");
      String satendtime1 = rs.getString("satendtime1");
      String satstarttime2 = rs.getString("satstarttime2");
      String satendtime2 = rs.getString("satendtime2");

      if(satstarttime1.length() > 0 && satendtime1.length() > 0 &&
          satstarttime2.length() > 0 && satendtime2.length() > 0){
        setSerial(satstarttime1, satendtime1, satstarttime2, satendtime2, subcompanyid, sign_type, id, "5",sign_start_time);
      }

      String sunstarttime1 = rs.getString("sunstarttime1");
      String sunendtime1 = rs.getString("sunendtime1");
      String sunstarttime2 = rs.getString("sunstarttime2");
      String sunendtime2 = rs.getString("sunendtime2");

      if(sunstarttime1.length() > 0 && sunendtime1.length() > 0 &&
          sunstarttime2.length() > 0 && sunendtime2.length() > 0){
        setSerial(sunstarttime1, sunendtime1, sunstarttime2, sunendtime2, subcompanyid, sign_type, id, "6",sign_start_time);
      }

      String groupname = "";
      if ("3".equalsIgnoreCase(scheduletype)) {
        groupname += "一般工作时间:总部" + "(" + validedatefrom + "到" + validedateto + ")";
      } else {
        groupname += "一般工作时间:分部" + "(" + Util.formatMultiLang(sci.getSubcompanyname(relatedid),"7") + ")" + "("
            + validedatefrom + "到" + validedateto + ")";
      }

      String groupSql = " insert into kq_group (" +
          " groupname,subcompanyid,excludeid,kqtype,shiftcyclename,shiftcycleday,shiftcycleserialids,serialids," +
          " weekday,signstart,workhour,signintype,validity,validityfromdate,validityenddate,locationcheckscope) " +
          " values('"+groupname+"',"+subcompanyid+",null,1,null,null,null,null,null,null,null,1,1,'"+validedatefrom+"','"+validedateto+"',300)";

      boolean isOk = rs1.executeUpdate(groupSql);
      if(isOk){
        int groupid = 0;
        String getGroupIdSql = "select max(id)  from kq_group ";
        rs1.execute(getGroupIdSql);
        if(rs1.next()){
          groupid = Util.getIntValue(rs1.getString(1));
        }
        if(groupid > 0){
          String bindSql = "insert into hrm_to_kq_group(hrmid,kqid,groupfrom) values("+id+","+groupid+",'scheduleset') ";
          boolean isBinded = rs2.executeUpdate(bindSql);
          if(isBinded){
            String kq_signintype = "1".equalsIgnoreCase(needsign)?"1":"4";
            String updateGroupInfo = " update kq_group set signintype="+kq_signintype+", ipscope='"+signipscope+"',locationcheck=null,locationcheckscope=300,wificheck=null,outsidesign=null where id= "+groupid;
            boolean isUpdated = rs2.executeUpdate(updateGroupInfo);
            if(isUpdated){
              String  weekSql = "select * from hrm_to_kq_group_weekday where hrmid = "+id+" order by weekday ";
              rs4.executeQuery(weekSql);
              while (rs4.next()){
                String weekday = Util.null2s(rs4.getString("weekday"),"");
                String serialid = Util.null2s(rs4.getString("serialid"),"");
                String connectSql = "insert into kq_fixedschedulce(weekday,serialid,groupid) values("+weekday+","+serialid+","+groupid+")";
                rs5.executeUpdate(connectSql);
              }

              String type = "";
              if("3".equalsIgnoreCase(scheduletype)){
                //所有人
                type = "6";
              }else if("4".equalsIgnoreCase(scheduletype)){
                //分部
                type = "2";
              }
              String memSql = " INSERT INTO kq_groupmember ( groupid ,typevalue ,type ,alllevel ," +
                  " seclevel ,seclevelto ,jobtitlelevelvalue ,jobtitlelevel) " +
                  " VALUES  ("+groupid+" ,"+relatedid+" ,"+type+" ,null,0 ,100 ,null ,null)";
              rs4.executeUpdate(memSql);
            }
          }


        }

      }
    }

    refreshCominfo();
  }

  /**
   * 升级班次数据
   * @param starttime1
   * @param endtime1
   * @param starttime2
   * @param endtime2
   * @param subcompanyid
   * @param sign_type
   * @param id
   * @param weekday
   * @param sign_start_time 打二次打卡时间
   * @throws Exception
   */
  public void setSerial(String starttime1,String endtime1,String starttime2,String endtime2,String subcompanyid,String sign_type,String id,String weekday,String sign_start_time) throws Exception{
    try{
      DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
      LocalTime localTime_0 = LocalTime.parse("00:00", timeFormatter);
      LocalTime localTime_24 = LocalTime.parse("23:59", timeFormatter);
      LocalTime localTime_sign_start = null;
      if(sign_start_time.length() > 0){
        localTime_sign_start = LocalTime.parse(sign_start_time, timeFormatter);
      }
      boolean isBinded = false;
      RecordSet rs1 = new RecordSet();
      RecordSet rs2 = new RecordSet();
      RecordSet rs3 = new RecordSet();
      RecordSet rs4 = new RecordSet();
      RecordSet rs5 = new RecordSet();
      DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");

      Duration duration1 =  Duration.between(
          LocalTime.parse(starttime1, dtf), LocalTime.parse(endtime1, dtf));
      Duration duration2 =  Duration.between(LocalTime.parse(starttime2, dtf), LocalTime.parse(endtime2, dtf));
      String worktime = ""+(duration1.toMinutes()+duration2.toMinutes());

      String shiftOnOffWorkCount = "1";
      String isresttimeopen = "1";
      if("2".equalsIgnoreCase(sign_type)){
        shiftOnOffWorkCount = "2";
        isresttimeopen = "0";
      }
      String uuid = UUID.randomUUID().toString();
      String serial = starttime1+"-"+endtime1+" "+starttime2+"-"+endtime2;
      String serialContent = serial+"_"+shiftOnOffWorkCount;

      String checkSerial = "select * from hrm_to_kq_serial where serial='"+serialContent+"' and serialfrom ='scheduleset' ";
      rs4.executeQuery(checkSerial);
      if(rs4.next()){
        String serialid = rs4.getString("kqid");
        if(Util.getIntValue(serialid) > 0){
          String bindSql =
              "insert into hrm_to_kq_group_weekday(hrmid,weekday,serialid) values(" + id
                  + ",'"+weekday+"',"+serialid+") ";
          isBinded = rs2.executeUpdate(bindSql);
        }
      }else{
        String serialname = "一般工作时间("+Util.formatMultiLang(serial,"7")+")";
        String serialSql = "insert into kq_ShiftManagement(serial,subcompanyid,shiftonoffworkcount,punchsettings,isoffdutyfreecheck,isresttimeopen,worktime,uuid,color)"
            + " values('"+serialname+"',"+subcompanyid+","+shiftOnOffWorkCount+",0,0,"+isresttimeopen+","+worktime+",'"+uuid+"',null)";
        boolean isSerial = rs3.executeUpdate(serialSql);
        if(isSerial){
          int serialid = 0;
          String getSerialIdSql = "select max(id)  from kq_ShiftManagement ";
          rs1.execute(getSerialIdSql);
          if(rs1.next()){
            serialid = Util.getIntValue(rs1.getString(1));
            if(serialid > 0) {
              int mins = 30;
              String bindSql =
                  "insert into hrm_to_kq_serial(hrmid,kqid,serial,serialfrom) values(" + id
                      + "," + serialid + ",'"+serialContent+"','scheduleset') ";
              isBinded = rs2.executeUpdate(bindSql);
              if(isBinded){
                bindSql =
                    "insert into hrm_to_kq_group_weekday(hrmid,weekday,serialid) values(" + id
                        + ",'"+weekday+"',"+serialid+") ";
                isBinded = rs2.executeUpdate(bindSql);
                if(isBinded){
                  if(!"2".equalsIgnoreCase(sign_type)){
                    LocalTime localTime = LocalTime.parse(starttime1, timeFormatter);
                    long start_mins = Duration.between(localTime_0, localTime).toMinutes();
                    String workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                        + "values("+serialid+",0,"+start_mins+",'"+starttime1+"','start',0)";
                    boolean isSection = rs5.executeUpdate(workSql);
                    if(isSection){
                      LocalTime localTime2 = LocalTime.parse(endtime2, timeFormatter);
                      long end_mins = Duration.between(localTime2, localTime_24).toMinutes();
                      workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                          + "values("+serialid+",0,"+end_mins+",'"+endtime2+"','end',0)";
                      rs5.executeUpdate(workSql);
                    }
                  }else{
                    LocalTime localTime = LocalTime.parse(starttime1, timeFormatter);
                    long start_mins1 = Duration.between(localTime_0, localTime).toMinutes();
                    String workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                        + "values("+serialid+",0,"+start_mins1+",'"+starttime1+"','start',0)";
                    boolean isSection = rs5.executeUpdate(workSql);
                    if(isSection){
                      LocalTime localTime2 = LocalTime.parse(endtime1, timeFormatter);
                      long end_mins1 = Duration.between(localTime2, localTime_sign_start).toMinutes();
                      workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                          + "values("+serialid+",0,"+end_mins1+",'"+endtime1+"','end',0)";
                      isSection = rs5.executeUpdate(workSql);
                      if(isSection){
                        LocalTime localTime3 = LocalTime.parse(starttime2, timeFormatter);
                        long start_mins2 = Duration.between(localTime_sign_start, localTime3).toMinutes();
                        workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                            + "values("+serialid+",0,"+start_mins2+",'"+starttime2+"','start',1)";
                        isSection = rs5.executeUpdate(workSql);
                        if(isSection){
                          LocalTime localTime4 = LocalTime.parse(endtime2, timeFormatter);
                          long end_mins2 = Duration.between(localTime4, localTime_24).toMinutes();
                          workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) "
                              + "values("+serialid+",0,"+end_mins2+",'"+endtime2+"','end',1)";
                          isSection = rs5.executeUpdate(workSql);
                        }
                      }
                    }

                  }
                  if(!"2".equalsIgnoreCase(sign_type)){
                    String restSql = "insert into kq_ShiftRestTimeSections(serialid,resttype,time,across) values("+serialid+",'start','"+endtime1+"',0)";
                    rs5.executeUpdate(restSql);
                    restSql = "insert into kq_ShiftRestTimeSections(serialid,resttype,time,across) values("+serialid+",'end','"+starttime2+"',0)";
                    rs5.executeUpdate(restSql);
                  }
                }
              }
            }
          }
        }
      }
    }catch (Exception e){
      e.printStackTrace();
    }
  }

  /**
   * 工作日期调整迁移
   * @return
   */
  public void upPub() {
    RecordSet rs = new RecordSet();
    RecordSet rs1 = new RecordSet();
    RecordSet rs2 = new RecordSet();
    RecordSet rs3 = new RecordSet();
    RecordSet rs4 = new RecordSet();

    String pubSql = "select * from hrmpubholiday";
    String groupSql = " select * from hrm_to_kq_group where groupfrom = 'scheduleset' and hrmid in( select id from hrmschedule) ";
    rs.executeQuery(groupSql);
    while (rs.next()){
      String groupid = Util.null2s(rs.getString("kqid"),"");
      if(groupid.length() >0){
        rs1.executeQuery(pubSql);
        while (rs1.next()){
          String id = Util.null2s(rs1.getString("id"),"");
          String holidaydate = Util.null2s(rs1.getString("holidaydate"),"");
          String holidayname = Util.null2s(rs1.getString("holidayname"),"");
          String changetype = Util.null2s(rs1.getString("changetype"),"");
          int relateweekday = Util.getIntValue(Util.null2s(rs1.getString("relateweekday"),"0"),0);
          String insertSql = "insert into KQ_HOLIDAYSET(holidaydate,holidaydesc,changetype,relatedday,groupid) "
              + " values('"+holidaydate+"','"+Util.formatMultiLang(holidayname,"7")+"','"+changetype+"','"+relateweekday+"','"+groupid+"')";
          boolean isOk = rs2.executeUpdate(insertSql);
          if(isOk){
            int pubid = 0;
            String getPubIdSql = "select max(id)  from KQ_HOLIDAYSET ";
            rs3.execute(getPubIdSql);
            if(rs3.next()){
              pubid = Util.getIntValue(rs3.getString(1));
            }
            if(pubid > 0){
              String bindSql = "insert into hrm_to_kq_pub(hrmid,kqid) values("+id+","+pubid+")";
              rs4.executeUpdate(bindSql);
            }
          }
        }
      }
    }

    refreshCominfo();
  }

  /**
   * 一般工作时间 更新签到签退数据
   * @param upSignSql
   */
  public void updateSign(List<String> upSignSql) throws Exception{
    RecordSet rs1 = new RecordSet();
    for(int i = 0 ; i < upSignSql.size() ; i++){
      String signSql = upSignSql.get(i);
      rs1.executeUpdate(signSql);
    }

  }

  /**
   * 按照E9新考勤规则 更新签到签退数据
   * @param relatedid
   * @param signFromDate
   * @param signtoDate
   * @param sign_start_time
   * @param scheduletype
   * @param sign_type
   * @param worktime1s
   * @param upSignSql
   */
  public void upSignSql(String relatedid, String signFromDate,String signtoDate,String sign_start_time, String scheduletype, String sign_type, String[] worktime1s, List<String> upSignSql) {
    if("2".equalsIgnoreCase(sign_type)){
      if(worktime1s.length == 5){
        String worksection1 = worktime1s[0]+"-"+worktime1s[1];
        String worksection2 = worktime1s[2]+"-"+worktime1s[3];
        if("3".equalsIgnoreCase(scheduletype)){
          String signSql1 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection1+"' , belongtime='"+worktime1s[0]+"' where signtype=1 and signtime <= '"+sign_start_time+"' and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql1);
          String signSql2 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection1+"' , belongtime='"+worktime1s[1]+"' where signtype=2 and signtime <= '"+sign_start_time+"' and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql2);

          String signSql3 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection2+"' , belongtime='"+worktime1s[2]+"' where signtype=1 and signtime >= '"+sign_start_time+"' and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql3);
          String signSql4 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection2+"' , belongtime='"+worktime1s[3]+"' where signtype=2 and signtime >= '"+sign_start_time+"' and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql4);
        }else if("4".equalsIgnoreCase(scheduletype)){
          String signSql1 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection1+"' , belongtime='"+worktime1s[0]+"' where signtype=1 and signtime <= '"+sign_start_time+"' and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql1);
          String signSql2 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection1+"' , belongtime='"+worktime1s[1]+"' where signtype=2 and signtime <= '"+sign_start_time+"' and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql2);

          String signSql3 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection2+"' , belongtime='"+worktime1s[2]+"' where signtype=1 and signtime >= '"+sign_start_time+"' and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql3);
          String signSql4 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection2+"' , belongtime='"+worktime1s[3]+"' where signtype=2 and signtime >= '"+sign_start_time+"' and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql4);
        }
      }
    }else{
      if(worktime1s.length == 5) {
        String worksection = worktime1s[0] + "-" + worktime1s[3];
        if("3".equalsIgnoreCase(scheduletype)){
          String signSql1 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+worktime1s[0]+"' where signtype=1 and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql1);
          String signSql2 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+worktime1s[3]+"' where signtype=2 and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql2);
        }else if("4".equalsIgnoreCase(scheduletype)){
          String signSql1 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+worktime1s[0]+"' where signtype=1 and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql1);
          String signSql2 = "update hrmschedulesign set belongdate=signdate,worksection='"+worksection+"' , belongtime='"+worktime1s[3]+"' where signtype=2 and userid in (select id from hrmresource where subcompanyid1 in ("+relatedid+"))  and signdate between '"+signFromDate+"' and '"+signtoDate+"'";
          upSignSql.add(signSql2);
        }
      }
    }
  }


  /**
   * 升级关联考勤组成员
   * @param memMap
   * @throws Exception
   */
  public void upGroupMem(Map<String, String> memMap) throws Exception{
    RecordSet rs_groupmem = new RecordSet();

    for(Map.Entry<String,String> me : memMap.entrySet()){
      String groupid = me.getKey();
      String mems = me.getValue();
      String[] memsArr = mems.split(separator);
      if(memsArr.length == 2){
        String scheduletype = memsArr[0];
        String type = "";
        if("3".equalsIgnoreCase(scheduletype)){
          //所有人
          type = "6";
        }else if("4".equalsIgnoreCase(scheduletype)){
          //分部
          type = "2";
        }
        String relatedid = memsArr[1];
        String memSql = " INSERT INTO kq_groupmember ( groupid ,typevalue ,type ,alllevel ," +
            " seclevel ,seclevelto ,jobtitlelevelvalue ,jobtitlelevel) " +
            " VALUES  (? ,? ,? ,?,? ,? ,? ,?)";
        rs_groupmem.executeUpdate(memSql,groupid,relatedid,type,null,0,100,null,null);
      }
    }
  }

  /**
   * 班次生成完成，绑定考勤组和班次
   * @param weekMap
   * @param serialMap
   */
  public void upGroupSerial(Map<String, Object> weekMap, Map<String, String> serialMap) throws Exception{
    RecordSet rs_groupfixed = new RecordSet();
    for(Map.Entry<String,Object> me : weekMap.entrySet()){
      String groupid = me.getKey();
      List<String> fixedList = (List<String>) me.getValue();
      if(fixedList != null && !fixedList.isEmpty()){
        for(int i = 0 ; i < fixedList.size() ; i++){
          String worktimeKey = fixedList.get(i);
          String weekday = ""+i;//星期几
          String serialid = "";
          if(serialMap.get(worktimeKey) != null){
            serialid = serialMap.get(worktimeKey);
          }
          String connectSql = "insert into kq_fixedschedulce(weekday,serialid,groupid) values(?,?,?)";
          rs_groupfixed.executeUpdate(connectSql,weekday,serialid.length()==0?null:serialid,groupid);
        }
      }
    }
  }

  /**
   * 生成班次数据
   * @param serialMap
   * @param worktimeLists
   */
  public void upSerial(Map<String, String> serialMap, List<String> worktimeLists) throws Exception{
    RecordSet rs_shift = new RecordSet();
    RecordSet rs_shift1 = new RecordSet();
    RecordSet rs_shift2 = new RecordSet();
    RecordSet rs_shift3 = new RecordSet();

    for(int i = 0 ; i < worktimeLists.size() ; i++){
      String mainSql = "insert into kq_ShiftManagement(serial,subcompanyid,shiftonoffworkcount,punchsettings,isoffdutyfreecheck,isresttimeopen,worktime,uuid,color)"
          + " values(?,?,?,?,?,?,?,?,?)";
      String times = worktimeLists.get(i);
      String[] timeArr = times.split(separator);
      if(timeArr.length == 5){
        List<String> list_work = new ArrayList<>();
        List<String> list_rest = new ArrayList<>();
        String serial = "历史考勤数据:";
        String worktime = "";
        String subcompanyid = null;
        String shiftOnOffWorkCount = "1";
        String punchSettings = null;
        String isOffDutyFreeCheck = null;
        String isRestTimeOpen = "1";
        String uuid = UUID.randomUUID().toString();
        String color = null;

        String work1 = timeArr[0];
        String work2 = timeArr[1];
        String work3 = timeArr[2];
        String work4 = timeArr[3];
        String sign_type = timeArr[4];
        if(work1.length() == 0 || work2.length() == 0 && work3.length() == 0 && work4.length() == 0){
          continue;
        }

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");

        if("2".equalsIgnoreCase(sign_type)){
          list_work.add(work1+separator+work2);
          list_work.add(work3+separator+work4);
          isRestTimeOpen = "0";
          serial += work1+"-"+work2+" "+work3+"-"+work4;
          //二次考勤
          shiftOnOffWorkCount = "2";
        }else{
          list_work.add(work1+separator+work4);
          list_rest.add(work2+separator+work3);
          serial += work1+"-"+work4;
        }
        if(work1.length() > 0 && work2.length() > 0 &&
            work3.length() > 0 && work4.length() > 0){
          Duration duration1 =  Duration.between(LocalTime.parse(work1, dtf), LocalTime.parse(work2, dtf));
          Duration duration2 =  Duration.between(LocalTime.parse(work3, dtf), LocalTime.parse(work4, dtf));
          worktime = ""+(duration1.toMinutes()+duration2.toMinutes());
        }

        boolean isUpdated = rs_shift.executeUpdate(mainSql, serial,subcompanyid,shiftOnOffWorkCount,punchSettings,isOffDutyFreeCheck,isRestTimeOpen,worktime,uuid,color);
        if(isUpdated){
          int serialid = 0;
          String idSql = "select id from kq_ShiftManagement where uuid=? ";
          rs_shift1.executeQuery(idSql,uuid);
          if(rs_shift1.next()) {
            serialid = rs_shift1.getInt("id");
          }
          if(serialid > 0){
            if("1".equalsIgnoreCase(isRestTimeOpen)){
              String restSql = "insert into kq_ShiftRestTimeSections(serialid,resttype,time) values(?,?,?)";
              for(String rest : list_rest){
                String[] rests = rest.split(separator);
                if(rests.length == 2){
                  rs_shift2.executeUpdate(restSql, serialid,"start",rests[0]);
                  rs_shift2.executeUpdate(restSql, serialid,"end",rests[1]);
                }
              }
            }
            String workSql = "insert into kq_ShiftOnOffWorkSections(serialid,across,mins,times,onoffworktype,record) values(?,?,?,?,?,?)";
            int record = 0;
            for(String work : list_work){
              String[] works = work.split(separator);
              if(works.length == 2){
                rs_shift3.executeUpdate(workSql, serialid,"0","",works[0],"start",record+"");
                rs_shift3.executeUpdate(workSql, serialid,"0","",works[1],"end",record+"");
              }
              record++;
            }
          }
          serialMap.put(times, serialid+"");
        }
      }
    }
  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空一般工作时间里的升级数据
   */
  public void clearCommonGroupData() {
    RecordSet rs = new RecordSet();
    String sql_1 = " delete from kq_shiftmanagement where id in(select kqid from hrm_to_kq_serial where serialfrom ='scheduleset')";
    rs.executeUpdate(sql_1);
    String sql_2 = "delete from kq_ShiftOnOffWorkSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='scheduleset')";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_ShiftRestTimeSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='scheduleset')" ;
    rs.executeUpdate(sql_3);

    String sql_5 = "delete from hrm_to_kq_group_weekday where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='scheduleset') ";
    rs.executeUpdate(sql_5);
    String sql_6 ="delete from kq_group where id in( select kqid from hrm_to_kq_group where groupfrom = 'scheduleset')";
    rs.executeUpdate(sql_6);
    String sql_7 ="delete from kq_fixedschedulce where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'scheduleset')";
    rs.executeUpdate(sql_7);
    String sql_8 = "delete from kq_shiftschedule where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'scheduleset')";
    rs.executeUpdate(sql_8);
    String sql_9 = "delete from kq_groupmember where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'scheduleset')";
    rs.executeUpdate(sql_9);
    String sql_10 ="delete from hrm_to_kq_group where groupfrom = 'scheduleset'";
    rs.executeUpdate(sql_10);

    String sql_4 = "delete from hrm_to_kq_serial where serialfrom ='scheduleset' ";
    rs.executeUpdate(sql_4);

    String sql_11 = "delete from kq_OvertimeRulesDetail where ruleId in(select kqid from hrm_to_kq_OverRules where rulefrom ='scheduleset') ";
    rs.executeUpdate(sql_11);

    String sql_12 = "delete from kq_OvertimeRules where id in( select kqid from hrm_to_kq_OverRules where rulefrom ='scheduleset' )";
    rs.executeUpdate(sql_12);

    String sql_13 = "delete from hrm_to_kq_OverRules where rulefrom ='scheduleset' ";
    rs.executeUpdate(sql_13);

  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空排班时间里的升级数据
   */
  public void clearScheduleGroupData() {
    RecordSet rs = new RecordSet();
    String sql_1 = " delete from kq_shiftmanagement where id in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')";
    rs.executeUpdate(sql_1);
    String sql_2 = "delete from kq_ShiftOnOffWorkSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_ShiftRestTimeSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')" ;
    rs.executeUpdate(sql_3);

    String sql_5 = "delete from hrm_to_kq_group_weekday where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset') ";
    rs.executeUpdate(sql_5);
    String sql_6 ="delete from kq_group where id in( select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_6);
    String sql_7 ="delete from kq_fixedschedulce where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_7);
    String sql_8 = "delete from kq_shiftschedule where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_8);
    String sql_9 = "delete from kq_groupmember where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_9);
    String sql_10 ="delete from hrm_to_kq_group where groupfrom = 'shiftset'";
    rs.executeUpdate(sql_10);

    String sql_4 = "delete from hrm_to_kq_serial where serialfrom ='shiftset'";
    rs.executeUpdate(sql_4);

    String sql_11 = "delete from kq_OvertimeRulesDetail where ruleId in(select kqid from hrm_to_kq_OverRules where rulefrom ='shiftset') ";
    rs.executeUpdate(sql_11);

    String sql_12 = "delete from kq_OvertimeRules where id in( select kqid from hrm_to_kq_OverRules where rulefrom ='shiftset' )";
    rs.executeUpdate(sql_12);

    String sql_13 = "delete from hrm_to_kq_OverRules where rulefrom ='shiftset' ";
    rs.executeUpdate(sql_13);

  }

  /**
   * 清空加班规则
   */
  public void clearPaidRule() {
    RecordSet rs = new RecordSet();
    String sql_1 = " delete from kq_OvertimeRules where id in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')";
    rs.executeUpdate(sql_1);
    String sql_2 = "delete from kq_ShiftOnOffWorkSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_ShiftRestTimeSections where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset')" ;
    rs.executeUpdate(sql_3);

    String sql_5 = "delete from hrm_to_kq_group_weekday where serialid in(select kqid from hrm_to_kq_serial where serialfrom ='shiftset') ";
    rs.executeUpdate(sql_5);
    String sql_6 ="delete from kq_group where id in( select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_6);
    String sql_7 ="delete from kq_fixedschedulce where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_7);
    String sql_8 = "delete from kq_shiftschedule where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_8);
    String sql_9 = "delete from kq_groupmember where groupid in(select kqid from hrm_to_kq_group where groupfrom = 'shiftset')";
    rs.executeUpdate(sql_9);
    String sql_10 ="delete from hrm_to_kq_group where groupfrom = 'shiftset'";
    rs.executeUpdate(sql_10);

    String sql_4 = "delete from hrm_to_kq_serial where serialfrom ='shiftset'";
    rs.executeUpdate(sql_4);
  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空请假类型的升级数据
   */
  public void clearLeaveRule() {
    RecordSet rs = new RecordSet();
    String sql_1 = " delete from kq_LeaveRules where id in(select kqid from hrm_to_kq_LeaveRules)";
    rs.executeUpdate(sql_1);
    String sql_2 = " delete from kq_LeaveRulesDetail where ruleid in(select kqid from hrm_to_kq_LeaveRules)";
    rs.executeUpdate(sql_2);
    String sql_3 = " delete from hrm_to_kq_LeaveRules";
    rs.executeUpdate(sql_3);
  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空工作日期调整的升级数据
   */
  public void clearPub() {
    RecordSet rs = new RecordSet();
    String sql_1 = " delete from KQ_HOLIDAYSET where id in(select kqid from hrm_to_kq_pub)";
    rs.executeUpdate(sql_1);
    String sql_2 = " delete from hrm_to_kq_pub";
    rs.executeUpdate(sql_2);

  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空假期余额的升级数据
   */
  public void clearBalance(String rulesql) {
    RecordSet rs = new RecordSet();
    String sql_1 = "delete from kq_BalanceOfLeave where leaverulesid in ("+rulesql+")";
    rs.executeUpdate(sql_1);
  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空考勤流程设置的升级数据
   */
  public void clearAttSet() {
    RecordSet rs = new RecordSet();
    String sql_1 = "delete from kq_ATT_PROC_SET where id in(select kqid from hrm_to_attSet) ";
    rs.executeUpdate(sql_1);
    String sql_2 = "delete from kq_ATT_PROC_RELATION where field001 in(select kqid from hrm_to_attSet) ";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_ATT_PROC_ACTION where field001 in(select kqid from hrm_to_attSet) ";
    rs.executeUpdate(sql_3);
    String sql_4 = "delete from hrm_to_attfield ";
    rs.executeUpdate(sql_4);
    String sql_5 = "delete from hrm_to_attSet ";
    rs.executeUpdate(sql_5);

  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空考勤流程的升级数据
   */
  public void clearFlowData(String startdate, String enddate) {
    RecordSet rs = new RecordSet();
    String sql_11 = "delete from hrm_to_flow_split where splitid in (select requestid from kq_flow_split_overtime where fromdate >='"+startdate+"' and todate <='"+enddate+"')";
    rs.executeUpdate(sql_11);
    String sql_12 = "delete from hrm_to_flow_split where splitid in (select requestid from kq_flow_split_out where fromdate >='"+startdate+"' and todate <='"+enddate+"')";
    rs.executeUpdate(sql_12);
    String sql_13 = "delete from hrm_to_flow_split where splitid in (select requestid from kq_flow_split_evection where fromdate >='"+startdate+"' and todate <='"+enddate+"')";
    rs.executeUpdate(sql_13);
    String sql_14 = "delete from hrm_to_flow_split where splitid in (select requestid from kq_flow_split_leave where fromdate >='"+startdate+"' and todate <='"+enddate+"')";
    rs.executeUpdate(sql_14);
    String sql_15 = "delete from hrm_to_flow_split where splitid in (select requestid from kq_flow_split_other where fromdate >='"+startdate+"' and todate <='"+enddate+"')";
    rs.executeUpdate(sql_15);

    String sql_1 = "delete from kq_flow_split_overtime where fromdate >='"+startdate+"' and todate <='"+enddate+"' ";
    rs.executeUpdate(sql_1);
    String sql_111 = "delete from kq_flow_overtime where belongdate >='"+startdate+"' and belongdate <='"+enddate+"' ";
    rs.executeUpdate(sql_111);
    String sql_2 = "delete from kq_flow_split_out where fromdate >='"+startdate+"' and todate <='"+enddate+"' ";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_flow_split_evection where fromdate >='"+startdate+"' and todate <='"+enddate+"' ";
    rs.executeUpdate(sql_3);
    String sql_4 = "delete from kq_flow_split_leave where fromdate >='"+startdate+"' and todate <='"+enddate+"' ";
    rs.executeUpdate(sql_4);
    String sql_5 = "delete from kq_flow_split_other where fromdate >='"+startdate+"' and todate <='"+enddate+"' ";
    rs.executeUpdate(sql_5);
  }

  /**
   * 可以重复升级数据 那就是需要升级之前先清空数据
   * 清空考勤报表的升级数据
   */
  public void clearReportData(String startdate, String enddate) {
    RecordSet rs = new RecordSet();
    String sql_1 = "delete from kq_format_pool where kqdate between '"+startdate+"' and '"+enddate+"'";
    rs.executeUpdate(sql_1);
    String sql_2 = "delete from kq_format_detail where kqdate between '"+startdate+"' and '"+enddate+"'";
    rs.executeUpdate(sql_2);
    String sql_3 = "delete from kq_format_total where kqdate between '"+startdate+"' and '"+enddate+"'";
    rs.executeUpdate(sql_3);
  }
}
