MaxKey 3 years ago
parent
commit
89ca99e153

+ 48 - 16
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/LoginCredential.java

@@ -42,6 +42,8 @@ public class LoginCredential  implements Authentication {
     String provider;
     String code;
     String message = WebConstants.LOGIN_RESULT.SUCCESS;
+    String instId;
+    
     
     ArrayList<GrantedAuthority> grantedAuthority;
     boolean authenticated;
@@ -211,20 +213,50 @@ public class LoginCredential  implements Authentication {
         this.message = message;
     }
 
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("LoginCredential [username=").append(username)
-                .append(", password=").append("******")
-                .append(", sessionId=").append(sessionId)
-                .append(", captcha=").append(captcha)
-                .append(", otpCaptcha=").append(otpCaptcha)
-                .append(", remeberMe=").append(remeberMe)
-                .append(", authType=").append(authType)
-                .append(", jwtToken=").append(jwtToken)
-                .append(", grantedAuthority=").append(grantedAuthority)
-                .append(", authenticated=").append(authenticated)
-                .append("]");
-        return builder.toString();
-    }
+    public String getInstId() {
+		return instId;
+	}
+
+	public void setInstId(String instId) {
+		this.instId = instId;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("LoginCredential [username=");
+		builder.append(username);
+		builder.append(", password=");
+		builder.append("******");
+		builder.append(", sessionId=");
+		builder.append(sessionId);
+		builder.append(", captcha=");
+		builder.append(captcha);
+		builder.append(", otpCaptcha=");
+		builder.append(otpCaptcha);
+		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();
+	}
 }

+ 6 - 0
maxkey-core/src/main/java/org/maxkey/entity/OrganizationsCast.java

@@ -64,6 +64,12 @@ public class OrganizationsCast extends JpaBaseEntity implements Serializable {
     private String orgId;
     @Column
     private String orgParentId;
+    
+    @Column
+    private String appId;
+    
+    @Column
+    private String appName;
 	@Column
 	private String instId;
 

+ 40 - 21
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkOrganizationService.java

@@ -17,6 +17,12 @@
 
 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.synchronizer.AbstractSynchronizerService;
 import org.maxkey.synchronizer.ISynchronizerService;
@@ -34,47 +40,65 @@ import com.taobao.api.ApiException;
 public class DingtalkOrganizationService  extends AbstractSynchronizerService implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(DingtalkOrganizationService.class);
 	
-	OapiV2DepartmentListsubResponse rspDepts;
-	
 	String access_token;
 	
 	public void sync() {
 		_logger.info("Sync Organizations ...");
-	
-		try {			
-			OapiV2DepartmentListsubResponse rsp = requestDepartmentList(access_token);
-			
-			for(DeptBaseResponse dept : rsp.getResult()) {
-				_logger.info("dept : " + dept.getDeptId()+" "+ dept.getName()+" "+ dept.getParentId());
-				Organizations org = buildOrganization(dept);
-				this.organizationsService.merge(org);
-				_logger.info("Organizations : " + org);
+		LinkedBlockingQueue<Long> deptsQueue = new LinkedBlockingQueue<Long>();
+		deptsQueue.add(1L);
+		HashMap<Long,DeptBaseResponse> deptMap = new HashMap<Long,DeptBaseResponse>();
+		try {
+			while(deptsQueue.element() != null) {
+				OapiV2DepartmentListsubResponse rsp = requestDepartmentList(access_token,deptsQueue.poll());
+				
+				for(DeptBaseResponse dept : rsp.getResult()) {
+					_logger.info("dept : " + dept.getDeptId()+" "+ dept.getName()+" "+ dept.getParentId());
+					deptsQueue.add(dept.getDeptId());
+					deptMap.put(dept.getDeptId(), dept);
+					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) {
 			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");
 		OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
-		req.setDeptId(1L);
+		req.setDeptId(deptId);
 		req.setLanguage("zh_CN");
-		rspDepts = client.execute(req, access_token);
+		OapiV2DepartmentListsubResponse rspDepts = client.execute(req, access_token);
 		_logger.info("response : " + rspDepts.getBody());
 		return rspDepts;
 	}
 	
 	
 	
-	public Organizations buildOrganization(DeptBaseResponse dept) {
+	public Organizations buildOrganization(DeptBaseResponse dept,DeptBaseResponse parentDept) {
 		Organizations org = new Organizations();
 		org.setId(dept.getDeptId()+"");
+		org.setCode(dept.getDeptId()+"");
 		org.setName(dept.getName());
 		org.setParentId(dept.getParentId()+"");
+		org.setParentCode(dept.getParentId()+"");
+		if(parentDept != null) {
+			org.setParentName(parentDept.getName());
+		}
 		org.setInstId(this.synchronizer.getInstId());
+		org.setStatus(ConstsStatus.ACTIVE);
+		org.setDescription("dingtalk");
 		return org;
 	}
 
@@ -87,10 +111,5 @@ public class DingtalkOrganizationService  extends AbstractSynchronizerService im
 	public void setAccess_token(String access_token) {
 		this.access_token = access_token;
 	}
-
-	public OapiV2DepartmentListsubResponse getRspDepts() {
-		return rspDepts;
-	}
-	
 	
 }

+ 30 - 28
maxkey-identitys/maxkey-synchronizers-dingtalk/src/main/java/org/maxkey/synchronizer/dingtalk/DingtalkUsersService.java

@@ -17,42 +17,44 @@
 
 package org.maxkey.synchronizer.dingtalk;
 
+import java.sql.Types;
+import java.util.List;
+
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
+import org.maxkey.entity.Organizations;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.synchronizer.AbstractSynchronizerService;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiV2UserListRequest;
-import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
 import com.dingtalk.api.response.OapiV2UserListResponse;
-import com.dingtalk.api.response.OapiV2DepartmentListsubResponse.DeptBaseResponse;
 import com.dingtalk.api.response.OapiV2UserListResponse.ListUserResponse;
 
 @Service
 public class DingtalkUsersService  extends AbstractSynchronizerService implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(DingtalkUsersService.class);
 	
-	@Autowired
-	DingtalkOrganizationService dingdingOrganizationService;
-	
 	String access_token;
 	
 	public void sync() {
 		_logger.info("Sync Users...");
 		try {
 			
-			OapiV2DepartmentListsubResponse rspDepts = dingdingOrganizationService.getRspDepts();
-			for(DeptBaseResponse dept : rspDepts.getResult()) {
+			 List<Organizations> organizations = 
+					 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");
 				OapiV2UserListRequest req = new OapiV2UserListRequest();
-				req.setDeptId(dept.getDeptId());
+				req.setDeptId(Long.parseLong(dept.getCode()));
 				req.setCursor(0L);
 				req.setSize(100L);
 				req.setOrderField("modify_desc");
@@ -66,12 +68,14 @@ public class DingtalkUsersService  extends AbstractSynchronizerService implement
 						_logger.info("name : " + user.getName()+" , "+user.getLoginId()+" , "+user.getUserid());
 						UserInfo userInfo  = buildUserInfo(user);
 						_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");
 							this.userInfoService.insert(userInfo);
-						//}else {
-						//	userInfoService.update(userInfo);
-						//}
+						}else {
+							userInfoService.update(userInfo);
+						}
 						
 					}
 				}
@@ -91,21 +95,24 @@ public class DingtalkUsersService  extends AbstractSynchronizerService implement
 	public UserInfo buildUserInfo(ListUserResponse user) {
 		UserInfo userInfo = new  UserInfo();
 
-		userInfo.setUsername(user.getUserid());//鐧诲綍鍚
-		userInfo.setNickName(user.getName());//鐢ㄦ埛鍚
-		userInfo.setDisplayName(user.getName());//鐢ㄦ埛鍚
-		userInfo.setFormattedName(user.getName());//鐢ㄦ埛鍚
+		userInfo.setUsername(user.getUserid());//閻ц缍嶉崥锟
+		userInfo.setNickName(user.getName());//閻€劍鍩涢崥锟
+		userInfo.setDisplayName(user.getName());//閻€劍鍩涢崥锟
+		userInfo.setFormattedName(user.getName());//閻€劍鍩涢崥锟
 		
 		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.setMobile(user.getMobile());//鎵嬫満
+		userInfo.setMobile(user.getMobile());//閹靛婧�
+		
 		userInfo.setDepartmentId(user.getDeptIdList().get(0)+"");
-		userInfo.setJobTitle(user.getTitle());//鑱屽姟
-		userInfo.setWorkEmail(user.getOrgEmail());//宸ヤ綔閭欢
-		userInfo.setWorkPhoneNumber(user.getTelephone());//鍏徃鐢佃瘽
-		userInfo.setWorkOfficeName(user.getWorkPlace());//鍔炲叕瀹�
-		userInfo.setDescription(user.getRemark());//澶囨敞
+		userInfo.setEmployeeNumber(user.getJobNumber());
+		userInfo.setJobTitle(user.getTitle());//閼卞苯濮�
+		userInfo.setWorkEmail(user.getOrgEmail());//瀹搞儰缍旈柇顔绘
+		userInfo.setWorkPhoneNumber(user.getTelephone());//閸忣剙寰冮悽浣冪樈
+		userInfo.setWorkOfficeName(user.getWorkPlace());//閸旂偛鍙曠�癸拷
+		
 		userInfo.setInstId(this.synchronizer.getInstId());
+		userInfo.setDescription("dingtalk "+user.getRemark());
 		return userInfo;
 	}
 
@@ -115,9 +122,4 @@ public class DingtalkUsersService  extends AbstractSynchronizerService implement
 		this.access_token = access_token;
 	}
 
-	public void setDingdingOrganizationService(DingtalkOrganizationService dingdingOrganizationService) {
-		this.dingdingOrganizationService = dingdingOrganizationService;
-	}
-
-
 }

+ 12 - 1
maxkey-identitys/maxkey-synchronizers-workweixin/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java

@@ -17,6 +17,9 @@
 
 package org.maxkey.synchronizer.workweixin;
 
+import java.sql.Types;
+
+import org.maxkey.constants.ConstsStatus;
 import org.maxkey.entity.Organizations;
 import org.maxkey.synchronizer.AbstractSynchronizerService;
 import org.maxkey.synchronizer.ISynchronizerService;
@@ -47,7 +50,13 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
 			for(WorkWeixinDepts dept : rsp.getDepartment()) {
 				_logger.info("dept : " + dept.getId()+" "+ dept.getName()+" "+ dept.getParentid());
 				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) {
@@ -75,6 +84,8 @@ public class WorkweixinOrganizationService extends AbstractSynchronizerService i
 		org.setParentId(dept.getParentid()+"");
 		org.setSortIndex(dept.getOrder());
 		org.setInstId(this.synchronizer.getInstId());
+		org.setStatus(ConstsStatus.ACTIVE);
+		org.setDescription("WorkWeixin");
 		return org;
 	}
 

+ 1 - 1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/AbstractSynchronizerService.java

@@ -56,7 +56,7 @@ public abstract class AbstractSynchronizerService {
         }
         
         for(Organizations org : orgsList) {
-           if(org.getId().equals(orgId)&&orgId.equals("1")) {
+           if(org.getId().equals(orgId) && orgId.equals("1")) {
                rootOrganization = org; 
                rootOrganization.setNamePath("/"+rootOrganization.getName());
                rootOrganization.setCodePath("/1");