Java——跨平台同步树状结构目录

跨平台同步树状结构目录


前言

为什么会涉及问题,得从最近接触的项目说起,需求一:公司的项目需求涉及关联钉钉及同步钉钉通讯录相关信息;需求二:同步其他平台树状目录信息。之前数据不是很多,就偷懒手动搞进去,后面发现数据量多了,手残党就不管用了,就必须想办法解决。


一、数据库字段

/** 示例 **/
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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值