Преглед изворни кода

pms 钉钉登录 多个用户具有相同手机号 兼容

zhangcl пре 22 часа
родитељ
комит
e52d08dbc3

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojectinfo/vo/IotProjectInfoPageReqVO.java

@@ -102,4 +102,7 @@ public class IotProjectInfoPageReqVO extends PageParam {
 
     @Schema(description = "公司id", example = "157")
     private Long companyDeptId;
+
+    @Schema(description = "项目部id", example = "213")
+    private Long projectDeptId;
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojectinfo/IotProjectInfoMapper.java

@@ -42,6 +42,7 @@ public interface IotProjectInfoMapper extends BaseMapperX<IotProjectInfoDO> {
     default PageResult<IotProjectInfoDO> selectPage1(IotProjectInfoPageReqVO reqVO, Collection<Long> deptIds) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotProjectInfoDO>()
                 .eqIfPresent(IotProjectInfoDO::getDeptId, reqVO.getCompanyDeptId())
+                .eqIfPresent(IotProjectInfoDO::getProjectDeptId, reqVO.getProjectDeptId())
                 .inIfPresent(IotProjectInfoDO::getDeptId, deptIds)
                 .likeIfPresent(IotProjectInfoDO::getManufactureName, reqVO.getManufactureName())
                 .likeIfPresent(IotProjectInfoDO::getDeptName, reqVO.getDeptName())

+ 140 - 19
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java

@@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
 import cn.iocoder.yudao.module.system.controller.admin.authentication.vo.AuthenticationPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.authentication.AuthenticationDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
@@ -51,9 +52,7 @@ import javax.annotation.Resource;
 import javax.validation.Validator;
 import java.time.Duration;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-import java.util.UUID;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
@@ -162,7 +161,10 @@ public class AdminAuthServiceImpl implements AdminAuthService {
         }
 
         // 登录场景,验证是否存在
-        if (userService.getUserByMobile(reqVO.getMobile()) == null) {
+        UserPageReqVO userReqVO = new UserPageReqVO();
+        userReqVO.setMobile(reqVO.getMobile());
+        List<AdminUserDO> users = userService.users(userReqVO);
+        if (CollUtil.isEmpty(users)) {
             throw exception(AUTH_MOBILE_NOT_EXISTS);
         }
         // 发送验证码
@@ -175,13 +177,47 @@ public class AdminAuthServiceImpl implements AdminAuthService {
         smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP()));
 
         // 获得用户信息
-        AdminUserDO user = userService.getUserByMobile(reqVO.getMobile());
-        if (user == null) {
+        // AdminUserDO user = userService.getUserByMobile(reqVO.getMobile());
+        UserPageReqVO userReqVO = new UserPageReqVO();
+        userReqVO.setMobile(reqVO.getMobile());
+        List<AdminUserDO> users = userService.users(userReqVO);
+        if (CollUtil.isEmpty(users)) {
+            throw exception(USER_NOT_EXISTS);
+        }
+        Long pmsUserId = null;
+        // 根据手机号获取用户信息
+        try {
+            String dingUserId = DingtalkUtil.getUserInfoByMobile(reqVO.getMobile());
+            if (StrUtil.isBlank(dingUserId)) {
+                // 查询不到用户详情 返回 登录失败
+                throw exception(USER_NOT_EXISTS);
+            }
+            // 根据钉钉用户id 查询用户详情
+            OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(dingUserId);
+            if (ObjUtil.isEmpty(userDetail)) {
+                // 查询不到用户详情 返回 登录失败
+                throw exception(USER_NOT_EXISTS);
+            }
+            // 工号
+            String jobNumber = userDetail.getJobNumber();
+            List<Long> userIds = new ArrayList<>();
+            users.forEach(user -> {
+                if (StrUtil.isNotBlank(jobNumber) && jobNumber.equals(user.getUsername())) {
+                    userIds.add(user.getId());
+                }
+            });
+            if (CollUtil.isEmpty(userIds)) {
+                throw exception(USER_NOT_EXISTS);
+            }
+            pmsUserId = userIds.get(0);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (ObjUtil.isEmpty(pmsUserId)) {
             throw exception(USER_NOT_EXISTS);
         }
-
         // 创建 Token 令牌,记录登录日志
-        return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE);
+        return createTokenAfterLoginSuccess(pmsUserId, reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE);
     }
 
     private void createLoginLog(Long userId, String username,
@@ -248,17 +284,47 @@ public class AdminAuthServiceImpl implements AdminAuthService {
             if (StrUtil.isEmpty(accessToken)) {
                 throw exception(USER_NOT_EXISTS);
             }
-            String mobile = DingtalkUtil.getUserInfo(accessToken);
-            if (StrUtil.isEmpty(mobile)) {
+            Map<String, String> resultMap = DingtalkUtil.getUserInfo(accessToken);
+            if (CollUtil.isEmpty(resultMap)) {
                 throw exception(USER_NOT_EXISTS);
             }
+            String mobile = resultMap.get("mobile");
+            String unionId = resultMap.get("unionId");
+            // 根据unionId查询钉钉用户id
+            String dingUserId = DingtalkUtil.getUserIdByUnion(unionId);
+            // 根据钉钉用户id 查询用户详情
+            OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(dingUserId);
+            if (ObjUtil.isEmpty(userDetail)) {
+                // 查询不到用户详情 返回 登录失败
+                throw exception(USER_NOT_EXISTS);
+            }
+            // 工号
+            String jobNumber = userDetail.getJobNumber();
             // 查询当前用户表中 此手机号 是否存在
-            AdminUserDO user = userService.getUserByMobile(mobile);
-            if (ObjUtil.isEmpty(user)) {
+            // AdminUserDO user = userService.getUserByMobile(mobile);
+
+            UserPageReqVO userReqVO = new UserPageReqVO();
+            userReqVO.setMobile(mobile);
+            List<AdminUserDO> users = userService.users(userReqVO);
+            if (CollUtil.isEmpty(users)) {
+                throw exception(USER_NOT_EXISTS);
+            }
+            List<Long> userIds = new ArrayList<>();
+            List<String> usernames = new ArrayList<>();
+            users.forEach(loginUser -> {
+                if (StrUtil.isNotBlank(jobNumber) && jobNumber.equals(loginUser.getUsername())) {
+                    userIds.add(loginUser.getId());
+                    usernames.add(jobNumber);
+                }
+            });
+            if (CollUtil.isEmpty(userIds) || CollUtil.isEmpty(usernames)) {
                 throw exception(USER_NOT_EXISTS);
             }
+            Long pmsUserId = userIds.get(0);
+            String username = usernames.get(0);
+
             // 创建 Token 令牌,记录登录日志
-            return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_DING_APP);
+            return createTokenAfterLoginSuccess(pmsUserId, username, LoginLogTypeEnum.LOGIN_DING_APP);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -289,12 +355,29 @@ public class AdminAuthServiceImpl implements AdminAuthService {
                 throw exception(USER_NOT_EXISTS);
             }
             // 查询当前用户表中 此手机号 是否存在
-            AdminUserDO user = userService.getUserByMobile(mobile);
-            if (ObjUtil.isEmpty(user)) {
+            // AdminUserDO user = userService.getUserByMobile(mobile);
+            // 可能多个用户使用了相同的手机号
+            UserPageReqVO userReqVO = new UserPageReqVO();
+            userReqVO.setMobile(mobile);
+            List<AdminUserDO> users = userService.users(userReqVO);
+            if (CollUtil.isEmpty(users)) {
                 throw exception(USER_NOT_EXISTS);
             }
+            List<Long> userIds = new ArrayList<>();
+            List<String> usernames = new ArrayList<>();
+            users.forEach(user -> {
+                if (StrUtil.isNotBlank(jobNumber) && jobNumber.equals(user.getUsername())) {
+                    userIds.add(user.getId());
+                    usernames.add(jobNumber);
+                }
+            });
+            if (CollUtil.isEmpty(userIds) || CollUtil.isEmpty(usernames)) {
+                throw exception(USER_NOT_EXISTS);
+            }
+            Long pmsUserId = userIds.get(0);
+            String username = usernames.get(0);
             // 创建 Token 令牌,记录登录日志 h5钉钉微应用登录
-            return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_DING_H5);
+            return createTokenAfterLoginSuccess(pmsUserId, username, LoginLogTypeEnum.LOGIN_DING_H5);
         } catch (Exception e) {
             // 调用钉钉接口报错 提示 登录失败
             e.printStackTrace();
@@ -451,8 +534,46 @@ public class AdminAuthServiceImpl implements AdminAuthService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void resetPassword(AuthResetPasswordReqVO reqVO) {
-        AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getMobile());
-        if (userByMobile == null) {
+        // AdminUserDO userByMobile = userService.getUserByMobile(reqVO.getMobile());
+
+        UserPageReqVO userReqVO = new UserPageReqVO();
+        userReqVO.setMobile(reqVO.getMobile());
+        List<AdminUserDO> users = userService.users(userReqVO);
+
+        if (CollUtil.isEmpty(users)) {
+            throw exception(USER_MOBILE_NOT_EXISTS);
+        }
+        Long pmsUserId = null;
+        // 根据手机号获取钉钉用户id
+        try {
+            String dingUserId = DingtalkUtil.getUserInfoByMobile(reqVO.getMobile());
+            if (StrUtil.isBlank(dingUserId)) {
+                // 查询不到用户详情 返回 登录失败
+                throw exception(USER_MOBILE_NOT_EXISTS);
+            }
+            // 根据钉钉用户id 查询用户详情
+            OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(dingUserId);
+            if (ObjUtil.isEmpty(userDetail)) {
+                // 查询不到用户详情 返回 登录失败
+                throw exception(USER_MOBILE_NOT_EXISTS);
+            }
+            // 工号
+            String jobNumber = userDetail.getJobNumber();
+            List<Long> userIds = new ArrayList<>();
+            users.forEach(user -> {
+                if (StrUtil.isNotBlank(jobNumber) && jobNumber.equals(user.getUsername())) {
+                    userIds.add(user.getId());
+                }
+            });
+            if (CollUtil.isEmpty(userIds)) {
+                throw exception(USER_MOBILE_NOT_EXISTS);
+            }
+            pmsUserId = userIds.get(0);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (ObjUtil.isEmpty(pmsUserId)) {
             throw exception(USER_MOBILE_NOT_EXISTS);
         }
 
@@ -463,7 +584,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
                 .setUsedIp(getClientIP())
         );
 
-        userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword());
+        userService.updateUserPassword(pmsUserId, reqVO.getPassword());
     }
 
     @Override

+ 8 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java

@@ -242,6 +242,14 @@ public interface AdminUserService {
      */
     List<AdminUserDO> getSimpleUserList(UserPageReqVO reqVO);
 
+    /**
+     * 用户列表
+     *
+     * @param reqVO 列表条件
+     * @return 用户列表
+     */
+    List<AdminUserDO> users(UserPageReqVO reqVO);
+
     /**
      * 批量设置用户密码
      *

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -653,6 +653,11 @@ public class AdminUserServiceImpl implements AdminUserService {
         return userMapper.selectSimpleList(getDeptCondition(reqVO.getDeptId(), reqVO.getDeptIds()));
     }
 
+    @Override
+    public List<AdminUserDO> users(UserPageReqVO reqVO) {
+        return userMapper.selectList(reqVO);
+    }
+
     @Override
     public Long batchSetUserPwd() {
         // 查询出用户密码为空 的所有 用户 设置加密密码后 更新

+ 32 - 12
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/DingtalkUtil.java

@@ -11,19 +11,16 @@ import com.aliyun.teaopenapi.models.Config;
 import com.aliyun.teautil.models.RuntimeOptions;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
-import com.dingtalk.api.request.OapiGettokenRequest;
-import com.dingtalk.api.request.OapiUserGetbyunionidRequest;
-import com.dingtalk.api.request.OapiV2UserGetRequest;
-import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
-import com.dingtalk.api.response.OapiGettokenResponse;
-import com.dingtalk.api.response.OapiUserGetbyunionidResponse;
-import com.dingtalk.api.response.OapiV2UserGetResponse;
-import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author suiyy
  * @date 20230602
@@ -81,13 +78,21 @@ public class DingtalkUtil {
     /**
      * 通过UNIONID获取用户信息
      */
-
     private static String URLGETUSERINFOBYUNIONID;
     @Value("${dingtalk.URL_GET_USERINFO_BYUNIONID}")
     public void setURLGETUSERINFOBYUNIONID(String URLGETUSERINFOBYUNIONID) {
         DingtalkUtil.URLGETUSERINFOBYUNIONID = URLGETUSERINFOBYUNIONID;
     }
 
+    /**
+     * 通过手机号获取用户信息
+     */
+    private static String URLGETUSERINFOBYMOBILE;
+    @Value("${dingtalk.URL_GET_USERINFO_BYMOBILE}")
+    public void setURLGETUSERINFOBYMOBILE(String URLGETUSERINFOBYMOBILE) {
+        DingtalkUtil.URLGETUSERINFOBYMOBILE = URLGETUSERINFOBYMOBILE;
+    }
+
     /**
      * 获取钉钉 accessToken
      * @return
@@ -112,6 +117,17 @@ public class DingtalkUtil {
         return rsp.getResult().getUserid();
     }
 
+    public static String getUserInfoByMobile(String mobile) throws Exception {
+        String accessToken = getAccessToken();
+        // 根据手机号获取钉钉userid
+        DingTalkClient dingTalkClientUser = new DefaultDingTalkClient(URLGETUSERINFOBYMOBILE);
+        OapiV2UserGetbymobileRequest phoneReq = new OapiV2UserGetbymobileRequest();
+        phoneReq.setMobile(mobile);
+        OapiV2UserGetbymobileResponse rsp = dingTalkClientUser.execute(phoneReq, accessToken);
+        String userId = rsp.getResult().getUserid();
+        return userId;
+    }
+
     /**
      * 根据免登授权码获取用户id
      *
@@ -192,15 +208,19 @@ public class DingtalkUtil {
      * @param accessToken
      * @throws Exception
      */
-    public static String getUserInfo(String accessToken) throws Exception {
+    public static Map<String, String> getUserInfo(String accessToken) throws Exception {
         com.aliyun.dingtalkcontact_1_0.Client client = createContactClient();
         GetUserHeaders getUserHeaders = new GetUserHeaders();
         getUserHeaders.xAcsDingtalkAccessToken = accessToken;
+        Map<String, String> resultMap = new HashMap<>();
         try {
             GetUserResponse response = client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions());
             System.out.println(JSON.toJSON(response));
             String mobile = response.getBody().getMobile();
-            return mobile;
+            String unionId = response.getBody().getUnionId();
+            resultMap.put("mobile", mobile);
+            resultMap.put("unionId", unionId);
+            return resultMap;
         } catch (TeaException err) {
             if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                 // err 中含有 code 和 message 属性,可帮助开发定位问题
@@ -213,7 +233,7 @@ public class DingtalkUtil {
                 System.out.println(JSON.toJSONString(err));
             }
         }
-        return StrUtil.EMPTY;
+        return resultMap;
     }
 
     public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception {