在做人岗架时,最初在需求拟定时,客户信誓旦旦的说一个用户只会属于一个部门的一个岗位,所以设计数据库如下:

同时也有用户角色关系表

角色表

以及用户码表。

仅仅隔了半年突然就出现了特殊情况,有多个部门多个岗位为一个用户的情况,主职和兼职的情况。用户唯一标识是手机号,用户也只有一个手机。

这样为了避免大改的情况就采用了二维数组(前面是部门ID,后面是岗位ID)的方式来处理多部门多岗位的情况。

 

 

处理这块代码如下:

String[][] roleIdsArray = userManageDTO.getRoleIds();
//二维数组转换
String[][] finalRoleIdsArray =  arrayTransform(roleIdsArray,userManageDTO.getOrganizationId());

 

 

private String[][] arrayTransform(String[][] roleIdsArray, long companyOrProjectId) {
    // 创建部门ID和岗位ID的映射表
    Map<Long, Long> deptIdMap = new HashMap<>();
    Map<Long, Long> postIdMap = new HashMap<>();

    // 遍历虚拟部门ID和虚拟岗位ID的二维数组
    for (String[] roleIds : roleIdsArray) {
        // 调用 virtualTrans 方法,将虚拟部门ID和虚拟岗位ID转化为实体部门ID和实体岗位ID
        long deptId = 0L; // 初始化为0
        deptId = virtualDeptTrans(Long.parseLong(roleIds[0]), companyOrProjectId);
        if(deptId==0L){
            continue;
        }
        long postId = virtualPostTrans(Long.parseLong(roleIds[1]), companyOrProjectId, deptId);

        // 将实体部门ID和实体岗位ID添加到映射表中
        deptIdMap.put(deptId, postId);
        postIdMap.put(postId, deptId);
    }

    // 将映射表转化为实体部门ID和实体岗位ID的二维数组
    String[][] entityRoleIdsArray = new String[postIdMap.size()][2];
    int i = 0;
    for (Map.Entry<Long, Long> entry : postIdMap.entrySet()) {
        entityRoleIdsArray[i][0] = entry.getValue().toString();
        entityRoleIdsArray[i][1] = entry.getKey().toString();
        i++;
    }

    return entityRoleIdsArray;
}

 

其它代码:

if(roleIds!=""&&roleIds!=null){
    //将二维数组转化为JSONArray对象
    JSONArray jsonArray = new JSONArray(roleIds);
    //定义新岗位id和部门idlist集合
    List<Long> postIdList = new ArrayList<>();
    List<Long> deptIdList = new ArrayList<>();
    //遍历JSONArray获取每个岗位id和部门id
    for (int i = 0; i < jsonArray.length(); i++) {
        JSONArray array = jsonArray.getJSONArray(i);
        for (int j = 0; j < array.length(); j++) {
            Long id = array.getLong(j);
            if (j == 0) {
                deptIdList.add(id);
            } else if (j == 1) {
                postIdList.add(id);
            }
        }
    }
    roleNames = dbRoleMapper.selectRolesByRoleIdList(postIdList)
            .stream().map(RoleDO::getRoleName).collect(Collectors.toList())
            .stream().collect(Collectors.joining(","));
    deptNames = dbDepartmentMapper.selectDepartDTOByIds(deptIdList)
            .stream().map(DbDepartmentDTO::getDeptName).collect(Collectors.toList())
            .stream().collect(Collectors.joining(","));
    //二维数组返给前端

}
这样就通过二维数组的方式解决了多部门多岗位的问题,而不需要改表结构。