package com.engine.common.util;

import com.engine.attendance.component.persongroup.commonutil.PersongroupCommonUtil;
import com.engine.attendance.enums.ApplicableOrganizationEnum;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.PersonGroupListTypeEnum;
import com.google.common.collect.Maps;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.hrm.company.DepartmentComInfo;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.soa.workflow.request.*;

import java.sql.Date;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Collectors;

@Slf4j
public class CommonUtil {
    /**
     * 组装insert的sql语句
     * @param tableName 表名
     * @param map 列名及对应值
     * @return
     */
    public static boolean makeInsertSql(String tableName, Map<String,Object> map){
        String insertSql = "insert into "+tableName;
        String key = "(";
        String value = "(";
        List<Object> dataList = Lists.newArrayList();
        for (Map.Entry<String,Object> e : map.entrySet()){
            if (e.getValue() != null && !"".equals(e.getValue())){
                key = key + e.getKey() +",";
                value = value + "?" +",";
//                if (e.getKey().endsWith("date")){
//                    LocalDateTime localDateTime = DateUtil.getTime(String.valueOf(e.getValue()));
//                    long datelong = localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
//                    dataList.add(new Date(datelong));
//                }else {
                    dataList.add(e.getValue());
              //  }
            }
        }
        key = key.substring(0,key.length()-1) + ")";
        value = value.substring(0,value.length()-1)+")";
        insertSql = insertSql + key +" values "+value;
        log.info("makeInsertSql : [{}]",insertSql);
        log.info("needInsertDate: [{}]",dataList);
        return DbTools.update(insertSql,dataList);
    }

    /**
     * 组装update的sql语句
     * @param tableName 表名
     * @param map 列名及对应值
     * @param condition 条件
     * @return
     */
    public static String makeUpdateSql(String tableName, Map<String,Object> map,Map<String,Object> condition){
        String updateSql = "update "+tableName+" set ";
        for (Map.Entry<String,Object> e : map.entrySet()){
            if (e.getValue() !=null && !"".equals(e.getValue())){
                updateSql = updateSql + e.getKey()+"='"+e.getValue().toString()+"',";
            }
        }
        updateSql = updateSql.substring(0,updateSql.length()-1) + " where 1=1";
        for (Map.Entry<String,Object> e : condition.entrySet()){
            updateSql = updateSql + " and "+ e.getKey()+"='"+e.getValue()+"'";
        }
        log.info("makeUpdateSql : [{}]",updateSql);

        return updateSql;

    }

    /**
     * 批量插入
     * @param dataList
     * @param tableName
     * @return
     */
    public static boolean insertBatch(List<Map<String,Object>> dataList, String tableName){
        String sql = "insert into "+tableName;
        String key = "(";
        String value = "(";
        for (Map.Entry<String,Object> data : dataList.get(0).entrySet()){
            key = key + data.getKey() +",";
            value = value + "?,";
        }
        key = key.substring(0,key.length()-1) + ")";
        value = value.substring(0,value.length()-1)+")";
        sql = sql + key +" values "+value;
        log.info("insertBatch sql :"+sql);
        List<List> insertDataList = Lists.newArrayList();
        for (Map<String,Object> dataMap : dataList){
            ArrayList<Object> list = new ArrayList<>();
            for (Map.Entry<String,Object> entry : dataMap.entrySet()){
                list.add(entry.getValue());
            }
            insertDataList.add(list);
        }
        log.info("insertBatch : [{}]",insertDataList);
        return DbTools.updateBatch(sql,insertDataList);
    }

    /**
     * 获得包含该人员的适用范围的模块的数据id，按照人员-人员分组-部门-分部优先级取到最优先的
     * @param resourceId
     * @param modeId
     * @param startDate
     * @param endDate
     * @return
     */
    public static Set<String> getDataIds(String resourceId,String modeId,String startDate,String endDate){

        String sql = "select dxlx,dataid,dx from uf_jcl_syzz where modeid=?";
        List<Map<String,Object>> organizationList = DbTools.getSqlToList(sql,modeId);
        sql = "select id,departmentid,subcompanyid1 from hrmresource where id =?";
        Map<String,Object> departMentMap = DbTools.getSqlToMap(sql,resourceId);
        Set<String> dataIds = Sets.newHashSet();
        Map<String, List<Map<String,Object>>> organizationListGroupBydxlx =  organizationList.stream().collect(Collectors.groupingBy(e ->e.get("dxlx").toString()));
        //对象类型为人员
        List<Map<String,Object>> personOrganizationList = organizationListGroupBydxlx.get("0");
        //对象类型为人员组织
        List<Map<String,Object>> personGroupOrganizationList = organizationListGroupBydxlx.get("1");
        //对象类型为部门
        List<Map<String,Object>> departmentOrganizationList = organizationListGroupBydxlx.get("2");
        //对象类型为分部
        List<Map<String,Object>> subCompanyOrganizationList = organizationListGroupBydxlx.get("3");
        if (personOrganizationList != null){
            for (Map<String,Object> personOrganization :personOrganizationList){
                String dx = Util.null2String(personOrganization.get("dx"));
                String ids = dx.split("-")[0];
                if (ids.equals(resourceId)){
                    dataIds.add(Util.null2String(personOrganization.get("dataid")));
                }
            }
        }
        if (personGroupOrganizationList != null && dataIds.size() ==0){
            Set<String> personGroupIds = personGroupOrganizationList.stream().map(e -> Util.null2String(e.get("dx")).split("-")[0]).collect(Collectors.toSet());
            sql = "select mainid,empid,filters,bdate,edate from uf_ryqz_dt1  where  mainid in ("+String.join(",",personGroupIds)+")";
            log.info("query personGroupData : {}",sql);
            List<Map<String,Object>> personGroupData = DbTools.getSqlToList(sql);
            Set<String> personnelGroupIds = PersongroupCommonUtil.getPersonnelGroupingByPerson(personGroupData,resourceId,startDate,endDate);
            log.info("personnelGroupIds : {}",personnelGroupIds);
            for (Map<String,Object> personGroupOrganization :personGroupOrganizationList){
                String personnelGroupId = Util.null2String(personGroupOrganization.get("dx")).split("-")[0];
                if (personnelGroupIds.contains(personnelGroupId)){
                    dataIds.add(Util.null2String(personGroupOrganization.get("dataid")));
                }
            }
        }
        try {
            if (departmentOrganizationList != null && dataIds.size() ==0){
                String deptid = Util.null2String(departMentMap.get("departmentid"));
                String pdeptids = "";
                pdeptids = new DepartmentComInfo().getAllParentDepartId(Util.null2String(departMentMap.get("departmentid")), pdeptids);
                pdeptids = deptid + pdeptids;
                log.info("pdeptids : [{}]",pdeptids);
                for (Map<String,Object> departmentOrganization :departmentOrganizationList){
                    String dx = Util.null2String(departmentOrganization.get("dx"));
                    String ids = dx.split("-")[0];
                    for (String pdeptid : pdeptids.split(",")){
                        if (pdeptid.equals(ids)){
                            dataIds.add(Util.null2String(departmentOrganization.get("dataid")));
                        }
                    }
                }
            }
        }catch (Exception e){
            log.error("catch error :{}",e);
        }
        if (subCompanyOrganizationList != null && dataIds.size() ==0){
            String subCompanyId = Util.null2String(departMentMap.get("subcompanyid1"));
            for (Map<String,Object> subCompanyOrganization :subCompanyOrganizationList){
                String dx = Util.null2String(subCompanyOrganization.get("dx"));
                String ids = dx.split("-")[0];
                if (ids.equals(subCompanyId)){
                    dataIds.add(Util.null2String(subCompanyOrganization.get("dataid")));
                }
            }
        }


        log.info("dataIds : {}",dataIds);

        return dataIds;
    }


    /**
     * 获得包含该人员的适用范围的模块的所有数据id，
     * @param resourceId
     * @param modeId
     * @param startDate
     * @param endDate
     * @return
     */
    public static Set<String> getAllDataIds(String resourceId,String modeId,String startDate,String endDate){

        String sql = "select dxlx,dataid,dx from uf_jcl_syzz where modeid=?";
        List<Map<String,Object>> organizationList = DbTools.getSqlToList(sql,modeId);
        sql = "select id,departmentid,subcompanyid1 from hrmresource where id =?";
        Map<String,Object> departMentMap = DbTools.getSqlToMap(sql,resourceId);
        Set<String> dataIds = Sets.newHashSet();
        Map<String, List<Map<String,Object>>> organizationListGroupBydxlx =  organizationList.stream().collect(Collectors.groupingBy(e ->e.get("dxlx").toString()));
        //对象类型为人员
        List<Map<String,Object>> personOrganizationList = organizationListGroupBydxlx.get("0");
        //对象类型为人员组织
        List<Map<String,Object>> personGroupOrganizationList = organizationListGroupBydxlx.get("1");
        //对象类型为部门
        List<Map<String,Object>> departmentOrganizationList = organizationListGroupBydxlx.get("2");
        //对象类型为分部
        List<Map<String,Object>> subCompanyOrganizationList = organizationListGroupBydxlx.get("3");
        if (personOrganizationList != null){
            for (Map<String,Object> personOrganization :personOrganizationList){
                String dx = Util.null2String(personOrganization.get("dx"));
                String ids = dx.split("-")[0];
                if (ids.equals(resourceId)){
                    dataIds.add(Util.null2String(personOrganization.get("dataid")));
                }
            }
        }
        if (personGroupOrganizationList != null){
            Set<String> personGroupIds = personGroupOrganizationList.stream().map(e -> Util.null2String(e.get("dx")).split("-")[0]).collect(Collectors.toSet());
            sql = "select mainid,empid,filters,bdate,edate from uf_ryqz_dt1  where  mainid in ("+String.join(",",personGroupIds)+")";
            log.info("query personGroupData : {}",sql);
            List<Map<String,Object>> personGroupData = DbTools.getSqlToList(sql);
            Set<String> personnelGroupIds = PersongroupCommonUtil.getPersonnelGroupingByPerson(personGroupData,resourceId,startDate,endDate);
            log.info("personnelGroupIds : {}",personnelGroupIds);
            for (Map<String,Object> personGroupOrganization :personGroupOrganizationList){
                String personnelGroupId = Util.null2String(personGroupOrganization.get("dx")).split("-")[0];
                if (personnelGroupIds.contains(personnelGroupId)){
                    dataIds.add(Util.null2String(personGroupOrganization.get("dataid")));
                }
            }
        }
        try {
            if (departmentOrganizationList != null){
                String deptid = Util.null2String(departMentMap.get("departmentid"));
                String pdeptids = "";
                pdeptids = new DepartmentComInfo().getAllParentDepartId(Util.null2String(departMentMap.get("departmentid")), pdeptids);
                pdeptids = deptid + pdeptids;
                log.info("pdeptids : [{}]",pdeptids);
                for (Map<String,Object> departmentOrganization :departmentOrganizationList){
                    String dx = Util.null2String(departmentOrganization.get("dx"));
                    String ids = dx.split("-")[0];
                    for (String pdeptid : pdeptids.split(",")){
                        if (pdeptid.equals(ids)){
                            dataIds.add(Util.null2String(departmentOrganization.get("dataid")));
                        }
                    }
                }
            }
        }catch (Exception e){
            log.error("catch error :{}",e);
        }
        if (subCompanyOrganizationList != null){
            String subCompanyId = Util.null2String(departMentMap.get("subcompanyid1"));
            for (Map<String,Object> subCompanyOrganization :subCompanyOrganizationList){
                String dx = Util.null2String(subCompanyOrganization.get("dx"));
                String ids = dx.split("-")[0];
                if (ids.equals(subCompanyId)){
                    dataIds.add(Util.null2String(subCompanyOrganization.get("dataid")));
                }
            }
        }


        log.info("dataIds : {}",dataIds);

        return dataIds;
    }
    public static boolean ifContainStr(String fatherStr,String sonStr,String mark){
        for (String pdeptid : fatherStr.split(mark)){
            if (pdeptid.equals(sonStr)){
                return true;
            }
        }
        return false;
    }

    /**
     * 根据流程requestInfo消息对象获取流程主表字段的信息的map集合
     * @param requestInfo
     * @return
     */
    public static HashMap<String,String> getMainTableInfo(RequestInfo requestInfo){
        HashMap<String,String> mainMap = new HashMap<String,String>();
        Property[] properties = requestInfo.getMainTableInfo().getProperty();// 获取表单主字段信息

        for (int i = 0; i < properties.length; i++) {
            String name = properties[i].getName();// 主字段名称
            String value = Util.null2String(properties[i].getValue());// 主字段对应的值
            mainMap.put(name, value);
        }
        mainMap.put("id",String.valueOf(requestInfo.getRequestManager().getBillid()));
        return mainMap;
    }


    /**
     * 明细
     * @param request
     * @return
     */
    public static List<Map<String, String>> getDetailTableInfo(RequestInfo request, int index) {
        // 获取明细的信息
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        DetailTable[] detailtables = request.getDetailTableInfo().getDetailTable();// 获取明细表数据
        if (detailtables.length > index) {
            DetailTable dt = detailtables[index];// 获取明细表 0代表明细表1
            log.info("getDetailTableInfo :[{}]",dt.getTableDBName());
            Row[] rows = dt.getRow();// 获取明细表中所有行的信息
            for (int i = 0; i < rows.length; i++) {
                Row row = rows[i];// 获取具体行信息
                Cell[] cells = row.getCell();// 获取具体行所有列的信息
                Map<String, String> map = new HashMap<String, String>();
                for (int j = 0; j < cells.length; j++) {
                    Cell cell = cells[j];
                    String name = cell.getName().toLowerCase();// 获取字段名
                    String value = cell.getValue();// 获取具体的值
                    map.put(name, value);
                }
                map.put("id",row.getId());
                list.add(map);
            }
        }
        return list;
    }

    /**
     * 获取适用范围对应的人员id列表，适用范围由dataId和modeId获得
     * @param dataId
     * @param modeId
     * @return
     */
    public static List<String> getEmpIds(String dataId,String modeId) {
        List<String> empIdList = new ArrayList<>();
        String sql = "select dxlx,aqjb,dx from uf_jcl_syzz where modeid=? and dataid = ?";
        //适用组织所有值集合
        List<Map<String,Object>> organizationList = DbTools.getSqlToListKeySmallLetter(sql,modeId, dataId);
        //分组
        List<Map<String, String>> empIdInfos = new ArrayList<>();
        List<Map<String, String>> empGroupIdInfos = new ArrayList<>();
        List<Map<String, String>> depIdInfos = new ArrayList<>();
        List<Map<String, String>> subCompanyIdInfos = new ArrayList<>();
        for (Map<String,Object> organization : organizationList){
            String id = Util.null2String(organization.get("dx")).split("-")[0];
            String securityLevel = Util.null2String(organization.get("aqjb"));
            String[] securityLevelArr = securityLevel.split("-");
            String minSecurityLevel = securityLevel.substring(0, 1).equals("-") ? "" : securityLevelArr[0];
            String maxSecurityLevel = "";
            if (securityLevelArr.length == 1 && !securityLevelArr[0].equals(minSecurityLevel)) {
                maxSecurityLevel = securityLevelArr[0];
            } else if (securityLevelArr.length == 2) {
                maxSecurityLevel = securityLevelArr[1];
            }
            if (ApplicableOrganizationEnum.PERSONNEL.getKey().equals(organization.get("dxlx"))){
                Map<String,String> infoItem = new HashMap<>();
                infoItem.put("id", id);
                infoItem.put("minSecurityLevel", minSecurityLevel);
                infoItem.put("maxSecurityLevel", maxSecurityLevel);
                empIdInfos.add(infoItem);
            }else if (ApplicableOrganizationEnum.PERSONNEL_GROUP.getKey().equals(organization.get("dxlx"))){
                Map<String,String> infoItem = new HashMap<>();
                infoItem.put("id", id);
                infoItem.put("minSecurityLevel", minSecurityLevel);
                infoItem.put("maxSecurityLevel", maxSecurityLevel);
                empGroupIdInfos.add(infoItem);
            }else if (ApplicableOrganizationEnum.DEPARTMENT.getKey().equals(organization.get("dxlx"))){
                Map<String,String> infoItem = new HashMap<>();
                infoItem.put("id", id);
                infoItem.put("minSecurityLevel", minSecurityLevel);
                infoItem.put("maxSecurityLevel", maxSecurityLevel);
                depIdInfos.add(infoItem);
            }else if (ApplicableOrganizationEnum.SUBCOMPANY.getKey().equals(organization.get("dxlx"))){
                Map<String,String> infoItem = new HashMap<>();
                infoItem.put("id", id);
                infoItem.put("minSecurityLevel", minSecurityLevel);
                infoItem.put("maxSecurityLevel", maxSecurityLevel);
                subCompanyIdInfos.add(infoItem);
            }
        }
        //人员类型
        log.info("empIdInfos : " + empIdInfos);
        for (Map<String, String> map : empIdInfos) {
            String id = map.get("id");
            String minSecurityLevel = map.get("minSecurityLevel");
            String maxSecurityLevel = map.get("maxSecurityLevel");
            //查询目标人员信息
            String querySql = "select * from hrmresource where id = " + id;
            if (!minSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel >= " +minSecurityLevel;
            }
            if (!maxSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel <= " +maxSecurityLevel;
            }
            Map<String,Object> data = DbTools.getSqlToMap(querySql);
            log.info("querySql : " + querySql);
            if (data.size() > 0) {
                empIdList.add(id);
            }
        }
        //人员分组类型
        log.info("empGroupIdInfos : " + empGroupIdInfos);
        for (Map<String, String> map : empGroupIdInfos) {
            String id = map.get("id");
            String minSecurityLevel = map.get("minSecurityLevel");
            String maxSecurityLevel = map.get("maxSecurityLevel");
            //获取分组包含人员id
            List<String> empIdsByGroup = getEmpGroupUserIds(id);
            log.info("empGroupId : " + id + ", empIdsByGroup : " + empIdsByGroup);
            //查询目标人员信息
            if (empIdsByGroup.size() > 0) {
                String querySql = "select * from hrmresource where id = in ("+String.join(",",empIdsByGroup)+")";
                if (!minSecurityLevel.equals("")) {
                    querySql = querySql + " and seclevel >= " +minSecurityLevel;
                }
                if (!maxSecurityLevel.equals("")) {
                    querySql = querySql + " and seclevel <= " +maxSecurityLevel;
                }
                List<Map<String,Object>> datas = DbTools.getSqlToListKeySmallLetter(querySql);
                log.info("querySql : " + querySql);
                if (datas.size() > 0) {
                    log.info("datas.size : " + datas.size());
                    datas.forEach(f -> empIdList.add(f.get("id").toString()));
                }
            }
        }
        //部门类型
        log.info("depIdInfos : " + depIdInfos);
        for (Map<String, String> map : depIdInfos) {
            String id = map.get("id");
            String minSecurityLevel = map.get("minSecurityLevel");
            String maxSecurityLevel = map.get("maxSecurityLevel");
            //查询目标人员信息
            String querySql = "select * from hrmresource where departmentid = " + id;
            if (!minSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel >= " +minSecurityLevel;
            }
            if (!maxSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel <= " +maxSecurityLevel;
            }
            List<Map<String,Object>> datas = DbTools.getSqlToListKeySmallLetter(querySql);
            log.info("querySql : " + querySql);
            if (datas.size() > 0) {
                log.info("datas.size : " + datas.size());
                datas.forEach(f -> empIdList.add(f.get("id").toString()));
            }
        }
        //分部类型
        log.info("subCompanyIdInfos : " + subCompanyIdInfos);
        for (Map<String, String> map : subCompanyIdInfos) {
            String id = map.get("id");
            String minSecurityLevel = map.get("minSecurityLevel");
            String maxSecurityLevel = map.get("maxSecurityLevel");
            //查询目标人员信息
            String querySql = "select * from hrmresource where subcompanyid1 = " + id;
            if (!minSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel >= " +minSecurityLevel;
            }
            if (!maxSecurityLevel.equals("")) {
                querySql = querySql + " and seclevel <= " +maxSecurityLevel;
            }
            List<Map<String,Object>> datas = DbTools.getSqlToListKeySmallLetter(querySql);
            log.info("querySql : " + querySql);
            if (datas.size() > 0) {
                log.info("datas.size : " + datas.size());
                datas.forEach(f -> empIdList.add(f.get("id").toString()));
            }
        }

        return empIdList;
    }

    /**
     * 获得人员分组下面的人员集合
     * @param empGroupId
     * @return 人员id集合
     */
    public static List<String> getEmpGroupUserIds(String empGroupId){
        String sql = "select b.mainid,b.empid,b.filters,b.bdate,b.edate,a.list_type from uf_ryqz a left join uf_ryqz_dt1 b on a.id=b.mainid where  mainid = " + empGroupId;

        List<Map<String,Object>> personGroupDataList = DbTools.getSqlToListKeySmallLetter(sql);

        List<String> empIdList = new ArrayList<>();
        for (Map<String,Object> personGroupData :personGroupDataList){
            String id = Util.null2String(personGroupData.get("mainid"));
            String empid = Util.null2String(personGroupData.get("empid"));
            String filters = Util.null2String(personGroupData.get("filters"));
            String list_type = Util.null2String(personGroupData.get("list_type"));

            if ("0".equals(list_type) && !"".equals(empid)){
                //人员清单
                empIdList.add(empid);
            }else if ("1".equals(list_type) && !"".equals(filters)){
                //条件清单
                sql = "select id,seclevel from hrmresource where 1=1 ";
                if (filters.contains("field")){
                    sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType' and scopeid=-1 and "+filters;
                }else {
                    filters = filters.replace("ａｎｄ","and");
                    filters = filters.replace("ｏｒ","or");
                    sql = sql+ " and "+filters;
                }
                log.info("getPersonnelGroupingByPerson filter sql : {}",sql);
                List<Map<String,Object>> dataList = DbTools.getSqlToListKeySmallLetter(sql);
                for (Map<String,Object> dataMap :dataList){
                    String hrmId = Util.null2String(dataMap.get("id"));
                    String seclevel = Util.null2String(dataMap.get("seclevel"));
                    empIdList.add(hrmId);
                }
            }
        }
        return empIdList;
    }

    /**
     * 获得人员分组下面的人员信息映射，人员id-起始生效期、结束生效期信息
     * @param empGroupId 分组id
     * @return
     */
    public static Map<String, Object> getEmpGroupUserInfo(String empGroupId){
        String sql = "select b.mainid,b.empid,b.filters,b.bdate,b.edate,a.list_type from uf_ryqz a left join uf_ryqz_dt1 b on a.id=b.mainid where  mainid = " + empGroupId;
        List<Map<String,Object>> personGroupDataList = DbTools.getSqlToListKeySmallLetter(sql);

        Map<String, Object> empGroupUserInfo = new HashMap<>();
        Map<String, Object> forceTimeItem = null;
        List<Map<String, Object>> forceTimeItemList = null;
        for (Map<String,Object> personGroupData :personGroupDataList){
            String id = Util.null2String(personGroupData.get("mainid"));
            String empid = Util.null2String(personGroupData.get("empid"));
            String bdate = Util.null2String(personGroupData.get("bdate"));
            String edate = Util.null2String(personGroupData.get("edate"));
            String filters = Util.null2String(personGroupData.get("filters"));
            String list_type = Util.null2String(personGroupData.get("list_type"));

            if ("0".equals(list_type) && !"".equals(empid)){
                //人员清单
                empGroupUserInfo.put("listType", PersonGroupListTypeEnum.PERSON.getKey());
                forceTimeItem = new HashMap<>();
                forceTimeItem.put("startDate", bdate);
                forceTimeItem.put("endDate", edate);
                empGroupUserInfo.put(empid, forceTimeItem);
            }else if ("1".equals(list_type) && !"".equals(filters)){
                empGroupUserInfo.put("listType", PersonGroupListTypeEnum.CONDITION.getKey());
                //条件清单
                sql = "select id,seclevel from hrmresource where 1=1 ";
                if (filters.contains("field")){
                    sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType' and scopeid=-1 and "+filters;
                }else {
                    filters = filters.replace("ａｎｄ","and");
                    filters = filters.replace("ｏｒ","or");
                    sql = sql+ " and "+filters;
                }
                log.info("getPersonnelGroupingByPerson filter sql : {}",sql);
                List<Map<String,Object>> dataList = DbTools.getSqlToListKeySmallLetter(sql);
                for (Map<String,Object> dataMap :dataList){
                    String hrmId = Util.null2String(dataMap.get("id"));
                    String seclevel = Util.null2String(dataMap.get("seclevel"));
                    if (empGroupUserInfo.get(hrmId) == null) {
                        forceTimeItemList = new ArrayList<>();
                        forceTimeItem = new HashMap<>();
                        forceTimeItem.put("startDate", bdate);
                        forceTimeItem.put("endDate", edate);
                        forceTimeItemList.add(forceTimeItem);
                        empGroupUserInfo.put(hrmId, forceTimeItemList);
                    } else {
                        List<Map<String, Object>> existForceTimeItemList = (List<Map<String, Object>>) empGroupUserInfo.get(hrmId);
                        forceTimeItem = new HashMap<>();
                        forceTimeItem.put("startDate", bdate);
                        forceTimeItem.put("endDate", edate);
                        existForceTimeItemList.add(forceTimeItem);
                        empGroupUserInfo.put(hrmId, existForceTimeItemList);
                    }
                }
            }
        }
        return empGroupUserInfo;
    }

    /**
     * 获取附带假期使用额度概念的假期类型列表
     * @return
     */
    public static List<String> getJqInfoWithAmount() {
        List<String> jqIdList = new ArrayList<>();
        //来自假期额度
        String sql1 = "select * from uf_jcl_kq_jqed";
        List<Map<String,Object>> data1 = DbTools.getSqlToList(sql1);
        for (Map<String, Object> map : data1) {
            jqIdList.add(Util.null2String(map.get("jb")));
        }
        //来自加班类型的考勤项目中关联的假期类型
        String sql2 = "select * from uf_jcl_kq_kqxm where xmlx = 4 and jbzdzjqye = 1";
        List<Map<String,Object>> data2 = DbTools.getSqlToList(sql2);
        for (Map<String, Object> map : data2) {
            String jqId = Util.null2String(map.get("zrdjb"));
            if (!"".equals(jqId)) {
                jqIdList.add(jqId);
            }
        }
        jqIdList = jqIdList.stream().distinct().collect(Collectors.toList());
        return jqIdList;
    }

    /**
     * 获得人员对应日期所属的日期类型
     * @param userId
     * @param date
     * @return
     */
    public static String getRqlx(String userId,String date){
        String modeId = Utils.getFormmodeIdMap().get("uf_jcl_kq_rlmc");
        Set<String> calendarSetIdsSets = CommonUtil.getDataIds(userId,modeId,DateUtil.getCurrentDate(),DateUtil.getCurrentDate());
        log.info("getRqlx calendarSetIdsSets : [{}]",calendarSetIdsSets);
        String rqlx = "";
        if (calendarSetIdsSets.size() > 0){
            String sql = "select rqlx from uf_jcl_kq_rlxx where rlmc=? and rq=?";
            List<Map<String,Object>> dataList = DbTools.getSqlToList(sql,calendarSetIdsSets.toArray()[0],date);
            if (dataList.size() > 0){
                rqlx = dataList.get(0).get("rqlx").toString();
            }else {
                rqlx = Utils.getDefaultDateType(userId,date);
            }
        }else {
            rqlx = Utils.getDefaultDateType(userId,date);
        }
        return rqlx;
    }

    /**
     * 获得该班次是否休息
     * @param classId
     * @return
     */
    public static String ifrestByClass(String classId){
        String sql = "select id,sfxx from uf_jcl_kq_bcxx where id = ?";
        List<Map<String,Object>> list = DbTools.getSqlToList(sql,classId);
        if (list.size() > 0){
            return Util.null2String(list.get(0).get("sfxx")).equals("") ?CheckBoxEnum.UNCHECKED.getValue() : Util.null2String(list.get(0).get("sfxx"));
        }else {
            return CheckBoxEnum.UNCHECKED.getKey();
        }
    }

    /**
     * 获取人员id和姓名的映射
     * @return
     */
    public static Map<String, String> empIdToNameInfo() {
        Map<String, String> resultMap = new HashMap<>();
        String sql = "select id,lastname from hrmresource";
        List<Map<String,Object>> list = DbTools.getSqlToList(sql);
        for (Map<String, Object> map : list) {
            resultMap.put(map.get("id").toString(), Util.null2String(map.get("lastname")));
        }
        return resultMap;
    }

    /**
     * 获取分部id和名称的映射
     * @return
     */
    public static Map<String, String> subCompanyIdToNameInfo() {
        Map<String, String> resultMap = new HashMap<>();
        String sql = "select id,subcompanyname from hrmsubcompany";
        List<Map<String,Object>> list = DbTools.getSqlToList(sql);
        for (Map<String, Object> map : list) {
            resultMap.put(map.get("id").toString(), Util.null2String(map.get("subcompanyname")));
        }
        return resultMap;
    }

    /**
     * 获取部门id和名称的映射
     * @return
     */
    public static Map<String, String> depIdToNameInfo() {
        Map<String, String> resultMap = new HashMap<>();
        String sql = "select id,departmentname from hrmdepartment";
        List<Map<String,Object>> list = DbTools.getSqlToList(sql);
        for (Map<String, Object> map : list) {
            resultMap.put(map.get("id").toString(), Util.null2String(map.get("departmentname")));
        }
        return resultMap;
    }

    /**
     * 获取考勤项目id和名称的映射
     * @return
     */
    public static Map<String, String> kqxmIdToNameInfo() {
        Map<String, String> resultMap = new HashMap<>();
        String sql = "select id,mc from uf_jcl_kq_kqxm";
        List<Map<String,Object>> list = DbTools.getSqlToList(sql);
        for (Map<String, Object> map : list) {
            resultMap.put(map.get("id").toString(), Util.null2String(map.get("mc")));
        }
        return resultMap;
    }
}
