package com.engine.organization.service.impl; import com.alibaba.fastjson.JSONObject; import com.api.browser.bean.SearchConditionGroup; import com.api.browser.bean.SearchConditionItem; import com.api.browser.bean.SearchConditionOption; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.hrm.entity.RuleCodeType; import com.engine.organization.component.OrganizationWeaTable; import com.engine.organization.entity.DeleteParam; import com.engine.organization.entity.codesetting.po.CodeRulePO; import com.engine.organization.entity.commom.RecordInfo; 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.dto.DepartmentListDTO; import com.engine.organization.entity.department.param.*; import com.engine.organization.entity.department.po.DepartmentPO; import com.engine.organization.entity.department.vo.SingleDeptTreeVO; import com.engine.organization.entity.extend.po.ExtendTitlePO; import com.engine.organization.entity.job.bo.JobBO; import com.engine.organization.entity.job.po.JobPO; import com.engine.organization.entity.job.vo.SingleJobTreeVO; import com.engine.organization.entity.map.JclOrgMap; import com.engine.organization.entity.searchtree.SearchTree; import com.engine.organization.entity.searchtree.SearchTreeParams; import com.engine.organization.enums.LogModuleNameEnum; import com.engine.organization.enums.ModuleTypeEnum; import com.engine.organization.enums.OperateTypeEnum; import com.engine.organization.mapper.codesetting.CodeRuleMapper; import com.engine.organization.mapper.comp.CompMapper; import com.engine.organization.mapper.department.DepartmentMapper; import com.engine.organization.mapper.extend.ExtDTMapper; import com.engine.organization.mapper.extend.ExtMapper; import com.engine.organization.mapper.extend.ExtendTitleMapper; import com.engine.organization.mapper.hrmresource.SystemDataMapper; import com.engine.organization.mapper.jclorgmap.JclOrgMapper; import com.engine.organization.mapper.job.JobMapper; import com.engine.organization.service.DepartmentService; import com.engine.organization.service.ExtService; import com.engine.organization.thread.DepartmentTriggerRunnable; import com.engine.organization.thread.HrmResourceTriggerRunnable; import com.engine.organization.thread.JobTriggerRunnable; import com.engine.organization.thread.OrganizationSyncEc; import com.engine.organization.util.*; import com.engine.organization.util.coderule.CodeRuleUtil; import com.engine.organization.util.db.MapperProxyFactory; import com.engine.organization.util.detach.DetachUtil; import com.engine.organization.util.page.Column; import com.engine.organization.util.page.PageInfo; import com.engine.organization.util.page.PageUtil; import com.engine.organization.util.relation.EcHrmRelationUtil; import com.engine.organization.util.tree.SearchTreeUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.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; /** * @Author weaver_cl * @description: * @Date 2022/5/20 * @Version V1.0 **/ public class DepartmentServiceImpl extends Service implements DepartmentService { /** * 分组类型 * 1:分部 * 2:部门 * 3:岗位 */ private static final String EXTEND_TYPE = "2"; /** * 主表 */ private static final String JCL_ORG_DEPT = "JCL_ORG_DEPT"; /** * 主表拓展表 */ private static final String JCL_ORG_DEPTEXT = "JCL_ORG_DEPTEXT"; /** * 明细表拓展表 */ private static final String JCL_ORG_DEPTEXT_DT1 = "JCL_ORG_DEPTEXT_DT1"; private static final String RIGHT_NAME = "Department:All"; /** * 部门主表title指定ID */ private static final Long GROUP_ID = 2L; private static final String HRM_DEPARTMENT = "hrmdepartment"; private static DepartmentMapper getDepartmentMapper() { return MapperProxyFactory.getProxy(DepartmentMapper.class); } private static JobMapper getJobMapper() { return MapperProxyFactory.getProxy(JobMapper.class); } private CompMapper getCompMapper() { return MapperProxyFactory.getProxy(CompMapper.class); } private ExtendTitleMapper getExtendTitleMapper() { return MapperProxyFactory.getProxy(ExtendTitleMapper.class); } private SystemDataMapper getSystemDataMapper() { return MapperProxyFactory.getProxy(SystemDataMapper.class); } private ExtService getExtService(User user) { return ServiceUtil.getService(ExtServiceImpl.class, user); } @Override public PageInfo getDeptListByPid(QuerySingleDeptListParam param) { //1.查询分部下所有部门 //PageUtil.start(param.getCurrent(), param.getPageSize()); List departmentPOS = MapperProxyFactory.getProxy(DepartmentMapper.class).list("show_order"); PageInfo pageInfo = new PageInfo<>(departmentPOS); List singleDeptTreeVOS = DepartmentBO.buildSingleDeptTreeVOS(departmentPOS, param.getParentComp()); PageInfo pageInfos = new PageInfo<>(singleDeptTreeVOS, SingleDeptTreeVO.class); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); return pageInfos; } @Override public PageInfo getJobListByPid(QuerySingleDeptListParam param) { List jobPOS = MapperProxyFactory.getProxy(JobMapper.class).listAll(); PageInfo pageInfo = new PageInfo<>(jobPOS); List singleDeptTreeVOS = JobBO.buildSingleJobTreeVOS(jobPOS, param.getParentDept()); PageInfo pageInfos = new PageInfo<>(singleDeptTreeVOS, SingleJobTreeVO.class); pageInfos.setTotal(pageInfo.getTotal()); pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); return pageInfos; } @Override public Map getSearchTree(SearchTreeParams params) { String keyword = params.getKeyword(); String id = params.getId(); String type = Util.null2String(params.getType()); List treeList = getFilterCompany(id, keyword); return SearchTreeUtil.getSearchTree(type, treeList); } @Override public Map listPage(DeptSearchParam param) { Map datas = new HashMap<>(); boolean hasRight = HasRightUtil.hasRight(user, RIGHT_NAME, true); datas.put("hasRight", hasRight); if (!hasRight) { return datas; } DepartmentPO departmentPO = DepartmentBO.convertParamsToPO(param, user.getUID()); boolean filter = isFilter(departmentPO); PageInfo pageInfos; String orderSql = PageInfoSortUtil.getSortSql(param.getSortParams()); List allList = getDepartmentMapper().list(orderSql); new DetachUtil(user.getUID()).filterDepartmentList(allList); // 通过子级遍历父级元素 if (filter) { // 根据条件获取元素 List filterDeptPOs = getDepartmentMapper().listByFilter(departmentPO, orderSql); new DetachUtil(user.getUID()).filterDepartmentList(filterDeptPOs); // 添加父级元素 List compListDTOS = DepartmentBO.buildDeptDTOList(allList, filterDeptPOs); List subList = PageUtil.subList(param.getCurrent(), param.getPageSize(), compListDTOS); pageInfos = new PageInfo<>(subList, DepartmentListDTO.class); pageInfos.setTotal(compListDTOS.size()); } else { // 组合list List compListDTOS = DepartmentBO.buildDeptDTOList(allList); List subList = PageUtil.subList(param.getCurrent(), param.getPageSize(), compListDTOS); pageInfos = new PageInfo<>(subList, DepartmentListDTO.class); pageInfos.setTotal(compListDTOS.size()); } pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); OrganizationWeaTable table = new OrganizationWeaTable<>(user, DepartmentListDTO.class); List columns = pageInfos.getColumns(); List weaTableColumn = columns.stream().map(v -> new WeaTableColumn("100", v.getTitle(), v.getKey())).collect(Collectors.toList()); table.setColumns(weaTableColumn); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); datas.put("pageInfo", pageInfos); datas.put("dataKey", result.getResultMap()); return datas; } @Override public Long saveBaseForm(Map params) { HasRightUtil.hasRight(user, RIGHT_NAME, false); String deptNo = (String) params.get("dept_no"); // 判断是否开启自动编号 deptNo = repeatDetermine(deptNo); params.put("dept_no", deptNo); if (StringUtils.isBlank(Util.null2String(params.get("show_order")))) { Integer maxShowOrder = getDepartmentMapper().getMaxShowOrder(); if (null == maxShowOrder) { maxShowOrder = 0; } params.put("show_order", maxShowOrder + 1); } // 上级分部 String ecCompany = Util.null2String(params.get("ec_company")); if (StringUtils.isNotBlank(ecCompany)) { CompPO jclCompanyId = EcHrmRelationUtil.getJclCompanyId(ecCompany); if (null != jclCompanyId) { params.put("parent_comp", jclCompanyId.getId()); } } // 上级部门 String ecDepartment = Util.null2String(params.get("ec_department")); if (StringUtils.isNotBlank(ecDepartment)) { DepartmentPO jclDepartmentId = EcHrmRelationUtil.getJclDepartmentId(ecDepartment); if (null != jclDepartmentId) { params.put("parent_dept", jclDepartmentId.getId()); // 部门不为空,自动指定所属分部 params.put("parent_comp", jclDepartmentId.getParentComp()); params.put("ec_company", EcHrmRelationUtil.getEcCompanyId(Util.null2String(jclDepartmentId.getParentComp()))); } } Map syncMap = new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.ADD, params).sync(); String ecCompanyID = Util.null2String(syncMap.get("id")); OrganizationAssert.isTrue(StringUtils.isNotBlank(ecCompanyID), syncMap.get("message").toString()); // 查询UUID RecordInfo recordInfo = getSystemDataMapper().getHrmObjectByID(HRM_DEPARTMENT, ecCompanyID); params.put("uuid", recordInfo.getUuid()); return getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_DEPT, params, "", null); } @Override public int updateForbiddenTagById(DeptSearchParam params) { HasRightUtil.hasRight(user, RIGHT_NAME, false); DepartmentPO departmentPO = DepartmentPO.builder().id(params.getId()).forbiddenTag(params.getForbiddenTag() ? 0 : 1).build(); if (!params.getForbiddenTag()) { // 判断当前岗位下是否有启用岗位,如有启用岗位,部门无法禁用 int countUsedInJob = getDepartmentMapper().countUsedInJob(params.getId()); OrganizationAssert.isTrue(countUsedInJob == 0, "部门存在下级岗位,不能封存"); } Map map = new HashMap<>(); map.put("id", departmentPO.getId()); map.put("forbiddenTag", departmentPO.getForbiddenTag()); new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.CANCELED, map).sync(); return getDepartmentMapper().updateForbiddenTagById(departmentPO); } @Override public Long updateForm(Map params) { HasRightUtil.hasRight(user, RIGHT_NAME, false); DeptSearchParam searchParam = JSONObject.parseObject(JSONObject.toJSONString(params), DeptSearchParam.class); String groupId = (String) params.get("viewCondition"); if ("0".equals(groupId)) { groupId = GROUP_ID.toString(); } DepartmentPO oldDept = getDepartmentMapper().getDeptById(searchParam.getId()); String deptNo = searchParam.getDeptNo(); if (!deptNo.equals(oldDept.getDeptNo())) { deptNo = repeatDetermine(deptNo); params.put("dept_no", deptNo); } // 上级分部 String ecCompany = Util.null2String(params.get("ec_company")); if (StringUtils.isNotBlank(ecCompany)) { CompPO jclCompanyId = EcHrmRelationUtil.getJclCompanyId(ecCompany); if (null != jclCompanyId) { params.put("parent_comp", jclCompanyId.getId()); } } // 上级部门 String ecDepartment = Util.null2String(params.get("ec_department")); if (StringUtils.isNotBlank(ecDepartment)) { DepartmentPO jclDepartmentId = EcHrmRelationUtil.getJclDepartmentId(ecDepartment); if (null != jclDepartmentId) { // 上级部门不能选择本身 OrganizationAssert.isFalse(jclDepartmentId.getId().equals(searchParam.getId()), "上级部门不能选择本身"); params.put("parent_dept", jclDepartmentId.getId()); // 部门不为空,自动指定所属分部 params.put("parent_comp", jclDepartmentId.getParentComp()); params.put("ec_company", EcHrmRelationUtil.getEcCompanyId(Util.null2String(jclDepartmentId.getParentComp()))); } } else { params.put("parent_dept", ""); } new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.UPDATE, params).sync(); // 更新主表数据 getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_DEPT, params, "", searchParam.getId()); // 更新主表拓展表 getExtService(user).updateExtForm(user, EXTEND_TYPE, JCL_ORG_DEPTEXT, params, groupId, searchParam.getId()); //更新明细表 getExtService(user).updateExtDT(user, EXTEND_TYPE, JCL_ORG_DEPTEXT_DT1, params, searchParam.getId()); DepartmentPO newDeptById = getDepartmentMapper().getDeptById(searchParam.getId()); new DepartmentTriggerRunnable(oldDept, newDeptById).run(); Long parentComp = StringUtils.isNotEmpty(Util.null2String(params.get("parent_comp"))) ? Long.parseLong(Util.null2String(params.get("parent_comp"))) : null; // 刷新岗位所属分部 refreshJobComp(searchParam.getId(), parentComp); List childList = getDepartmentMapper().getDeptListByPId(searchParam.getId()); String ecCompanyId = EcHrmRelationUtil.getEcCompanyId(Util.null2String(parentComp)); forbiddenChildTag(parentComp, ecCompanyId, childList); return searchParam.getId(); } @Override public int deleteByIds(Collection ids) { HasRightUtil.hasRight(user, RIGHT_NAME, false); OrganizationAssert.notEmpty(ids, "请选择要删除的数据"); Map map = new HashMap<>(); for (Long id : ids) { map.put("id", id); new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.CANCELED, map).sync(); // 删除拓展表、明细表 MapperProxyFactory.getProxy(ExtMapper.class).deleteByID("jcl_org_deptext", id); MapperProxyFactory.getProxy(ExtDTMapper.class).deleteByMainID("jcl_org_deptext_dt1", id, null); } return getDepartmentMapper().deleteByIds(ids); } @Override public Map getSearchCondition(Map params) { Map apiDatas = new HashMap<>(); List addGroups = new ArrayList<>(); List conditionItems = new ArrayList<>(); // 编号 SearchConditionItem deptNoItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "编号", "deptNo"); // 名称 SearchConditionItem deptNameItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "名称", "departmentName"); // 简称 SearchConditionItem deptNameShortItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 2, 50, "简称", "deptNameShort"); // 所属分部 SearchConditionItem parentCompBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "所属分部", "164", "ecCompany", ""); // 上级部门 SearchConditionItem parentDeptBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "上级部门", "4", "ecDepartment", ""); // 部门负责人 SearchConditionItem deptPrincipalBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "部门负责人", "1", "deptPrincipal", ""); // 显示顺序 SearchConditionItem showOrderItem = OrganizationFormItemUtil.inputNumberItem(user, 2, 16, 2, "显示顺序", "showOrder"); // 禁用标记 List selectOptions = new ArrayList<>(); SearchConditionOption enableOption = new SearchConditionOption("true", "启用"); SearchConditionOption disableOption = new SearchConditionOption("false", "禁用"); selectOptions.add(enableOption); selectOptions.add(disableOption); SearchConditionItem forbiddenTagItem = OrganizationFormItemUtil.selectItem(user, selectOptions, 2, 16, 6, false, "禁用标记", "forbiddenTag"); conditionItems.add(deptNoItem); conditionItems.add(deptNameItem); conditionItems.add(deptNameShortItem); conditionItems.add(parentCompBrowserItem); conditionItems.add(parentDeptBrowserItem); conditionItems.add(deptPrincipalBrowserItem); conditionItems.add(showOrderItem); conditionItems.add(forbiddenTagItem); addGroups.add(new SearchConditionGroup("高级搜索条件", true, conditionItems)); apiDatas.put("conditions", addGroups); return apiDatas; } @Override public Map> getHasRight() { return MenuBtn.getDatasHasCopy(); } @Override public Map getDeptBaseForm(Map 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 buttonsMap = new HashMap<>(); buttonsMap.put("hasEdit", true); buttonsMap.put("hasSave", true); List addGroups = new ArrayList<>(); if ("0".equals(groupId)) { groupId = GROUP_ID.toString(); } List extendTitles = getExtendTitleMapper().getTitlesByGroupID(Long.parseLong(groupId), "1"); if (CollectionUtils.isNotEmpty(extendTitles)) { for (ExtendTitlePO extendTitle : extendTitles) { List items = getExtService(user).getExtForm(user, EXTEND_TYPE + "", GROUP_ID.equals(Long.parseLong(groupId)) ? JCL_ORG_DEPT : JCL_ORG_DEPTEXT, viewAttr, id, extendTitle.getId().toString(), ""); if (CollectionUtils.isNotEmpty(items)) { addGroups.add(new SearchConditionGroup(extendTitle.getTitle(), true, items)); } } } HashMap 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_DEPTEXT)); // 处理明细表 resultMap.put("tables", getExtService(user).getExtendTables(user, EXTEND_TYPE, Long.parseLong(groupId), JCL_ORG_DEPTEXT_DT1, id, viewAttr, false)); Map apiDatas = new HashMap<>(); apiDatas.put("result", resultMap); return apiDatas; } @Override public Map getSaveForm(DeptSearchParam param) { HasRightUtil.hasRight(user, RIGHT_NAME, false); Map apiDatas = new HashMap<>(); List addGroups = new ArrayList<>(); List extendTitles = getExtendTitleMapper().getTitlesByGroupID(GROUP_ID, "1"); if (CollectionUtils.isNotEmpty(extendTitles)) { Map params = new HashMap<>(); // 分部 if (StringUtils.isNotBlank(Util.null2String(param.getSubcompanyid1()))) { CompPO compPO = getCompMapper().listById(param.getSubcompanyid1()); if (null != compPO) { params.put("parent_comp", compPO.getId()); params.put("ec_company", EcHrmRelationUtil.getEcCompanyId(compPO.getId().toString())); } } // 部门 if (StringUtils.isNotBlank(Util.null2String(param.getDepartmentid()))) { DepartmentPO deptById = getDepartmentMapper().getDeptById(param.getDepartmentid()); if (null != deptById) { params.put("parent_dept", deptById.getId()); params.put("ec_department", EcHrmRelationUtil.getEcDepartmentId(deptById.getId().toString())); params.put("parent_comp", deptById.getParentComp()); params.put("ec_company", EcHrmRelationUtil.getEcCompanyId(deptById.getParentComp().toString())); } } for (ExtendTitlePO extendTitle : extendTitles) { List items = getExtService(user).getExtSaveForm(user, EXTEND_TYPE + "", JCL_ORG_DEPT, 2, extendTitle.getId().toString(), "dept_no", RuleCodeType.DEPARTMENT.getValue(), params); if (CollectionUtils.isNotEmpty(items)) { addGroups.add(new SearchConditionGroup(extendTitle.getTitle(), true, items)); } } } apiDatas.put("condition", addGroups); return apiDatas; } /** * 复制表单 * * @return */ @Override public List getCopyForm() { List addGroups = new ArrayList<>(); List condition = new ArrayList<>(); SearchConditionItem compBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 3, false, "复制到", "164", "company", ""); compBrowserItem.setRules("required|string"); SearchConditionItem isCheckItem = OrganizationFormItemUtil.selectItem(user, Lists.newArrayList(new SearchConditionOption("1", "")), 2, 5, 10, false, "复制岗位信息", "copyJob"); isCheckItem.setDetailtype(2); SearchConditionItem copySubDeptItem = OrganizationFormItemUtil.selectItem(user, Lists.newArrayList(new SearchConditionOption("1", "")), 2, 5, 10, false, "复制子部门信息", "copySubDept"); copySubDeptItem.setDetailtype(2); SearchConditionItem copySubJob = OrganizationFormItemUtil.selectItem(user, Lists.newArrayList(new SearchConditionOption("1", "")), 2, 5, 10, false, "复制子部门岗位信息", "copySubJob"); copySubJob.setDetailtype(2); condition.add(compBrowserItem); condition.add(isCheckItem); condition.add(copySubDeptItem); condition.add(copySubJob); addGroups.add(new SearchConditionGroup("", true, condition)); return addGroups; } /** * 复制岗位到指定部门 * * @param copyParam * @return */ @Override public int copyDepartment(DeptCopyParam copyParam) { // 批量复制,后续优化 HasRightUtil.hasRight(user, RIGHT_NAME, false); OrganizationAssert.notBlank(copyParam.getCompany(), "请指定需要复制的公司/分部"); int insertCount = 0; // 需复制的部门 List idList = Arrays.stream(copyParam.getIds().split(",")).map(Long::parseLong).collect(Collectors.toList()); Integer maxShowOrder = getDepartmentMapper().getMaxShowOrder(); maxShowOrder = null == maxShowOrder ? 0 : maxShowOrder; for (Long departmentId : idList) { // 复制当前部门 recursionCopyDept(departmentId, null, Long.parseLong(copyParam.getCompany()), maxShowOrder, copyParam.getCopyJob(), copyParam.getCopySubDept(), copyParam.getCopySubJob()); } return insertCount; } private void recursionCopyDept(Long originalDeptId, Long parentDepartmentId, Long companyId, Integer maxShowOrder, String copyJob, String copySubDept, String copySubJob) { // 源部门 DepartmentPO deptById = getDepartmentMapper().getDeptById(originalDeptId); long timeMillis = System.currentTimeMillis(); deptById.setDeptName(deptById.getDeptName() + "_" + timeMillis); deptById.setDeptNameShort(deptById.getDeptNameShort() + "_" + timeMillis); // 处理自动编号 deptById.setDeptNo(CodeRuleUtil.generateCode(RuleCodeType.DEPARTMENT, deptById.getDeptNo(), timeMillis)); // 设置上级分部 deptById.setParentComp(EcHrmRelationUtil.getJclCompanyId(Util.null2String(companyId)).getId()); deptById.setEcCompany(companyId); deptById.setParentDept(parentDepartmentId); if (null != parentDepartmentId) { deptById.setEcDepartment(Long.parseLong(EcHrmRelationUtil.getEcDepartmentId(Util.null2String(parentDepartmentId)))); } // 显示顺序字段 deptById.setShowOrder(++maxShowOrder); deptById.setCreator((long) user.getUID()); deptById.setCreateTime(new Date()); deptById.setDeptPrincipal(null); // 新增EC表部门 Map syncMap = addEcDepartment(deptById); String ecDepartmentID = Util.null2String(syncMap.get("id")); OrganizationAssert.isTrue(StringUtils.isNotBlank(ecDepartmentID), syncMap.get("message").toString()); // 查询UUID RecordInfo recordInfo = getSystemDataMapper().getHrmObjectByID(HRM_DEPARTMENT, ecDepartmentID); deptById.setUuid(recordInfo.getUuid()); getDepartmentMapper().insertIgnoreNull(deptById); // 更新组织架构图 new DepartmentTriggerRunnable(deptById.getId()).run(); // 复制当前部门岗位信息 if ("1".equals(copyJob)) { List jobPOS = MapperProxyFactory.getProxy(JobMapper.class).listJobsByDepartmentId(originalDeptId); jobPOS = jobPOS.stream().filter(item -> null == item.getParentJob() || 0 == item.getParentJob()).collect(Collectors.toList()); Integer maxJobOrder = MapperProxyFactory.getProxy(JobMapper.class).getMaxShowOrder(); if (maxJobOrder == null) { maxJobOrder = 0; } recursionCopyJob(jobPOS, companyId, deptById.getId(), null, maxJobOrder, timeMillis); } // 是否复制子部门信息 if ("1".equals(copySubDept)) { // 查询当前部门的子部门 List deptListByPId = getDepartmentMapper().getDeptListByPId(originalDeptId); for (DepartmentPO departmentPO : deptListByPId) { // 复制子部门信息、子部门岗位信息 recursionCopyDept(departmentPO.getId(), deptById.getId(), companyId, maxShowOrder, copySubJob, copySubDept, copySubJob); } } } @Override public List getMergeForm(Long id) { List addGroups = new ArrayList<>(); List condition = new ArrayList<>(); SearchConditionItem deptBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 3, false, "合并到部门", "4", "department", ""); deptBrowserItem.setRules("required|string"); SearchConditionItem mergeNameItem = OrganizationFormItemUtil.inputItem(user, 2, 16, 3, 50, "合并后名称", "mergeName"); mergeNameItem.setRules("required|string"); condition.add(deptBrowserItem); condition.add(mergeNameItem); addGroups.add(new SearchConditionGroup("", true, condition)); return addGroups; } @Override public int mergeDepartment(DepartmentMergeParam mergeParam) { HasRightUtil.hasRight(user, RIGHT_NAME, false); // 被合并部门 Long ecParamDepartment = mergeParam.getDepartment(); DepartmentPO targetDepartment = EcHrmRelationUtil.getJclDepartmentId(Util.null2String(ecParamDepartment)); // map表中合并部门parentID Long oldParamDepartment = mergeParam.getId(); DepartmentPO oldDepartment = EcHrmRelationUtil.getJclDepartmentId(Util.null2String(oldParamDepartment)); Integer oldFParentId = null; if (null != oldDepartment) { java.sql.Date currentDate = new java.sql.Date(OrganizationDateUtil.stringToDate(OrganizationDateUtil.getFormatLocalDate(new Date())).getTime()); JclOrgMap jclOrgMap = MapperProxyFactory.getProxy(JclOrgMapper.class).getJclOrgMapByObjID(currentDate, ModuleTypeEnum.departmentfielddefined.getValue().toString(), oldDepartment.getId().toString()); if (null != jclOrgMap) { oldFParentId = jclOrgMap.getFParentId(); } } // 断言判断 OrganizationAssert.isFalse(null == targetDepartment, "被合并部门数据有误,暂时无法合并"); OrganizationAssert.isFalse(mergeParam.getId().equals(targetDepartment.getId()), "所选部门与待合并部门一致,无需操作"); OrganizationAssert.notNull(mergeParam.getDepartment(), "请选择需要合并的部门"); OrganizationAssert.notBlank(mergeParam.getMergeName(), "请输入合并后的名称"); // 不可选择合并的数据,本身及子部门 Set disableIds = new HashSet<>(); // 添加选择部门本身 disableIds.add(mergeParam.getId()); List deptListByPId = getDepartmentMapper().getDeptListByPId(mergeParam.getId()); if (CollectionUtils.isNotEmpty(deptListByPId)) { addDisableIds(disableIds, deptListByPId); } OrganizationAssert.isFalse(disableIds.contains(targetDepartment.getId()), "请勿选择当前部门本身及其子部门"); // 查询该部门下一级部门 List firstChildDeptList = getDepartmentMapper().getDeptListByPId(mergeParam.getId()); // 更新所属部门、所属分部 for (DepartmentPO departmentPO : firstChildDeptList) { departmentPO.setParentDept(targetDepartment.getId()); departmentPO.setEcDepartment(ecParamDepartment); departmentPO.setParentComp(targetDepartment.getParentComp()); departmentPO.setEcCompany(targetDepartment.getEcCompany()); updateEcDepartment(departmentPO); getDepartmentMapper().updateBaseDept(departmentPO); // 更新组织架构图 new DepartmentTriggerRunnable(departmentPO.getId()).run(); } // 查询该部门一级岗位、更新岗位所属分部、所属部门 List firstChildJobList = getJobMapper().listJobsByDepartmentId(mergeParam.getId()); firstChildJobList = firstChildJobList.stream().filter(item -> null == item.getParentJob() || 0 == item.getParentJob()).collect(Collectors.toList()); // 批量更新部门、所属分部 RecordSet rs = new RecordSet(); String targetEcDeptId = EcHrmRelationUtil.getEcDepartmentId(targetDepartment.getId().toString()); String mergeEcDeptId = EcHrmRelationUtil.getEcDepartmentId(mergeParam.getId().toString()); rs.executeUpdate("update jcl_org_job set parent_comp =?,ec_company =?,parent_dept =?,ec_department =? where parent_dept =?", targetDepartment.getParentComp(), targetDepartment.getEcCompany(), targetDepartment.getId(), targetEcDeptId, mergeParam.getId()); // 更新岗位组织架构图 for (JobPO jobPO : firstChildJobList) { // 刷新组织架构图 new JobTriggerRunnable(jobPO.getId()).run(); } // 更新当前部门下的人员 List hrmResourceIds = getSystemDataMapper().getHrmResourceIdsByDept(mergeParam.getId().toString()); rs.executeUpdate("update hrmresource set SUBCOMPANYID1 =?,DEPARTMENTID =? where DEPARTMENTID =?", targetDepartment.getEcCompany(), targetEcDeptId, mergeEcDeptId); new RecordSet().executeUpdate("update jcl_org_hrmresource set company_id =? ,ec_company = ? ,department_id = ?, ec_department = ?where department_id =?", targetDepartment.getParentComp(), targetDepartment.getEcCompany(), targetDepartment.getId(), targetEcDeptId, mergeParam.getId()); // 更新人员组织架构图 for (Long hrmResourceId : hrmResourceIds) { new HrmResourceTriggerRunnable(hrmResourceId).run(); } // 更新子部门下岗位的所属分部 for (DepartmentPO departmentPO : firstChildDeptList) { List deptList = getDepartmentMapper().getDeptListByPId(departmentPO.getId()); forbiddenChildTag(targetDepartment.getParentComp(), Util.null2String(targetDepartment.getEcCompany()), deptList); } // 原部门删除 DepartmentPO mergeDepartment = getDepartmentMapper().getDeptById(mergeParam.getId()); Map map = new HashMap<>(); map.put("id", mergeParam.getId()); new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.CANCELED, map).sync(); // 删除拓展表、明细表 MapperProxyFactory.getProxy(ExtMapper.class).deleteByID("jcl_org_deptext", mergeParam.getId()); MapperProxyFactory.getProxy(ExtDTMapper.class).deleteByMainID("jcl_org_deptext_dt1", mergeParam.getId(), null); getDepartmentMapper().deleteByIds(DeleteParam.builder().ids(mergeParam.getId().toString()).build().getIds()); // 更新组织架构图 new DepartmentTriggerRunnable(mergeDepartment).run(); // 更新部门合并后名称 targetDepartment.setDeptName(mergeParam.getMergeName()); targetDepartment.setDeptNameShort(mergeParam.getMergeName()); updateEcDepartment(targetDepartment); getDepartmentMapper().updateBaseDept(targetDepartment); // 更新组织架构图 new DepartmentTriggerRunnable(oldFParentId,targetDepartment.getId()).run(); return 0; } @Override public List getMoveForm() { List addGroups = new ArrayList<>(); List condition = new ArrayList<>(); SearchConditionItem compBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "选择分部", "164", "company", ""); SearchConditionItem deptBrowserItem = OrganizationFormItemUtil.browserItem(user, 2, 16, 2, false, "选择部门", "4", "department", ""); List selectOptions = new ArrayList<>(); SearchConditionOption compOption = new SearchConditionOption("0", "分部"); SearchConditionOption deptOption = new SearchConditionOption("1", "部门"); selectOptions.add(compOption); selectOptions.add(deptOption); SearchConditionItem moveTypeItem = OrganizationFormItemUtil.selectItem(user, selectOptions, 2, 16, 6, false, "转移到", "moveType"); moveTypeItem.setDetailtype(3); moveTypeItem.setValue("0"); condition.add(moveTypeItem); condition.add(compBrowserItem); condition.add(deptBrowserItem); addGroups.add(new SearchConditionGroup("", true, condition)); return addGroups; } @Override public int moveDepartment(DepartmentMoveParam moveParam) { HasRightUtil.hasRight(user, RIGHT_NAME, false); OrganizationAssert.notBlank(moveParam.getMoveType(), "请选择转移类型"); DepartmentPO deptById = getDepartmentMapper().getDeptById(moveParam.getId()); // 0:公司/分部 1:部门 if ("0".equals(moveParam.getMoveType())) { Long company = moveParam.getCompany(); OrganizationAssert.notNull(company, "请选择要转移到的分部"); deptById.setEcCompany(company); deptById.setParentComp(Objects.requireNonNull(EcHrmRelationUtil.getJclCompanyId(Util.null2String(company))).getId()); deptById.setParentDept(null); deptById.setEcDepartment(null); // 更新组织架构图 new DepartmentTriggerRunnable(company.toString(),deptById).run(); } else if ("1".equals(moveParam.getMoveType())) { Long department = moveParam.getDepartment(); Long departmentId = Objects.requireNonNull(EcHrmRelationUtil.getJclDepartmentId(Util.null2String(department))).getId(); OrganizationAssert.notNull(departmentId, "请选择要转移到的部门"); List deptListByPId = getDepartmentMapper().getDeptListByPId(moveParam.getId()); Set disableIds = new HashSet<>(); disableIds.add(moveParam.getId()); if (CollectionUtils.isNotEmpty(deptListByPId)) { addDisableIds(disableIds, deptListByPId); } OrganizationAssert.isFalse(disableIds.contains(departmentId), "请勿选择当前部门本身及其子部门"); deptById.setParentDept(departmentId); deptById.setEcDepartment(department); DepartmentPO parentDepartment = getDepartmentMapper().getDeptById(departmentId); deptById.setParentComp(parentDepartment.getParentComp()); deptById.setEcCompany(parentDepartment.getEcCompany()); // 更新组织架构图 new DepartmentTriggerRunnable(Integer.toString(100000000+department.intValue()),deptById).run(); } // 更新EC部门 updateEcDepartment(deptById); int updateBaseDept = getDepartmentMapper().updateBaseDept(deptById); // 刷新岗位分部 refreshJobComp(deptById.getId(), deptById.getParentComp()); List deptList = getDepartmentMapper().getDeptListByPId(deptById.getId()); String ecCompanyId = EcHrmRelationUtil.getEcCompanyId(Util.null2String(deptById.getParentComp())); // 更新当前部门下的人员 List hrmResourceIds = getSystemDataMapper().getHrmResourceIdsByDept(deptById.getId().toString()); String ecDepartmentId = EcHrmRelationUtil.getEcDepartmentId(deptById.getId().toString()); new RecordSet().executeUpdate("update hrmresource set SUBCOMPANYID1 =? where DEPARTMENTID = ?", ecCompanyId, ecDepartmentId); new RecordSet().executeUpdate("update jcl_org_hrmresource set company_id =? ,ec_company = ? where department_id =?", deptById.getParentComp(), ecCompanyId, deptById.getId()); // 更新人员组织架构图 for (Long hrmResourceId : hrmResourceIds) { new HrmResourceTriggerRunnable(hrmResourceId).run(); } forbiddenChildTag(deptById.getParentComp(), ecCompanyId, deptList); // 递归更新下级部门、岗位 return updateBaseDept; } /** * 获取所有子部门id * * @param parentComp * @param deptList */ void forbiddenChildTag(Long parentComp, String ecCompanyId, List deptList) { if (CollectionUtils.isNotEmpty(deptList)) { for (DepartmentPO departmentPO : deptList) { departmentPO.setParentComp(parentComp); departmentPO.setEcCompany(Long.parseLong(ecCompanyId)); // 更新EC表部门 updateEcDepartment(departmentPO); getDepartmentMapper().updateBaseDept(departmentPO); // 更新组织架构图 new DepartmentTriggerRunnable(departmentPO.getId()).run(); // 刷新岗位所属分部 refreshJobComp(departmentPO.getId(), parentComp); // 更新当前部门下的人员 List hrmResourceIds = getSystemDataMapper().getHrmResourceIdsByDept(departmentPO.getId().toString()); String ecDepartmentId = EcHrmRelationUtil.getEcDepartmentId(departmentPO.getId().toString()); new RecordSet().executeUpdate("update hrmresource set SUBCOMPANYID1 =? where DEPARTMENTID = ?", ecCompanyId, ecDepartmentId); new RecordSet().executeUpdate("update jcl_org_hrmresource set company_id =? ,ec_company = ? where department_id =?", parentComp, ecCompanyId, departmentPO.getId()); // 更新人员组织架构图 for (Long hrmResourceId : hrmResourceIds) { new HrmResourceTriggerRunnable(hrmResourceId).run(); } List childList = getDepartmentMapper().getDeptListByPId(departmentPO.getId()); forbiddenChildTag(parentComp, ecCompanyId, childList); } } } /** * 是否为搜索查询 * * @param departmentPO * @return */ private boolean isFilter(DepartmentPO departmentPO) { return !(StringUtil.isEmpty(departmentPO.getDeptNo()) && StringUtil.isEmpty(departmentPO.getDeptName()) && StringUtil.isEmpty(departmentPO.getDeptNameShort()) && null == departmentPO.getEcCompany() && null == departmentPO.getEcDepartment() && null == departmentPO.getParentComp() && null == departmentPO.getParentDept() && null == departmentPO.getDeptPrincipal() && null == departmentPO.getShowOrder() && null == departmentPO.getForbiddenTag()); } /** * 根据keyword查询数据 * * @param id * @param keyword * @return */ private List getFilterCompany(String id, String keyword) { // 查询部门信息 Long parentCompId = StringUtil.isEmpty(id) ? null : Long.parseLong(id); CompPO compBuild = CompPO.builder().compName(keyword).parentCompany(parentCompId).forbiddenTag(0).build(); List allCompanys = getCompMapper().list("show_order"); new DetachUtil(user.getUID()).filterCompanyList(allCompanys); List filterComps = getCompMapper().listByFilter(compBuild, "show_order"); new DetachUtil(user.getUID()).filterCompanyList(filterComps); Map allMaps = allCompanys.stream().collect(Collectors.toMap(CompPO::getId, item -> item, (k1, k2) -> k1)); Set builderComps = new HashSet<>(); for (CompPO compPO : filterComps) { buildParentComps(compPO, builderComps,allMaps); } return SearchTreeUtil.builderTreeMode(CompBO.buildSetToSearchTree(builderComps)); } /** * 添加查询元素的父级元素 * * @param compPO * @param builderComps */ private void buildParentComps(CompPO compPO, Set builderComps, Map allMaps) { builderComps.add(compPO); CompPO parentComp = allMaps.get(compPO.getParentCompany()); if (null != parentComp && 0 == parentComp.getForbiddenTag()) { buildParentComps(parentComp, builderComps, allMaps); } } /** * 判断编号是否重复 * * @return */ public static String repeatDetermine(String deptNo) { CodeRulePO codeRuleByType = MapperProxyFactory.getProxy(CodeRuleMapper.class).getCodeRuleByType(RuleCodeType.DEPARTMENT.getValue()); if (StringUtils.isNotBlank(deptNo)) { deptNo = CodeRuleUtil.generateCode(RuleCodeType.DEPARTMENT, deptNo); List list = getDepartmentMapper().listByNo(Util.null2String(deptNo)); OrganizationAssert.isEmpty(list, "编号不允许重复"); } else { if (null != codeRuleByType && "1".equals(codeRuleByType.getSerialEnable())) { deptNo = autoCreateCompanyNo(); } } return deptNo; } /** * 自动编号处理 * * @return */ private static String autoCreateCompanyNo() { String generateCode = CodeRuleUtil.generateCode(RuleCodeType.DEPARTMENT, ""); List list = getDepartmentMapper().listByNo(Util.null2String(generateCode)); if (CollectionUtils.isNotEmpty(list)) { generateCode = autoCreateCompanyNo(); } return generateCode; } /** * 递归复制岗位信息 * * @param jobPOS * @param parentCompId * @param parentDeptId * @param orderNum */ private void recursionCopyJob(List jobPOS, Long parentCompId, Long parentDeptId, Long currentParentJobId, int orderNum, long timeMillis) { for (JobPO jobPO : jobPOS) { orderNum++; // 查询源岗位的下级岗位 List jobsByPid = MapperProxyFactory.getProxy(JobMapper.class).getJobsByPid(jobPO.getId()); // 处理自动编号 jobPO.setJobNo(CodeRuleUtil.generateCode(RuleCodeType.JOBTITLES, jobPO.getJobNo(), timeMillis)); // 所属部门赋值 jobPO.setParentDept(parentDeptId); String ecDepartmentId = EcHrmRelationUtil.getEcDepartmentId(parentDeptId.toString()); if (StringUtils.isNotBlank(ecDepartmentId)) { jobPO.setEcDepartment(Long.parseLong(ecDepartmentId)); } // 所属分部赋值 jobPO.setEcCompany(parentCompId); CompPO jclCompanyId = EcHrmRelationUtil.getJclCompanyId(Util.null2String(parentCompId)); if (null != jclCompanyId) { jobPO.setParentComp(jclCompanyId.getId()); } // 指定上级岗位 jobPO.setParentJob(currentParentJobId); jobPO.setCreator((long) user.getUID()); jobPO.setCreateTime(new Date()); jobPO.setShowOrder(orderNum); MapperProxyFactory.getProxy(JobMapper.class).insertIgnoreNull(jobPO); // 更新组织架构图 new JobTriggerRunnable(jobPO.getId()).run(); // 处理子级元素 if (CollectionUtils.isNotEmpty(jobsByPid)) { recursionCopyJob(jobsByPid, parentCompId, parentDeptId, jobPO.getId(), orderNum, timeMillis); } } } /** * 更新EC表部门 * * @param departmentPO */ private void updateEcDepartment(DepartmentPO departmentPO) { Map map = new HashMap<>(); map.put("dept_name_short", departmentPO.getDeptNameShort()); map.put("dept_name", departmentPO.getDeptName()); map.put("parent_comp", departmentPO.getParentComp()); map.put("parent_dept", departmentPO.getParentDept()); map.put("show_order", departmentPO.getShowOrder()); map.put("dept_no", departmentPO.getDeptNo()); map.put("dept_principal", departmentPO.getDeptPrincipal()); map.put("id", departmentPO.getId()); new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.UPDATE, map).sync(); } /** * 新增EC表部门 * * @param departmentPO * @return */ private Map addEcDepartment(DepartmentPO departmentPO) { Map map = new HashMap<>(); map.put("dept_name_short", departmentPO.getDeptNameShort()); map.put("dept_name", departmentPO.getDeptName()); map.put("parent_comp", departmentPO.getParentComp()); map.put("parent_dept", departmentPO.getParentDept()); map.put("show_order", departmentPO.getShowOrder()); map.put("dept_no", departmentPO.getDeptNo()); map.put("dept_principal", departmentPO.getDeptPrincipal()); map.put("id", departmentPO.getId()); return new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.ADD, map).sync(); } /** * 封存EC表部门 * * @param id */ private void cancelEcDepartment(Long id) { Map map = new HashMap<>(); map.put("id", id); map.put("forbiddenTag", 1); new OrganizationSyncEc(user, LogModuleNameEnum.DEPARTMENT, OperateTypeEnum.CANCELED, map).sync(); } private void addDisableIds(Set disableIds, List deptListByPId) { for (DepartmentPO departmentPO : deptListByPId) { disableIds.add(departmentPO.getId()); List childDeptPOS = getDepartmentMapper().getDeptListByPId(departmentPO.getId()); addDisableIds(disableIds, childDeptPOS); } } /** * 更新岗位的所属分部 * * @param parentDepartment * @param parentComp */ private void refreshJobComp(Long parentDepartment, Long parentComp) { List jobPOS = getJobMapper().listJobsByDepartmentId(parentDepartment); jobPOS = jobPOS.stream().filter(item -> null == item.getParentJob() || 0 == item.getParentJob()).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(jobPOS)) { String ecCompanyId = EcHrmRelationUtil.getEcCompanyId(parentComp.toString()); getJobMapper().updateJobCompany(jobPOS.stream().map(JobPO::getId).collect(Collectors.toList()), parentComp, ecCompanyId); for (JobPO jobPO : jobPOS) { // 刷新组织架构图 new JobTriggerRunnable(jobPO.getId()).run(); } } } }