From 92e20524bc4eb16ea444b2060d8cd9c4cb8502a6 Mon Sep 17 00:00:00 2001 From: lbw Date: Mon, 25 Apr 2022 16:41:34 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=BB=84?= =?UTF-8?q?=E7=BB=87=20=E7=94=A8=E6=88=B7=E7=BB=93=E6=9E=84=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-common/pigx-common-bom/pom.xml | 7 +- .../common/core/exception/ErrorCodes.java | 10 + .../resources/i18n/messages_zh_CN.properties | 9 +- pigx-upms/pigx-upms-biz/pom.xml | 323 ++++++++------- .../admin/controller/ConnectController.java | 22 +- .../pigx/admin/service/ConnectService.java | 21 +- .../service/impl/ConnectServiceImpl.java | 370 ++++++++++-------- .../service/impl/SysUserServiceImpl.java | 22 +- pom.xml | 1 - 9 files changed, 415 insertions(+), 370 deletions(-) diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml index 8b41c729b..de8f331c1 100644 --- a/pigx-common/pigx-common-bom/pom.xml +++ b/pigx-common/pigx-common-bom/pom.xml @@ -27,7 +27,7 @@ 8.4.1.jre8 8.1.2.79 1.5.22 - 4.2.0 + 4.3.0 2.8.0 3.0.3 1.13.1 @@ -233,6 +233,11 @@ weixin-java-mp ${mp.weixin.version} + + com.github.binarywang + weixin-java-cp + ${mp.weixin.version} + com.github.binarywang weixin-java-common diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java index 172eb2835..c6680897d 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java @@ -90,4 +90,14 @@ public interface ErrorCodes { */ String SYS_APP_PHONE_UNREGISTERED = "sys.app.phone.unregistered"; + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_DEPT_SYNC_ERROR = "sys.connect.cp.dept.sync.error"; + + /** + * 企微调用接口错误 + */ + String SYS_CONNECT_CP_USER_SYNC_ERROR = "sys.connect.cp.user.sync.error"; + } diff --git a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties index 974780564..d0d3430fc 100644 --- a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties @@ -3,22 +3,17 @@ sys.user.query.error=\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u5931\u8D2 sys.user.import.succeed=\u7528\u6237\u5BFC\u5165\u6210\u529F\uFF0C\u9ED8\u8BA4\u5BC6\u7801\u4E3A\u624B\u673A\u53F7 sys.user.username.existing={0} \u7528\u6237\u540D\u5DF2\u5B58\u5728 sys.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A - sys.dept.deptName.inexistence={0} \u90E8\u95E8\u540D\u79F0\u4E0D\u5B58\u5728 - sys.post.postName.inexistence={0} \u5C97\u4F4D\u540D\u79F0\u4E0D\u5B58\u5728 sys.post.nameOrCode.existing={0} {1} \u5C97\u4F4D\u540D\u6216\u5C97\u4F4D\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 - sys.role.roleName.inexistence={0} \u89D2\u8272\u540D\u79F0\u4E0D\u5B58\u5728 sys.role.nameOrCode.existing={0} {1} \u89D2\u8272\u540D\u6216\u89D2\u8272\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 - sys.param.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u53C2\u6570\u4E0D\u80FD\u5220\u9664 sys.param.config.error={0} \u7CFB\u7EDF\u53C2\u6570\u914D\u7F6E\u9519\u8BEF - sys.menu.delete.existing=\u83DC\u5355\u542B\u6709\u4E0B\u7EA7\u4E0D\u80FD\u5220\u9664 - sys.app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41 sys.app.phone.unregistered={0} \u624B\u673A\u53F7\u672A\u6CE8\u518C - sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u5220\u9664 sys.dict.update.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u4FEE\u6539 +sys.connect.cp.dept.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u90E8\u95E8\u5217\u8868\u5931\u8D25 +sys.connect.cp.user.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u7528\u6237\u5217\u8868\u5931\u8D25 diff --git a/pigx-upms/pigx-upms-biz/pom.xml b/pigx-upms/pigx-upms-biz/pom.xml index 740f16112..8e8b89600 100644 --- a/pigx-upms/pigx-upms-biz/pom.xml +++ b/pigx-upms/pigx-upms-biz/pom.xml @@ -19,171 +19,170 @@ --> - 4.0.0 - - com.pig4cloud - pigx-upms - 4.3.0 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.pig4cloud + pigx-upms + 4.3.0 + - pigx-upms-biz - jar + pigx-upms-biz + jar - pigx 通用用户权限管理系统业务处理模块 + pigx 通用用户权限管理系统业务处理模块 - - - - mysql - mysql-connector-java - - - - com.oracle.database.jdbc - ojdbc8 - - - - org.postgresql - postgresql - - - - com.microsoft.sqlserver - mssql-jdbc - - - - com.pig4cloud - pigx-upms-api - - - - com.pig4cloud - pigx-common-log - - - com.pig4cloud - pigx-common-data - - - - com.pig4cloud - pigx-common-swagger - - - - com.pig4cloud - pigx-common-oss - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.pig4cloud - pigx-common-security - - - - com.pig4cloud - pigx-common-xss - - - - com.pig4cloud - pigx-common-gateway - - - - com.pig4cloud - pigx-common-sentinel - - - - com.pig4cloud - pigx-common-gray - - - - com.baomidou - mybatis-plus-boot-starter - - - - com.alibaba - druid-spring-boot-starter - - - - org.jasig.cas.client - cas-client-core - ${cas.sdk.version} - - - - com.aliyun - dingtalk - ${dingtalk.version} - - - - com.aliyun - alibaba-dingtalk-service-sdk - ${dingtalk.old.version} - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-undertow - - + + + + mysql + mysql-connector-java + + + + com.oracle.database.jdbc + ojdbc8 + + + + org.postgresql + postgresql + + + + com.microsoft.sqlserver + mssql-jdbc + + + + com.pig4cloud + pigx-upms-api + + + + com.pig4cloud + pigx-common-log + + + com.pig4cloud + pigx-common-data + + + + com.pig4cloud + pigx-common-swagger + + + + com.pig4cloud + pigx-common-oss + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.pig4cloud + pigx-common-security + + + + com.pig4cloud + pigx-common-xss + + + + com.pig4cloud + pigx-common-gateway + + + + com.pig4cloud + pigx-common-sentinel + + + + com.pig4cloud + pigx-common-gray + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + org.jasig.cas.client + cas-client-core + ${cas.sdk.version} + + + + com.aliyun + alibaba-dingtalk-service-sdk + ${dingtalk.old.version} + + + + com.github.binarywang + weixin-java-cp + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-undertow + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - io.fabric8 - docker-maven-plugin - - false - - - - - - src/main/resources - true - - **/*.xlsx - **/*.xls - - - - src/main/resources - false - - **/*.xlsx - **/*.xls - - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + io.fabric8 + docker-maven-plugin + + false + + + + + + src/main/resources + true + + **/*.xlsx + **/*.xls + + + + src/main/resources + false + + **/*.xlsx + **/*.xls + + + + 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 fc619f0c4..e139c4b8c 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 @@ -40,15 +40,6 @@ public class ConnectController { return R.ok(); } - /** - * 同步钉钉角色 - * @return - */ - @PostMapping("/sync/ding/role") - public R syncRole() { - return R.ok(connectService.syncDingRole()); - } - /** * 同步钉钉部门 * @return @@ -64,16 +55,7 @@ public class ConnectController { */ @PostMapping("/sync/cp/user") public R syncCpUser() { - return R.ok(); - } - - /** - * 同步企微角色 - * @return - */ - @PostMapping("/sync/cp/role") - public R syncCpRole() { - return R.ok(); + return connectService.syncCpUser(); } /** @@ -82,7 +64,7 @@ public class ConnectController { */ @PostMapping("/sync/cp/dept") public R syncCpDept() { - return R.ok(); + return connectService.syncCpDept(); } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java index c0260fac0..b58df2517 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/ConnectService.java @@ -1,5 +1,7 @@ package com.pig4cloud.pigx.admin.service; +import com.pig4cloud.pigx.common.core.util.R; + /** * @author lengleng * @date 2022/4/22 @@ -8,11 +10,6 @@ package com.pig4cloud.pigx.admin.service; */ public interface ConnectService { - /** - * 同步钉钉角色 - */ - Boolean syncDingRole(); - /** * 同步钉钉部门 */ @@ -21,6 +18,18 @@ public interface ConnectService { /** * 同步钉钉用户 */ - Boolean syncDingUser(Long deptId); + R syncDingUser(Long deptId); + + /** + * 同步企微部门 + * @return + */ + R syncCpDept(); + + /** + * 同步企微用户 + * @return + */ + R syncCpUser(); } 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 fedaa7c56..d184d2fb4 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 @@ -2,7 +2,6 @@ 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; @@ -10,24 +9,43 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; -import com.dingtalk.api.request.*; -import com.dingtalk.api.response.*; -import com.pig4cloud.pigx.admin.api.entity.*; +import com.dingtalk.api.request.OapiGettokenRequest; +import com.dingtalk.api.request.OapiUserListidRequest; +import com.dingtalk.api.request.OapiV2DepartmentListsubRequest; +import com.dingtalk.api.request.OapiV2UserGetRequest; +import com.dingtalk.api.response.OapiGettokenResponse; +import com.dingtalk.api.response.OapiUserListidResponse; +import com.dingtalk.api.response.OapiV2DepartmentListsubResponse; +import com.dingtalk.api.response.OapiV2UserGetResponse; +import com.pig4cloud.pigx.admin.api.dto.UserDTO; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysSocialDetails; +import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.admin.mapper.SysSocialDetailsMapper; -import com.pig4cloud.pigx.admin.service.*; +import com.pig4cloud.pigx.admin.service.ConnectService; +import com.pig4cloud.pigx.admin.service.SysDeptService; +import com.pig4cloud.pigx.admin.service.SysUserService; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.constant.enums.LoginTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; +import me.chanjar.weixin.cp.bean.WxCpDepart; +import me.chanjar.weixin.cp.bean.WxCpUser; +import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.LinkedList; import java.util.List; -import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 互联平台实现 @@ -45,91 +63,16 @@ public class ConnectServiceImpl implements ConnectService { private final SysSocialDetailsMapper sysSocialDetailsMapper; - private final SysRoleService sysRoleService; - private final SysDeptService sysDeptService; private final SysUserService sysUserService; - private final SysUserRoleService sysUserRoleService; - - private String getDingAccessToken() { - SysSocialDetails dingTalk = sysSocialDetailsMapper.selectOne(Wrappers.lambdaQuery() - .eq(SysSocialDetails::getType, LoginTypeEnum.dingtalk.getType())); - - DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_OLD_GET_TOKEN); - OapiGettokenRequest request = new OapiGettokenRequest(); - request.setAppkey(dingTalk.getAppId()); - request.setAppsecret(dingTalk.getAppSecret()); - request.setHttpMethod(HttpMethod.GET.name()); - try { - OapiGettokenResponse response = client.execute(request); - return response.getAccessToken(); - } - catch (Exception e) { - log.error("调用钉钉异常", e); - } - return null; - } - - /** - * 同步钉钉角色 - * - * @link https://open.dingtalk.com/document/orgapp-server/obtains-a-list-of-enterprise-roles - */ - @SneakyThrows - @Override - public Boolean syncDingRole() { - // 分页偏移量 - long offset = 0L; - // 是否还有非同步的数据 - boolean hasMore; - // 数据库中现有的角色 - List roleList = sysRoleService.list(Wrappers.emptyWrapper()); - // 钉钉同步过来的角色 - List insertRole = new LinkedList<>(); - - do { - DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_OLD_ROLE_URL); - OapiRoleListRequest req = new OapiRoleListRequest(); - // 分页查询,默认分页20条 - req.setSize(2L); - req.setOffset(offset); - OapiRoleListResponse rsp = client.execute(req, getDingAccessToken()); - offset += req.getSize(); - - JSONObject result = JSONUtil.parseObj(rsp.getBody()); - JSONObject resultStr = result.getJSONObject("result"); - - hasMore = resultStr.get("hasMore", Boolean.class); - List list = resultStr.get("list", List.class); - // 处理返回的数据 - 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); - - // 保存到数据库中 - return sysRoleService.saveBatch(insertRole); - } - /** * 同步钉钉部门 - * - * @see + * @return Boolean */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean syncDingDept() { OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); req.setDeptId(1L); @@ -152,6 +95,187 @@ public class ConnectServiceImpl implements ConnectService { return Boolean.TRUE; } + /** + * 同步部门下的钉钉用户 + * @param deptId 部门ID + * @return R + */ + @SneakyThrows + @Override + @Transactional(rollbackFor = Exception.class) + public R syncDingUser(Long deptId) { + // 数据库中现有用户 + List users = sysUserService.list(Wrappers.emptyWrapper()); + + String token = getDingAccessToken(); + + // 查询部门下的用户id列表 + DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_DEPT_USERIDS_URL); + OapiUserListidRequest req = new OapiUserListidRequest(); + req.setDeptId(deptId); + OapiUserListidResponse rsp = client.execute(req, token); + + JSONObject jsonObject = JSONUtil.parseObj(rsp.getBody()); + JSONObject result = jsonObject.getJSONObject("result"); + + if (result == null) { + return R.ok(); + } + List useridList = result.get("userid_list", List.class); + + // 查询用户详情 + 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) { + log.info("用户已存在 {}", userid); + continue; + } + + // 用户部门信息 + JSONArray deptOrders = userObj.getJSONArray("dept_order_list"); + JSONObject deptInfo = (JSONObject) deptOrders.get(0); + + // 用户信息 + UserDTO userDTO = new UserDTO(); + userDTO.setDeptId(Convert.toLong(deptInfo.get("dept_id"))); + userDTO.setAvatar(userObj.getStr("avatar")); + userDTO.setUsername(userObj.getStr("mobile")); + userDTO.setPhone(userObj.getStr("mobile")); + userDTO.setNickname(userObj.getStr("nickname")); + userDTO.setName(userObj.getStr("name")); + userDTO.setEmail(userObj.getStr("email")); + // 初始化密码为 手机号 + userDTO.setPassword(userObj.getStr("mobile")); + sysUserService.saveUser(userDTO); + } + + return R.ok(); + } + + /** + * 同步企微部门 + * @return R + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R syncCpDept() { + WxCpService wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(getCpConfig()); + + List departList; + try { + departList = wxCpService.getDepartmentService().list(null); + } + catch (WxErrorException e) { + log.error("获取企业微信部门列表失败", e); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_CONNECT_CP_DEPT_SYNC_ERROR)); + } + + if (CollUtil.isEmpty(departList)) { + return R.ok(); + } + + // 数据库中现有的部门 + List deptList = sysDeptService.list(Wrappers.emptyWrapper()); + departList.stream() + .filter(depart -> deptList.stream().noneMatch(sysDept -> depart.getName().equals(sysDept.getName()))) + .map(dept -> { + SysDept sysDept = new SysDept(); + sysDept.setName(dept.getName()); + sysDept.setDeptId(dept.getId()); + sysDept.setParentId(dept.getParentId()); + sysDept.setSortOrder(dept.getOrder().intValue()); + return sysDept; + }).forEach(sysDeptService::saveDept); + return R.ok(); + } + + /** + * 同步企微用户 + * @return R + */ + @Override + public R syncCpUser() { + WxCpService wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(getCpConfig()); + + List cpUserList; + try { + cpUserList = wxCpService.getUserService().listByDepartment(0L, true, 0); + } + catch (WxErrorException e) { + log.error("获取企业微信用户列表失败", e); + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_CONNECT_CP_USER_SYNC_ERROR)); + } + + if (CollUtil.isEmpty(cpUserList)) { + return R.ok(); + } + + // 系统原有用户 + List userList = sysUserService.list(Wrappers.emptyWrapper()); + + for (WxCpUser cpUser : cpUserList) { + boolean exist = userList.stream().anyMatch(user -> user.getPhone().equals(cpUser.getMobile())); + if (exist) { + log.info("用户已存在跳过 {}", cpUser); + continue; + } + + UserDTO user = new UserDTO(); + user.setUsername(cpUser.getMobile()); + user.setName(cpUser.getName()); + user.setDeptId(cpUser.getDepartIds()[0]); + user.setEmail(cpUser.getEmail()); + user.setPhone(cpUser.getMobile()); + user.setAvatar(cpUser.getAvatar()); + // 初始化密码为 手机号 + user.setPassword(cpUser.getMobile()); + sysUserService.saveUser(user); + } + + return R.ok(); + } + + private String getDingAccessToken() { + SysSocialDetails dingTalk = sysSocialDetailsMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysSocialDetails::getType, LoginTypeEnum.dingtalk.getType())); + + DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_OLD_GET_TOKEN); + OapiGettokenRequest request = new OapiGettokenRequest(); + request.setAppkey(dingTalk.getAppId()); + request.setAppsecret(dingTalk.getAppSecret()); + request.setHttpMethod(HttpMethod.GET.name()); + try { + OapiGettokenResponse response = client.execute(request); + return response.getAccessToken(); + } + catch (Exception e) { + log.error("调用钉钉异常", e); + } + return null; + } + + private WxCpDefaultConfigImpl getCpConfig() { + WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl(); + config.setCorpId("wwdfd8cc3eb1127464"); // 设置微信企业号的appid + config.setCorpSecret("mrJAJwC0msVJ0-F30Iwop6B-w8eledxD66l3flrjX5w"); // 设置微信企业号的app + // corpSecret + config.setAgentId(1000003); // 设置微信企业号应用ID + config.setToken("lengleng"); // 设置微信企业号应用的token + config.setAesKey("pc49WfQMwDg2tDwHHP8gfLN6fRjkgDzS4WkYCumZCF1"); // 设置微信企业号应用的EncodingAESKey + + return config; + } + /** * 查询当前部门下的所有部门 */ @@ -196,82 +320,4 @@ public class ConnectServiceImpl implements ConnectService { return sysDepts; } - /** - * 同步部门下的钉钉用户 - * - * @see - * @see - */ - @SneakyThrows - @Override - public Boolean syncDingUser(Long deptId) { - // 数据库中现有用户 - List users = sysUserService.list(Wrappers.emptyWrapper()); - - String token = getDingAccessToken(); - - // 查询部门下的用户id列表 - DingTalkClient client = new DefaultDingTalkClient(SecurityConstants.DING_DEPT_USERIDS_URL); - OapiUserListidRequest req = new OapiUserListidRequest(); - req.setDeptId(deptId); - OapiUserListidResponse rsp = client.execute(req, token); - - JSONObject jsonObject = JSONUtil.parseObj(rsp.getBody()); - JSONObject result = jsonObject.getJSONObject("result"); - - if (result == null) { - return false; - } - List useridList = result.get("userid_list", List.class); - - // 查询用户详情 - 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) { - 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; - } - } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index 15c74dd5a..01fd7ba85 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -99,6 +99,17 @@ public class SysUserServiceImpl extends ServiceImpl impl return userPost; }).forEach(sysUserPostMapper::insert); }); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService + .getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + List userRoleList = userDto.getRole().stream().map(roleId -> { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); @@ -356,17 +367,6 @@ public class SysUserServiceImpl extends ServiceImpl impl String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); return R.failed(message); } - - // 获取默认角色编码 - String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - // 默认角色 - SysRole sysRole = sysRoleService.getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); - - if (sysRole == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_PARAM_CONFIG_ERROR, "USER_DEFAULT_ROLE")); - } - - userDto.setRole(Collections.singletonList(sysRole.getRoleId())); return R.ok(saveUser(userDto)); } diff --git a/pom.xml b/pom.xml index 033360534..0c0e1ffa9 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,6 @@ 2.6.6 1.2.7 3.6.4 - 1.3.40 2.0.0 3.0.0 2.0.9