|
@@ -8,19 +8,29 @@ import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
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.OapiV2DepartmentListsubResponse;
|
|
|
|
+import com.dingtalk.api.response.OapiV2UserGetResponse;
|
|
|
|
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
|
|
import com.fjhx.common.constant.SourceConstant;
|
|
import com.fjhx.common.constant.SourceConstant;
|
|
|
|
+import com.fjhx.dingding.entity.dto.GetUserTokenDto;
|
|
import com.fjhx.dingding.service.DingService;
|
|
import com.fjhx.dingding.service.DingService;
|
|
-import com.fjhx.dingding.service.suite.SuiteTicketInfoService;
|
|
|
|
import com.fjhx.dingding.utils.DingUtil;
|
|
import com.fjhx.dingding.utils.DingUtil;
|
|
import com.fjhx.tenant.entity.tenant.po.TenantInfo;
|
|
import com.fjhx.tenant.entity.tenant.po.TenantInfo;
|
|
import com.fjhx.tenant.service.tenant.impl.TenantInfoServiceImpl;
|
|
import com.fjhx.tenant.service.tenant.impl.TenantInfoServiceImpl;
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
import com.ruoyi.common.core.domain.entity.SysDept;
|
|
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.entity.SysUser;
|
|
|
|
+import com.ruoyi.common.core.domain.model.LoginUser;
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
|
+import com.ruoyi.common.utils.DateUtils;
|
|
import com.ruoyi.common.utils.SecurityUtils;
|
|
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.ISysDeptService;
|
|
|
|
+import com.ruoyi.system.service.ISysRoleService;
|
|
import com.ruoyi.system.service.ISysUserService;
|
|
import com.ruoyi.system.service.ISysUserService;
|
|
import com.ruoyi.system.utils.ConfigUtil;
|
|
import com.ruoyi.system.utils.ConfigUtil;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -33,6 +43,7 @@ import org.springframework.transaction.TransactionStatus;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Slf4j
|
|
@Slf4j
|
|
@@ -40,9 +51,6 @@ import java.util.stream.Collectors;
|
|
public class DingServiceImpl implements DingService {
|
|
public class DingServiceImpl implements DingService {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
- private SuiteTicketInfoService suiteTicketInfoService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
private TenantInfoServiceImpl tenantInfoService;
|
|
private TenantInfoServiceImpl tenantInfoService;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
@@ -57,6 +65,15 @@ public class DingServiceImpl implements DingService {
|
|
@Autowired
|
|
@Autowired
|
|
private ISysUserService sysUserService;
|
|
private ISysUserService sysUserService;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISysRoleService sysRoleService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private TokenService tokenService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private SysPermissionService permissionService;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* https://open.dingtalk.com/document/isvapp/data-formats
|
|
* 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
|
|
* 保存 suite_ticket
|
|
*/
|
|
*/
|
|
@@ -101,7 +166,6 @@ public class DingServiceImpl implements DingService {
|
|
|
|
|
|
// 企业授权
|
|
// 企业授权
|
|
case "org_suite_auth":
|
|
case "org_suite_auth":
|
|
-
|
|
|
|
orgSuiteAuth(jsonObject);
|
|
orgSuiteAuth(jsonObject);
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -113,6 +177,17 @@ public class DingServiceImpl implements DingService {
|
|
// 表示企业解除授权
|
|
// 表示企业解除授权
|
|
case "org_suite_relieve":
|
|
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;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -130,9 +205,15 @@ public class DingServiceImpl implements DingService {
|
|
String corpid = authCorpInfo.getString("corpid");
|
|
String corpid = authCorpInfo.getString("corpid");
|
|
// 企业名称
|
|
// 企业名称
|
|
String corpName = authCorpInfo.getString("corp_name");
|
|
String corpName = authCorpInfo.getString("corp_name");
|
|
|
|
+ String userId = bizData.getJSONObject("auth_user_info").getString("userId");
|
|
|
|
|
|
// 企业id存在则跳过
|
|
// 企业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;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -168,21 +249,40 @@ public class DingServiceImpl implements DingService {
|
|
List<SysDept> deptList = new ArrayList<>();
|
|
List<SysDept> deptList = new ArrayList<>();
|
|
addDeptList(corpid, deptList, tenantId, 1L, 0L);
|
|
addDeptList(corpid, deptList, tenantId, 1L, 0L);
|
|
|
|
|
|
|
|
+ OapiV2UserGetResponse.UserGetResponse userDetail = DingUtil.getUserDetail(corpid, userId);
|
|
|
|
+
|
|
// 创建用户
|
|
// 创建用户
|
|
SysUser sysUser = new SysUser();
|
|
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.setTenantId(tenantId);
|
|
|
|
+ sysUser.setUserType(2);
|
|
|
|
+ sysUser.setJobNumber(userDetail.getJobNumber());
|
|
sysUser.setUserName("admin");
|
|
sysUser.setUserName("admin");
|
|
sysUser.setNickName(corpName + "管理员");
|
|
sysUser.setNickName(corpName + "管理员");
|
|
sysUser.setPassword(SecurityUtils.encryptPassword(RandomUtil.randomString(6)));
|
|
sysUser.setPassword(SecurityUtils.encryptPassword(RandomUtil.randomString(6)));
|
|
sysUser.setStatus("0");
|
|
sysUser.setStatus("0");
|
|
sysUser.setCreateTime(new Date());
|
|
sysUser.setCreateTime(new Date());
|
|
sysUser.setUpdateTime(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("钉钉回调创建租户,tenantInfo:{}", JSON.toJSONString(tenantInfo));
|
|
log.info("钉钉回调创建部门,deptList:{}", JSON.toJSONString(deptList));
|
|
log.info("钉钉回调创建部门,deptList:{}", JSON.toJSONString(deptList));
|
|
log.info("钉钉回调创建用户,sysUser:{}", JSON.toJSONString(sysUser));
|
|
log.info("钉钉回调创建用户,sysUser:{}", JSON.toJSONString(sysUser));
|
|
|
|
+ log.info("钉钉回调创建角色,sysRole:{}", JSON.toJSONString(sysRole));
|
|
|
|
|
|
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
|
|
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
|
|
try {
|
|
try {
|
|
@@ -192,6 +292,10 @@ public class DingServiceImpl implements DingService {
|
|
sysDeptService.saveBatch(deptList);
|
|
sysDeptService.saveBatch(deptList);
|
|
// 保存用户
|
|
// 保存用户
|
|
sysUserService.save(sysUser);
|
|
sysUserService.save(sysUser);
|
|
|
|
+ // 保存角色
|
|
|
|
+ sysRoleService.save(sysRole);
|
|
|
|
+ // 角色用户id关联
|
|
|
|
+ sysRoleService.insertAuthUsers(sysRole.getRoleId(), new Long[]{sysUser.getUserId()});
|
|
// 提交事务
|
|
// 提交事务
|
|
platformTransactionManager.commit(transactionStatus);
|
|
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);
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|