package com.engine.organization.service.impl;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.engine.core.impl.Service;
import com.engine.organization.entity.map.JclOrgMap;
import com.engine.organization.entity.scheme.po.GradePO;
import com.engine.organization.entity.scheme.po.LevelPO;
import com.engine.organization.entity.staff.po.StaffPO;
import com.engine.organization.mapper.jclorgmap.JclOrgMapper;
import com.engine.organization.mapper.scheme.GradeMapper;
import com.engine.organization.mapper.scheme.LevelMapper;
import com.engine.organization.mapper.staff.StaffMapper;
import com.engine.organization.service.OrgChartService;
import com.engine.organization.util.HasRightUtil;
import com.engine.organization.util.OrganizationDateUtil;
import com.engine.organization.util.db.DBType;
import com.engine.organization.util.db.MapperProxyFactory;
import com.engine.organization.util.detach.DetachUtil;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.hrm.User;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @className: OrgChartServiceImpl
 * @author: dengjp
 * @date: 2022/7/7
 * @description: 组织架构图ServiceImpl
 **/
public class OrgChartServiceImpl extends Service implements OrgChartService {

    private RecordSet grs = new RecordSet();

    private static final String COMPANY_RIGHT = "OrgChart:All";
    private static final String USER_RIGHT = "OrgPerspective:All";
    private final String level = getFieldName("职等");
    private final String grade = getFieldName("职级");

    @Override
    public Map<String, Object> getOptionCondition(Map<String, Object> request2Map, User user) {
        Map<String, Object> result = new HashMap<>();
        RecordSet rs = new RecordSet();

        rs.executeQuery("select id, companyname from HrmCompanyVirtual order by id");
        List<Map<String, Object>> fclasslist = new ArrayList<>();
        Map<String, Object> defaultItem = new HashMap<>();
        defaultItem.put("id", "0");
        defaultItem.put("companyname", "行政维度");
        fclasslist.add(defaultItem);
        while (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", rs.getString("id"));
            item.put("companyname", rs.getString("companyname"));
            fclasslist.add(item);
        }
        String sql = "select id, fnumber, fname, ftype from jcl_org_map where ftype in (0, 1) ";

        // 分部分权过滤
        DetachUtil detachUtil = new DetachUtil(user);
        if (detachUtil.isDETACH()) {
            String jclRoleLevels = detachUtil.getJclRoleLevels();
            if (StringUtils.isNotBlank(jclRoleLevels)) {
                sql = "select id, fnumber, fname, ftype from jcl_org_map where (ftype = 0 or (ftype = 1 and fobjid  in(" + jclRoleLevels + "))) ";
            } else {
                sql = "select id, fnumber, fname, ftype from jcl_org_map where ftype = 0 ";
            }
        }
        rs.executeQuery(sql + " and fdateend > " + DBType.get(new RecordSet().getDBType()).currentDate() + " order by ftype , id,fdateend desc ");
        Set<OrgSelectItem> companySet = new HashSet<>();
        while (rs.next()) {
            OrgSelectItem item = new OrgSelectItem();
            item.setId(rs.getString("id"));
            item.setFnumber(rs.getString("fnumber"));
            item.setFname(rs.getString("fname"));
            companySet.add(item);
        }
        result.put("api_status", true);
        result.put("fclasslist", fclasslist);
        result.put("companylist", companySet);
        return result;
    }

    private String companyDateWhereSql(Map<String, Object> request2Map) {
        String date = (String) request2Map.get("date");  // 数据日期
        if (StringUtils.isBlank(date)) {
            date = DateUtil.format(DateUtil.offset(new Date(), DateField.DAY_OF_MONTH, 1), "yyyy-MM-dd");
        }

        String fclass = (String) request2Map.get("fclass");  // 维度


        String fisvitual = (String) request2Map.get("fisvitual");  // 是否显示虚拟组织
        if (StringUtils.isBlank(fisvitual)) {
            fisvitual = "0";
        }

        String whereSql = " where 1 = 1 ";
        if (DBType.isOracle()) {
            whereSql += " and ((fdatebegin <=  to_date('" + date + "','yyyy-MM-DD') and fdateend >= to_date('" + date + "','yyyy-MM-DD')) or (fdatebegin <= to_date('" + date + "','yyyy-MM-DD') and fdateend is null )) ";
        } else {
            whereSql += " and ((fdatebegin <= '" + date + "' and fdateend >= '" + date + "') or (fdatebegin <= '" + date + "' and fdateend is null )) ";
        }
        whereSql += " and fclass = " + fclass + " ";

        if ("0".equals(fisvitual)) {
            whereSql += " and fisvitual = 0 ";
        } else {
            whereSql += " and fisvitual in (0, 1) ";
        }

        whereSql += " and ftype in (0 , 1 ,2) ";
        return whereSql;
    }

    @Override
    public Map<String, Object> getCompanyData(Map<String, Object> request2Map, User user) {
        Map<String, Object> result = new HashMap<>();
        boolean hasRight = HasRightUtil.hasRight(user, COMPANY_RIGHT, true);
        result.put("hasRight", hasRight);
        if (!hasRight) {
            return result;
        }

        String root = (String) request2Map.get("root");  // 根节点
        String level = (String) request2Map.get("level"); // 显示层级
        if (StringUtils.isBlank(level)) {
            level = "3";
        }
        String whereSql = companyDateWhereSql(request2Map);

        String whereItemSql = " ";
        if ("0".equals(root)) { // 集团的情况
            whereItemSql += " and ftype = 0 ";
        } else {
            whereItemSql += " and id = '" + root + "' ";
        }

        // 获取根节点
        RecordSet rs = new RecordSet();
        rs.executeQuery("select id, fname, ftype, fparentid, fnumber, fobjid, fisvitual from jcl_org_map " + whereSql + whereItemSql);
        List<Map<String, Object>> list = new ArrayList<>();
        String id = null;
        if (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            id = rs.getString("id");
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("fnumber", rs.getString("fnumber"));
            item.put("fobjid", rs.getString("fobjid"));
            item.put("parentId", null);
            item.put("expand", "1");
            item.put("fisvitual", rs.getString("fisvitual"));
            item.put("hasChildren", hasChildren(rs.getString("id"), true));
            list.add(item);
        }

        int currentLevel = 1;
        findCompanyItemByParantId(id, currentLevel + 1, level, rs, list, whereSql, currentLevel + 1 <= Integer.parseInt(level));

        // 分部数据，构建层级关系
        reBuildTreeList(list, root);

        result.put("api_status", true);
        result.put("data", list);
        return result;
    }

    private void findCompanyItemByParantId(String id, int currentLevel, String level, RecordSet rs, List<Map<String, Object>> list, String whereSql, boolean expand) {
        String sql = "select id, fname, ftype, fparentid,fobjid,fecid,fnumber,fisvitual from jcl_org_map " + whereSql;
        DetachUtil detachUtil = new DetachUtil(user);
        if (detachUtil.isDETACH()) {
            if ("0".equals(id)) {
                sql += " and ftype = 1 and fobjid in(" + detachUtil.getJclRoleLevels() + ")";
            } else {
                sql += " and fparentid = " + id + " and ftype !=1";
            }
        } else {
            sql += " and fparentid = " + id;
        }
        rs.executeQuery(sql);
        List<Map<String, Object>> currentList = new ArrayList<>();
        while (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("parentId", rs.getString("fparentid"));
            item.put("fnumber", rs.getString("fnumber"));
            item.put("fobjid", rs.getString("fobjid"));
            item.put("fecid", rs.getString("fecid"));
            item.put("fisvitual", rs.getString("fisvitual"));
            item.put("expand", expand ? "1" : "0");
            item.put("hasChildren", hasChildren(rs.getString("id"), true));
            currentList.add(item);
        }

        list.addAll(currentList);

        for (Map<String, Object> stringObjectMap : currentList) {
            if (currentLevel + 1 <= Integer.parseInt(level)) {
                findCompanyItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, true);
            } else if (currentLevel == Integer.parseInt(level)) {
                findCompanyItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, false);
            }
        }

    }

    private String userWhereSql(Map<String, Object> request2Map) {
        String date = (String) request2Map.get("date");  // 数据日期
        if (StringUtils.isBlank(date)) {
            date = DateUtil.format(DateUtil.offset(new Date(), DateField.DAY_OF_MONTH, 1), "yyyy-MM-dd");
        }

        String fclass = (String) request2Map.get("fclass");  // 维度

        String fisvitual = (String) request2Map.get("fisvitual");  // 是否显示虚拟组织
        if (StringUtils.isBlank(fisvitual)) {
            fisvitual = "0";
        }

        String whereSql = " where 1 = 1 ";
        if (DBType.isOracle()) {
            whereSql += " and ((t.fdatebegin <=  to_date('" + date + "','yyyy-MM-DD') and t.fdateend >= to_date('" + date + "','yyyy-MM-DD')) or (t.fdatebegin <= to_date('" + date + "','yyyy-MM-DD') and t.fdateend is null )) ";
        } else {
            whereSql += " and ((t.fdatebegin <= '" + date + "' and t.fdateend >= '" + date + "') or (t.fdatebegin <= '" + date + "' and t.fdateend is null )) ";
        }
        whereSql += " and t.fclass = " + fclass + " ";

        if ("0".equals(fisvitual)) {
            whereSql += " and t.fisvitual = 0 ";
        } else {
            whereSql += " and t.fisvitual in (0, 1) ";
        }
        return whereSql;
    }

    @Override
    public Map<String, Object> getUserData(Map<String, Object> request2Map, User user) {
        Map<String, Object> result = new HashMap<>();
        boolean hasRight = HasRightUtil.hasRight(user, USER_RIGHT, true);
        result.put("hasRight", hasRight);
        if (!hasRight) {
            return result;
        }
        String root = (String) request2Map.get("root");  // 根节点
        String level = (String) request2Map.get("level"); // 显示层级
        if (StringUtils.isBlank(level)) {
            level = "3";
        }

        String whereSql = userWhereSql(request2Map);

        String whereItemSql = " ";
        if ("0".equals(root)) { // 集团的情况
            whereItemSql += " and t.ftype = 0 ";
        } else {
            whereItemSql += " and t.id = '" + root + "' ";
        }

        // 获取根节点
        RecordSet rs = new RecordSet();
        rs.executeQuery("select t.id, t.fname, t.ftype, t.fparentid, t.fleadername,t.fobjid,t.fecid, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber, t.fleader, t.fleaderlv, t.fleaderst, t.fecid, t.fisvitual from jcl_org_map t " + whereSql + whereItemSql);
        List<Map<String, Object>> list = new ArrayList<>();
        String id = null;
        if (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            id = rs.getString("id");
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("parentId", null);
            if ("0".equals(id)) {
                item.put("fleadername", "");
                item.put("fleaderimg", "");
                item.put("fleaderjob", "");
                item.put("fleader", "");
            } else {
                item.put("fleadername", rs.getString("fleadername"));
                item.put("fleaderimg", rs.getString("fleaderimg"));
                item.put("fleaderjob", rs.getString("fleaderjob"));
                item.put("fleader", rs.getString("fleader"));
            }
            item.put("fplan", rs.getString("fplan"));
            item.put("fonjob", rs.getString("fonjob"));
            item.put("hasChildren", hasChildren(rs.getString("id"), false));
            item.put("expand", "1");
            item.put("fnumber", rs.getString("fnumber"));
            item.put("fobjid", rs.getString("fobjid"));
            item.put("fleaderlv", convertLevel(rs.getString("fleaderlv")));
            item.put("fleaderst", convertGrade(rs.getString("fleaderst")));
            item.put("fecid", rs.getString("fecid"));
            item.put("fisvitual", rs.getString("fisvitual"));
            list.add(item);
        }

        int currentLevel = 1;
        findUserItemByParantId(id, currentLevel + 1, level, rs, list, whereSql, currentLevel + 1 <= Integer.parseInt(level));

        // 分部数据，构建层级关系
        reBuildTreeList(list, root);

        result.put("api_status", true);
        result.put("data", list);
        return result;
    }

    @Override
    public Map<String, Object> asyncUserData(Map<String, Object> request2Map, User user) {
        String ids = (String) request2Map.get("ids");
        String whereSql = userWhereSql(request2Map);

        whereSql += " and fparentid in (" + ids + ") ";

        RecordSet rs = new RecordSet();
        rs.executeQuery("select t.id, t.fname, t.ftype, t.fparentid, t.fleadername, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber, t.fleader,t.fleaderlv, t.fleaderst,t.fobjid,t.fisvitual from jcl_org_map t " + whereSql);
        List<Map<String, Object>> currentList = new ArrayList<>();
        while (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("parentId", rs.getString("fparentid"));
            item.put("fplan", rs.getString("fplan"));
            item.put("fonjob", rs.getString("fonjob"));
            item.put("fnumber", rs.getString("fnumber"));
            item.put("hasChildren", hasChildren(rs.getString("id"), false));
            if (rs.getString("ftype").equals("2")) {
                JclOrgMap jclOrgMap = getBmfzrInfo(rs.getString("fleader"));
                item.put("fleader", jclOrgMap.getFLeader() == null ? "" : String.valueOf(jclOrgMap.getFLeader()));
                item.put("fleaderimg", jclOrgMap.getFLeaderImg());
                item.put("fleadername", jclOrgMap.getFLeaderName() == null ? "" : jclOrgMap.getFLeaderName());
                item.put("fleaderjob", jclOrgMap.getFLeaderJob());
                item.put("fleaderlv", convertLevel(rs.getString("fleaderlv")));
                item.put("fleaderst", convertGrade(rs.getString("fleaderst")));
            } else {
                item.put("fleader", rs.getString("fleader"));
                item.put("fleaderimg", rs.getString("fleaderimg"));
                item.put("fleadername", rs.getString("fleadername"));
                item.put("fleaderjob", rs.getString("fleaderjob"));
                item.put("fleaderlv", convertLevel(rs.getString("fleaderlv")));
                item.put("fleaderst", convertGrade(rs.getString("fleaderst")));
            }
            item.put("fobjid", rs.getString("fobjid"));
            item.put("fisvitual", rs.getString("fisvitual"));
            currentList.add(item);
        }


        Map<String, Object> result = new HashMap<>();
        result.put("api_status", true);
        result.put("data", currentList);
        return result;
    }

    @Override
    public Map<String, Object> asyncCompanyData(Map<String, Object> request2Map, User user) {
        String ids = (String) request2Map.get("ids");
        String whereSql = companyDateWhereSql(request2Map);

        whereSql += " and fparentid in (" + ids + ") ";

        RecordSet rs = new RecordSet();
        rs.executeQuery("select id, fname, ftype, fparentid, fnumber,fobjid,fisvitual from jcl_org_map " + whereSql);
        List<Map<String, Object>> currentList = new ArrayList<>();
        while (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("parentId", rs.getString("fparentid"));
            item.put("fnumber", rs.getString("fnumber"));
            item.put("fobjid", rs.getString("fobjid"));
            item.put("fisvitual", rs.getString("fisvitual"));
            item.put("hasChildren", hasChildren(rs.getString("id"), true));
            currentList.add(item);
        }

        Map<String, Object> result = new HashMap<>();
        result.put("api_status", true);
        result.put("data", currentList);
        return result;
    }

    //处理多个部门负责人
    private JclOrgMap getBmfzrInfo(String bmfzr) {
        JclOrgMap jclOrgMap = new JclOrgMap();
        if (StringUtils.isNotBlank(bmfzr)) {
            String[] split = bmfzr.split(",");
            for (String s : split) {
                jclOrgMap = MapperProxyFactory.getProxy(JclOrgMapper.class).getResInfo(level, grade,s);
                break;
            }
        }
        return jclOrgMap;
    }

    private void findUserItemByParantId(String id, int currentLevel, String level, RecordSet rs, List<Map<String, Object>> list, String whereSql, boolean expand) {
        String sql = "select t.id, t.fname, t.ftype, t.fparentid, t.fobjparentid, t.fleader, t.fleadername, t.fleaderimg, t.fleaderjob, t.fplan, t.fonjob, t.fnumber, t.fobjid, t.fecid, t.fleaderlv, t.fleaderst, t.fisvitual from jcl_org_map t " + whereSql;
        DetachUtil detachUtil = new DetachUtil(user);
        if (detachUtil.isDETACH()) {
            if ("0".equals(id)) {
                sql += " and t.ftype = 1 and t.fobjid in(" + detachUtil.getJclRoleLevels() + ")";
            } else {
                sql += " and t.fparentid = " + id + " and t.ftype !=1";
            }
        } else {
            sql += " and t.fparentid = " + id;
        }
        rs.executeQuery(sql);
        List<Map<String, Object>> currentList = new ArrayList<>();
        while (rs.next()) {
            Map<String, Object> item = new HashMap<>();
            item.put("id", rs.getString("id"));
            item.put("fname", rs.getString("fname"));
            item.put("ftype", rs.getString("ftype"));
            item.put("parentId", rs.getString("fparentid"));
            item.put("fobjparentId", rs.getString("fobjparentid"));
            item.put("fplan", rs.getString("fplan"));
            item.put("fonjob", rs.getString("fonjob"));
            item.put("fnumber", rs.getString("fnumber"));
            item.put("expand", expand ? "1" : "0");
            item.put("fobjid", rs.getString("fobjid"));
            item.put("fecid", rs.getString("fecid"));
            if (rs.getString("ftype").equals("2")) {
                JclOrgMap jclOrgMap = getBmfzrInfo(rs.getString("fleader"));
                item.put("fleader", jclOrgMap.getFLeader() == null ? "" : String.valueOf(jclOrgMap.getFLeader()));
                item.put("fleaderimg", jclOrgMap.getFLeaderImg());
                item.put("fleadername", jclOrgMap.getFLeaderName() == null ? "" : jclOrgMap.getFLeaderName());
                item.put("fleaderjob", jclOrgMap.getFLeaderJob());
                item.put("fleaderlv", convertLevel(rs.getString("fleaderlv")));
                item.put("fleaderst", convertGrade(rs.getString("fleaderst")));
            } else {
                item.put("fleader", rs.getString("fleader"));
                item.put("fleaderimg", rs.getString("fleaderimg"));
                item.put("fleadername", rs.getString("fleadername"));
                item.put("fleaderjob", rs.getString("fleaderjob"));
                item.put("fleaderlv", convertLevel(rs.getString("fleaderlv")));
                item.put("fleaderst", convertGrade(rs.getString("fleaderst")));
            }
            item.put("fisvitual", rs.getString("fisvitual"));
            item.put("hasChildren", hasChildren(rs.getString("id"), false));
            currentList.add(item);
        }

        for (Map<String, Object> stringObjectMap : currentList) {
            if ("4".equals(stringObjectMap.get("ftype"))) { // 员工信息
                rs.executeQuery("select id, mobile, homeaddress from hrmresource where id = ? ", stringObjectMap.get("fnumber"));
                if (rs.next()) {
                    stringObjectMap.put("mobile", rs.getString("mobile"));
                    stringObjectMap.put("address", rs.getString("homeaddress"));
                }
                rs.executeQuery("select departmentname from hrmresource hrm \n" +
                        "left join hrmdepartment d\n" +
                        "on hrm.departmentid = d.id\n" +
                        "where hrm.id = ? ", stringObjectMap.get("fnumber"));
                if (rs.next()) {
                    stringObjectMap.put("department", rs.getString("departmentname"));
                }

            }
            if (currentLevel + 1 <= Integer.parseInt(level)) {
                findUserItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, true);
            } else if (currentLevel == Integer.parseInt(level)) { // 多查一层
                findUserItemByParantId((String) stringObjectMap.get("id"), currentLevel + 1, level, rs, list, whereSql, false);
            }
        }
        list.addAll(currentList);
    }

    private boolean hasChildren(String id, boolean isCompany) {
        String whereSql = " where fparentid = " + id + " ";
        if (isCompany) {
            whereSql += " and ftype in (0, 1, 2) ";
        }
        grs.executeQuery("select count(1) as count from jcl_org_map " + whereSql);
        String count = "0";
        if (grs.next()) {
            count = grs.getString("count");
        }
        return !"0".equals(count);
    }

    private String convertLevel(String fLeaderLv) {
        StringBuilder jobLevelName = new StringBuilder();
        if (StringUtils.isNotBlank(fLeaderLv)) {
            try {
                String[] split = fLeaderLv.split(",");
                for (String s : split) {
                    long parseLong = Long.parseLong(s);
                    LevelPO levelByID = MapperProxyFactory.getProxy(LevelMapper.class).getLevelByID(parseLong);
                    if (null != levelByID) {
                        jobLevelName.append(levelByID.getLevelName());
                    }
                }
            } catch (NumberFormatException exception) {
                jobLevelName = new StringBuilder(fLeaderLv);
            }
        }
        return jobLevelName.toString();
    }

    private String convertGrade(String fLeaderSt) {
        StringBuilder jobGradeName = new StringBuilder();
        if (StringUtils.isNotBlank(fLeaderSt)) {
            try {
                String[] split = fLeaderSt.split(",");
                for (String s : split) {
                    long parseLong = Long.parseLong(s);
                    GradePO gradeByID = MapperProxyFactory.getProxy(GradeMapper.class).getGradeByID(parseLong);
                    if (null != gradeByID) {
                        jobGradeName.append(gradeByID.getGradeName());
                    }
                }
            } catch (NumberFormatException exception) {
                jobGradeName = new StringBuilder(fLeaderSt);
            }
        }
        return jobGradeName.toString();
    }


    private void reBuildTreeList(List<Map<String, Object>> list, String root) {
        // 分部数据，构建层级关系
        Set<String> idSet = list.stream().filter(item -> "1".equals(Util.null2String(item.get("ftype")))).map(item -> Util.null2String(item.get("id"))).collect(Collectors.toSet());
        list.forEach(item -> {
            if (!root.equals(Util.null2String(item.get("id"))) && "1".equals(Util.null2String(item.get("ftype"))) && !idSet.contains(Util.null2String(item.get("parentId")))) {
                item.put("parentId", root);
                item.put("fobjparentId", root);
            }
        });
    }

    private JclOrgMapper getJclOrgMapMapper() {
        return MapperProxyFactory.getProxy(JclOrgMapper.class);
    }
    @Override
    public String synchronousData(Map<String, Object> request2Map, User user) {
        String currentDate = OrganizationDateUtil.getFormatLocalDate(new java.util.Date());
        java.sql.Date date = new java.sql.Date(OrganizationDateUtil.stringToDate(currentDate).getTime());
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        Calendar calendar = weaver.common.DateUtil.addDay(cal, -1);
        java.sql.Date time = new java.sql.Date(calendar.getTime().getTime());
        // 自下向上刷新
        getJclOrgMapMapper().deleteAllMap(date);
        getJclOrgMapMapper().updateAllMap(date,time);
        //同步人员信息
        getJclOrgMapMapper().insertResToMap(level,grade);
        //同步岗位信息
        getJclOrgMapMapper().insertJobToMap();
        //同步部门信息
        getJclOrgMapMapper().insertDeptToMap(level,grade);
        //同步分部信息
        getJclOrgMapMapper().insertSubComToMap();
        //同步集团信息
        getJclOrgMapMapper().insertComToMap();
        //清除部门合并、转移造成的脏数据
        getJclOrgMapMapper().deleteJobNull(date);
        //刷新在岗数、编制数(从岗位向上刷，岗位不需处理)
        List<JclOrgMap> jclOrgMaps = getJclOrgMapMapper().getJclOrgMapByType("3",date);
        for (JclOrgMap jclOrgMap : jclOrgMaps){
            int id = jclOrgMap.getId();
            countJobAndPlans("3",id,currentDate);
        }
        return "同步成功";
    }
    /**
     * 刷新在岗、编制数
     */
    void countJobAndPlans(String type,int id,String currentDate) {
        java.sql.Date date = new java.sql.Date(OrganizationDateUtil.stringToDate(currentDate).getTime());
        RecordSet rs = new RecordSet();
        //处理上级
        String sql = "select fparentid from jcl_org_map where ftype=" + type + " and id=" + id + " ";
        String whereSql = "";
        if (DBType.isOracle()) {
            whereSql += " and ((fdatebegin <=  to_date('" + currentDate + "','yyyy-MM-DD') and fdateend >= to_date('" + currentDate + "','yyyy-MM-DD')) or (fdatebegin <= to_date('" + currentDate + "','yyyy-MM-DD') and fdateend is null )) ";
        } else {
            whereSql += " and ((fdatebegin <= '" + currentDate + "' and fdateend >= '" + currentDate + "') or (fdatebegin <= '" + currentDate + "' and fdateend is null )) ";
        }

        rs.executeQuery(sql + whereSql);
        String fparentid = null;
        String ftype = null;
        if (rs.next()) {
            fparentid = rs.getString("fparentid");
            String typeSql = "select ftype from jcl_org_map where id=" + fparentid + whereSql;
            rs.executeQuery(typeSql + whereSql);
            if (rs.next()) {
                ftype = rs.getString("ftype");
            }
        }
        JclOrgMap jclOrgMap = getJclOrgMapMapper().getSumPlanAndJobByFParentId(date, fparentid);
        if (fparentid != null) {
            getJclOrgMapMapper().updateMapById(Integer.parseInt(fparentid), jclOrgMap.getFPlan(), jclOrgMap.getFOnJob(), date);
            if (!"-1".equals(fparentid)) {
                countJobAndPlans(ftype, Integer.parseInt(fparentid), String.valueOf(currentDate));
            }
        }

    }
    private String getFieldName(String fieldabel) {
        RecordSet recordSet = new RecordSet();
        String fieldname = null;
        recordSet.executeQuery("select fieldname from jcl_org_field where fieldlabel='" + fieldabel+"'");
        if (recordSet.next()) {
            fieldname = recordSet.getString("fieldname");
        }
        return fieldname;
    }
    static class OrgSelectItem {
        private String id;
        private String fnumber;
        private String fname;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getFnumber() {
            return fnumber;
        }

        public void setFnumber(String fnumber) {
            this.fnumber = fnumber;
        }

        public String getFname() {
            return fname;
        }

        public void setFname(String fname) {
            this.fname = fname;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof OrgSelectItem) {
                OrgSelectItem item = (OrgSelectItem) obj;
                return this.getId().equals(item.getId());
            }
            return false;
        }

        @Override
        public int hashCode() {
            return Integer.parseInt(this.getId());
        }
    }
}
