• 【浙政钉】第二篇:获取浙政钉单位组织结构


    背景

    获取浙政钉组织架构、可以根据上架浙政钉应用的使用范围权限去对应获取组织结构。今天我以湖州市吴兴区为例来获取组织结构。

    目录

     一、准备工作

     二、创建组织结构表

    三、代码开发

    1.yml配置文件

    2.获取通讯录信息

    3.根据组织code获取组织详情

    4.获取下一级组织 Code 列表

    5.批量根据组织Code查询详情

    6.开始入库

    7.数据库数据


     一、准备工作

    1.【浙政钉】第一篇:企业内应用免登_郭老师的小迷弟雅思莫了的博客-CSDN博客

     二、创建组织结构表

    mysql创建表脚本

    1. SET NAMES utf8mb4;
    2. SET FOREIGN_KEY_CHECKS = 0;
    3. -- ----------------------------
    4. -- Table structure for t_zzd_organization
    5. -- ----------------------------
    6. DROP TABLE IF EXISTS `t_zzd_organization`;
    7. CREATE TABLE `t_zzd_organization` (
    8. `uuid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
    9. `organization_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织机构名称',
    10. `organization_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组织机构code',
    11. `parent_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上一级组织机构名称',
    12. `parent_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上一级组织机构code',
    13. `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态 A:有效 F:无效',
    14. PRIMARY KEY (`uuid`) USING BTREE
    15. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '浙政钉组织架构' ROW_FORMAT = Dynamic;
    16. SET FOREIGN_KEY_CHECKS = 1;

    三、代码开发

    1.yml配置文件

    1. #专有钉钉参数
    2. zzdingTalk :
    3. appKey : x-sBDVZNzCxxxxxxxx
    4. appSecret : xxxxxC01z99LU6S0ypc0x
    5. domainName : openplatform-pro.ding.zj.gov.cn
    6. protocal : https
    7. tenantId : 111111

    domainName:调用服务的域名

    服务端域名
    浙政钉
    openplatform-pro.ding.zj.gov.cn
    专有钉钉  openplatform.dg-work.cn

    专有钉钉是浙政钉测试环境,所以后期上线只需替换yml文件里参数即可。

    2.获取通讯录信息

    tenantId :为租户id,简单点说就是你登陆的账号id

    如何知道你的tenantId呢?你可以在【浙政钉】第一篇:企业内应用免登_郭老师的小迷弟雅思莫了的博客-CSDN博客查看。

    1. /***
    2. * 获取通讯录权限(组织架构)
    3. * @return
    4. * "content": {
    5. * "stripLineAddressEmployeeScopes": [],
    6. * "stripLineAddressScopes": [],
    7. * "userVisibleScopes": [],
    8. * "deptVisibleScopes": [
    9. * "GO_24b8c3d44dfxxxxxxxxx"
    10. * ]
    11. * }
    12. */
    13. public JSONObject getBookPermissions() {
    14. ExecutableClient executableClient = ExecutableClient.getInstance();
    15. executableClient.setDomainName(domainName);
    16. executableClient.setProtocal(protocal);
    17. executableClient.setAccessKey(appKey);
    18. executableClient.setSecretKey(appSecret);
    19. executableClient.init();
    20. String api = "/auth/scopesV2";
    21. PostClient postClient = executableClient.newPostClient(api);
    22. postClient.addParameter("tenantId", tenantId);
    23. String apiResult = postClient.post();
    24. log.info("获取浙政钉获取通讯录权限:{}", apiResult);
    25. JSONObject jsonObject = JSONObject.parseObject(apiResult);
    26. if (jsonObject.getBoolean("success")) {
    27. return jsonObject.getJSONObject("content");
    28. }
    29. return null;
    30. }
    log.info("获取浙政钉获取通讯录权限:{}", apiResult);
    
    1. {
    2. success: true,
    3. content:{
    4. "userVisibleScopes": ["人员编码1", "人员编码2"],
    5. "deptVisibleScopes": ["组织编码1", "组织编码2"],
    6. "stripLineAddressScopes": [
    7. {
    8. "domainCode": "条线通讯录code",
    9. "stripLineAddressCodes": ["条线通讯录节点编码1", "条线通讯录节点编码2"]
    10. }
    11. ],
    12. "stripLineAddressEmployeeScopes": [
    13. {
    14. "domainCode": "条线通讯录code",
    15. "employeeCodes": ["条线通讯录人员编码1", "条线通讯录人员编码2"]
    16. }
    17. ]
    18. },
    19. errorLevel:"",
    20. errorCode:"0",
    21. errorMsg:"success"
    22. }

    返回参数: 

    参数

    类型

    说明

    success

    Boolean

    是否调用成功

    responseCode

    String

    响应码。- 0:表示成功- 其他:表示失败

    responseMessage

    String

    响应信息

    deptVisibleScopes

    List

    企业授权的部门编码列表。返回值为授权部门编码的并集 (设置“全部员工”时,返回授权的部门编码为根部门ID,员工userid列表为空)

    userVisibleScopes

    List

    企业授权的员工编码列表。返回值为授权人员编码的并集。

    stripLineAddressScopes

    List

    授予的条线通讯录节点列表

    stripLineAddressEmployeeScopes

    List

    授予的条线通讯录人员列表

    3.根据组织code获取组织详情

    1. /***
    2. * 根据组织code获取组织详情
    3. * @param code
    4. * @return
    5. */
    6. public JSONObject getOrganizationByCode(String code) {
    7. ExecutableClient executableClient = ExecutableClient.getInstance();
    8. executableClient.setDomainName(domainName);
    9. executableClient.setProtocal(protocal);
    10. executableClient.setAccessKey(appKey);
    11. executableClient.setSecretKey(appSecret);
    12. executableClient.init();
    13. String api = "/mozi/organization/getOrganizationByCode";
    14. PostClient postClient = executableClient.newPostClient(api);
    15. postClient.addParameter("organizationCode", code);
    16. postClient.addParameter("tenantId", tenantId);
    17. String apiResult = postClient.post();
    18. log.info("获取浙政钉根据组织code获取组织详情:{}", apiResult);
    19. JSONObject jsonObject = JSONObject.parseObject(apiResult);
    20. if (jsonObject.getBoolean("success")) {
    21. return jsonObject.getJSONObject("content").getJSONObject("data");
    22. }
    23. return null;
    24. }

    返回信息:

    1. 成功返回案例
    2. {
    3. "success": true,
    4. "content": {
    5. "data": {
    6. "typeName": "虚节点",
    7. "organizationName": "余杭区",
    8. "typeCode": "GOV_HOLLOW_NODE",
    9. "gmtCreate": "2019-10-21 19:15:13",
    10. "parentName": "杭州市",
    11. "parentCode": "75",
    12. "organizationCode": "76",
    13. "status": "A", //A - 有效的数据, F - 无效的数据
    14. "responsibleEmployeeCodes":"GE_12j2hj33333ffff3e4r5tyhg5432wdv5|GE_1234hj33333ffff3e4r5tyhg5432wdv5",
    15. "displayOrder":"1",
    16. "businessStripCodes":"100|101",
    17. "address":"浙江省杭州市xxx",
    18. "contactEmployeeCode":"",
    19. "contactNumber":"",
    20. "divisionCode":"30000000000",
    21. "shortName":"",
    22. "institutionCode":"",
    23. "otherName":"",
    24. "postalCode":"",
    25. "remarks":"",
    26. "unifiedSocialCreditCode":"",
    27. "institutionLevelCode":"",
    28. "organizationExtProperties":[
    29. {
    30. "code":"ext_GOV_UNIT_fe789104",
    31. "type":"3",
    32. "value":[
    33. "1"
    34. ]
    35. },
    36. {
    37. "code":"ext_GOV_UNIT_ae789144",
    38. "type":"2",
    39. "value":[
    40. "1"
    41. ]
    42. },
    43. {
    44. "code":"ext_GOV_UNIT_3kr87wj3",
    45. "type":"0",
    46. "value":[
    47. "aa"
    48. ]
    49. }
    50. ]
    51. },
    52. "success": true,
    53. "requestId": "44c76830-8df1-4a42-8d4d-8f53d54387e3",
    54. "responseMessage": "OK",
    55. "responseCode": "0"
    56. }
    57. }

    4.获取下一级组织 Code 列表

    1. /***
    2. * 获取下一级组织 Code 列表
    3. * @param code
    4. * @return
    5. */
    6. public JSONObject getNextLevelOrganization(String code) {
    7. ExecutableClient executableClient = ExecutableClient.getInstance();
    8. executableClient.setDomainName(domainName);
    9. executableClient.setProtocal(protocal);
    10. executableClient.setAccessKey(appKey);
    11. executableClient.setSecretKey(appSecret);
    12. executableClient.init();
    13. String api = "/mozi/organization/pageSubOrganizationCodes";
    14. PostClient postClient = executableClient.newPostClient(api);
    15. postClient.addParameter("returnTotalSize", "true");
    16. postClient.addParameter("pageSize", "100");
    17. postClient.addParameter("organizationCode", code);
    18. postClient.addParameter("pageNo", "1");
    19. postClient.addParameter("status", "A");
    20. postClient.addParameter("tenantId", tenantId);
    21. String apiResult = postClient.post();
    22. log.info("获取浙政钉获取下一级组织 Code 列表:{}", apiResult);
    23. JSONObject jsonObject = JSONObject.parseObject(apiResult);
    24. if (jsonObject.getBoolean("success")) {
    25. return jsonObject.getJSONObject("content");
    26. }
    27. return null;
    28. }

    返回信息:

    1. 成功返回案例
    2. {
    3. "success": true,
    4. "content": {
    5. "totalSize": 2,
    6. "data": ["GE_f6757f0fe6c048dc9dd8f62fdf156aef",
    7. "GE_b5ec29b8c869419db1ac3fbba71983fb"],
    8. "success": true,
    9. "requestId": "f04d59de-ea7c-43fc-87b6-12b139cf64f3",
    10. "pageSize": 10,
    11. "responseMessage": "OK",
    12. "currentPage": 1,
    13. "responseCode": "0"
    14. }
    15. }

    5.批量根据组织Code查询详情

    1. /***
    2. * 批量根据组织Code查询详情
    3. * @param codes
    4. * @return
    5. */
    6. public JSONArray getListOrganizationsByCodes(List codes) {
    7. ExecutableClient executableClient = ExecutableClient.getInstance();
    8. executableClient.setDomainName(domainName);
    9. executableClient.setProtocal(protocal);
    10. executableClient.setAccessKey(appKey);
    11. executableClient.setSecretKey(appSecret);
    12. executableClient.init();
    13. IntelligentPostClient intelligentPostClient = executableClient.newIntelligentPostClient("/mozi/organization/listOrganizationsByCodes");
    14. OapiMoziOrganizationListOrganizationsByCodesRequest oapiMoziOrganizationListOrganizationsByCodesRequest = new OapiMoziOrganizationListOrganizationsByCodesRequest();
    15. oapiMoziOrganizationListOrganizationsByCodesRequest.setOrganizationCodes(codes);
    16. oapiMoziOrganizationListOrganizationsByCodesRequest.setTenantId(Long.valueOf(tenantId));
    17. //获取结果
    18. OapiMoziOrganizationListOrganizationsByCodesResponse apiResult = intelligentPostClient.post(oapiMoziOrganizationListOrganizationsByCodesRequest);
    19. log.info("获取浙政钉获取通讯录权限:{}", apiResult.getContent().getData());
    20. if (apiResult.getContent().getSuccess()) {
    21. return JSONArray.parseArray(apiResult.getContent().getData());
    22. }
    23. return null;
    24. }

    返回信息:

    1. 成功返回案例
    2. {
    3. "success": true,
    4. "content": {
    5. "data": [{
    6. "creator": "jianqin.ljq",
    7. "gmtModified": "2019-10-24 11:15:12",
    8. "typeName": "单位",
    9. "organizationName": "教育局",
    10. "modifier": "jianqin.ljq",
    11. "typeCode": "GOV_UNIT",
    12. "displayOrder": 0,
    13. "gmtCreate": "2019-10-24 11:15:12",
    14. "parentName": "杭州市",
    15. "parentCode": "75",
    16. "organizationCode": "75-1",
    17. "status": "A", //A - 有效的数据, F - 无效的数据
    18. "responsibleEmployeeCodes":"GE_12j2hj33333ffff3e4r5tyhg5432wdv5|GE_1234hj33333ffff3e4r5tyhg5432wdv5",
    19. "businessStripCodes":"100|101",
    20. "address":"浙江省杭州市xxx",
    21. "contactEmployeeCode":"",
    22. "contactNumber":"",
    23. "divisionCode":"30000000000",
    24. "shortName":"",
    25. "institutionCode":"",
    26. "otherName":"",
    27. "postalCode":"",
    28. "remarks":"",
    29. "unifiedSocialCreditCode":"",
    30. "institutionLevelCode":"",
    31. "institutionLevelCode":"",
    32. "organizationExtProperties":[
    33. {
    34. "code":"ext_GOV_UNIT_fe789104",
    35. "type":"3",
    36. "value":[
    37. "1"
    38. ]
    39. },
    40. {
    41. "code":"ext_GOV_UNIT_ae789144",
    42. "type":"2",
    43. "value":[
    44. "1"
    45. ]
    46. },
    47. {
    48. "code":"ext_GOV_UNIT_3kr87wj3",
    49. "type":"0",
    50. "value":[
    51. "aa"
    52. ]
    53. }
    54. ]
    55. }, {
    56. "creator": "jianqin.ljq",
    57. "gmtModified": "2019-10-24 11:17:41",
    58. "typeName": "单位",
    59. "organizationName": "民政局",
    60. "modifier": "jianqin.ljq",
    61. "typeCode": "GOV_UNIT",
    62. "displayOrder": 1,
    63. "gmtCreate": "2019-10-24 11:17:41",
    64. "parentName": "杭州市",
    65. "parentCode": "75",
    66. "organizationCode": "75-2",
    67. "status": "A",
    68. "responsibleEmployeeCodes":"GE_12j2hj33333ffff3e4r5tyhg5432wdv5|GE_1234hj33333ffff3e4r5tyhg5432wdv5",
    69. "businessStripCodes":"100|101",
    70. "address":"浙江省杭州市xxx",
    71. "contactEmployeeCode":"",
    72. "contactNumber":"",
    73. "divisionCode":"30000000000",
    74. "shortName":"",
    75. "institutionCode":"",
    76. "otherName":"",
    77. "postalCode":"",
    78. "remarks":"",
    79. "unifiedSocialCreditCode":"",
    80. "institutionLevelCode":"",
    81. "institutionLevelCode":"",
    82. "institutionNature":"",
    83. "institutionCategory":"",
    84. "organizationExtProperties":[
    85. {
    86. "code":"ext_GOV_UNIT_fe789104",
    87. "type":"3",
    88. "value":[
    89. "1"
    90. ]
    91. },
    92. {
    93. "code":"ext_GOV_UNIT_ae789144",
    94. "type":"2",
    95. "value":[
    96. "1"
    97. ]
    98. },
    99. {
    100. "code":"ext_GOV_UNIT_3kr87wj3",
    101. "type":"0",
    102. "value":[
    103. "aa"
    104. ]
    105. }
    106. ]
    107. }],
    108. "success": true,
    109. "requestId": "44c76830-8df1-4a42-8d4d-8f53d54387e3",
    110. "responseMessage": "OK",
    111. "responseCode": "0"
    112. }
    113. }

    6.开始入库

    1. /***
    2. * 获取下一级组织 Code 列表
    3. * deptVisibleScopes可能存在多个
    4. */
    5. public R getNextLevelInfo() {
    6. JSONObject jsonObject = getBookPermissions();
    7. if (jsonObject != null) {
    8. //获取组织code列表
    9. List codes = (List) jsonObject.get("deptVisibleScopes");
    10. if (!CollectionUtils.isEmpty(codes)) {
    11. codes.forEach(x -> {
    12. //获取本组织架构信息
    13. JSONObject data = getOrganizationByCode(x);
    14. if (data != null) {
    15. //保存父类组织架构
    16. ZzdOrganizationEntity entity = new ZzdOrganizationEntity();
    17. entity.setOrganizationCode(data.getString("organizationCode"));
    18. entity.setOrganizationName(data.getString("organizationName"));
    19. entity.setParentCode(data.getString("parentCode"));
    20. entity.setParentName(data.getString("parentName"));
    21. entity.setStatus(data.getString("status"));
    22. zzdOrganizationService.insertOrganizationInfo(entity);
    23. }
    24. //获取下一级组织架构信息
    25. JSONObject nextData = getNextLevelOrganization(x);
    26. if (nextData != null) {
    27. //获取到了下一级组织code
    28. List nextCodes = (List) nextData.get("data");
    29. JSONArray arrays = getListOrganizationsByCodes(nextCodes);
    30. if (arrays != null && arrays.size() > 0) {
    31. arrays.forEach(y -> {
    32. JSONObject jsInfo = (JSONObject) y;
    33. //保存组织架构
    34. ZzdOrganizationEntity entity = new ZzdOrganizationEntity();
    35. entity.setOrganizationCode(jsInfo.getString("organizationCode"));
    36. entity.setOrganizationName(jsInfo.getString("organizationName"));
    37. entity.setParentCode(jsInfo.getString("parentCode"));
    38. entity.setParentName(jsInfo.getString("parentName"));
    39. entity.setStatus(jsInfo.getString("status"));
    40. zzdOrganizationService.insertOrganizationInfo(entity);
    41. });
    42. }
    43. }
    44. });
    45. }
    46. }
    47. return R.ok();
    48. }

    附赠R实体类

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. /**
    4. *
    5. * @author zsb
    6. * @date 2017-8-10
    7. */
    8. public class R extends HashMap {
    9. private static final long serialVersionUID = 1L;
    10. public R() {
    11. put("code", 0);
    12. }
    13. public R(Integer code) {
    14. put("code", code);
    15. put("data", new HashMap());
    16. }
    17. public R(Integer code, String msg) {
    18. put("code", code);
    19. put("msg", msg);
    20. put("data", new HashMap());
    21. }
    22. public static R error() {
    23. return error(500, "未知异常,请联系管理员");
    24. }
    25. public static R errorDebug(String message) {
    26. return error(500, "未知异常 " + message + ",请联系管理员");
    27. }
    28. public static R error(String msg) {
    29. return error(500, msg);
    30. }
    31. public static R error(int code, String msg) {
    32. R r = new R();
    33. r.put("code", code);
    34. r.put("msg", msg);
    35. return r;
    36. }
    37. public R errorInfo(String msg) {
    38. this.put("errorMsg", msg);
    39. return this;
    40. }
    41. public static R ok(String msg) {
    42. R r = new R();
    43. r.put("msg", msg);
    44. r.put("data", new HashMap());
    45. return r;
    46. }
    47. public static R ok(Map map) {
    48. R r = new R();
    49. r.putAll(map);
    50. r.put("data", new HashMap());
    51. return r;
    52. }
    53. public static R ok() {
    54. return new R().put("msg", "success").put("data", new HashMap());
    55. }
    56. public static R ok(Integer size) {
    57. return new R().put("data", new HashMap((int)Math.round(size / 0.75)));
    58. }
    59. @Override
    60. public R put(String key, Object value) {
    61. super.put(key, value);
    62. return this;
    63. }
    64. /**
    65. * 添加返回结果数据
    66. *
    67. * @param key
    68. * @param value
    69. * @return
    70. */
    71. public R putData(String key, Object value) {
    72. Map map = (HashMap)this.get("data");
    73. map.put(key, value);
    74. return this;
    75. }
    76. }

    controller层:

    1. /***
    2. * 获取吴兴区浙政钉组织架构
    3. * @return
    4. */
    5. @ApiOperation(value = "获取吴兴区浙政钉组织架构")
    6. @RequestMapping(value = "/dingTalk/getNextLevelInfo", method = RequestMethod.GET)
    7. public ResponseEntity getNextLevelInfo() {
    8. return ResponseEntity.ok(dingTalkService.getNextLevelInfo());
    9. }

    7.数据库数据

  • 相关阅读:
    CLIP:多模态领域革命者
    pycharm的debug,你知道每个按钮对应哪个功能吗?
    输入框内禁止输入特殊字符
    Python+appium 自动化测试-Android 端环境配置
    必看:阿里云99元服务器原价续费,你肯定不知道!
    WPF margin属性学习
    Android Automotive概述
    2023鸿蒙预定未来,环境搭建学习
    rust 多线程
    k8s数据持久化,pv和pvc
  • 原文地址:https://blog.csdn.net/qq_23126581/article/details/126779512