乾策立方 开放平台文档

乾策立方 开放平台面向企业三方系统提供标准 HTTP API,支持员工、绑定关系、项目、目标与目标复盘、任务、通知、便签、标签、贡献点和附件上传能力。 所有接口默认只作用于当前 API Key 所属企业,权限由后端统一控制并在请求时强校验。

显示全部接口

便签与便签包接口

便签和便签包接口分别使用 notes.read、notes.write 权限。业务 Id、便签 Id、便签包 Id 可以使用 Guid;员工字段统一使用 virtualId。

POST/api/openplatform/notes

新增便签。成功时响应 data 返回新建便签 Id(Guid),后续详情、共享、修改等操作应使用该 Id。

{
  "name": "开放平台便签",
  "content": "便签内容",
  "parentId": "便签包或便签夹 Guid,可选",
  "priority": 3,
  "type": 1,
  "score": 0,
  "dueAt": "2026-08-22T17:32:50+08:00",
  "assigneeVirtualIds": ["负责人 virtualId"],
  "checkerVirtualId": "审核人 virtualId",
  "ccVirtualIds": [],
  "labelIds": [],
  "attachmentUrls": []
}
GET/api/openplatform/notes

获取当前员工可见便签列表。统一使用 page、pageSize 和 keyword 分页筛选;可选 startAt、endAt、group、noteType、includeSummary(默认 true,传 false 时列表项不含 summary)。

列表响应字段

字段类型说明
data.totallong符合筛选条件的便签总数。
data.pageint当前页码,从 1 开始。
data.pageSizeint当前页返回条数上限,范围为 1 到 100。
data.itemsNote[]当前页便签列表;单项字段见下表。

Note 通用字段

GET /api/openplatform/notes、/notes/search、/notes/shares、/notePackages/{id}/notes 的 items 单项,以及 GET /api/openplatform/notes/{id} 的详情,均使用以下公开资源字段。

字段类型说明
idguid便签资源标识,用于详情和动作路径。
namestring便签名称。
contentstring便签内容;未填写时为空字符串。纯文本会自动包装为富文本段落(<p>/<br/>,HTML 转义后按换行拆段),已含 HTML 标签的原样透传。
summarystring正文摘要:由 content 的富文本压成的纯文本(去标签、解码实体、折叠空白),最长 120 字符,被截断时以省略号结尾;正文无有效文字时为空字符串。仅 GET /api/openplatform/notes(我的便签列表)返回该字段,其它列表与详情不含;传 includeSummary=false 可关闭。
parentIdguid | null所属便签包或便签夹标识;未归类时为 null。
noteTypeint便签类型或象限类型。
priorityint便签优先级。
scoredecimal关联贡献点,单位为“点”。
dueAtstring | null截止时间,ISO 8601 带时区字符串;未设置时为 null。
sendAtstring | null定时发送时间,ISO 8601 带时区字符串;未设置时为 null。
assigneesobject[]负责人的成员对象数组(每项含 virtualId、name 与掩码 phone)。
checkerobject | null审核人的成员对象(含 virtualId、name 与掩码 phone);未设置时为 null。
ccobject[]参与或抄送员工的成员对象数组(每项含 virtualId、name 与掩码 phone)。
labelIdsguid[]关联标签标识列表。
attachmentUrlsstring[]附件公开访问 URL 列表。
isStarredbool当前操作员工是否已关注该便签。
canEditbool当前操作员工是否具备编辑权限。
canDeletebool当前操作员工是否具备删除权限。
canSendbool当前操作员工是否具备发送权限。
createdAtstring创建时间,ISO 8601 带时区字符串。
updatedAtstring | null最后更新时间,ISO 8601 带时区字符串;未更新时可能为空或 null。
GET/api/openplatform/notes/{id}

获取便签详情。另有 /search、/shares、/records、/{id}/shareRecord 查询接口。

响应字段:返回一个完整 Note 对象,字段、类型和含义见上方“Note 通用字段”。

POST/api/openplatform/notes/{id}/actions/{action}

便签写操作的 action:delete、star、share、cancelShare、editPermission、lock、unlock、toPackage、singleEdit、send、setTop、uploadAttachment。所有写操作均使用当前动作资源路径。

路径中的 {id} 为便签 Id。除下表标明的参数外,动作请求体传空对象 {}。员工参数必须使用当前 API Key 下的 virtualId,不能传真实员工 Guid。

action请求体示例参数说明
delete{}无请求参数。删除当前便签。
star{}无请求参数。切换当前便签的关注状态。
share{ "sharedEmployeeVirtualIds": ["员工 virtualId"], "canEdit": true, "canDelete": false, "canSend": false }sharedEmployeeVirtualIds 必填;权限布尔值可选,省略时按 false 处理。
cancelShare{ "sharedEmployeeVirtualIds": ["员工 virtualId"] }sharedEmployeeVirtualIds 必填,要取消共享的员工列表。
editPermission{ "sharedEmployeeVirtualIds": ["员工 virtualId"], "canEdit": true, "canDelete": false, "canSend": true }sharedEmployeeVirtualIds 必填,通常传一个共享员工;三个权限字段用于修改编辑、删除、发送权限。
lock / unlock{}无请求参数。锁定或解锁当前便签。
toPackage{ "packageId": "便签包 Id" }packageId 必填,必须是便签包 Id(取自便签包列表或便签包树接口),将当前便签移动到该便签包;传入便签夹 Id 不会让便签真正入包,后续 setTop 仍会报错。
singleEdit{ "noteType": 1, "content": "新的名称" }noteType 和 content 必填,具体格式见下方“单项修改 noteType”。本动作只认这一对参数:源站按 noteType 分发到对应字段,缺 noteType、content 为空,或把新值写进 name、assigneeVirtualId、ccVirtualIds、projectId、attachmentUrls 等其它参数,都会被 400 明确拒绝(此前这些写法会返回“修改成功”却没有任何改动)。
send{ "isRemove": false }isRemove 可选,是否发送成功后删除便签,默认 false。当前便签必须已有负责人。
setTop{}无请求参数。切换当前便签置顶状态。
uploadAttachment{ "url": "https://www.example.com/file.txt" }url 和 resId 至少传一个。url 为附件公开地址,resId 为附件上传接口返回的资源 Id。

singleEdit 的 noteType 参数

noteTypecontent 格式说明
1普通字符串修改名称。
2HTML 字符串修改便签内容。传纯文本时网关会自动包装为段落(正文经发出链路校验,纯文本会被清空,因此仍按富文本下发)。
3JSON 字符串修改贡献点、预计工时和难度,例如 {"score":5,"difficulty":2,"workingHoursData":{"estimated":8,"unit":1}}。必须带非负数值 score:源站在 score 与原值相同时不做任何修改,传空对象会「回成功但什么都没改」,因此缺 score 由网关直接拒绝;载荷里的 difficulty 必须是 1-5。workingHoursData 与 difficulty 都可以省略,省略时源站沿用该便签的存储原值(与任务修改贡献点同一条入参兜底口径),不会被默认值覆盖,也不会多出「预计工时」「任务难度」的操作记录。给出的 difficulty 仍必须是 1-5;workingHoursData 的 unit 取值 1=小时、2=天。不要拿详情里的值原样回传来"保持不变":详情对未设置的字段给的是展示默认值(无工时数据时 unit 显示为企业配置单位、难度显示为 2),回传反而会被判成变更并写入。只改贡献点就只传 {"score":点数}。
4数字字符串修改优先级,取值 1 到 5。越界值(0、6、99…)源站既不报错也不修改仍回成功,由网关拒绝。
5带时区的 ISO 8601 时间字符串修改截止时间。
6检查项 JSON 字符串按详情接口返回的检查项结构提交检查项变更。内层 type 只支持 -1 删除、0 新增、1 改名、2 排序、3 勾选完成、4 附件增减;其它值源站无对应分支,会「回成功但零改动」,由网关拒绝。
9能力 Id 字符串修改能力需求。必须是本企业真实存在的能力 Id(取自详情或能力清单):源站不校验存在性,传不存在的 Id 会「回成功但不生效」,混合传真实与不存在的 Id 时会把无效 Id 一并写入。
10带时区的 ISO 8601 时间字符串修改定时发送时间。
11象限值修改所在象限,取值 1:重要且紧急,2:重要不紧急,3:不重要紧急,4:不重要不紧急。1-4 之外的数字源站不拦(会把枚举外的值写库、操作记录里的改后值显示为空),由网关拒绝。
45、46、47、48、49、54按对应业务模型提交分别用于自定义项新增/修改、删除自定义项、删除自定义组、切换里程碑、修改预计工时、修改难度。涉及内部自定义项结构的动作,必须先读取详情后按原结构提交:45 的 groupId/id 命中不到时源站零改动仍回成功;48 是「切换」语义、不读 content,重复调用会来回翻转;49 传与当前相同的值时源站直接回成功且不写库;54 难度越界源站已回错误码(610/611),无需网关再加拦。
员工字段限制:singleEdit 的负责人、参与人、审核人内部动作仍要求员工 Id 数组或 Guid。开放平台当前不公开这些未完成 virtualId 转换的单项修改类型(7、8、18),请勿直接传真实员工 Guid。
异步说明:delete、share、cancelShare、lock、unlock、send 为队列型操作,返回成功只表示请求已受理;最终结果请通过详情或 Webhook 确认。
PUT/api/openplatform/notes/{id}/labels

全量替换便签标签:以请求中的标签 Id 集合为最终状态,需要新增与移除的标签由平台自动补差完成,与工作台标签维护同链路(操作人需有便签权限)。同步处理,返回成功即已生效。

必填请求头:必须提供 X-Employee-Virtual-Id。未传时返回 403。
字段类型必填说明
labelIdsguid[]是替换后的标签 Id 全集,来自 GET /api/openplatform/labels;重复 Id 自动去重;传空数组 [] 表示清空便签全部标签。

请求示例:

PUT /api/openplatform/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890/labels
Content-Type: application/json
X-Employee-Virtual-Id: emp_T7dQ2mYk8rLp4cN1sVx3bH9wAe6fJuKz

{
  "labelIds": [
    "2f6e8a10-3c4b-4d5e-9f80-a1b2c3d4e5f6"
  ]
}
注意事项:本接口为全量替换语义,未出现在 labelIds 中的已有标签会被移除;只想追加标签时,请先通过便签详情读取当前标签再合并提交。标签不存在、操作人无便签权限等业务校验失败时返回对应错误,已生效的部分变更不回滚。
POST/api/openplatform/notePackages

新增便签包,请求字段为 name、content、sharedEmployeeVirtualIds。成功时响应 data 返回新建便签包 Id(Guid)。便签夹使用 POST /api/openplatform/notePackages/folders,字段为 parentId、name、folderType,成功时同样返回新建便签夹 Id。

GET/api/openplatform/notePackages

获取便签包列表。其他查询包括 /{id}、/{id}/notes、/search、/tree、/tree/all、/{id}/shareRecord;/tree 的 parentId 可省略,省略时返回根节点。

列表和详情响应字段

字段类型说明
data.totallong列表接口的记录总数。
data.pageint列表接口当前页码,从 1 开始。
data.pageSizeint列表接口当前页返回条数上限,范围为 1 到 100。
data.itemsNotePackage[]列表接口当前页便签包或便签夹数据。
idguid便签包或便签夹资源标识。
namestring便签包或便签夹名称。
contentstring便签包备注;便签夹没有备注时为空字符串。
parentIdguid | null父便签包或便签夹标识;根节点为 null。
folderTypeint | null便签夹象限类型;便签包不适用时为 null。
isStarredbool当前操作员工是否已关注。
canEditbool当前操作员工是否具备编辑权限。
canDeletebool当前操作员工是否具备删除权限。
canSendbool当前操作员工是否具备发送权限。
createdAtstring创建时间,ISO 8601 带时区字符串。
updatedAtstring | null最后更新时间,ISO 8601 带时区字符串;未更新时可能为空或 null。
详情与树结构:GET /api/openplatform/notePackages/{id} 返回一个 NotePackage 对象;/tree、/tree/all 返回同一对象结构的树形数组,并通过 children(NotePackage[])表示子节点。
POST/api/openplatform/notePackages/folders

新增便签夹。权限 notes.write,必须带 X-Employee-Virtual-Id。成功响应 data 为 {id}(新建便签夹标识)。

字段类型必填说明
parentIdguid是父便签包或父便签夹 Id。全零 Guid 会被网关判 400,错误信息为“parentId 必须是有效的 Guid”;父级不存在时返回 400 且 statusCode=102,错误信息为“父级不存在”。
namestring是便签夹名称,空白时返回 400 且 statusCode=101,错误信息为“新增便签夹名称不能为空”。公开字段名是 name,由网关映射为源站的 title;便签夹不套用网盘的 12 字上限,那是 /disk 模块自己的规则。
folderTypeint否象限类型,默认 1。取值 1 重要紧急、2 重要不紧急、3 不重要紧急、4 不重要不紧急。

失败情况:同名(同企业、同创建人、同父级)返回 400 且 statusCode=103,错误信息为“新增便签夹名称不能重复”;写入事务回滚时返回 400 且 statusCode=103,错误信息为“新增失败”。

副作用:同事务写入便签夹记录与两条操作记录,并触发 noteFolder.created Webhook;不走消息队列。新建对象仅创建人可见。
GET/api/openplatform/notePackages/{id}

获取便签包详情。权限 notes.read,必须带 X-Employee-Virtual-Id。data 为单个 NotePackage 对象(字段见上方“列表和详情响应字段”),另含 shareUser、isPermitEdit、isPermitDelete、isPermitSend、remark、operateBtns。

失败情况:包不存在返回 400 且 statusCode=101,错误信息为“便签包不存在”;无查看权限返回 400 且 statusCode=102,错误信息为“您没有权限查看该便签包”。

注意:这是会写数据的读接口。成功返回的同时会把当前操作人在该便签包下的通知置为已读(红点消失),不影响他人可见性,不排队。
GET/api/openplatform/notePackages/{id}/notes

获取便签包内的便签与便签夹。权限 notes.read,必须带 X-Employee-Virtual-Id。

查询参数类型默认说明
pageint1页码,小于 1 时按 1 处理,不报错。
pageSizeint20每页条数,静默收敛到 1 到 100。
keywordstring无按便签标题模糊匹配,下发为源站的 key。
startAt / endAtdate-time无创建时间窗口,ISO 8601 带时区。
group / noteTypeint0分组与便签类型过滤,noteType 下发为源站的 type。

data 为分页结构 {total, page, pageSize, items},其中 total 是源站统计的真总数。

GET/api/openplatform/notePackages/search

跨便签包搜索便签。权限 notes.read,必须带 X-Employee-Virtual-Id。查询参数与 /{id}/notes 同形。

两个必须知道的差异:① total 是本次返回的条数,不是全库命中总数,不能用它判断是否还有下一页;② 不传 startAt 与 endAt 时,源站会把时间窗口按当前时间收窄,搜历史便签必须显式传时间范围(GET /api/openplatform/notes 则会补全量窗口,两者行为不同)。

includeSummary 仅对 GET /api/openplatform/notes 生效,本接口不透传、也不会返回摘要字段。

GET/api/openplatform/notePackages/tree

获取便签包树的一层节点。权限 notes.read,必须带 X-Employee-Virtual-Id。data 为数组(非分页结构)。

查询参数类型默认说明
parentIdguid省略省略或空白时返回根便签包列表;传具体 Id 时返回该节点下的便签夹。非 Guid 取值返回 400,错误信息为“parentId 必须是有效的 Guid”。

节点字段:本接口填 label(节点名称)、id、type、hasChildren,其中 name 为 null。

GET/api/openplatform/notePackages/tree/all

一次性获取当前操作人的完整便签包树(便签包 + 递归便签夹)。权限 notes.read,必须带 X-Employee-Virtual-Id。无查询参数,data 为数组,子级在 children 里。

与 /tree 的字段差异:本接口填 name(此时 label 为 null),而 /tree 填 label。渲染树时请按接口取对应字段,不要假设两者同形。
GET/api/openplatform/notePackages/{id}/shareRecord

获取便签包共享记录。权限 notes.read,必须带 X-Employee-Virtual-Id。无查询参数。

data 为对象 {shareRecordList, shareUser}:shareRecordList 是共享操作流水;shareUser 首项恒为当前操作人且 isCreater=true、三项权限为 true,其余成员来自共享授权表,字段为 {id, img, trueName, isPermitEdit, isPermitDelete, isPermitSend, isCreater, time}。

失败情况:包不存在 400 且 statusCode=101“便签包不存在”;无权限 400 且 statusCode=102“您没有权限查看”。只读,不写数据、不排队。

GET/api/openplatform/notes/{id}/shareRecord

获取便签共享记录。{id} 为便签 Id,权限 notes.read,必须带 X-Employee-Virtual-Id。响应结构与便签包的同名接口一致:{shareRecordList, shareUser},人员标识按当前 Key 归一为 virtualId。

失败情况:便签不存在返回 400 且 statusCode=101,错误信息为“便签不存在”。本接口只校验存在性、不校验读权限,与便签详情接口的权限口径不同。只读,不写数据、不排队。

POST/api/openplatform/notePackages/{id}/actions/{action}

便签包或便签夹 action:delete、deleteFolder、edit、editFolder、singleEdit、star、share、cancelShare、editPermission、toPackage、toNote、toPlan、move。

路径中的 {id} 为便签包或便签夹 Id。除下表标明的参数外,动作请求体传空对象 {}。员工参数必须使用当前 API Key 下的 virtualId。

action请求体示例参数说明
delete{}无请求参数。删除当前便签包。
deleteFolder{}无请求参数。删除当前便签夹。
edit{ "name": "新的包名称", "content": "新的备注" }name 必填,content 可选。修改便签包名称和备注。
editFolder{ "name": "新的夹名称", "noteType": 1 }name 必填;noteType 可选,象限取值 1 到 4。
singleEdit{ "noteType": 1, "content": "新的名称" }noteType 和 content 必填。noteType=1 修改名称,noteType=2 修改备注。
star{}无请求参数。便签包仅允许创建人切换关注状态。
share{ "sharedEmployeeVirtualIds": ["员工 virtualId"], "canEdit": true, "canDelete": false, "canSend": false }sharedEmployeeVirtualIds 必填;权限布尔值可选,省略时按 false 处理。
cancelShare{ "sharedEmployeeVirtualIds": ["员工 virtualId"] }sharedEmployeeVirtualIds 必填,要取消共享的员工列表。
editPermission{ "sharedEmployeeVirtualIds": ["员工 virtualId"], "canEdit": true, "canDelete": false, "canSend": true }sharedEmployeeVirtualIds 必填,通常传一个共享员工;三个权限字段用于修改共享权限。
toPackage{}无请求参数。将当前便签夹转换为便签包。
toNote{ "noteType": 1 }noteType 可选,目标便签象限取值 1 到 4,默认 1。
toPlan{ "noteType": 1, "projectId": "项目 Guid", "planTask": "[{\"groupId\":\"分组 Guid\",\"taskList\":[\"便签 Guid\"]}]" }projectId 必填;noteType 为 1:只转入选中的便签,2:按便签包范围校验并转入包内选中的便签;packageId 可选,省略时使用路径中的 {id};planTask 为 JSON 字符串。
move{ "sourceId": "源便签包或夹 Guid", "targetId": "目标便签包或夹 Guid", "targetPosition": 1 }sourceId、targetId 必填;targetPosition 可选,象限取值 1 到 4,默认 1。
异步说明:delete、deleteFolder、share、cancelShare 为队列型操作,返回成功只表示请求已受理;最终结果请通过详情或 Webhook 确认。
身份字段说明:返回结果中的创建人、负责人、共享人和操作人统一使用 virtualId 或 *VirtualIds。员工对象只返回公开展示字段和 virtualId,不会返回手机号、账号、部门内部 Id 或真实员工 Guid。请求中涉及员工身份时,请使用当前 API Key 对应的 /employees 接口返回的公开标识。