别再让项目创建卡在“WBS引用”上——我们踩过的坑,你一次跳过
# 别再让项目创建卡在“WBS引用”上——我们踩过的坑,你一次跳过
作为一家制造企业的IT负责人,你是否有过这样的经历:系统升级后,一个看似简单的“新建项目”操作,却反复报错,代码检查了一遍又一遍,文档翻了一页又一页,就是找不到问题根源?你问供应商,对方说“配置没问题”;你问内部开发,他说“代码逻辑都对”。最后,你盯着屏幕上一行冰冷的 `Violation of UNIQUE KEY constraint "C91"`,内心只有一句:**到底哪里错了?**
别急,这种“黑盒式”的挫败感,我们太熟悉了。在帮助多家企业完成SCSAI系统集成时,我们几乎把每一个能犯的错误都犯了一遍。今天,我们就用最直白的语言,把那个让无数人抓狂的“Project创建”背后的隐藏规则,一次性说清楚。
## 为什么你的Project永远“差一步”?
很多团队在通过API创建Project时,会遇到一个诡异的场景:所有字段都传了,格式也检查了,但系统就是不认。报错信息要么指向“唯一键冲突”,要么提示“WBS_ID为空”。更让人崩溃的是,你在数据库里查,明明看到 `project_number` 是NULL,但系统却告诉你“已存在”。
**真相是:SCSAI的Project创建,从来不是“填表提交”那么简单。它是一场精心设计的“拼图游戏”——你必须按顺序,把每一块拼图先准备好,然后才能把它们组合起来。**
## 解开SCSAI Project创建的“三重锁”
### 第一把锁:`project_number`——你的“身份证”必须独一无二
这听起来像废话,但坑就藏在细节里。`project_number` 在SCSAI里被一个叫 `C91` 的唯一约束死死盯着。你可能会想:“那我传一个字符串,比如 ‘PRJ-2026-001’,总不会冲突了吧?”
**错。** SCSAI要求 `project_number` 必须是**纯数字**,比如 `472869`。如果你传了 `PRJ-xxxx`,系统会直接抛出 `PropertyValueFormatException`,连数据库都进不去。更迷惑人的是,SCSAI的客户端(Sciot)在显示已存在的Project时,会把 `project_number` 隐藏掉,导致你查数据库看到 `1313`、`1365` 这些值,但在界面上却显示为NULL。**这就像你的身份证号被系统“隐身”了,但数据库里它依然存在。**
所以,下次创建Project时,请给一个**唯一的、纯数值的**编号。别想着用字符串做前缀,SCSAI不吃这一套。
### 第二把锁:`wbs_id`——你不能“现场造”一个WBS元素
这是最容易被误解的规则。很多开发者在创建Project时,会试图在 `` 标签里嵌套一个 `- `,指望SCSAI“顺手”帮你把WBS元素也建了。**SCSAI只会冷冷地忽略它。**
`wbs_id` 就像一个“引用接口”,它**只能接受一个已经存在的、有真实GUID的WBS Element**。你必须在创建Project之前,先独立创建一个WBS Element(通过 `
- `),拿到它返回的GUID,然后再把这个GUID作为“门票”传给Project。
如果你传了一个裸的GUID文本(比如 `
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx `),SCSAI会直接忽略它,`wbs_id` 字段最终会变成NULL。然后,SCSAI内部的 `server_update_schedule` 方法就会报错:**“FAILURE: WBS_ID is null”**。
**记住:WBS元素不是Project的“附件”,它是独立的“零件”。你必须先造好零件,再组装进Project里。**
### 第三把锁:`scheduling_type`——SCSAI需要知道“时间怎么走”
这可能是最简单的一把锁,但也是容易被忽略的。`scheduling_type` 必须传 `Forward` 或 `Backward`。如果你不传,或者传了空值,SCSAI的 `UPDATE_SCHEDULE` 方法会因为无法确定排程方向而报错。
## 正确的“三步走”策略
现在,让我们把上面的规则串起来,形成一个可执行的、零报错的操作流程:
**第一步:创建WBS Element(独立存在)**
```xml
TEST WBS
```
这一步会返回一个GUID,比如 `X`。请妥善保管。
**第二步:创建Project,并引用上一步的WBS Element**
```xml
-
TEST
472869
Forward
```
**第三步:创建其他对象(Part、Activity2、Milestone等)**
在Project成功创建后,再添加其他关联对象。这就像盖房子:先打地基(WBS),再立框架(Project),最后填充内部(Part、任务等)。
## 还有一个容易忽视的“坑”:`owned_by_id`
如果你在创建Project时传了 `owned_by_id`,请确保你传的是**Identity对象的真实GUID**,而不是用户名或角色名。比如,你不能传 `Stamping `,SCSAI会告诉你 `‘Stamping’ is not a valid id`。如果你不确定,或者不需要这个字段,直接不传它,留空就好。
## 为什么“自动化”有时会失灵?
有些团队尝试用SCSAI的 `rule-engine`(规则引擎)来自动化创建WBS并回填ID。但我们的实际测试发现,`rule-engine` 的 `create_pre` 方法在虚拟沙箱中运行后,`context.item_properties` 并没有被成功回写。**这意味着,依赖规则引擎自动创建Project的方案,在当前版本下并不可靠。**
最稳妥的方式,还是上面提到的“分步裸AML”方案。虽然多了一步操作,但每一步都在你的掌控之中,不会出现“黑盒”报错。
## 我们的实践验证
我们已经在 `D:\openclaw\bossagents\import_car_plan_final.mjs` 脚本中完整实现了这套流程。实测结果:exit 0,一次成功落库10个对象——1个WBS Element、1个Project、1个Part、5个Activity2任务、2个Activity2里程碑。整个过程干净利落,没有一条冗余错误。
## 当你的系统需要“左帮右臂”
SCSAI是一个强大的平台,但它的“严谨”有时会变成“门槛”。当你面对复杂的集成需求,或者被这些隐晦的约束搞得焦头烂额时,你需要的不只是一份文档,而是一个真正懂业务、懂系统、能帮你“踩完所有坑”的伙伴。
**BossAgents(左帮右臂)** 正是这样的角色。我们专注于企业级系统的智能体集成,从SCSAI的深度定制,到跨系统的流程自动化,我们不做“黑盒”交付,而是把每一个规则、每一个约束都拆解成你可以理解的逻辑。我们帮你把那些“本该自动却无法自动”的环节,变成真正可执行的代码。
下次当你再遇到“WBS_ID is null”的报错时,别再独自对着屏幕发呆了。左帮右臂,帮你把复杂留给自己,把简单还给业务。
BossAgents