集成配置
- 1: 组织同步
- 1.1: V8同步至三方系统
- 1.1.1: COP提供增量查询OpenAPI(推荐)
- 1.1.2: 三方系统提供写入OpenAPI
- 1.1.3: 事件订阅
- 1.2: 三方系统同步至V8
- 1.2.1: COP平台开放写入OpenAPI
- 1.2.2: 数据库中间表(推荐)
- 1.2.3: 第三方同步到V8常见问题
- 2: 事项同步
- 2.1: V8同步至三方
- 2.1.1: 三方系统提供写入OpenAPI(推荐)
- 2.2: 三方同步至V8
- 2.2.1: COP平台开放写入OpenAPI(推荐)
- 2.2.2: 消息队列
- 2.2.3: 第三方同步到V8常见问题
- 3: 消息同步
- 3.1: V8同步至三方
- 3.1.1: 三方系统提供写入OpenAPI
- 3.2: 三方同步至V8
- 3.2.1: COP平台开放写入OpenAPI(推荐)
- 3.2.2: 第三方同步到V8常见问题
- 4: 身份认证
- 5: OpenAPI集成
- 6: 移动微协同
- 7: 三方能力接入
- 8: API服务集成
- 8.1: 接口登记&应用
- 9: SPI扩展机制
- 10: 预制集成应用
- 10.1: 致远V5
- 10.1.1: V8作为门户,V5发布应用
- 10.1.2: V8发布应用,V5作为门户
1 - 组织同步
1、概述
通过可视化配置,实现V8平台与多个三方异构系统间的组织人员同步。
2、集成模式优缺点对比分析
3、集成方向&模式
1.1.1 - COP提供增量查询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、接口文档在线查看位置
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 | 工作电话 | |
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 | 工作电话 | |
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
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、 新建三方集成应用
4.2、 发布启用三方集成应用
4.3、 封装安全认证
4.4、 枚举定义
4.5、 接口封装
4.6、 在线调试验证
4.7、 启用组织同步
4.8、 配置同步内容
4.9、 配置同步周期
4.10、 使用日志
5、 注意事项
5.1、 当三方系统需要的数据维度较COP更加丰富时,可以通过集成扩展-微流程编排实现;
1.1.3 - 事件订阅
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 | 手机号 |
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 | 手机号 |
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.1 - 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、接口文档在线查看位置
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 | 工作电话 |
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 - 数据库中间表(推荐)
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
4.1.3、启用API
4.1.4、新建接入应用
4.1.5、查看AppKey和AppSecret
4.1.6、API授权
4.1.7、启用接入应用
4.1.8、选择同步模式
4.1.9、内容配置
4.1.10、配置同步周期
4.1.11、调用接口写入数据
参考接口清单调用接口处理
4.1.12、查看日志
4.2、直接写入数据库模式
4.2.1、提供数据库连接信息和库表结构
请参照物理表接口定义
4.2.2、新建集成应用,获取集成应用ID
4.2.3、选择同步模式
4.2.4、配置同步内容
4.2.5、配置同步周期
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 |
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、扩展字段定义
7.3、集成应用ID
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=人员任职信息
2、第三方推送
2.1、事件订阅和消息队列
事件订阅:监听第三方回调事件 消息队列:监听mq 因为组织模型的关联性和异步性,可以作为中间的一种技术手段,不建议作为直接交付使用。
2.2、中间表
支持全量/增量。支持重试。暂不支持自动创建用户映射。一般需第三方开发或者结合微流程开发使用。 可以直接将数据直插数据库表,也可以通过openapi进行插入。 全量模式: 1、如果第三方只给最新的启用的组织,停用数据不给,那么会比较v8数据,自动进行停用。 2、需要同步完全部数据后,再给予一个同步完成标识。 增量模式: 按照[第三方数据最新时间]比对出最新数据,定时同步。每次同步为一个批次。 【写入02】任职变化时,写入用户的全部任职,与【写入01】只能二选一,这个意思是人员增量,但是对应的任职必须是该人全部的。如果人员第一次同步任职有两条任职,第二次同步有一条新增任职,目前因为没有组织模型没有记录任职唯一标识,无法判断第二次任职是新增还是更新已有的某个岗位。
2.1.1 - 三方系统提供写入OpenAPI(推荐)
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. 新建三方集成应用
4.2. 封装安全认证
4.3. 枚举定义
4.4. 接口封装
4.5.在线调试验证
4.6. 新建事项同步【致远】
4.7. 选择同步模式【致远】
4.8. 配置字段映射【致远】
4.9. 发布三方集成应用
5、注意事项
无
2.2.1 - 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. 集成导图
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. 新建集成应用
5.2. 配置单点登录
5.3、新建事项同步,获取事项同步能力编码
5.4、发布应用
5.5、启用API
5.6、新建接入应用
5.7、启用接入应用
5.8、分配APPKey和AppSecret
5.9、应用级别API授权
5.10、按需开启IP白名单
5.11、按需开启限流控制
5.12、API调用日志
6、接口清单
请求地址:
【url前缀】/cip-manager/plugin-affair/create-update
请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
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 - 消息队列
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. 新建数据源
4.2. 新建三方集成应用
4.3. 队列封装
4.4. 配置单点登录
4.5. 新建事项同步
4.6. 选择同步模式
4.7. 配置字段映射
4.8. 发布三方集成应用
4.9. 三方系统创建事项【三方系统】
配置完成后,三方系统创建事项。
4.10. 等待拉取间隔时间
等待同步周期间隔时间后,登录门户查看已经同步后的待办事项。
4.11. 门户待办栏目查看数据【致远】
4.12. 点击待办数据并处理【致远】
4.13. 等待拉取间隔时间
等待同步周期间隔时间后,登录门户查看已经同步后的已办事项。
待办处理之后变为已办,数据展示在已办栏目。
4.14. 刷新门户首页查看待办、已办数据【致远】
5、 注意事项
无
2.2.3 - 第三方同步到V8常见问题
1、拉取
一般作为初始化使用,运行中不推荐使用,量大而且实时性差。
2、事件订阅、消息队列
异步的,第三方调用后,会甩出mq,然后订阅执行。第三方不能感知是否最后形成事项,需人工检查。
3、关联开放openapi
第三方数据→cip-connector底表(用于判断更新/新增)→调用affair接口。
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获取方式:
3、数据内容一个节点多个人,需要节点id+人的id作为第三方的标识。
4、如果相关人员是第三方信息,那么需要提前建立好用户映射
5、待办更新时,目前需要报文中含有所有字段。如果更新时只给id和状态,那么还需要第三方建立底表存储新建时的报文信息。
6、接口成功都会返回第三方标识。接口错误的一种标志如下
3.1.1 - 三方系统提供写入OpenAPI
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. 新建三方集成应用
4.2. 封装安全认证
4.3. 枚举定义
4.4. 接口封装
4.5. 在线调试验证
4.6. 新建消息同步【致远】
4.7. 选择同步模式【致远】
4.8. 配置字段映射【致远】
4.9. 发布三方集成应用
5、注意事项
3.2.1 - 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. 新建集成应用
5.2. 配置单点登录
5.3、新建消息同步,获取消息同步能力编码
5.4、发布应用
5.5、启用API
5.6、新建接入应用
5.7、启用接入应用
5.8、分配APPKey和AppSecret
5.9、应用级别API授权
5.10、按需开启IP白名单
5.11、按需开启限流控制
5.12、API调用日志
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
}
4.1 - 单点登录
1、概述
提供标准的单点登录认证模式,有致远V8颁发临时授权码ticket,三方根据ticket获取当前登录用户信息,完成单点登录。
2、标准单点登录模式
2.1、V8标准单点登录认证(协同认证-V8)
a、说明
V8登录成功后,点击三方系统菜单前,会根据当前登录用户信息,生成临时授权码,在三方原始菜单地址后拼接参数ticket,
三方系统拦截ticket参数,根据【根据ticket获取用户信息】接口获取用户信息,模拟登陆,实现免登进入三方系统。
b、根据ticket获取用户信息接口说明
请求地址
[http://]【COP平台域名】/service/ctp-user/auth/restore
请求方式
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 - 免登
版本要求: ctp-user >= 3.2.x
1、概述
平台提供标准的免登认证机制,三方异构系统根据分配的秘钥调用接口获取免登授权码,并按要求拼接免登地址后,即可免登进入COP平台。
2、集成导图
3、集成步骤
3.1、申请APPKey和AppSecret
访问路径:管理后台—>集成平台–>开放平台–>接入应用
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、使用系统管理员账号登录管理后台
3.2、进入认证服务
3.3、按需选择预制三方统一身份认证系统
3.4、按需选择客户端类型
3.5、联系三方统一身份认证系统获取授权信息
3.6、重启微服务ctp-user
3.7、前台验证
注意,在未登录情况下,浏览器地址中输入【COP平台访问域名】/main/portal时,系统系统跳转到三方统一身份认证页,属于对方账号密码后可以正常进入COP首页,标识配置正确并生效。
5 - OpenAPI集成
1、概述
支持COP平台内,预制应用、低代码定制应用、BPM表单应用、三方集成应用通过自注册机制开放OpenAPI和事件。
2、集成场景
5.1 - 开放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. 进入管理后台
3.2. API查看
注意事项:
各个微服务中会有starter中暴露出来的公共OpenApi,例如:,默认不是所有应用都开启,需要使用系统管理员账号system-admin登录手动开启,见下图。
开启公共api的应用效果如下:
未开启公共api的效果如下:
问题排查:
api列表中未显示,可先查询元数据,看元数据中是否存在该openapi,https://域名或ip端口//service/cip-manager/metadata/open-api?appName=应用名称
示例地址:https://pre.seeyonv8.com/service/cip-manager/metadata/open-api?appName=ctp-affair
3.3. API扩展-UDC/BPM发布实体API
3.4. UDC/BPM发布自定义API
3.5. 三方集成应用开放API
3.6. 刷新API
3.7. 启用API
3.8. 新建接入应用
3.9. 启用接入应用
3.10. 分配APPKey和AppSecret
3.11. 应用级别API授权
3.12. 导出接口文档
3.13. IP白名单
3.14. 限流控制
3.15. API调用日志
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配置一致
正确的效果应该是以下这种
6.2、Open请求地址前缀配置
环境安装时,需要为OpenAPI分配独立的域名或者端口,保证和管理后台访问地址域名端口不一样,Nacos配置位置如下,切记需要重启
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. 进入管理后台
3.2. 事件查看
3.3. UDC发布自定义事件
3.4. 启用事件
3.5. 新建接入应用
3.6. 启用接入应用
3.7. 开启加密因子
3.8. 开启回调令牌
3.9. 请求网址验证
3.10. 添加事件
3.11. 配置数据范围
3.12. 提供回调接口定义和规范
注意:由三方系统线下提供
3.13. 新建三方集成应用
3.14. 接口封装,发布应用
3.15. 设置回调方式
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 - 移动微协同
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
入口:企微后台管理页面-我的企业
4.2、企微新建应用
注意:新建应用后,需要获取一下三个字段:CorpID、AgentID、AgentSecret;
选择自建应用模式时执行此步骤
4.3、获取AgentId
4.4、获取应用Secret
注意:点击查看后,需要应用管理员登录企业微信,在通知消息中查看
4.5、配置Nacos
capability:
workWx:
accessMode: SELF_BUILT
4.6、移动插件-启用全局配置
入口:后台管理-移动管理-移动插件
移动插件默认“不启用”,通过开启【启用微协同】开关,可启用微协同。
协同服务器地址为当前租户环境的协同服务器地址。
开启接收通知、开启连接,并勾选许可协议、风险提示。
4.7、移动插件-新建插件
注意:致远COP平台与企业微信集成中,分为自建模式和待开发模式,本次解决方案采用自建模式
4.8、配置组织同步(可选)
注意:此模式下,企业微信部门、账号数据有V8OA门户自动同步,当V8OA门户部门、账号数据变更时,企业微信部门、账号数据同步变更;
4.9、后台配置用户映射(非必须)
注意:当V8OA门户和企业微信中的组织数据不是来源于同一个组织主数据系统,且相互间没有数据同步时,需要V8机构管理员在移动插件-企业微信-用户映射标签中选择映射类型(手机号码、个人邮箱、企业邮箱、用户名、用户Id、用户编码);
系统会根据所选映射类型与企业微信账号之间建立联系;
针对无法通过映射类型建立账号关系的特殊账号,平台支持手工配置映射;
4.10、获取待发布地址
4.11、企微配置首页访问地址
4.12、企微配置信任域名
4.13、可信IP配置【重重重】
4.14、 申请域名校验
4.15、手机端企微工作台查看应用
4.16、移动端自助绑定账号
注意:除上一步骤中需要后台配置映射关系场景外,平台支持用户在登录企业微信-微协同时,自助登录绑定映射关系;
4.17、事项接受
注意:登录微协同查看待办列表,点击任一列表可免登陆打开待办详情页;
4.18、消息接受
注意:借用企业微信应用消息通知模式,接受统一消息通知;
4.19、移动端自助解绑
5、注意事项
5.1、免登
如果COP手机号码与企微手机号码一致,则无需配置用户映射即可实现企微用户免登打开COP应用。
5.2、集成收费:
企微端要求按照服务商收取接口调用年费,大概没人每年3元;
5.3、IP受限:
需要在企微管理后台-应用管理,增加企业可信IP,且所有出口IP,都需要加上
5.4、消息接受域名配置
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、查看企业名称
4.2、查看CorpId
4.3、新建应用
4.4、获取应用APPKey、AppSecret、agentId
4.5、接口授权
4.6、新建移动插件
4.7、启用配置
4.8、新建钉钉移动插件
4.9、组织同步
4.10、用户映射
4.11、 应用发布/上架
4.12、钉钉应用发布
4.13、钉钉客户端进入应用
4.14、钉钉客户端接受消息
5、注意事项
钉钉开放平台:[https://open-dev.dingtalk.com/#/]()
钉钉管理后台:[https://oa.dingtalk.com/index.htm#/welcome]()
应用首页地址必须是相对地址:
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、查看企业名称
4.2、查看企业编码
4.3、 新建应用
4.4、获取应用APPKey、AppSecret
4.5、接口授权
4.6、新建移动插件
4.7、启用配置
4.8、新建飞书移动插件
4.9、组织同步( 慎用,如果不需要千万不要配置 )
4.10、用户映射
4.11、应用发布/上架
4.12、飞书应用发布
4.13、飞书客户端进入应用
4.14、飞书客户端接受消息
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服务集成
1、概述
提供接口登记、数据直连、事件订阅等配置,可以将三方异构系统服务转换为符合AI-COP|V8规范的服务能力。
2、能力清单
8.1 - 接口登记&应用
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、新建应用参数(非必须)
3.3.2、新建集成应用
3.3.3、新建公共参数
3.3.4、新建接口鉴权
3.3.5、新建接口登记
3.3.6、在线调试
3.3.7、发布应用
3.4、UDC定制应用调用接口
3.4.1、新建UDC定制应用
3.4.1、依赖集成应用
3.4.1、新建微流程,依赖集成应用接口
3.4.1、查看日志
3.5、BPM流程节点调用接口
3.6、接口发布到开放平台
4、注意事项
无
9 - SPI扩展机制
1. 概述
当集成基础能力无法满足客户需求时,平台提供SPI扩展机制,用户可以在不影响上层使用的前提下,通过手写客开代码,实现统一身份认证、免登、单点登录、移动 App 接入、接口鉴权、基础能力厂商通道扩展等能力,解决个性化集成需求。
2. 能力架构
3. SPI 机制实现说明
3.1. spi jar 包项目开发并打包
下载帮助文档中对应功能 spi 示例的 demo 项目按需实现对应业务接口,并打包成 jar 包
- spi 扩展 jar 包项目实现注意事项
- 打包
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
注意:
- 两种配置根据项目情况取其一即可,jar包放到对应位置后,要确认jar包是否完整,对比下本地打的jar包大小,与服务器上的是否一致
- spi-plugins的值:
- file:/data/xxx/xxx.jar
, 短横杠 后面 1 个英文空格, 前面 6 个英文空格 file:/data/xxx/xxx.jar
整体字符串中间 没有空格- 所有缩进,以 两个英文空格 为标准, 不要使用 TAB 缩进
- 配置内容都是在 英文输入法 下配置,不要使用中文输入法
- 扩展 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'
5.2. 配置信息不对(配置格式层级不对)
举例如下
根据实际上传的版本来,比如此例中应该是
5.3. 配置中含有中文的空格,字符导致
字符-及后面的空格等全部要求是英文才可以,配置手写重新敲一遍配置
6、能力清单
9.1 - 统一身份认证
1. 概述
使用三方认证中心进行统一身份认证, 在登录 v8 系统时, 会先跳转到三方认证中心进行登录, 三方认证中心登录成功后, 重定向 v8 目标地址,完成系统登录过程。
2. spi 接入导图
统一身份认证时序图
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. 异常跟踪
3.6. 内容校验
浏览器地址输入:<domain>/service/ctp-user/api/sso-config
确认内容:
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. 用户登录报错时,跳转到自定义错误页
说明:免登失败时,自动跳转到自定义错误页,支持自定义错误信息可视
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 - 免登-中间页模式
1. 概述
三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code)
登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址
登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户
2. 接入导图
说明:有三方系统免登进入V8
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
通过免登地址,登录 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 - 免登-中间页扩展模式
1. 概述
三方异构系统通过中间页免登地址(地址中包含 v8 目标地址, 用户信息对应的随机值 code, 以及自定义参数)
登录的 v8 目标地址: 中间页免登地址中的 v8 目标地址
登录的 v8 系统的用户信息: 通过 中间页免登地址中的用户随机值 code 查询到的用户信息, 同时 v8 系统中也要存在的用户
2. 接入导图
说明:有三方系统免登进入V8
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 - 单点登录
1、概述
单点登录场景:
- 点击V8菜单跳转三方系统。
- 点击三方栏目更多跳转三方系统。
- 点击通过集成应用同步过来的三方系统待办、消息,跳转至三方系统。
2、接入导图
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、效果实例:
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 - 移动插件
1、概述
移动插件场景 1.V8应用接入三方APP工作台中,例如企业微信、钉钉、飞书等。
2.点击工作台应用图标免登进入V8应用。 3.V8产生的消息推送至三方APP。 4.V8组织人员信息同步至三方APP(可选)。2、接入导图
3、接入步骤
3.1、demo工程下载
<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.必要条件,修改自定义类型
5、注意事项
9.6 - 接口鉴权
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 - 基础能力厂商通道
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. 工程下载
注意事项: 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 - 致远V5
1、概述
实现V8与V5之间接口鉴权、单点登录、组织同步、事项同步、消息同步集成。
2、集成场景
2.1、V8作为门户,V5发布应用
- V8配置菜单,单点登录打开V5应用
- V8主动调用V5组织写入OpenAPI,完成组织同步
- V5推送待办事项,V8呈现V5待办事项并免登陆打开详情页
- V5推送消息到V8,V8呈现V5消息并免登陆打开详情页
- M5作为移动门户,单点登录打开V5菜单、事项、消息
2.2、V8发布应用,V5作为门户
- V5配置菜单,单点登录打开V8应用
- V8主动调用V5组织查询OpenAPI,完成组织同步
- V8推送待办事项到V5,V5呈现V8待办事项并免登陆打开详情页
- V8推送消息到V5,V5呈现V8消息并免登陆打开详情页
- M3作为移动门户,单点登录打开V8菜单、事项、消息
3、V5版本场景区隔表
4、集成配置步骤
10.1.1 - V8作为门户,V5发布应用
1、V8作为门户,V5发布应用
1.1、V8配置菜单,单点登录打开V5应用
1.1.1、V5集成页面配置
1.1.1.1、产品登记【V5】
1.1.1.2、应用注册【V5】
1.1.1.3、应用接入设置
1.1.1.4、用户绑定设置
1.1.1.5、切换系统管理员角色
1.1.1.6、进入REST用户管理
1.1.1.7、新建REST账号
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
- url参数:【V8服务域名】+"/service/cip-manager/plug/sso/callback"
- 说明:V8拉取待办事项并列表呈现,点击待办打开待办详情页时,会在URL后拼接ticket参数,V5拦截ticket参数后,调用V8登录认证地址接口,换取手机号码/人员编号,模拟登陆,完成免登陆打开事项详情页。*
- key参数(加密因子):与V8连接器单点登录配置的加密因子保持一致即可。
1.1.3、V8集成配置
1.1.3.1、导入预制集成应用
说明:由于版本差异,请联系集成平台获取
1.1.3.2、免登配置
1.1.3.3、菜单配置
1.1.3.4、发布并启用三方集成应用
1.1.3.5、菜单角色授权
1.1.3.6、菜单效果查看
1.2、V8主动调用V5组织写入OpenAPI,完成组织同步
需要时联系集成平台获取预制集成应用
1.3、V5推送待办事项,V8呈现V5待办事项并免登陆打开详情页
1.3.1、V5集成配置
1.3.1.1、产品登记【V5】
1.3.1.2、应用注册【V5】
1.3.1.3、应用接入设置
1.3.1.4、用户绑定设置
1.3.1.5、切换系统管理员角色
1.3.1.6、进入REST用户管理
1.3.1.7、新建REST账号
1.3.2、V8集成配置
1.3.2.1、启用API
1.3.2.2、新建接入应用
1.3.2.3、API授权
1.3.2.4、启用接入应用
1.3.2.5、获取AppKey和AppSecret
1.3.2.6、查看接口域名
1.3.2.7、导入预制集成应用
说明:联系集成平台获取
1.3.2.8、新建事项同步
1.3.2.9、查看事项同步-同步能力编码
1.3.2.10、发布并启用三方集成应用
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
- 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
- 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】
1.1.1.2. 应用注册【V5】
1.1.1.3. 应用接入设置
1.1.1.4. 用户绑定设置
1.1.1.5. 单点登录设置
1.1.1..6. 门户配置
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. 切换系统管理员角色
1.2.1.2. 进入REST用户管理
1.2.1.3. 新建REST账号
1.2.2、V8集成配置步骤
1.2.2.1. 导入三方集成应用
说明:联系集成平台获取
1.2.2.2. 配置安全认证
1.2.2.3. 测试接口
1.2.2.4. 启用组织同步
1.2.2.5. 运行配置
1.2.2.6. 数据校验
1.2.2.7. 发布并启用三方集成应用
由于版本差异,请联系集成平台获取
1.2.3、V8预制应用获取
有项目实施经理提供,或者联系集成平台获取
1.3、V8推送待办事项到V5,V5呈现V8待办事项并免登陆打开详情页
1.3.1. V5集成配置步骤
1.3.1.1. 产品登记【V5】
1.3.1.2. 应用注册【V5】
1.3.1.3. 应用接入设置
1.3.1.4. 用户绑定设置
1.3.1.5. 单点登录设置
1.3.1.6. 切换系统管理员角色
1.3.1.7. 进入REST用户管理
1.3.1.8. 新建REST账号
1.3.2. V8集成配置步骤
1.3.2.1. 导入预制集成应用
说明:联系集成平台获取
1.3.2.2. 配置安全认证
1.3.2.3. 测试接口
1.3.2.4. 修改事项同步配置
1.3.2.5. 启用事项推送
1.3.2.6. 发布并启用三方集成应用
1.4. V8推送消息到V5,V5呈现V8消息并免登陆打开详情页
1.4.1、V5集成配置步骤
参考事项集成配置
1.4.2. V8集成配置步骤
1.4.2.1. 导入预制集成应用
说明:联系集成平台获取
1.4.2.2. 配置安全认证
1.4.2.3. 测试接口
1.4.2.4. 修改消息同步配置
1.4.2.5. 启用消息推送
1.4.2.6. 发布并启用三方集成应用
1.5、M3作为移动门户,单点登录打开V8菜单、事项、消息
由于以上配置步骤包含M3移动端配置,所以使用M3可以直接使用以上功能