From 8cb191fc0c85196596d65ecad4364c9715be2ff1 Mon Sep 17 00:00:00 2001 From: stylefeng Date: Sun, 26 Jan 2025 20:59:50 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.3.3=E3=80=91=E3=80=90org=E3=80=91?= =?UTF-8?q?=E4=BB=8E=E6=96=B0=E6=95=B4=E7=90=86=E9=80=9A=E7=94=A8=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/factory/OrgConditionFactory.java | 139 ++++++++++++++++++ .../pojo/request/CommonOrgTreeRequest.java | 3 +- .../impl/HrOrganizationServiceImpl.java | 135 ++--------------- 3 files changed, 151 insertions(+), 126 deletions(-) create mode 100644 kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/factory/OrgConditionFactory.java diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/factory/OrgConditionFactory.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/factory/OrgConditionFactory.java new file mode 100644 index 000000000..2605b4762 --- /dev/null +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/factory/OrgConditionFactory.java @@ -0,0 +1,139 @@ +package cn.stylefeng.roses.kernel.sys.modular.org.factory; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.stylefeng.roses.kernel.db.mp.datascope.config.DataScopeConfig; +import cn.stylefeng.roses.kernel.db.mp.datascope.holder.DataScopeHolder; +import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; +import cn.stylefeng.roses.kernel.rule.enums.StatusEnum; +import cn.stylefeng.roses.kernel.sys.api.enums.org.OrgTypeEnum; +import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrganization; +import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.CommonOrgTreeRequest; +import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.HrOrganizationRequest; +import cn.stylefeng.roses.kernel.sys.modular.org.service.HrOrganizationService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + +import java.util.Set; + +/** + * 组织机构查询相关的条件组装 + * + * @author fengshuonan + * @since 2025/1/26 20:00 + */ +public class OrgConditionFactory { + + /** + * 针对通用组织机构树查询,组装一些通用的查询条件 + * + * @author fengshuonan + * @since 2025/1/26 20:00 + */ + public static void prepareRequest(CommonOrgTreeRequest commonOrgTreeRequest) { + + // 获取数据范围的信息,如果数据范围是包含全部数据,则将parentId设置为-1 + DataScopeConfig dataScopeConfig = DataScopeHolder.get(); + if (dataScopeConfig == null || dataScopeConfig.isTotalDataScope()) { + if (commonOrgTreeRequest.getOrgParentId() == null) { + commonOrgTreeRequest.setOrgParentId(TreeConstants.DEFAULT_PARENT_ID); + } + } + + // 如果查询带组织机构名称的搜索,则清空其他条件 + if (ObjectUtil.isNotEmpty(commonOrgTreeRequest.getSearchText())) { + commonOrgTreeRequest.setOrgParentId(null); + commonOrgTreeRequest.setIndexOrgIdList(null); + } + + // 如果查询待组织机构的状态信息,则清空parentId + if (ObjectUtil.isNotEmpty(commonOrgTreeRequest.getIndexOrgIdList())) { + commonOrgTreeRequest.setOrgParentId(null); + } + + } + + /** + * 创建查询组织机构树的Wrapper + *

+ * 根据父级id、定位id、公司筛选标识等查询条件进行查询 + * + * @author fengshuonan + * @since 2025/1/26 20:13 + */ + public static LambdaQueryWrapper createCommonTreeWrapper(CommonOrgTreeRequest commonOrgTreeRequest, HrOrganizationService hrOrganizationService) { + + // 创建基本的wrapper + HrOrganizationRequest hrOrganizationRequest = new HrOrganizationRequest(); + hrOrganizationRequest.setSearchText(commonOrgTreeRequest.getSearchText()); + LambdaQueryWrapper queryWrapper = OrgConditionFactory.createWrapper(hrOrganizationRequest); + + // 如果查询条件有orgId,则查询指定机构下的子机构 + Long parentId = commonOrgTreeRequest.getOrgParentId(); + if (parentId != null) { + queryWrapper.eq(HrOrganization::getOrgParentId, parentId); + } + + // 如果有定位状态的组织机构,则需要查询到定位的组织机构的所有子一级 + Set indexOrgIdList = commonOrgTreeRequest.getIndexOrgIdList(); + if (ObjectUtil.isNotEmpty(indexOrgIdList)) { + Set parentIdListTotal = hrOrganizationService.queryOrgIdParentIdList(indexOrgIdList); + if (ObjectUtil.isNotEmpty(parentIdListTotal)) { + queryWrapper.in(HrOrganization::getOrgParentId, parentIdListTotal); + } + } + + // 如果有筛选公司的标识,则只查询公司列表 + Boolean companySearchFlag = commonOrgTreeRequest.getCompanySearchFlag(); + if (ObjectUtil.isNotEmpty(companySearchFlag) && companySearchFlag) { + queryWrapper.eq(HrOrganization::getOrgType, OrgTypeEnum.COMPANY.getCode()); + } + + // 只查询启用状态的机构 + queryWrapper.eq(HrOrganization::getStatusFlag, StatusEnum.ENABLE.getCode()); + + return queryWrapper; + } + + /** + * 创建通用查询Wrapper + *

+ * 根据名称、状态、指定机构id等参数 + * + * @author fengshuonan + * @since 2025/1/26 20:20 + */ + public static LambdaQueryWrapper createWrapper(HrOrganizationRequest hrOrganizationRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 如果按文本查询条件不为空,则判断组织机构名称、简称、税号、备注是否有匹配 + String searchText = hrOrganizationRequest.getSearchText(); + if (StrUtil.isNotEmpty(searchText)) { + queryWrapper.nested(wrap -> { + wrap.like(HrOrganization::getOrgName, searchText); + wrap.or().like(HrOrganization::getOrgShortName, searchText); + wrap.or().like(HrOrganization::getTaxNo, searchText); + wrap.or().like(HrOrganization::getOrgCode, searchText); + wrap.or().like(HrOrganization::getRemark, searchText); + }); + } + + // 根据机构状态查询 + Integer statusFlag = hrOrganizationRequest.getStatusFlag(); + queryWrapper.eq(ObjectUtil.isNotNull(statusFlag), HrOrganization::getStatusFlag, statusFlag); + + // 如果查询条件有orgId,则查询指定机构下的子机构 + Long orgId = hrOrganizationRequest.getOrgId(); + if (orgId != null) { + // 查询orgId对应的所有子机构,包含本orgId + queryWrapper.nested(wrap -> { + wrap.eq(HrOrganization::getOrgParentId, orgId).or().eq(HrOrganization::getOrgId, orgId); + }); + } + + // 根据排序正序查询 + queryWrapper.orderByAsc(HrOrganization::getOrgSort); + + return queryWrapper; + } + +} diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/pojo/request/CommonOrgTreeRequest.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/pojo/request/CommonOrgTreeRequest.java index 03d21b0f1..53b663264 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/pojo/request/CommonOrgTreeRequest.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/pojo/request/CommonOrgTreeRequest.java @@ -1,7 +1,6 @@ package cn.stylefeng.roses.kernel.sys.modular.org.pojo.request; import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; -import cn.stylefeng.roses.kernel.rule.constants.TreeConstants; import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,7 +25,7 @@ public class CommonOrgTreeRequest extends BaseRequest { * 不传此参数,则默认查询所有一级的结构 */ @ChineseDescription("父级id,一级节点父id是-1") - private Long orgParentId = TreeConstants.DEFAULT_PARENT_ID; + private Long orgParentId; /** * 定位组织机构状态的组织机构id集合 diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java index 638addea2..40bbcf80c 100644 --- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java +++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java @@ -38,6 +38,7 @@ import cn.stylefeng.roses.kernel.sys.api.pojo.org.HrOrganizationDTO; import cn.stylefeng.roses.kernel.sys.api.pojo.org.OrganizationLevelRequest; import cn.stylefeng.roses.kernel.sys.modular.org.constants.OrgConstants; import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrganization; +import cn.stylefeng.roses.kernel.sys.modular.org.factory.OrgConditionFactory; import cn.stylefeng.roses.kernel.sys.modular.org.factory.OrganizationFactory; import cn.stylefeng.roses.kernel.sys.modular.org.mapper.HrOrganizationMapper; import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.CommonOrgTreeRequest; @@ -63,7 +64,6 @@ import java.util.stream.Collectors; import static cn.stylefeng.roses.kernel.rule.constants.SymbolConstant.LEFT_SQUARE_BRACKETS; import static cn.stylefeng.roses.kernel.rule.constants.SymbolConstant.RIGHT_SQUARE_BRACKETS; -import static java.util.stream.Collectors.toCollection; /** * 组织机构信息业务实现层 @@ -200,14 +200,14 @@ public class HrOrganizationServiceImpl extends ServiceImpl findList(HrOrganizationRequest hrOrganizationRequest) { - LambdaQueryWrapper wrapper = this.createWrapper(hrOrganizationRequest); + LambdaQueryWrapper wrapper = OrgConditionFactory.createWrapper(hrOrganizationRequest); return this.list(wrapper); } @Override @DataScope(userIdFieldName = "create_user") public PageResult findPage(HrOrganizationRequest hrOrganizationRequest) { - LambdaQueryWrapper wrapper = createWrapper(hrOrganizationRequest); + LambdaQueryWrapper wrapper = OrgConditionFactory.createWrapper(hrOrganizationRequest); // 只查询需要的字段 wrapper.select(HrOrganization::getOrgId, HrOrganization::getOrgName, HrOrganization::getOrgCode, HrOrganization::getStatusFlag, @@ -238,7 +238,7 @@ public class HrOrganizationServiceImpl extends ServiceImpl wrapper = createWrapper(hrOrganizationRequest); + LambdaQueryWrapper wrapper = OrgConditionFactory.createWrapper(hrOrganizationRequest); // 只查询需要的字段 wrapper.select(HrOrganization::getOrgId, HrOrganization::getOrgName, HrOrganization::getOrgCode, HrOrganization::getOrgType, @@ -262,62 +262,29 @@ public class HrOrganizationServiceImpl extends ServiceImpl wrapper = this.createCommonTreeWrapper(commonOrgTreeRequest); + LambdaQueryWrapper wrapper = OrgConditionFactory.createCommonTreeWrapper(commonOrgTreeRequest, this); wrapper.select(HrOrganization::getOrgId, HrOrganization::getOrgPids, HrOrganization::getOrgParentId, HrOrganization::getOrgName, HrOrganization::getOrgSort, HrOrganization::getOrgType); List hrOrganizationList = this.list(wrapper); - if (ObjectUtil.isEmpty(hrOrganizationList)) { return new CommonOrgTreeResponse(hrOrganizationList, new ArrayList<>()); } - // 如果查询条件不为空,则把相关的查询结果的父级也查询出来,组成一颗完整树 - String searchText = commonOrgTreeRequest.getSearchText(); - List parentOrgList = new ArrayList<>(); - if (ObjectUtil.isNotEmpty(searchText)) { - Set orgParentIdList = OrganizationFactory.getOrgParentIdList(hrOrganizationList); - LambdaQueryWrapper parentWrapper = new LambdaQueryWrapper<>(); - parentWrapper.in(HrOrganization::getOrgId, orgParentIdList); - parentOrgList = this.list(parentWrapper); - } - - // 合并两个集合 - hrOrganizationList.addAll(parentOrgList); - - // 去重 - List newNotRepeatList = hrOrganizationList.stream().collect( - Collectors.collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(HrOrganization::getOrgId))), - LinkedList::new)); - - // 从新排序,根据sort字段排序 - newNotRepeatList.sort(Comparator.comparing(HrOrganization::getOrgSort)); - // 构建树形结构 - if (ObjectUtil.isNotEmpty(commonOrgTreeRequest.getSearchText()) || ObjectUtil.isNotEmpty( - commonOrgTreeRequest.getIndexOrgIdList())) { - newNotRepeatList = new SortedTreeBuildFactory().doTreeBuild(newNotRepeatList); - } + hrOrganizationList = new SortedTreeBuildFactory().doTreeBuild(hrOrganizationList); // 遍历所有节点,查询这些节点有没有子级,填充haveSubOrgFlag - this.fillHaveSubFlag(newNotRepeatList); + this.fillHaveSubFlag(hrOrganizationList); // 遍历这些节点,如果有children的,都展开,并搜集到数组里 List expandOrgIds = new ArrayList<>(); - this.fillExpandFlag(newNotRepeatList, expandOrgIds); + this.fillExpandFlag(hrOrganizationList, expandOrgIds); - return new CommonOrgTreeResponse(newNotRepeatList, expandOrgIds); + return new CommonOrgTreeResponse(hrOrganizationList, expandOrgIds); } @Override @@ -711,46 +678,6 @@ public class HrOrganizationServiceImpl extends ServiceImpl createWrapper(HrOrganizationRequest hrOrganizationRequest) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - // 如果按文本查询条件不为空,则判断组织机构名称、简称、税号、备注是否有匹配 - String searchText = hrOrganizationRequest.getSearchText(); - if (StrUtil.isNotEmpty(searchText)) { - queryWrapper.nested(wrap -> { - wrap.like(HrOrganization::getOrgName, searchText); - wrap.or().like(HrOrganization::getOrgShortName, searchText); - wrap.or().like(HrOrganization::getTaxNo, searchText); - wrap.or().like(HrOrganization::getOrgCode, searchText); - wrap.or().like(HrOrganization::getRemark, searchText); - }); - } - - // 根据机构状态查询 - Integer statusFlag = hrOrganizationRequest.getStatusFlag(); - queryWrapper.eq(ObjectUtil.isNotNull(statusFlag), HrOrganization::getStatusFlag, statusFlag); - - // 如果查询条件有orgId,则查询指定机构下的子机构 - Long orgId = hrOrganizationRequest.getOrgId(); - if (orgId != null) { - // 查询orgId对应的所有子机构,包含本orgId - queryWrapper.nested(wrap -> { - wrap.eq(HrOrganization::getOrgParentId, orgId).or().eq(HrOrganization::getOrgId, orgId); - }); - } - - // 根据排序正序查询 - queryWrapper.orderByAsc(HrOrganization::getOrgSort); - - return queryWrapper; - } - /** * 批量删除组织机构 * @@ -773,46 +700,6 @@ public class HrOrganizationServiceImpl extends ServiceImpl createCommonTreeWrapper(CommonOrgTreeRequest commonOrgTreeRequest) { - - // 创建基本的wrapper - HrOrganizationRequest hrOrganizationRequest = new HrOrganizationRequest(); - hrOrganizationRequest.setSearchText(commonOrgTreeRequest.getSearchText()); - LambdaQueryWrapper queryWrapper = this.createWrapper(hrOrganizationRequest); - - // 如果查询条件有orgId,则查询指定机构下的子机构 - Long parentId = commonOrgTreeRequest.getOrgParentId(); - if (parentId != null) { - queryWrapper.eq(HrOrganization::getOrgParentId, parentId); - } - - // 如果有定位状态的组织机构,则需要查询到定位的组织机构的所有子一级 - Set indexOrgIdList = commonOrgTreeRequest.getIndexOrgIdList(); - if (ObjectUtil.isNotEmpty(indexOrgIdList)) { - Set parentIdListTotal = this.queryOrgIdParentIdList(indexOrgIdList); - if (ObjectUtil.isNotEmpty(parentIdListTotal)) { - queryWrapper.in(HrOrganization::getOrgParentId, parentIdListTotal); - } - } - - // 如果有筛选公司的标识,则只查询公司列表 - Boolean companySearchFlag = commonOrgTreeRequest.getCompanySearchFlag(); - if (ObjectUtil.isNotEmpty(companySearchFlag) && companySearchFlag) { - queryWrapper.eq(HrOrganization::getOrgType, OrgTypeEnum.COMPANY.getCode()); - } - - // 只查询启用状态的机构 - queryWrapper.eq(HrOrganization::getStatusFlag, StatusEnum.ENABLE.getCode()); - - return queryWrapper; - } - /** * 填充是否含有下级的标识 *