Files
OneOS1.2/.claude/skills/YunxiaoPM/references/live-api.md

9.5 KiB
Raw Blame History

云效实写 APIYunxiaoPMapp 已验证)

verified_at: 2026-07-25 · 项目须门禁 PJ 点选(见 project-selection.md);历史验证样本项目为 01_ONEOS / 原「统一运营管理平台」(last_selected.spaceIdentifierassets/runtime-ids.json,禁止未点选即使用)。

本文件只记已跑通的写法;禁止再盲试 updateStatus / 错误 updateFieldValue POST。

认证

  • CookieChrome 域 .aliyun.com / devops.aliyun.combrowser_cookie3 或 Playwright storage
  • Headerx-xsrf-token = cookie XSRF-TOKENURL 解码后)
  • Origin / Refererhttps://devops.aliyun.com

建单

POST|PUT /projex/api/workitem/workitem?_input_charset=utf-8

创建响应 result.identifier / serialNumber 即编号真相;禁止按标题查重

改负责人(已通)

PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"propertyKey":"assignedTo","propertyValue":"<userId>","operateType":"COVER"}

交棒:【交付】propertyValue = 何斐 ID。

打标签(已通)

PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"workitemIdentifier":"{id}","propertyKey":"tag","propertyValue":"<tagId>[,<tagId>]","operateType":"COVER"}

改状态(已通 · 唯一推荐)

POST /projex/api/workitem/workitem/{id}/status/transit?_input_charset=utf-8
{"fromStatus":"<当前status.identifier>","toStatus":"<目标status.identifier>"}

成功:code=200result=true。失败时 errorMsg 含「不能流转」。

需求状态 ID本项目

显示名 identifier
待处理 100005
已确认 32
分析中 154395
设计中 156603
设计完成 307012
待开发 1582fc929d429111b925309493

任务状态 ID

显示名 identifier
待处理 100005
已完成 100014

极速交棒跳转(工作流允许)

从「待处理」菜单可见直达「设计完成」;推荐最少跳:

待处理 → 设计完成 → 待开发

标准路径若需看板留痕,可走完整链:已确认→分析中→设计中→设计完成→待开发(仍用本 API勿开 UI

禁止(已证伪)

写法 结果
PATCH …/updateStatus + statusIdentifier 400 不能为空
PATCH …/{id} + propertyKey=status property not found
Playwright 点左侧/列表上的状态色块(x<1100 假成功、状态不落库

仅当 status/transit 不可用时,才用 UI右侧详情状态钮getBoundingClientRect().x > 1100+ .next-menu-item

计划开始/完成 · 提交部门/人 · 预计工时2026-07-27 修订)

通用字段写入(已通):

POST /projex/api/workitem/workitem/field/value/{workitemId}?_input_charset=utf-8
Content-Type: application/x-www-form-urlencoded

fieldValueList=[{"fieldIdentifier":"79","value":"2026-07-27 12:00:00"},{"fieldIdentifier":"3132597a9718d1c282b7ba5a0c","value":"业务管理部"},{"fieldIdentifier":"9e01269e96f91fbb97d36bf5b3","value":"何苗苗"}]
字段 fieldIdentifier value
计划开始 79 YYYY-MM-DD HH:mm:ss(推荐正午)或 epoch ms 字符串
计划完成 80 同上
提交部门 3132597a9718d1c282b7ba5a0c 纯文本
提交人 9e01269e96f91fbb97d36bf5b3 纯文本

预计工时 101586:禁止直接改字段(报「不可直接修改」)。须登记:

POST /projex/api/workitem/workitem/time/estimate?_input_charset=utf-8
{"workitemIdentifier":"<id>","spentTime":8,"type":"develop","description":"阶段日历工时","recordUserIdentifier":"<userId>","forCreate":false,"containsRestDay":false}

删除多余预估:DELETE /projex/api/workitem/workitem/time/estimate/{workitemId}/{estimateId}
列表:GET …/time/estimate/list?workitemIdentifier=

旧写法 PATCH …/updateWorkitemFieldValue 对上述自定义字段常 400 不能为空,勿再优先使用。

父子 / 子项 / 关联项(已通 · 2026-07-23 修订 · 子项优先)

关联项(【交付】强制 · ASSOCIATED

任务详情「关联项」只认 ASSOCIATED仅【交付】建单时 createWorkitemRelationInfo 必须指向需求

{
  "createWorkitemRelationInfo": {
    "relatedWorkitemIdentifier": "<需求id>",
    "relatedToRelationIdentifier": "ASSOCIATED"
  }
}

校验:

GET /projex/api/workitem/v2/workitem/{交付id}/relation/workitem/list/by-relation-category?category=ASSOCIATED&isForward=true

result 含该需求即通过。

禁止(关联项)

写法 结果
relatedToRelationIdentifier=PARENT 把交付挂需求 详情可能有 parent关联项仍为空
分析/设计只用 ASSOCIATED→需求 + parentIdentifier 关联项可能有,交付子项仍为空ONEOS-246/247
建后再 POST …/relation/record 补关系 Cookie 路径下常报「不能关联相同的工作项」
createWorkitemRelationList 不落 ASSOCIATED

子项(【分析】/【设计】强制 · TASK_SUB

「子项」页读 PARENT_SUB / TASK_SUB,分析/设计必须

{
  "parent": "<交付id>",
  "parentIdentifier": "<交付id>",
  "createWorkitemRelationInfo": {
    "relatedWorkitemIdentifier": "<交付id>",
    "relatedToRelationIdentifier": "TASK_SUB"
  }
}

同一 create 只能带一条 createWorkitemRelationInfo
ASSOCIATED→需求TASK_SUB→交付 不能同时写

产品优先级交付「子项」tab > 阶段任务「关联项」。
交付本身仍必须 ASSOCIATED→需求。标准路径下分析/设计的「关联项」允许为空。

无单快轨例外(设计双挂): create 用 TASK_SUB→交付 后,须再补 ASSOCIATED→原始需求,使设计详情「关联项」可见需求。

POST /projex/api/workitem/workitem/{设计id}/relation/record?_input_charset=utf-8
{"relationIdentifier":"ASSOCIATED","toWorkitemIdentifier":"<需求id>"}

已证伪Cookie · 2026-07-27 凡工作项已创建后再 relation/record 补挂(含 ASSOCIATED / TASK_SUB常报「不能关联相同的工作项」与是否已有父项无关。createWorkitemRelationList 亦不落 ASSOCIATED。
可行路径:

目标 做法
交付「子项」可见设计(优先) create 带 TASK_SUB→交付
设计「关联项」可见需求 create 带 ASSOCIATED→需求(与上互斥,同 create 只能一条)
双挂 需个人 x-yunxiao-token OpenAPICookie 路径不得声称成功

产品默认:子项优先;关联项失败须在回报中标红并列出缺项。

校验子项:

GET /projex/api/workitem/v2/workitem/{交付id}/relation/workitem/list/by-relation-category?category=PARENT_SUB&isForward=true

结果须含对应分析/设计 identifier。

校验设计关联项:

GET /projex/api/workitem/v2/workitem/{设计id}/relation/workitem/list/by-relation-category?category=ASSOCIATED&isForward=true

result 须含原始需求 identifier。

无单快轨字段默认2026-07-27

对象 规则
【设计】描述 复制需求 document HTML
【设计】79/80 当日 12:00:00 / 23:59:59create 后 field/value(勿 create 同时带 79+80
【交付】描述 手工同步需求正文或原型→AutoPRD禁止无故占位
【交付】79 创建当日;不写 80
【交付】/【设计】标签 与需求相同,PATCH propertyKey=tag
需求预计工时 time/estimate spentTime=2(先删多余预估)
需求实际工时 POST …/workitem/timebody 用 actualTime(非 spentTime+ gmtStart/gmtEnd epoch ms 字符串;见 runtime-ids.json fields.actual_hours
描述更新 PATCH …/workitem/{id}/document{"content":"<html>","formatType":"RICHTEXT"}

迭代挂接(已通 · 2026-07-27 · 只挂交付)

创建迭代:POST /projex/api/workspace/sprint(必填 staffIds;可写 capacityHours)。

挂【交付】到迭代:

PATCH /projex/api/workitem/workitem/{交付id}?_input_charset=utf-8
{"workitemIdentifier":"{交付id}","propertyKey":"sprint","propertyValue":"{sprintId}","operateType":"COVER"}

清空误挂(如需求):propertyValue:"" + operateType:"COVER"

校验必须读 /extra(详情主接口常不含 sprint 字段,禁止据此判失败):

GET /projex/api/workitem/workitem/{id}/extra?_input_charset=utf-8
→ result.sprint[].identifier / name

产品规则:只挂【交付】;需求 / 分析 / 设计默认不挂(除非口令显式)。

极速建单注意

  1. Cookie 只刷一次;全程纯 HTTP默认不开浏览器
  2. 交付建完后,【分析】与【设计】并行创建(均 TASK_SUB→交付标准/快轨两树可并行。
  3. 状态用 transit + 本地追踪 fromStatus(禁止每次 GET负责人在交棒场景下创建时即何斐
  4. 建单 fieldValueList 可带计划开始 79不要在 create 同时写 79+80(同日会 400
  5. 标签必须 PATCHcreate 带 tag 不落库);可与建子任务重叠;快轨交付/设计须与需求同标签。
  6. requests.Session keep-alive禁止对共享 opener 加全局锁。
  7. 脚本入口:scripts/live_create_fast.pyv5快轨描述/计划/标签/工时 2+2/设计 ASSOCIATED 补挂)。