package com.engine.organization.service.impl;

import com.api.browser.bean.BrowserBean;
import com.api.browser.bean.SearchConditionGroup;
import com.api.browser.bean.SearchConditionItem;
import com.cloudstore.eccom.result.WeaResultMsg;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.hrm.util.face.HrmFaceCheckManager;
import com.engine.organization.component.OrganizationWeaTable;
import com.engine.organization.entity.DeleteParam;
import com.engine.organization.entity.company.bo.CompBO;
import com.engine.organization.entity.company.po.CompPO;
import com.engine.organization.entity.department.bo.DepartmentBO;
import com.engine.organization.entity.department.po.DepartmentPO;
import com.engine.organization.entity.extend.po.ExtendTitlePO;
import com.engine.organization.entity.hrmresource.bo.HrmRelationBO;
import com.engine.organization.entity.hrmresource.param.HrmRelationSaveParam;
import com.engine.organization.entity.hrmresource.param.HrmResourceSearchParam;
import com.engine.organization.entity.hrmresource.po.HrmRelationPO;
import com.engine.organization.entity.hrmresource.vo.ScHrmResourceVO;
import com.engine.organization.entity.job.bo.JobBO;
import com.engine.organization.entity.job.po.JobPO;
import com.engine.organization.entity.searchtree.SearchTree;
import com.engine.organization.entity.searchtree.SearchTreeParams;
import com.engine.organization.mapper.comp.CompMapper;
import com.engine.organization.mapper.department.DepartmentMapper;
import com.engine.organization.mapper.extend.ExtendTitleMapper;
import com.engine.organization.mapper.hrmresource.HrmRelationMapper;
import com.engine.organization.mapper.hrmresource.SystemDataMapper;
import com.engine.organization.mapper.job.JobMapper;
import com.engine.organization.mapper.post.PostInfoMapper;
import com.engine.organization.mapper.post.PostMapper;
import com.engine.organization.mapper.scheme.GradeMapper;
import com.engine.organization.mapper.scheme.LevelMapper;
import com.engine.organization.mapper.scheme.SchemeMapper;
import com.engine.organization.mapper.sequence.SequenceMapper;
import com.engine.organization.service.ExtService;
import com.engine.organization.service.HrmResourceService;
import com.engine.organization.util.MenuBtn;
import com.engine.organization.util.OrganizationAssert;
import com.engine.organization.util.OrganizationFormItemUtil;
import com.engine.organization.util.db.DBType;
import com.engine.organization.util.db.MapperProxyFactory;
import com.engine.organization.util.page.PageUtil;
import com.engine.organization.util.tree.SearchTreeUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.conn.RecordSet;
import weaver.general.StringUtil;
import weaver.general.Util;
import weaver.hrm.User;

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

/**
 * @author:dxfeng
 * @createTime: 2022/06/20
 * @version: 1.0
 */
public class HrmResourceServiceImpl extends Service implements HrmResourceService {
    /**
     * 左侧树 类型表示
     * <p>
     * 0：集团
     * 1：分部
     * 2：部门
     * 3：岗位
     */
    private static final String TYPE_COMP = "1";
    private static final String TYPE_DEPT = "2";
    private static final String TYPE_JOB = "3";

    private static final Long GROUP_ID = 4L;

    /**
     * 分组类型
     * 1：分部
     * 2：部门
     * 3：岗位
     * 4：人员
     */
    private static final String EXTEND_TYPE = "4";

    /**
     * 主表表名
     */
    private static final String JCL_ORG_HRM = "JCL_ORG_HRMRESOURCE";
    /**
     * 主表拓展表
     */
    private static final String JCL_ORG_HRMEXT = "JCL_ORG_HRMRESOURCEEXT";
    /**
     * 明细表拓展表
     */
    private static final String JCL_ORG_HRMEXT_DT1 = "JCL_ORG_HRMRESOURCEEXT_DT1";

    private SchemeMapper getSchemeMapper() {
        return MapperProxyFactory.getProxy(SchemeMapper.class);
    }

    private LevelMapper getLevelMapper() {
        return MapperProxyFactory.getProxy(LevelMapper.class);
    }

    private GradeMapper getGradeMapper() {
        return MapperProxyFactory.getProxy(GradeMapper.class);
    }

    private SequenceMapper getSequenceMapper() {
        return MapperProxyFactory.getProxy(SequenceMapper.class);
    }

    private PostMapper getPostMapper() {
        return MapperProxyFactory.getProxy(PostMapper.class);
    }

    private PostInfoMapper getPostInfoMapper() {
        return MapperProxyFactory.getProxy(PostInfoMapper.class);
    }

    private HrmRelationMapper getHrmRelationMapper() {
        return MapperProxyFactory.getProxy(HrmRelationMapper.class);
    }

    private DepartmentMapper getDepartmentMapper() {
        return MapperProxyFactory.getProxy(DepartmentMapper.class);
    }

    private CompMapper getCompMapper() {
        return MapperProxyFactory.getProxy(CompMapper.class);
    }

    private JobMapper getJobMapper() {
        return MapperProxyFactory.getProxy(JobMapper.class);
    }

    private ExtendTitleMapper getExtendTitleMapper() {
        return MapperProxyFactory.getProxy(ExtendTitleMapper.class);
    }

    private ExtService getExtService(User user) {
        return ServiceUtil.getService(ExtServiceImpl.class, user);
    }


    @Override
    public Map<String, Object> getSearchTree(SearchTreeParams params) {
        String keyword = params.getKeyword();
        String id = params.getId();
        String type = Util.null2String(params.getType());
        List<SearchTree> treeList = getFilterCompany(id, type, keyword);
        return SearchTreeUtil.getSearchTree(type, treeList);
    }

    @Override
    public Map<String, Object> listPage(HrmResourceSearchParam params) {
        Map<String, Object> resultMap = new HashMap<>();
        OrganizationWeaTable<ScHrmResourceVO> table = new OrganizationWeaTable<>(user, ScHrmResourceVO.class);
        String sqlWhere = buildSqlWhere(params);
        table.setSqlwhere(sqlWhere);
        WeaResultMsg result = new WeaResultMsg(false);
        result.putAll(table.makeDataResult());
        result.success();
        resultMap.putAll(result.getResultMap());
        return resultMap;
    }

    @Override
    public Map<String, Object> getSaveForm() {
        Map<String, Object> apiDatas = new HashMap<>();
        List<SearchConditionGroup> addGroups = new ArrayList<>();
        List<ExtendTitlePO> extendTitles = getExtendTitleMapper().getTitlesByGroupID(GROUP_ID, "1");
        if (CollectionUtils.isNotEmpty(extendTitles)) {
            for (ExtendTitlePO extendTitle : extendTitles) {
                addGroups.add(new SearchConditionGroup(extendTitle.getTitle(), true, getExtService(user).getExtSaveForm(user, EXTEND_TYPE + "", JCL_ORG_HRM, 2, extendTitle.getId() + "", null, null, null)));
            }
        }
        apiDatas.put("condition", addGroups);
        return apiDatas;
    }

    @Override
    public Long saveBaseForm(Map<String, Object> params) {
        return getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_HRM, params, "", null);
    }

    @Override
    public Map<String, Object> getBaseForm(Map<String, Object> params) {
        OrganizationAssert.notNull(params.get("viewAttr"), "请标识操作类型");
        // 2编辑 1查看
        int viewAttr = Integer.parseInt((String) params.get("viewAttr"));
        long id = Long.parseLong((String) params.get("id"));
        String groupId = (String) params.get("viewCondition");

        HashMap<String, Object> buttonsMap = new HashMap<>();
        buttonsMap.put("hasEdit", true);
        buttonsMap.put("hasSave", true);

        List<SearchConditionGroup> addGroups = new ArrayList<>();
        if ("0".equals(groupId)) {
            groupId = GROUP_ID.toString();
        }
        List<ExtendTitlePO> extendTitles = getExtendTitleMapper().getTitlesByGroupID(Long.parseLong(groupId), "1");

        if (CollectionUtils.isNotEmpty(extendTitles)) {
            for (ExtendTitlePO extendTitle : extendTitles) {
                addGroups.add(new SearchConditionGroup(extendTitle.getTitle(), true, getExtService(user).getExtForm(user, EXTEND_TYPE + "", GROUP_ID.equals(Long.parseLong(groupId)) ? JCL_ORG_HRM : JCL_ORG_HRMEXT, viewAttr, id, extendTitle.getId() + "", "")));
            }
        }

        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("buttons", buttonsMap);
        resultMap.put("conditions", addGroups);
        resultMap.put("id", id);
        // 拓展页面分组
        resultMap.put("tabInfo", getExtService(user).getTabInfo(EXTEND_TYPE, JCL_ORG_HRMEXT));
        // 处理明细表
        resultMap.put("tables", getExtService(user).getExtendTables(user, EXTEND_TYPE, Long.parseLong(groupId), JCL_ORG_HRMEXT_DT1, id, viewAttr, false));
        Map<String, Object> apiDatas = new HashMap<>();

        apiDatas.put("result", resultMap);

        return apiDatas;
    }

    @Override
    public int updateForm(Map<String, Object> params) {
        Long id = Long.parseLong((String) params.get("id"));
        String groupId = (String) params.get("viewCondition");
        if ("0".equals(groupId)) {
            groupId = GROUP_ID.toString();
        }
        int updateCount = 0;
        // 更新主表数据
        updateCount += getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_HRM, params, "", id);
        // 更新主表拓展表
        updateCount += getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_HRMEXT, params, groupId, id);
        //更新明细表
        getExtService(user).updateExtDT(user, EXTEND_TYPE, JCL_ORG_HRMEXT_DT1, params, id);

        return updateCount;
    }

    @Override
    public Map<String, Object> getSearchCondition(Map<String, Object> params) {
        Map<String, Object> apiDatas = new HashMap<>();
        List<SearchConditionGroup> addGroups = new ArrayList<>();
        List<SearchConditionItem> conditionItems = new ArrayList<>();
        SearchConditionItem lastNameItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "姓名", "lastName");
        SearchConditionItem managerIdItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "直接上级", "1", "managerId", "");
        SearchConditionItem companyIdItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "分部", "161", "companyId", "compBrowser");
        SearchConditionItem departmentIdItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "部门", "161", "departmentId", "deptBrowser");
        SearchConditionItem telephoneItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "办公电话", "telephone");
        SearchConditionItem mobileItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "移动电话", "mobile");
        SearchConditionItem mobileCallItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "其他电话", "mobileCall");
        SearchConditionItem jobTitleItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "岗位", "161", "jobTitle", "jobBrowser");

        conditionItems.add(lastNameItem);
        conditionItems.add(managerIdItem);
        conditionItems.add(companyIdItem);
        conditionItems.add(departmentIdItem);
        conditionItems.add(telephoneItem);
        conditionItems.add(mobileItem);
        conditionItems.add(mobileCallItem);
        conditionItems.add(jobTitleItem);

        addGroups.add(new SearchConditionGroup("高级搜索条件", true, conditionItems));
        apiDatas.put("conditions", addGroups);
        return apiDatas;
    }

    @Override
    public Map<String, Object> getHasRight() {
        Map<String, Object> btnDatas = new HashMap<>();
        ArrayList<MenuBtn> topMenuList = new ArrayList<>();
        ArrayList<MenuBtn> rightMenuList = new ArrayList<>();
        topMenuList.add(MenuBtn.builder().isBatch("1").isTop("1").menuFun("new").menuIcon("icon-coms-New-Flow").menuName("新建人员").type("BTN_Addnew").build());
        //topMenuList.add(MenuBtn.builder().isBatch("1").isTop("1").menuFun("import").menuIcon("icon-coms-leading-in").menuName("导入人员").type("BTN_Import").build());
        btnDatas.put("topMenu", topMenuList);
        rightMenuList.add(MenuBtn.builder().isBatch("1").isTop("1").menuFun("new").menuIcon("icon-coms-New-Flow").menuName("新建人员").type("BTN_Addnew").build());
        //rightMenuList.add(MenuBtn.builder().isBatch("1").isTop("1").menuFun("import").menuIcon("icon-coms-leading-in").menuName("导入人员").type("BTN_Import").build());
        rightMenuList.add(MenuBtn.builder().isBatch("0").isTop("0").menuFun("custom").menuIcon("icon-coms-task-list").menuName("显示列定制").type("BTN_COLUMN").build());
        btnDatas.put("rightMenu", rightMenuList);
        return btnDatas;
    }

    @Override
    public Map<String, Object> getTabForm(Map<String, Object> params) {
        String viewAttrStr = (String) params.get("viewAttr");
        OrganizationAssert.notBlank(viewAttrStr, "未指定操作类型，请确认");
        String id = Util.null2String(params.get("id"));
        OrganizationAssert.notBlank(id, "数据有误，请确认");
        int viewAttr = Integer.parseInt(viewAttrStr);
        Map<String, Object> apiDatas = new HashMap<>();

        List<SearchConditionGroup> addGroups = new ArrayList<>();
        SearchConditionItem schemeId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "等级方案", "161", "schemeId", "schemeBrowser");
        schemeId.setRules("required");
        SearchConditionItem gradeId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "职级", "161", "gradeId", "gradeBrowser");
        gradeId.setRules("required");
        SearchConditionItem levelId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "职等", "162", "levelId", "levelBrowser");
        levelId.setRules("required");
        SearchConditionItem sequenceId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "岗位序列", "161", "sequenceId", "sequenceBrowser");
        sequenceId.setRules("required");
        SearchConditionItem postId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "职务分类", "161", "postId", "postBrowser");
        postId.setRules("required");
        SearchConditionItem postInfoId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "职务信息", "161", "postInfoId", "postInfoBrowser");
        postInfoId.setRules("required");
        SearchConditionItem companyId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "分部", "164", "companyId", "");
        companyId.setRules("required");
        SearchConditionItem departmentId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "部门", "4", "departmentId", "");
        departmentId.setRules("required");
        SearchConditionItem jobId = OrganizationFormItemUtil.browserItem(user, 2, 17, viewAttr, false, "岗位", "161", "jobId", "jobBrowser");
        jobId.setRules("required");


        // 编辑状态下赋值操作
        HrmRelationPO relationPO = getHrmRelationMapper().getRelationById(Long.parseLong(id));
        if (null != relationPO) {
            setBrowserValue(schemeId, relationPO.getSchemeId(), getSchemeMapper().listSchemesByIds(Stream.of(relationPO.getSchemeId()).collect(Collectors.toList())), null, null);
            setBrowserValue(gradeId, relationPO.getGradeId(), getGradeMapper().listGradessByIds(Stream.of(relationPO.getGradeId()).collect(Collectors.toList())), "scheme_id", relationPO.getSchemeId());
            setBrowserValue(levelId, relationPO.getLevelId(), getLevelMapper().listLevelsByIds(DeleteParam.builder().ids(relationPO.getLevelId()).build().getIds()), "grade_id", relationPO.getGradeId());
            setBrowserValue(sequenceId, relationPO.getSequenceId(), getSequenceMapper().listSequencesByIds(Stream.of(relationPO.getSequenceId()).collect(Collectors.toList())), "scheme_id", relationPO.getSchemeId());
            setBrowserValue(postId, relationPO.getPostId(), getPostMapper().listPostsByIds(Stream.of(relationPO.getPostId()).collect(Collectors.toList())), null, null);
            setBrowserValue(postInfoId, relationPO.getPostInfoId(), getPostInfoMapper().listPostInfosByIds(Stream.of(relationPO.getPostInfoId()).collect(Collectors.toList())), "post_id", relationPO.getPostId());

            List<Map<String, Object>> companyMaps = new ArrayList<>();
            String scCompanyNameById = MapperProxyFactory.getProxy(SystemDataMapper.class).getScCompanyNameById(relationPO.getCompanyId().toString());
            Map<String, Object> companyMap = new HashMap<>();
            companyMap.put(relationPO.getCompanyId().toString(), scCompanyNameById);
            companyMaps.add(companyMap);
            setBrowserValue(companyId, relationPO.getCompanyId(), companyMaps, null, null);

            List<Map<String, Object>> departmentMaps = new ArrayList<>();
            String departmentNameById = MapperProxyFactory.getProxy(SystemDataMapper.class).getScDepartmentNameById(relationPO.getDepartmentId().toString());
            Map<String, Object> departmentMap = new HashMap<>();
            departmentMap.put(relationPO.getDepartmentId().toString(), departmentNameById);
            departmentMaps.add(departmentMap);
            setBrowserValue(departmentId, relationPO.getDepartmentId(), departmentMaps, "subcompany1", relationPO.getCompanyId());

            setBrowserValue(jobId, relationPO.getJobId(), getJobMapper().listJobsByIds(Stream.of(relationPO.getJobId()).collect(Collectors.toList())), "departmentid", relationPO.getDepartmentId());
        }

        addGroups.add(new SearchConditionGroup("岗职位体系", true, Stream.of(schemeId, gradeId, levelId, sequenceId, postId, postInfoId).collect(Collectors.toList())));
        addGroups.add(new SearchConditionGroup("组织机构", true, Stream.of(companyId, departmentId, jobId).collect(Collectors.toList())));
        HashMap<String, Object> buttonsMap = new HashMap<>();
        buttonsMap.put("hasEdit", true);
        buttonsMap.put("hasSave", true);
        apiDatas.put("buttons", buttonsMap);
        apiDatas.put("conditions", addGroups);
        return apiDatas;
    }

    @Override
    public long saveTabForm(HrmRelationSaveParam params) {
        HrmRelationPO hrmRelationPO = HrmRelationBO.convertSaveParamToPO(params);
        hrmRelationPO.setCreator((long) user.getUID());
        hrmRelationPO.setCreateTime(new Date());
        hrmRelationPO.setDeleteType(0);
        getHrmRelationMapper().insertIgnoreNull(hrmRelationPO);
        return hrmRelationPO.getId();
    }

    @Override
    public long updateTabForm(HrmRelationSaveParam params) {
        HrmRelationPO hrmRelationPO = HrmRelationBO.convertSaveParamToPO(params);
        // 判断新增OR更新
        HrmRelationPO relationPO = getHrmRelationMapper().getRelationById(params.getId());
        if (null == relationPO) {
            hrmRelationPO.setCreator((long) user.getUID());
            hrmRelationPO.setCreateTime(new Date());
            hrmRelationPO.setDeleteType(0);
            getHrmRelationMapper().insertIgnoreNull(hrmRelationPO);
        } else {
            hrmRelationPO.setUpdateTime(new Date());
            getHrmRelationMapper().updateHrmRelation(hrmRelationPO);
        }
        RecordSet rs = new RecordSet();
        rs.execute("update HrmResource set subcompanyid1 = " + params.getCompanyId() + " ,departmentid = " + params.getDepartmentId() + " ,jobtitle = " + params.getJobId() + " where id = " + params.getId());
        HrmFaceCheckManager.sync(params.getId().toString(), HrmFaceCheckManager.getOptUpdate(), "hrm_e9_HrmResourceBaseService_editResourceBase", HrmFaceCheckManager.getOaResource());
        return hrmRelationPO.getId();
    }

    /**
     * 浏览按钮赋值
     *
     * @param browserItem
     * @param browserValue
     * @param maps
     */
    private void setBrowserValue(SearchConditionItem browserItem, Object browserValue, List<Map<String, Object>> maps, String relateField, Object relatedValue) {
        browserItem.setValue(browserValue);
        BrowserBean browserBean = browserItem.getBrowserConditionParam();
        browserBean.setReplaceDatas(maps);
        browserItem.setBrowserConditionParam(browserBean);

        if (StringUtils.isNotBlank(relateField) && 1 != browserItem.getViewAttr()) {
            long l = System.currentTimeMillis();
            Map<String, Object> completeParams = browserBean.getCompleteParams();
            completeParams.put("currenttime", l);
            completeParams.put(relateField + "_" + l, relatedValue);
            Map<String, Object> conditionDataParams = browserBean.getConditionDataParams();
            conditionDataParams.put("currenttime", l);
            conditionDataParams.put(relateField + "_" + l, relatedValue);
            Map<String, Object> dataParams = browserBean.getDataParams();
            dataParams.put("currenttime", l);
            dataParams.put(relateField + "_" + l, relatedValue);
            Map<String, Object> destDataParams = browserBean.getDestDataParams();
            destDataParams.put("currenttime", l);
            destDataParams.put(relateField + "_" + l, relatedValue);
        }
    }

    /**
     * 查询条件
     *
     * @param params
     * @return
     */
    private String buildSqlWhere(HrmResourceSearchParam params) {
        DBType dbType = DBType.get(new RecordSet().getDBType());
        String sqlWhere = " where 1=1 ";
        String lastName = params.getLastName();
        if (StringUtils.isNotBlank(lastName)) {
            sqlWhere += " AND t.lastname " + dbType.like(lastName);
        }
        Long managerId = params.getManagerId();
        if (null != managerId) {
            sqlWhere += " AND t.managerid = '" + managerId + "'";
        }
        Long companyId = params.getCompanyId();
        if (null != companyId) {
            sqlWhere += " AND t.subcompanyid1 = '" + companyId + "'";
        }
        Long departmentId = params.getDepartmentId();
        if (null != departmentId) {
            sqlWhere += " AND t.departmentid = '" + departmentId + "'";
        }
        String telephone = params.getTelephone();
        if (StringUtils.isNotBlank(telephone)) {
            sqlWhere += " AND t.telephone " + dbType.like(telephone);
        }
        String mobile = params.getMobile();
        if (StringUtils.isNotBlank(mobile)) {
            sqlWhere += " AND t.mobile " + dbType.like(mobile);
        }
        String mobileCall = params.getMobileCall();
        if (StringUtils.isNotBlank(mobileCall)) {
            sqlWhere += " AND t.mobilecall " + dbType.like(mobileCall);
        }
        Long jobTitle = params.getJobTitle();
        if (null != jobTitle) {
            sqlWhere += " AND t.jobtitle = '" + jobTitle + "'";
        }

        return sqlWhere;
    }

    public List<SearchTree> getFilterCompany(String id, String type, String keyword) {
        List<SearchTree> searchTree = new ArrayList<>();
        // 通过分部、公司 组装数据
        if (StringUtil.isEmpty(id) || TYPE_COMP.equals(type)) {
            Long parentCompId = StringUtil.isEmpty(id) ? null : Long.parseLong(id);
            DepartmentPO departmentBuild = DepartmentPO.builder().deptName(keyword).parentComp(parentCompId).build();
            CompPO compBuild = CompPO.builder().compName(keyword).parentCompany(parentCompId).build();
            // 所属分部下的岗位
            JobPO jobBuild = JobPO.builder().jobName(keyword).parentComp(parentCompId).build();
            searchTree = buildTreeByCompAndDept(departmentBuild, compBuild, jobBuild);
        } else if (TYPE_DEPT.equals(type)) {
            Long parentDeptId = Long.parseLong(id);
            DepartmentPO departmentBuild = DepartmentPO.builder().deptName(keyword).parentDept(parentDeptId).build();
            // 所属分部下的岗位
            JobPO jobBuild = JobPO.builder().jobName(keyword).parentDept(parentDeptId).build();
            searchTree = buildTreeByDeptAndJob(departmentBuild, jobBuild);

        } else if (TYPE_JOB.equals(type)) {
            // 查询部门信息
            List<JobPO> filterDeparts = getJobMapper().listPOsByFilter(JobPO.builder().jobName(keyword).parentJob(Long.parseLong(id)).build());
            Set<JobPO> builderJobs = new HashSet<>();
            for (JobPO departmentPO : filterDeparts) {
                buildParentJobs(departmentPO, builderJobs);
            }
            searchTree = SearchTreeUtil.builderTreeMode(JobBO.buildSetToSearchTree(builderJobs));
        }
        return searchTree;
    }

    /**
     * 分部、部门 组装左侧树
     *
     * @param departmentBuild
     * @param compBuild
     * @param jobBuild
     * @return
     */
    private List<SearchTree> buildTreeByCompAndDept(DepartmentPO departmentBuild, CompPO compBuild, JobPO jobBuild) {
        List<JobPO> jobPOS = getJobMapper().listPOsByFilter(jobBuild);
        List<DepartmentPO> filterDeparts = getDepartmentMapper().listByFilter(departmentBuild, "show_order");
        // 添加父级岗位
        Set<JobPO> builderJobs = new HashSet<>();
        for (JobPO jobPO : jobPOS) {
            buildParentJobs(jobPO, builderJobs);
        }
        // 添加岗位的上级部门或分部
        List<SearchTree> jobTrees = SearchTreeUtil.builderTreeMode(JobBO.buildSetToSearchTree(builderJobs));
        String parentDeptS = jobTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(","));
        if (!StringUtil.isEmpty(parentDeptS)) {
            // 兼容SQLServer每次最多in,2100条数据
            List<Long> ids = (List<Long>) DeleteParam.builder().ids(parentDeptS).build().getIds();
            int ceilCount = (int) Math.ceil((double) ids.size() / 1000);
            List<DepartmentPO> departmentsByIds = new ArrayList<>();
            for (int i = 1; i < ceilCount; i++) {
                List<Long> longs = PageUtil.subList(i, 1000, ids);
                List<DepartmentPO> departmentsById = getDepartmentMapper().getDeptsByIds(longs);
                if (CollectionUtils.isNotEmpty(departmentsById)) {
                    departmentsByIds.addAll(departmentsById);
                }
            }


            if (CollectionUtils.isNotEmpty(departmentsByIds)) {
                filterDeparts.addAll(departmentsByIds);
            }
        }

        // 查询分部信息
        List<CompPO> filterComps = getCompMapper().listByFilter(compBuild, "show_order");
        Set<DepartmentPO> builderDeparts = new HashSet<>();
        for (DepartmentPO departmentPO : filterDeparts) {
            buildParentDepts(departmentPO, builderDeparts);
        }
        List<SearchTree> deptTrees = SearchTreeUtil.builderTreeMode(DepartmentBO.buildSetToSearchTree(builderDeparts, false));
        // 添加部门的上级分部
        String parentCompS = deptTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(","));
        if (!StringUtil.isEmpty(parentCompS)) {
            List<CompPO> compsByIds = getCompMapper().getCompsByIds(DeleteParam.builder().ids(parentCompS).build().getIds());
            if (CollectionUtils.isNotEmpty(compsByIds)) {
                filterComps.addAll(compsByIds);
            }
        }
        Set<CompPO> builderComps = new HashSet<>();
        for (CompPO compPO : filterComps) {
            buildParentComps(compPO, builderComps);
        }
        List<SearchTree> searchTrees = SearchTreeUtil.builderTreeMode(deptTrees, jobTrees);
        return SearchTreeUtil.builderTreeMode(CompBO.buildSetToSearchTree(builderComps), searchTrees);
    }

    private List<SearchTree> buildTreeByDeptAndJob(DepartmentPO departmentBuild, JobPO jobBuild) {
        List<JobPO> jobPOS = getJobMapper().listPOsByFilter(jobBuild);
        List<DepartmentPO> filterDeparts = getDepartmentMapper().listByFilter(departmentBuild, "show_order");
        // 添加父级岗位
        Set<JobPO> builderJobs = new HashSet<>();
        for (JobPO jobPO : jobPOS) {
            buildParentJobs(jobPO, builderJobs);
        }
        // 添加岗位的上级部门或分部
        List<SearchTree> jobTrees = SearchTreeUtil.builderTreeMode(JobBO.buildSetToSearchTree(builderJobs));
        String parentDeptS = jobTrees.stream().map(SearchTree::getParentComp).collect(Collectors.joining(","));
        if (!StringUtil.isEmpty(parentDeptS)) {
            // 兼容SQLServer每次最多in,2100条数据
            List<Long> ids = (List<Long>) DeleteParam.builder().ids(parentDeptS).build().getIds();
            int ceilCount = (int) Math.ceil((double) ids.size() / 1000);
            List<DepartmentPO> departmentsByIds = new ArrayList<>();
            for (int i = 0; i < ceilCount - 1; i++) {
                List<DepartmentPO> departmentsById = getDepartmentMapper().getDeptsByIds(PageUtil.subList(i, 1000, ids));
                if (CollectionUtils.isNotEmpty(departmentsById)) {
                    departmentsByIds.addAll(departmentsById);
                }
            }

            if (CollectionUtils.isNotEmpty(departmentsByIds)) {
                filterDeparts.addAll(departmentsByIds);
            }
        }

        // 查询分部信息
        Set<DepartmentPO> builderDeparts = new HashSet<>();
        for (DepartmentPO departmentPO : filterDeparts) {
            buildParentDepts(departmentPO, builderDeparts);
        }
        return SearchTreeUtil.builderTreeMode(DepartmentBO.buildSetToSearchTree(builderDeparts, false), jobTrees);
    }

    private void buildParentJobs(JobPO jobPO, Set<JobPO> builderJobs) {
        builderJobs.add(jobPO);
        if (SearchTreeUtil.isTop(jobPO.getParentJob())) {
            return;
        }
        JobPO parentJob = getJobMapper().getJobById(jobPO.getParentJob());
        if (null != parentJob) {
            buildParentJobs(parentJob, builderJobs);
        }
    }

    /**
     * 添加查询元素的父级元素
     *
     * @param departmentPO
     * @param builderDeparts
     */
    private void buildParentDepts(DepartmentPO departmentPO, Set<DepartmentPO> builderDeparts) {
        builderDeparts.add(departmentPO);
        if (SearchTreeUtil.isTop(departmentPO.getParentDept())) {
            return;
        }
        DepartmentPO parentDept = getDepartmentMapper().getDeptById(departmentPO.getParentDept());
        if (null != parentDept) {
            buildParentDepts(parentDept, builderDeparts);
        }
    }

    /**
     * 添加查询元素的父级元素
     *
     * @param compPO
     * @param builderComps
     */
    private void buildParentComps(CompPO compPO, Set<CompPO> builderComps) {
        builderComps.add(compPO);
        if (SearchTreeUtil.isTop(compPO.getParentCompany())) {
            return;
        }
        CompPO parentComp = getCompMapper().listById(compPO.getParentCompany());
        if (null != parentComp) {
            buildParentComps(parentComp, builderComps);
        }
    }
}
