From 3df0e554212d412a1f02f0a67ebb8ccf72f479c4 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 25 Apr 2022 13:57:31 +0800 Subject: [PATCH] :art: Improving structure / format of the code. --- .../core/constant/enums/LoginTypeEnum.java | 5 + .../admin/controller/ConnectController.java | 14 +- .../service/impl/ConnectServiceImpl.java | 167 +++++++++--------- 3 files changed, 102 insertions(+), 84 deletions(-) diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java index 447626882..b2f99292d 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/enums/LoginTypeEnum.java @@ -63,6 +63,11 @@ public enum LoginTypeEnum { */ OSC("OSC", "开源中国登录"), + /** + * 钉钉 + */ + dingtalk("DINGTALK", "钉钉"), + /** * CAS 登录 */ diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java index ec9add850..fc619f0c4 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/ConnectController.java @@ -1,11 +1,12 @@ package com.pig4cloud.pigx.admin.controller; +import com.pig4cloud.pigx.admin.api.entity.SysDept; import com.pig4cloud.pigx.admin.service.ConnectService; +import com.pig4cloud.pigx.admin.service.SysDeptService; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.security.annotation.Inner; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -25,13 +26,18 @@ public class ConnectController { private final ConnectService connectService; + private final SysDeptService deptService; + /** * 同步钉钉用户 * @return */ - @PostMapping("/sync/ding/user/{deptId}") - public R syncUser(@PathVariable("deptId") Long deptId) { - return R.ok(connectService.syncDingUser(deptId)); + @PostMapping("/sync/ding/user") + public R syncUser() { + for (SysDept sysDept : deptService.list()) { + connectService.syncDingUser(sysDept.getDeptId()); + } + return R.ok(); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java index 2b8da301e..c53e0c9e8 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java @@ -1,6 +1,8 @@ package com.pig4cloud.pigx.admin.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.extra.pinyin.PinyinUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -23,6 +25,7 @@ import com.pig4cloud.pigx.admin.api.entity.*; import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; import com.pig4cloud.pigx.admin.service.*; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -30,7 +33,9 @@ import org.springframework.stereotype.Service; import java.util.LinkedList; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 互联平台实现 @@ -57,8 +62,8 @@ public class ConnectServiceImpl implements ConnectService { private final SysUserRoleService sysUserRoleService; private String getDingAccessToken() { - SysSocialDetails dingTalk = sysSocialDetailsMapper - .selectOne(Wrappers.lambdaQuery().eq(SysSocialDetails::getType, "ding")); + SysSocialDetails dingTalk = sysSocialDetailsMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysSocialDetails::getType, LoginTypeEnum.dingtalk.getType())); GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest().setAppKey(dingTalk.getAppId()) .setAppSecret(dingTalk.getAppSecret()); GetAccessTokenResponse tokenResponse = null; @@ -86,8 +91,7 @@ public class ConnectServiceImpl implements ConnectService { /** * 同步钉钉角色 * - * @see + * @link https://open.dingtalk.com/document/orgapp-server/obtains-a-list-of-enterprise-roles */ @SneakyThrows @Override @@ -115,24 +119,19 @@ public class ConnectServiceImpl implements ConnectService { hasMore = resultStr.get("hasMore", Boolean.class); List list = resultStr.get("list", List.class); - - if (CollectionUtils.isNotEmpty(list)) { - list.forEach(item -> { - List roles = (List) item.get("roles"); - if (CollectionUtils.isNotEmpty(roles)) { - // 过滤出数据库不存在的角色 - List sysRoles = roles.stream().filter( - role -> roleList.stream().noneMatch(db -> db.getRoleName().equals(role.get("name")))) - .map(role -> { - SysRole sysRole = new SysRole(); - sysRole.setRoleId(Convert.toLong(role.get("id"))); - sysRole.setRoleName(Convert.toStr(role.get("name"))); - return sysRole; - }).collect(Collectors.toList()); - insertRole.addAll(sysRoles); - } - }); - } + // 处理返回的数据 + List collect = list.stream().flatMap( + (Function>) item -> ((List) item.get("roles")).stream()) + .filter(role -> roleList.stream().noneMatch(db -> db.getRoleName().equals(role.get("name")))) + .map(role -> { + SysRole sysRole = new SysRole(); + sysRole.setRoleId(Convert.toLong(role.get("id"))); + sysRole.setRoleCode(String.format("ROLE_DING_%s", Convert.toStr(role.get("id")))); + sysRole.setRoleCode(PinyinUtil.getPinyin(Convert.toStr(role.get("name")))); + sysRole.setRoleName(Convert.toStr(role.get("name"))); + return sysRole; + }).collect(Collectors.toList()); + insertRole.addAll(collect); } while (hasMore); @@ -183,29 +182,31 @@ public class ConnectServiceImpl implements ConnectService { JSONObject result = JSONUtil.parseObj(rsp.getBody()); List resultList = result.get("result", List.class); - if (CollectionUtils.isNotEmpty(resultList)) { - // 过滤出数据库存在的部门 - List depts = resultList.stream() - .filter(dept -> deptList.stream().noneMatch(sysDept -> sysDept.getName().equals(dept.get("name")))) - .map(dept -> { - SysDept sysDept = new SysDept(); - sysDept.setName(Convert.toStr(dept.get("name"))); - sysDept.setDeptId(Convert.toLong(dept.get("dept_id"))); - sysDept.setParentId(Convert.toLong(dept.get("parent_id"))); - return sysDept; - }).collect(Collectors.toList()); + if (CollUtil.isEmpty(resultList)) { + return sysDepts; + } - // 递归查询下一级 - if (CollectionUtils.isNotEmpty(depts)) { - sysDepts.addAll(depts); - depts.forEach(dept -> { - OapiV2DepartmentListsubRequest request = new OapiV2DepartmentListsubRequest(); - request.setDeptId(dept.getDeptId()); - request.setLanguage("zh_CN"); - List childDept = queryChildDept(request, token, deptList); - sysDepts.addAll(childDept); - }); - } + // 过滤出数据库存在的部门 + List depts = resultList.stream() + .filter(dept -> deptList.stream().noneMatch(sysDept -> sysDept.getName().equals(dept.get("name")))) + .map(dept -> { + SysDept sysDept = new SysDept(); + sysDept.setName(Convert.toStr(dept.get("name"))); + sysDept.setDeptId(Convert.toLong(dept.get("dept_id"))); + sysDept.setParentId(Convert.toLong(dept.get("parent_id"))); + return sysDept; + }).collect(Collectors.toList()); + + // 递归查询下一级 + if (CollectionUtils.isNotEmpty(depts)) { + sysDepts.addAll(depts); + depts.forEach(dept -> { + OapiV2DepartmentListsubRequest request = new OapiV2DepartmentListsubRequest(); + request.setDeptId(dept.getDeptId()); + request.setLanguage("zh_CN"); + List childDept = queryChildDept(request, token, deptList); + sysDepts.addAll(childDept); + }); } return sysDepts; @@ -235,49 +236,55 @@ public class ConnectServiceImpl implements ConnectService { JSONObject jsonObject = JSONUtil.parseObj(rsp.getBody()); JSONObject result = jsonObject.getJSONObject("result"); + + if (result == null) { + return false; + } List useridList = result.get("userid_list", List.class); // 查询用户详情 - if (CollectionUtils.isNotEmpty(useridList)) { - for (String userid : useridList) { - DingTalkClient userClient = new DefaultDingTalkClient(SecurityConstants.DING_USER_INFO_URL); - OapiV2UserGetRequest userGetRequest = new OapiV2UserGetRequest(); - userGetRequest.setUserid(userid); - OapiV2UserGetResponse userGetResponse = userClient.execute(userGetRequest, token); - JSONObject userResult = JSONUtil.parseObj(userGetResponse.getBody()); - JSONObject userObj = JSONUtil.parseObj(userResult.get("result")); + for (String userid : useridList) { + DingTalkClient userClient = new DefaultDingTalkClient(SecurityConstants.DING_USER_INFO_URL); + OapiV2UserGetRequest userGetRequest = new OapiV2UserGetRequest(); + userGetRequest.setUserid(userid); + OapiV2UserGetResponse userGetResponse = userClient.execute(userGetRequest, token); + JSONObject userResult = JSONUtil.parseObj(userGetResponse.getBody()); + JSONObject userObj = JSONUtil.parseObj(userResult.get("result")); - boolean exist = users.stream().anyMatch(user -> user.getPhone().equals(userObj.getStr("mobile"))); - - if (!exist) { - // 用户部门信息 - JSONArray deptOrders = userObj.getJSONArray("dept_order_list"); - JSONObject deptInfo = (JSONObject) deptOrders.get(0); - - // 用户信息 - SysUser sysUser = new SysUser(); - sysUser.setDeptId(Convert.toLong(deptInfo.get("dept_id"))); - sysUser.setAvatar(userObj.getStr("avatar")); - sysUser.setUsername(userObj.getStr("name")); - sysUser.setPhone(userObj.getStr("mobile")); - sysUser.setNickname(userObj.getStr("nickname")); - sysUser.setEmail(userObj.getStr("email")); - sysUserService.save(sysUser); - - // 用户角色信息 - JSONArray roleList = userObj.getJSONArray("role_list"); - if (roleList != null && roleList.size() > 0) { - JSONObject roleInfo = (JSONObject) roleList.get(0); - Long userRoleId = Convert.toLong(roleInfo.get("id")); - SysUserRole sysUserRole = new SysUserRole(); - sysUserRole.setUserId(sysUser.getUserId()); - sysUserRole.setRoleId(userRoleId); - sysUserRoleService.save(sysUserRole); - } - } + boolean exist = users.stream().anyMatch(user -> user.getPhone().equals(userObj.getStr("mobile"))); + if (exist) { + log.info("用户已存在 {}", userid); + continue; } + // 用户部门信息 + JSONArray deptOrders = userObj.getJSONArray("dept_order_list"); + JSONObject deptInfo = (JSONObject) deptOrders.get(0); + + // 用户信息 + SysUser sysUser = new SysUser(); + sysUser.setDeptId(Convert.toLong(deptInfo.get("dept_id"))); + sysUser.setAvatar(userObj.getStr("avatar")); + sysUser.setUsername(userObj.getStr("mobile")); + sysUser.setPhone(userObj.getStr("mobile")); + sysUser.setNickname(userObj.getStr("nickname")); + sysUser.setName(userObj.getStr("name")); + sysUser.setEmail(userObj.getStr("email")); + sysUserService.save(sysUser); + + // 用户角色信息 + JSONArray roleList = userObj.getJSONArray("role_list"); + + if (roleList == null) { + continue; + } + JSONObject roleInfo = (JSONObject) roleList.get(0); + Long userRoleId = Convert.toLong(roleInfo.get("id")); + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setUserId(sysUser.getUserId()); + sysUserRole.setRoleId(userRoleId); + sysUserRoleService.save(sysUserRole); } return Boolean.TRUE;