---
title: "2.1 通讯录查询"
docId: "278716096998014976"
source: "https://weapp.eteams.cn/build/techdoc/wdoc/index.html#/public/repository/91f5067f-775e-48f4-93a2-ce84ca0b9c2e/doc/278716096998014976"
---
### 1. 通讯录查询前参数口子

- 二开标识
  
  ```string
  HRM_CONTACT_001
  ```
- 入参说明（Map<String, Object>，从request中获取 params）
  
  | 参数 | 类型 | 说明 |
  | --- | --- | --- |
  | key | string | 固定提供： tableParam 和 requestParam |
  | value | bean | 对应的参数信息 |

- tableParam参数说明（bean，自行转map）

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| orgContainChild | boolean | 机构条件是否含下级 |
| containExtra | boolean | 是否包含兼职 |
| onlyExtra | boolean | 是否仅兼职 |
| containUnavailable | boolean | 是否包含离职 |
| noneSuperior | boolean | 无上级 |
| noneAccount | boolean | 无账号 |
| superiorId | Long | 上级id |
| virtualId | Long | 维度id |
| pinyinIdx | String | 名称第一个字的首拼音 |
| sortSql | string | 排序sql[人员表前缀e,部门表前置d,分部表前置s],不需要添加order by |
| keywordSql | string | 快捷搜索sql [人员表前缀e] |
| hiddeSecondaryAccount | boolean | 隐藏次账号 |
| isExport |  | 是否是人员导出；这个一般是不可以修改，仅用作场景判断 |
| disableAppDetach | boolean | 是否禁用组织应用分权 |
| customSqlList | List<String> | 自定义sql; 其中 人员表的别名是e |

- requestParam参数说明（bean，自行转map）
  
  | 参数 | 类型 | 说明 |
  | --- | --- | --- |
  | tabKey |  | 来源: resource 联系人；myDepartment 同部门 |
  | keyword | string | 快捷搜索 |
  | isSearch | boolean | 是否快捷搜索或者高级搜索 |
  | init | boolean | 是否第一次加载；含微搜-搜索、通讯录菜单点击 |

- 返回参数说明（com.weaver.loom.context.domain.WeaHookResponse#setResult）
  
    - 必须提供HashMap，其中需要提供params作为key；value 也是一个hashmap；OA会根据params的内容按照tableParam支持的key覆盖到标准入参里面，然后进行查询
- 示例
  
  ```java
  
  // 以下是修改 快捷搜索的sql  和 取消应用分权控制的示例
  
  public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
          Map<String, Object> params = request.getParams();
  
          ObjectMapper objectMapper = new ObjectMapper() ;
          Map<String, Object> paramMap = objectMapper.convertValue(
                  params.get("params"), new TypeReference<Map<String, Object>>() {}
          );
          Map<String, Object> tableParam = (Map<String, Object>) paramMap.get("tableParam") ;
          Map<String, Object> requestParam = (Map<String, Object>) paramMap.get("requestParam") ;
          if(tableParam == null) return response ;
          if(requestParam == null) return response ;
  
           // 根据入参判断场景，然后返回想要修改的参数 -- 只会修改 tableParam的内容
  
          Map<String,Object> mergeMap = new HashMap<>() ;
  
          String keyword = Util.null2String(requestParam.get("keyword"));
          if(StringUtils.isNotBlank(keyword)){ // 自定义快捷搜索sql
              mergeMap.put("keywordSql"," ( e.username='"+keyword+"' or e.email='"+keyword+"' " +
                      "or e.formdata in (select FORM_DATA  from formdata_detail where CONTENT ='"+keyword+
                      "' AND TENANT_KEY ='tanqp4orog' and delete_type =0 )  ) ") ;
          }
  
          List<String> customSqlList = (List<String>) tableParam.computeIfAbsent("customSqlList", k -> new ArrayList<>());
          customSqlList.add(" e.user_id is not null ") ; // 无账号逻辑
          customSqlList.add(" e.username !='sysadmin'") ; // 过滤那些账号
  
          mergeMap.put("customSqlList",customSqlList) ; // 添加自定义sql
  
          HashMap<Object, Object> result = new HashMap<>();
          result.put("params",mergeMap) ;
          response.setResult(result);
          return response;
      }
  ```

- **备注说明：** 
  
    - requestParam 主要是前端api请求参数，入参中部分与tableParam相同，但是以tableParam为准，拦截后后面查询主要看tableParam参数内容

### 2. 通讯录返回值拦截

- 二开标识
  
  ```string
  HRM_CONTACT_002
  ```
- 入参说明（Map<String, Object>，从request中获取 params）
  
  | 参数 | 类型 | 说明 |
  | --- | --- | --- |
  | key | string | 固定提供： tableParam 和 columnList 、dataList |
  | value | bean | 对应的参数信息 |

- tableParam参数说明（bean，自行转map）

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| orgContainChild | boolean | 机构条件是否含下级 |
| containExtra | boolean | 是否包含兼职 |
| onlyExtra | boolean | 是否仅兼职 |
| containUnavailable | boolean | 是否包含离职 |
| noneSuperior | boolean | 无上级 |
| noneAccount | boolean | 无账号 |
| superiorId | Long | 上级id |
| virtualId | Long | 维度id |
| pinyinIdx | String | 名称第一个字的首拼音 |
| sortSql | string | 排序sql[人员表前缀e,部门表前置d,分部表前置s],不需要添加order by |
| keywordSql | string | 快捷搜索sql [人员表前缀e] |
| hiddeSecondaryAccount | boolean | 隐藏次账号 |
| isExport |  | 是否是人员导出；这个一般是不可以修改，仅用作场景判断 |
| disableAppDetach | boolean | 是否禁用组织应用分权 |
| customSqlList | List<String> | 自定义sql; 其中 人员表的别名是e |

- columnList参数说明（bean，自行转map）

| 参数 | 类型 | 说明 |
| --- | --- | --- |
| dataIndex | string | dataIndex |
| title | string | 标题 |
| width | string | 列宽 |

- dataList内容说明，具体看（/api/bs/hrm/contact/main/table）的返回的data里的data数据
- 返回参数说明（com.weaver.loom.context.domain.WeaHookResponse#setResult）
  
    - 必须提供HashMap，其中需要提供params作为key；value 也是一个hashmap；OA会根据params的内容按照tableParam支持的key覆盖到标准入参里面，然后进行查询
- 示例
  
  ```java
  
  // 以下是实现部门全路径显示列的示例
  public WeaHookResponse handle(WeaHookRequest request, WeaHookResponse response, AppInfo appInfo) throws Exception {
          Map<String, Object> params = request.getParams();
  
  
          Map<String, Object> paramMap = objectMapper.convertValue(
                  params.get("result"), new TypeReference<Map<String, Object>>() {
                  }
          );
          List<Map<String, Object>> columnList = (List<Map<String, Object>>) paramMap.get("columnList");
          // 判断是否 包含 部门全路径
          boolean isContainDeptFullPath = false;
          String dataIndex = "";
          for (Map<String, Object> column : columnList) {
              if ("allDepartmentPath".equals(column.get("title"))) {
                  isContainDeptFullPath = true;
                  dataIndex = (String) column.get("dataIndex");
                  break;
              }
          }
          if (!isContainDeptFullPath) {
              return response;
          }
          List<Map<String, Object>> dataList = (List<Map<String, Object>>) paramMap.get("dataList");
          String currentTenantKey = HrmContextUtil.getCurrentTenantKey();
  
          for (Map<String, Object> data : dataList) {
              // 获取人员全路径
              if (data.containsKey("department_id") && data.get("department_id") != null) {
                  Long departmentId = Long.valueOf(data.get("department_id").toString());
  
                  Map<Long, String> deptIdAndAllPathNameMap = HrmBrowserUtil.buildOrgPathName(Arrays.asList(departmentId), currentTenantKey,
                          new HrmOrgBrowserLevelConfig()
                                  .setLevelSeparator("/")
                                  .setLevelType(HrmOrgBrowserLevelType.allDepartmentPath)
                                  .setOrderType(FullPathOrderTypeEnum.DESC)
                                  .setTenantKey(currentTenantKey)
                  );
                  String allPathName = deptIdAndAllPathNameMap.get(departmentId);
                  data.put(dataIndex, allPathName);
              }
          }
  
          HashMap<Object, Object> result = new HashMap<>();
          result.put("dataList", dataList);
          response.setResult(ImmutableMapUtil.of("result", result));
          return response;
      }
  ```

- **备注说明：** 
  
    - requestParam 主要是前端api请求参数，入参中部分与tableParam相同，但是以tableParam为准，拦截后后面查询主要看tableParam参数内容
