package simple.org.local.service.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import javax.transaction.Transactional;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import simple.org.sdk.event.OrgListener;
import simple.org.sdk.po.Organization;
import simple.org.sdk.po.TreeOrganization;
import simple.org.sdk.po.UserMapping;
import simple.org.sdk.register.OrganizationModuleRegister;
import simple.org.sdk.service.OrgTreeService;
import simple.org.sdk.strategy.OrganizationStrategy;
import simple.org.sdk.strategy.UserMappingStrategy;
public class OrgServiceImpl implements OrgTreeService {
// 这里是系统中已经注册的组织机构行为
@Autowired(required = false)
private List<? extends OrganizationStrategy<? extends Organization>> organizationStrategies;
// 这里是系统中已注册的组织机构-用户关联行为
@Autowired(required = false)
private List<? extends UserMappingStrategy<? extends UserMapping>> userMappingStrategies;
// 这里是系统中已注册的组织机构模型具体的类型描述
@Autowired(required = false)
private List<? extends OrganizationModuleRegister<? extends Organization>> organizationModuleRegisters;
// 这里是系统中已注册的需要监听组织机构模块事件变化的具体监听器
@Autowired(required = false)
private List<? extends OrgListener> orgListeners;
@Override
@Transactional
public Organization create(Organization org) {
/*
* 在进行新的组织机构查询时,该service方法中并没有具体的业务逻辑过程
* 而是描述了一个控制过程,具体的处理逻辑在OrganizationStrategy接口的某个具体实现中进行实现
*
* 1、进行边界校验,只对必要的类型信息进行校验,因为处理类型信息以外,本控制过程不需要关注其它业务字段的校验问题
* 2、通过类型信息找到对应的处理策略,并检查节点是否已经存在,然后进行正式创建操作
* 3、进行了组织机构基本信息的添加后,再根据情况确认是否要进行携带的用户关联信息的添加
* 4、创建成功后,本处理逻辑会触发事件监听,将创建成功后的状态通知到上层需要知晓该模块数据变化的模块
* */
// 1、================
Validate.notNull(org , "创建时,需要传入必要的组织机构信息");
String type = org.getType();
Validate.notBlank(type , "创建时,必须传入组织机构类型(type)信息");
String code = org.getCode();
Validate.notBlank(code , "创建时,必须传入组织机构编号(code)信息");
Validate.isTrue(!CollectionUtils.isEmpty(organizationStrategies) , "创建时,未发现任何已注册的处理方式");
// 检验可能存在的父级节点信息
if(org instanceof TreeOrganization) {
TreeOrganization treeOrg = (TreeOrganization)org;
String parentCode = treeOrg.getParentCode();
String parentType = treeOrg.getParentType();
OrganizationStrategy<? extends Organization> parentOrganizationStrategy = this.findOrganizationStrategy(parentType);
Validate.isTrue(StringUtils.isAllBlank(parentCode , parentType) || !StringUtils.isAllBlank(parentCode , parentType)
, "创建时,要么父级信息全部完整填写;要么都不填写");
// 只有两者都完整,才任务当前节点设定了父级节点,如果有父节点,则要确认父节点
if(!StringUtils.isAllBlank(parentCode , parentType)) {
Organization parentOrganization = parentOrganizationStrategy.queryByCode(parentType, parentCode);
Validate.notNull(parentOrganization , "无法找到指定的父级节点,请检查");
}
}
// 2、================
// 找到正确的操作策略器,并进行正式的创建处理
OrganizationStrategy<? super Organization> currentOrganizationStrategy = this.findOrganizationStrategy(type);
Validate.notNull(currentOrganizationStrategy , "创建时,未发现正确的已注册的处理方式(%s)" , type);
// 验证要添加的节点,是否已经存在
Organization exsitOrg = currentOrganizationStrategy.queryByCode(type, code);
Validate.isTrue(exsitOrg == null , "创建时,发现指定类型下的组织机构编号已经被使用,请检查");
Organization result = currentOrganizationStrategy.create(org);
Validate.notNull(result , "创建成功后的结果不能为空");
// 3、================
if(org instanceof TreeOrganization) {
TreeOrganization treeOrg = (TreeOrganization)org;
List<? extends UserMapping> users = treeOrg.getUsers();
if(!CollectionUtils.isEmpty(users)) {
for (UserMapping userMapping : users) {
String userMappingType = userMapping.getType();
Validate.notBlank(userMappingType , "创建时,未传入用户映射类型信息");
UserMappingStrategy<? super UserMapping> currentUserMappingStrategy = this.findUserMapping(userMappingType);
Validate.notNull(currentUserMappingStrategy , "创建时,未找到正确的用户映射类型处理策略");
currentUserMappingStrategy.create(userMapping);
}
}
}
// 4、================
// 一旦创建成功,则事件会被触发
if(!CollectionUtils.isEmpty(orgListeners)) {
for (OrgListener orgListener : orgListeners) {
orgListener.onCreated(result);
}
}
return result;
}
public TreeOrganization queryByParent(String parentType , String parentCode) {
/*
* 在查询组织机构的下级结构时,该service方法中并没有具体的业务逻辑过程
* 而是描述了一个控制过程,具体的业务逻辑过程由OrganizationStrategy、UserMappingStrategy
* 等接口的具体实现类进行执行:
*
* 1、进行边界检验,边界校验不通过,则直接返回null
* 2、确认当前指定的父级组织机构节点是存在的,并确定这个父级组织机构节点支持子节点的存在
* 3、根据设定的父级组织机构节点允许关联的下级组织机构类型,进行下级组织机构类型的查询和构造
* 4、根据设定的父级组织机构节点允许关联的下级关联用户类型,进行下级关联用户类型的查询和构造
* */
// 1、================
if(StringUtils.isAnyBlank(parentCode , parentType)) {
return null;
}
if(CollectionUtils.isEmpty(organizationModuleRegisters) || CollectionUtils.isEmpty(organizationStrategies)) {
return null;
}
// 2、================
// 确认当前的父级节点确实存在
// 为了提高查询性能,首先确认当前父级结构,允许哪些组织机构类型和用户类型作为下级
OrganizationStrategy<? extends Organization> currentOrganizationStrategy = this.findOrganizationStrategy(parentType);
Organization currentOrg = currentOrganizationStrategy.queryByCode(parentType, parentCode);
if(currentOrg == null) {
return null;
}
// 如果条件成立,说明这个节点不支持子级结构
if(!(currentOrg instanceof TreeOrganization)) {
return null;
}
TreeOrganization parentOrg = (TreeOrganization)currentOrg;
OrganizationModuleRegister<? extends Organization> currentOrganizationModuleRegister = this.findOrganizationModuleRegister(parentType);
// 3、================
// 如果条件成立,说明该父类可以关联任意的组织机构类型
// 否则,表示只有指定的组织机构类型才�
没有合适的资源?快使用搜索试试~ 我知道了~
使用业务抽象思想设计的具有低耦合性的组织机构模块(示例)
共50个文件
java:41个
xml:5个
gitignore:2个
需积分: 1 2 下载量 76 浏览量
2023-12-11
16:04:45
上传
评论
收藏 56KB ZIP 举报
温馨提示
对应业务抽象专栏低6、7、8三篇文章 其中有两个目录 simple-org:存放示例组织机构模块的完整代码 simple-for-org-boot:存放应用程序启动脚手架(使用spring-boot)
资源推荐
资源详情
资源评论
收起资源包目录
abstraction-master.zip (50个子文件)
abstraction-master
simple-org
SimpleOrg
simple.org.sdk
pom.xml 1KB
src
main
java
simple
org
sdk
event
OrgListener.java 448B
service
OrgService.java 336B
OrgTreeService.java 729B
register
OrganizationModuleRegister.java 2KB
UserMappingModuleRegister.java 896B
po
TreeOrganization.java 892B
Organization.java 463B
UserMapping.java 954B
strategy
OrganizationStrategy.java 3KB
UserMappingStrategy.java 1KB
pom.xml 692B
simple.org.remote
pom.xml 1KB
simple.org.local
pom.xml 1KB
src
main
resources
META-INF
spring.factories 103B
java
simple
org
local
repository
DefaultMappingUserRepository.java 891B
DefaultOrgRepository.java 777B
controller
OrgController.java 4KB
utils
ResponseMode.java 335B
service
internal
OrgServiceImpl.java 13KB
register
DefaultOrganizationModuleRegister.java 4KB
DefaultUserMappingModuleRegister.java 2KB
entity
DefaultMappingUserEntity.java 1KB
DefaultOrgEntity.java 1KB
po
DefaultMappingUser.java 920B
DefaultOrg.java 1KB
strategy
DefaultOrganizationStrategy.java 3KB
DefaultUserMappingStrategy.java 3KB
config
DefaultOrgConfig.java 2KB
.gitignore 71B
simple-for-org-boot
pom.xml 2KB
src
main
resources
application.yml 396B
java
simple
org
boot
ApplicationBoot.java 676B
repository
MyMappingUserRepository.java 814B
MyOrgRepository.java 1KB
service
internal
MyOrgServiceImpl.java 1KB
MyOrgService.java 511B
register
ExtendsOrganizationModuleRegister.java 603B
MyUserMappingModuleRegister.java 2KB
MyOrganizationModuleRegister.java 2KB
entity
MyOrgEntity.java 2KB
MyMappingUserEntity.java 2KB
po
ExtendDefaultOrg.java 650B
MyMappingUser.java 734B
MyOrg.java 1KB
strategy
MyOrgStrategy.java 2KB
MyMappingUserStrategy.java 2KB
config
DefaultOrgConfig.java 1KB
SwaggerConfig.java 1003B
.gitignore 71B
共 50 条
- 1
资源评论
说好不能打脸
- 粉丝: 1w+
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功