You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
10 KiB
198 lines
10 KiB
package com.fr.plugin.handers; |
|
|
|
import com.fr.collections.FineCollections; |
|
import com.fr.collections.api.FineLock; |
|
import com.fr.decision.authority.AuthorityContext; |
|
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
|
import com.fr.decision.authority.controller.DepartmentController; |
|
import com.fr.decision.authority.controller.PostController; |
|
import com.fr.decision.authority.controller.UserController; |
|
import com.fr.decision.authority.data.Department; |
|
import com.fr.decision.authority.data.Post; |
|
import com.fr.decision.authority.data.User; |
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
|
import com.fr.decision.privilege.encrpt.PasswordValidator; |
|
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.log.FineLoggerFactory; |
|
import com.fr.plugin.Aesutils; |
|
import com.fr.plugin.HttpUtils; |
|
import com.fr.plugin.SafeCheckUtils; |
|
import com.fr.plugin.transform.ExecuteFunctionRecord; |
|
import com.fr.plugin.transform.FunctionRecorder; |
|
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.web.utils.WebUtils; |
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
import javax.servlet.http.HttpServletResponse; |
|
import java.io.PrintWriter; |
|
import java.io.StringWriter; |
|
import java.util.List; |
|
import java.util.UUID; |
|
import java.util.concurrent.TimeUnit; |
|
|
|
@FunctionRecorder |
|
public class AddAppAccountHander extends BaseHttpHandler { |
|
@Override |
|
public RequestMethod getMethod() { |
|
return null; |
|
} |
|
|
|
@Override |
|
public String getPath() { |
|
return "/accounts"; |
|
} |
|
|
|
@Override |
|
public boolean isPublic() { |
|
return true; |
|
} |
|
|
|
@Override |
|
@ExecuteFunctionRecord |
|
public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { |
|
String body = HttpUtils.inputStream2String(req.getInputStream()); |
|
if (StringUtils.isNotBlank(body)) { |
|
String xtime = req.getHeader("xtime"); |
|
String xsign = req.getHeader("xkey"); |
|
|
|
FineLoggerFactory.getLogger().info("addAppAccount: 请求参数 {}", body); |
|
JSONObject jsonObject = new JSONObject(body); |
|
if (jsonObject.has("account")) { |
|
UserService userService = UserService.getInstance(); |
|
String account = jsonObject.getString("account"); |
|
FineLock lock = FineCollections.getInstance().getClient().getLock("syncuser", "lockedname" + account); |
|
if (lock.tryLock(500L, TimeUnit.MILLISECONDS)) { |
|
try { |
|
User user = userService.getUserByUserName(account); |
|
boolean iscreate = false; |
|
if (user == null) { |
|
iscreate = true; |
|
user = new User(); |
|
} |
|
String password = jsonObject.getString("password"); |
|
JSONObject person_info = jsonObject.getJSONObject("person_info"); |
|
// JSONObject person_info = new JSONObject(pp_info); |
|
String name = person_info.getString("name"); |
|
String email = person_info.getString("email"); |
|
String mobile = person_info.getString("mobile"); |
|
String status = person_info.getString("status");//0启用 1禁用 |
|
if(iscreate){ |
|
user.setId(account); |
|
} |
|
String userUid = user.getId(); |
|
user.setRealName(name); |
|
user.setUserName(account); |
|
user.setEmail(email); |
|
user.setEnable(true); |
|
user.setCreationType(ManualOperationType.KEY); |
|
user.setMobile(mobile); |
|
PasswordValidator passwordValidator = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
|
String pwd; |
|
if (StringUtils.isBlank(password)) { |
|
pwd = "frapp.X"; |
|
} else { |
|
pwd = Aesutils.getInstance().decrypt(password); |
|
} |
|
UserController userController = AuthorityContext.getInstance().getUserController(); |
|
if (iscreate) { |
|
try { |
|
user.setPassword(passwordValidator.encode(account, pwd)); |
|
userController.add(user); |
|
} catch (Exception e) { |
|
} |
|
} else { |
|
userController.update(user); |
|
} |
|
DepartmentController departmentController = AuthorityContext.getInstance().getDepartmentController(); |
|
JSONArray groups = person_info.getJSONArray("groups"); |
|
//先将用户移除原来部门 |
|
PostController postController = AuthorityContext.getInstance().getPostController(); |
|
List<Post> posts = postController.findByUser(userUid, QueryFactory.create()); |
|
//把用户从原来岗位移除 |
|
for (Post post : posts) { |
|
//先查到职位,再查职位关联的部门 |
|
List<Department> departments = departmentController.findByPost(post.getId(), QueryFactory.create()); |
|
for (Department de : departments) { |
|
userController.removeUserFromDepartmentAndPost(userUid, de.getId(), post.getId()); |
|
} |
|
} |
|
for (int i = 0; i < groups.length(); i++) { |
|
JSONObject postions = groups.getJSONObject(i); |
|
String orgName = postions.getString("orgName"); |
|
String orgId = postions.getString("orgId"); |
|
String orgPid = postions.getString("orgPid"); |
|
Department department = departmentController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", orgId))); |
|
if (department == null) { |
|
department = new Department(); |
|
department.setName(orgName); |
|
if (StringUtils.equals(orgPid, "0")) { |
|
orgPid = null; |
|
} |
|
department.setId(orgId); |
|
department.setParentId(orgPid); |
|
department.setEnable(true); |
|
departmentController.add(department); |
|
} |
|
String positionId = postions.getString("positionId"); |
|
String positionName = postions.getString("positionName"); |
|
Post post = postController.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", positionId))); |
|
if (post == null) { |
|
post = new Post(); |
|
post.setName(positionName); |
|
post.setId(positionId); |
|
post.setEnable(true); |
|
postController.add(post); |
|
try { |
|
postController.addPostToDepartment(positionId, orgId); |
|
} catch (Exception e) { |
|
printException2FrLog(e); |
|
} |
|
} |
|
//检查职务和部门是否存在关联关系 |
|
List<Department> departments = departmentController.findByPost(post.getId(), QueryFactory.create()); |
|
boolean postindeps = false; |
|
for (Department department1 : departments) { |
|
if (StringUtils.equals(department1.getId(), orgId)) { |
|
postindeps = true; |
|
break; |
|
} |
|
} |
|
if (!postindeps) { |
|
try { |
|
postController.addPostToDepartment(positionId, orgId); |
|
} catch (Exception e) { |
|
printException2FrLog(e); |
|
} |
|
} |
|
try { |
|
userController.addUserToDepartmentAndPost(userUid, orgId, positionId); |
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error("将用户添加到职位失败:", e); |
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getErrorByCreateRelation()); |
|
return; |
|
} |
|
} |
|
} catch (Exception e) { |
|
printException2FrLog(e); |
|
} finally { |
|
lock.unlock(); |
|
} |
|
} |
|
} |
|
} |
|
WebUtils.printAsJSON(httpServletResponse, HttpUtils.getSuccessJSONObject()); |
|
} |
|
|
|
public static void printException2FrLog(Throwable e) { |
|
StringWriter writer = new StringWriter(); |
|
e.printStackTrace(new PrintWriter(writer)); |
|
String s = writer.toString(); |
|
FineLoggerFactory.getLogger().error("错误:{}", s); |
|
} |
|
}
|
|
|