24282 2 years ago
parent
commit
9a4e012c18

+ 3 - 9
hx-dingding/src/main/java/com/fjhx/dingding/controller/DingController.java

@@ -2,20 +2,16 @@ package com.fjhx.dingding.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.dingtalk.oapi.lib.aes.DingTalkEncryptor;
 import com.fjhx.dingding.constant.Constant;
 import com.fjhx.dingding.entity.dto.GetUserTokenDto;
 import com.fjhx.dingding.service.DingService;
-import com.fjhx.dingding.utils.DingUtil;
 import com.ruoyi.common.annotation.NonInterception;
 import com.ruoyi.common.annotation.TenantIgnore;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.LinkedHashMap;
-
 @Slf4j
 @RestController
 @RequestMapping("/open")
@@ -95,12 +91,10 @@ public class DingController {
 
     }
 
+    @TenantIgnore
     @PostMapping(value = "/dingApi/getUserToken")
-    public LinkedHashMap<String, Object> getUserToken(@RequestBody GetUserTokenDto dto) {
-        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userInfo = DingUtil.getUserInfo(dto.getCorpId(), dto.getCode());
-        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
-        map.put("userInfo", userInfo);
-        return map;
+    public String getUserToken(@RequestBody GetUserTokenDto dto) {
+        return dingService.getUserToken(dto);
     }
 
 }

+ 3 - 0
hx-dingding/src/main/java/com/fjhx/dingding/service/DingService.java

@@ -1,9 +1,12 @@
 package com.fjhx.dingding.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fjhx.dingding.entity.dto.GetUserTokenDto;
 
 public interface DingService {
 
     void pushHigh(JSONObject callBackContent);
 
+    String getUserToken(GetUserTokenDto dto);
+
 }

+ 125 - 8
hx-dingding/src/main/java/com/fjhx/dingding/service/impl/DingServiceImpl.java

@@ -8,19 +8,29 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
+import com.dingtalk.api.response.OapiV2UserGetResponse;
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.dingding.entity.dto.GetUserTokenDto;
 import com.fjhx.dingding.service.DingService;
-import com.fjhx.dingding.service.suite.SuiteTicketInfoService;
 import com.fjhx.dingding.utils.DingUtil;
 import com.fjhx.tenant.entity.tenant.po.TenantInfo;
 import com.fjhx.tenant.service.tenant.impl.TenantInfoServiceImpl;
 import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.ip.IpUtils;
+import com.ruoyi.framework.web.service.SysPermissionService;
+import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.service.ISysDeptService;
+import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.ConfigUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -33,6 +43,7 @@ import org.springframework.transaction.TransactionStatus;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -40,9 +51,6 @@ import java.util.stream.Collectors;
 public class DingServiceImpl implements DingService {
 
     @Autowired
-    private SuiteTicketInfoService suiteTicketInfoService;
-
-    @Autowired
     private TenantInfoServiceImpl tenantInfoService;
 
     @Autowired
@@ -57,6 +65,15 @@ public class DingServiceImpl implements DingService {
     @Autowired
     private ISysUserService sysUserService;
 
+    @Autowired
+    private ISysRoleService sysRoleService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private SysPermissionService permissionService;
+
     /**
      * https://open.dingtalk.com/document/isvapp/data-formats
      */
@@ -77,6 +94,54 @@ public class DingServiceImpl implements DingService {
 
     }
 
+    @Override
+    public String getUserToken(GetUserTokenDto dto) {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userInfo = DingUtil.getUserInfo(dto.getCorpId(), dto.getCode());
+        String userid = userInfo.getUserid();
+        SysUser sysUser = sysUserService.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getDdUserId, userid));
+        if (sysUser == null) {
+
+            TenantInfo tenantInfo = tenantInfoService.getOne(Wrappers.<TenantInfo>lambdaQuery()
+                    .eq(TenantInfo::getCorpid, dto.getCorpId()));
+
+            sysUser = new SysUser();
+            OapiV2UserGetResponse.UserGetResponse userDetail = DingUtil.getUserDetail(dto.getCorpId(), userid);
+            List<Long> deptIdList = userDetail.getDeptIdList();
+            if (deptIdList.size() > 0) {
+                Long deptId = deptIdList.get(0);
+                SysDept sysDept = sysDeptService.getOne(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getDingDeptId, deptId));
+                if (sysDept != null) {
+                    sysUser.setDeptId(sysDept.getDeptId());
+                }
+            }
+            sysUser.setTenantId(tenantInfo.getTenantId());
+            sysUser.setUserName("admin");
+            sysUser.setNickName(userInfo.getName());
+            sysUser.setPassword(SecurityUtils.encryptPassword(RandomUtil.randomString(6)));
+            sysUser.setStatus("0");
+            sysUser.setCreateBy(SecurityUtils.getUsername());
+            sysUser.setCreateTime(new Date());
+            sysUserService.save(sysUser);
+
+            SysRole sysRole = sysRoleService.getOne(Wrappers.<SysRole>lambdaQuery()
+                    .eq(SysRole::getTenantId, tenantInfo.getTenantId())
+                    .eq(SysRole::getRoleKey, "admin")
+            );
+
+            // 角色用户id关联
+            sysRoleService.insertAuthUsers(sysRole.getRoleId(), new Long[]{sysUser.getUserId()});
+        }
+
+        SysUser user = sysUserService.selectUserByUserName(sysUser.getTenantId(), sysUser.getUserName());
+        LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
+        recordLoginInfo(sysUser.getUserId());
+        String token = tokenService.createToken(loginUser);
+
+        DynamicDataSourceContextHolder.poll();
+        return token;
+    }
+
     /**
      * 保存 suite_ticket
      */
@@ -101,7 +166,6 @@ public class DingServiceImpl implements DingService {
 
             // 企业授权
             case "org_suite_auth":
-
                 orgSuiteAuth(jsonObject);
                 break;
 
@@ -113,6 +177,17 @@ public class DingServiceImpl implements DingService {
             // 表示企业解除授权
             case "org_suite_relieve":
 
+                JSONObject authCorpInfo = bizData.getJSONObject("auth_corp_info");
+
+                // 企业id
+                String corpid = authCorpInfo.getString("corpid");
+
+                // 禁用租户
+                tenantInfoService.update(Wrappers.<TenantInfo>lambdaUpdate()
+                        .eq(TenantInfo::getCorpid, corpid)
+                        .set(TenantInfo::getStatus, StatusConstant.DISABLE)
+                );
+
                 break;
         }
 
@@ -130,9 +205,15 @@ public class DingServiceImpl implements DingService {
         String corpid = authCorpInfo.getString("corpid");
         // 企业名称
         String corpName = authCorpInfo.getString("corp_name");
+        String userId = bizData.getJSONObject("auth_user_info").getString("userId");
 
         // 企业id存在则跳过
-        if (tenantInfoService.getOne(q -> q.eq(TenantInfo::getCorpid, corpid)) != null) {
+        TenantInfo tempTenantInfo = tenantInfoService.getOne(q -> q.eq(TenantInfo::getCorpid, corpid));
+        if (tempTenantInfo != null) {
+            if (ObjectUtil.equals(tempTenantInfo.getStatus(), StatusConstant.DISABLE)) {
+                tempTenantInfo.setStatus(StatusConstant.ENABLE);
+                tenantInfoService.updateById(tempTenantInfo);
+            }
             return;
         }
 
@@ -168,21 +249,40 @@ public class DingServiceImpl implements DingService {
         List<SysDept> deptList = new ArrayList<>();
         addDeptList(corpid, deptList, tenantId, 1L, 0L);
 
+        OapiV2UserGetResponse.UserGetResponse userDetail = DingUtil.getUserDetail(corpid, userId);
+
         // 创建用户
         SysUser sysUser = new SysUser();
-        // sysUser.setDeptId(sysDept.getDeptId());
+        List<Long> deptIdList = userDetail.getDeptIdList();
+        if (deptIdList.size() > 0) {
+            Map<Long, Long> collect = deptList.stream().collect(Collectors.toMap(SysDept::getDingDeptId, SysDept::getDeptId));
+            sysUser.setDeptId(collect.get(deptIdList.get(0)));
+        }
         sysUser.setTenantId(tenantId);
+        sysUser.setUserType(2);
+        sysUser.setJobNumber(userDetail.getJobNumber());
         sysUser.setUserName("admin");
         sysUser.setNickName(corpName + "管理员");
         sysUser.setPassword(SecurityUtils.encryptPassword(RandomUtil.randomString(6)));
         sysUser.setStatus("0");
         sysUser.setCreateTime(new Date());
         sysUser.setUpdateTime(new Date());
-        sysUser.setDdUserId(bizData.getJSONObject("auth_user_info").getString("userId"));
+        sysUser.setDdUserId(userId);
+
+        SysRole sysRole = new SysRole();
+        sysRole.setRoleName("管理员");
+        sysRole.setRoleKey("admin");
+        sysRole.setRoleSort(1);
+        sysRole.setDataScope("1");
+        sysRole.setStatus("0");
+        sysRole.setTenantId(tenantId);
+        sysRole.setCreateTime(new Date());
+        sysRole.setUpdateTime(new Date());
 
         log.info("钉钉回调创建租户,tenantInfo:{}", JSON.toJSONString(tenantInfo));
         log.info("钉钉回调创建部门,deptList:{}", JSON.toJSONString(deptList));
         log.info("钉钉回调创建用户,sysUser:{}", JSON.toJSONString(sysUser));
+        log.info("钉钉回调创建角色,sysRole:{}", JSON.toJSONString(sysRole));
 
         TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
         try {
@@ -192,6 +292,10 @@ public class DingServiceImpl implements DingService {
             sysDeptService.saveBatch(deptList);
             // 保存用户
             sysUserService.save(sysUser);
+            // 保存角色
+            sysRoleService.save(sysRole);
+            // 角色用户id关联
+            sysRoleService.insertAuthUsers(sysRole.getRoleId(), new Long[]{sysUser.getUserId()});
             // 提交事务
             platformTransactionManager.commit(transactionStatus);
 
@@ -232,4 +336,17 @@ public class DingServiceImpl implements DingService {
         }
     }
 
+    /**
+     * 记录登录信息
+     *
+     * @param userId 用户ID
+     */
+    public void recordLoginInfo(Long userId) {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(IpUtils.getIpAddr());
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        sysUserService.updateUserProfile(sysUser);
+    }
+
 }

+ 18 - 0
hx-dingding/src/main/java/com/fjhx/dingding/utils/DingUtil.java

@@ -11,13 +11,16 @@ import com.aliyun.teaopenapi.models.Config;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
+import com.dingtalk.api.request.OapiV2UserGetRequest;
 import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
 import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
+import com.dingtalk.api.response.OapiV2UserGetResponse;
 import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.fjhx.dingding.constant.Constant;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.utils.ConfigUtil;
+import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.List;
@@ -111,6 +114,21 @@ public class DingUtil {
         }
     }
 
+    public static OapiV2UserGetResponse.UserGetResponse getUserDetail(String corpId, String userId) {
+        try {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+            req.setUserid(userId);
+            String corpAccessToken = getCorpAccessToken(corpId);
+            OapiV2UserGetResponse rsp = client.execute(req, corpAccessToken);
+            return rsp.getResult();
+        } catch (ApiException e) {
+            log.error("获取用户详情失败", e);
+            throw new ServiceException("获取用户详情失败");
+        }
+    }
+
+
     public static List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getDeptList(String corpId, Long deptId) {
         try {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");