pioneer
2 years ago
commit
a8ee954f7b
21 changed files with 1504 additions and 0 deletions
@ -0,0 +1,6 @@
|
||||
# open-JSD-10333 |
||||
|
||||
JSD-10333 用户同步\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.xx.IDaaS.sync</id> |
||||
<name><![CDATA[IDaaS用户组织同步]]></name> |
||||
<active>yes</active> |
||||
<version>1.10</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[IDaaS用户组织同步]]></description> |
||||
<change-notes><![CDATA[ |
||||
[2022-05-29]【1.0】初始化插件。<br/> |
||||
[2022-06-01]【1.1】代码问题修改。<br/> |
||||
[2022-06-08]【1.2】增加附加表存储。<br/> |
||||
[2022-06-08]【1.3】增加附加表存储。<br/> |
||||
[2022-06-08]【1.4】增加附加表存储字段。<br/> |
||||
[2022-06-14]【1.5】增加初始化导入。<br/> |
||||
[2022-06-15]【1.6】修改poi依赖。<br/> |
||||
[2022-06-15]【1.7】列调整。<br/> |
||||
[2022-06-16]【1.8】列调整。<br/> |
||||
[2022-06-16]【1.9】接口404。<br/> |
||||
[2022-06-17]【1.10】增加字段<br/> |
||||
]]></change-notes> |
||||
<extra-core> |
||||
<DBAccessProvider class="com.fr.plugin.xx.IDaaS.sync.SyncDBAccessProvider"/> |
||||
</extra-core> |
||||
<extra-decision> |
||||
<HttpHandlerProvider class="com.fr.plugin.xx.IDaaS.sync.RequestHandlerBridge"/> |
||||
<URLAliasProvider class="com.fr.plugin.xx.IDaaS.sync.RequestURLAliasBridge" /> |
||||
</extra-decision> |
||||
<function-recorder class="com.fr.plugin.xx.IDaaS.sync.RequestURLAliasBridge"/> |
||||
<lifecycle-monitor class="com.fr.plugin.xx.IDaaS.sync.LRGT"/> |
||||
</plugin> |
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<parent> |
||||
<artifactId>starter</artifactId> |
||||
<groupId>com.fr.plugin</groupId> |
||||
<version>10.0</version> |
||||
<relativePath>../../pom.xml</relativePath> |
||||
</parent> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<artifactId>jsd10333</artifactId> |
||||
|
||||
<properties> |
||||
<maven.compiler.source>8</maven.compiler.source> |
||||
<maven.compiler.target>8</maven.compiler.target> |
||||
</properties> |
||||
|
||||
<build> |
||||
<!---如果要更改调试插件,改这里的配置就可以了--> |
||||
<outputDirectory> |
||||
${project.basedir}/../../webroot/WEB-INF/plugins/plugin-${project.groupId}.${project.artifactId}-${project.version}/classes |
||||
</outputDirectory> |
||||
|
||||
<plugins> |
||||
<plugin> |
||||
<groupId>org.apache.maven.plugins</groupId> |
||||
<artifactId>maven-compiler-plugin</artifactId> |
||||
<version>2.3.2</version> |
||||
<configuration> |
||||
<source>1.8</source> |
||||
<target>1.8</target> |
||||
</configuration> |
||||
</plugin> |
||||
</plugins> |
||||
<resources> |
||||
<resource> |
||||
<directory>src/main/resources</directory> |
||||
<includes> |
||||
<include>**/*</include> |
||||
</includes> |
||||
</resource> |
||||
</resources> |
||||
</build> |
||||
|
||||
</project> |
@ -0,0 +1,12 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2020/5/14 |
||||
*/ |
||||
public class Constants { |
||||
public static final String PLUGIN_ID = "com.fr.plugin.xx.IDaaS.sync"; |
||||
|
||||
public static final String PLUGIN_NAME= "IDaaS用户组织同步"; |
||||
|
||||
} |
@ -0,0 +1,24 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync; |
||||
|
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
|
||||
|
||||
public class LRGT extends AbstractPluginLifecycleMonitor { |
||||
@Override |
||||
public void afterRun(PluginContext pluginContext) { |
||||
SyncConfig.getInstance(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
} |
||||
@Override |
||||
public void beforeUninstall(PluginContext pluginContext) { |
||||
} |
||||
|
||||
@Override |
||||
public void afterInstall(PluginContext var1) { |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync; |
||||
|
||||
import com.fr.decision.fun.HttpHandler; |
||||
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.dept.OrgAddHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.dept.OrgDelHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.dept.OrgEditHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.init.DeptInitHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.init.UserInitHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.user.UserAddHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.user.UserDelHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.action.user.UserEditHandler; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.stable.fun.Authorize; |
||||
|
||||
|
||||
@FunctionRecorder |
||||
@Authorize(callSignKey = Constants.PLUGIN_ID) |
||||
public class RequestHandlerBridge extends AbstractHttpHandlerProvider { |
||||
|
||||
@Override |
||||
public HttpHandler[] registerHandlers() { |
||||
return new HttpHandler[]{ |
||||
new OrgAddHandler(), |
||||
new OrgEditHandler(), |
||||
new OrgDelHandler(), |
||||
new UserAddHandler(), |
||||
new UserEditHandler(), |
||||
new UserDelHandler(), |
||||
new DeptInitHandler(), |
||||
new UserInitHandler(), |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||
import com.fr.decision.webservice.url.alias.URLAlias; |
||||
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/07/28 |
||||
*/ |
||||
public class RequestURLAliasBridge extends AbstractURLAliasProvider { |
||||
@Override |
||||
public URLAlias[] registerAlias() { |
||||
return new URLAlias[]{ |
||||
URLAliasFactory.createPluginAlias("/scim/organization", "/scim/organization", true), |
||||
URLAliasFactory.createPluginAlias("/scim/account", "/scim/account", true), |
||||
URLAliasFactory.createPluginAlias("/init/user", "/init/user", true), |
||||
URLAliasFactory.createPluginAlias("/init/dept", "/init/dept", true), |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,43 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync; |
||||
|
||||
import com.fr.db.fun.impl.AbstractDBAccessProvider; |
||||
import com.fr.plugin.xx.IDaaS.sync.dao.DeptDao; |
||||
import com.fr.plugin.xx.IDaaS.sync.entity.DeptEntity; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.dao.DAOProvider; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/06/06 |
||||
**/ |
||||
public class SyncDBAccessProvider extends AbstractDBAccessProvider { |
||||
|
||||
private static DBAccessor dbAccessor = null; |
||||
|
||||
public static DBAccessor getDbAccessor() { |
||||
return dbAccessor; |
||||
} |
||||
|
||||
@Override |
||||
public DAOProvider[] registerDAO() { |
||||
return new DAOProvider[]{ |
||||
new DAOProvider() { |
||||
@Override |
||||
public Class getEntityClass() { |
||||
return DeptEntity.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends BaseDAO> getDAOClass() { |
||||
return DeptDao.class; |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void onDBAvailable(DBAccessor dbAccessor) { |
||||
SyncDBAccessProvider.dbAccessor = dbAccessor; |
||||
} |
||||
} |
@ -0,0 +1,60 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.dept; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
public class OrgAddHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.POST; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/organization"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
JSONObject body = SyncUtil.getBody(request); |
||||
if (JSONObject.EMPTY.equals(body)) { |
||||
SyncUtil.setError(response, "请求为空"); |
||||
return; |
||||
} |
||||
String parent = StringUtils.equals(body.getString("organizationUuid"), SyncConfig.getInstance().getRootId()) ? null : body.getString("parentUuid"); |
||||
Department department = (new Department()).id(body.getString("organizationUuid")).name(body.getString("organization")).parentId(parent).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true); |
||||
Department query = AuthorityContext.getInstance().getDepartmentController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name", department.getName()))); |
||||
if(query != null){ |
||||
SyncUtil.setError(response, "部门已存在"); |
||||
return; |
||||
} |
||||
AuthorityContext.getInstance().getDepartmentController().add(department); |
||||
SyncUtil.saveDept(body, department); |
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,47 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.dept; |
||||
|
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.decision.webservice.v10.user.DepartmentService; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
|
||||
public class OrgDelHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.DELETE; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/organization"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
String id = WebUtils.getHTTPRequestParameter(request, "id"); |
||||
if (StringUtils.isBlank(id)) { |
||||
SyncUtil.setError(response, "id不能为空"); |
||||
return; |
||||
} |
||||
DepartmentService.getInstance().deleteDepartment(id); |
||||
SyncUtil.delDept(id); |
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.dept; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
|
||||
public class OrgEditHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.PUT; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/organization"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
JSONObject body = SyncUtil.getBody(request); |
||||
if (JSONObject.EMPTY.equals(body)) { |
||||
SyncUtil.setError(response, "请求为空"); |
||||
return; |
||||
} |
||||
String parent = body.getBoolean("rootNode") ? null : body.getString("parentUuid"); |
||||
Department department = (new Department()).id(body.getString("organizationUuid")).name(body.getString("organization")).parentId(parent).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true); |
||||
Department query = AuthorityContext.getInstance().getDepartmentController().getById(department.getId()); |
||||
if(query == null){ |
||||
SyncUtil.setError(response, "部门不存在"); |
||||
return; |
||||
} |
||||
AuthorityContext.getInstance().getDepartmentController().update(department); |
||||
SyncUtil.saveDept(body, department); |
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,98 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.init; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.plugin.xx.IDaaS.sync.SyncDBAccessProvider; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.plugin.xx.IDaaS.sync.dao.DeptDao; |
||||
import com.fr.plugin.xx.IDaaS.sync.entity.DeptEntity; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.LogUtils; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.action.DBAction; |
||||
import com.fr.stable.db.dao.DAOContext; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Row; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.WorkbookFactory; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.File; |
||||
|
||||
|
||||
public class DeptInitHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.GET; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/init/dept"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if (!SyncUtil.checkAuth(request.getHeader("Authorization"))) { |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
if (!SyncConfig.getInstance().getInitSwitch()) { |
||||
SyncUtil.setError(response, "初始化开关未开启,无法初始化"); |
||||
return; |
||||
} |
||||
String path = WebUtils.getHTTPRequestParameter(request, "path"); |
||||
if (StringUtils.isBlank(path)) { |
||||
SyncUtil.setError(response, "初始化文件路径为空"); |
||||
return; |
||||
} |
||||
Workbook workbook = WorkbookFactory.create(new File(path)); |
||||
Sheet sheet = workbook.getSheetAt(0); |
||||
for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { |
||||
Row row = sheet.getRow(i); |
||||
try { |
||||
Department department = getDeptByRow(row); |
||||
if(department == null){ |
||||
LogUtils.warn("第{}行获取用户信息失败", i); |
||||
continue; |
||||
} |
||||
AuthorityContext.getInstance().getDepartmentController().add(department); |
||||
DeptEntity entity = DeptEntity.fromRow(row); |
||||
SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction<DeptEntity>() { |
||||
@Override |
||||
public DeptEntity run(DAOContext daoContext) throws Exception { |
||||
daoContext.getDAO(DeptDao.class).addOrUpdate(entity); |
||||
return entity; |
||||
} |
||||
}); |
||||
} catch (Exception e) { |
||||
LogUtils.error("第{}行插入部门信息失败", i); |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
private Department getDeptByRow(Row row) { |
||||
if (row.getCell(0) == null || StringUtils.isBlank(row.getCell(0).getStringCellValue())) { |
||||
return null; |
||||
} |
||||
String id = row.getCell(0).getStringCellValue(); |
||||
String name = row.getCell(1).getStringCellValue(); |
||||
String parent = row.getCell(2).getStringCellValue(); |
||||
parent = StringUtils.equals(id, SyncConfig.getInstance().getRootId()) ? null : parent; |
||||
return (new Department()).id(id).name(name).parentId(parent).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,119 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.init; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.base.util.UUIDUtil; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.decision.privilege.encrpt.PasswordValidator; |
||||
import com.fr.decision.webservice.bean.user.DepPostUserUpdateBean; |
||||
import com.fr.decision.webservice.utils.UserSourceFactory; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.LogUtils; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Row; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.WorkbookFactory; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.File; |
||||
|
||||
|
||||
public class UserInitHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.GET; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/init/user"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if (!SyncUtil.checkAuth(request.getHeader("Authorization"))) { |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
if (!SyncConfig.getInstance().getInitSwitch()) { |
||||
SyncUtil.setError(response, "初始化开关未开启,无法初始化"); |
||||
return; |
||||
} |
||||
String path = WebUtils.getHTTPRequestParameter(request, "path"); |
||||
if (StringUtils.isBlank(path)) { |
||||
SyncUtil.setError(response, "初始化文件路径为空"); |
||||
return; |
||||
} |
||||
Workbook workbook = WorkbookFactory.create(new File(path)); |
||||
Sheet sheet = workbook.getSheetAt(0); |
||||
for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) { |
||||
Row row = sheet.getRow(i); |
||||
User user = getUserByRow(row); |
||||
if (user == null) { |
||||
LogUtils.warn("第{}行获取用户信息失败", i); |
||||
continue; |
||||
} |
||||
try { |
||||
User userByUserName = UserService.getInstance().getUserByUserName(user.getUserName()); |
||||
if (userByUserName == null) { |
||||
AuthorityContext.getInstance().getUserController().add(user); |
||||
} |
||||
String dept = row.getCell(5).getStringCellValue(); |
||||
if (StringUtils.isNotBlank(dept)) { |
||||
Department department = AuthorityContext.getInstance().getDepartmentController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", dept))); |
||||
if (department != null) { |
||||
String postId = SyncUtil.generateDefaultPosition(dept); |
||||
DepPostUserUpdateBean bean = new DepPostUserUpdateBean(); |
||||
bean.setDepartmentId(dept); |
||||
bean.setPostId(postId); |
||||
bean.setAddUserIds(new String[]{user.getId()}); |
||||
LogUtils.debug4plugin("init user {} to dep-[{}] post-[{}]", user.getUserName(), dept, postId); |
||||
UserService.getInstance().updateDepartmentPostUsers(dept, postId, bean); |
||||
}else{ |
||||
LogUtils.error("第{}行插入用户无对应组织,更新所属组织失败", i); |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
LogUtils.error("第{}行插入用户信息失败", i); |
||||
LogUtils.error(e.getMessage(),e); |
||||
} |
||||
} |
||||
|
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
private User getUserByRow(Row row) { |
||||
if (row.getCell(1) == null || StringUtils.isBlank(row.getCell(1).getStringCellValue())) { |
||||
return null; |
||||
} |
||||
String id = row.getCell(1).getStringCellValue(); |
||||
String email = row.getCell(0).getStringCellValue(); |
||||
String name = row.getCell(2).getStringCellValue(); |
||||
String phone = row.getCell(4).getStringCellValue(); |
||||
User user = (new User()).id(id).userName(id) |
||||
.realName(name).email(email) |
||||
.workPhone(phone).creationType(ManualOperationType.KEY) |
||||
.lastOperationType(ManualOperationType.KEY).enable(true); |
||||
String uuid = UUIDUtil.generate(); |
||||
PasswordValidator validator = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
||||
user.password(validator.encode(user.getUserName(), uuid, uuid)).salt(uuid); |
||||
return user; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,85 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.user; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.base.util.UUIDUtil; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.decision.privilege.encrpt.PasswordValidator; |
||||
import com.fr.decision.webservice.bean.user.DepPostUserUpdateBean; |
||||
import com.fr.decision.webservice.utils.UserSourceFactory; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.LogUtils; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
|
||||
public class UserAddHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.POST; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/account"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
JSONObject body = SyncUtil.getBody(request); |
||||
if (JSONObject.EMPTY.equals(body)) { |
||||
SyncUtil.setError(response, "请求为空"); |
||||
return; |
||||
} |
||||
User user = SyncUtil.getUser(body); |
||||
|
||||
String uuid = UUIDUtil.generate(); |
||||
PasswordValidator validator = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
||||
user.password(validator.encode(user.getUserName(), uuid, uuid)).salt(uuid); |
||||
User userByUserName = UserService.getInstance().getUserByUserName(user.getUserName()); |
||||
if (userByUserName != null) { |
||||
SyncUtil.setError(response, "用户名重复"); |
||||
return; |
||||
} |
||||
AuthorityContext.getInstance().getUserController().add(user); |
||||
JSONArray belongs = body.getJSONArray("belongs"); |
||||
if (belongs != null) { |
||||
for (int i = 0; i < belongs.size(); i++) { |
||||
JSONObject object = belongs.getJSONObject(i); |
||||
String uid = object.getString("belongOuUuid"); |
||||
Department query = AuthorityContext.getInstance().getDepartmentController().getById(uid); |
||||
if(query != null){ |
||||
String postId = SyncUtil.generateDefaultPosition(uid); |
||||
DepPostUserUpdateBean bean = new DepPostUserUpdateBean(); |
||||
bean.setDepartmentId(uid); |
||||
bean.setPostId(postId); |
||||
bean.setAddUserIds(new String[]{user.getId()}); |
||||
LogUtils.debug4plugin("set user {} to dep-[{}] post-[{}]",user.getUserName(),uid,postId); |
||||
UserService.getInstance().updateDepartmentPostUsers(uid, postId, bean); |
||||
}else { |
||||
LogUtils.debug4plugin("org {} not exist",uid); |
||||
} |
||||
} |
||||
} |
||||
|
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.user; |
||||
|
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.decision.webservice.bean.user.UserUpdateBean; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
|
||||
public class UserDelHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.DELETE; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/organization"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
String id = WebUtils.getHTTPRequestParameter(request, "id"); |
||||
if (StringUtils.isBlank(id)) { |
||||
SyncUtil.setError(response, "id不能为空"); |
||||
return; |
||||
} |
||||
User user = UserService.getInstance().getUserByUserId(id); |
||||
if (user == null) { |
||||
SyncUtil.setError(response, "用户不存在"); |
||||
return; |
||||
} |
||||
UserUpdateBean userUpdateBean = new UserUpdateBean(); |
||||
userUpdateBean.setRemoveUserIds(new String[]{user.getId()}); |
||||
UserService.getInstance().deleteUsers(userUpdateBean); |
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,103 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.action.user; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.authority.data.personnel.DepRole; |
||||
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||
import com.fr.decision.webservice.bean.user.DepPostUserUpdateBean; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.LogUtils; |
||||
import com.fr.plugin.xx.IDaaS.sync.util.SyncUtil; |
||||
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
import java.util.stream.Collectors; |
||||
|
||||
|
||||
public class UserEditHandler extends BaseHttpHandler { |
||||
@Override |
||||
public RequestMethod getMethod() { |
||||
return RequestMethod.PUT; |
||||
} |
||||
|
||||
@Override |
||||
public String getPath() { |
||||
return "/scim/account"; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPublic() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception { |
||||
if(!SyncUtil.checkAuth(request.getHeader("Authorization"))){ |
||||
SyncUtil.setError(response, "Authorization验证失败"); |
||||
return; |
||||
} |
||||
JSONObject body = SyncUtil.getBody(request); |
||||
if (JSONObject.EMPTY.equals(body)) { |
||||
SyncUtil.setError(response, "请求为空"); |
||||
return; |
||||
} |
||||
User user = SyncUtil.getUser(body); |
||||
User userByUserName = UserService.getInstance().getUserByUserName(user.getUserName()); |
||||
if (userByUserName == null) { |
||||
SyncUtil.setError(response, "用户不存在"); |
||||
return; |
||||
} |
||||
user.setPassword(userByUserName.getPassword()); |
||||
AuthorityContext.getInstance().getUserController().update(user); |
||||
List<DepRole> depts = AuthorityContext.getInstance().getDepartmentController().findDepRoleByUser(user.getId()); |
||||
Set<String> deptSet = depts.stream().map(DepRole::getDepartmentId).collect(Collectors.toSet()); |
||||
Set<String> nowSet = new HashSet<>(); |
||||
JSONArray belongs = body.getJSONArray("belongs"); |
||||
if (belongs != null) { |
||||
for (int i = 0; i < belongs.size(); i++) { |
||||
JSONObject object = belongs.getJSONObject(i); |
||||
String uid = object.getString("belongOuUuid"); |
||||
//不存在则新增
|
||||
if (!deptSet.contains(uid)) { |
||||
Department query = AuthorityContext.getInstance().getDepartmentController().getById(uid); |
||||
if(query != null){ |
||||
String postId = SyncUtil.generateDefaultPosition(uid); |
||||
DepPostUserUpdateBean bean = new DepPostUserUpdateBean(); |
||||
bean.setDepartmentId(uid); |
||||
bean.setPostId(postId); |
||||
bean.setAddUserIds(new String[]{user.getId()}); |
||||
LogUtils.debug4plugin("set user {} to dep-[{}] post-[{}]", user.getUserName(), uid, postId); |
||||
UserService.getInstance().updateDepartmentPostUsers(uid, postId, bean); |
||||
}else { |
||||
LogUtils.debug4plugin("org {} not exist",uid); |
||||
} |
||||
} |
||||
nowSet.add(uid); |
||||
} |
||||
} |
||||
deptSet.stream().filter(e -> !nowSet.contains(e)).forEach(e -> { |
||||
try { |
||||
String postId = SyncUtil.generateDefaultPosition(e); |
||||
DepPostUserUpdateBean bean = new DepPostUserUpdateBean(); |
||||
bean.setDepartmentId(e); |
||||
bean.setPostId(postId); |
||||
bean.setRemoveUserIds(new String[]{user.getId()}); |
||||
LogUtils.debug4plugin("remove user {} to dep-[{}] post-[{}]", user.getUserName(), e, postId); |
||||
UserService.getInstance().updateDepartmentPostUsers(e, postId, bean); |
||||
} catch (Exception ex) { |
||||
LogUtils.error(ex.getMessage(), e); |
||||
} |
||||
}); |
||||
|
||||
SyncUtil.setSuccess(response); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,91 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.conf; |
||||
|
||||
import com.fr.config.*; |
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/12/04 |
||||
*/ |
||||
@Visualization(category = "IDaaS同步配置") |
||||
@EnableMetrics |
||||
public class SyncConfig extends DefaultConfiguration { |
||||
|
||||
private static volatile SyncConfig config = null; |
||||
|
||||
public static SyncConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(SyncConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
@Identifier(value = "debugSwitch", name = "插件调试开关", description = "日志调试模式", status = Status.SHOW) |
||||
private Conf<Boolean> debugSwitch = Holders.simple(true); |
||||
|
||||
@Identifier(value = "authUser", name = "接口鉴权用户名", description = "接口鉴权用户名", status = Status.SHOW) |
||||
private Conf<String> authUser = Holders.simple(StringUtils.EMPTY); |
||||
|
||||
public String getAuthUser() { |
||||
return authUser.get(); |
||||
} |
||||
|
||||
public void setAuthUser(String authUser) { |
||||
this.authUser.set(authUser); |
||||
} |
||||
|
||||
@Identifier(value = "authPass", name = "接口鉴权密码", description = "接口鉴权密码", status = Status.SHOW) |
||||
private Conf<String> authPass = Holders.simple(StringUtils.EMPTY); |
||||
|
||||
public String getAuthPass() { |
||||
return authPass.get(); |
||||
} |
||||
|
||||
public void setAuthPass(String authPass) { |
||||
this.authPass.set(authPass); |
||||
} |
||||
|
||||
public Boolean getDebugSwitch() { |
||||
return this.debugSwitch.get(); |
||||
} |
||||
|
||||
public void setDebugSwitch(Boolean debugSwitch) { |
||||
this.debugSwitch.set(debugSwitch); |
||||
} |
||||
|
||||
@Identifier(value = "rootId", name = "部门根节点ID", description = "部门根节点ID", status = Status.SHOW) |
||||
private Conf<String> rootId = Holders.simple("xx"); |
||||
|
||||
public String getRootId() { |
||||
return rootId.get(); |
||||
} |
||||
|
||||
public void setRootId(String rootId) { |
||||
this.rootId.set(rootId); |
||||
} |
||||
|
||||
@Identifier(value = "initSwitch", name = "初始化开关", description = "初始化开关", status = Status.SHOW) |
||||
private Conf<Boolean> initSwitch = Holders.simple(false); |
||||
|
||||
public Boolean getInitSwitch() { |
||||
return initSwitch.get(); |
||||
} |
||||
|
||||
public void setInitSwitch(Boolean initSwitch) { |
||||
this.initSwitch.set(initSwitch); |
||||
} |
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
SyncConfig cloned = (SyncConfig) super.clone(); |
||||
cloned.debugSwitch = (Conf<Boolean>) debugSwitch.clone(); |
||||
cloned.authUser = (Conf<String>) authUser.clone(); |
||||
cloned.authPass = (Conf<String>) authPass.clone(); |
||||
cloned.rootId = (Conf<String>) rootId.clone(); |
||||
return cloned; |
||||
} |
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.dao; |
||||
|
||||
import com.fr.plugin.xx.IDaaS.sync.entity.DeptEntity; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.session.DAOSession; |
||||
|
||||
|
||||
public class DeptDao extends BaseDAO<DeptEntity> { |
||||
public DeptDao(DAOSession daoSession) { |
||||
super(daoSession); |
||||
} |
||||
|
||||
@Override |
||||
protected Class<DeptEntity> getEntityClass() { |
||||
return DeptEntity.class; |
||||
} |
||||
} |
@ -0,0 +1,265 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.entity; |
||||
|
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.entity.BaseEntity; |
||||
import com.fr.stable.db.entity.TableAssociation; |
||||
import com.fr.third.javax.persistence.Column; |
||||
import com.fr.third.javax.persistence.Entity; |
||||
import com.fr.third.javax.persistence.Table; |
||||
import com.fr.third.org.apache.commons.lang3.math.NumberUtils; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Cell; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Row; |
||||
|
||||
|
||||
@Entity |
||||
@Table(name = "fine_plugin_dept") |
||||
@TableAssociation(associated = true) |
||||
public class DeptEntity extends BaseEntity { |
||||
|
||||
@Column(name = "parent_id") |
||||
private String parentId; |
||||
|
||||
@Column(name = "name") |
||||
private String name; |
||||
|
||||
@Column(name = "type") |
||||
private String type; |
||||
|
||||
@Column(name = "short_name") |
||||
private String shortName; |
||||
|
||||
@Column(name = "level_number") |
||||
private Integer levelNumber; |
||||
|
||||
@Column(name = "logical_org_id") |
||||
private String logicalOrgId; |
||||
|
||||
@Column(name = "org_id") |
||||
private String orgId; |
||||
|
||||
@Column(name = "org_adress") |
||||
private String orgAdress; |
||||
|
||||
@Column(name = "country") |
||||
private String country; |
||||
|
||||
@Column(name = "org_status") |
||||
private String orgStatus; |
||||
|
||||
@Column(name = "org_plate") |
||||
private String orgPlate; |
||||
|
||||
@Column(name = "org_category") |
||||
private String orgCategory; |
||||
|
||||
@Column(name = "org_properties") |
||||
private String orgProperties; |
||||
|
||||
@Column(name = "parentDepartmentId") |
||||
private String parentDepartmentId; |
||||
|
||||
@Column(name = "isReal") |
||||
private String isReal; |
||||
|
||||
@Column(name = "org_code") |
||||
private String orgCode; |
||||
|
||||
|
||||
public static DeptEntity fromBody(JSONObject object) { |
||||
if (object == null) { |
||||
return null; |
||||
} |
||||
DeptEntity entity = new DeptEntity(); |
||||
entity.setId(object.getString("organizationUuid")); |
||||
entity.setName(object.getString("organization")); |
||||
entity.setParentId(object.getString("parentUuid")); |
||||
entity.setType(object.getString("type")); |
||||
entity.setLevelNumber(object.getInt("levelNumber")); |
||||
|
||||
JSONObject extendField = object.getJSONObject("extendField"); |
||||
if (extendField != null) { |
||||
JSONObject attributes = extendField.getJSONObject("attributes"); |
||||
if (attributes != null) { |
||||
entity.setLogicalOrgId(attributes.getString("logicalOrgId")); |
||||
entity.setOrgId(attributes.getString("OrgID")); |
||||
entity.setShortName(attributes.getString("OrgShortName")); |
||||
entity.setOrgAdress(attributes.getString("OrgAdress")); |
||||
entity.setCountry(attributes.getString("Country")); |
||||
entity.setOrgStatus(attributes.getString("OrgStatus")); |
||||
entity.setOrgPlate(attributes.getString("OrgPlate")); |
||||
entity.setOrgCategory(attributes.getString("OrgCategory")); |
||||
entity.setOrgProperties(attributes.getString("OrgProperties")); |
||||
entity.setParentDepartmentId(attributes.getString("parentlogicalOrgId")); |
||||
entity.setIsReal(attributes.getString("IsReal")); |
||||
entity.setOrgCode(attributes.getString("OrgCode")); |
||||
} |
||||
} |
||||
return entity; |
||||
} |
||||
|
||||
public static DeptEntity fromRow(Row row) { |
||||
if (row == null || row.getCell(0) == null || StringUtils.isBlank(row.getCell(0).getStringCellValue())) { |
||||
return null; |
||||
} |
||||
DeptEntity entity = new DeptEntity(); |
||||
entity.setId(entity.getCellValue(row.getCell(0))); |
||||
entity.setName(entity.getCellValue(row.getCell(1))); |
||||
entity.setParentId(entity.getCellValue(row.getCell(2))); |
||||
entity.setType(entity.getCellValue(row.getCell(4))); |
||||
String level = entity.getCellValue(row.getCell(5)); |
||||
if (StringUtils.isNotBlank(level) && NumberUtils.isCreatable(level)) { |
||||
entity.setLevelNumber(Integer.valueOf(level)); |
||||
} |
||||
entity.setLogicalOrgId(entity.getCellValue(row.getCell(7))); |
||||
entity.setOrgId(entity.getCellValue(row.getCell(8))); |
||||
entity.setShortName(entity.getCellValue(row.getCell(11))); |
||||
entity.setOrgAdress(entity.getCellValue(row.getCell(13))); |
||||
entity.setCountry(entity.getCellValue(row.getCell(15))); |
||||
entity.setOrgStatus(entity.getCellValue(row.getCell(19))); |
||||
entity.setOrgPlate(entity.getCellValue(row.getCell(20))); |
||||
entity.setOrgCategory(entity.getCellValue(row.getCell(21))); |
||||
entity.setOrgProperties(entity.getCellValue(row.getCell(22))); |
||||
entity.setParentDepartmentId(entity.getCellValue(row.getCell(27))); |
||||
entity.setIsReal(entity.getCellValue(row.getCell(37))); |
||||
entity.setOrgCode(entity.getCellValue(row.getCell(38))); |
||||
|
||||
return entity; |
||||
} |
||||
|
||||
public String getIsReal() { |
||||
return isReal; |
||||
} |
||||
|
||||
public void setIsReal(String isReal) { |
||||
this.isReal = isReal; |
||||
} |
||||
|
||||
public String getOrgCode() { |
||||
return orgCode; |
||||
} |
||||
|
||||
public void setOrgCode(String orgCode) { |
||||
this.orgCode = orgCode; |
||||
} |
||||
|
||||
private String getCellValue(Cell cell) { |
||||
if (cell == null) { |
||||
return null; |
||||
} |
||||
return cell.getStringCellValue(); |
||||
} |
||||
|
||||
public String getType() { |
||||
return type; |
||||
} |
||||
|
||||
public void setType(String type) { |
||||
this.type = type; |
||||
} |
||||
|
||||
public String getLogicalOrgId() { |
||||
return logicalOrgId; |
||||
} |
||||
|
||||
public void setLogicalOrgId(String logicalOrgId) { |
||||
this.logicalOrgId = logicalOrgId; |
||||
} |
||||
|
||||
public String getOrgId() { |
||||
return orgId; |
||||
} |
||||
|
||||
public void setOrgId(String orgId) { |
||||
this.orgId = orgId; |
||||
} |
||||
|
||||
public String getOrgAdress() { |
||||
return orgAdress; |
||||
} |
||||
|
||||
public void setOrgAdress(String orgAdress) { |
||||
this.orgAdress = orgAdress; |
||||
} |
||||
|
||||
public String getCountry() { |
||||
return country; |
||||
} |
||||
|
||||
public void setCountry(String country) { |
||||
this.country = country; |
||||
} |
||||
|
||||
public String getOrgStatus() { |
||||
return orgStatus; |
||||
} |
||||
|
||||
public void setOrgStatus(String orgStatus) { |
||||
this.orgStatus = orgStatus; |
||||
} |
||||
|
||||
public String getOrgPlate() { |
||||
return orgPlate; |
||||
} |
||||
|
||||
public void setOrgPlate(String orgPlate) { |
||||
this.orgPlate = orgPlate; |
||||
} |
||||
|
||||
public String getOrgCategory() { |
||||
return orgCategory; |
||||
} |
||||
|
||||
public void setOrgCategory(String orgCategory) { |
||||
this.orgCategory = orgCategory; |
||||
} |
||||
|
||||
public String getOrgProperties() { |
||||
return orgProperties; |
||||
} |
||||
|
||||
public void setOrgProperties(String orgProperties) { |
||||
this.orgProperties = orgProperties; |
||||
} |
||||
|
||||
public String getParentDepartmentId() { |
||||
return parentDepartmentId; |
||||
} |
||||
|
||||
public void setParentDepartmentId(String parentDepartmentId) { |
||||
this.parentDepartmentId = parentDepartmentId; |
||||
} |
||||
|
||||
public String getParentId() { |
||||
return parentId; |
||||
} |
||||
|
||||
public void setParentId(String parentId) { |
||||
this.parentId = parentId; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
|
||||
public String getShortName() { |
||||
return shortName; |
||||
} |
||||
|
||||
public void setShortName(String shortName) { |
||||
this.shortName = shortName; |
||||
} |
||||
|
||||
public Integer getLevelNumber() { |
||||
return levelNumber; |
||||
} |
||||
|
||||
public void setLevelNumber(Integer levelNumber) { |
||||
this.levelNumber = levelNumber; |
||||
} |
||||
} |
@ -0,0 +1,122 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.util; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.log.FineLoggerProvider; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.xx.IDaaS.sync.Constants; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/12/04 |
||||
*/ |
||||
public final class LogUtils { |
||||
private static final String DEBUG_PREFIX = "[插件调试] "; |
||||
private static String LOG_PREFIX = Constants.PLUGIN_NAME; |
||||
private static final String PLUGIN_VERSION; |
||||
|
||||
private static final FineLoggerProvider LOGGER = FineLoggerFactory.getLogger(); |
||||
|
||||
static { |
||||
String version = PluginContexts.currentContext().getMarker().getVersion(); |
||||
if (StringUtils.isNotBlank(version)) { |
||||
PLUGIN_VERSION = "[v" + version + "] "; |
||||
} else { |
||||
PLUGIN_VERSION = "[unknown version] "; |
||||
} |
||||
|
||||
LOG_PREFIX = LOG_PREFIX + PLUGIN_VERSION; |
||||
} |
||||
|
||||
public static void setPrefix(String prefix) { |
||||
if (prefix != null) { |
||||
LOG_PREFIX = prefix; |
||||
} |
||||
} |
||||
|
||||
public static boolean isDebugEnabled() { |
||||
return LOGGER.isDebugEnabled(); |
||||
} |
||||
|
||||
public static void debug(String s) { |
||||
LOGGER.debug(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void debug(String s, Object... objects) { |
||||
LOGGER.debug(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void debug(String s, Throwable throwable) { |
||||
LOGGER.debug(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void debug4plugin(String s) { |
||||
if (SyncConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s); |
||||
} |
||||
} |
||||
|
||||
public static void debug4plugin(String s, Object... objects) { |
||||
if (SyncConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, objects); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s, objects); |
||||
} |
||||
} |
||||
|
||||
public static void debug4plugin(String s, Throwable throwable) { |
||||
if (SyncConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, throwable); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s, throwable); |
||||
} |
||||
} |
||||
|
||||
|
||||
public static boolean isInfoEnabled() { |
||||
return LOGGER.isInfoEnabled(); |
||||
} |
||||
|
||||
public static void info(String s) { |
||||
LOGGER.info(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void info(String s, Object... objects) { |
||||
LOGGER.info(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void warn(String s) { |
||||
LOGGER.warn(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void warn(String s, Object... objects) { |
||||
LOGGER.warn(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void warn(String s, Throwable throwable) { |
||||
LOGGER.warn(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void warn(Throwable throwable, String s, Object... objects) { |
||||
LOGGER.warn(throwable, LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void error(String s) { |
||||
LOGGER.error(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void error(String s, Object... objects) { |
||||
LOGGER.error(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void error(String s, Throwable throwable) { |
||||
LOGGER.error(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void error(Throwable throwable, String s, Object... objects) { |
||||
LOGGER.error(throwable, LOG_PREFIX + s, objects); |
||||
} |
||||
} |
@ -0,0 +1,167 @@
|
||||
package com.fr.plugin.xx.IDaaS.sync.util; |
||||
|
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.Department; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.webservice.bean.user.DepartmentPostBean; |
||||
import com.fr.decision.webservice.v10.user.PositionService; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.IDaaS.sync.SyncDBAccessProvider; |
||||
import com.fr.plugin.xx.IDaaS.sync.conf.SyncConfig; |
||||
import com.fr.plugin.xx.IDaaS.sync.dao.DeptDao; |
||||
import com.fr.plugin.xx.IDaaS.sync.entity.DeptEntity; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.db.action.DBAction; |
||||
import com.fr.stable.db.dao.DAOContext; |
||||
import com.fr.third.org.apache.commons.codec.binary.Base64; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.BufferedReader; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.util.List; |
||||
|
||||
public class SyncUtil { |
||||
|
||||
/** |
||||
* 处理请求报文 |
||||
* |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static JSONObject getBody(HttpServletRequest req) { |
||||
try { |
||||
BufferedReader br = req.getReader(); |
||||
String str = ""; |
||||
String listString = ""; |
||||
while ((str = br.readLine()) != null) { |
||||
listString += str; |
||||
} |
||||
JSONObject jsonObject = new JSONObject(listString); |
||||
LogUtils.debug4plugin("body is {}", jsonObject); |
||||
return jsonObject; |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
return JSONObject.EMPTY; |
||||
} |
||||
|
||||
/** |
||||
* 返回错误 |
||||
* |
||||
* @param response |
||||
* @param mess |
||||
*/ |
||||
public static void setError(HttpServletResponse response, String mess) { |
||||
JSONObject object = JSONObject.create(); |
||||
object.put("errorNumber", -1); |
||||
object.put("errors", String.format("[%s]", mess)); |
||||
try { |
||||
WebUtils.printAsJSON(response, object); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
public static void setSuccess(HttpServletResponse response) { |
||||
JSONObject object = JSONObject.create(); |
||||
object.put("errorNumber", 0); |
||||
try { |
||||
WebUtils.printAsJSON(response, object); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private static String getEmail(JSONArray emails) { |
||||
if (emails != null && !JSONArray.create().equals(emails) && emails.size() > 0) { |
||||
JSONObject jsonObject = emails.getJSONObject(0); |
||||
return jsonObject.getString("value"); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private static String getPhone(JSONArray phoneNumbers) { |
||||
if (phoneNumbers != null && !JSONArray.create().equals(phoneNumbers) && phoneNumbers.size() > 0) { |
||||
JSONObject jsonObject = phoneNumbers.getJSONObject(0); |
||||
return jsonObject.getString("value"); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public static User getUser(JSONObject body) { |
||||
return (new User()).id(body.getString("id")).userName(body.getString("userName")) |
||||
.realName(body.getString("displayName")).email(getEmail(body.getJSONArray("emails"))) |
||||
.workPhone(getPhone(body.getJSONArray("phoneNumbers"))).creationType(ManualOperationType.KEY) |
||||
.lastOperationType(ManualOperationType.KEY).enable(!body.getBoolean("locked")); |
||||
} |
||||
|
||||
public static String generateDefaultPosition(String depID) throws Exception { |
||||
String positionName = "部门成员"; |
||||
String adminId = UserService.getInstance().getAdminUserIdList().get(0); |
||||
List<DepartmentPostBean> postBeanList = PositionService.getInstance().getPositionsUnderParentDepartment(adminId, depID, null); |
||||
boolean hasDefaultPosition = false; |
||||
String positionId = ""; |
||||
for (DepartmentPostBean postBean : postBeanList) { |
||||
if (StringUtils.equals(positionName, postBean.getText())) { |
||||
return postBean.getId(); |
||||
} |
||||
} |
||||
List<DepartmentPostBean> postBeans = PositionService.getInstance().getPositions(adminId, null); |
||||
for (DepartmentPostBean postBean : postBeans) { |
||||
if (StringUtils.equals(positionName, postBean.getText())) { |
||||
hasDefaultPosition = true; |
||||
positionId = postBean.getId(); |
||||
} |
||||
} |
||||
if (!hasDefaultPosition) { |
||||
positionId = PositionService.getInstance().addPosition(positionName).getId(); |
||||
} |
||||
AuthorityContext.getInstance().getPostController().addPostToDepartment(positionId, depID); |
||||
return positionId; |
||||
} |
||||
|
||||
public static boolean checkAuth(String auth) { |
||||
String authUser = SyncConfig.getInstance().getAuthUser(); |
||||
String authPass = SyncConfig.getInstance().getAuthPass(); |
||||
if (StringUtils.isBlank(authUser) && StringUtils.isBlank(authPass)) { |
||||
return true; |
||||
} |
||||
if (StringUtils.isBlank(auth)) { |
||||
return false; |
||||
} |
||||
String datap = authUser + ":" + authPass; |
||||
try { |
||||
String authorization = Base64.encodeBase64String(datap.getBytes("UTF-8")).trim(); |
||||
return StringUtils.equals(auth, "Basic " + authorization); |
||||
} catch (UnsupportedEncodingException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static void saveDept(JSONObject body, Department department) throws Exception { |
||||
DeptEntity entity = DeptEntity.fromBody(body); |
||||
SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction<DeptEntity>() { |
||||
@Override |
||||
public DeptEntity run(DAOContext daoContext) throws Exception { |
||||
daoContext.getDAO(DeptDao.class).addOrUpdate(entity); |
||||
return entity; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public static void delDept(String id) throws Exception { |
||||
SyncDBAccessProvider.getDbAccessor().runDMLAction(new DBAction<DeptEntity>() { |
||||
@Override |
||||
public DeptEntity run(DAOContext daoContext) throws Exception { |
||||
daoContext.getDAO(DeptDao.class).remove(id); |
||||
return null; |
||||
} |
||||
}); |
||||
} |
||||
} |
Loading…
Reference in new issue