跨平台同步树状结构目录
前言
为什么会涉及问题,得从最近接触的项目说起,需求一:公司的项目需求涉及关联钉钉及同步钉钉通讯录相关信息;需求二:同步其他平台树状目录信息。之前数据不是很多,就偷懒手动搞进去,后面发现数据量多了,手残党就不管用了,就必须想办法解决。
一、数据库字段
/** 示例 **/
id //主键
parent_id //父级id
buss_key // 其他平台目录关联key
parent_buss_key //其他平台目录关联父级key
思路:redis队列(leftpush 、rightpop)
将数据放入redis队列,循环从队列中pop数据,判断能否进行操作,能就插入数据库,不能则重新放进队列,将队列数据消耗完截止。
小插曲:在得到这个想法之前,想过类似于递归、栈等方式,由于学疏才浅,都未能将其一一实现,为了偷懒,就选用了上面这种最简单的方式。
二、代码
代码如下:
/**
* 同步钉钉通讯录(部门、用户)
* @param token 钉钉token
* @param departmentRoot 根部门信息
* @return
*/
public Boolean baseAddDingDepAndUser(String token,Department departmentRoot) {
redisUtil.set("real_dep" + "_" + departmentRoot.getDingDepId(), departmentRoot);
List<OapiDepartmentListResponse.Department> department = dingDingUtil.getDepartment(token);
Iterator<OapiDepartmentListResponse.Department> iterator = department.iterator();
while (iterator.hasNext()){
OapiDepartmentListResponse.Department next = iterator.next();
if (next.getParentid()== 1 ){
Department department2 = cosDingDepToDep(next, departmentRoot);
departmentService.save(department2);
redisUtil.set("real_dep"+"_"+next.getId(),department2);
continue;
}
redisUtil.RSet("dep",next);
}
Boolean is_going = true ;
Boolean is_going_save_user = true ;
while (is_going){
Object dep = redisUtil.lPop("dep");
if (oConvertUtils.isEmpty(dep)){
is_going= false ;
break;
}
OapiDepartmentListResponse.Department deps = JSONObject.parseObject(JSONObject.toJSONString(dep), OapiDepartmentListResponse.Department.class);
QueryWrapper<Department> queryWrapper1 = new QueryWrapper<Department>();
queryWrapper1.eq("ding_dep_id",deps.getParentid());
Department departmentParent = departmentService.getOne(queryWrapper1);
if (oConvertUtils.isEmpty(departmentParent)){
redisUtil.RSet("dep",deps);
}
/**
* 进行保存
*/
Department departmentChildren = cosDingDepToDep(deps, departmentParent);
boolean save = departmentService.save(departmentChildren);
/**
* 缓存
*/
redisUtil.set("real_dep" + "_" + departmentChildren.getDingDepId(), departmentChildren);
if (!save){
is_going_save_user = false ;
}
}
/**
* 同步用户
*/
if (is_going_save_user){
/**
* 加入根部门
*/
OapiDepartmentListResponse.Department department1 = new OapiDepartmentListResponse.Department();
department1.setId(1L);
department.add(department1);
Iterator<OapiDepartmentListResponse.Department> iterator1 = department.iterator();
while (iterator1.hasNext()){
OapiDepartmentListResponse.Department next = iterator1.next();
List<OapiUserListbypageResponse.Userlist> departmentUser = dingDingUtil.getDepartmentUser(0L, next.getId(), token);
Iterator<OapiUserListbypageResponse.Userlist> iteratorUser = departmentUser.iterator();
while (iteratorUser.hasNext()){
Object o = redisUtil.get("real_dep" + "_" + next.getId());
if (oConvertUtils.isNotEmpty(o)){
OapiUserListbypageResponse.Userlist nextUser = iteratorUser.next();
Department deps = JSONObject.parseObject(JSONObject.toJSONString(o), Department.class);
User user = costDingUserToUser(nextUser, deps);
/**
* 添加默认用户
*/
is_going_save_user = userService.save(user);
}
}
}
}
return is_going_save_user;
}
/**
* 钉钉User对象转换
* @param nextUser
* @param deps
* @return
*/
private User costDingUserToUser(OapiUserListbypageResponse.Userlist nextUser,Department deps ){
if (oConvertUtils.isEmpty(nextUser)){
return new User();
}
User user = new User();
user.setDepartmentId(deps.getId());
user.setDepartmentName(deps.getName());
user.setDingDepId(deps.getDingDepId());
user.setName(nextUser.getName());
user.setPhoneNumber(nextUser.getMobile());
user.setUsername(nextUser.getMobile());
user.setMailbox(nextUser.getEmail());
user.setPassword(defaultPassword);
user.setDingUserId(nextUser.getUserid());
user.setCreateTime(new Date());
user.setUserState(1);
return user;
}
/**
* 钉钉部门信息转换
* @param deps
* @param one2
* @return
*/
private Department cosDingDepToDep(OapiDepartmentListResponse.Department deps, Department one2) {
if (oConvertUtils.isEmpty(deps)){
return new Department();
}
Department department3= new Department();
department3.setParentName(one2.getName());
department3.setParentId(one2.getId());
department3.setDingDepId(deps.getId()+"");
department3.setDingDepParentId(one2.getDingDepId()+"");
department3.setName(deps.getName());
department3.setCreateTime(new Date());
department3.setOrderNumber(100);
department3.setDepartmentState(1);
return department3;
}