mirror of
https://gitee.com/dromara/MaxKey.git
synced 2025-12-07 01:18:27 +08:00
dingtalk
This commit is contained in:
parent
efda9101c6
commit
89ca99e153
@ -42,6 +42,8 @@ public class LoginCredential implements Authentication {
|
|||||||
String provider;
|
String provider;
|
||||||
String code;
|
String code;
|
||||||
String message = WebConstants.LOGIN_RESULT.SUCCESS;
|
String message = WebConstants.LOGIN_RESULT.SUCCESS;
|
||||||
|
String instId;
|
||||||
|
|
||||||
|
|
||||||
ArrayList<GrantedAuthority> grantedAuthority;
|
ArrayList<GrantedAuthority> grantedAuthority;
|
||||||
boolean authenticated;
|
boolean authenticated;
|
||||||
@ -211,20 +213,50 @@ public class LoginCredential implements Authentication {
|
|||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getInstId() {
|
||||||
|
return instId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstId(String instId) {
|
||||||
|
this.instId = instId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("LoginCredential [username=").append(username)
|
builder.append("LoginCredential [username=");
|
||||||
.append(", password=").append("******")
|
builder.append(username);
|
||||||
.append(", sessionId=").append(sessionId)
|
builder.append(", password=");
|
||||||
.append(", captcha=").append(captcha)
|
builder.append("******");
|
||||||
.append(", otpCaptcha=").append(otpCaptcha)
|
builder.append(", sessionId=");
|
||||||
.append(", remeberMe=").append(remeberMe)
|
builder.append(sessionId);
|
||||||
.append(", authType=").append(authType)
|
builder.append(", captcha=");
|
||||||
.append(", jwtToken=").append(jwtToken)
|
builder.append(captcha);
|
||||||
.append(", grantedAuthority=").append(grantedAuthority)
|
builder.append(", otpCaptcha=");
|
||||||
.append(", authenticated=").append(authenticated)
|
builder.append(otpCaptcha);
|
||||||
.append("]");
|
builder.append(", remeberMe=");
|
||||||
|
builder.append(remeberMe);
|
||||||
|
builder.append(", authType=");
|
||||||
|
builder.append(authType);
|
||||||
|
builder.append(", jwtToken=");
|
||||||
|
builder.append(jwtToken);
|
||||||
|
builder.append(", onlineTicket=");
|
||||||
|
builder.append(onlineTicket);
|
||||||
|
builder.append(", provider=");
|
||||||
|
builder.append(provider);
|
||||||
|
builder.append(", code=");
|
||||||
|
builder.append(code);
|
||||||
|
builder.append(", message=");
|
||||||
|
builder.append(message);
|
||||||
|
builder.append(", instId=");
|
||||||
|
builder.append(instId);
|
||||||
|
builder.append(", grantedAuthority=");
|
||||||
|
builder.append(grantedAuthority);
|
||||||
|
builder.append(", authenticated=");
|
||||||
|
builder.append(authenticated);
|
||||||
|
builder.append(", roleAdministrators=");
|
||||||
|
builder.append(roleAdministrators);
|
||||||
|
builder.append("]");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -64,6 +64,12 @@ public class OrganizationsCast extends JpaBaseEntity implements Serializable {
|
|||||||
private String orgId;
|
private String orgId;
|
||||||
@Column
|
@Column
|
||||||
private String orgParentId;
|
private String orgParentId;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String appId;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String appName;
|
||||||
@Column
|
@Column
|
||||||
private String instId;
|
private String instId;
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,12 @@
|
|||||||
|
|
||||||
package org.maxkey.synchronizer.dingtalk;
|
package org.maxkey.synchronizer.dingtalk;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
import org.maxkey.constants.ConstsStatus;
|
||||||
import org.maxkey.entity.Organizations;
|
import org.maxkey.entity.Organizations;
|
||||||
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
||||||
import org.maxkey.synchronizer.ISynchronizerService;
|
import org.maxkey.synchronizer.ISynchronizerService;
|
||||||
@ -34,47 +40,65 @@ import com.taobao.api.ApiException;
|
|||||||
public class DingtalkOrganizationService extends AbstractSynchronizerService implements ISynchronizerService{
|
public class DingtalkOrganizationService extends AbstractSynchronizerService implements ISynchronizerService{
|
||||||
final static Logger _logger = LoggerFactory.getLogger(DingtalkOrganizationService.class);
|
final static Logger _logger = LoggerFactory.getLogger(DingtalkOrganizationService.class);
|
||||||
|
|
||||||
OapiV2DepartmentListsubResponse rspDepts;
|
|
||||||
|
|
||||||
String access_token;
|
String access_token;
|
||||||
|
|
||||||
public void sync() {
|
public void sync() {
|
||||||
_logger.info("Sync Organizations ...");
|
_logger.info("Sync Organizations ...");
|
||||||
|
LinkedBlockingQueue<Long> deptsQueue = new LinkedBlockingQueue<Long>();
|
||||||
|
deptsQueue.add(1L);
|
||||||
|
HashMap<Long,DeptBaseResponse> deptMap = new HashMap<Long,DeptBaseResponse>();
|
||||||
try {
|
try {
|
||||||
OapiV2DepartmentListsubResponse rsp = requestDepartmentList(access_token);
|
while(deptsQueue.element() != null) {
|
||||||
|
OapiV2DepartmentListsubResponse rsp = requestDepartmentList(access_token,deptsQueue.poll());
|
||||||
|
|
||||||
for(DeptBaseResponse dept : rsp.getResult()) {
|
for(DeptBaseResponse dept : rsp.getResult()) {
|
||||||
_logger.info("dept : " + dept.getDeptId()+" "+ dept.getName()+" "+ dept.getParentId());
|
_logger.info("dept : " + dept.getDeptId()+" "+ dept.getName()+" "+ dept.getParentId());
|
||||||
Organizations org = buildOrganization(dept);
|
deptsQueue.add(dept.getDeptId());
|
||||||
this.organizationsService.merge(org);
|
deptMap.put(dept.getDeptId(), dept);
|
||||||
_logger.info("Organizations : " + org);
|
Organizations organization = buildOrganization(dept,deptMap.get(dept.getParentId()));
|
||||||
|
if(organizationsService.findOne("id = ? and instid = ?",
|
||||||
|
new Object[] { organization.getId().toString(), organization.getInstId() },
|
||||||
|
new int[] { Types.VARCHAR, Types.VARCHAR }) == null) {
|
||||||
|
organizationsService.insert(organization);
|
||||||
|
}else {
|
||||||
|
organizationsService.update(organization);
|
||||||
|
}
|
||||||
|
_logger.info("Organizations : " + organization);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (ApiException e) {
|
} catch (ApiException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
}catch (NoSuchElementException e) {
|
||||||
|
_logger.debug("Sync Department successful .");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OapiV2DepartmentListsubResponse requestDepartmentList(String access_token) throws ApiException {
|
public OapiV2DepartmentListsubResponse requestDepartmentList(String access_token,Long deptId) throws ApiException {
|
||||||
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
|
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
|
||||||
OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
|
OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
|
||||||
req.setDeptId(1L);
|
req.setDeptId(deptId);
|
||||||
req.setLanguage("zh_CN");
|
req.setLanguage("zh_CN");
|
||||||
rspDepts = client.execute(req, access_token);
|
OapiV2DepartmentListsubResponse rspDepts = client.execute(req, access_token);
|
||||||
_logger.info("response : " + rspDepts.getBody());
|
_logger.info("response : " + rspDepts.getBody());
|
||||||
return rspDepts;
|
return rspDepts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Organizations buildOrganization(DeptBaseResponse dept) {
|
public Organizations buildOrganization(DeptBaseResponse dept,DeptBaseResponse parentDept) {
|
||||||
Organizations org = new Organizations();
|
Organizations org = new Organizations();
|
||||||
org.setId(dept.getDeptId()+"");
|
org.setId(dept.getDeptId()+"");
|
||||||
|
org.setCode(dept.getDeptId()+"");
|
||||||
org.setName(dept.getName());
|
org.setName(dept.getName());
|
||||||
org.setParentId(dept.getParentId()+"");
|
org.setParentId(dept.getParentId()+"");
|
||||||
|
org.setParentCode(dept.getParentId()+"");
|
||||||
|
if(parentDept != null) {
|
||||||
|
org.setParentName(parentDept.getName());
|
||||||
|
}
|
||||||
org.setInstId(this.synchronizer.getInstId());
|
org.setInstId(this.synchronizer.getInstId());
|
||||||
|
org.setStatus(ConstsStatus.ACTIVE);
|
||||||
|
org.setDescription("dingtalk");
|
||||||
return org;
|
return org;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,9 +112,4 @@ public class DingtalkOrganizationService extends AbstractSynchronizerService im
|
|||||||
this.access_token = access_token;
|
this.access_token = access_token;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OapiV2DepartmentListsubResponse getRspDepts() {
|
|
||||||
return rspDepts;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,42 +17,44 @@
|
|||||||
|
|
||||||
package org.maxkey.synchronizer.dingtalk;
|
package org.maxkey.synchronizer.dingtalk;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.format.DateTimeFormat;
|
import org.joda.time.format.DateTimeFormat;
|
||||||
|
import org.maxkey.entity.Organizations;
|
||||||
import org.maxkey.entity.UserInfo;
|
import org.maxkey.entity.UserInfo;
|
||||||
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
||||||
import org.maxkey.synchronizer.ISynchronizerService;
|
import org.maxkey.synchronizer.ISynchronizerService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import com.dingtalk.api.DefaultDingTalkClient;
|
import com.dingtalk.api.DefaultDingTalkClient;
|
||||||
import com.dingtalk.api.DingTalkClient;
|
import com.dingtalk.api.DingTalkClient;
|
||||||
import com.dingtalk.api.request.OapiV2UserListRequest;
|
import com.dingtalk.api.request.OapiV2UserListRequest;
|
||||||
import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
|
|
||||||
import com.dingtalk.api.response.OapiV2UserListResponse;
|
import com.dingtalk.api.response.OapiV2UserListResponse;
|
||||||
import com.dingtalk.api.response.OapiV2DepartmentListsubResponse.DeptBaseResponse;
|
|
||||||
import com.dingtalk.api.response.OapiV2UserListResponse.ListUserResponse;
|
import com.dingtalk.api.response.OapiV2UserListResponse.ListUserResponse;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class DingtalkUsersService extends AbstractSynchronizerService implements ISynchronizerService{
|
public class DingtalkUsersService extends AbstractSynchronizerService implements ISynchronizerService{
|
||||||
final static Logger _logger = LoggerFactory.getLogger(DingtalkUsersService.class);
|
final static Logger _logger = LoggerFactory.getLogger(DingtalkUsersService.class);
|
||||||
|
|
||||||
@Autowired
|
|
||||||
DingtalkOrganizationService dingdingOrganizationService;
|
|
||||||
|
|
||||||
String access_token;
|
String access_token;
|
||||||
|
|
||||||
public void sync() {
|
public void sync() {
|
||||||
_logger.info("Sync Users...");
|
_logger.info("Sync Users...");
|
||||||
try {
|
try {
|
||||||
|
|
||||||
OapiV2DepartmentListsubResponse rspDepts = dingdingOrganizationService.getRspDepts();
|
List<Organizations> organizations =
|
||||||
for(DeptBaseResponse dept : rspDepts.getResult()) {
|
organizationsService.find("instid = ?",
|
||||||
|
new Object[] { this.synchronizer.getInstId() },
|
||||||
|
new int[] { Types.VARCHAR});
|
||||||
|
|
||||||
|
for(Organizations dept : organizations) {
|
||||||
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list");
|
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list");
|
||||||
OapiV2UserListRequest req = new OapiV2UserListRequest();
|
OapiV2UserListRequest req = new OapiV2UserListRequest();
|
||||||
req.setDeptId(dept.getDeptId());
|
req.setDeptId(Long.parseLong(dept.getCode()));
|
||||||
req.setCursor(0L);
|
req.setCursor(0L);
|
||||||
req.setSize(100L);
|
req.setSize(100L);
|
||||||
req.setOrderField("modify_desc");
|
req.setOrderField("modify_desc");
|
||||||
@ -66,12 +68,14 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
|
|||||||
_logger.info("name : " + user.getName()+" , "+user.getLoginId()+" , "+user.getUserid());
|
_logger.info("name : " + user.getName()+" , "+user.getLoginId()+" , "+user.getUserid());
|
||||||
UserInfo userInfo = buildUserInfo(user);
|
UserInfo userInfo = buildUserInfo(user);
|
||||||
_logger.info("userInfo " + userInfo);
|
_logger.info("userInfo " + userInfo);
|
||||||
//if(userInfoService.findByUsername(userInfo.getUsername()) == null) {
|
if(userInfoService.findOne("username = ? and instid = ?",
|
||||||
|
new Object[] { userInfo.getUsername(),this.getSynchronizer().getInstId() },
|
||||||
|
new int[] { Types.VARCHAR,Types.VARCHAR}) == null) {
|
||||||
userInfo.setPassword(userInfo.getUsername() + "Maxkey@888");
|
userInfo.setPassword(userInfo.getUsername() + "Maxkey@888");
|
||||||
this.userInfoService.insert(userInfo);
|
this.userInfoService.insert(userInfo);
|
||||||
//}else {
|
}else {
|
||||||
// userInfoService.update(userInfo);
|
userInfoService.update(userInfo);
|
||||||
//}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,21 +95,24 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
|
|||||||
public UserInfo buildUserInfo(ListUserResponse user) {
|
public UserInfo buildUserInfo(ListUserResponse user) {
|
||||||
UserInfo userInfo = new UserInfo();
|
UserInfo userInfo = new UserInfo();
|
||||||
|
|
||||||
userInfo.setUsername(user.getUserid());//鐧诲綍鍚<EFBFBD>
|
userInfo.setUsername(user.getUserid());//閻ц缍嶉崥锟<EFBFBD>
|
||||||
userInfo.setNickName(user.getName());//鐢ㄦ埛鍚<EFBFBD>
|
userInfo.setNickName(user.getName());//閻€劍鍩涢崥锟<EFBFBD>
|
||||||
userInfo.setDisplayName(user.getName());//鐢ㄦ埛鍚<EFBFBD>
|
userInfo.setDisplayName(user.getName());//閻€劍鍩涢崥锟<EFBFBD>
|
||||||
userInfo.setFormattedName(user.getName());//鐢ㄦ埛鍚<EFBFBD>
|
userInfo.setFormattedName(user.getName());//閻€劍鍩涢崥锟<EFBFBD>
|
||||||
|
|
||||||
userInfo.setEmail(StringUtils.isBlank(user.getEmail())? user.getUserid() +"@maxkey.top":user.getEmail());
|
userInfo.setEmail(StringUtils.isBlank(user.getEmail())? user.getUserid() +"@maxkey.top":user.getEmail());
|
||||||
userInfo.setEntryDate(new DateTime(user.getHiredDate()).toString(DateTimeFormat.forPattern("yyyy-MM-dd")));
|
userInfo.setEntryDate(new DateTime(user.getHiredDate()).toString(DateTimeFormat.forPattern("yyyy-MM-dd")));
|
||||||
userInfo.setMobile(user.getMobile());//鎵嬫満
|
userInfo.setMobile(user.getMobile());//閹靛婧<EFBFBD>
|
||||||
|
|
||||||
userInfo.setDepartmentId(user.getDeptIdList().get(0)+"");
|
userInfo.setDepartmentId(user.getDeptIdList().get(0)+"");
|
||||||
userInfo.setJobTitle(user.getTitle());//鑱屽姟
|
userInfo.setEmployeeNumber(user.getJobNumber());
|
||||||
userInfo.setWorkEmail(user.getOrgEmail());//宸ヤ綔閭欢
|
userInfo.setJobTitle(user.getTitle());//閼卞苯濮<EFBFBD>
|
||||||
userInfo.setWorkPhoneNumber(user.getTelephone());//鍏徃鐢佃瘽
|
userInfo.setWorkEmail(user.getOrgEmail());//瀹搞儰缍旈柇顔绘
|
||||||
userInfo.setWorkOfficeName(user.getWorkPlace());//鍔炲叕瀹<EFBFBD>
|
userInfo.setWorkPhoneNumber(user.getTelephone());//閸忣剙寰冮悽浣冪樈
|
||||||
userInfo.setDescription(user.getRemark());//澶囨敞
|
userInfo.setWorkOfficeName(user.getWorkPlace());//閸旂偛鍙曠<EFBFBD>癸拷
|
||||||
|
|
||||||
userInfo.setInstId(this.synchronizer.getInstId());
|
userInfo.setInstId(this.synchronizer.getInstId());
|
||||||
|
userInfo.setDescription("dingtalk "+user.getRemark());
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,9 +122,4 @@ public class DingtalkUsersService extends AbstractSynchronizerService implement
|
|||||||
this.access_token = access_token;
|
this.access_token = access_token;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDingdingOrganizationService(DingtalkOrganizationService dingdingOrganizationService) {
|
|
||||||
this.dingdingOrganizationService = dingdingOrganizationService;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
package org.maxkey.synchronizer.workweixin;
|
package org.maxkey.synchronizer.workweixin;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
|
||||||
|
import org.maxkey.constants.ConstsStatus;
|
||||||
import org.maxkey.entity.Organizations;
|
import org.maxkey.entity.Organizations;
|
||||||
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
import org.maxkey.synchronizer.AbstractSynchronizerService;
|
||||||
import org.maxkey.synchronizer.ISynchronizerService;
|
import org.maxkey.synchronizer.ISynchronizerService;
|
||||||
@ -47,7 +50,13 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
|
|||||||
for(WorkWeixinDepts dept : rsp.getDepartment()) {
|
for(WorkWeixinDepts dept : rsp.getDepartment()) {
|
||||||
_logger.info("dept : " + dept.getId()+" "+ dept.getName()+" "+ dept.getParentid());
|
_logger.info("dept : " + dept.getId()+" "+ dept.getName()+" "+ dept.getParentid());
|
||||||
Organizations org = buildOrganization(dept);
|
Organizations org = buildOrganization(dept);
|
||||||
this.organizationsService.merge(org);
|
if(organizationsService.findOne("id = ? and instid = ?",
|
||||||
|
new Object[] { org.getId().toString(), org.getInstId() },
|
||||||
|
new int[] { Types.VARCHAR, Types.VARCHAR }) == null) {
|
||||||
|
organizationsService.insert(org);
|
||||||
|
}else {
|
||||||
|
organizationsService.update(org);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -75,6 +84,8 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
|
|||||||
org.setParentId(dept.getParentid()+"");
|
org.setParentId(dept.getParentid()+"");
|
||||||
org.setSortIndex(dept.getOrder());
|
org.setSortIndex(dept.getOrder());
|
||||||
org.setInstId(this.synchronizer.getInstId());
|
org.setInstId(this.synchronizer.getInstId());
|
||||||
|
org.setStatus(ConstsStatus.ACTIVE);
|
||||||
|
org.setDescription("WorkWeixin");
|
||||||
return org;
|
return org;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user