@ -15,7 +15,7 @@ import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.redis.Redis ;
import com.taobao.api.ApiException ;
import java.util. List ;
import java.util. * ;
public class DingTalkUtil {
/ * *
@ -197,7 +197,7 @@ public class DingTalkUtil {
OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest ( ) ;
req . setDeptId ( deptId ) ;
OapiV2DepartmentDeleteResponse rsp = client . execute ( req , access_token ) ;
System . out . println ( rsp . getBody ( ) ) ;
//System.out.println(rsp.getBody());
}
/ * *
@ -217,7 +217,7 @@ public class DingTalkUtil {
req . setName ( deptName ) ;
req . setLanguage ( "zh_CN" ) ;
OapiV2DepartmentUpdateResponse rsp = client . execute ( req , access_token ) ;
System . out . println ( rsp . getBody ( ) ) ;
//System.out.println(rsp.getBody());
}
/ * *
@ -269,7 +269,7 @@ public class DingTalkUtil {
req . setTitle ( zhiWei ) ;
req . setDeptIdList ( deptId ) ;
OapiV2UserCreateResponse rsp = client . execute ( req , access_token ) ;
System . out . println ( rsp . getBody ( ) ) ;
//System.out.println(rsp.getBody());
}
/ * *
@ -284,7 +284,7 @@ public class DingTalkUtil {
OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest ( ) ;
req . setUserid ( userId ) ;
OapiV2UserDeleteResponse rsp = client . execute ( req , access_token ) ;
System . out . println ( rsp . getBody ( ) ) ;
//System.out.println(rsp.getBody());
}
@ -300,16 +300,14 @@ public class DingTalkUtil {
return r . get ( "dingtalk_dept_id" ) ;
}
public static int getOrgIdByOrgName ( String org_name ) {
String sql = "select org_id,org_name from t_base_organization where org_name = ?" ;
Record record = Db . findFirst ( sql , org_name ) ;
int orgId = record . getInt ( "org_id" ) ;
return orgId ;
public static Record getOrgByOrgName ( String org_name ) {
String sql = "select org_id,org_name,sort_id from t_base_organization where org_name = ?" ;
return Db . findFirst ( sql , org_name ) ;
}
public static List < Record > getOrgList ( int orgId ) {
// 学校及学校下的部门
String sql = "select org_id,org_name,parent_id,sort_id,dingtalk_dept_id from t_base_organization where bureau_id=? order by org_id";
String sql = "select org_id,org_name,parent_id,sort_id,dingtalk_dept_id from t_base_organization where bureau_id=? and org_id<>bureau_id order by org_id";
List < Record > list = Db . find ( sql , orgId ) ;
return list ;
}
@ -342,4 +340,117 @@ public class DingTalkUtil {
writeDtDeptId ( orgId , String . valueOf ( dt_dept_id ) ) ;
}
}
public static JSONObject getDeptInfo ( String access_token , long deptId ) {
JSONObject jo ;
try {
DingTalkClient client = new DefaultDingTalkClient ( "https://oapi.dingtalk.com/topapi/v2/department/get" ) ;
OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest ( ) ;
req . setDeptId ( deptId ) ;
req . setLanguage ( "zh_CN" ) ;
OapiV2DepartmentGetResponse rsp = client . execute ( req , access_token ) ;
jo = JSONObject . parseObject ( rsp . getBody ( ) ) ;
} catch ( Exception err ) {
jo = JSONObject . parseObject ( err . toString ( ) ) ;
}
return jo ;
}
public static void syncOrg ( String accessToken , String orgName ) throws ApiException {
Record rOrg = getOrgByOrgName ( orgName ) ;
int bureauId = rOrg . getInt ( "org_id" ) ;
int sortId = rOrg . getInt ( "sort_id" ) ;
//获取部门信息
deptList . clear ( ) ;
//获取数据库中记录的钉钉端的dept_id,但不一定准确存在,需要继续判断一下
long DT_BureauId = getDtDeptId ( bureauId ) ;
JSONObject jRes = getDeptInfo ( accessToken , DT_BureauId ) ;
if ( jRes . getLong ( "errcode" ) > 0 ) {
DT_BureauId = createDept ( accessToken , orgName , 1 , sortId ) ;
writeDtDeptId ( bureauId , String . valueOf ( DT_BureauId ) ) ; //记得要回写
CommonUtil . Print ( "单位名称:" + orgName + "不存在!已创建!" ) ;
} else {
CommonUtil . Print ( "单位名称:" + orgName + "已存在,保留!" ) ;
}
//获取下属部门的列表
getDeptList ( accessToken , DT_BureauId ) ;
// 云平台->集合A,钉钉->集合B
// (1) x在A中存在, 在B中也存在, 内容也一致: 不处理
// (2) x在A中存在, 在B中也存在, 内容不一致: 更新处理
// (3) x在A中存在, 在B中不存在, 新增
// (4) x在A中不存在, 在B中存在, 删除
Set < Long > keysOfA = new HashSet < > ( ) ;
Map < Long , JSONObject > mapOfA = new HashMap < > ( ) ;
Set < Long > keysOfB = new HashSet < > ( ) ;
Map < Long , JSONObject > mapOfB = new HashMap < > ( ) ;
//A:钉钉
for ( int i = 0 ; i < deptList . size ( ) ; i + + ) {
long deptId = deptList . get ( i ) . getLong ( "dept_id" ) ;
String org_name = deptList . get ( i ) . getStr ( "name" ) ;
keysOfA . add ( deptId ) ;
JSONObject jo = new JSONObject ( ) ;
jo . put ( "org_name" , org_name ) ;
mapOfA . put ( deptId , jo ) ;
}
//B:云平台
List < Record > list = getOrgList ( bureauId ) ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) {
if ( list . get ( i ) . get ( "dingtalk_dept_id" ) ! = null ) {
long deptId = list . get ( i ) . getLong ( "dingtalk_dept_id" ) ;
String org_name = list . get ( i ) . getStr ( "org_name" ) ;
sortId = list . get ( i ) . getInt ( "sort_id" ) ;
int org_id = list . get ( i ) . getInt ( "org_id" ) ;
int parentId = list . get ( i ) . getInt ( "parent_id" ) ;
keysOfB . add ( deptId ) ;
JSONObject jo = new JSONObject ( ) ;
jo . put ( "org_id" , org_id ) ;
jo . put ( "org_name" , org_name ) ;
jo . put ( "sort_id" , sortId ) ;
jo . put ( "parent_id" , parentId ) ;
mapOfB . put ( deptId , jo ) ;
}
}
//在A不在B
for ( Long key : keysOfA ) {
if ( ! keysOfB . contains ( key ) ) {
// key只存在于A中
// 删除
CommonUtil . Print ( "发现钉钉中多出的dept_id:" + key + ",将删除掉..." ) ;
delDept ( accessToken , key ) ;
} else {
// key在A和B中都存在
String aName = mapOfA . get ( key ) . getString ( "org_name" ) ;
String bName = mapOfB . get ( key ) . getString ( "org_name" ) ;
int sId = mapOfB . get ( key ) . getInteger ( "sort_id" ) ;
if ( aName . equals ( bName ) ) {
CommonUtil . Print ( "发现钉钉与云平台间部门名称一致,不需要修改,aName=" + aName + ",bName=" + bName ) ;
continue ;
}
CommonUtil . Print ( "发现钉钉与云平台间部门名称不一致,将修改,aName=" + aName + ",bName=" + bName ) ;
updateDept ( accessToken , key , bName , sId ) ;
}
}
//在B不在A
for ( Long key : keysOfB ) {
if ( ! keysOfA . contains ( key ) ) {
// key只存在于B中
// 增加
String org_name = mapOfB . get ( key ) . getString ( "org_name" ) ;
System . out . println ( org_name ) ;
int sId = mapOfB . get ( key ) . getInteger ( "sort_id" ) ;
int parentId = mapOfB . get ( key ) . getInteger ( "parent_id" ) ;
int org_id = mapOfB . get ( key ) . getInteger ( "org_id" ) ;
//这个部门是在哪个部门下的
long dingTalkParentDeptId = getDtDeptId ( parentId ) ;
long dt_dept_id = createDept ( accessToken , org_name , dingTalkParentDeptId , sId ) ;
writeDtDeptId ( org_id , String . valueOf ( dt_dept_id ) ) ;
CommonUtil . Print ( "成功创建部门:" + org_name ) ;
}
}
}
}