1 - 组织同步

通过可视化配置,实现V8平台与多个三方异构系统间的组织人员同步。

1、概述

通过可视化配置,实现V8平台与多个三方异构系统间的组织人员同步。

2、集成模式优缺点对比分析

1736492391769

3、集成方向&模式

1.1 - V8同步至三方系统

集成模式

1.1.1 - COP提供增量查询OpenAPI(推荐)

COP提供增量查询OpenAPI,由三方异构系统定时调用OpenAPI,完成组织同步模式。

1、概述

COP提供增量查询OpenAPI,由三方异构系统定时调用OpenAPI,完成组织同步模式。

2、优缺点

a. 优点

  • COP集成压力小;

b. 缺点

  • 三方系统需要有一定的研发能力,按照COP平台接口要求完成接口调用和字段映射;
  • 数据时效性差,依赖定时拉取时间间隔。

3、集成配置步骤

序号 步骤名称 责任方 使用场景
1 提供组织增量查询接口规范和文档 致远 必须,包含接口定义、签名规则、字段来源等信息
2 API启用 致远 必须,只有启用的API才可以正常进行授权访问
3 新建接入应用 致远 必须,负责分配AppKey和APPSecret、配置访问授权、访问白名单等配置页
4 启用接入应用 致远 必须,未启用的接入应用,访问时会提示接入应用未启用
5 分配APPKey和APPSecret 致远 必须,接口签名核心字段
6 API授权 致远 必须,只有添加权限的额API接口才可以正常访问
7 导出接口文档 致远 非必须,导出所有已经启用的API手册
8 配置访问限流 致远 非必须,根据服务器资源性能,可以配置指定时间段内调用上线
9 配置访问白名单 致远 非必须,开启后,访问白名单之后的API请求将会被拦截
10 调用测试 三方系统 必须,根据平台提供的接口文档和必须字段,使用postmen等工具直接调用,验证网络连通性和信息准确性

4、接口目录

API分类 API名称 接口描述
组织信息查询/维护 根据条件分页查询组织详情 组织(机构+部门)
组织信息同步(基于编码) 根据组织编码查询组织详情 组织详情(机构+部门)
岗位信息查询/维护 根据条件分页查询岗位 岗位
职务信息查询/维护 根据条件分页查询职务 职务
职级信息查询/维护 根据条件分页查询职级 职级
人员信息查询/维护 根据条件查询人员信息 人员详情
人员及任职信息同步(基于编码) 分页查询组织下人员 人员&任职

4.1、接口文档在线查看位置

1720490441002

4.2、接口签名

4.2.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.2.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

5、接口清单

5.1、根据条件分页查询组织详情

请求地址

【接口请求地址前缀】/organization/base/unit/selectPageByConditions

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
pageInfo TRUE PageInfo 分页
pageNumber pageInfo TRUE int32 当前页数
pageSize pageInfo TRUE int32 每页记录数
pages pageInfo TRUE int32 总页数
total pageInfo TRUE int32 总记录数
needTotal pageInfo TRUE boolean 是否需要查询总记录数
params TRUE map 条件
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:ASC(ASC),DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime

请求参数示例

{
  "requestId": 1693208244841,
  "pageInfo": {
    "total": 0,
    "needTotal": "true",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
  "params": { "institutionId": -8572075675821718340},
  "timestamp": 1705902274910
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data PageData 组织信息详情分页列表
pageInfo data PageInfo 分页参数对象
pageNumber pageInfo int32 当前页数
pageSize pageInfo int32 每页记录数
pages pageInfo int32 总页数
total pageInfo int32 总记录数
needTotal pageInfo boolean 是否需要查询总记录数
content data array[OrgUnitDto] 数据集对象
id content int64 组织ID,新建时不必填,修改时必填
institutionId content int64 组织所属机构id。
如果是部门,就是所属机构id;
如果是机构,就是自己id(不作为入参保存)
name content string 组织名称
mnemonic content string 助记符
fullName content string 组织的全路径名称
shortName content string 组织简称
logo content string 图标
code content string 组织编号
type content enum 组织类型。
枚举项可选值列表:
NONE(空),
INSTITUTION(机构),
DEPARTMENT(部门),
OUTSIDE_INSTITUTION(外部(编外)单位),
OUTSIDE_DEPARTMENT(外部(编外)部门),
typeName content string 组织类型名称
parentId content int64 上级组织id
parentName content string 上级组织名称
parentCode content string 上级组织编号
parentUnit content OrgUnitDto 上级组织
firstLevelDepartment content OrgUnitDto 一级部门
parentUnitIdCode content string 上级组织ID(参照使用)(编号)
firstLevelDepartmentIdCode content string 一级部门ID(参照使用)(编号)
effectiveTime content date 生效日期,毫秒时间戳
invalidTime content date 失效日期,毫秒时间戳
path content string 全路径
orgLevel content int32 机构层级
sortId content int32 排序号
isEnable content boolean 状态
description content string 备注
authUserIds content string 授权用户ID集合,
只保存有效人员的id,过滤掉不符合的id
authUserNames content string 授权用户名称集合
businessId content int64 多维组织
orgUnitMetadataDto content OrgUnitMetadataDto 扩展字段
orgId orgUnitMetadataDto int64 组织id
createTime orgUnitMetadataDto date 创建时间,毫秒时间戳
updateTime orgUnitMetadataDto date 更新时间,毫秒时间戳
id orgUnitMetadataDto int64 字段ID
businessId orgUnitMetadataDto int64 业务组织id
createTime content date 创建时间
updateTime content date 更新时间
address content string 地址
officeNumber content string 电话
tax content string 税号
bankAccount content string 银行账号
bank content string 开户银行
isLegalEntity content boolean 是否法人实体
socialCreditCode content string 统一社会信用代码
legalPersonName content string 法定代表人姓名
legalCertificateNumber content string 法定代表人身份证号码
legalPhoneNumber content string 法定代表人手机号号码
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "pageInfo": {
            "pageNumber": 1,
            "pageSize": 20,
            "pages": 1,
            "total": 1,
            "needTotal": true
        },
        "content": [
            {
                "validate": true,
                "id": "-8572075675821718340",
                "institutionId": "-8572075675821718340",
                "name": "集成演示",
                "mnemonic": "jichengyanshi",
                "fullName": null,
                "shortName": "集成演示",
                "logo": null,
                "code": "aa202401190001",
                "type": "INSTITUTION",
                "typeName": null,
                "parentId": "-1730833917365171641",
                "parentName": null,
                "parentCode": "group",
                "parentUnit": null,
                "firstLevelDepartment": null,
                "parentUnitId": null,
                "firstLevelDepartmentId": null,
                "effectiveTime": 1705593600000,
                "invalidTime": 253402271999000,
                "path": "-1730833917365171641.-8572075675821718340",
                "orgLevel": 2,
                "sortId": 50500,
                "isEnable": true,
                "description": null,
                "authUserIds": null,
                "authUserNames": null,
                "businessId": "-5038278851089511626",
                "orgUnitMetadataDto": {
                    "validate": true,
                    "orgId": "-8572075675821718340",
                    "createTime": 1705658364820,
                    "updateTime": 1705658364820,
                    "id": "-468981164249889576",
                    "businessId": "-5038278851089511626"
                },
                "createTime": 1705658364723,
                "updateTime": 1705658364723,
                "address": null,
                "officeNumber": null,
                "tax": null,
                "bankAccount": null,
                "bank": null,
                "isLegalEntity": false,
                "socialCreditCode": null,
                "legalPersonName": null,
                "legalCertificateNumber": null,
                "legalPhoneNumber": null,
                "upperName1": "集成演示",
                "upperName2": "集成演示",
                "upperName3": "集成演示",
                "upperName4": "集成演示",
                "upperName5": "集成演示",
                "upperName6": "集成演示",
                "upperName7": "集成演示"
            }
        ]
    }
}

5.2、根据组织编码查询组织详情

请求地址

【接口请求地址前缀】/organization/unit/code

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE SearchUnitConditionApiDto 请求参数数据
codes data TRUE array[string] 组织编码
includeDisable data TRUE boolean 是否包含失效组织,默认不包含
effectiveTime data TRUE string 查询某个时间点时生效的组织,缺省为系统当前时间,
includeDisable为true的时候该字段不生效

请求参数示例

{
  "data": {
    "codes": [
      "aa202401190001"
    ],
    "effectiveTime": "2021-12-30",
    "includeDisable": "true"
  },
  "requestId":1705902274910,
  "notifyUrl": "",
  "timestamp":1705902274910
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data ListData 组织详情
content data array[OrgUnitDataDto] 数据集对象
name content string 组织名称
shortName content string 组织简称
code content string 组织编号
type content enum 组织类型。
枚举项可选值列表:
NONE(空),
INSTITUTION(机构),
DEPARTMENT(部门),
OUTSIDE_INSTITUTION(外部(编外)单位),
OUTSIDE_DEPARTMENT(外部(编外)部门),
parentCode content string 父组织Code,根节点不填
effectiveTime content string 生效日期
invalidTime content string 失效日期
sortId content int32 排序号
isEnable content boolean 状态
description content string 备注
metadataList content array[OrgMetadataValueDataDto] 自定义扩展属性数据
k metadataList string 扩展字段的名称
v metadataList string 扩展字段的的值
address content string 地址
officeNumber content string 电话
tax content string 税号
bankAccount content string 银行账号
bank content string 开户银行
isLegalEntity content boolean 是否法人实体
socialCreditCode content string 统一社会信用代码
legalPersonName content string 法定代表人姓名
legalCertificateNumber content string 法定代表人身份证号码
legalPhoneNumber content string 法定代表人手机号号码
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": [
            {
                "validate": true,
                "name": "集成演示",
                "shortName": "集成演示",
                "code": "aa202401190001",
                "type": "INSTITUTION",
                "parentCode": "group",
                "effectiveTime": "2024-01-19",
                "invalidTime": "9999-12-31",
                "sortId": 50500,
                "isEnable": true,
                "description": null,
                "businessId": "-5038278851089511626",
                "metadataList": [],
                "address": null,
                "officeNumber": null,
                "tax": null,
                "bankAccount": null,
                "bank": null,
                "isLegalEntity": false,
                "socialCreditCode": null,
                "legalPersonName": null,
                "legalCertificateNumber": null,
                "legalPhoneNumber": null,
                "createTime": 1705658364723,
                "updateTime": 1705658364723
            }
        ]
    }
}

5.3、根据条件分页查询岗位

请求地址

【接口请求地址前缀】/organization/base/post/selectPageByConditions

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
pageInfo TRUE PageInfo 分页
pageNumber pageInfo TRUE int32 当前页数
pageSize pageInfo TRUE int32 每页记录数
pages pageInfo TRUE int32 总页数
total pageInfo TRUE int32 总记录数
needTotal pageInfo TRUE boolean 是否需要查询总记录数
params TRUE map 条件
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:ASC(ASC),DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime

请求参数示例

{
  "requestId": 1705902275548,
  "pageInfo": {
    "total": 0,
    "needTotal": "false",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
  "params": {"isEnable":"true"},
  "timestamp": 1705902275548
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data PageData 岗位详情分页列表
pageInfo data PageInfo 分页参数对象
pageNumber pageInfo int32 当前页数
pageSize pageInfo int32 每页记录数
pages pageInfo int32 总页数
total pageInfo int32 总记录数
needTotal pageInfo boolean 是否需要查询总记录数
content data array[OrgPostDto] 数据集对象
id content int64 岗位ID
name content string 岗位名称
code content string 编号
type content int64 岗位分类的枚举id值
typeName content string 岗位分类的枚举名称
orgId content int64 所属组织
orgName content string 所属组织对应名称
category content enum 岗位分类。
枚举项可选值列表:
NONE(空),
BENCH_MARK(基准岗),
SELF_BUILT(自用岗),
masterOrgId content int64 来源组织id
masterOrgName content string 来源名称
masterPostId content int64 来源岗位id
masterName content string 基准岗名称
issuedRule content enum 使用范围。
枚举项可选值列表:
NONE(没有范围),
INSTITUTION(本机构),
INSTITUTIONS(本机构及下级机构),
ONLY_CHILDREN(仅下级机构),
SPECIFY_INSTITUTION(指定机构),
SPECIFY_INSTITUTIONS(指定机构及下级机构),
businessId content int64 所属业务线id
sortId content int32 排序号
isEnable content boolean 启用状态
description content string 备注
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "pageInfo": {
            "pageNumber": 1,
            "pageSize": 20,
            "pages": 0,
            "total": 0,
            "needTotal": false
        },
        "content": [
            {
                "validate": true,
                "id": "-5045874864559469310",
                "name": "岗位1",
                "code": "P202110280001",
                "type": "-4620025823759349735",
                "typeName": null,
                "orgId": "-1730833917365171641",
                "orgName": "致远互联",
                "category": "SELF_BUILT",
                "masterOrgId": "-1",
                "masterOrgName": "",
                "masterPostId": "-1",
                "masterName": "",
                "issuedRule": "NONE",
                "businessId": "158912402929426432",
                "sortId": 60,
                "isEnable": true,
                "description": "",
                "createTime": 1635385247000,
                "updateTime": 1635385247000
            },
            {
                "validate": true,
                "id": "7568497936381004239",
                "name": "dx岗位",
                "code": "xwAMtn29yK",
                "type": "6541964214010466245",
                "typeName": "技术类",
                "orgId": "-2740929138088457741",
                "orgName": "dx的机构1",
                "category": "BENCH_MARK",
                "masterOrgId": "-1730833917365171641",
                "masterOrgName": "",
                "masterPostId": "2693847020086313280",
                "masterName": "",
                "issuedRule": "NONE",
                "businessId": "158912402929426432",
                "sortId": 70,
                "isEnable": true,
                "description": "",
                "createTime": 1635386908000,
                "updateTime": 1703161499014
            }
        ]
    }
}

5.4、根据条件分页查询职务

请求地址

【接口请求地址前缀】/organization/base/job/selectPageByConditions

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
pageInfo TRUE PageInfo 分页
pageNumber pageInfo TRUE int32 当前页数
pageSize pageInfo TRUE int32 每页记录数
pages pageInfo TRUE int32 总页数
total pageInfo TRUE int32 总记录数
needTotal pageInfo TRUE boolean 是否需要查询总记录数
params TRUE map 条件
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:ASC(ASC),DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime

请求参数示例

{
  "requestId": "-3185185534174541324",
  "pageInfo": {
    "total": 0,
    "needTotal": "false",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
   "params": {"isEnable":"true"},
  "timestamp": {{timestamp}}
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data PageData 职务详情分页列表
pageInfo data PageInfo 分页参数对象
pageNumber pageInfo int32 当前页数
pageSize pageInfo int32 每页记录数
pages pageInfo int32 总页数
total pageInfo int32 总记录数
needTotal pageInfo boolean 是否需要查询总记录数
content data array[OrgJobDto] 数据集对象
id content int64 职务主表id
name content string 职务名称
code content string 编号
orgId content int64 组织id
businessId content int64 所属业务线id
category content enum 职务类型。枚举项可选值列表:
NONE(空),
BENCH_MARK(基准岗),
SELF_BUILT(自用岗),
masterOrgId content int64 来源组织id
masterOrgName content string 来源名称
masterJobId content int64 来源职务id
masterName content string 基准职务名称
issuedRule content enum 使用范围。枚举项可选值列表:
NONE(没有范围),
INSTITUTION(本机构),
INSTITUTIONS(本机构及下级机构),
ONLY_CHILDREN(仅下级机构),
SPECIFY_INSTITUTION(指定机构),
SPECIFY_INSTITUTIONS(指定机构及下级机构),
orgName content string 组织id对应的名称(不作为入参保存)
sortId content int32 排序号
isEnable content boolean 启用状态
description content string 备注
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "pageInfo": {
            "pageNumber": 1,
            "pageSize": 20,
            "pages": 0,
            "total": 0,
            "needTotal": false
        },
        "content": [
            {
                "validate": true,
                "id": "-1834341499691513847",
                "name": "PFJOB_1635933769253",
                "code": "PFJOB_1635933769253",
                "orgId": "-791902958315615749",
                "businessId": "158912402929426432",
                "category": "SELF_BUILT",
                "masterOrgId": "-1",
                "masterOrgName": "",
                "masterJobId": "-1",
                "masterName": "",
                "issuedRule": "NONE",
                "orgName": "",
                "sortId": 1,
                "isEnable": true,
                "description": "联系地址:北坞村路静芯园",
                "createTime": 1635933764000,
                "updateTime": 1635933770000
            },
            {
                "validate": true,
                "id": "-5262676242410946209",
                "name": "PFJOB_1635933767443",
                "code": "PFJOB_1635933767443",
                "orgId": "-8474839543092329115",
                "businessId": "158912402929426432",
                "category": "SELF_BUILT",
                "masterOrgId": "-1",
                "masterOrgName": "",
                "masterJobId": "-1",
                "masterName": "",
                "issuedRule": "NONE",
                "orgName": "",
                "sortId": 1,
                "isEnable": true,
                "description": "联系地址:北坞村路静芯园",
                "createTime": 1635933767000,
                "updateTime": 1635933767000
            }
        ]
    }
}

5.5、根据条件分页查询职级

请求地址

【接口请求地址前缀】/organization/base/level/selectPageByConditions

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
pageInfo TRUE PageInfo 分页
pageNumber pageInfo TRUE int32 当前页数
pageSize pageInfo TRUE int32 每页记录数
pages pageInfo TRUE int32 总页数
total pageInfo TRUE int32 总记录数
needTotal pageInfo TRUE boolean 是否需要查询总记录数
params TRUE map 条件
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:
ASC(ASC),
DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime

请求参数示例

{
  "requestId": "6230484731964183507",
  "pageInfo": {
    "total": 0,
    "needTotal": "false",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
  "params": {"isEnable":"true"},
  "timestamp":1705902275451
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data PageData 职级详情分页列表
pageInfo data PageInfo 分页参数对象
pageNumber pageInfo int32 当前页数
pageSize pageInfo int32 每页记录数
pages pageInfo int32 总页数
total pageInfo int32 总记录数
needTotal pageInfo boolean 是否需要查询总记录数
content data array[OrgLevelDto] 数据集对象
id content int64 职级ID
name content string 职级名称
code content string 编号
businessId content int64 所属业务线id
orgId content int64 组织id
levelSort content int32 序号
isEnable content boolean 启用状态
description content string 备注
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "pageInfo": {
            "pageNumber": 1,
            "pageSize": 20,
            "pages": 0,
            "total": 0,
            "needTotal": false
        },
        "content": [
            {
                "validate": true,
                "id": "9029437603602253763",
                "name": "测试职级",
                "code": "L202110270001",
                "businessId": "158912402929426432",
                "orgId": "-1730833917365171641",
                "levelSort": 10,
                "isEnable": true,
                "description": "",
                "createTime": 1635329898000,
                "updateTime": 1635329898000
            }
        ]
    }
}

5.6、根据条件查询人员信息

请求地址

【接口请求地址前缀】/organization/base/member/selectListByConditions

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
params TRUE map 条件
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:
ASC(ASC),
DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime

请求参数示例

{
  "requestId": "-6815387152900730785",
  "pageInfo": {
    "total": 0,
    "needTotal": "false",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
  "params": {
    "code": "aa202401190001",
    "memberType": "MEMBER"
  },
  "timestamp": 1705902274312
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data ListData 人员详情列表
content data array[OrgMemberDto] 数据集对象
id content int64 人员id,新建时不必填,修改时必填
thirdId content string 第三方唯一标识
name content string 姓名
defaultName content string 默认语种姓名
mnemonic content string 助记符
code content string 编号
image content string 头像id
gender content enum 性别。枚举项可选值列表:
NONE(空),
MALE(男),
FEMALE(女),
UN_KNOW(未知),
birthday content date 出生日期
phoneNumber content string 手机号码
officeNumber content string 工作电话
email content string 邮箱
effectiveTime content date 生效日期,毫秒时间戳
invalidTime content date 失效日期,毫秒时间戳
sortId content int32 排序号
isEnable content boolean 状态
description content string 备注
orgMemberPostDtoList content array[OrgMemberPostDto] 人员所有任职信息
id orgMemberPostDtoList int64 任职信息id
businessId orgMemberPostDtoList int64 业务组织id(缺省行政组织)
businessName orgMemberPostDtoList string 业务组织名称(缺省行政组织)
memberIdCode orgMemberPostDtoList string 人员id(编号)
memberName orgMemberPostDtoList string 人员名称
memberCode orgMemberPostDtoList string 人员编号
main orgMemberPostDtoList boolean 是否主岗
orgIdCode orgMemberPostDtoList string 所属组织(编号)
orgName orgMemberPostDtoList string 所属组织名称
orgCode orgMemberPostDtoList string 所属组织编号
fullName orgMemberPostDtoList string 组织全路径名称
path orgMemberPostDtoList string path
institutionIdCode orgMemberPostDtoList string 组织所属机构(编号)
institutionName orgMemberPostDtoList string 组织所属机构名称
institutionCode orgMemberPostDtoList string 组织所属机构编号
postIdCode orgMemberPostDtoList string 岗位(编号)
postName orgMemberPostDtoList string 岗位名称
postCode orgMemberPostDtoList string 岗位编号
levelIdCode orgMemberPostDtoList string 职级(编号)
levelName orgMemberPostDtoList string 职级名称
levelCode orgMemberPostDtoList string 职级编号
jobId orgMemberPostDtoList int64 职务
jobName orgMemberPostDtoList string 职务名称
jobCode orgMemberPostDtoList string 职务编号
effectiveTime orgMemberPostDtoList date 生效日期,毫秒时间戳
invalidTime orgMemberPostDtoList date 失效日期,毫秒时间戳
sortId orgMemberPostDtoList int32 排序号
topSortId orgMemberPostDtoList int32 优先排序顺序
isEnable orgMemberPostDtoList boolean 状态
effective orgMemberPostDtoList boolean 生效状态
edit orgMemberPostDtoList boolean 是否可编辑
createTime orgMemberPostDtoList date 创建时间,毫秒时间戳
updateTime orgMemberPostDtoList date 更新时间,毫秒时间戳
type orgMemberPostDtoList enum 账号类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
EXTERNAL_MEMBER(外部联系人),
memberType orgMemberPostDtoList enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
outsideInstitutionId orgMemberPostDtoList int64 人员所在外部单位
mainMemberPost content OrgMemberPostDto 人员主岗任职信息
id mainMemberPost int64 任职信息id
businessId mainMemberPost int64 业务组织id(缺省行政组织)
businessName mainMemberPost string 业务组织名称(缺省行政组织)
memberIdCode mainMemberPost string 人员id(编号)
memberName mainMemberPost string 人员名称
memberCode mainMemberPost string 人员编号
main mainMemberPost boolean 是否主岗
orgIdCode mainMemberPost string 所属组织(编号)
orgName mainMemberPost string 所属组织名称
orgCode mainMemberPost string 所属组织编号
fullName mainMemberPost string 组织全路径名称
path mainMemberPost string path
institutionIdCode mainMemberPost string 组织所属机构(编号)
institutionName mainMemberPost string 组织所属机构名称
institutionCode mainMemberPost string 组织所属机构编号
postIdCode mainMemberPost string 岗位(编号)
postName mainMemberPost string 岗位名称
postCode mainMemberPost string 岗位编号
levelIdCode mainMemberPost string 职级(编号)
levelName mainMemberPost string 职级名称
levelCode mainMemberPost string 职级编号
jobId mainMemberPost int64 职务
jobName mainMemberPost string 职务名称
jobCode mainMemberPost string 职务编号
effectiveTime mainMemberPost date 生效日期,毫秒时间戳
invalidTime mainMemberPost date 失效日期,毫秒时间戳
sortId mainMemberPost int32 排序号
topSortId mainMemberPost int32 优先排序顺序
isEnable mainMemberPost boolean 状态
effective mainMemberPost boolean 生效状态
edit mainMemberPost boolean 是否可编辑
createTime mainMemberPost date 创建时间,毫秒时间戳
updateTime mainMemberPost date 更新时间,毫秒时间戳
type mainMemberPost enum 账号类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
EXTERNAL_MEMBER(外部联系人),
memberType mainMemberPost enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
outsideInstitutionId mainMemberPost int64 人员所在外部单位
mainMemberPostId content int64 人员主岗任职Id信息
orgMemberMetadataDto content OrgMemberMetadataDto 扩展字段
memberId orgMemberMetadataDto int64 人员id
createTime orgMemberMetadataDto date 创建时间,毫秒时间戳
updateTime orgMemberMetadataDto date 更新时间,毫秒时间戳
id orgMemberMetadataDto int64 字段ID
businessId orgMemberMetadataDto int64 业务组织id
loginName content string 用户名
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
certificateType content int64 证件类型
certificateNumber content string 证件号码
entryDate content date 入职日期
bankAccount content string 银行账号
bank content string 开户银行
bankOutlets content string 开户网点
memberType content enum 人员类型。
枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
pinyinShort content string 简拼
nickName content string 昵称
orgName content string 主部门名称
postName content string 主岗位名称
jobName content string 主职务名称
levelName content string 主职级名称
naturalMemberType content int64 外部个人用户类型
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": [
            {
                "validate": true,
                "id": "3428073205378313571",
                "thirdId": null,
                "name": "V5-韩聚江",
                "defaultName": "V5-韩聚江",
                "mnemonic": "V5-hanjujiang",
                "code": "17301103865",
                "image": null,
                "gender": "UN_KNOW",
                "birthday": null,
                "phoneNumber": "17301103865",
                "officeNumber": null,
                "email": "",
                "effectiveTime": 1703520000000,
                "invalidTime": 253402271999000,
                "sortId": 1,
                "isEnable": true,
                "description": null,
                "orgMemberPostDtoList": [
                    {
                        "validate": true,
                        "id": "5994200321357481820",
                        "businessId": "-5038278851089511626",
                        "businessName": null,
                        "memberName": null,
                        "memberCode": null,
                        "main": true,
                        "orgName": "集成演示",
                        "orgCode": "aa202401190001",
                        "fullName": "致远互联/集成演示",
                        "path": null,
                        "institutionName": null,
                        "institutionCode": null,
                        "postName": "集团基准岗位",
                        "postCode": "P202309080001",
                        "levelName": "经理级",
                        "levelCode": "M1",
                        "jobId": "-1",
                        "jobName": null,
                        "jobCode": null,
                        "effectiveTime": 1703520000000,
                        "invalidTime": 253402271999000,
                        "sortId": 1,
                        "topSortId": 0,
                        "isEnable": true,
                        "effective": null,
                        "edit": null,
                        "createTime": 1703557326026,
                        "updateTime": 1705658413047,
                        "type": "MEMBER",
                        "memberType": "MEMBER",
                        "outsideInstitutionId": "-1",
                        "memberIdCode": "17301103865",
                        "orgIdCode": "aa202401190001",
                        "institutionIdCode": "aa202401190001",
                        "postIdCode": "P202309080001",
                        "levelIdCode": "M1"
                    }
                ],
                "mainMemberPost": {
                    "validate": true,
                    "id": "5994200321357481820",
                    "businessId": "-5038278851089511626",
                    "businessName": null,
                    "memberName": null,
                    "memberCode": null,
                    "main": true,
                    "orgName": "集成演示",
                    "orgCode": "aa202401190001",
                    "fullName": "致远互联/集成演示",
                    "path": null,
                    "institutionName": null,
                    "institutionCode": null,
                    "postName": "集团基准岗位",
                    "postCode": "P202309080001",
                    "levelName": "经理级",
                    "levelCode": "M1",
                    "jobId": "-1",
                    "jobName": null,
                    "jobCode": null,
                    "effectiveTime": 1703520000000,
                    "invalidTime": 253402271999000,
                    "sortId": 1,
                    "topSortId": 0,
                    "isEnable": true,
                    "effective": null,
                    "edit": null,
                    "createTime": 1703557326026,
                    "updateTime": 1705658413047,
                    "type": "MEMBER",
                    "memberType": "MEMBER",
                    "outsideInstitutionId": "-1",
                    "memberIdCode": "17301103865",
                    "orgIdCode": "aa202401190001",
                    "institutionIdCode": "aa202401190001",
                    "postIdCode": "P202309080001",
                    "levelIdCode": "M1"
                },
                "mainMemberPostId": "5994200321357481820",
                "orgMemberMetadataDto": {
                    "validate": true,
                    "id": "8947821149131146285",
                    "businessId": null,
                    "extAttr1": "",
                    "extAttr2": null,
                    "extAttr3": "17301103865",
                    "extAttr4": null,
                    "extAttr5": "V5-韩聚江",
                    "extAttr6": "17301103865",
                    "extAttr7": null,
                    "extAttr8": null,
                    "extAttr9": null,
                    "extAttr10": null,
                    "memberId": "3428073205378313571",
                    "createTime": 1703557324415,
                    "updateTime": 1705658413129
                },
                "loginName": "17301103865",
                "createTime": 1703557324142,
                "updateTime": 1705658413004,
                "certificateType": null,
                "certificateNumber": null,
                "entryDate": null,
                "bankAccount": null,
                "bank": null,
                "bankOutlets": null,
                "memberType": "MEMBER",
                "pinyinShort": "V5-hjj",
                "nickName": null,
                "orgName": "集成演示",
                "postName": "集团基准岗位",
                "jobName": null,
                "levelName": "经理级",
                "naturalMemberType": null
            }
        ]
    }
}

5.7、分页查询组织下人员

请求地址

【接口请求地址前缀】/organization/unit/members

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;

最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl TRUE string 异步回调URL。如果此参数非空,
表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。
params TRUE SearchMemberApiDto 泛型参数对象
code params TRUE string 组织code
includeChild params TRUE boolean 是否包含下级
effectiveTime params TRUE string 人员生效时间,缺省系统当前时间,
配置了搜索开始/结束时间,该值不生效
startTime params TRUE string 搜索开始时间
endTime params TRUE string 搜索结束时间
includeDisable params TRUE boolean 是否包含失效人员,默认不包含
memberType params TRUE enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
sort TRUE Sort 排序
orders sort TRUE array[Sort$Order] 排序
direction orders TRUE enum 顺序,可用值:ASC,DESC。
枚举项可选值列表:ASC(ASC),DESC(DESC),
property orders TRUE string 字段,可用值:DTO属性(请参照"响应参数"中content),
createTime,updateTime
pageInfo TRUE PageInfo 分页
pageNumber pageInfo TRUE int32 当前页数
pageSize pageInfo TRUE int32 每页记录数
pages pageInfo TRUE int32 总页数
total pageInfo TRUE int32 总记录数
needTotal pageInfo TRUE boolean 是否需要查询总记录数

请求参数示例

{
  "requestId": "-6815387152900730785",
  "pageInfo": {
    "total": 0,
    "needTotal": "false",
    "pageNumber": 1,
    "pages": 0,
    "pageSize": 20
  },
  "notifyUrl": "",
  "sort": {
    "orders": [
      {
        "property": "createTime",
        "direction": "ASC"
      }
    ]
  },
  "params": {
    "code": "aa202401190001",
    "memberType": "MEMBER"
  },
  "timestamp": 1705902274312
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data PageData 人员信息分页列表
pageInfo data PageInfo 分页参数对象
pageNumber pageInfo int32 当前页数
pageSize pageInfo int32 每页记录数
pages pageInfo int32 总页数
total pageInfo int32 总记录数
needTotal pageInfo boolean 是否需要查询总记录数
content data array[OrgMemberDataDto] 数据集对象
thirdId content string 第三方唯一标识
name content string 姓名
code content string 编号
username content string 用户名
gender content enum 性别。枚举项可选值列表:
NONE(空),
MALE(男),
FEMALE(女),
UN_KNOW(未知),
birthday content string 出生日期
phoneNumber content string 手机号码
officeNumber content string 工作电话
email content string 邮箱
effectiveTime content string 生效日期
invalidTime content string 失效日期
sortId content int32 排序号
isEnable content boolean 状态
description content string 备注
memberPosts content array[OrgMemberPostDataDto] 人员的任职信息
main memberPosts boolean 是否主岗
unitCode memberPosts string 组织编码
postCode memberPosts string 岗位编码(内部人员必填)
levelCode memberPosts string 职级编码
jobCode memberPosts string 职务编码
effectiveTime memberPosts string 生效日期
invalidTime memberPosts string 失效日期
sortId memberPosts int32 排序号
topSortId memberPosts int32 优先置顶排序
isEnable memberPosts boolean 状态
memberType memberPosts enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
metadataList content array[OrgMetadataValueDataDto] 自定义扩展属性数据
k metadataList string 扩展字段的名称
v metadataList string 扩展字段的的值
certificateType content string 证件类型
certificateNumber content string 证件号码
entryDate content string 入职日期
bankAccount content string 银行账号
bank content string 开户银行
bankOutlets content string 开户网点
image content string 头像路径
memberType content enum 人员类型。枚举项可选值列表:
NONE(空),MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
createTime content date 创建时间,毫秒时间戳
updateTime content date 更新时间,毫秒时间戳
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "pageInfo": {
            "pageNumber": 1,
            "pageSize": 20,
            "pages": 1,
            "total": 2,
            "needTotal": false
        },
        "content": [
            {
                "validate": true,
                "thirdId": null,
                "name": "V5-韩聚江",
                "code": "17301103865",
                "username": "17301103865",
                "gender": "UN_KNOW",
                "birthday": null,
                "phoneNumber": "17301103865",
                "officeNumber": null,
                "email": "",
                "effectiveTime": "2023-12-26",
                "invalidTime": "9999-12-31",
                "sortId": 1,
                "isEnable": true,
                "description": null,
                "memberPosts": [
                    {
                        "validate": true,
                        "main": true,
                        "businessId": "administrative",
                        "unitCode": "aa202401190001",
                        "postCode": "P202309080001",
                        "levelCode": "M1",
                        "jobCode": "",
                        "effectiveTime": "2023-12-26",
                        "invalidTime": "9999-12-31",
                        "sortId": 1,
                        "topSortId": 0,
                        "isEnable": true,
                        "memberType": "MEMBER"
                    }
                ],
                "metadataList": null,
                "certificateType": null,
                "certificateNumber": null,
                "entryDate": null,
                "bankAccount": null,
                "bank": null,
                "bankOutlets": null,
                "image": null,
                "memberType": "MEMBER",
                "createTime": 1703557324142,
                "updateTime": 1705658413004
            },
            {
                "validate": true,
                "thirdId": null,
                "name": "韩聚江",
                "code": "MD80002724",
                "username": "15131872776",
                "gender": "MALE",
                "birthday": null,
                "phoneNumber": "15131872776",
                "officeNumber": null,
                "email": null,
                "effectiveTime": "2024-01-19",
                "invalidTime": "9999-12-31",
                "sortId": 50430,
                "isEnable": true,
                "description": null,
                "memberPosts": [
                    {
                        "validate": true,
                        "main": true,
                        "businessId": "administrative",
                        "unitCode": "aa202401190001",
                        "postCode": "P202206150020",
                        "levelCode": "M1",
                        "jobCode": "",
                        "effectiveTime": "2024-01-19",
                        "invalidTime": "9999-12-31",
                        "sortId": 50430,
                        "topSortId": 0,
                        "isEnable": true,
                        "memberType": "MEMBER"
                    }
                ],
                "metadataList": null,
                "certificateType": "861893055660261888",
                "certificateNumber": null,
                "entryDate": null,
                "bankAccount": null,
                "bank": null,
                "bankOutlets": null,
                "image": null,
                "memberType": "MEMBER",
                "createTime": 1705642397823,
                "updateTime": 1705658448012
            }
        ]
    }
}

6、注意事项

为了三方系统更快集成,建议每个三方系统提供postmen调用示例,这样可以极大的节省集成联调周期。

1.1.2 - 三方系统提供写入OpenAPI

三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成组织同步模式。

1、概述

COP负责新建、编辑、启停等组织数据维护,三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成组织同步模式。

2、优缺点

a. 优点

i. 三方系统集成压力小;

ii. 通过事件订阅触发数据同步,数据时效性高;

b. 缺点

i. 实施团队需要了解三方系统接口字段要求和数据用途;

ii. 实施团队需要了解COP平台字段要求和用途;

iii. 实施团队需要配置字段映射;

iv. 每增加一个三方系统,就需要重新配置一遍一下步骤;

3、操作步骤

序号 步骤名称 责任方 使用场景
1 提供组织增量写入接口规范和文档 三方系统 必须,
2 注册并配置鉴权AppID和秘钥 三方系统 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要提供
3 提供接口调用示例 三方系统 必须,为了集成效率,
强烈建议三方系统提供可直接使用的postman接口调用示例,
4 新建三方集成应用 致远 必须,三方集成应用负责封装三方系统接口和配置数据映射
5 发布启用三方集成应用 致远 必须,三方集成应用只有发布后才能正常使用
6 封装安全认证 致远 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要配置安全认证
7 接口封装 致远 必须,三方系统提供的接口只有正常封装后才能供给COP使用
8 在线调试验证 致远 必须,三方系统接口封装完成后,需要在线调试,验证网络通信、
接口返回结果是否正确等
9 启用组织同步 致远 必须,主动推送场景中,字段映射、同步周期需要在基础集成中配置
10 配置同步内容 致远 必须,本场景下固定选择模式为:从三方系统获取
11 配置同步周期 致远 必须,根据数据量和服务器消费能力,合理配置同步周期
12 配置字段映射 致远 必须:三方系统接口文档中的字段名,字段释义与COP不一致,
需要配置参数映射、层级转换等
13 使用日志 致远 必须,配置完成并启用后,查看使用日志

4、 集成配置步骤

4.1、 新建三方集成应用

1720577772586

4.2、 发布启用三方集成应用

1720577778838

4.3、 封装安全认证

1720577785293

1720577791255

4.4、 枚举定义

1720577798040

4.5、 接口封装

1720577803045

1720577809284

1720577814794

1720577821105

1720577827141

1720577832287

1720577837929

4.6、 在线调试验证

1720577846536

1720577853174

4.7、 启用组织同步

1720577859417

4.8、 配置同步内容

1720577865174

1720577874631

1720577880163

4.9、 配置同步周期

1720577889066

4.10、 使用日志

1720577894429

5、 注意事项

5.1、 当三方系统需要的数据维度较COP更加丰富时,可以通过集成扩展-微流程编排实现;

1.1.3 - 事件订阅

COP开放事件,三方异构系统订阅事件,完成组织同步模式。

1、概述

COP开放事件,三方异构系统订阅事件,完成组织同步模式。

2、事件清单

事件名称 事件标识 返回数据类型 描述
更新职务 organization.job.update JSON 更新职务
更新组织 organization.unit.update JSON 更新组织
更新职级 organization.level.update JSON 更新职级
创建组织 organization.unit.create JSON 创建组织
创建人员 organization.member.create JSON 创建人员
创建岗位 organization.post.create JSON 创建岗位
更新岗位 organization.post.update JSON 更新岗位
创建职务 organization.job.create JSON 创建职务
更新人员 organization.member.update JSON 更新人员
创建职级 organization.level.create JSON 创建职级

3、订阅说明

收到事件通知请求后,需要返回200HTTP响应。其余响应码表示失败,开放平台会自动重发。重发的间隔越来越长,最多尝试10次。事件通知数据使用application/json格式发送。 事件通知的HTTP请求头中,包含回调令牌(需在接入应用的事件订阅中配置开启,默认不开启),用于接入应用验证事件来源。

若开启加密因子(需在接入应用的事件订阅中配置开启,默认不开启),将对事件通知的JSON内容进行加密,只有一个属性encrypt,需要进行解密处理。

4、解密示例

 @SuppressWarnings("rawtypes")
    @PostMapping("open-event-map")
    @ResponseBody
    public String openEventCallBack(HttpServletRequest request, @RequestBody Map map) {
      // 事件发生时间
      String createTime = request.getHeader("createTime");
      // 事件的流水号
      String eventId = request.getHeader("eventId");
      // 如果订阅事件时设置了回调token,可以获取token进行校验
      String eventToken = request.getHeader("eventToken");
      if (!OpenApiGlobalConfig.EVENT_CALL_BACK_TOKEN.equals(eventToken)) {
        System.err.println("token不匹配,这是非法的请求!");
        return "error";
      }
      // eventName:事件名称,解码处理
      try {
        String eventName = URLDecoder.decode(request.getHeader("eventName"), StandardCharsets.UTF_8.displayName());
        System.err.println("收到事件:" + eventName);
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      // 事件标识,可以用此字段区分是什么事件发生了
      String eventKey = request.getHeader("eventKey");
      if (!"".equals(OpenApiGlobalConfig.EVENT_CALL_BACK_KEY)) {
        // 如果设置了加密key,那么返回的数据是加密的,需要解密。加解密算法是AES算法。
        String encryptContent = (String) map.get("encrypt");
        String realContent = OpenApiClient.decrypt(encryptContent, OpenApiGlobalConfig.EVENT_CALL_BACK_KEY);
        System.err.println("原始的JSON数据是:" + realContent);
        // 拿到原始的json串以后,可以json串转map或者转对应的DTO,继续处理
        Map dataMap = OpenApiUtil.fromJson(realContent, Map.class);
        // 后续处理
        System.err.println("事件真实数据:" + dataMap);
      } else {
        // 如果没有配置加密,那么是明文传输的,收到的Map就是真实的数据
        Map dataMap = map;
        // 后续处理
        System.err.println("事件真实数据:" + dataMap);
      }
      return "OK";
    }

5、事件消息体

5.1、更新职务

参数名称 参数类型 参数描述
更新职务消息 OrgJobUpdateMessage
jobId int64 职务id
code string 职务编号
orgId int64 所属组织
isEnable boolean 状态
oldCode string 更新前职务编号
oldOrgId int64 更新前所属组织
oldIsEnable boolean 更新前状态
eventKey string 消息标识

5.2、更新组织

参数名称 参数类型 参数描述
更新组织消息体 OrgUnitUpdateMessage
type enum 组织类型。枚举项可选值列表:
NONE(空),
INSTITUTION(机构),
DEPARTMENT(部门),
OUTSIDE_INSTITUTION(外部(编外)单位),
OUTSIDE_DEPARTMENT(外部(编外)部门),
orgId int64 组织id
oldOrgName string 组织名称
orgName string 组织名称
oldParentId int64 原上级id
parentId int64 上级id
oldIsEnable boolean 原状态
isEnable boolean 状态
oldEffectiveTime date 原生效日期
effectiveTime date 生效日期
oldInvalidTime date 原失效日期
invalidTime date 失效日期
eventKey string 消息标识

5.3、更新职级

参数名称 参数类型 参数描述
更新职级消息 OrgLevelUpdateMessage
levelId int64 职级id
code string 职级编号
levelSort int32 职级序号
isEnable boolean 状态
oldCode string 职级编号
oldLevelSort int32 更新前职级序号
oldIsEnable boolean 更新前状态
eventKey string 消息标识

5.4、创建组织

参数名称 参数类型 参数描述
创建组织消息体 OrgUnitCreateMessage
orgId int64 组织id
orgName string 组织名称
parentId int64 上级id
type enum 组织类型。枚举项可选值列表:
NONE(空),
INSTITUTION(机构),
DEPARTMENT(部门),
OUTSIDE_INSTITUTION(外部(编外)单位),
OUTSIDE_DEPARTMENT(外部(编外)部门),
isEnable boolean 状态
effectiveTime date 生效日期
invalidTime date 失效日期
eventKey string 消息标识

5.5、创建人员

数名称 参数类型 参数描述
创建人员消息体 OrgMemberMessage
memberId int64 人员id
name string 姓名
phoneNumber string 手机号
email string 邮箱
type enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
image string 头像
orgId int64 主岗组织id
orgName string 主岗组织名称
orgIds array[int64] 主岗所属机构id
isEnable boolean 启用状态
effectiveTime date 生效日期
invalidTime date 失效日期
eventKey string 消息标识
memberPostList array[OrgMemberPostBaseDto] 任职信息
id int64 任职id
main boolean 是否主岗
orgId int64 组织id
postId int64 岗位id
levelId int64 职级id
jobId int64 职务id
sortId int32 排序号
isEnable boolean 状态
effectiveTime date 生效日期,毫秒时间戳
invalidTime date 失效日期,毫秒时间戳

5.6、创建岗位

参数名称 参数类型 参数描述
创建岗位消息 OrgPostCreateMessage
postId int64 岗位id
code string 岗位编号
orgId int64 所属组织
isEnable boolean 状态
eventKey string 消息标识

5.7、更新岗位

参数名称 参数类型 参数描述
更新岗位消息 OrgPostUpdateMessage
postId int64 岗位id
code string 岗位编号
orgId int64 所属组织
isEnable boolean 状态
oldCode string 更新前岗位编号
oldOrgId int64 更新前所属组织
oldIsEnable boolean 更新前状态
eventKey string 消息标识

5.8、创建职务

参数名称 参数类型 参数描述
创建职务消息 OrgJobCreateMessage
jobId int64 职务id
code string 职务编号
orgId int64 所属组织
isEnable boolean 状态
eventKey string 消息标识

5.9、更新人员

参数名称 参数类型 参数描述
更新人员消息体 OrgUpdateMemberMessage
memberId int64 人员id
name string 姓名
phoneNumber string 手机号
email string 邮箱
type enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
image string 头像
orgId int64 主岗组织id
orgName string 主岗组织名称
orgIds array[int64] 主岗所属机构id
isEnable boolean 启用状态
effectiveTime date 生效日期
invalidTime date 失效日期
eventKey string 消息标识
oldMemberPostList array[OrgMemberPostBaseDto] 更新前任职信息
id int64 任职id
main boolean 是否主岗
orgId int64 组织id
postId int64 岗位id
levelId int64 职级id
jobId int64 职务id
sortId int32 排序号
isEnable boolean 状态
effectiveTime date 生效日期,毫秒时间戳
invalidTime date 失效日期,毫秒时间戳
memberPostList array[OrgMemberPostBaseDto] 更新后任职信息
id int64 任职id
main boolean 是否主岗
orgId int64 组织id
postId int64 岗位id
levelId int64 职级id
jobId int64 职务id
sortId int32 排序号
isEnable boolean 状态
effectiveTime date 生效日期,毫秒时间戳
invalidTime date 失效日期,毫秒时间戳

5.10、创建职级

参数名称 参数类型 参数描述
创建职级消息 OrgLevelCreateMessage
levelId int64 职级id
code string 职级编号
levelSort int32 职级序号
isEnable boolean 状态
eventKey string 消息标识

1.2 - 三方系统同步至V8

集成模式

1.2.1 - COP平台开放写入OpenAPI

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成组织同步模式。

1、概述

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成组织同步模式。

2、优缺点分析

a. 优点:

COP集成压力小;

b. 缺点:

三方系统需要有一定的研发能力,完成接口调用和字段映射;

3、集成配置

序号 步骤名称 责任方 使用场景
1 提供组织增量查询接口规范和文档 致远 必须,包含接口定义、签名规则、字段来源等信息
2 API启用 致远 必须,只有启用的API才可以正常进行授权访问
3 新建接入应用 致远 必须,负责分配AppKey和APPSecret、配置访问授权、访问白名单等配置页
4 启用接入应用 致远 必须,未启用的接入应用,访问时会提示接入应用未启用
5 分配APPKey和APPSecret 致远 必须,接口签名核心字段
6 API授权 致远 必须,只有添加权限的额API接口才可以正常访问
7 导出接口文档 致远 非必须,导出所有已经启用的API手册
8 配置访问限流 致远 非必须,根据服务器资源性能,可以配置指定时间段内调用上线
9 配置访问白名单 致远 非必须,开启后,访问白名单之后的API请求将会被拦截
10 调用测试 三方系统 必须,根据平台提供的接口文档和必须字段,使用postmen等工具直接调用,验证网络连通性和信息准确性

4、接口目录

API分类 API名称 接口描述
组织信息同步(基于编码) 批量新建/更新组织 组织(机构+部门)
职务信息同步(基于编码) 批量新建/更新职务 职务
职级信息同步(基于编码) 批量新建/更新职级 职级
岗位信息同步(基于编码) 批量新建/更新岗位 岗位
人员及任职信息同步(基于编码) 批量新建/更新人员及任职 人员&任职

4.1、接口文档在线查看位置

1720490441002

4.2、接口签名

4.2.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.2.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

5、接口清单

5.1、批量新建/更新组织

请求地址

【接口请求地址前缀】/organization/unit/batch

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl FALSE string 异步回调URL。如果此参数非空,
表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE OrgBatchUnitDto 请求参数数据
units data TRUE array[OrgUnitDataDto] 组织数据
name units TRUE string 组织名称
shortName units FALSE string 组织简称 ,类型为机构时,简称必填,类型为部门时,简称非必填
code units TRUE string 组织编号
type units TRUE enum 组织类型。枚举项可选值列表:
NONE(空),
INSTITUTION(机构),
DEPARTMENT(部门),
OUTSIDE_INSTITUTION(外部(编外)单位),
OUTSIDE_DEPARTMENT(外部(编外)部门),
parentCode units TRUE string 父组织Code,根节点不填
effectiveTime units FALSE string 生效日期
invalidTime units FALSE string 失效日期
sortId units TRUE int32 排序号
isEnable units FALSE boolean 状态
description units FALSE string 备注
metadataList units FALSE array[OrgMetadataValueDataDto] 自定义扩展属性数据
k metadataList FALSE string 扩展字段的名称
v metadataList FALSE string 扩展字段的的值
address units FALSE string 地址
officeNumber units FALSE string 电话
tax units FALSE string 税号
bankAccount units FALSE string 银行账号
bank units FALSE string 开户银行
isLegalEntity units FALSE boolean 是否法人实体
socialCreditCode units FALSE string 统一社会信用代码
legalPersonName units FALSE string 法定代表人姓名
legalCertificateNumber units FALSE string 法定代表人身份证号码
legalPhoneNumber units FALSE string 法定代表人手机号号码
createTime units FALSE date 创建时间,毫秒时间戳
updateTime units FALSE date 更新时间,毫秒时间戳
syncChildMetadataValue data FALSE boolean 是否同步下级组织扩展字段值,默认是false

请求参数示例

{
  "data": {
    "syncChildMetadataValue": "false",
    "units": [
      {
        "bankAccount": "",
        "legalPhoneNumber": "",
        "code": "CoolAcademyImport1001",
        "address": "",
        "effectiveTime": "2023-09-01",
        "officeNumber": "",
        "description": "",
        "tax": "",
        "updateTime": {{timestamp}},
        "invalidTime": "2024-12-31",
        "type": "INSTITUTION",
        "socialCreditCode": "",
        "isEnable": "true",
        "legalPersonName": "",
        "bank": "",
        "legalCertificateNumber": "",
        "parentCode": "group",
        "createTime": {{timestamp}},
        "sortId": 10,
        "name": "集成演示Import1001",
        "isLegalEntity": "false",
        "shortName": "集成演示1001"
      }
    ]
  },
  "requestId":1705902274340,
  "notifyUrl": "",
  "timestamp":1705902274340
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data SingleData 批量处理结果
content data OrgSyncInfoDto 数据对象
type content enum 任务类型。枚举项可选值列表:
BATCH_UNITS(批量处理组织数据),
BATCH_POSTS(批量处理岗位数据),
BATCH_MEMBERS(批量处理人员数据),
BATCH_JOBS(批量处理职务数据),
BATCH_LEVELS(批量处理职级数据),
BATCH_MEMBER_POSTS(批量处理任职数据),
BATCH_UNIT_METADATA(批量处理组织扩展字段数据),
BATCH_MEMBER_METADATA(批量处理人员扩展字段数据),
BATCH_NATURAL_MEMBERS(批量处理外部个人用户数据),
status content enum 状态。枚举项可选值列表:COMPLETE(完成),
startTime content date 开始时间
endTime content date 结束时间
totalNum content int32 总条数
successNum content int32 任务当前执行成功的条数
failNum content int32 任务当前执行失败的条数
details content array[OrgMessageDto] 详情
line details int32 行号
id details int64 id
name details string 名称
code details string 编号
status details enum 状态。枚举项可选值列表:
SUCCESS(成功),
FAILED(失败),
SKIP(跳过),
messageCode details string 错误码
message details string 信息
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "validate": true,
            "type": "BATCH_UNITS",
            "status": "COMPLETE",
            "startTime": 1705913688259,
            "endTime": 1705913688492,
            "totalNum": 1,
            "successNum": 1,
            "failNum": 0,
            "details": [
                {
                    "validate": true,
                    "line": 1,
                    "id": "1659577340788737399",
                    "name": "集成演示Import1001",
                    "code": "CoolAcademyImport1001",
                    "status": "SUCCESS",
                    "messageCode": null,
                    "message": "成功"
                }
            ]
        }
    }
}

5.2、批量新建/更新职务

请求地址

【接口请求地址前缀】/organization/job/batch

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl False string 异步回调URL。如果此参数非空,
表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE OrgBatchJobDto 请求参数数据
jobs data TRUE array[OrgJobDataDto] 职务数据
name jobs TRUE string 职务名称
code jobs TRUE string 编号
unitCode jobs TRUE string 所属组织编号
category jobs TRUE enum 职务性质。枚举项可选值列表:
NONE(空),
BENCH_MARK(基准岗),
SELF_BUILT(自用岗),
sortId jobs TRUE int32 排序号
isEnable jobs TRUE boolean 启用状态
description jobs TRUE string 备注

请求参数示例

{
  "data": {
    "jobs": [
      {
        "code": "JobWorkor",
        "sortId": 10,
        "unitCode": "CoolAcademyImport1001",
        "name": "干事",
        "description": "",
        "category": "SELF_BUILT",
        "isEnable": "true"
      }
    ]
  },
  "requestId": 1705913739277,
  "notifyUrl": "",
  "timestamp": 1705913739277
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data SingleData 批量处理结果
content data OrgSyncInfoDto 数据对象
type content enum 任务类型。枚举项可选值列表:
BATCH_UNITS(批量处理组织数据),
BATCH_POSTS(批量处理岗位数据),
BATCH_MEMBERS(批量处理人员数据),
BATCH_JOBS(批量处理职务数据),
BATCH_LEVELS(批量处理职级数据),
BATCH_MEMBER_POSTS(批量处理任职数据),
BATCH_UNIT_METADATA(批量处理组织扩展字段数据),
BATCH_MEMBER_METADATA(批量处理人员扩展字段数据),
BATCH_NATURAL_MEMBERS(批量处理外部个人用户数据),
status content enum 状态。枚举项可选值列表:COMPLETE(完成),
startTime content date 开始时间
endTime content date 结束时间
totalNum content int32 总条数
successNum content int32 任务当前执行成功的条数
failNum content int32 任务当前执行失败的条数
details content array[OrgMessageDto] 详情
line details int32 行号
id details int64 id
name details string 名称
code details string 编号
status details enum 状态。枚举项可选值列表:
SUCCESS(成功),
FAILED(失败),
SKIP(跳过),
messageCode details string 错误码
message details string 信息
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "validate": true,
            "type": "BATCH_JOBS",
            "status": "COMPLETE",
            "startTime": 1705913739212,
            "endTime": 1705913739234,
            "totalNum": 1,
            "successNum": 1,
            "failNum": 0,
            "details": [
                {
                    "validate": true,
                    "line": 1,
                    "id": "1660303025123624311",
                    "name": "{\"zh_CN\":\"干事\"}",
                    "code": "JobWorkor",
                    "status": "SUCCESS",
                    "messageCode": "成功",
                    "message": null
                }
            ]
        }
    }
}

5.3、批量新建/更新职级

请求地址

【接口请求地址前缀】/organization/level/batch

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE OrgBatchLevelDto 请求参数数据
levels data TRUE array[OrgLevelDataDto] 职级数据
name levels TRUE string 职级名称(必填)
code levels TRUE string 编号(必填)
levelSort levels TRUE int32 序号
isEnable levels TRUE boolean 启用状态
description levels TRUE string 备注

请求参数示例

{
  "data": {
    "levels": [
      {
        "code": "M22",
        "levelSort": 1,
        "name": "M22",
        "description": "M22,酷学院",
        "isEnable": "true"
      }
    ]
  },
  "requestId":1705913759647,
  "notifyUrl": "",
  "timestamp": 1705913759647
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data SingleData 批量处理结果
content data OrgSyncInfoDto 数据对象
type content enum 任务类型。枚举项可选值列表:
BATCH_UNITS(批量处理组织数据),
BATCH_POSTS(批量处理岗位数据),
BATCH_MEMBERS(批量处理人员数据),
BATCH_JOBS(批量处理职务数据),
BATCH_LEVELS(批量处理职级数据),
BATCH_MEMBER_POSTS(批量处理任职数据),
BATCH_UNIT_METADATA(批量处理组织扩展字段数据),
BATCH_MEMBER_METADATA(批量处理人员扩展字段数据),
BATCH_NATURAL_MEMBERS(批量处理外部个人用户数据),
status content enum 状态。枚举项可选值列表:COMPLETE(完成),
startTime content date 开始时间
endTime content date 结束时间
totalNum content int32 总条数
successNum content int32 任务当前执行成功的条数
failNum content int32 任务当前执行失败的条数
details content array[OrgMessageDto] 详情
line details int32 行号
id details int64 id
name details string 名称
code details string 编号
status details enum 状态。枚举项可选值列表:
SUCCESS(成功),
FAILED(失败),
SKIP(跳过),
messageCode details string 错误码
message details string 信息
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "validate": true,
            "type": "BATCH_JOBS",
            "status": "COMPLETE",
            "startTime": 1705913759662,
            "endTime": 1705913759700,
            "totalNum": 1,
            "successNum": 1,
            "failNum": 0,
            "details": [
                {
                    "validate": true,
                    "line": 1,
                    "id": "1660303424790463863",
                    "name": "{\"zh_CN\":\"M22\"}",
                    "code": "M22",
                    "status": "SUCCESS",
                    "messageCode": "成功",
                    "message": null
                }
            ]
        }
    }
}

5.4、批量新建/更新岗位

请求地址

【接口请求地址前缀】/organization/post/batch

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE OrgBatchPostDto 请求参数数据
posts data TRUE array[OrgPostDataDto] 岗位数据
name posts TRUE string 岗位名称
code posts TRUE string 编号
type posts TRUE string 岗位分类的枚举code值
unitCode posts TRUE string 所属组织编号
category posts TRUE enum 岗位性质。枚举项可选值列表:
NONE(空),
BENCH_MARK(基准岗),
SELF_BUILT(自用岗),
sortId posts TRUE int32 排序号
isEnable posts TRUE boolean 启用状态
description posts TRUE string 备注

请求参数示例

{
  "data": {
    "posts": [
      {
        "code": "salesEngineer",
        "sortId": 10,
        "unitCode": "CoolAcademyImport1001",
        "name": "销售工程师",
        "description": "",
        "type": "Management",
        "category": "SELF_BUILT",
        "isEnable": "true"
      }
    ]
  },
  "requestId": 1705913779906,
  "notifyUrl": "",
  "timestamp": 1705913779906
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data SingleData 批量处理结果
content data OrgSyncInfoDto 数据对象
type content enum 任务类型。枚举项可选值列表:
BATCH_UNITS(批量处理组织数据),
BATCH_POSTS(批量处理岗位数据),
BATCH_MEMBERS(批量处理人员数据),
BATCH_JOBS(批量处理职务数据),
BATCH_LEVELS(批量处理职级数据),
BATCH_MEMBER_POSTS(批量处理任职数据),
BATCH_UNIT_METADATA(批量处理组织扩展字段数据),
BATCH_MEMBER_METADATA(批量处理人员扩展字段数据),
BATCH_NATURAL_MEMBERS(批量处理外部个人用户数据),
status content enum 状态。枚举项可选值列表:COMPLETE(完成),
startTime content date 开始时间
endTime content date 结束时间
totalNum content int32 总条数
successNum content int32 任务当前执行成功的条数
failNum content int32 任务当前执行失败的条数
details content array[OrgMessageDto] 详情
line details int32 行号
id details int64 id
name details string 名称
code details string 编号
status details enum 状态。枚举项可选值列表:
SUCCESS(成功),
FAILED(失败),
SKIP(跳过),
messageCode details string 错误码
message details string 信息
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "validate": true,
            "type": "BATCH_POSTS",
            "status": "COMPLETE",
            "startTime": 1705913779967,
            "endTime": 1705913780058,
            "totalNum": 1,
            "successNum": 0,
            "failNum": 1,
            "details": [
                {
                    "validate": true,
                    "line": 1,
                    "id": "1660309690828981623",
                    "name": "{\"zh_CN\":\"销售工程师\"}",
                    "code": "salesEngineer",
                    "status": "FAILED",
                    "messageCode": "ORG_0102",
                    "message": "岗位分类枚举值不存在!"
                }
            ]
        }
    }
}

5.5、批量新建/更新人员及任职

请求地址

【接口请求地址前缀】/organization/member/batch

请求方式

POST

请求参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
requestId TRUE string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp TRUE int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data TRUE OrgBatchMemberDto 请求参数数据
members data TRUE array[OrgMemberDataDto] 人员数据
thirdId members TRUE string 第三方唯一标识
name members TRUE string 姓名
code members TRUE string 编号
username members TRUE string 用户名
gender members TRUE enum 性别。枚举项可选值列表:
NONE(空),
MALE(男),
FEMALE(女),
UN_KNOW(未知),
birthday members TRUE string 出生日期
phoneNumber members TRUE string 手机号码
officeNumber members TRUE string 工作电话
email members TRUE string 邮箱
effectiveTime members TRUE string 生效日期
invalidTime members TRUE string 失效日期
sortId members TRUE int32 排序号
isEnable members TRUE boolean 状态
description members TRUE string 备注
memberPosts members TRUE array[OrgMemberPostDataDto] 人员的任职信息
main memberPosts TRUE boolean 是否主岗
unitCode memberPosts TRUE string 组织编码
postCode memberPosts TRUE string 岗位编码(内部人员必填)
levelCode memberPosts TRUE string 职级编码
jobCode memberPosts TRUE string 职务编码
effectiveTime memberPosts TRUE string 生效日期
invalidTime memberPosts TRUE string 失效日期
sortId memberPosts TRUE int32 排序号
topSortId memberPosts TRUE int32 优先置顶排序
isEnable memberPosts TRUE boolean 状态
memberType memberPosts TRUE enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
metadataList members TRUE array[OrgMetadataValueDataDto] 自定义扩展属性数据
k metadataList TRUE string 扩展字段的名称
v metadataList TRUE string 扩展字段的的值
certificateType members TRUE string 证件类型
certificateNumber members TRUE string 证件号码
entryDate members TRUE string 入职日期
bankAccount members TRUE string 银行账号
bank members TRUE string 开户银行
bankOutlets members TRUE string 开户网点
image members TRUE string 头像路径
memberType members TRUE enum 人员类型。枚举项可选值列表:
NONE(空),
MEMBER(内部人员),
OUTSIDE_MEMBER(外部单位用户),
NATURAL_MEMBER(外部个人用户),
createTime members TRUE date 创建时间,毫秒时间戳
updateTime members TRUE date 更新时间,毫秒时间戳

请求参数示例

{
  "data": [
      {
        "birthday": "",
        "code": "KXY1081001",
        "gender": "MALE",
        "bankOutlets": "",
        "effectiveTime": "2023-09-01",
        "officeNumber": "",
        "description": "",
        "invalidTime": "2024-12-31",
        "isEnable": "true",
        "bank": "",
        "sortId": 10,
        "email": "",
        "bankAccount": "",
        "image": "",
        "thirdId": "KXY1081001",
        "entryDate": "2023-09-01",
        "updateTime": 1705913802791,
        "memberPosts": [
          {
            "levelCode": "M22",
            "effectiveTime": "2023-09-01",
            "sortId": 10,
            "unitCode": "InformationCenter",
            "jobCode": "JobWorkor",
            "main": "true",
            "postCode": "salesEngineer",
            "invalidTime": "2024-12-31",
            "memberType": "MEMBER",
            "isEnable": "true"
          }
        ],
        "phoneNumber": "18701021001",
        "certificateNumber": "",
        "createTime": 1705913802791,
        "name": "集成演示-张三",
        "memberType": "MEMBER",
        "username": "18701021001",
        "certificateType": "idCard"
      }
    ]
  ,
  "requestId": 1705913802791,
  "notifyUrl": "",
  "timestamp": 1705913802791
}

响应参数(Body)

参数名称 父节点 是否必填 参数类型 参数描述
data SingleData 批量处理结果
content data OrgSyncInfoDto 数据对象
type content enum 任务类型。枚举项可选值列表:
BATCH_UNITS(批量处理组织数据),
BATCH_POSTS(批量处理岗位数据),
BATCH_MEMBERS(批量处理人员数据),
BATCH_JOBS(批量处理职务数据),
BATCH_LEVELS(批量处理职级数据),
BATCH_MEMBER_POSTS(批量处理任职数据),
BATCH_UNIT_METADATA(批量处理组织扩展字段数据),
BATCH_MEMBER_METADATA(批量处理人员扩展字段数据),
BATCH_NATURAL_MEMBERS(批量处理外部个人用户数据),
status content enum 状态。枚举项可选值列表:COMPLETE(完成),
startTime content date 开始时间
endTime content date 结束时间
totalNum content int32 总条数
successNum content int32 任务当前执行成功的条数
failNum content int32 任务当前执行失败的条数
details content array[OrgMessageDto] 详情
line details int32 行号
id details int64 id
name details string 名称
code details string 编号
status details enum 状态。枚举项可选值列表:
SUCCESS(成功),
FAILED(失败),
SKIP(跳过),
messageCode details string 错误码
message details string 信息
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
  "code": "200",
  "data": {
    "content": {
      "failNum": 1,
      "totalNum": 100,
      "successNum": 99,
      "startTime": "",
      "details": [
        {
          "code": "",
          "line": 10,
          "name": "",
          "messageCode": "",
          "id": "10828711522402302",
          "message": "SUCCESS",
          "status": ""
        }
      ],
      "endTime": "",
      "type": "BATCH_MEMBERS",
      "status": "READY"
    }
  },
  "message": "成功",
  "status": "FRONT"
}

5、注意事项

接口授权和分配AppKey、AppSecret请参考【数据开放】操作步骤

1.2.2 - 数据库中间表(推荐)

针对三方异构系统与COP组织人员数据结构差异较大场景,COP开放数据库中间表,三方异构系统按要求将组织数据写入中间表后,COP重新组装完成组织同步模式。

1、概述

针对三方异构系统与COP组织人员数据结构差异较大场景,COP开放数据库中间表,三方异构系统按要求将组织数据写入中间表后,COP重新组装后完成组织同步模式。

2、优缺点

a. 优点

i. 集成压力小;

ii. 对数据质量要求低;

ⅲ.问题跟踪,问题定位速度快

b. 缺点

i. 无

3、操作步骤

3.1、开放OpenAPI模式(推荐)

序号 步骤名称 责任方 使用场景
1 开放OpenAPI 致远 必须,提供组织数据写入OpenAPI和调用示例
2 新建集成应用,获取集成应用ID 致远 必须,获取集成应用ID,接口必须入参
3 启用API 致远 必须,只有启用API,才能分配授权
4 新建接入应用 致远 必须,分配授权APPKey和AppSecret
5 查看AppKey和AppSecret 致远 必须,接口鉴权使用
6 API授权 致远 必须,未启用时,接口调用直接报错
7 启用接入应用 致远 必须,未启用时,接口调用直接报错
8 选择同步模式 致远 必须,选择中间表模式
9 配置同步周期 致远 必须,配置数据处理周期
10 配置字段映射 致远 必须,字段映射、默认值、过滤条件等
11 调用接口写入数据 三方异构系统 必须,三方异构系统负责写入数据到中间表
12 查看日志 致远 非必须,监控过程数据

3.2、直接写入数据库模式

序号 步骤名称 责任方 使用场景
1 提供数据库连接信息和库表结构 致远 必须,
2 新建集成应用,获取集成应用ID 致远 必须,获取集成应用ID,接口必须入参
3 选择同步模式 致远 必须,选择中间表模式
4 配置同步周期 致远 必须,配置数据处理周期
5 配置字段映射 致远 必须,字段映射、默认值、过滤条件等
6 连接数据库写入数据 三方异构系统 必须,三方异构系统负责写入数据到中间表
7 查看日志 致远 非必须,监控过程数据

4、集成配置步骤

4.1、开放OpenAPI模式(推荐)

4.1.1、开放OpenAPI

参照接口清单

4.1.2、新建集成应用,获取集成应用ID

1720595899626

1720595936814

4.1.3、启用API

1720596032390

4.1.4、新建接入应用

1720596066425

4.1.5、查看AppKey和AppSecret

1720596102771

4.1.6、API授权

1720596150002

4.1.7、启用接入应用

1720596170496

4.1.8、选择同步模式

1720596695013

4.1.9、内容配置

1720596811554

1720596874359

4.1.10、配置同步周期

1720596969443

4.1.11、调用接口写入数据

参考接口清单调用接口处理

4.1.12、查看日志

1720597917440

1720597926133

4.2、直接写入数据库模式

4.2.1、提供数据库连接信息和库表结构

请参照物理表接口定义

4.2.2、新建集成应用,获取集成应用ID

1720595899626

1720595936814

4.2.3、选择同步模式

1720596695013

4.2.4、配置同步内容

1720596811554

1720596874359

4.2.5、配置同步周期

1720596969443

5、接口清单

4.1、接口鉴权

4.1.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.1.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

4.2、批量插入组织中间表(机构/部门)

请求地址:

【接口请求地址前缀】/cip-connector/middle-table/unit-create

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true UnitInfoReqDto 请求参数数据
linkerId data true int64 集成应用ID
data data true array[UnitInfoDto] 数据列表
code data true string 编码
name data true string 组织名称
parentCode data true string 父组织code
shortName data false string 简称
type data false enum 类型。枚举项可选值列表:
INSTITUTION(机构),
DEPARTMENT(部门),
thirdId data false string 第三方组织id
enable data false boolean 是否启用
thirdUpdateTime data true date 第三方数据最新时间
sortId data false int32 排序号
str1 data false string 扩展字段1
str2 data false string 扩展字段2
str3 data false string 扩展字段3
str4 data false string 扩展字段4
str5 data false string 扩展字段5
str6 data false string 扩展字段6
str7 data false string 扩展字段7
str8 data false string 扩展字段8
str9 data false string 扩展字段9
str10 data false string 扩展字段10

请求示例

{
  "data": {
    "data": [
      {
        "code": "100101",
        "thirdId": "100101",
        "type": "INSTITUTION",
        "str7": "",
        "str8": "",
        "str5": "",
        "str6": "",
        "str3": "",
        "parentCode": "group",
        "str4": "",
        "enable": "true",
        "sortId": 1,
        "str1": "",
        "str2": "",
        "name": "API导入致远",
        "str10": "",
        "shortName": "API导入致远",
        "thirdUpdateTime": "2024-01-01",
        "str9": ""
      }
    ],
    "linkerId": "-4511464491497948501"
  },
  "requestId": "3799345662156838701",
  "notifyUrl": "",
  "timestamp": 1720592508046
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": null
}

4.3、批量插入岗位中间表

请求地址:

【接口请求地址前缀】/cip-connector/middle-table/post-create

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true PostInfoReqDto 请求参数数据
linkerId data true int64 集成应用ID
data data true array[PostInfoDto] 数据列表
code data true string 编码
name data true string 名称
unitCode data true string 组织code
thirdId data false string 第三方id
type data false string 岗位分类枚举值code
category data false enum 岗位性质。枚举项可选值列表:
NONE(空),
BENCH_MARK(基准岗),
SELF_BUILT(自用岗),
enable data false boolean 是否启用
thirdUpdateTime data true date 第三方数据最新时间
sortId data false int32 排序号

请求示例

{
  "data": {
    "data": [
      {
        "code": "001",
        "thirdId": "12345",
        "enable": "true",
        "sortId": 1,
        "unitCode": "100101",
        "name": "P0",
        "type": "1",
        "category": "BENCH_MARK",
        "thirdUpdateTime": "2024-01-01"
      }
    ],
    "linkerId": "-4511464491497948501"
  },
  "requestId": "-4579930924623847185",
  "notifyUrl": "",
  "timestamp": 1720592507597
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": null
}

4.4、批量插入职级中间表

请求地址:

【接口请求地址前缀】/cip-connector/middle-table/level-create

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true LevelInfoReqDto 请求参数数据
linkerId data true int64 集成应用ID
data data true array[LevelInfoDto] 数据列表
code data true string 编码
name data true string 名称
thirdId data false string 第三方id
enable data false boolean 是否启用
thirdUpdateTime data true date 第三方数据最新时间
sortId data false int32 排序号(默认:1)

请求示例

{
  "data": {
    "data": [
      {
        "code": "001",
        "thirdId": "12345",
        "enable": "true",
        "sortId": 1,
        "name": "P0",
        "thirdUpdateTime": "2024-01-01"
      }
    ],
    "linkerId": "158933225308768072"
  },
  "requestId": "-395422794033167315",
  "notifyUrl": "",
  "timestamp": 1720592508081
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
  "code": "200",
  "data": {
    "content": ""
  },
  "message": "成功",
  "status": "FRONT"
}

4.5、批量插入人员中间表

请求地址:

【接口请求地址前缀】/cip-connector/middle-table/member-create

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true MemberInfoReqDto 请求参数数据
linkerId data true int64 集成应用ID
data data true array[MemberInfoDto] 数据列表
code data true string 编码
name data true string 名称
thirdId data false string 第三方id
email data false string 邮箱
phoneNumber data false string 手机
gender data false enum 性别。枚举项可选值列表:
NONE(空),
MALE(男),
FEMALE(女),
UN_KNOW(未知),
unitCode data true string 组织code
thirdJobId data false string 第三方任职id
main data false boolean 是否主岗
postCode data false string 岗位code
levelCode data false string 职级code
effectiveTime data false date 生效日期
invalidTime data false date 失效日期
enable data true boolean 是否启用
thirdUpdateTime data true date 第三方数据最新时间
sortId data false int32 排序号(默认:1)
str1 data false string 扩展字段1
str2 data false string 扩展字段2
str3 data false string 扩展字段3
str4 data false string 扩展字段4
str5 data false string 扩展字段5
str6 data false string 扩展字段6
str7 data false string 扩展字段7
str8 data false string 扩展字段8
str9 data false string 扩展字段9
str10 data false string 扩展字段10

请求示例

{
  "data": {
    "data": [
      {
        "code": "001",
        "gender": "MALE",
        "effectiveTime": "2023-12-31 00:00:00",
        "main": "true",
        "invalidTime": "9999-12-31 00:00:00",
        "str7": "aaa",
        "levelCode": "001",
        "str8": "aaa",
        "str5": "aaa",
        "str6": "aaa",
        "str3": "aaa",
        "str4": "aaa",
        "enable": "true",
        "sortId": 1,
        "str1": "aaa",
        "unitCode": "seeyon",
        "str2": "aaa",
        "str10": "aaa",
        "email": "pan@163.com",
        "thirdUpdateTime": "2024-01-01",
        "str9": "aaa",
        "thirdId": "12345",
        "thirdJobId": "12345456",
        "phoneNumber": "1345668900",
        "name": "P0",
        "postCode": "defaultCode"
      }
    ],
    "linkerId": "158933225308768072"
  },
  "requestId": "1121213206799116311",
  "notifyUrl": "",
  "timestamp": 1720592507997
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
  "code": "200",
  "data": {
    "content": ""
  },
  "message": "成功",
  "status": "FRONT"
}

4.6、确认全量同步完毕(必须)

说明:

全量模式下,每次全量数据写入中间表后,必须调用当前接口,否则即使满足集成平台配置的定时执行时间,也不会执行同步

请求地址:

【接口请求地址前缀】/cip-connector/middle-table/sync-finish

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true int64 集成应用ID

请求示例

{
  "data": "-4511464491497948501",
  "requestId": "-4875171919230719752",
  "notifyUrl": "",
  "timestamp": 1720592508031
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data string 数据对象
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
  "code": "200",
  "data": {
    "content": ""
  },
  "message": "成功",
  "status": "FRONT"
}

6、物理表结构

注意:库名称:cip-connector

6.1、机构/部门

CREATE TABLE `cip_sync_unit` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '修改时间',
  `version` smallint(6) NOT NULL COMMENT '版本号',
  `linker_id` bigint(20) NOT NULL COMMENT '连接器ID',
  `code` varchar(100) DEFAULT NULL COMMENT '组织编号',
  `name` varchar(255) DEFAULT NULL COMMENT '组织名称',
  `short_name` varchar(255)  DEFAULT NULL COMMENT '简称',
  `type` smallint  NOT NULL COMMENT '类型(机构=1,部门=2)',
  `parent_code` varchar(100)  DEFAULT NULL COMMENT '父组织code',
  `third_id` varchar(100) DEFAULT NULL COMMENT '组织id',
  `is_enable` tinyint(1)  NOT NULL COMMENT '是否启用(1-启用,0-停用)',
  `third_update_time` datetime NOT NULL COMMENT '第三方数据最新时间',
  `status` smallint  NOT NULL DEFAULT 0 COMMENT '同步状态(不处理=-1,未处理=0,失败=1,成功=2)',
  `retry` smallint NOT NULL DEFAULT 0 COMMENT '重试次数',
  `batch` varchar(20) DEFAULT NULL COMMENT '批次号',
  `sort_id` int(11) NOT NULL DEFAULT 1 COMMENT '排序号',
  `v8_id` bigint(20) NOT NULL DEFAULT -1 COMMENT 'V8ID',
  `str1` varchar(255)  DEFAULT NULL COMMENT '扩展字段1',
  `str2` varchar(255)  DEFAULT NULL COMMENT '扩展字段2',
  `str3` varchar(255)  DEFAULT NULL COMMENT '扩展字段3',
  `str4` varchar(255)  DEFAULT NULL COMMENT '扩展字段4',
  `str5` varchar(255)  DEFAULT NULL COMMENT '扩展字段5',
  `str6` varchar(255)  DEFAULT NULL COMMENT '扩展字段6',
  `str7` varchar(255)  DEFAULT NULL COMMENT '扩展字段7',
  `str8` varchar(255)  DEFAULT NULL COMMENT '扩展字段8',
  `str9` varchar(255)  DEFAULT NULL COMMENT '扩展字段9',
  `str10` varchar(255)  DEFAULT NULL COMMENT '扩展字段10',
  `msg` longtext  DEFAULT NULL COMMENT '异常信息',
  PRIMARY KEY (`id`)
) COMMENT='组织同步组织中间表';

6.2、职级

CREATE TABLE `cip_sync_level` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '修改时间',
  `version` smallint(6) NOT NULL COMMENT '版本号',
  `linker_id` bigint(20) NOT NULL COMMENT '连接器ID',
  `code` varchar(50) DEFAULT NULL COMMENT '职级编号',
  `name` varchar(100) DEFAULT NULL COMMENT '职级名称',
  `third_id` varchar(100) DEFAULT NULL COMMENT '职级id',
  `is_enable` tinyint(1)  NOT NULL COMMENT '是否启用(1-启用,0-停用)',
  `third_update_time` datetime NOT NULL COMMENT '第三方数据最新时间',
  `status` smallint NOT NULL DEFAULT 0 COMMENT '同步状态(不处理=-1,未处理=0,失败=1,成功=2)',
  `retry` smallint NOT NULL DEFAULT 0 COMMENT '重试次数',
  `batch` varchar(20) DEFAULT NULL COMMENT '批次号',
  `sort_id` int(11) NOT NULL DEFAULT 1 COMMENT '排序号',
  `v8_id` bigint(20) NOT NULL DEFAULT -1 COMMENT 'V8ID',
  `msg` longtext  DEFAULT NULL COMMENT '异常信息',
  PRIMARY KEY (`id`)
) COMMENT='组织同步职级中间表';

6.3、岗位

CREATE TABLE `cip_sync_post` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '修改时间',
  `version` smallint(6) NOT NULL COMMENT '版本号',
  `linker_id` bigint(20) NOT NULL COMMENT '连接器ID',
  `code` varchar(50) DEFAULT NULL COMMENT '岗位编号',
  `name` varchar(100) DEFAULT NULL COMMENT '岗位名称',
  `unit_code` varchar(100) DEFAULT NULL COMMENT '组织code',
  `type` varchar(100) DEFAULT NULL COMMENT '岗位分类枚举值code',
  `category` smallint NOT NULL DEFAULT 0 COMMENT '岗位性质(基准岗=0,自用岗=1)',
  `third_id` varchar(100) DEFAULT NULL COMMENT '岗位id',
  `is_enable` tinyint(1)  NOT NULL COMMENT '是否启用(1-启用,0-停用)',
  `third_update_time` datetime NOT NULL COMMENT '第三方数据最新时间',
  `status` smallint NOT NULL DEFAULT 0 COMMENT '同步状态(不处理=-1,未处理=0,失败=1,成功=2)',
  `retry` smallint NOT NULL DEFAULT 0 COMMENT '重试次数',
  `batch` varchar(20) DEFAULT NULL COMMENT '批次号',
  `sort_id` int(11) NOT NULL DEFAULT 1 COMMENT '排序号',
  `v8_id` bigint(20) NOT NULL DEFAULT -1 COMMENT 'V8ID',
  `msg` longtext  DEFAULT NULL COMMENT '异常信息',
  PRIMARY KEY (`id`)
) COMMENT='组织同步岗位中间表';

6.4、人员&任职

CREATE TABLE `cip_sync_member` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '修改时间',
  `version` smallint(6) NOT NULL COMMENT '版本号',
  `linker_id` bigint(20) NOT NULL COMMENT '连接器ID',
  `code` varchar(50) DEFAULT NULL COMMENT '工号',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `third_id` varchar(100) DEFAULT NULL COMMENT '第三方人员id',
  `gender` smallint NOT NULL DEFAULT 0 COMMENT '性别(男=0,女=1)',
  `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
  `phone_number` varchar(20) DEFAULT NULL COMMENT '手机号码',
  `unit_code` varchar(100) DEFAULT NULL COMMENT '组织code',
  `third_job_id` varchar(100) DEFAULT NULL COMMENT '第三方任职id',
  `is_main` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否主岗(主岗=1,副岗=0)',
  `post_code` varchar(50) DEFAULT NULL COMMENT '岗位code',
  `level_code` varchar(50) DEFAULT NULL COMMENT '职级code',
  `effective_time` datetime NOT NULL DEFAULT '2024-01-01' COMMENT '生效日期',
  `invalid_time` datetime NOT NULL DEFAULT '9998-12-31' COMMENT '失效日期',
  `is_enable` tinyint(1)  NOT NULL COMMENT '是否启用(1-启用,0-停用)',
  `third_update_time` datetime NOT NULL COMMENT '第三方数据最新时间',
  `status` smallint NOT NULL DEFAULT 0 COMMENT '同步状态(不处理=-1,未处理=0,失败=1,成功=2)',
  `retry` smallint NOT NULL DEFAULT 0 COMMENT '重试次数',
  `batch` varchar(20) DEFAULT NULL COMMENT '批次号',
  `sort_id` int(11) NOT NULL DEFAULT 1 COMMENT '排序号',
  `v8_id` bigint(20) NOT NULL DEFAULT -1 COMMENT 'V8ID',
  `str1` varchar(255)  DEFAULT NULL COMMENT '扩展字段1',
  `str2` varchar(255)  DEFAULT NULL COMMENT '扩展字段2',
  `str3` varchar(255)  DEFAULT NULL COMMENT '扩展字段3',
  `str4` varchar(255)  DEFAULT NULL COMMENT '扩展字段4',
  `str5` varchar(255)  DEFAULT NULL COMMENT '扩展字段5',
  `str6` varchar(255)  DEFAULT NULL COMMENT '扩展字段6',
  `str7` varchar(255)  DEFAULT NULL COMMENT '扩展字段7',
  `str8` varchar(255)  DEFAULT NULL COMMENT '扩展字段8',
  `str9` varchar(255)  DEFAULT NULL COMMENT '扩展字段9',
  `str10` varchar(255)  DEFAULT NULL COMMENT '扩展字段10',
  `msg` longtext  DEFAULT NULL COMMENT '异常信息',
  PRIMARY KEY (`id`)
) COMMENT='组织同步人员中间表';

7、注意事项

7.1、更新标识【重重重】

选择OpenAPI模式时,为了防止同一批次数据全部写入前,定时处理任务开始执行,造成数据不完整,请务必再同一批次数据写入完成后调用【全量同步完毕】接口,更新批次同步完成标识。

7.2、扩展字段定义

1720595133347

7.3、集成应用ID

1720594988748

7.4、开放OpenAPI

如需要限制访问IP、限流控制等高级设计,请参考集成开发-开放平台-接入应用配置说明

7.5、手工同步

如果同步频率配置的为手工同步,请在调用OpenAPI写入数据,调用【全部同步完毕】接口后,手工点击执行同步,否则数据不会再日志表中执行同步。


1.2.3 - 第三方同步到V8常见问题

常见问题记录。

1、拉取方式

适合全量 从上到下依次进行。第一遍,要单个逐次手动同步。组织同步标识都是作为v8的code进行同步的。 拉取有一定的制约性,比如人员接口入参是机构id,如果前面机构同步,用code做标识,那么后面循环拉取就获取不到人员信息。

1.1、常见问题

1、任职→查询底表是否已经有该人员→调用组织模型接口 任职数据,需先同步人员基本信息,如果手动系统录入人员,目前任职无法通过连接器进入系统。 2、如果组织的扩展字段是人员,那么还需同步第二遍。 3、拉取接口变化成分页,因为业务路径会变化,所有配置项需要重新选一遍。 4、内部根节点,外部根节点如果选错同步后,因为组织模型目前不支持跨单位调整部门,所以需要手动进行维护,或者找组织模型部门人员,清空数据库重新同步。 5、如果是导入的连接器,要核实一下所有页签的业务路径和参数。 6、偶尔有表达式感觉不生效的情况,重新清空保存然后再选一遍重试。 7、如果日志中,接口中有日志,但是组织同步页签没有日志,那么应该后台报错了,需要取服务器日志(cip-connector)进一步分析。 搜索关键字为:执行组织同步任务项。 常见的一种情况是机构授权数不够,无法新建机构,这个找商务进行license授权 8、组织同步日志表,如果量大也可以手动清理。 cip-connector库: select * from cip_p_sync_his where plugin_id=(select id from cip_p_plugin_info where connector_id={连接器id}) and data_type in(0,1,2,3,4,5,6,7); 其中:data_type: 0=组织(单位+部门)基本信息,1=组织(单位+部门)扩展信息,2=岗位信息,3=职务信息,4=职级信息,5=人员基本信息,6=人员扩展信息,7=人员任职信息

img1

2、第三方推送

2.1、事件订阅和消息队列

事件订阅:监听第三方回调事件 消息队列:监听mq 因为组织模型的关联性和异步性,可以作为中间的一种技术手段,不建议作为直接交付使用。

2.2、中间表

支持全量/增量。支持重试。暂不支持自动创建用户映射。一般需第三方开发或者结合微流程开发使用。 可以直接将数据直插数据库表,也可以通过openapi进行插入。 全量模式: 1、如果第三方只给最新的启用的组织,停用数据不给,那么会比较v8数据,自动进行停用。 2、需要同步完全部数据后,再给予一个同步完成标识。 增量模式: 按照[第三方数据最新时间]比对出最新数据,定时同步。每次同步为一个批次。 【写入02】任职变化时,写入用户的全部任职,与【写入01】只能二选一,这个意思是人员增量,但是对应的任职必须是该人全部的。如果人员第一次同步任职有两条任职,第二次同步有一条新增任职,目前因为没有组织模型没有记录任职唯一标识,无法判断第二次任职是新增还是更新已有的某个岗位。

2 - 事项同步

通过可视化配置,实现V8平台与多个三方异构系统间的事项同步。

1、概述

通过可视化配置,实现V8平台与多个三方异构系统间的事项同步。

2、集成模式优缺点对比分析

1736492922109

3、集成方向&模式

2.1 - V8同步至三方

集成模式

2.1.1 - 三方系统提供写入OpenAPI(推荐)

三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成事项同步。

1、概述

三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成事项同步。

三方系统提供事项写入OpenAPI,COP平台封装接口,定时主动推送待办事项,配置字段映射,完成事项同步。

2、优缺点

* 优点

a. 三方系统工作量少,三方无需关注字段映射、同步日志等集成步骤,针对有标准接口的saas产品集成效率更高;

b. 整个集成步骤都是在图形化操作界面中完成,可以大量节约集成工期和研发投入;

c. 主动写入,数据时效性高;

* 缺点

a. 三方系统数据库结构字段要求高,必须满足COP系统事项呈现要求,否则会造成部分功能缺失;

b. 致远实施工作量大,需要了解三方系统数据库字段要求;

3、操作步骤

序号 步骤名称 责任方 使用场景
1 提供单点登录接口规范和文档 三方系统 非必须,如果COP和三方系统未接入统一身份认证系统,则需要通过单点登录方式免登陆打开事项详情页
2 提供事项写入接口规范和文档 三方系统 必须,
3 注册并配置鉴权AppID和秘钥 三方系统 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要提供
4 提供接口调用示例 三方系统 必须,为了集成效率,强烈建议三方系统提供可直接使用的postman接口调用示例,
5 新建三方集成应用 致远 必须,集成应用负责封装三方系统接口和配置单点登录
6 发布三方集成应用 致远 必须,集成应用只有发布后才能正常使用
7 封装安全认证 致远 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要配置安全认证
8 封装签名 致远 非必须,如果三方系统接口调用时涉及到签名参数,则需要配置签名
9 接口封装 致远 必须,三方系统提供的接口只有正常封装后才能供给COP使用
10 在线调试验证 致远 必须,三方系统接口封装完成后,需要在线调试,验证网络通信、接口返回结果是否正确等
11 单点登录 三方系统 必须,参照【三方系统单点登录打开COP】单点登录模式配置
12 新建事项同步 致远 必须,
13 选择同步模式 致远 必须,
14 配置同步周期 致远 必须,根据数据量和服务器消费能力,合理配置同步周期
15 配置字段映射 致远 必须:三方系统接口文档中的字段名,字段释义与COP不一致,需要配置参数映射、层级转换等

4、集成配置说明

4.1. 新建三方集成应用

1720691961884

4.2. 封装安全认证

1720691967564

1720691971398

4.3. 枚举定义

1720691975935

4.4. 接口封装

1720691980574

1720691985385

1720691990437

1720691995488

1720692000295

1720692005088

1720692009777

4.5.在线调试验证

1720692014093

1720692018917

4.6. 新建事项同步【致远】

1720692024071

4.7. 选择同步模式【致远】

1720692028029

4.8. 配置字段映射【致远】

1720692032177

1720692037026

4.9. 发布三方集成应用

1720691344319

5、注意事项

2.2 - 三方同步至V8

集成模式

2.2.1 - COP平台开放写入OpenAPI(推荐)

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成事项同步模式。

1、概述

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成事项同步模式。

2、核心字段定义

术语 定义 来源 测试数据
appKey V8统一认证中心分配给每个接入应用的唯一标识Id,别名应用Id 致远COP 3e4a140e2509477396fa04ddcd70c3d2
AppSecret V8统一认证中心分配给每个接入应用的加密解密秘钥,别名应用秘钥 致远COP 5bad0b6618934c62bffefe4cc0d8c03d
url前缀 文档中所有接口的请求前缀 致远COP http://openapi-bpm.CC.com.cn
capabilityId 同步能力编码,针对事项同步场景:新增待办、新增我的已发、已发更新为已办 致远COP 1531486151775358223
capabilityId 同步能力编码,针对消息同步场景 致远COP 1457957992996539915

3. 集成导图

1720436285007

4、接口签名

4.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

5、集成配置

目的:生成APPKey、APPSecret和同步能力编码三个核心参数

5.1. 新建集成应用

1720436493245

5.2. 配置单点登录

1720436521388

5.3、新建事项同步,获取事项同步能力编码

1720436714310

1720486821713

1720436724312

1720436731687

5.4、发布应用

1720436814018

5.5、启用API

1720436845375

5.6、新建接入应用

1720436859248

5.7、启用接入应用

1720436868273

5.8、分配APPKey和AppSecret

1720436877815

5.9、应用级别API授权

1720436884647

5.10、按需开启IP白名单

1720437010235

5.11、按需开启限流控制

1720436916930

5.12、API调用日志

1720436930684

6、接口清单

请求地址

【url前缀】/cip-manager/plugin-affair/create-update

1720437136324

1720437274015

请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。
如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true PluginAffairBatchDto 请求参数数据
capabilityId data true int64 待办同步能力编号
affairAction data true enum[START:START;
OTHER:OTHER; ]
产生事项变更的动作
idType data true enum[OUTER_ID;
V8_ID;
V8_CODE; 
V8_LOGIN_NAME;
V8_PHONE;]
发起人/处理人标识类型,
不传递默认OUTER_ID(三方系统ID)。
枚举项可选值列表:OUTER_ID(三方系统ID),
V8_ID(V8内部ID),
V8_CODE(V8系统编号),
V8_LOGIN_NAME(V8登录名),
V8_PHONE(V8手机号)
affairList data true array[PluginAffairDetailDto] 待办详情列表
externalAffairId affairList true string 事项标识
startMemberId affairList true string 发起人标识
startTime affairList true string 发起时间。毫秒时间戳或者yyyy-MM-dd HH:mm:ss格式
ownerId affairList true string 处理人标识
title affairList true string 待办标题
importance affairList true int32 重要程度,0=普通,1=重要
receiveTime affairList true string 接收时间。毫秒时间戳或者yyyy-MM-dd HH:mm:ss格式
todoWebUrl affairList true string PC端查看地址
todoMobileUrl affairList true string 移动端查看地址
objectId affairList true string 组ID,比如流程id
dealTime affairList true string 处理时间。毫秒时间戳或者yyyy-MM-dd HH:mm:ss格式
newStatus affairList true string 目标状态,仅更新时使用enum[
NONE:默认值:空;
READY:待发;
SENT:已发;
PENDING:待办;
DONE:已办;
REVOKE:撤销; ]
subStatus affairList true string 目标子状态,仅更新时使用
pending=正常待办
ready=草稿待发
sent=正常已发
done=正常已办
temporary=暂存
backed=被退回
retrieve=取回s
top=终止
terminated=被终止
transfer=移交
return=退回
specifyFallback=指定退回
revoke=撤销
revoked=被撤销
beCompetitive=被竞争
abandoned=废弃
sender=回退到开始节点子状态
pause=挂起状态
objectState affairList true int32 -1=空
0=运行中
1=终止
2=完成
4=挂起
5=撤销
6=草稿
7=删除
compareKey affairList true string 数据更新标识。传递时间戳即可
openType affairList false string 详情打开方式:WORKSPACE(工作区),
NEWWINDOW(新窗口,默认值)

请求示例

{
  "data": {
    "affairList": [
      {
        "newStatus": "DONE",/*枚举值*/
        "externalAffairId": "123321128",/*业务系统事项Id,唯一*/
        "importance": 1,/*枚举值*/
        "startMemberId": "MB202305060001",/*根据idType定义,示例中idType=V8_CODE时,传值致远V8用户Code*/
        "ownerId": "MB202305060001",/*根据idType定义,示例中idType=V8_CODE时,传值致远V8用户Code*/
        "title": "待办同步测试123",/*待办事项标题*/
        "todoWebUrl": "PC详情url",/*待办事项PC端待处理页URL地址*/
        "subStatus": "pengding",/*枚举值*/
        "receiveTime": "2023-04-24 19:25:30",/*接受时间*/
        "compareKey": "1688033651186",/*数据更新标识。传递时间戳*/
        "dealTime": "2023-04-24 19:25:30",/*处理时间*/
        "startTime": "2023-04-24 19:25:30",/*发起时间*/
        "todoMobileUrl": "移动端详情url123",/*待办事项移动端待处理页URL地址*/
        "openType":"NEWWINDOW",/*枚举值,详情页打开方式*/
        "objectId": "1008"/*流程Id,与待办objectId参数一致*/
      }
    ],
    "capabilityId": "1531486151775358223",/*固定值,事项同步能力编码*/
    "affairAction": "OTHER",/*固定值*/
    "idType":"V8_CODE"/*枚举值*/
  },
  "requestId": "1395151404498159078",/*请求流水号,每次请求唯一*/
  "timestamp": 1688033651186/*请求时间戳,毫秒级*/
}

返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
details content array
externalAffairId details string 事项ID
result details string 操作结果,ADD=新增,MODIFY=更新
status int32 状态
code string 错误码
message string 返回信息

返回示例

{
    "status": 0,/*成功标识*/
    "code": "BOOT_0000",/*错误码*/
    "message": "SUCCESS",/*返回信息*/
    "data": {
        "content": {
            "details": [
                {
                    "externalAffairId": "1693299012298",
                    "result": "ADD"
                }
            ]
        }
    }
}

7、注意事项

7.1、待办批量更新为已办接口和批量新增待办接口请求地址一致,入参有差异,核心差异字段为请求示例中标记了【差异】的参数newStatus、subStatus、compareKey;

7.2、返回结果中code=BOOT_0000,且externalAffairId不为空时,才表示同步成功。

7.3、当前模式下,不会同步生成消息。

7.4、新增待办时:newStatus=PENDING&subStatus=pending;待办更新已办时:newStatus=DONE&subStatus=done,且事项ID一致、

2.2.2 - 消息队列

COP平台将组织数据写入MQ,三方异构系统消费MQ,实现事项同步模式。

1、概述

COP平台将组织数据写入MQ,三方异构系统消费MQ,实现事项同步模式。

三方系统将事项数据写入MQ,COP监听MQ获取事项数据,实现事项同步。

COP平台还提供同步补偿。

2、优缺点

a. 优点

i. 三方系统集成压力小;

ii. 数据时效性高;

b. 缺点

i. 实施团队需要熟悉三方系统接口规范、定义;

ii. 实施团队需要熟悉COP平台事项维度和数据定义;

3、操作步骤

序号 步骤名称 责任方 使用场景
1 提供事项新增、变更增量更新MQ消息体定义 三方系统 必须
2 提供MQ连接信息 三方系统 必须,
3 新建MQ数据源 致远 必须,封装MQ数据连接
4 新建三方集成应用 致远 必须,三方集成应用负责封装三方系统接口和配置数据映射
5 发布启用三方集成应用 致远 必须,三方集成应用只有发布后才能正常使用
6 新建消息队列 致远 非必须,根据三方系统提供的消息体定义
7 启用事项同步 致远 必须,字段映射、同步周期需要在事项同步中配置
8 选择同步模式 致远 必须,本场景下固定选择模式为:从三方系统获取
9 配置字段映射 致远 必须:三方系统接口文档中的字段名,字段释义与COP不一致,需要配置参数映射、层级转换等
10 使用日志 致远 必须,配置完成并启用后,查看使用日志

4、集成配置说明

4.1. 新建数据源

1720691555475

4.2. 新建三方集成应用

1720691559991

4.3. 队列封装

1720691566931

4.4. 配置单点登录

1720691574339

4.5. 新建事项同步

1720691579735

4.6. 选择同步模式

1720691585727

4.7. 配置字段映射

1720691590800

1720691595856

4.8. 发布三方集成应用

1720691344319

4.9. 三方系统创建事项【三方系统】

配置完成后,三方系统创建事项。

4.10. 等待拉取间隔时间

等待同步周期间隔时间后,登录门户查看已经同步后的待办事项。

4.11. 门户待办栏目查看数据【致远】

1720691600410

4.12. 点击待办数据并处理【致远】

1720691604628

4.13. 等待拉取间隔时间

等待同步周期间隔时间后,登录门户查看已经同步后的已办事项。

待办处理之后变为已办,数据展示在已办栏目。

4.14. 刷新门户首页查看待办、已办数据【致远】

1720691610349

5、 注意事项

2.2.3 - 第三方同步到V8常见问题

常见问题记录。

1、拉取

一般作为初始化使用,运行中不推荐使用,量大而且实时性差。

2、事件订阅、消息队列

异步的,第三方调用后,会甩出mq,然后订阅执行。第三方不能感知是否最后形成事项,需人工检查。

3、关联开放openapi

第三方数据→cip-connector底表(用于判断更新/新增)→调用affair接口。

img1

1、如何通过第三方id查到对应的事项: cip-connector:select id from cip_p_sync_affair where outer_id=’{第三方id}’ ctp-affair:select * from affair where sub_object_id={cip_p_sync_affair的id}

2、capabilityId获取方式:

img2

3、数据内容一个节点多个人,需要节点id+人的id作为第三方的标识。

4、如果相关人员是第三方信息,那么需要提前建立好用户映射

5、待办更新时,目前需要报文中含有所有字段。如果更新时只给id和状态,那么还需要第三方建立底表存储新建时的报文信息。

6、接口成功都会返回第三方标识。接口错误的一种标志如下

img3

3 - 消息同步

通过可视化配置,实现V8平台与多个三方异构系统间的消息同步。

1、概述

通过可视化配置,实现V8平台与多个三方异构系统间的消息同步。

2、集成模式优缺点对比分析

1736493185454

3、集成方向&模式

3.1 - V8同步至三方

集成模式

3.1.1 - 三方系统提供写入OpenAPI

三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成消息同步。

1、概述

三方异构系统提供写入OpenAPI,由COP定时调用接口主动推送,完成消息同步。

2、优缺点

a. 优点

i. 三方系统工作量少,三方无需关注字段映射、同步日志等集成步骤,针对有标准接口的saas产品集成效率更高;

ii. 整个集成步骤都是在图形化操作界面中完成,可以大量节约集成工期和研发投入;

iii. 主动写入,数据时效性高;

b. 缺点

i. 三方系统数据库结构字段要求高,必须满足COP系统事项呈现要求,否则会造成部分功能缺失;

ii. 致远实施工作量大,需要了解三方系统数据库字段要求;

3、操作步骤

序号 步骤名称 责任方 使用场景
1 提供单点登录接口规范和文档 三方系统 非必须,如果COP和三方系统未接入统一身份认证系统,则需要通过单点登录方式免登陆打开事项详情页
2 提供消息写入接口规范和文档 三方系统 必须,
3 注册并配置鉴权AppID和秘钥 三方系统 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要提供
4 提供接口调用示例 三方系统 必须,为了集成效率,强烈建议三方系统提供可直接使用的postman接口调用示例,
5 新建三方集成应用 致远 必须,集成应用负责封装三方系统接口和配置单点登录
6 发布三方集成应用 致远 必须,集成应用只有发布后才能正常使用
7 封装安全认证 致远 非必须,如果三方系统接口调用时涉及到安全鉴权,则需要配置安全认证
8 封装签名 致远 非必须,如果三方系统接口调用时涉及到签名参数,则需要配置签名
9 接口封装 致远 必须,三方系统提供的接口只有正常封装后才能供给COP使用
10 在线调试验证 致远 必须,三方系统接口封装完成后,需要在线调试,验证网络通信、接口返回结果是否正确等
11 单点登录 三方系统 必须,参照【三方系统单点登录打开COP】单点登录模式配置
12 新建消息同步 致远 必须,
13 选择同步模式 致远 必须,
14 配置同步周期 致远 必须,根据数据量和服务器消费能力,合理配置同步周期
15 配置字段映射 致远 必须:三方系统接口文档中的字段名,字段释义与COP不一致,需要配置参数映射、层级转换等

4、集成配置说明

4.1. 新建三方集成应用

1720696192495

4.2. 封装安全认证

1720696198223

1720696202245

4.3. 枚举定义

1720696206213

4.4. 接口封装

1720696209869

1720696222550

1720696226485

1720696230809

1720696234456

1720696238228

1720696242669

4.5. 在线调试验证

1720696247789

1720696252321

4.6. 新建消息同步【致远】

1720696256971

4.7. 选择同步模式【致远】

1720696261083

4.8. 配置字段映射【致远】

1720696265004

1720696269828

4.9. 发布三方集成应用

1720695503483

5、注意事项

3.2 - 三方同步至V8

集成模式

3.2.1 - COP平台开放写入OpenAPI(推荐)

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成消息同步模式。

1、概述

COP平台开放写入OpenAPI,由三方异构系统定时增量推送,完成消息同步模式。

2、核心字段定义

术语 定义 来源 测试数据
appKey V8统一认证中心分配给每个接入应用的唯一标识Id,别名应用Id 致远COP 3e4a140e2509477396fa04ddcd70c3d2
AppSecret V8统一认证中心分配给每个接入应用的加密解密秘钥,别名应用秘钥 致远COP 5bad0b6618934c62bffefe4cc0d8c03d
url前缀 文档中所有接口的请求前缀 致远COP http://openapi-bpm.CC.com.cn
capabilityId 同步能力编码,针对消息同步场景 致远COP 1457957992996539915

3、应用场景

由业务系统定义消息触发条件,并调用【批量同步消息】接口发送消息,数据呈现在【消息中心】栏目;

4、接口签名

4.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

5、集成配置

5.1. 新建集成应用

1720436493245

5.2. 配置单点登录

1720436521388

5.3、新建消息同步,获取消息同步能力编码

1720694867639

1720694898512

1720694936546

1720694958325

5.4、发布应用

1720436814018

5.5、启用API

1720695059883

5.6、新建接入应用

1720436859248

5.7、启用接入应用

1720436868273

5.8、分配APPKey和AppSecret

1720436877815

5.9、应用级别API授权

1720695115541

5.10、按需开启IP白名单

1720437010235

5.11、按需开启限流控制

1720436916930

5.12、API调用日志

1720436930684

6、接口清单

6.1. 【批量】 批量同步消息

6.1.1. 请求地址

【url前缀】/cip-manager/plugin-affair/create-update

6.1.2. 请求参数

参数名称 父节点 是否必填 参数类型 参数描述
requestId true string 请求流水号。同一接入应用下的流水号不要重复;
最长32位,超过部分会被截断。
timestamp true int64 请求时间戳。请求时间和服务器时间不能相差过大,
默认5分钟以内。
notifyUrl false string 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,
执行结果将通过此URL异步通知调用者。
data true PluginMessageBatchDto 请求参数数据
capabilityId data true int64 事项所属基础插件能力。复用插件的用户映射,单点登录等配置。
idType data false enum 发起人/处理人标识类型,
不传递默认OUTER_ID(三方系统ID)。
枚举项可选值列表:
OUTER_ID(三方系统ID),
V8_ID(V8内部ID),
V8_CODE(V8系统编号),
V8_LOGIN_NAME(V8登录名),
V8_PHONE(V8手机号)
messageList data true array[PluginMessageDetailDto] 消息列表
senderId messageList false string 消息发起人标识
externalMessageId messageList true string 消息外部编号
messageSourceCode messageList false string 消息来源
title messageList true string 消息标题
createTimeStamp messageList false int64 消息创建时间戳
openType messageList false string 详情打开方式:
WORKSPACE(工作区),
NEWWINDOW(新窗口,默认值)
todoWebUrl messageList false string 消息WEB端详情地址
todoMobileUrl messageList false string 消息移动端详情地址
receiverDto messageList true MessageReceiverDto 消息接收人对象
userIdList receiverDto false array[string] 消息接收者标识列表(按人员发送消息)。
和unitCodeList至少填一个
unitCodeList receiverDto false array[string] 接收者V8组织编号列表(按组织发送消息)。
和userIdList至少填一个
extendSign receiverDto false boolean 组织是单位时是否包含下级单位(组织是部门时,
固定包含下级部门)

6.1.3. 请求示例

{
  "data": {
    "messageList": [
      {
        "senderId": "MB202306070002",/*致远OA用户Code*/
        "externalMessageId": "11000102",/*业务系统消息Id,唯一*/
        "createTimeStamp": 1688033651186,/*请求时间戳,毫秒级*/
        "todoMobileUrl": "https://www.baidu.com",/*待办事项移动端详情页URL地址*/
        "title": "测试消息头2023年4月19日14:17:06",/*消息标题*/
        "receiverDto": {
          "userIdList": ["MB202306070002"]/*致远OA用户Code*/
        },
        "todoWebUrl": "https://www.baidu.com",/*消息PC端待处理页URL地址*/
         "openType":"NEWWINDOW"/*枚举值,打开方式*/
      }
    ],
    "capabilityId": "1498469601665614061",/*固定值*/
    "idType":"V8_CODE"/*枚举值*/
  },
  "requestId": "1395143136501500012",/*请求流水号,每次请求唯一*/
  "timestamp":1688033651186/*请求时间戳,毫秒级*/
  }

6.1.4. 返回参数

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
status int32 状态
code string 错误码
message string 返回信息

6.1.5. 返回示例

{
    "status": 0,/*成功标识*/
    "code": "BOOT_0000",/*错误码*/
    "message": "SUCCESS",/*返回信息*/
    "data": null
}

3.2.2 - 第三方同步到V8常见问题

常见问题记录。

1、概述

第三方数据→openapi→调用消息接口,和待办不同的是,消息没有底表。 第三方id最大长度限制是43位。

img

4 - 身份认证

支持COP平台单点登录进入三方异构系统,同时支持三方异构系统免登进入COP平台

集成模式

4.1 - 单点登录

COP平台单点登录进入三方异构系统。

1、概述

提供标准的单点登录认证模式,有致远V8颁发临时授权码ticket,三方根据ticket获取当前登录用户信息,完成单点登录。

2、标准单点登录模式

2.1、V8标准单点登录认证(协同认证-V8)

a、说明

V8登录成功后,点击三方系统菜单前,会根据当前登录用户信息,生成临时授权码,在三方原始菜单地址后拼接参数ticket,
三方系统拦截ticket参数,根据【根据ticket获取用户信息】接口获取用户信息,模拟登陆,实现免登进入三方系统。

b、根据ticket获取用户信息接口说明

请求地址

[http://]【COP平台域名】/service/ctp-user/auth/restore

1720432222549

请求方式

POST

请求参数(Body)

参数名称 是否必填 参数类型 参数描述
ticket true string 用户登录后,由用户中心拼接在重定向地址最后的临时授权ticket

请求示例

{
    "ticket": "ngkhgkgd16fdg96dg1d6fg498dfg615"
}

返回参数

参数名称 上级节点 参数类型 参数描述
status int 状态码
code string 响应码
message string 响应信息
data object
content data object
code content string 编号
orgName content string 所属组织
tenantCode content string 租户编码
type content string 账号类型。枚举项可选值列表:NONE(空),MEMBER(内部人员),EXTERNAL_MEMBER(外部联系人)
socialCreditCode content string 统一社会信用代码
orgId content string 所属组织ID
phoneNumber content string 手机号码
outsideOrgName content string 外部单位名称
outsideOrgCode content string 外部单位编码
orgCode content string 所属组织编码
loginName content string 用户名/登录名
name content string 姓名
outsideOrgId content string 外部单位ID
allTenantUserInfo content array 所有租户任职信息
code allTenantUserInfo string 编号
orgName allTenantUserInfo string 所属组织名称
tenantCode allTenantUserInfo string 租户编码
type allTenantUserInfo string 账号类型。枚举项可选值列表:NONE(空),MEMBER(内部人员),EXTERNAL_MEMBER(外部联系人)
socialCreditCode allTenantUserInfo string 统一社会信用代码
orgId allTenantUserInfo string 所属组织ID
phoneNumber allTenantUserInfo string 手机号码
outsideOrgName allTenantUserInfo string 外部单位名称
outsideOrgCode allTenantUserInfo string 外部单位编码
orgCode allTenantUserInfo string 所属组织编码
loginName allTenantUserInfo string 用户名/登录名
name allTenantUserInfo string 姓名
outsideOrgId allTenantUserInfo string 外部单位ID

返回示例

{
  "status": 0,
  "code": "BOOT_0000",
  "message": "SUCCESS",
  "data": {
    "content": {
      "code": "1557587001015575870039",
      "orgName": "致远互联",
      "tenantCode": "cop",
      "type": "INTERNAL",
      "socialCreditCode": null,
      "orgId": "1958919590712968571",
      "phoneNumber": "15575870010",
      "outsideOrgName": null,
      "allTenantUserInfo": [
        {
          "code": "1557587001015575870039",
          "orgName": "致远互联",
          "tenantCode": "cop",
          "type": "INTERNAL",
          "socialCreditCode": null,
          "orgId": "1958919590712968571",
          "phoneNumber": "15575870010",
          "outsideOrgName": null,
          "outsideOrgCode": null,
          "orgCode": "group",
          "loginName": "org-admin",
          "name": "管理员",
          "outsideOrgId": null
        }
      ],
      "outsideOrgCode": null,
      "orgCode": "group",
      "loginName": "org-admin",
      "name": "管理员",
      "outsideOrgId": null
    }
  }
}

2.2、三方提供临时登录授权码模式(标准认证-两次请求)

a、说明

V8登录成功后,点击三方菜单前,携带当前用户身份信息,按照三方系统要求调用三方系统接口,获取临时授权,拼接在URL后,三方拦截参数并解析后,
免登进入三方系统。

3、经典模式

说明:针对高频集成场景,平台默认提供预制的集成方式,实施人员联系三方提供必要的授权参数即可实现V8单点登录三方系统。

3.1、用友认证-YonBIP

说明:V8单点登录用友YonBIP时使用

3.2、关爱通认证

说明:V8单点登录关爱通时使用

3.3、263邮箱认证

说明:V8单点登录263邮箱时使用

3.4、阿里认证-DingTalk

说明:V8单点登录DingTalk时使用

3.5、用友认证-NC65

说明:V8单点登录NC65时使用

3.6、薪事力认证

说明:V8单点登录薪事力时使用

3.7、金蝶认证-我家云

说明:V8单点登录金蝶云时使用

3.8、协同认证-V5

说明:V8单点登录V5时使用

4、注意事项

4.2 - 免登

三方异构系统免登进入V8

版本要求: ctp-user >= 3.2.x

1、概述

平台提供标准的免登认证机制,三方异构系统根据分配的秘钥调用接口获取免登授权码,并按要求拼接免登地址后,即可免登进入COP平台。

2、集成导图

1721380688616

3、集成步骤

3.1、申请APPKey和AppSecret

访问路径:管理后台—>集成平台–>开放平台–>接入应用

1720675794903

1720675856079

1720675898664

3.2、接口调用,获取免登授权码

调用接口【获取免登授权码】接口,接口参数规则说明:

3.3、拼接免登地址

【COP平台访问域名】:COP平台前台访问域名,例如https://saas.seeyonv8.com

【Web端待跳转地址】:免登成功后需要跳转的COP平台地址,例如首页地址:“/main/portal”

【移动端端待跳转地址】:免登成功后需要跳转的COP平台地址,例如首页地址:“/main-mobile/portal”

urlencode:编码函数,为了防止出现参数冲突,【Web端待跳转地址】和【移动端端待跳转地址】需要采用url编码后再拼接到免登地址中

【appKey】:第二步COP平台为每个应用分配的AppKey

【免登授权码】上一步接口获取的免登授权码

免登地址:【COP平台访问域名】/oauth/avoid?web=urlencode(【Web端待跳转地址】)&mobile=urlencode(【移动端端待跳转地址】)&sytype=sytoken&syid=【appKey】&sytoken=【免登授权码】

例如:

https://saas.seeyonv8.com/oauth/avoid?web=%2Fmain%2Fportal&mobile=&sytype=sytoken&syid=cd13f41d30f44d438b05b6588411178f&sytoken=SY-otokx4kfq0wtiwxm

按照以上步骤操作后,URL地址直接写入浏览器URL即可免登进入COP平台首页

3.4、验证免登授权码

注意:联调阶段或者问题定位阶段,使用【验证免登授权码】接口,验证免登授权码是否正常有效;

4、接口清单

4.1、获取免登授权码

请求地址

【COP平台访问域名】/service/ctp-user/auth/avoid/sytoken

请求方式

POST

请求参数(Body) 参数生成示例见 5.2 java 调用示例

参数名称 是否必填 参数类型 参数描述
responseType TRUE string 请求类型,
固定值:create
clientId TRUE string 应用ID,操作步骤中的接入应用-AppKey
例如:cd13f41d30f44d438b05b6588411178f
dataType TRUE string 用户标识键,双方约定的用户标识字段,标识用于生成签名的用户标识键等于COP平台的对应字段
枚举值:
loginName=用户名;
mobile=手机号码;
code=用户编号;
email=邮箱;
userid=用户ID;
dataValue TRUE string AES用户信息加密;当dataType=mobile时,用户手机号码为17300001234,则明文为17300001234
加密配置信息:
      明文:17300001234
      模式:CBC固定模式不可变
      填充:Pkcs7或Pkcs5固定类型不可变
      偏移量:apaasseeyonv8com 固定值不可变
      密文编码:HEX类型不可变
      秘钥:接入应用分配的AppSecret,例如:93ec877511d24dda8cf86a9d7870f681
加密后结果集示例:6d52cb81d4f8ee6359b0559f3aa0bcba
AES在线加密参考网站:http://tool.lvtao.net/aes
signature TRUE string 签名函数,以下四个参数经过自然排序后,拼接成一个字符串,使用SHA256加密
加密前四个参数:
AppKey(接入应用分类的AppKey);
AppSecret(接入应用分配的AppSecret);
data(加密后的用户信息dataValue);
时间戳:请求参数中的timestamp;
如对 “abcd” 进行签名后的结果为 “88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589”
SHA256在线加密参考网站:https://crypot.51strive.com/sha256.html
timestamp TRUE string 毫秒级时间戳,参与生成签名;
例如:“1720669311740”

请求参数示例

{
        "responseType": "create",
        "clientId": "1242bc19f9f6493c9599ba007b9774c9",
        "dataType": "mobile",
        "dataValue": "6d52cb81d4f8ee6359b0559f3aa0bcba", // 对 17300001234 进行加密后的密文
        "signature": "07bf5c43a0297599ea78ca72e85fea72680eb550f4a3dae4ddb4e8575950a148",
        "timestamp": "1720669311740"
    }

响应参数(Body)

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
expireSeconds content string 授权码有效时长,默认-1,仅可使用一次
sytoken content string 免登授权码
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "expireSeconds": "-1",
            "sytoken": "SY-5fdin8jp0jmj8i4p"
        }
    }
}

4.2、验证免登授权码

请求地址

【COP平台访问域名】/service/ctp-user/auth/avoid/sycheck

请求方式

GET

请求参数(Query)

参数名称 是否必填 参数类型 参数描述
sytoken TRUE string 免登授权码
例如:SY-o5vtq1z3bnvecwta
syid TRUE string 应用ID,操作步骤中的接入应用-AppKey
例如:cd13f41d30f44d438b05b6588411178f

请求参数示例

【COP平台访问域名】/service/ctp-user/auth/avoid/sycheck?sytoken=SY-o5vtq1z3bnvecwta&syid=cd13f41d30f44d438b05b6588411178f

响应参数(Body)

参数名称 父节点 参数类型 参数描述
data SingleData 返回值数据
content data void 数据对象
sytokenValid content string 授权码是否有效
syidValid content string syid/AppKey/ClientId是否有效
validity content string 授权码剩余可使用次数
status int32 状态
code string 错误码
message string 返回信息

响应参数示例

{
    "status": 0,
    "code": "BOOT_0000",
    "message": "SUCCESS",
    "data": {
        "content": {
            "sytokenValid": true,
            "syidValid": true,
            "validity": "once"
        }
    }
}

5、调用示例

5.1、ApiFox

注意:将一下内容导出文件名为V8开放平台.apifox.json后,使用APIFox导入即可;

{"apifoxProject":"1.0.0","$schema":{"app":"apifox","type":"project","version":"1.2.0"},"info":{"name":"V8开放平台","description":"","mockRule":{"rules":[],"enableSystemRule":true}},"apiCollection":[{"name":"根目录","id":12310375,"auth":{},"parentId":0,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"methodAndPath","bodyType":"","fields":[]}},"preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"OAuth免登","id":34341447,"auth":{},"parentId":0,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":""}},"preProcessors":[{"type":"customScript","data":"const appkey = pm.environment.get(\"app-key\");\r\nconst appsecret = pm.environment.get(\"app-secret\");\r\nconst signStr = pm.environment.get(\"signStr\");\r\nvar timestamp = new Date().getTime();\r\nconsole.log('timestamp='+timestamp);\r\nvar moment = require('moment');\r\nvar dUTC = new Date();\r\nvar formatDateTime = moment(dUTC).format('YYYY-MM-DD hh:mm:ss');\r\n\r\nvar body = pm.request.body.raw.toString();\r\nconsole.log('body='+body);\r\n\r\n//AES手机号码加密-开始\r\nvar cryptoJs = require(\"crypto-js\");\r\nconst mobile= \"17301103865\"\r\nconst key = CryptoJS.enc.Utf8.parse(appsecret);\r\nconst iv1 = cryptoJs.enc.Utf8.parse('www.seeyonv8.com');\r\nconst encrypted = cryptoJs.AES.encrypt(mobile, key, {\r\n   iv:  iv1,\r\n   mode: cryptoJs.mode.CBC,\r\n   padding: cryptoJs.pad.Pkcs7\r\n}).ciphertext.toString();\r\nconsole.log('encrypted='+encrypted);\r\n//AES手机号码加密-结束\r\n\r\n\r\n//签名计算-开始\r\nvar srcDataArr = [];\r\nsrcDataArr=[appkey, appsecret, encrypted, timestamp];\r\nconsole.log('srcDataArr='+srcDataArr);\r\nsrcDataArr.sort();\r\nconsole.log('srcDataArr='+srcDataArr);\r\nvar srcSign = srcDataArr.join(\"\");\r\nconsole.log('srcSign='+srcSign);\r\nvar signature=CryptoJS.SHA256(srcSign).toString();\r\nconsole.log('signature='+signature);\r\nvar newBody= body.replace('{{clientId}}', appkey)\r\n        .replace('{{timestamp}}', timestamp)\r\n        .replace('{{dataValue}}', encrypted)\r\n        .replace('{{signature}}', signature);\r\n        console.log('newBody='+srcSign);\r\npm.request.body.raw=newBody;\r\n//签名计算-结束\r\n\r\n","defaultEnable":true,"enable":true,"id":"VGKlxRoDhjQqm1tEhZ2V8","executionTiming":"prerequest"},{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"获取Token","api":{"id":"175366254","method":"post","path":"/service/ctp-user/auth/avoid/sytoken","parameters":{"path":[],"header":[]},"auth":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"453493410","name":"成功","code":200,"contentType":"eventStream","jsonSchema":{"type":"object","properties":{}}}],"responseExamples":[],"requestBody":{"type":"application/json","parameters":[{"required":false,"description":"","type":"string","id":"OpdZpqBeRe","example":"韩","enable":true,"name":"query"}],"jsonSchema":{"type":"object","properties":{}},"example":"{\r\n    \"responseType\": \"create\",\r\n    \"clientId\": \"1242bc19f9f6493c9599ba007b9774c9\",\r\n    \"dataType\": \"mobile\",\r\n    \"dataValue\": {{dataValue}},\r\n    \"signature\": {{signature}},\r\n    \"timestamp\": {{timestamp}}\r\n}"},"description":"","tags":[],"status":"developing","serverId":"","operationId":"","sourceUrl":"","ordering":50,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.453493410"],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"验证Token","api":{"id":"175898146","method":"post","path":"/service/ctp-user/auth/avoid/sycheck","parameters":{"query":[{"id":"B0Hw9tnMOB","name":"sytoken","example":"SY-wjls766qqv8zru67","required":false,"description":"","enable":true,"type":"string"},{"id":"ROZGpZw2Aj","name":"syid","example":"1242bc19f9f6493c9599ba007b9774c9","required":false,"description":"","enable":true,"type":"string"}]},"auth":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"454439745","name":"成功","code":200,"contentType":"json","jsonSchema":{"type":"object","properties":{}}}],"responseExamples":[],"requestBody":{"type":"none","parameters":[],"jsonSchema":{"type":"object","properties":{}},"example":""},"description":"","tags":[],"status":"developing","serverId":"","operationId":"","sourceUrl":"","ordering":60,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.454439745"],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]}]}],"socketCollection":[],"docCollection":[],"responseCollection":[{"_databaseId":2268233,"name":"Root","type":"root","children":[],"parentId":0,"id":2268233,"items":[]}],"schemaCollection":[],"requestCollection":[{"name":"根目录","children":[],"items":[{"id":1521000,"name":"百度翻译","method":"post","path":"https://fanyi.baidu.com/langdetect","requestBody":{"type":"multipart/form-data","parameters":[{"type":"string","name":"query","sampleValue":"周","value":"周","enable":true}]},"parameters":{},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"preProcessors":[],"postProcessors":[],"auth":{},"advancedSettings":{},"folderId":0}]}],"environments":[],"commonScripts":[],"globalVariables":[{"id":"2272068","variables":[{"name":"url","value":"https://71d0daa2-2ac9-4a23-bc72-17c90b15a409.mock.pstmn.io","description":"","isBindInitial":true,"initialValue":"https://71d0daa2-2ac9-4a23-bc72-17c90b15a409.mock.pstmn.io","isSync":true}]}],"commonParameters":null,"projectSetting":{"id":"1776703","auth":{},"servers":[{"name":"Pre地址前缀","id":"default"}],"gateway":[],"language":"zh-CN","apiStatuses":["developing","testing","released","deprecated"],"mockSettings":{},"preProcessors":[],"postProcessors":[],"advancedSettings":{},"initialDisabledMockIds":[],"cloudMock":{"security":"free","enable":true,"tokenKey":"apifoxToken"}},"customFunctions":[],"projectAssociations":[]}

5.2、Java

package com.nowhere.demo;

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.concurrent.ConcurrentHashMap;

public class CipAvoidUtils {

    private static final Logger log = LoggerFactory.getLogger(CipAvoidUtils.class);
    private static final String AES_IV = "apaasseeyonv8com"; // 确保这是一个合适的IV字符串

    private static final ConcurrentHashMap<String, AES> AESCache = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        String clientId = "1242bc19f9f6493c9599ba007b9774c9";
        String appSecret = "93ec877511d24dda8cf86a9d7870f681";
        String data = "17300001234";
        String timestamp = "1720669311740";

        // 加密业务参数
        // encryptData = 6d52cb81d4f8ee6359b0559f3aa0bcba
        String encryptData = CipAvoidUtils.encrypt(data, appSecret);
        System.out.println("encryptData = " + encryptData);
        // 数据自然排序
        // sortData = 1242bc19f9f6493c9599ba007b9774c917206693117406d52cb81d4f8ee6359b0559f3aa0bcba93ec877511d24dda8cf86a9d7870f681
        String sortData = CipAvoidUtils.sort(clientId, appSecret, encryptData, timestamp);
        System.out.println("sortData = " + sortData);
        // sha256签名
        // sign = 07bf5c43a0297599ea78ca72e85fea72680eb550f4a3dae4ddb4e8575950a148
        String signature = CipAvoidUtils.sha256(sortData);
        System.out.println("signature = " + signature);
    }

    public static String sha256(String srcData) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(srcData.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("SHA-256 algorithm not found", e);
        }
    }

    /**
     * 将入参进行自然排序
     *
     * @param clientId      客户端ID,对应应用的AppKey, 不能为null或空
     * @param clientSecret  客户端密钥,不能为null或空
     * @param data          加密后的数据,不能为null或空
     * @param timestampPara 时间戳参数,不能为null或空
     * @return 排序后的字符串拼接结果
     */
    public static String sort(String clientId, String clientSecret, String data, String timestampPara) {
        // 检查输入参数的有效性
        if (StringUtils.isAnyBlank(clientId, clientSecret, data, timestampPara)) {
            throw new IllegalArgumentException("All parameters must not be null or empty.");
        }

        String[] srcDataArr = new String[]{clientId, clientSecret, data, timestampPara};
        Arrays.sort(srcDataArr);
        return String.join("", srcDataArr);
    }

    /**
     * 使用指定密钥加密字符串数据
     *
     * @param data 待加密的数据,不能为null或空
     * @param key  加密密钥,接入应用分配的 AppSecret 的值
     * @return 加密后的字符串
     */
    public static String encrypt(String data, String key) {
        // 检查输入数据和密钥是否有效
        if (StringUtils.isAnyBlank(data, key)) {
            throw new IllegalArgumentException("Data and key must not be null or empty.");
        }

        try {
            // 根据密钥获取AES加密器实例
            AES aes = getAes(key);
            // 使用AES加密器加密数据并以十六进制字符串形式返回
            return aes.encryptHex(data);
        } catch (Exception e) {
            // 记录加密失败的错误信息
            log.error("Encryption failed: {}", e.getMessage(), e);
            // 将加密过程中捕获的异常包装成RuntimeException重新抛出
            throw new RuntimeException("Encryption failed", e);
        }
    }

    /**
     * 解密字符串
     * 使用提供的密钥对加密数据进行解密
     *
     * @param encryptedData 加密后的数据,不能为空
     * @param key           加密密钥,接入应用分配的 AppSecret 的值
     * @return 解密后的字符串
     */
    public static String decrypt(String encryptedData, String key) {
        // 检查输入参数的有效性
        if (StringUtils.isAnyBlank(encryptedData, key)) {
            throw new IllegalArgumentException("Encrypted data and key must not be null or empty.");
        }

        try {
            // 根据密钥获取AES实例
            AES aes = getAes(key);
            // 解密数据
            return aes.decryptStr(encryptedData);
        } catch (Exception e) {
            // 记录解密失败的错误信息
            log.error("Decryption failed: {}", e.getMessage(), e);
            // 将解密过程中发生的异常包装成运行时异常重新抛出
            throw new RuntimeException("Decryption failed", e);
        }
    }

    private static AES getAes(String key) {
        return AESCache.computeIfAbsent(key, k -> {
            try {
                return new AES(Mode.CBC, Padding.PKCS5Padding, k.getBytes(StandardCharsets.UTF_8), AES_IV.getBytes(StandardCharsets.UTF_8));
            } catch (Exception e) {
                log.error("Failed to create AES object for key: {}", k, e);
                throw new RuntimeException("Failed to create AES object", e);
            }
        });
    }
}

6、注意事项

4.3 - 三方统一身份认证

针对市场上热门的三方统一身份认证系统,平台提供了开箱即用的接入机制。

1、概述

针对市场上热门的三方统一身份认证系统,平台提供了开箱即用的接入机制。

2、预制统一身份认证清单

2.1、信安

2.2、腾讯玉符

2.3、派拉

2.4、CAS

2.5、SAML2

3、集成配置步骤

3.1、使用系统管理员账号登录管理后台

1720680502608

3.2、进入认证服务

1720680522109

3.3、按需选择预制三方统一身份认证系统

1720680536421

3.4、按需选择客户端类型

1720680626988

3.5、联系三方统一身份认证系统获取授权信息

1720680698008

3.6、重启微服务ctp-user

3.7、前台验证

注意,在未登录情况下,浏览器地址中输入【COP平台访问域名】/main/portal时,系统系统跳转到三方统一身份认证页,属于对方账号密码后可以正常进入COP首页,标识配置正确并生效。

5 - OpenAPI集成

支持COP平台内,预制应用、低代码定制应用、BPM表单应用、三方集成应用通过自注册机制开放OpenAPI和事件。

1、概述

支持COP平台内,预制应用、低代码定制应用、BPM表单应用、三方集成应用通过自注册机制开放OpenAPI和事件。

2、集成场景

5.1 - 开放OpenAPI

基于标准的OpenAPI管理平台,提供丰富的数据开放能力。

1、概述

提供一套标准的OpenAPI管理平台,允许平台内原始应用、UDC自建应用和三方集成应用接入并分享OpenAPI,且支持相同的签名和调用规范,用以促进COP平台与三方系统数据间的快速集成。

2、集成步骤

序号 步骤名称 描述
1 API查看 非必须,查看可用的API清单
2 API扩展-UDC发布实体API 非必须,UDC-实体-开放OpenAPI,可以配置开放OpenAPI,在应用成功发布后,
OpenAPI可以发布到开放平台,遵循开放平台授权管理规范
3 UDC发布自定义API 非必须,UDC-规则-自定义服务,可以配置开放OpenAPI,在应用成功发布后,
OpenAPI可以发布到开放平台,遵循开放平台授权管理规范
4 三方集成应用开放API 非必须,三方集成应用可以封装三方接口后,启用能力开放,应用发布并启用后,
三方接口会发布至开放平台,遵循开放平台授权管理规范
5 刷新API 非必须,API接口更新后,COP会异步将更新后的API发布至开放平台,如果需要立即查看,
可以在API管理页面点击刷新API按钮刷新API清单
6 启用API 必须,API一级授权,只有启用API,接入应用才可以选择到对应的API。
7 新建接入应用 必须,承载API二级授权配置和IP白名单、使用日志等信息
8 启用接入应用 必须,未启用时,调用接口会提示API未启用
9 分配APPKey和AppSecret 必须,新建接入应用时,会自动生成APPKey和AppSecret,三方系统调用接口时,
需要根据以上两个参数生成签名
10 应用级别API授权 必须,API二级授权,针对当前Appkey添加可访问API
11 导出接口文档 非必须,导出当前接入应用已授权API接口文档
12 IP白名单 非必须,支持IP白名单配置,不配置时所有IP均可访问
13 限流控制 非必须,支持某个时间段内访问频率限制
14 API调用日志 必须,用户根据API调用日志,定位错误

3、集成步骤配置说明

3.1. 进入管理后台

1720573923636

3.2. API查看

1720573928621

注意事项:

各个微服务中会有starter中暴露出来的公共OpenApi,例如:,默认不是所有应用都开启,需要使用系统管理员账号system-admin登录手动开启,见下图。

openapi3

开启公共api的应用效果如下:

openapi

未开启公共api的效果如下:

openapi2

问题排查:

api列表中未显示,可先查询元数据,看元数据中是否存在该openapi,https://域名或ip端口//service/cip-manager/metadata/open-api?appName=应用名称
示例地址:https://pre.seeyonv8.com/service/cip-manager/metadata/open-api?appName=ctp-affair

openapi4

3.3. API扩展-UDC/BPM发布实体API

1720573933269
1720573937953

1720573946287

1720573951664

3.4. UDC/BPM发布自定义API

1720573956829

1720573964641

1720573972433

1720573981143

1720573986436

3.5. 三方集成应用开放API

1720573991399

1720573996087

1720574001857

3.6. 刷新API

1720574007516

3.7. 启用API

1720574012269

3.8. 新建接入应用

1720574017657

3.9. 启用接入应用

1720574022557

3.10. 分配APPKey和AppSecret

1720574028822

3.11. 应用级别API授权

1720574034095

3.12. 导出接口文档

1720574039183

3.13. IP白名单

1720574044253

3.14. 限流控制

1720574049065

3.15. API调用日志

1720574053883

4、API签名规则介绍

4.1、请求头(Header)

参数名称 是否必填 参数说明
app-key true 应用的唯一标识,创建接入应用后生成,可在应用基础信息页面获得。
示例:d43b0b442cf34076a2c4af6bb8928afb
sign-type true 固定值:MD5
sign true 签名,字符串“AppSecret+请求体的JSON字符串+AppSecret”的MD5值(MD5值忽略大小写)
AppSecret,为应用的秘钥,创建接入应用后生成,可在应用基础信息页面获得。
示例:154fa5bc7e294deda68a15559b07c845请求体的JSON字符串,
需要将请求体中的请求参数转换为JSON字符串。
Accept-Language false 语种:用以设置开放平台OpenAPI运行时上下文的语种参数。
枚举项可选值列表:zh-CN(简体中文),
zh-TW(繁体中文),
en(英文),
其他枚举项请参照平台语种列表。

4.2、签名示例(sign)

String secret = "154fa5bc7e294deda68a15559b07c845";
String body = "{"name": "张三", "age": 35, "company": {"name": "致远", "address": "北京"}";
String sign = Md5(secret + body + secret); // 结果是 01a8795a7fe6dda23aaec40de3d301b7;

5、错误码

错误码 错误码说明
OPEN_GATEWAY_1000 调用开放api异常
OPEN_GATEWAY_1002 token无效或者已过期
OPEN_GATEWAY_1004 请求参数不是合法的json
OPEN_GATEWAY_2004 应用访问API次数过多,目前暂无可用次数
OPEN_GATEWAY_3000 无权访问该接口
OPEN_GATEWAY_3001 访问路径不对
OPEN_GATEWAY_4000 缺少签名参数
OPEN_GATEWAY_4001 缺少appKey
OPEN_GATEWAY_4002 缺少requestId
OPEN_GATEWAY_5000 无效的签名
OPEN_GATEWAY_5001 无效的appKey
OPEN_GATEWAY_5002 非法时间戳
OPEN_GATEWAY_5006 无效的IP
OPEN_GATEWAY_5008 无权访问指定数据
OPEN_GATEWAY_6000 应用未上线
OPEN_GATEWAY_6001 请求URL非法
OPEN_GATEWAY_6002 API尚未启用
OPEN_GATEWAY_6003 不允许跨租户访问数据
BPM_2136 通过根实体{0}找到多个流程模板
UDC_DEDUCTION_RULE_0001 来源实体已绑定关系图:{0}
UDC_DEDUCTION_RULE_0002 来源实体版型不是单据
UDC_DEDUCTION_RULE_0003 目标实体版型是单据
UDC_DEDUCTION_RULE_0004 关系图形定义json格式化错误
UDC_DEDUCTION_RULE_0005 关系图形下存在扣减规则
UDC_DEDUCTION_RULE_0006 来源实体id为空
UDC_DEDUCTION_RULE_0007 规则编码重复
UDC_DEDUCTION_RULE_0008 关系图形定义连线中存在首尾为同一个实体的连线,重复实体为:{0}
UDC_DEDUCTION_RULE_0009 参与算法的目标字段不是目标末级实体字段
UDC_DEDUCTION_RULE_0010 非法字段:{0}
UDC_DEDUCTION_RULE_0011 不是数值类型字段
UDC_DEDUCTION_RULE_0012 规则中实体体系不合法
UDC_DEDUCTION_RULE_0013 单据状态:{0},未绑定算法
UDC_DEDUCTION_RULE_0014 检查规则中目标实体只能是末级实体
UDC_DEDUCTION_RULE_0015 固定值属性为空
UDC_DEDUCTION_RULE_0016 常量对应的数据类型:{0}与属性值:{1}不一致
UDC_DEDUCTION_RULE_0017 不支持的数据类型:{0}
UDC_DEDUCTION_RULE_0018 目标字段:{0},数据类型:{1},与来源字段:{2},数据类型:{3}不匹配
UDC_DEDUCTION_RULE_0019 扣减规则{0}已正式发布,无法删除!
UDC_DEDUCTION_RULE_0020 目标字段:[{0}]常量查找方式,来源为空!
SCHEDULE_0000 不支持在当月其他日期指定“l”和“lw”。
SCHEDULE_0001 不支持在一周中的其他日期指定“l”
SCHEDULE_0002 不支持指定多个“n”天。
SCHEDULE_0003 表达式意外结束。
SCHEDULE_0004 不支持同时指定星期几和月日参数。
SCHEDULE_0005 cron表达式格式非法
SCHEDULE_0006 月值无效
SCHEDULE_0007 无效的星期日值
SCHEDULE_0008 介于1和5之间的数值必须跟在“%23”选项后面
SCHEDULE_0009 此位置的非法字符
SCHEDULE_0010 “?”后的字符非法
SCHEDULE_0011 ‘?‘只能为月日或周日指定。
SCHEDULE_0012 ‘?‘只能为月日或周日指定。
SCHEDULE_0013 “/”后面必须跟一个整数。
SCHEDULE_0014 字符串意外结束。
SCHEDULE_0015 与最后一天的偏移量必须<=30
SCHEDULE_0015 与最后一天的偏移量必须<=30
SCHEDULE_0015 与最后一天的偏移量必须<=30
SCHEDULE_0017 递增
SCHEDULE_0018 星期几值必须介于1和7之间星期几值必须介于1和7之间
SCHEDULE_0019 ‘L’选项在此处无效
SCHEDULE_0020 ‘W’选项在此处无效
SCHEDULE_0021 如果值大于31(一个月内的最大天数),“w”选项没有意义
SCHEDULE_0022 ‘#‘选项在此无效
SCHEDULE_0023 介于1和5之间的数值必须跟在“%23”选项后面
SCHEDULE_0024 ‘/‘后面必须跟一个整数。
SCHEDULE_0025 意外字符
SCHEDULE_0026 之后
SCHEDULE_0027 分钟和秒值必须介于0和59之间
SCHEDULE_0028 小时值必须介于0和23之间
SCHEDULE_0029 日值必须介于1和31之间
SCHEDULE_0030 月份值必须介于1和12之间
SCHEDULE_0031 星期几值必须介于1和7之间
SCHEDULE_0032 开始年份必须小于停止年份
SCHEDULE_0033 遇到意外类型
UDC_DATAFLOW_CONVERT_0002 类型转换需要配置来源和目标数据类型
UDC_DATAFLOW_CONVERT_0001 不支持的数据类型转换!
UDC_DATAFLOW_1001 当前选择的生单规则下包含映射规则定义,不能删除!
UDC_DATAFLOW_1002 definition属性的数据格式不是有效的json格式!
UDC_DATAFLOW_1003 生单规则图中{0}实体已经不存在,请清理之后再执行此操作
UDC_DATAFLOW_1004 生单规则{0}已正式发布,无法删除!
UDC_DATAFLOW_0003 {0}不能为null!
UDC_DATAFLOW_0004 您设置的从{0}字段【{1}】拷贝到{2}字段【{3}】不正确,字段类型不一致!
UDC_DATAFLOW_0007 【{0}】实体所在区域来源实体字段不属于同一个体系!
UDC_DATAFLOW_0008 【{0}】实体所在区域目标实体数据查找条件设置有误,请检查并修正!
UDC_DATAFLOW_0009 事件订阅类型映射规则需要选择事件!
UDC_DATAFLOW_0010 映射规则中目标实体不能重复选择!
UDC_DATAFLOW_0011 目标实体关键字段必须包含主实体字段!
UDC_DATAFLOW_0012 目标实体关键字段必须参与映射!
UDC_DATAFLOW_0013 当前应用下映射规则编码不能重复!
UDC_DATAFLOW_0014 回写规则设置的来源实体【{0}】没有参与映射规则设置!
UDC_DATAFLOW_0015 回写规则设置的映射到来源字段【{0}】的字段
或者表达式不是映射规则中当前实体映射到的实体字段
UDC_DATAFLOW_0016 【{0}】实体映射区域目标实体数据查找条件的来源字段
或目标字段所属实体不在同一个体系!
UDC_DATAFLOW_0017 保存之后会存在循环映射,路径:{0},请检查并修改!
UDC_DATAFLOW_0018 【{0}】实体回写区域目标实体字段不是同一个体系!
UDC_DATAFLOW_0019 【{0}】实体所在区域目标实体字段【{1}】存在重复!
UDC_DATAFLOW_0020 【{0}】字段不支持参与映射,请修改!
UDC_DATAFLOW_0021 【{0}】字段不支持参与条件,请修改!
UDC_DATAFLOW_0022 映射规则中回写规则来源实体不能重复!
UDC_DATAFLOW_0023 回写规则【{0}】实体所在区域来源实体字段【{1}】存在重复!
UDC_DATAFLOW_0024 【{0}】实体映射区域目标实体数据查找条件的目标字段
需要是当前区域实体和聚合根实体之间的实体字段
UDC_DATAFLOW_0025 映射规则中存在有目标实体到聚合根实体之间没有参与映射的实体
UDC_DATAFLOW_0026 您设置的从{0}字段【{1}】拷贝到{2}字段【{3}】不正确,绑定的{4}不一致
UDC_DATAFLOW_0027 您设置的从{0}字段【{1}】拷贝到{2}字段【{3}】不正确,绑定的实体不一致
UDC_DATAFLOW_0028 【{0}】字段映射方式错误
UDC_DATAFLOW_0029 {0}不支持当前映射方式
UDC_DATAFLOW_0030 【{0}】字段不支持当前映射方式
UDC_DATAFLOW_0031 只有新建类型映射规则的回写时机才可以选择目标新增时
UDC_DATAFLOW_0034 拆单字段必需是拆行实体下的字段
UDC_DATAFLOW_0035 数据类型为数字的才能设置拆单字段
UDC_DATAFLOW_0039 【{0}】版型实体不支持参与生单规则
UDC_DATAFLOW_0041 拆行实体只能是来源实体的主和子实体
UDC_DATAFLOW_0042 拆单字段必需参与映射
UDC_DATAFLOW_0043 {0}已不存在,请检查并修改后再执行此操作
UDC_DATAFLOW_0044 映射规则的目标实体必须是当前应用
UDC_DATAFLOW_0045 普通应用只能建立应用内的映射规则
UDC_DATAFLOW_0046 表单应用只能建立当前应用和依赖应用的映射规则
UDC_DATAFLOW_0047 【{0}】实体元数据有缺失,请修改一下实体内任意信息,
以便重新更新下元数据中心数据
UDC_DATAFLOW_0048 映射规则表达式中的实体信息有误,请检查并重新设置
UDC_DATAFLOW_0049 映射规则表达式中的字段信息有误,请检查并重新设置
UDC_DATAFLOW_0050 目标实体关键字映射方式为计算公式时,表达式中不能包含目标实体字段
UDC_DATAFLOW_0051 字段【{0}】为多选实体字段不能映射到单选实体字段
UDC_DATAFLOW_0052 字段【{0}】为多选{1}字段不能映射到单选{2}字段
UDC_DATAFLOW_0053 事件订阅类型映射规则来源实体查找条件不能为空
UDC_DATAFLOW_0054 事件订阅类型映射规则来源实体查找条件中实体信息有误
UDC_DATAFLOW_0055 事件订阅类型映射规则来源实体查找条件中字段信息有误
UDC_DATAFLOW_0056 字段【{0}】为多选附件字段不能映射到单选附件字段
UDC_DATAFLOW_0057 回写时机单选目标更新时,才可以设置旧值参与表达式
UDC_DATAFLOW_0058 【{0}】字段固定值设置有误
UDC_DATAFLOW_0059 【{0}】实体映射区域来源实体设置了拆行实体子孙实体参与映射
UDC_DATAFLOW_0060 手工触发映射规则来源实体列表方案参数有误
UDC_DATAFLOW_0061 列表方案条件字段不在选择实体中
UDC_DATAFLOW_0062 列表方案条件字段数据类型不正确
UDC_DATAFLOW_0063 列表方案显示列必需包含拆单字段
UDC_DATAFLOW_0064 列表方案可选实体为参与映射规则的所有实体,
及其与根实体之间的所有实体(包含根实体)
UDC_DATAFLOW_0065 来源实体列表方案显示字段不存在
UDC_DATAFLOW_0066 来源实体列表方案选择实体不是一个体系
UDC_DATAFLOW_0067 来源实体列表方案选择实体不连续
UDC_DATAFLOW_0068 来源实体列表方案排序字段不存在
UDC_DATAFLOW_0069 来源实体列表方案排序字段不是主表字段
UDC_DATAFLOW_0070 来源实体列表方案条件字段不存在
UDC_DATAFLOW_0071 新建数据、新建或更新数据类型生单规则,需要选择PC端目标详情页面。
UDC_DATAFLOW_0073 新建数据、新建或更新数据类型生单规则,需要选择移动端目标详情页面。
UDC_DATAFLOW_0074 {0}实体的必填字段:{1}必需参与映射
UDC_DATAFLOW_0075 【{0}】映射区域中参与映射条件的来源实体必需是当前映射区域来源实体范围内
UDC_DATAFLOW_0076 列表方案显示字段不是选择实体下的字段
UDC_DATAFLOW_0077 列表方案选择的实体不存在
UDC_DATAFLOW_0078 来源实体列表方案搜索字段不存在
UDC_DATAFLOW_0079 列表方案搜索字段不是选择实体下的字段
BOOT_3006 License无此功能授权
UDC_MICROFLOW_RUNTIME_0001 {0}
UDC_MICROFLOW_RUNTIME_0002 连接器节点执行失败!status:{0},code:{1},message:{2}
UDC_MICROFLOW_RUNTIME_0003 [{0}]是必填的
UDC_MICROFLOW_RUNTIME_0004 映射值类型转换失败,微流程执行中止!
UDC_MICROFLOW_RUNTIME_0005 未实现的自定义微流程
CIP_CUSTOM_2001 集成应用名称已存在
CIP_CUSTOM_2002 重试操作失败
SERIALNUMBER_1000 流水号Key值不能为空
SERIALNUMBER_1001 新设置的当前值应大于等于原有的当前值
SERIALNUMBER_1002 编码规则编码或者名称不能为空
SERIALNUMBER_1003 流水段不允许删除
SERIALNUMBER_1004 当前值长度不能超过流水号长度
SERIALNUMBER_1005 编码规则创建失败
SERIALNUMBER_1006 补位符号设置有误
SERIALNUMBER_1007 当前值不能为空
SERIALNUMBER_1008 流水段有且只能有一段
SERIALNUMBER_1009 无流水依据时,设置的当前值不能小于1,不能大于99999
SERIALNUMBER_1010 设置的当前值不能小于1,不能大于99999
SERIALNUMBER_1011 设置的当前值不能小于已流水的值
SERIALNUMBER_1012 有流水依据的不可以用此接口生成空号
SERIALNUMBER_1013 规则编码不允许重复
SERIALNUMBER_1014 分段值不允许为空
SERIALNUMBER_1015 分段值超长
SERIALNUMBER_1016 流水段长度必须大于0
SERIALNUMBER_1017 流水段个数介于1和6之间
SERIALNUMBER_1018 预制流水号不允许删除
SERIALNUMBER_2001 规则ID不能为空
SERIALNUMBER_2002 请输入非负的整数进行查询
SERIALNUMBER_2003 开始值不能小于结束值
SERIALNUMBER_2004 开始值或结束值要介于1和100000之间
SERIALNUMBER_2005 和预留号(段)[{0}]重复,请修改
SERIALNUMBER_3001 编码规则[{0}]已停用
SERIALNUMBER_3002 编码规则[{0}]生成流水号,缺少必要段{1}的值
SERIALNUMBER_3003 编码规则[{0}]流水号溢出,请重新设置流水段长度
SERIALNUMBER_3004 流水生成失败:流水依据字段【{0}】不能为空.
BASIC_0001 数据不存在
BASIC_0002 必填项【{0}】为空
BASIC_0003 单次查询最大限制【{0}】条
CIP_MOBILE_0001 未启用微协同
CIP_MOBILE_0002 部门用户没权限开启
CIP_MOBILE_0003 三方配置不存在
CIP_MOBILE_0004 重复的接入应用名称
CIP_MOBILE_0005 重复的同步机构数据
CIP_MOBILE_0006 配置不正确或者未开启必要权限
CIP_MOBILE_0007 应用发布失败
CIP_MOBILE_0008 重复的AgentID配置
CIP_MOBILE_0009 重复的AppKey配置
CIP_MOBILE_0010 重复的AppID配置
CIP_MOBILE_0011 重复的同步方案名称
CIP_MOBILE_0012 重复的模板配置
CIP_MOBILE_1001 部门未创建
CIP_MOBILE_1002 请填写正确的corpId
CIP_MOBILE_1003 所选组织无数据
CIP_MOBILE_1004 正在导出中
CIP_MOBILE_2001 重复的小程序版本号
CIP_MOBILE_2002 授权结果查询失败
CIP_MOBILE_2003 已存在未通过审核的版本
PLUGIN_0001 同名插件已经存在,请更换名称
PLUGIN_0002 连接器不存在
PLUGIN_0003 不允许修改连接器
PLUGIN_0004 内部用户/外部用户已经配置
PLUGIN_0005 待办不存在或者调用待办中心接口出错
PLUGIN_0006 执行连接器动作出错!原始错误:{0}
PLUGIN_0007 获取外部组织树失败
PLUGIN_0008 参数【{0}】不合法
PLUGIN_0009 名称已存在
PLUGIN_0010 超过用户映射列数量上限,自定义列最多6
PLUGIN_0011 默认岗位和职务必须属于同一组织
PLUGIN_0012 插件外部值不允许重复
PLUGIN_0013 插件已经存在同名的能力
PLUGIN_0014 用户不存在
PLUGIN_0015 插件不存在
PLUGIN_0016 插件导入失败
PLUGIN_0017 ldap执行失败
PLUGIN_0018 连接器事件只能绑定一次,该连接器事件已经被绑定。
PLUGIN_0019 NC数据解析异常。
PLUGIN_0020 查询元数据失败
PLUGIN_0021 查询用户映射信息失败,原始错误:{0}
PLUGIN_0022 插件当前已被禁用,操作无法继续
PLUGIN_0023 用户映射信息不完整
PLUGIN_0024 用户映射导入正在进行,请稍后再试
PLUGIN_0025 检索结果过多,请优化检索条件
ENTITY_EXPR_0001 表达式运行态实体上下文组装,参数为空
ENTITY_EXPR_0002 未获取到聚合根实体
UDC_FORM_0001 获取元数据{0}失败
UDC_FORM_0002 方法调用失败:{0}
UDC_FORM_0003 上传前端资源失败:{0}
UDC_FORM_0004 菜单资源加载失败
VOUCHER_0001 获取外部系统访问token失败
VOUCHER_0002 无法连接三方凭证系统
VOUCHER_0003 调用三方凭证系统失败。原始错误码:{0},错误描述:{1}
VOUCHER_0004 每个组织/部门只能映射一个会计主体
VOUCHER_0005 该流程已经配置凭证映射
VOUCHER_0006 凭证当前状态不支持此操作
VOUCHER_0007 科目已经映射成其它外部科目
VOUCHER_0008 获取凭证的实体数据失败
VOUCHER_0009 名称或者编号已经被占用
VOUCHER_0010 数据同步不能并发执行
VOUCHER_0011 NC服务异常
VOUCHER_0012 该模板编号的凭证设置已有记录,不可重复录入
VOUCHER_0013 科目不可重复
VOUCHER_0014 制单人没有做人员映射
VOUCHER_0015 每条单据都必须是保存态才能进行合并
VOUCHER_0016 每条单据所绑定的凭证插件必须相同
VOUCHER_0017 每条单据的账簿和凭证类型都应相同
VOUCHER_0018 凭证插件ID是查询必需条件
VOUCHER_0019 获取流程实体数据失败
VOUCHER_0020 凭证合并必须最少两条数据
VOUCHER_0021 调用NC凭证接口异常:{0}
VOUCHER_0022 参与合并的凭证有的已生凭
VOUCHER_0023 没有找到此流程的凭证设置
VOUCHER_0024 调用BPM获取流程详情失败
VOUCHER_0025 暂不支持该辅助核算项同步
VOUCHER_0026 科目映射不支持特殊符号
VOUCHER_0027 凭证初始化数据错误
VOUCHER_0028 访问地址不在白名单中
UDC_COMMON_0003 {0}
BOOT_0000 成功
BOOT_1000 业务异常
BOOT_2000 IO错误
BOOT_3000 系统错误
BOOT_4000 数据库错误
BOOT_5000 未知异常
BOOT_1001 参数错误
BOOT_1002 请求重复
BOOT_1003 未认证
BOOT_1004 对不起,你没有资源访问权限!
BOOT_1005 不支持该操作
BOOT_1006 Token无效
BOOT_1007 幂等参数不合法
BOOT_1008 序列号溢出
BOOT_1009 枚举不允许变更
BOOT_1010 配置错误
BOOT_1011 已过期
BOOT_1012 Token过期
BOOT_1013 CSRF认证失败
BOOT_1014 租户不正确
BOOT_1015 请求参数的长度不能超过{0}
BOOT_2001 网络通信异常
BOOT_3001 系统限流
BOOT_3002 JSON反序列化错误
BOOT_3003 系统降级
BOOT_3004 License不合法
BOOT_3005 License限制
BOOT_3006 License无此功能授权
BOOT_3006 License无此功能授权
BOOT_4001 事务异常
BOOT_4002 数据不存在或无权限查看
BOOT_4003 数据不唯一
BOOT_4004 约束异常: {0}
BOOT_4005 乐观锁校验异常
BOOT_4006 数据库字段类型错误
BOOT_4007 对象被使用
BOOT_4008 PageSize设置超长
BOOT_4013 文件大小不能超过{0}
BOOT_5001 RPC调用异常
BOOT_6001 第三方HTTP调用异常
BOOT_7001 跨环境迁移导出异常
BOOT_7002 跨环境迁移导入异常
BOOT_7003 跨环境迁移获取聚合根为空
BOOT_8000 应用加载中,请稍后重试!
UDC_DATATYPE_0001 长度不能小于0。
UDC_DATATYPE_0002 长度设置错误。
UDC_DATATYPE_0004 最大值不能小于最小值。
UDC_DATATYPE_0005 最小值取值太小,允许的最小值为{0}。
UDC_DATATYPE_0006 最大值取值太大,允许的最大值为{0}。
UDC_DATATYPE_0007 默认值超出设定精度
UDC_DATATYPE_0008 默认值超出设定长度
UDC_DATATYPE_0009 精度超出设定长度
UDC_DATATYPE_0010 默认值格式不正确:{0}
UDC_DATATYPE_0011 默认值超出取值范围。{0}
UDC_DATATYPE_0012 “{0}“字段最大/最小值超出范围
UDC_DATATYPE_0013 {0}关联属性设置错误
UDC_DATATYPE_0014 {0}关联实体或者枚举不存在
UDC_DATATYPE_0015 {0}关联枚举不存在
UDC_DATATYPE_0016 {0}关联选项集不存在
UDC_DATATYPE_0017 {0}关联实体不存在
UDC_DATATYPE_0018 {0}关联流水号不存在
EXPRESSION_0001 函数未定义:{0}
EXPRESSION_0002 函数参数不匹配:{0}
ENTITY_0001 修改传入ID不能为空!
ENTITY_0002 删除传入ID不能为空!
ENTITY_0003 非修改状态的不应传入!
ENTITY_0010 {0}
ENTITY_0021 {0}不可为空
ENTITY_0022 【{0}】长度需要在{1}和{2}之间。
ENTITY_0023 【{0}】不能大于{1}
ENTITY_0024 【{0}】不能小于{1}
ENTITY_0025 {0}小数位数不能超过{1}
ENTITY_0026 {0}无效的日期或时间格式
ENTITY_0027 {0}最多选择{1}个,当前已选{2}个,请修改
ENTITY_0028 {0}不是标准的多选实体格式:{1}
ENTITY_0029 {0}是单选附件,不能上传多个文件。
ENTITY_0030 [{0}]格式错误: {1}
PROCESS_0001 发起流程失败: {0}
PROCESS_0002 处理流程失败: {0}
FORMULA_6001 操作符: {0} ,不合法
FORMULA_6002 操作符: {0} ,右侧不合法
FORMULA_6003 不支持的返回值类型: {0}
FORMULA_6004 表达式不合法
FORMULA_6005 schema:{0}中,存在属性没有 ’name’
FORMULA_6006 schema:{0}中,存在属性没有 ‘description’
FORMULA_6007 schema:{0}中,存在属性没有 ’type’
FORMULA_6008 schema:{0}中,存在节点没有 ‘properties’ 属性
FORMULA_6009 schema:{0}中, ‘properties’的类型必须为array
FORMULA_6010 schema:{0}中, ‘properties’ 没有子元素
FORMULA_6011 schema:{0}中, array类型的节点必须含有items
FORMULA_6012 schema:{0}中, items必须含有属性’type’
FORMULA_6013 schema:{0}中, items type为’object’时,需要’peroperties’属性
FORMULA_6014 schema:{1}中不支持的节点type:{0},及支持tring,integer…等基础类型
FORMULA_6015 schema:{1}中不支持的不支持的attribute type: {0}
FORMULA_6016 枚举属性必须得有controlType ‘ENUM’
FORMULA_6017 枚举属性必须得有controlId
FORMULA_6018 schema错误
FORMULA_6019 operator中变量{0} 不是schema中的key
FORMULA_6020 表达式包含用户变量,但是schema为空
FORMULA_6021 获取对象属性失败
FORMULA_6022 mock数据异常
FORMULA_6023 语法校验失败:{0}
FORMULA_6024 表达式校验失败, {0}
FORMULA_6025 表达式预执行失败: {0}
FORMULA_6026 当前操作符无法匹配到系统变量
FORMULA_6027 当前参数类型不支持
FORMULA_6028 rootName不能为空
FORMULA_6029 未集成参数配置组件
FORMULA_6030 配置参数上下文获取,参数id和appId不能为同时为空
FORMULA_6032 上下文属性: {0}缺少 properties
FORMULA_6033 上下文属性: {0}不支持的数据类型: {1}
FORMULA_6034 节点{0} items不能为空
FORMULA_6035 节点{0}枚举属性信息定义不正确,请检查
FORMULA_6036 明细函数配置不正确,请检查: {0}
FORMULA_6037 页面字段参与表达式执行错误: {0} , {1}
FORMULA_6038 聚合字段作为函数参数不支持嵌套表达式
FORMULA_6039 聚合属性必须为数字
FORMULA_6040 明细表或一对多子表字段只能作为聚合类型函数的参数!
FORMULA_6041 明细表函数条件不能直接使用明细表对象,请选择明细表字段!
FORMULA_6042 明细表函数条件设置错误,请选择明细表字段!
FORMULA_6043 明细表函数条件内只能选择同一个明细表下的字段
FORMULA_6044 明细表函数无法嵌套明细表函数!
FORMULA_6045 函数:{0}之后键入的符号不正确,仅能键入操作符!
FORMULA_6046 操作符: ) ,右侧不能为变量或函数或系统变量
FORMULA_6047 操作符: {0}之后拼接不合法,只能拼接函数、变量和常量
FORMULA_6048 变量: {0}后只能拼接操作符
FORMULA_6049 函数: {0} ,参数个数不匹配 , 请检查参数设置!
FORMULA_6050 取整函数,参数必须为数字类型!
FORMULA_6051 数字: {0} ,超过整数最大界限!
FORMULA_6052 函数【获取系统参数值】只能处理系统参数!
FORMULA_6053 系统参数【{0}】未定义
FORMULA_6054 函数【获取指定下标文本】下标超过文本数组下标
FORMULA_6055 函数【获取指定下标文本】参数类型只能为文本数组或集合
FORMULA_6056 明细表函数【{0}】 ,条件设置错误: {1}
FORMULA_6057 括号匹配失败请检查
FORMULA_6058 变量:{0}在上下文中不存在,请确认!
FORMULA_6059 上下文属性: {0} ,名称重复
FORMULA_6060 取商函数,被除数必须为数字类型
FORMULA_6061 取商函数,除数必须为数字类型
FORMULA_6062 计算结果超过取值范围
FORMULA_6063 枚举属性为空!
FORMULA_6064 函数: {0}第 {1} 个参数类型不匹配, 期望类型 STRING
FORMULA_6065 函数:【千分位显示】 参数类型错误,只能为数字
FORMULA_6066 变量: {0}命名不规范, 不能以数字开头
FORMULA_6067 计算结果不是选项集选项,请检查!
FORMULA_6068 选项集赋值,必须传递选项集fullName
FORMULA_6069 选项集赋值类型不匹配,请检查!
FORMULA_6070 操作符:{0} ,输入错误!
FORMULA_6101 加号左侧类型不正确,必须为数字类型
FORMULA_6102 加号右侧类型不正确,必须为数字类型
FORMULA_6103 减号左侧类型不正确,必须为数字类型
FORMULA_6104 减号右侧类型不正确,必须为数字类型
FORMULA_6105 乘号左侧类型不正确,必须为数字类型
FORMULA_6106 乘号右侧类型不正确,必须为数字类型
FORMULA_6107 除号左侧类型不正确,必须为数字类型
FORMULA_6108 除号右侧类型不正确,必须为数字类型
FORMULA_6109 大于号左侧类型为非数字类型
FORMULA_6110 大于号右侧类型为非数字类型
FORMULA_6111 小于号左侧类型为非数字类型
FORMULA_6112 小于号右侧类型为非数字类型
FORMULA_6113 大于等于号左侧为非数字类型
FORMULA_6114 大于等于号右侧为非数字类型
FORMULA_6115 小于等于号左侧为非数字类型
FORMULA_6116 小于等于号右侧为非数字类型
FORMULA_6117 等于符号两侧不能为空值
FORMULA_6119 等于符号两侧数据类型不一致
FORMULA_6120 大于符号左侧类型不是日期类型
FORMULA_6121 大于符号右侧类型不是日期类型
FORMULA_6122 大于等于符号左侧类型不是日期类型
FORMULA_6123 大于等于符号右侧类型不是日期类型
FORMULA_6124 小于符号左侧类型不是日期类型
FORMULA_6125 小于符号右侧类型不是日期类型
FORMULA_6126 小于等于符号左侧类型不是日期类型
FORMULA_6127 小于等于符号右侧类型不是日期类型
FORMULA_6128 加号左侧不能为空
FORMULA_6129 加号右侧不能为空
FORMULA_6130 减号左侧不能为空
FORMULA_6131 减号右侧不能为空
FORMULA_6132 乘号左侧不能为空
FORMULA_6133 乘号右侧不能为空
FORMULA_6134 除号左侧不能为空
FORMULA_6135 除号右侧不能为空
FORMULA_6136 and符号左侧数据为空
FORMULA_6137 and符号右侧数据为空
FORMULA_6138 and符号左侧数据类型不正确,必须为布尔类型
FORMULA_6139 and符号右侧数据类型不正确,必须为布尔类型
FORMULA_6140 or符号左侧数据为空
FORMULA_6141 or符号右侧数据为空
FORMULA_6142 or符号左侧数据类型不正确,必须为布尔类型
FORMULA_6143 or符号右侧数据类型不正确,必须为布尔类型
FORMULA_6144 not符号只能用于布尔类型
FORMULA_6145 除数不能为0
FORMULA_6146 小于符号左侧不能为空
FORMULA_6147 小于符号右侧不能为空
FORMULA_6148 大于符号左侧不能为空
FORMULA_6149 大于符号右侧不能为空
FORMULA_6150 大于等于符号左侧不能为空
FORMULA_6151 大于等于符号右侧不能为空
FORMULA_6152 小于等于符号左侧不能为空
FORMULA_6153 小于等于符号右侧不能为空
FORMULA_6154 取余符号左侧不能为空
FORMULA_6155 取余符号右侧不能为空
FORMULA_6156 取余符号左侧类型必须为整数
FORMULA_6157 取余符号右侧类型必须为整数
FORMULA_6158 函数:【{0}】 第 {1} 个参数类型不匹配 , 期望类型:{2} , 实际类型: {3}
FORMULA_6159 不支持的函数参数类型:{0}
FORMULA_6160 函数:【{0}】 参数个数不匹配,期望: {1} 个
FORMULA_6161 操作符类型不匹配, {0} {1} {2}
FORMULA_6162 符号不匹配,期望为: {0}
FORMULA_6163 日期不合法: {0}
FORMULA_6164 明细表计数函数只能选择明细表或集合对象作为参数!
FORMULA_6165 条件返回函数返回值数据类型不一致!
OPENAPI_1001 必须传入应用编号参数
OPENAPI_1002 没有找到应用信息,请确认其是否存在
OPENAPI_1003 同名的应用已经存在,请更换名称
OPENAPI_1004 没有找到指定的开放API
OPENAPI_1005 找不到参数的定义
OPENAPI_1006 URL必须以http://或者https://开头
OPENAPI_1007 创建虚拟用户失败
OPENAPI_1008 开放API正在刷新,不能重复调度
OPENAPI_1009 调用用户中心接口失败。错误码:{0},错误描述:{1}
OPENAPI_1010 事件通知正在运行,请稍后手动执行
OPENAPI_1011 手动执行事件通知失败!原始错误信息:{0}
OPENAPI_1012 参数转义规则不允许重复配置!
OPENAPI_1013 地址已存在
OPENAPI_1014 无权访问此接入应用
OPENAPI_1015 回调URL验证失败,请确保服务能正常访问!
OPENAPI_1016 外部参数名称不能重复
ENTITY_0001 修改传入ID不能为空!
ENTITY_0002 删除传入ID不能为空!
ENTITY_0003 非修改状态的不应传入!
ENTITY_0004 必填项不能为空!
ENTITY_0005 构建默值失败!
ENTITY_0006 只读属性不能修改!
ENTITY_0007 没有传递树形父实体
ENTITY_0010 {0}
ENTITY_0011 不支持的方法调用,实体:{0},方法:{1}
PROCESS_0001 发起流程失败: {0}
PROCESS_0002 处理流程失败: {0}
TEMPLATE_1000 未获取到模板文件!
CATEGORY_1000 当前实体已存在!
BPM_PROCESS_0001 发送bpm流程,单据数据不能为空!
BPM_PROCESS_0002 获取旧单据数据单据状态枚举值失败!
BPM_PROCESS_0003 获取新单据数据单据状态枚举值失败!
BPM_PROCESS_0004 {0}
BPM_PROCESS_0005 处理流程失败: {0}
BPM_PROCESS_0006 撤销流程失败: {0}
BPM_PROCESS_0007 获取templateId失败
BPM_PROCESS_0008 获取bpm流程参数失败 : {0}
BPM_PROCESS_0009 设置单据状态失败
BPM_PROCESS_0010 更新字段:{0}失败!
BPM_PROCESS_0011 获取字段:{0}失败!
BPM_PROCESS_0012 终止流程失败
EXCEL-0001 模板格式异常
EXCEL-0002 无效的MD5信息
EXCEL-0003 不存在的导入模板
EXCEL-0004 Excel无数据
EXCEL-0005 生成下载地址为空
EXCEL-0006 模版中表头信息不能为空
EXCEL-0007 模版中表头信息设置有误
EXCEL-CHECK-0001 数据类型校验不通过
EXCEL-CHECK-0002 枚举值校验不通过
EXCEL-CHECK-0003 必填字段的值不能为空
EXCEL-CHECK-0005 没有找到对应的参照
EXCEL-CHECK-0004 单选字段数据校验不通过
EXCEL-CHECK-0006 违法唯一性约束
EXCEL-CHECK-0007 日期和日期时间格式错误,请设置为:yyyy/MM/dd
或 yyyy/MM/dd HH:mm:ss格式.
EXCEL-CHECK-0008 没有找到对应数据
EXCEL-CHECK-0009 与第{}行数据重复
EXCEL-EXPORT-0001 无导出数据
EXCEL-IMPORT-0001 导入处理异常
EXCEL-IMPORT-CHECK-0001 校验处理异常
EXCEL-LISTENER-CHECK-0001 事件监听导入校验处理异常
EXCEL-LISTENER-IMPORT-0001 事件监听导入处理异常
EXCEL-LISTENER-IMPORT-0002 事件监听导入封装数据异常
EXCEL-LISTENER-IMPORT-0003 事件监听导入封装数据返回为空
EXCEL-LISTENER-IMPORT-0004 事件监听导入反射调用各应用处理异常
EXCEL-LISTENER-IMPORT-0005 事件监听导入反射调用各应用返回数据为空
EXCEL-LISTENER-EXPORT-0001 事件监听导出处理异常
EXCEL-LISTENER-METAINFO-0001 事件监听封装元数据处理异常
EXCEL-LISTENER-METAINFO-0002 事件监听封装元数据返回数据为空
ENUM_3000 同一分类下枚举名称重复
ENUM_3001 枚举编码重复
ENUM_3002 枚举名称超长
ENUM_3003 枚举编码超长
ENUM_3004 枚举不能修改是否图片
ENUM_3005 级联枚举层级名称重复
ENUM_3006 级联枚举层级编码重复
ENUM_3007 名称或层级名称在表单应用中已存在
ENUM_3008 编码或层级编码在表单应用中已存在
ENUM_3009 枚举分类名称重复
ENUM_3010 表单应用中已存在名称为{0}的枚举分类
ENUM_3011 同一级下枚举项名称重复
ENUM_3012 同一枚举下枚举项值重复
ENUM_3013 平级枚举只能增加一级
ENUM_3014 级联枚举项的层级不能超过枚举的层级
ENUM_3015 表单应用中已存在名称为{0}的枚举项
ENUM_3016 表单应用中已存在编码为{0}的枚举项
ENUM_3017 该枚举不允许删除
ENUM_3018 该枚举不允许更新
ENUM_3019 该枚举分类不允许删除
ENUM_3020 该枚举项不允许删除
ENUM_3021 图片枚举不允许导入导出
MIGRATION_0001 不允许向本环境推送数据
UK_AN 参数编码重复

6、注意事项

6.1、OpenAPI请求报错400

openapi端口要和nginx配置一致

1728727221057

正确的效果应该是以下这种

1728727279715

6.2、Open请求地址前缀配置

环境安装时,需要为OpenAPI分配独立的域名或者端口,保证和管理后台访问地址域名端口不一样,Nacos配置位置如下,切记需要重启

1731647560982

5.2 - 开放事件

基于企业级事件开放平台,提供标准的事件开放能力。

1、概述

基于企业级事件开放平台,提供标准的事件开放能力。

2、集成步骤

序号 步骤名称 责任方 描述
1 事件查看 致远 非必须,查看可用的事件清单
2 UDC发布自定义事件 致远 非必须,UDC-规则-自定义服务,可以配置开放事件,
在应用成功发布后,事件可以发布到开放平台,遵循开放平台授权管理规范
3 启用事件 致远 必须,API一级授权,只有启用API,接入应用才可以选择到对应的API。
4 新建接入应用 致远 必须,承载事件配置
5 启用接入应用 致远 必须,未启用时,事件无法正常回调
6 开启加密因子 致远 非必须,开启后事件内容会加密传输
7 开启回调令牌 致远 非必须,开启后,事件回调会携带配置的eventToken,
用于接入应用验证事件来源。
8 请求网址验证 致远 事件直接回调请求网址模式模式:必须实现回调接口模式:非必须
9 添加事件 致远 必须,事件二级授权
10 配置数据范围 致远 非必须,需要对事件内容进行筛选过滤时配置
11 提供回调接口定义和规范 三方系统 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须
12 新建三方集成应用 致远 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须
13 接口封装 致远 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须
14 发布三方集成应用 致远 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须
15 设置回调方式 致远 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须
,需要选择三方集成应用、接口,并配置字段映射和成功标识

3、集成步骤配置说明

3.1. 进入管理后台

1729731400013

3.2. 事件查看

1729731437933

3.3. UDC发布自定义事件

1729731458117

1729731462482

3.4. 启用事件

1729731468221

3.5. 新建接入应用

1729731471806

3.6. 启用接入应用

1729731475731

3.7. 开启加密因子

1729731484386

3.8. 开启回调令牌

1729731488908

3.9. 请求网址验证

1729731493899

3.10. 添加事件

1729731498018
1729731503621

3.11. 配置数据范围

1729731508099
1729731511661

3.12. 提供回调接口定义和规范

注意:由三方系统线下提供

3.13. 新建三方集成应用

1729731523262

3.14. 接口封装,发布应用

1729731526881

3.15. 设置回调方式

1729731533340

1729731539505

1729731544183

4、事件订阅说明

收到事件通知请求后,需要返回200HTTP响应。其余响应码表示失败,开放平台会自动重发。重发的间隔越来越长,最多尝试10次。事件通知数据使用application/json格式发送。

事件通知的HTTP请求头中,包含回调令牌(需在接入应用的事件订阅中配置开启,默认不开启),用于接入应用验证事件来源。

若开启加密因子(需在接入应用的事件订阅中配置开启,默认不开启),将对事件通知的JSON内容进行加密,只有一个属性encrypt,需要进行解密处理。

4.1、解密示例(Java)

@SuppressWarnings("rawtypes")
    @PostMapping("open-event-map")
    @ResponseBody
    public String openEventCallBack(HttpServletRequest request, @RequestBody Map map) {
      // 事件发生时间
      String createTime = request.getHeader("createTime");
      // 事件的流水号
      String eventId = request.getHeader("eventId");
      // 如果订阅事件时设置了回调token,可以获取token进行校验
      String eventToken = request.getHeader("eventToken");
      if (!OpenApiGlobalConfig.EVENT_CALL_BACK_TOKEN.equals(eventToken)) {
        System.err.println("token不匹配,这是非法的请求!");
        return "error";
      }
      // eventName:事件名称,解码处理
      try {
        String eventName = URLDecoder.decode(request.getHeader("eventName"), StandardCharsets.UTF_8.displayName());
        System.err.println("收到事件:" + eventName);
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      // 事件标识,可以用此字段区分是什么事件发生了
      String eventKey = request.getHeader("eventKey");
      if (!"".equals(OpenApiGlobalConfig.EVENT_CALL_BACK_KEY)) {
        // 如果设置了加密key,那么返回的数据是加密的,需要解密。加解密算法是AES算法。
        String encryptContent = (String) map.get("encrypt");
        String realContent = OpenApiClient.decrypt(encryptContent, OpenApiGlobalConfig.EVENT_CALL_BACK_KEY);
        System.err.println("原始的JSON数据是:" + realContent);
        // 拿到原始的json串以后,可以json串转map或者转对应的DTO,继续处理
        Map dataMap = OpenApiUtil.fromJson(realContent, Map.class);
        // 后续处理
        System.err.println("事件真实数据:" + dataMap);
      } else {
        // 如果没有配置加密,那么是明文传输的,收到的Map就是真实的数据
        Map dataMap = map;
        // 后续处理
        System.err.println("事件真实数据:" + dataMap);
      }
      return "OK";
    }

6 - 移动微协同

支持COP平台应用可视化挂载到移动APP上,实现应用注册、组织同步、事项同步、消息同步,同步监控等。

1、概述

支持COP平台应用可视化挂载到移动APP上,实现应用注册、组织同步、事项同步、消息同步,同步监控等。

2、能力区隔表

能力分类 能力描述 钉钉 企业
微信
飞书
插件管理 一个租户下多个同类插件
插件管理 一个租户下多个不同类插件
插件管理 一个插件配置对应多个应用
组织映射 自动生成部门映射
组织映射 自动生成用户映射
组织同步 COP同步至移动app
组织同步 移动app同步至COP
免登 移动app免登进入COP应用
统一身份认证 移动app和COP同时接入同一身份认证,
且用户登录态互信
应用发布 COP任一应用发布至移动app工作台
应用发布 三方异构应用发布至COP平台
再由COP发布至移动app工作台
事项同步 COP事项中心挂载到移动app工作台
事项同步 COP事项推送至移动app原生待办中心 × ×
事项同步 事项内容按需过滤
事项同步 移动app免登录打开COP事项详情页
消息同步 COP消息推送至移动app会话消息中
日程同步 COP日程同步至移动app日程中心 × ×
扫码签到 移动app扫码签到会议 × ×
主动唤醒IM COP一键唤醒移动app,并进入会话 × ×

3、集成场景

6.1 - 企业微信

1、概述

平台提供可挂载到企业微信上的移动办公应用(微协同),可实现待办事项查看处理、已办事项查看、事项详情页展示、个人工作台、通讯录、自助绑定/解绑、免登进入UDC定制应用等功能。

2、场景支持

场景 场景说明
应用上架/发布 支持COP平台以”微协同“应用挂载到企微上,包含事项中心、通讯录、个人工作台、个人信息等部分,
其中个人工作台可以免登进入COP平台子应用中。支持UDC定制应用单独挂载到企微应用中心。
免登 应用发布成功后,支持企微客户端免登陆进入COP应用移动首页中。COP与企微手机号码不一致时,
用户需要自助绑定/解绑后才能实现免登。
组织同步 支持COP组织人员数据同步至企微通讯录中
事项同步 “微协同”发布至企微后,用户可以在企微查看、处理待办事项
消息同步 COP消息中心的消息将会同步展示在企微应用消息中

3、操作步骤

序号 步骤名称 责任方 描述
1 提供企业ID和企业名称 企微管理员 必须,企业唯一标识信息
2 企微新建应用 企微管理员 必须,承载COP应用
3 获取AgentId 企微管理员 必须,企微应用唯一标识
4 获取应用Secret 企微管理员 必须,
5 配置Nacos 致远 非必须,企微分为自建模式和待开发模式,本场景主要针对自建模式。
如果三方系统企微认证域名和企业工商认证一致则为自建模式。否则为待开发模式
6 移动插件-启用全局配置 致远 必须,启用微协同,配置租户服务器地址信息
7 移动插件-新建插件 致远 必须,承载COP与企微的关联关系
8 配置组织同步 致远 非必须,配置后COP组织人员数据会直接覆盖企微部门人员数据,请谨慎操作
9 后台配置用户映射 致远 非必须,如果COP与企微手机号一致,或者用户自助绑定解绑,则无需配置。
否则需要配置,建立COP与企微人员映射
10 获取待发布地址 致远 必须,COP生成企微应用首页
11 企微配置首页访问地址 致远 必须,企微应用首页为COP提供
12 企微配置信任域名 企微管理员 必须,企微安全要求
13 可信IP配置 企微管理员 必须,企微安全要求
14 申请域名校验 企微管理员 必须,企微安全要求
15 手机端企微工作台查看应用 用户 应用发布成功后,员工可以在在企微客户端-个人工作台查看COP应用
16 移动端自助绑定账号 用户 当COP手机号码与企微手机号码不一致时,需要用户自助绑定COP账号
17 事项接受 用户 进入微协同待办菜单,可以查看COP当前用户的所有待办事项
18 消息接受 用户 COP消息将以应用消息的形式推送给用户
19 移动端自助解绑 用户 用户更换账号时,需要手动解绑,重新绑定COP账号

4、集成配置步骤

4.1、获取企业ID

入口:企微后台管理页面-我的企业

1720575268811

4.2、企微新建应用

注意:新建应用后,需要获取一下三个字段:CorpID、AgentID、AgentSecret;

选择自建应用模式时执行此步骤

1720575275091

4.3、获取AgentId

1720575285218

4.4、获取应用Secret

注意:点击查看后,需要应用管理员登录企业微信,在通知消息中查看

1720575290593

4.5、配置Nacos

capability:
  workWx:
    accessMode: SELF_BUILT

4.6、移动插件-启用全局配置

入口:后台管理-移动管理-移动插件

1731647687272

移动插件默认“不启用”,通过开启【启用微协同】开关,可启用微协同。

协同服务器地址为当前租户环境的协同服务器地址。

开启接收通知、开启连接,并勾选许可协议、风险提示。

4.7、移动插件-新建插件

注意:致远COP平台与企业微信集成中,分为自建模式和待开发模式,本次解决方案采用自建模式

1720575475346

4.8、配置组织同步(可选)

注意:此模式下,企业微信部门、账号数据有V8OA门户自动同步,当V8OA门户部门、账号数据变更时,企业微信部门、账号数据同步变更;

1720575502820

4.9、后台配置用户映射(非必须)

注意:当V8OA门户和企业微信中的组织数据不是来源于同一个组织主数据系统,且相互间没有数据同步时,需要V8机构管理员在移动插件-企业微信-用户映射标签中选择映射类型(手机号码、个人邮箱、企业邮箱、用户名、用户Id、用户编码);

系统会根据所选映射类型与企业微信账号之间建立联系;

针对无法通过映射类型建立账号关系的特殊账号,平台支持手工配置映射;

1720575537725

4.10、获取待发布地址

1720575628695

4.11、企微配置首页访问地址

1720575358638

4.12、企微配置信任域名

1720575364769

4.13、可信IP配置【重重重】

1720575369762

4.14、 申请域名校验

1720575374310

1720575380255

4.15、手机端企微工作台查看应用

1720575386165

4.16、移动端自助绑定账号

注意:除上一步骤中需要后台配置映射关系场景外,平台支持用户在登录企业微信-微协同时,自助登录绑定映射关系;

1720575392977

4.17、事项接受

注意:登录微协同查看待办列表,点击任一列表可免登陆打开待办详情页;

1720575399055

4.18、消息接受

注意:借用企业微信应用消息通知模式,接受统一消息通知;

1720575405151

4.19、移动端自助解绑

1720575411866

5、注意事项

5.1、免登

如果COP手机号码与企微手机号码一致,则无需配置用户映射即可实现企微用户免登打开COP应用。

5.2、集成收费:

企微端要求按照服务商收取接口调用年费,大概没人每年3元;

5.3、IP受限:

需要在企微管理后台-应用管理,增加企业可信IP,且所有出口IP,都需要加上

1720575419151

5.4、消息接受域名配置

1720575426068

5.5、微协同可以登录,但是无法收到消息

大概率是2.12企微配置信任域名未配置,或者2.13可信IP配置未配置所有IP段

5.6、企微备案

由于企微升级,需要提供客户名称、企业ID(CorpID)、脱敏合同,申请备案,否则企微会不定期拒绝微协同访问;

5.7、兼容企微私有化

由于企微支持私有化部署,部署后服务地址信息回变更为本地地址,需要修改Nacos配置,

cip-connector微服务下Nacos配置,其中privatization为企微私有化标识,https://qyapi.weixin.qq.com为企微服务接口地址

seeyon.mobile.qywxFlag=privatization
seeyon.mobile.qywxUrl=https://qyapi.weixin.qq.com

6.2 - 钉钉

1、概述

平台提供可挂载到钉钉的移动办公应用(微协同),可实现待办事项查看处理、已办事项查看、事项详情页展示、个人工作台、通讯录、自助绑定/解绑、免登进入UDC定制应用等功能。

2、场景支持

场景 场景说明
应用上架/发布 支持COP平台以”微协同“应用挂载到钉钉上,包含事项中心、通讯录、个人工作台、个人信息等部分,
其中个人工作台可以免登进入COP平台子应用中。支持UDC定制应用单独挂载到钉钉应用中心。
免登 应用发布成功后,支持钉钉客户端免登陆进入COP应用移动首页中。COP平台与钉钉用户手机号码必须一致
组织同步 支持COP组织人员数据同步至钉钉通讯录中
事项同步 “微协同”发布至钉钉后,用户可以在钉钉查看、处理待办事项
消息同步 COP消息中心的消息将会同步展示在钉钉应用消息中

3、操作步骤

序号 步骤名称 责任方 描述
1 查看企业名称 钉钉管理员 必须,进入管理后台首页,获取企业名称
2 查看CorpId 钉钉管理员 必须,进入钉钉开放平台,查看CorpId
3 新建应用 钉钉管理员 必须,钉钉要新建应用,承载COP应用H5页面
4 获取应用APPKey、AppSecret、agentId 钉钉管理员 必须,COP与钉钉应用依靠这几个参数建立联系
5 接口授权 钉钉管理员 必须,未授权时,无法完成组织同步、免登、消息推送
6 新建移动插件 致远 必须,承载COP与钉钉的关联关系及场景配置
7 启用配置 致远 必须,启用后微协同才可以正常使用
8 新建钉钉移动插件 致远 必须,承载COP与钉钉的关联关系及场景配置
9 组织同步 致远 非必须,COP与钉钉间组织同步
10 用户映射 致远 非必须,钉钉需要接受COP消息时启用
11 应用发布/上架 致远 必须,发布后生成H5URL地址,才可以挂载到钉钉上
12 钉钉应用发布 钉钉管理员 必须,钉钉需要发布后,应用才可以正常使用
13 钉钉客户端进入应用 用户 必须,
14 消息查看 用户 非必须,

4、集成配置步骤

4.1、查看企业名称

1720576065362

4.2、查看CorpId

1720576071122

4.3、新建应用

1720576075665

1720576082841

1720576088842

1720576095554

4.4、获取应用APPKey、AppSecret、agentId

1720576100879

4.5、接口授权

1720576105690

1721272343553

4.6、新建移动插件

1720576109923

4.7、启用配置

1720576114387

4.8、新建钉钉移动插件

1720576119241

4.9、组织同步

1720576123385

1720576128857

1720576140121

1720576147413

1720576156603

4.10、用户映射

1720576161704

4.11、 应用发布/上架

1720576166316

1720576171456

1720576176243

1720576181119

4.12、钉钉应用发布

1720576186276

4.13、钉钉客户端进入应用

1720576191347

4.14、钉钉客户端接受消息

1720576196903

5、注意事项

钉钉开放平台:[https://open-dev.dingtalk.com/#/]()

钉钉管理后台:[https://oa.dingtalk.com/index.htm#/welcome]()

应用首页地址必须是相对地址:

1720576055497

6.3 - 飞书

1、概述

平台提供可挂载到飞书的移动办公应用(微协同),可实现待办事项查看处理、已办事项查看、事项详情页展示、个人工作台、通讯录、自助绑定/解绑、免登进入UDC定制应用等功能。

2、场景支持

场景 场景说明
应用上架/发布 支持COP平台以”微协同“应用挂载到飞书上,包含事项中心、通讯录、个人工作台、个人信息等部分,
其中个人工作台可以免登进入COP平台子应用中。支持UDC定制应用单独挂载到飞书应用中心。
免登 应用发布成功后,支持飞书客户端免登陆进入COP应用移动首页中。COP平台与飞书用户手机号码必须一致
组织同步 支持COP组织人员数据同步至飞书通讯录中
事项同步 “微协同”发布至飞书后,用户可以在飞书查看、处理待办事项
消息同步 COP消息中心的消息将会同步展示在飞书应用消息中

3、操作步骤

序号 步骤名称 责任方 描述
1 查看企业名称 飞书管理员 必须,进入管理后台首页,获取企业名称
2 查看企业编号 飞书管理员 必须,进入飞书开放平台,查看企业编号
3 新建应用 飞书管理员 必须,飞书要新建应用,承载COP应用H5页面
4 获取应用APPKey、AppSecret 飞书管理员 必须,COP与飞书应用依靠这几个参数建立联系
5 接口授权 飞书管理员 必须,未授权时,无法完成组织同步、免登、消息推送
6 新建移动插件 致远 必须,承载COP与飞书的关联关系及场景配置
7 启用配置 致远 必须,启用后微协同才可以正常使用
8 新建飞书移动插件 致远 必须,承载COP与飞书的关联关系及场景配置
9 组织同步 致远 非必须,COP与飞书间组织同步
10 用户映射 致远 非必须,飞书需要接受COP消息时启用
11 应用发布/上架 致远 必须,发布后生成H5URL地址,才可以挂载到飞书上
12 飞书应用发布 飞书管理员 必须,飞书需要发布后,应用才可以正常使用
13 飞书客户端进入应用 用户 必须,
14 消息查看 用户 非必须,

4、集成配置步骤

4.1、查看企业名称

1720576492399

4.2、查看企业编码

1720576497799

4.3、 新建应用

1720576502797

1720576508078

1720576513429

4.4、获取应用APPKey、AppSecret

1720576518034

4.5、接口授权

1720576522439

1720576527420

1720576532078

1720576537470

1720576542888

4.6、新建移动插件

1720576548027

4.7、启用配置

1720576552667

4.8、新建飞书移动插件

1720576557649

4.9、组织同步( 慎用,如果不需要千万不要配置

1720576562897

1720576570263

1720576602232

1720576606133

1720576611643

4.10、用户映射

1720576616605

1720576622275

4.11、应用发布/上架

1720576626940

1720576632150

1720576636799

1720576641723

1720576647035

1720576654257

4.12、飞书应用发布

1720576659427

1720576664611

1720576669113

1720576674184

4.13、飞书客户端进入应用

1720576678541

4.14、飞书客户端接受消息

1720576683316

5、注意事项

7 - 三方能力接入

提供开箱即用的、丰富的三方基础能力接入管理能力。

1、能力清单

序号 能力名称 能力描述 预置厂商 扩展厂商
1 短信 提供单条、批量发送短信能力,支持配置短信签名、短信模板,
满足短信消息、短信登录验证、下发验证码等使用场景
提供短信签名、模板、枚举项的管理维护接口,
属于发送短信的基础数据,可使用本组接口维护。
阿里云(SaaS)
腾讯云(SaaS)
华为云(SaaS)
2 邮件服务 基础邮件服务,提供邮件消息、邮箱登录、自定义邮件模板等能力 客户自建SMTP
3 在线文档 提供文档在线预览、在线编辑、在线转版、套红、
文字/图片水印等文档能力
金山中台(私有云)
永中(私有云)
ASPOSE
腾讯文档(SaaS)
联想文档(SaaS)
4 版式文档 提供针对OFD版式文件的预览能力 点聚(私有云)
金山中台(私有云)
金格(私有云)
联想(私有云)
永中(私有云)
5 智能文档 提供对各类文档的文档比对、文档抽取识别、
文档审核、表格解析等能力
达观(私有云)
方寸(私有云)
6 简历解析 提供对简历文件的内容解析抽取能力 穰川(???)
7 OCR识别 提供对身份证、银行卡、名片、营业执照等
规则图片的文本识别能力
百度云(SaaS)
腾讯云(SaaS)
8 视频会议 提供普通视频、会议室会议的创建、查询、取消能力,
支持获取会议录像、会议纪要
腾讯会议(SaaS)
华为云(SaaS)
瞩目(SaaS)
企业微信(SaaS)
9 商旅服务 针对企业差旅场景,提供差旅审批单同步、
机票预订、火车票购买、酒店预订、用车的能力
阿里商旅(SaaS) 携程(SaaS)
10 企业征信 提供企业基础工商信息、工商股东、融资信息、行政处罚、
产品信息、行政许可等企业征信信息查询能力
合合启信宝(SaaS)
11 发票服务 支持发票识别、发票验真,支持识别单张或多张票据
(如增值税专用发票、
增值税普通发票(卷式)、火车票,飞机票,汽车票等),
支持增值税发票的验真
大象慧云(SaaS)
百望云(SaaS)
百度云(SaaS)
慧财(SaaS)
12 物理印章 提供物理印章查询、用印申请、用印情况查询等能力 群杰(私有化)
13 电子签章 提供发起签署、签署区配置、在线签署、文档验签等能力,
支持电子签、手写签,
支持顺序签、无序签、或签,
解决传统签署成本高、效率低等问题
e签宝-天印(私有化)
14 翻译服务 提供中、英、法、德等常用的多国语言文本翻译能力,
支持语种识别
百度云(SaaS)
15 天气查询 提供全国各省市地区天气查询的能力 高德天气(SaaS) 百度天气(SaaS)
16 GIS服务 GIS专网地图服务,提供二三维一体化GIS数据和引擎服务,
应用于智慧城市、智慧农业、智慧交通等场景
上海测绘 左岸芯慧
17 地理位置 提供行政区划查询、地理编码查询、测距等地理位置能力 百度地图(SaaS) 高德地图(SaaS)
18 离线消息 提供离线消息发送能力 M5 华为
VIVO
魅族
OPPO
小米
苹果
19 AI 提供AI能力,支持AI应用接入创建,支持用量的查询 致慧泉(SaaS)
20 标签打印 纸质标签打印 智高(SaaS) 销邦(SaaS)
21 银企直连 提供对公付款、对私转账、银行流水查询、资金调服务。 中信银行前置机
22 人脸识别 提供人脸识别认证能力,可用于敏感数据查看、
操作前的人身核验。
旷视(SaaS) 百度(SaaS)
23 敏感词 提供内容审核能力、敏感词过滤 自研
24 在线支付 提供企业内对私收取能力 微信支付(SaaS)

8 - API服务集成

提供接口登记、数据直连、事件订阅等配置,可以将三方异构系统服务转换为符合AI-COP|V8规范的服务能力。

1、概述

提供接口登记、数据直连、事件订阅等配置,可以将三方异构系统服务转换为符合AI-COP|V8规范的服务能力。

2、能力清单

8.1 - 接口登记&应用

提供三方系统接口登记能力,可以将三方异构系统接口转为COP平台可以直接调用的自定义服务。

1、概述

提供三方系统接口登记能力,可以将三方异构系统接口转为COP平台可以直接调用的自定义服务。

2、操作步骤

序号 步骤名称 责任方 描述
1 查看企业名称 飞书管理员 必须,进入管理后台首页,获取企业名称

3、集成配置步骤

3.1、角色授权

3.1.1、角色分配

序号 菜单 权限 角色
1 集成平台-基础设置 查看、编辑 跟机构管理员/集成管理员
2 集成应用 查看、设计、发布 跟机构管理员/集成管理员+应用设计师
3 开放平台 查看、编辑 跟机构管理员/集成管理员
4 UDC定制应用 查看、设计、发布 应用设计师
5 BPM表单应用 查看、设计、流程设计、发布 应用设计师+流程设计师

3.2、获取接口文档

注意:接口文档应包含接口签名规范、请求地址、请求入参、入参示例、请求出参、出参示例等信息,

最好可以Postmen、APIPost、APIFox等SAAS接口调用示例,便于联调。

接口文档应提供必要的请求域名、秘钥等信息,最好区分测试环境和生产环境。

3.3、接口登记

3.3.1、新建应用参数(非必须)

1721294775195

1721294924320

1721294997753

3.3.2、新建集成应用

1721349017311
1721349017311

1721349142412

1721349247662

1721349315497

3.3.3、新建公共参数

1721349417993

1721349487804

1721349625769

3.3.4、新建接口鉴权

1721349808273

1721349907653

1721349957523

1721350153285

1721350488174

3.3.5、新建接口登记

1721350741267

1721351022292

1721350845277

1721350919028

3.3.6、在线调试

1721350948464

3.3.7、发布应用

1721352435158

3.4、UDC定制应用调用接口

3.4.1、新建UDC定制应用

1721352760598

3.4.1、依赖集成应用

1721352810448

3.4.1、新建微流程,依赖集成应用接口

1721352936946

1721353016749

3.4.1、查看日志

1721353099899

3.5、BPM流程节点调用接口

1721353308132

3.6、接口发布到开放平台

1721353450329

4、注意事项

9 - SPI扩展机制

1. 概述

当集成基础能力无法满足客户需求时,平台提供SPI扩展机制,用户可以在不影响上层使用的前提下,通过手写客开代码,实现统一身份认证、免登、单点登录、移动 App 接入、接口鉴权、基础能力厂商通道扩展等能力,解决个性化集成需求。

2. 能力架构

能力架构图

3. SPI 机制实现说明

3.1. spi jar 包项目开发并打包

下载帮助文档中对应功能 spi 示例的 demo 项目按需实现对应业务接口,并打包成 jar 包

  • spi 扩展 jar 包项目实现注意事项

img.png

  • 打包

1721907175054

3.2. 配置 jar 包动态加载必须的配置信息

将客开实现的 jar 包上传到私服或服务器本地, 配置到对应服务的配置中(nacos 或 yaml 文件) 配置完成后, 重启 spi jar包里实现的接口对应的项目即可

3.2.1 如果项目中配置了私服, 并通过私服管理扩展 jar 包的情况

验证 nacos 中 public 或项目中是否存在以下配置, 如果不存在则添加,如果存在则忽略

# public 配置确认
seeyon:
  # 开启 spi 动态扩展的私服配置, 用于从私服里拉取扩展 jar 包
  dynamic:
    loader:
      type: maven # 固定值
      maven:
        releaseUrl: release库地址
        snapshotUrl: snapshot库地址
        username: 账号
        password: 密码

对应项目中的 nacos 或 yaml 配置文件配置内容

# 对应服务配置
seeyon:
  spi:
    enable: true # 固定值 true
    spi-plugins:
      # 上传到私服里的扩展 jar 包的 GAV(groupId / artifactId / version)坐标。 maven: 开头
      # 固定格式 maven: 开头, 冒号后面没有空格, - 后面一个英文空格
      - maven:com.seeyon,xxx-xxx-xxx,x.y.z

注意:

spi-plugins的值:- maven:com.seeyon,xxx-xxx-xxx,x.y.z, 短横杠 后面 1 个英文空格, 前面 6 个英文空格

maven:xxx.xxx,xx-xx-xx,x.y.z 整体字符串中间 没有空格

所有缩进,以 两个英文空格 为标准, 不要使用 TAB 缩进

配置内容都是在 英文输入法 下配置,不要使用中文输入法

扩展 jar 包如果依赖外部 jar 包,也要将外部 jar 包对应的坐标配置到 seeyon.spi.spi-plugins

3.2.2 如果项目中未配置私服,通过服务器文件管理 jar 包的情况

对应服务 nacos 配置(Maven是有私服的,file是没有私服的)

# 对应服务配置
seeyon:
  spi:
    enable: true # 固定值 true
    spi-plugins:
      # 固定格式: file: 开头, 冒号后面没有空格, - 后面一个英文空格
      - file:/data/xxx/xxx.jar

注意:

  1. 两种配置根据项目情况取其一即可,jar包放到对应位置后,要确认jar包是否完整,对比下本地打的jar包大小,与服务器上的是否一致
  2. spi-plugins的值:- file:/data/xxx/xxx.jar, 短横杠 后面 1 个英文空格, 前面 6 个英文空格
  3. file:/data/xxx/xxx.jar 整体字符串中间 没有空格
  4. 所有缩进,以 两个英文空格 为标准, 不要使用 TAB 缩进
  5. 配置内容都是在 英文输入法 下配置,不要使用中文输入法
  6. 扩展 jar 包如果依赖外部 jar 包,也要将外部 jar 包对应的坐标配置到 seeyon.spi.spi-plugins

3.3. 视频讲解

4. xxxSpiUtil 工具类说明

工具类位于对应项目 api 包中的 util 下, 主要提供 spi 扩展 jar 包里的类的实例化获取, spring 管理的 bean的获取、调用、nacos或yaml中的配置信息获取功能

其中 ctp-user-api jar 包中还包含 request 对象的获取功能

4.1. 工具类介绍

以 ctp-user-api 中的 CtpUserSpiUtils 为例

@CtpUserComment("spi 扩展包工具类,可以获取 bean 的实例,通过配置 key 获取 nacos 或 yaml 配置内容等")
public class CtpUserSpiUtils {

    @CtpUserComment("获取指定类的单例实例")
    public static <T> T getInstance(Class<T> clazz) {
    }

    @CtpUserComment("获取获取被 spring 管理的指定类别的 Bean 对象")
    public static <T> T getBean(Class<T> clazz) {
    }

    @CtpUserComment("获取指定名称和类型的 Bean 对象, 获取被 spring 管理的 bean 的对象")
    public static <T> T getBean(String beanName, Class<T> requiredType) {
    }

    @CtpUserComment("调用指定 Bean 的指定方法并返回结果, beanName 是主服务中的 bean,jar 包中想用时可以通过此方法调用")
    public static <T> T invokeBean(String beanName, String methodName, Object... params) {
    }

    @CtpUserComment("通过 key 获取属性配置值, 属性配置可以是 yaml 文件也可以是 nacos 配置")
    public static String getPropertyByName(String key) {
    }

    @CtpUserComment("获取 request 对象")
    public static HttpServletRequest getRequest() {
    }
}    

方法说明:

  • getInstance(): 获取 spi jar包内的类的实例, 使用单例模式,保证每个类只被实例化一次。 注: 不会获取到 Spring 管理的 bean 的实例
  • getBean(): 获取 spring 管理的 bean 的实例, 注: 不会获取到 spi jar包内的类的实例
  • invokeBean(): 调用 spring 管理的 bean 的方法
  • getPropertyByName(): 获取 nacos 或 yaml 配置文件中的配置信息
  • getRequest(): http 的 request 对象

5. 注意事项

5.1. 配置完spi jar包重启项目失败

排查:日志搜索SPIJar || 动态加载spi的插件 查看原因

tail -n 10000  xxx-info.log | grep -C 50 '日志搜索SPIJar'

1720668371813

5.2. 配置信息不对(配置格式层级不对)

举例如下

1720668395517

根据实际上传的版本来,比如此例中应该是

1720668448122

5.3. 配置中含有中文的空格,字符导致

字符-及后面的空格等全部要求是英文才可以,配置手写重新敲一遍配置

1720668462281

6、能力清单

9.1 - 统一身份认证

支持通过SPI扩展机制,接入三方统一身份认证系统。

1. 概述

使用三方认证中心进行统一身份认证, 在登录 v8 系统时, 会先跳转到三方认证中心进行登录, 三方认证中心登录成功后, 重定向 v8 目标地址,完成系统登录过程。

img.png

img.png

img.png

2. spi 接入导图

统一身份认证时序图

1721720315930

1721720315930

3. 接入步骤

3.1. demo工程下载

注意:使用前请依赖平台 ctp-user-api 对应的版本进行扩展开发

cip-spi-user-sso-thirdauth.zip

3.2. 配置与使用

3.2.1. 重定向到 v8 系统的域名配置

主要配置认证中心授信信息, 如 clientId, clientSecret 等。

注意:以下配置需要在public下,其中dev.seeyonv8.com为V8平台域名,使用时请更换为对应环境域名或ip端口 yaml 格式配置:

seeyon:
  system:
    domain: dev.seeyonv8.com

properties 格式配置

seeyon.system.domain=dev.seeyonv8.com

3.2.2. 重要:开启三方认证中心开关

在ctp-user微服务下

yaml 格式配置:

开起spi认证,其中spisso为固定值

seeyon:
  user:
    authenticationType: spisso

认证类型配置,其中thirdauth为spi扩展的认证类型,对应spi代码中的类型,例如:maxkey、zhuyun等

seeyon:
  spisso:
    ssoType: thirdauth

配置与三方认证中心的授信信息

seeyon:
  thirdauth:
    clientId: xxx
    clientSecret: xxx

properties 格式配置 开起spi认证

seeyon.user.authenticationType=spisso

认证类型配置

seeyon.spisso.ssoType=thirdauth

认证配置

seeyon.thirdauth.clientId=xxx
seeyon.thirdauth.clientSecret=xxx

3.3. spi jar 打包并部署

参考 SPI扩展

配置完成后, 重启 ctp-user 服务

3.4. 测试方式

说明:免登地址拼接规则:

工程开发完成并发布后,在URL中输入【服务域名】/main/portal,点击回车/访问后,浏览器自动重定向到统一身份认证中心认证页,输入认证中心账号密码后,成功进入V8平台首页,则标识工程正确,且连接无误。

3.5. 异常跟踪

1721904733313

3.6. 内容校验

浏览器地址输入:<domain>/service/ctp-user/api/sso-config

1722921841278

1722921854925

确认内容

jar 包里的 clientId 与 ctp-user 里的关键配置是否一致

如何使用私服仓库, 确认仓库地址、账号密码是否配置

确认登录成功后的重定向域名是否正确

spi 是否配置成功

spi jar里的 spring.factories 配置是否正确

4. 工程核心接口说明

4.1. 登录

说明:URL输入【V8首页地址】,或者三方门户点击进入【V8首页地址】时,网关拦截跳转到三方统一身份认证页,

如果未登录则使用账号密码登录,成功登录后跳转到【V8首页地址】,并携带授权code;

如果已经登陆,无需输入账号密码,成功登录后跳转到【V8首页地址】,并携带授权code;

后台解析授权code,换取用户信息,V8登录成功。

【V8首页地址】可以是V8任何一个页面,除了登录页“/login”。

/**
 * 三方认证 sso 登录地址
 *
 * @param request
 * @param encodeRedirectUrl url encode 后的重定向地址,三方认证登录成功后的跳转地址
 *                          encodeRedirectUrl: http://dev.seeeyon.com/thirdauth-login/aaa?url=/main/protal
 * @return 三方认证中心登录地址
 */
@Override
public String getSsoLoginUrl(HttpServletRequest request, String encodeRedirectUrl) {
    String thirdLoginUrl = "http://xxx.sso.com/login?redirectUrl=" + encodeRedirectUrl;
    log.info("跳转到三方认证中心地址:{}", thirdLoginUrl);
    return thirdLoginUrl;
}



/**
 * 从三方认证接口中获取用户信息
 *
 * @param request
 * @param encodeRedirectUrl url encode 后的重定向地址,三方认证登录成功后的跳转地址
 * @return CtpUserSpiLoginUserInfoDto 三方用户信息 DTO
 * @throws CtpUserSpiSsoException 三方认证登录失败时, 由 v8 自定义页面显示的异常信息
 */
@Override
public CtpUserSpiLoginUserInfoDto getUserLoginInfo(HttpServletRequest request, String encodeRedirectUrl) throws CtpUserSpiSsoException {
    // 通过配置拿到三方 clientId
    String clientId = ThirdauthSsoAuthConstants.NACOS_CLIENT_ID;
    // 调用内部方法进行逻辑处理
    thirdauthSsoAuthHandler.test();
    // 调用三方认证接口,获取用户信息
    // 获取三方认证中心登录后,追加的 code 的值
    String code = request.getParameter(getRequestParaKey());
    // 通过 code 获取 token
    // eg. String token = getTokenByCode(code);
    // 通过 token 获取用户登录名
    // eg. String loginName = getLoginNameByToken(token);

    // // [按需实现] 如果需要缓存三方认证中心的 token,则需要封装下面对象
    // CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
    //         .thirdToken("123456") // 三方认证中心的 token
    //         .expired(3600L) // 过期时间_秒 可空,如果为空则默认 7 天
    //         .extData(new HashMap<>()) // [按需实现] 扩展参数, 下面刷新三方 token 方法 refreshThirdauthTokenByConfig 中的 thirdauthTokenConfigMap 会将这个扩展参数传入
    //         .build();

    return CtpUserSpiLoginUserInfoDto.builder()
            // 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
            .thirdLoginName("zhangsan")
            // .thirdUserId("123456")
            // .thirdMobile("13900000001")
            // .thirdUserEmail("abc@abc.com")
            // .thirdUserCode("usercode")
            //用于登录的用户信息, 上面五个参数只选择一下赋值即可

            // 如果用户有租户条件
            // .tenantType("code").tenantData(tenantCode) // or .tenantType("id").tenantData("-1")

            // .thirdUserInfoJson("{\"name\":\"张三\"}") // [按需实现] 待缓存的三方用户信息, 下面登录方法 thirdauthSsoLogout 中将这个参数传入
            // .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 如果需要缓存并刷新三方 token 信息,则封装这个参数
            .build();
}

4.2. 三方认证Token持久化

说明:登录成功后,V8按需将三方持久化授权token写入根域名cookie中。

/**
 * [按需实现] 三方认证中心 token 中否保存到 cookie中,如果需要, 则返回 cookie 的 key
 *
 * @return 保存三方 token 的 cookie 的 key 的值
 */
@Override
public String get4aTokenKey() {
    return "4a-token";
}

4.3. 短连接

说明:三方认证成功后,重定向地址太长时使用短连接解决,支持两种模式:

1、紧凑模式:【V8访问域名】/oauth/home/sl/abc;

2、拼接模式:【V8访问域名】/oauth/home?mappingId=abc

/**
 * [按需实现] 登录三方成功后的重定向地址是否使用短链接, 如果不需要使用短链接,不用实现或直接返回 null
 *
 * @return ShortLinkModeEnum 短链接模式<br/>
 * ShortLinkModeEnum#COMPACT_MODE: 紧凑模式, eg: domain/path/sl/xxx。<br/>
 * ShortLinkModeEnum#SPLICING_MODE: 拼接模式, eg: domain/path?mappingId=xxx
 * 如果为 null,则不使用短链接
 */
@Override
public ShortLinkModeEnum shortLinkMode() {
    return null;
}

4.4. Token同步刷新

说明:随V8 用户认证token刷新动作,按需同步刷新三方持久化授权token三方Token。

/**
 * [按需实现] 刷新三方认证中心的 token
 *
 * @param thirdToken          三方认证中心 token
 * @param thirdTokenConfigMap 三方认证中心 token 配置
 * @return CtpUserSpiThirdTokenDto 三方认证中心 token DTO 包含 token 信息和过期时间
 */
@Override
public CtpUserSpiThirdTokenDto refreshThirdTokenByConfig(String thirdToken, Map<String, Object> thirdTokenConfigMap) {
    return null;
}

4.5. 退出

说明:v8用户Token单独失效退出(通过API退出), 三方Token单独失效退出(通过API退出,页面重定向退出)

支持两个Token同步失效退出

/**
 * [按需实现] 三方登出重定向地址, 三方认证中心可通过此地址进行用户登录操作,如果没有此接口,则不用实现
 *
 * @return url encode 后的登出后的重定向地址
 */
@Override
public String getEncodeLogoutRedirectUrl() {
    return null;
}

/**
 * [按需实现] 三方登出后台逻辑
 *
 * @param request
 * @param thirdUserInfoJson
 */
@Override
public void thirdSsoLogout(HttpServletRequest request, String thirdUserInfoJson) {
    
}

4.6. 用户登录报错时,跳转到自定义错误页

说明:免登失败时,自动跳转到自定义错误页,支持自定义错误信息可视

1721627287151

4.7. Nacos配置定义、获取值

说明:例如应用ID、秘钥、访问地址等跨环境需要变更参数,可以在nacos配置文件中维护

nacos位置:ctp-user

nacos参数值获取:需要通过工具类获取

String clientId = CtpUserSpiUtils.getPropertyByName("seeyon.thirdauth.clientId");
String clientSecret = CtpUserSpiUtils.getPropertyByName("seeyon.thirdauth.clientSecret");

5. 注意事项


9.2 - 免登-中间页模式

支持三方异构系统免登进入COP平台SPI扩展能力。不支持免登地址中携带自定义参数

1. 概述

三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code)

登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址

登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户

2. 接入导图

说明:有三方系统免登进入V8

1720767916820

3. 接入步骤

3.1. 工程下载

cip-spi-user-avoid-thirdavoid.zip

3.2. Nacos配置【按需】

注意:需要再ctp-user微服务下 yaml 格式配置:

seeyon:
  thirdauth:
    clientId: xxx
    clientSecret: xxx

properties 格式配置

seeyon.thirdauth.clientId=xxx
seeyon.thirdauth.clientSecret=xxx

3.3. 工程开发

开发过程请参考【场景/方法说明】

3.4. spi jar 打包并部署

参考 SPI扩展

配置完成后, 重启 ctp-user 服务

3.5. 测试方式

说明:免登地址拼接规则:

/oauth/home
?mobile=%2Fmain-mobile%2Fportal # url encode 后重定向地址
&web=%2Fmain%2Fportal # url encode 后重定向地址
&businessType=outsider # 固定值
&type=thirdavoid # 约定的唯一类型
&dynamicField=code # 追加的 code 的 key 的值,如追加 code 这里为 code, 追加 ticket 这里值为 ticket
&code=2403832009216967675 # 三方追加的值

3.6. 内容校验

浏览器地址输入:<domain>/service/ctp-user/api/sso-config

1722921937706

通过免登地址,登录 A 账号查看待办, 后, 再打开 B 账号的待办, 不会切换账号 端: web 解决方法: ctp-user nacos配置

yaml 格式配置:

seeyon:
  avoid:
    clearCookieTypes:
      - cscc # 类型1
      - pccscc # 类型2

properties 格式配置:

seeyon.avoid.clearCookieTypes[0]=cscc
seeyon.avoid.clearCookieTypes[1]=pccscc

4. 场景/方法说明

4.1. 从免登地址中获取信息(Request)

说明:上游系统在URL请求时,携带授权信息/加密用户信息,COP平台拦截信息并模拟登陆场景。

免登地址拼接规则:

免登地址实例:

/oauth/home
?mobile=%2Fmain-mobile%2Fportal # url encode 后重定向地址
&web=%2Fmain%2Fportal # url encode 后重定向地址
&businessType=outsider # 固定值
&type=thirdavoid # 约定的唯一类型
&dynamicField=code # 追加的 code 的 key 的值,如追加 code 这里为 code, 追加 ticket 这里值为 ticket
&code=2403832009216967675 # 三方追加的值
/**
 * 从请求中提取参数并获取用户信息
 *
 * @param code    三方追加的 code 的值
 * @param extData 三方追加的扩展参数
 * @return 用户属性信息
 */
@Override
public CtpAvoidLoginUserInfoDto getUserInfo(String code, Map<String, String> extData) {
    log.info("从请求中提取参数并获取用户信息, code:{}", code);
    // 调用内部方法进行逻辑处理
    thirdavoidSsoHandler.test();
    // [按需实现] 获取 request 对象
    HttpServletRequest request = CtpUserSpiUtils.getRequest();
    // 从 request 中获取想要的参数
    request.getParameter("xxx");
    // 通过 code 获取 token
    // eg. String token = getTokenByCode(code);
    // 通过 token 获取用户登录名
    // eg. String loginName = getLoginNameByToken(token);

    //  // [按需实现] 免登成功后重定向地址, 如果不配置, 则默认跳转至打开免登时的目标地址
    // CtpUserSpiRedirectUrlDto ctpUserSpiRedirectUrlDto = CtpUserSpiRedirectUrlDto.builder()
    //       .webRedirectUrl("/main/portal") // web 重定向地址
    //       .mobileRedirectUrl("/main-mobile/portal") // mobile 重定向地址
    //       .build();

    // // [按需实现] 缓存免登后保存的三方 token
    // CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
    //         .thirdToken("xxx") // 待缓存的三方 token
    //         .expired(null) // 过期时间_秒
    //         .extData(new HashMap<>()) // 扩展参数
    //         .build();

    // 返回用户信息、等缓存的三方认证 token、重定向地址
    return CtpAvoidLoginUserInfoDto.builder()
            // 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
            .thirdLoginName("zhangsan")
            // .thirdUserId("123456")
            // .thirdMobile("13900000001")
            // .thirdUserEmail("abc@abc.com")
            // .thirdUserCode("usercode")
            //用于登录的用户信息, 上面五个参数只选择一下赋值即可

            // [按需实现] 登录用户的租户信息
            //.tenantType() // 租户数据类型:code / id
            //.tenantData() // 与 tenantType 对应, 租户信息的值

            // // [按需实现] 待缓存免登后保存的三方 token
            // .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 三方认证 token

            // [按需实现] 免登成功后重定向地址
            //.ctpUserSpiRedirectUrlDto(ctpUserSpiRedirectUrlDto); // 免登成功后重定向地址
            .build();
}

注: 不支持获取自定义追加的参数, 除了通过 dynamicField 定义人参数 key 外, 其它追加的参数无法获取

4.2. 三方认证Token持久化

说明:三方授权Token需要COP平台负责持久化存储,包含写入根域名、写入缓存、写入Redis等场景。

// // [按需实现] 缓存免登后保存的三方 token
// CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
//         .thirdToken("xxx") // 待缓存的三方 token
//         .expired(null) // 过期时间_秒
//         .extData(new HashMap<>()) // 扩展参数
//         .build();

4.3. 三方Token自动刷新(定时)

说明:三方授权Token定时失效,需要定时使用原始Token换取新的Token场景。

/**
 * 刷新三方 token
 *
 * @param thirdTokenDto 三方 token 信息
 * @return 三方 token 保存 DTO
 */
@Override
public CtpUserSpiThirdTokenDto doRefreshToken(ThirdTokenDto thirdTokenDto) {
    return CtpAvoidLoginMiddlePageProviderService.super.doRefreshToken(thirdTokenDto);
}

4.4. 自定义5元素用户标识

说明:三方异构系统用户匹配COP平台用户,支持手机号码、邮箱、登录名、用户编码、UserID任一字段值匹配免登。

// 返回用户信息、等缓存的三方认证 token、重定向地址
return CtpAvoidLoginUserInfoDto.builder()
// 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
        .

thirdLoginName("zhangsan")
// .thirdUserId("123456")
// .thirdMobile("13900000001")
// .thirdUserEmail("abc@abc.com")
// .thirdUserCode("usercode")
//用于登录的用户信息, 上面五个参数只选择一下赋值即可

// [按需实现] 登录用户的租户信息
//.tenantType() // 租户数据类型:code / id
//.tenantData() // 与 tenantType 对应, 租户信息的值

// // [按需实现] 待缓存免登后保存的三方 token
// .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 三方认证 token

// [按需实现] 免登成功后重定向地址
//.ctpUserSpiRedirectUrlDto(ctpUserSpiRedirectUrlDto); // 免登成功后重定向地址
        .

build();

4.5. Nacos配置定义、获取值

说明:例如应用ID、秘钥、访问地址等跨环境需要变更参数,可以在nacos配置文件中维护

nacos位置:ctp-user

nacos参数值获取:需要通过工具类获取

CtpUserSpiUtils.getProperjavatyByName("seeyon.thirdavoid.clientId");

4.6. 日志查询

ctp-user.info 日志下, 搜索关键字 third dto, 通过入口查询该次请求的 traceId, 再根据 traceId 查询整个链路处理情况

5. 注意事项


9.3 - 免登-中间页扩展模式

支持三方异构系统免登进入COP平台SPI扩展能力。支持免登地址中携带自定义参数

1. 概述

三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code, 以及自定义参数)

登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址

登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户

2. 接入导图

说明:有三方系统免登进入V8

1720767916820

3. 接入步骤

3.1. Nacos配置【按需】

注意:需要再ctp-user微服务下 yaml 格式配置:

seeyon:
  thirdauth:
    clientId: xxx
    clientSecret: xxx

properties 格式配置

seeyon.thirdauth.clientId=xxx
seeyon.thirdauth.clientSecret=xxx

3.3. 工程开发

开发过程请参考【场景/方法说明】

3.4. spi jar 打包并部署

参考 SPI扩展

配置完成后, 重启 ctp-user 服务

3.5. 测试方式

说明:免登地址拼接规则:

/oauth/avoid
?sydata={"c": "thirdavoid","w":"/main/portal","m":"/main-mobile/portal"} # 固定格式。 c的值:约定的唯一类型, w:web端重定向地址,m:手机端重定向地址
&a=a # 自定义参数 a
&b=b # 自定义参数 a
&... # 自定义参数... 随意增加, 最大不超过100个

3.6. 强制重新登录配置

通过免登地址,登录 A 账号查看待办, 后, 再打开 B 账号的待办, 默认不会切换账号, 可以通过下面配置, 强制重新登录。

解决方法: ctp-user nacos配置

yaml 格式配置:

seeyon:
  avoid:
    clearCookieTypes:
      - cscc # 类型1
      - pccscc # 类型2

properties 格式配置:

seeyon.avoid.clearCookieTypes[0]=cscc
seeyon.avoid.clearCookieTypes[1]=pccscc

4. 场景/方法说明

4.1. 从免登地址中获取信息(Request)

说明:上游系统在URL请求时,携带授权信息/加密用户信息,COP平台拦截信息并模拟登陆场景。


@Override
public CtpAvoidLoginUserInfoDto getUserInfo(CtpUserSpiAvoidLoginClientModeDto avoidLoginClientModeDto) {
    // 所有 url 中追加的自定义参数, 都可以通过 extData 里获取
    Map<String, String> extData = avoidLoginClientModeDto.getExtData();
    

    // 通过 code 获取 token
    // eg. String token = getTokenByCode(code);
    // 通过 token 获取用户登录名
    // eg. String loginName = getLoginNameByToken(token);

    //  // [按需实现] 免登成功后重定向地址, 如果不配置, 则默认跳转至打开免登时的目标地址
    // CtpUserSpiRedirectUrlDto ctpUserSpiRedirectUrlDto = CtpUserSpiRedirectUrlDto.builder()
    //       .webRedirectUrl("/main/portal") // web 重定向地址
    //       .mobileRedirectUrl("/main-mobile/portal") // mobile 重定向地址
    //       .build();

    // // [按需实现] 缓存免登后保存的三方 token
    // CtpUserSpiThirdTokenDto ctpUserSpiThirdTokenDto = CtpUserSpiThirdTokenDto.builder()
    //         .thirdToken("xxx") // 待缓存的三方 token
    //         .expired(null) // 过期时间_秒
    //         .extData(new HashMap<>()) // 扩展参数
    //         .build();

    // 返回用户信息、等缓存的三方认证 token、重定向地址
    return CtpAvoidLoginUserInfoDto.builder()
            // 用于登录的用户信息, 下面五个参数只选择一下赋值即可, 赋值的参数的值要与 v8系统中的对应的值一致
            .thirdLoginName("zhangsan")
            // .thirdUserId("123456")
            // .thirdMobile("13900000001")
            // .thirdUserEmail("abc@abc.com")
            // .thirdUserCode("usercode")
            //用于登录的用户信息, 上面五个参数只选择一下赋值即可

            // [按需实现] 登录用户的租户信息
            //.tenantType() // 租户数据类型:code / id
            //.tenantData() // 与 tenantType 对应, 租户信息的值

            // // [按需实现] 待缓存免登后保存的三方 token
            // .ctpUserSpiThirdTokenDto(ctpUserSpiThirdTokenDto) // 三方认证 token

            // [按需实现] 免登成功后重定向地址
            //.ctpUserSpiRedirectUrlDto(ctpUserSpiRedirectUrlDto); // 免登成功后重定向地址
            .build();
}

4.5. Nacos配置定义、获取值

说明:例如应用ID、秘钥、访问地址等跨环境需要变更参数,可以在nacos配置文件中维护

nacos位置:ctp-user

nacos参数值获取:需要通过工具类获取

CtpUserSpiUtils.getProperjavatyByName("seeyon.thirdavoid.clientId");

5. 注意事项


9.4 - 单点登录

支持通过SPI扩展机制,扩展集成应用免登中的单点登录模式。

1、概述

单点登录场景:

  1. 点击V8菜单跳转三方系统。
  2. 点击三方栏目更多跳转三方系统。
  3. 点击通过集成应用同步过来的三方系统待办、消息,跳转至三方系统。

2、接入导图

1721721091281

3、接入步骤

3.1、demo工程下载

cip-connector-sso-template.zip

    <parent>
        <groupId>com.seeyon</groupId>
        <artifactId>boot</artifactId>
        <version>3.10.1</version>
    </parent>
    <properties>
        <platform.version>3.10.1</platform.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.seeyon</groupId>
            <artifactId>cip-connector-api</artifactId>
            <version>${platform.version}</version>
        </dependency>
    </dependencies>

3.2. spi jar 打包并部署

参考 SPI扩展

注意:请在cip-connector微服务nacos配置文件中配置参数

上传完后需要重启cip-connector完成动态加载

3.3、工程开发

注意:每个项目下载工程并开发时,请优先修改工程名称,工程名遵守 cip-connector-auth-项目标识

开发过程请参考【场景/方法说明】

4、工程核心接口说明

4.1、定义单点登录英文表示

注意:该名称不能与其他名称重复,否则不会载入

/**
     * 获取名称
     * 需要保证名称唯一,名称+SecurityService 为当前类名称
     * @return
     */
    String getName();

4.2、定义单点登录中文描述

 /**
     * 获取描述
     * @return
     */
    String getTypeCaption();

4.3、定义前端可视化配置参数

 /**
 * 获取页面json语句
 * @return
 */
 String getPageJson();

4.3.1、字段说明:

{
    "caption": "标准认证-CAS", //单点登录类型(下拉框名称)(select的中文值)
    "type": "cas", //单点登录类型(下拉框值)(select对应的英文key)
    "extensionProperties": //扩展参数
    [
        {
            "colProps": //栅格化布局
            {
                "span": 12 //栅格化布局值
            },
            "componentType": "Input", //antd组件<br />标签名称 
            "componentProps": //扩展属性
            {
                "placeholder": "请输入" //select的placeholder提示
            },
            "validateFirst": true,
            "rules": // 校验规则,<br/>参考antd表单的rules
            [
                {
                    "required": true,
                    "message": "请输入跳转地址"
                },
                {
                    "pattern": "^[^\\s]*$",
                    "message": "禁止输入空格"
                },
                {
                    "type": "string",
                    "max": 255,
                    "message": "最多255个字符"
                }
            ],
            "caption": "跳转地址", // 自定义名称 
            "defaultValue": "", //默认值,非必填
            "name": "defaultJumpUrl"
        }
    ]
}

4.3.3、效果实例:

1724307195093

4.4、根据原始请求地址拼接单点登录地址

/**
     * 登录
     * @param url 外部想跳转到的地址
     * @param json 页面传递的数据
     * @param userMap 用户信息map
     * @param clientType 跳转类型(pc,移动)
     */
    String login(String url, String json, Map<String,Object> userMap, SsoClientTypeEnum clientType
, Map<String, Object> extendParams
);

入参说明:

  • url: 外部传过来的想要跳转的特定地址

  • json: 前端页面配置的参数

  • userMap: 用户映射信息和用户映射自定义配置的参数

    • innerUserId: 内部用户ID
    • innerUserName: 内部用户名称
    • innerUserCODE: 内部用户编号
    • outerUser: 外部用户账户
    • outerUserId: 外部用户ID
    • innerUserLoginName: 内部用户登录名
    • innerUserEmail: 内部用户邮箱
    • innerUserPhone: 内部用户手机号
    • innerUserOfficeNumber: 内部用户办公电话
    • innerUserBankAccount: 内部用户银行账户
    • innerUserOrgId: 内部用户组织编号
  • clientType: 类型(pc,phone)

  • extendParams: 外部传递过来的扩展参数

    注意:按照3.3配置完成后,json获取的数据结构示例为:

  • {
      "type": "xdHr",
      "loginType": "PERSON_ID",
      "account": "admin",
      "password": "123456",
      "ssoUrl": "http://www.login.com",
      "defaultJumpUrl": "http://www.jump.com"
    }
    

5、注意事项


9.5 - 移动插件

支持通过SPI扩展机制,扩展移动插件(移动管理-移动插件)。

1、概述

移动插件场景 1.V8应用接入三方APP工作台中,例如企业微信、钉钉、飞书等。

mobile1
2.点击工作台应用图标免登进入V8应用。 3.V8产生的消息推送至三方APP。 4.V8组织人员信息同步至三方APP(可选)。

2、接入导图

mobile2

3、接入步骤

3.1、demo工程下载

cip-spi-mobile-demo.zip

    <parent>
        <groupId>com.seeyon</groupId>
        <artifactId>boot</artifactId>
        <version>3.10.1</version>
    </parent>
    <properties>
        <platform.version>3.10.1</platform.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.seeyon</groupId>
            <artifactId>cip-connector-api</artifactId>
            <version>${platform.version}</version>
        </dependency>
    </dependencies>

3.2. spi jar 打包并部署

参考 SPI扩展

注意:请在cip-connector微服务nacos配置文件中配置参数

上传完后需要重启cip-connector完成动态加载

3.3、工程开发

注意:每个项目下载工程并开发时,请优先修改工程名称,工程名遵守 cip-mobile-plugin-项目标识

开发过程请参考【场景/方法说明】

4、工程核心接口说明

1.必要条件,修改自定义类型

mobile5

5、注意事项

mobile3

mobile4


9.6 - 接口鉴权

支持通过SPI扩展机制,扩展集成应用接口中的接口鉴权模式(集成应用-接口-安全认证)。

1、概述

接口鉴权场景: 集成应用中调用的三方接口需要前置认证的情况,例如先调用认证接口token,调用其他业务接口时,讲token放到请求头中。

2、接入导图

3、接入步骤

3.1、Demo工程下载

cip-connector-auth-template.zip

注意事项: 1.pom中的版本号要与项目当前版本保持一致,分别为boot版本、cip-connector-api版本

    <parent>
        <groupId>com.seeyon</groupId>
        <artifactId>boot</artifactId>
        <version>3.10.1</version>
    </parent>
    <properties>
        <platform.version>3.10.1</platform.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.seeyon</groupId>
            <artifactId>cip-connector-api</artifactId>
            <version>${platform.version}</version>
        </dependency>
    </dependencies>

3.2. spi jar 打包并部署

参考 SPI扩展

上传完后需要重启cip-connector完成动态加载

3.3、工程开发

注意:每个项目下载工程并开发时,请优先修改工程名称,工程名遵守 cip-connector-auth-项目标识

4、工程核心接口说明

    /**
     * 认证请求(核心)
     * @param authenticationDto 安全数据
     * authId: 该安全认证在数据库中id
     * detailId: 动作id,外部正在执行的动作id
     * json: 页面配置动态数据,自行转换对应dto或者map
     * params: 请求参数
     * user: 当前登录人用户信息(包含用户映射配置信息)
         * innerUserId: 内部用户ID
         * innerUserName: 内部用户名称
         * innerUserCODE: 内部用户编号
         * outerUser: 外部用户账户
         * outerUserId: 外部用户ID
         * innerUserLoginName: 内部用户登录名
         * innerUserEmail: 内部用户邮箱
         * innerUserPhone: 内部用户手机号
         * innerUserOfficeNumber: 内部用户办公电话
         * innerUserBankAccount: 内部用户银行账户
         * innerUserOrgId: 内部用户组织编号
     * @return 请求map  <位置-->Map<key,value>> 位置:header query body
     * 如:  {"body":{"token":"123"}}
     */
    @Override
    public Map<String, Object> doAuthentication(AuthenticationDto authenticationDto) throws Exception {
        // 转换页面动态配置信息为dto
        AuthDto authDto = JsonUtils.fromJson(authenticationDto.getJson(), AuthDto.class);
        AuthenticationUserDto user = authenticationDto.getUser();
        JsonDto jsonDto = new JsonDto();
        String username = null;
        if(user.getUserMap().get(authDto.getUsernameParam()) == null){
            throw new BusinessException("安全登录:用户名为空");
        }else {
            username = user.getUserMap().get(authDto.getUsernameParam()).toString();
            jsonDto.setXxx3(username);
        }
        if(user.getUserMap().get(authDto.getPasswordParam()) == null){
            throw new BusinessException("安全登录:密码为空");
        }else {
            jsonDto.setXxx4( MD5Utils.md5(user.getUserMap().get(authDto.getPasswordParam()).toString()).toLowerCase(Locale.ROOT));
        }
        String json = JsonUtils.toJson(jsonDto);
        String base64 = Base64.getEncoder().encodeToString(json.getBytes(StandardCharsets.UTF_8));
        log.info("安全登录,请求参数加密前:{}",json);
        log.info("安全登录,请求参数加密后:{}",base64);
        HttpResult httpResult = HttpClientUtil.sendPost(authDto.getTokenUrl(), base64);
        if(httpResult.getStatusCode()!= 200){
            throw new BusinessException("安全登录,请求返回结果码:{}", String.valueOf(httpResult.getStatusCode()));
        }
        log.info("安全登录,请求返回结果:{}",httpResult.getResult());
        AuthTokenResponse authTokenResponse = JsonUtils.fromJson(httpResult.getResult(), AuthTokenResponse.class);
        
        HashMap<String, Object> map = new HashMap<>();
        map.put("user",username);
        map.put("token", authTokenResponse.getToken());
        if("param".equals(authDto.getParameterLocation())){
            map.put("projectName",authDto.getProjectName());
        }else{
            map.put("project_name",authDto.getProjectName());
        }
        HashMap<String, Object> result = new HashMap<>();
        result.put(authDto.getParameterLocation(),map);
        return result;
    }

5、注意事项


9.7 - 基础能力厂商通道

适用于COP平台已完成接入能力的通道扩展。如COP平台已接入短信服务,并已适配华为云通道、腾讯云通道。若系统使用中,需要使用阿里云或其他第三方通道,则可以通过SPI机制快速完成适配接

1. 概述

1.能力扩展SPI,适用于COP平台已完成接入能力的通道扩展。如COP平台已接入短信服务,并已适配华为云通道、腾讯云通道。若系统使用中,需要使用阿里云或其他第三方通道,则可以通过SPI机制快速完成适配接入。

2.因各能力厂商的版本、接口存在差异,可能无法满足某些API接口定义,则无法实现对应能力特征。当前已适配能力的特征及各通道区隔详情,请参看本页面的已接入能力列表。

2. 接入步骤

2.1. 开始开发

需要在代码工程POM文件中引入依赖


<dependency>
    <groupId>com.seeyon</groupId>
    <artifactId>cip-capability-api</artifactId>
    <version>${capability.version}</version>
</dependency>

2.2. SPI适配层API接口定义实现

以“短信发送”API接口为例

需要实现接口:com.seeyon.cip.provider.api.sms.SmsProviderService

覆写以下方法:

com.seeyon.cip.provider.api.ProviderService#getDescription // 获取通道名称

com.seeyon.cip.provider.api.ProviderService#checkConfig // 检查配置开关,固定返回true

com.seeyon.cip.provider.api.ProviderService#getCapabilityEnum // 返回能力枚举

com.seeyon.cip.provider.api.sms.SmsProviderService#sendShortMessage // 实现短信发送逻辑

备注:服务的相关配置,可放在配置文件中。

3. 完成SPI加载配置

3.1. 工程下载

cip-spi-capability-demo.zip

注意事项: 1.pom中的版本号要与项目当前版本保持一致,分别为boot版本、cip-capability-api版本

    <parent>
        <groupId>com.seeyon</groupId>
        <artifactId>boot</artifactId>
        <version>3.10.1</version>
    </parent>
    <properties>
        <platform.version>3.10.1</platform.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.seeyon</groupId>
            <artifactId>cip-capability-api</artifactId>
            <version>${cip.version}</version>
        </dependency>
    </dependencies>

3.2. spi jar 打包并部署

参考 SPI扩展

重启 cip-capability 项目实现扩展支持


10 - 预制集成应用

针对高频集成场景,提供预制集成应用,达到开箱即用的基础数据集成能力。

1、概述

针对高频集成场景,提供预制集成应用,达到开箱即用的基础数据集成能力。

2、预制应用清单

10.1 - 致远V5

1、概述

实现V8与V5之间接口鉴权、单点登录、组织同步、事项同步、消息同步集成。

2、集成场景

2.1、V8作为门户,V5发布应用

  1. V8配置菜单,单点登录打开V5应用
  2. V8主动调用V5组织写入OpenAPI,完成组织同步
  3. V5推送待办事项,V8呈现V5待办事项并免登陆打开详情页
  4. V5推送消息到V8,V8呈现V5消息并免登陆打开详情页
  5. M5作为移动门户,单点登录打开V5菜单、事项、消息

2.2、V8发布应用,V5作为门户

  1. V5配置菜单,单点登录打开V8应用
  2. V8主动调用V5组织查询OpenAPI,完成组织同步
  3. V8推送待办事项到V5,V5呈现V8待办事项并免登陆打开详情页
  4. V8推送消息到V5,V5呈现V8消息并免登陆打开详情页
  5. M3作为移动门户,单点登录打开V8菜单、事项、消息

3、V5版本场景区隔表

1721891532837

4、集成配置步骤

10.1.1 - V8作为门户,V5发布应用

1、V8作为门户,V5发布应用

1.1、V8配置菜单,单点登录打开V5应用

1.1.1、V5集成页面配置

1.1.1.1、产品登记【V5】

1721891567861

1721891573690

1.1.1.2、应用注册【V5】

1721891614673

1721891622709

1.1.1.3、应用接入设置

1721891662595

1.1.1.4、用户绑定设置

1721891868364

1.1.1.5、切换系统管理员角色

1721891689905

1.1.1.6、进入REST用户管理

1721891771980

1.1.1.7、新建REST账号

1721891782630

1721891788675

1.1.2、V5配置文件修改

1.1.2.1、配置spring-v8-sso文件

【V5安装路径】

\ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin\cip\spring\spring-v8-sso.xml

1721891972347

  • url参数:【V8服务域名】+"/service/cip-manager/plug/sso/callback"
  • 说明:V8拉取待办事项并列表呈现,点击待办打开待办详情页时,会在URL后拼接ticket参数,V5拦截ticket参数后,调用V8登录认证地址接口,换取手机号码/人员编号,模拟登陆,完成免登陆打开事项详情页。*
  • key参数(加密因子):与V8连接器单点登录配置的加密因子保持一致即可。

1.1.3、V8集成配置

1.1.3.1、导入预制集成应用

说明:由于版本差异,请联系集成平台获取

1721892093148

1721892098193

1721892103440

1721892108235

1.1.3.2、免登配置

1721892253781

1.1.3.3、菜单配置

1721892263179

1721892269896

1.1.3.4、发布并启用三方集成应用

1721352435158

1.1.3.5、菜单角色授权

1721892312744

1721892316871

1721892321109

1721892325632

1.1.3.6、菜单效果查看

1721892344903

1.2、V8主动调用V5组织写入OpenAPI,完成组织同步

需要时联系集成平台获取预制集成应用

1.3、V5推送待办事项,V8呈现V5待办事项并免登陆打开详情页

1.3.1、V5集成配置

1.3.1.1、产品登记【V5】

1721891567861

1721891573690

1.3.1.2、应用注册【V5】

1721891614673

1721891622709

1.3.1.3、应用接入设置

1721891662595

1.3.1.4、用户绑定设置

1721891868364

1.3.1.5、切换系统管理员角色

1721891689905

1.3.1.6、进入REST用户管理

1721891771980

1.3.1.7、新建REST账号

1721891782630

1721891788675

1.3.2、V8集成配置

1.3.2.1、启用API

1721892826294

1.3.2.2、新建接入应用

1721892831149

1.3.2.3、API授权

1721892835361

1.3.2.4、启用接入应用

1721892840432

1.3.2.5、获取AppKey和AppSecret

1721892844323

1.3.2.6、查看接口域名

1721892849581

1721892854408

1.3.2.7、导入预制集成应用

说明:联系集成平台获取

1721892860876

1721892881078

1721892885585

1721892890600

1.3.2.8、新建事项同步

1721892898675

1.3.2.9、查看事项同步-同步能力编码

1721892904176

1.3.2.10、发布并启用三方集成应用

1721352435158

1.3.3、V5修改配置文件
1.3.3.1、配置spring-v8-sso文件

【V5安装路径】

\ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin\cip\spring\spring-v8-sso.xml

1721893052756

  • url参数(V8登录认证地址):【V8服务域名】+"/service/cip-manager/plug/sso/callback"

说明:V8拉取待办事项并列表呈现,点击待办打开待办详情页时,会在URL后拼接ticket参数,V5拦截ticket参数后,调用V8登录认证地址接口,换取手机号码/人员编号,模拟登陆,完成免登陆打开事项详情页。

  • key参数(加密因子):与V8连接器单点登录配置的加密因子保持一致
1.3.3.2、配置spring-v8-cip文件

【V5安装路径】

\ApacheJetspeed\webapps\seeyon\WEB-INF\cfgHome\plugin\cip\spring\spring-v8-cip.xml

1721893115496

  • openApiUrl(V8开放平台OpenAPI域名前缀):“https://openapi-"+【V8前台域名】;

说明:值来源请参考步骤【查看接口域名】

  • capabilityId(V8同步能力编码):V8基础集成-事项同步-编辑态-同步能力编码;

说明:值来源请参考步骤【查看事项同步-同步能力编码】

  • appKey:V8接入应用分配的AppKey

说明:¡值来源请参考步骤【查看AppKey和AppSecret】

  • secretKey:V8接入应用分配的AppSecret

说明:值来源请参考步骤【查看AppKey和AppSecret】

1.3.4、V5发布补丁包

由于版本差异,请联系集成平台获取;

打上补丁包后,修改配置文件。然后重启V5系统。

1.4、V5推送消息到V8,V8呈现V5消息并免登陆打开详情页

说明:参照事项同步配置

1.5、M5作为移动门户,单点登录打开V5菜单、事项、消息

说明:由于以上配置包含移动端配置,所以M5可以直接使用以上功能项

10.1.2 - V8发布应用,V5作为门户

1、V8发布应用,V5作为门户

1.1、V5配置菜单,单点登录打开V8应用

1.1.1、V5集成配置步骤

1.1.1.1. 产品登记【V5】

1721891567861

1721891573690

1.1.1.2. 应用注册【V5】

1721891614673

1721891622709

1.1.1.3. 应用接入设置

1721891662595

1.1.1.4. 用户绑定设置

1721891868364

1.1.1.5. 单点登录设置

1721895441615

1.1.1..6. 门户配置

1721895446745

1721895451573

1721895456983

1721895464060

1721895468929
1721895473021
1721895477215

1.1.2. V5单点登录地址说明

https://【COP-V8平台域名+端口】/oauth/home # 固定值前缀
?mobile=urlencode(【COP移动端待跳转目标相对地址】)  # url encode 后的 手机端跳转目标地址,相对路径
&web=urlencode(【COP PC端待跳转目标相对地址】)   # url encode 后的 web 跳转目标地址,相对路径
&businessType=outsider  # 固定值
&type=【defaultAvoid】    # 双方约定好的业务类型。 这里假设是 defaultAvoid
&dynamicField=【v5ticket】  # 默认 v5ticket, 如果定制化的参数,则 value= 参数 key。 eg: 三方追加的值不叫 code,而是叫 ticket,则在这里写 ticket
&ticket=【三方系统生成临时授权码】   #  与 dynamicField 的 value 一致并赋值

1.1.3. V8_nocas配置

微服务:ctp-user

文件修改内容

seeyon:
  avoid:
    defaultAvoidSso:
      【defaultAvoid】: { authType: default, callbackUrl: 【获取用户信息的 GET 请求 URL】 }

替换内容说明:

1、defaultAvoid替换为拼接地址中的type参数值

2、 【获取用户信息的** GET 请求 URL】替换成【根据code获取用户信息】的接口请求地址**

3、 default参数是固定值,不需要修改;

1.1.4. 注意事项

  • V5点击菜单后,无法成功跳转到V8目标菜单,URL地址栏限制【callbackUrl】,这是因为V5和V8之间的网络问题,请联系运维处理。
  • V5根据版本不同,菜单默认的dynamicField也不同,8.1以及之前是dynamicField=ticket,8.2中dynamicField=v5ticket,如果不确定,就两个都试试

1.2、V8主动调用V5组织查询OpenAPI,完成组织同步

1.2.1、V5集成配置步骤

1.2.1.1. 切换系统管理员角色

1721891689905

1.2.1.2. 进入REST用户管理

1721891771980

1.2.1.3. 新建REST账号

1721891782630

1721891788675

1.2.2、V8集成配置步骤

1.2.2.1. 导入三方集成应用

说明:联系集成平台获取

1721892860876

1721892881078

1721892885585

1721892890600

1.2.2.2. 配置安全认证

1721895648613

1.2.2.3. 测试接口

1721895653542
1721895656917

1.2.2.4. 启用组织同步

1721895662287

1.2.2.5. 运行配置

1721895666183

1.2.2.6. 数据校验

1721895671064
1721895674295

1.2.2.7. 发布并启用三方集成应用

1721352435158

由于版本差异,请联系集成平台获取

1.2.3、V8预制应用获取

有项目实施经理提供,或者联系集成平台获取

1.3、V8推送待办事项到V5,V5呈现V8待办事项并免登陆打开详情页

1.3.1. V5集成配置步骤

1.3.1.1. 产品登记【V5】

1721891567861

1721891573690

1.3.1.2. 应用注册【V5】

1721891614673

1721891622709

1.3.1.3. 应用接入设置

1721891662595

1.3.1.4. 用户绑定设置

1721891868364

1.3.1.5. 单点登录设置

1721895441615

1.3.1.6. 切换系统管理员角色

1721891689905

1.3.1.7. 进入REST用户管理

1721891771980

1.3.1.8. 新建REST账号

1721891782630

1721891788675

1.3.2. V8集成配置步骤

1.3.2.1. 导入预制集成应用

说明:联系集成平台获取

1721892860876

1721892881078

1721892885585

1721892890600

1.3.2.2. 配置安全认证

1721895648613

1.3.2.3. 测试接口

1721895653542
1721895656917

1.3.2.4. 修改事项同步配置

1721895855513
1721895860100
1721895864668
1721895868720

1.3.2.5. 启用事项推送

1721895875940

1.3.2.6. 发布并启用三方集成应用

1721352435158

1.4. V8推送消息到V5,V5呈现V8消息并免登陆打开详情页

1.4.1、V5集成配置步骤

参考事项集成配置

1.4.2. V8集成配置步骤

1.4.2.1. 导入预制集成应用

说明:联系集成平台获取

1721892860876

1721892881078

1721892885585

1721892890600

1.4.2.2. 配置安全认证

1721895648613

1.4.2.3. 测试接口

1721895653542
1721895656917

1.4.2.4. 修改消息同步配置

1721895982342
1721895985752
1721895990348
1721895994102

1.4.2.5. 启用消息推送

1721895999249

1.4.2.6. 发布并启用三方集成应用

1721352435158

1.5、M3作为移动门户,单点登录打开V8菜单、事项、消息

由于以上配置步骤包含M3移动端配置,所以使用M3可以直接使用以上功能

1.6、V8预制应用导入和发布

1.6.1、下载致远_V5预置集成应用

致远_V5_1728373780330.json