参数:调用方该填什么
参数类型、限制、必填与可选,哪些值不该让人填;通用做法里有、AIDC 还没有的默认值与下拉过滤。

本课目标
读完这一课,你将能够
- 为一个 Action 选对参数类型,并用限制把错误值挡在入口
- 区分必填、可选与规则里写死的值(
$now、$user、$uuid) - 说出对象参数与对象集参数各在什么时候用
参数是什么,有哪些类型
上一节写的 confirm-order 只有一个订单参数。这一节专讲参数:它是 Action 与外面所有调用方(表单、工作流步骤、智能体)之间的接口。规则和提交条件都靠参数名取值,参数设计得好不好,直接决定 Action 好不好用。同一个 Action 的调用方各不相同:表单前的人、工作流的一步、智能体,它们传的是同一组参数,过的是同一套校验。
基础类型
string、integer、decimal、boolean、date、timestamp 等,与属性的基础类型一致。
对象
引用一个已存在的对象,值是它的主键,例如 SO-1001。平台会检查对象存在、类型对,并且当前用户看得见。
对象集
一组同类对象,值是对象集的引用或定义,用于「对这一批一起操作」。
列表
同类值的列表,元素可以是基础类型,也可以是对象。
有一条数字要记住:一个 Action 一次最多改 10,000 个对象。对象集或对象列表命中的对象超过 10,000 个,整个请求会被拒绝,而不是只处理前面一部分。
用限制把错误挡在入口
限制直接写在参数上:数值用 min、max,文本用 maxLength,对象要写 objectType。要复用「取值只能是这几个」之类的规则,就引用值类型(valueType),它的约束(enum、range、length、regex 等)在写入时用同一套校验。校验结果逐个参数返回,--validate-only 能看出是哪一个不合格。
下面是示例工厂的 release-work-order:把一张计划中的工单下达到一条产线。提交条件留到第 4 节。
{
"kind": "actionType",
"apiName": "release-work-order",
"title": "下达工单",
"schema": {
"parameters": [
{ "name": "workOrder", "type": "object", "objectType": "workOrder", "title": "工单", "required": true },
{ "name": "line", "type": "object", "objectType": "productionLine", "title": "产线", "required": true },
{ "name": "startAt", "type": "timestamp", "title": "计划开工时间", "required": true }
],
"rules": [
{
"type": "modifyObject",
"objectType": "workOrder",
"object": "$workOrder",
"values": { "status": "released", "lineCode": "$line.lineCode", "startAt": "$startAt" }
}
],
"actionLog": true
}
}
注意 line 是对象参数,规则用 $line.lineCode 取它的属性。调用方从产线里选一条,而不是手敲编码。
lineCode(string):调用方手敲「L1」「l-1」「Line 1」,同一条产线三种写法,还可能敲出一条不存在的线。
line(object,productionLine):从产线里选一条,规则取它的 lineCode,永远是库里真有的那一条。
值类型让一条约束只写一次:severity 的取值由 defectSeverity 约束,登记缺陷的 Action、缺陷对象的属性,以及以后别的用到它的地方,用的是同一份约束。
必填、可选,与不该让人填的值
required: true 的参数缺了就是不合格,返回里会指名是哪一个。可选参数没传时,规则不会去动对应的属性。report-output 就靠这一点:这一班没有报废,就不传 scrapQty,属性保持原值,不会被写成 0。
[
{ "name": "workOrder", "type": "object", "objectType": "workOrder", "title": "工单", "required": true },
{ "name": "goodQty", "type": "integer", "title": "累计合格数", "required": true, "min": 0 },
{ "name": "scrapQty", "type": "integer", "title": "累计报废数", "min": 0 }
]
上面是 report-output 的 parameters 数组,它的规则是一条 modifyObject:把 goodQty、scrapQty 写进工单,并把 status 写成 running。有些值根本不该由调用方填:执行人、当前时间、新对象的主键。这些直接在规则里写 $user、$userName、$now、$uuid:调用方改不了,也不会出现在表单上。create-purchase-order 就这样处理:poNo 用 $uuid,起草人 ownerId 用 $user。
通用做法里有、AIDC 里还没有的
| 通用做法里的参数能力 | 在 AIDC 里今天 | |
|---|---|---|
| 默认值 | 在参数上配固定值或对象属性的现值,所有界面共用 | 参数上目前还没有默认值;从对象视图点 Action 时,那个对象已经替你填好;执行人、时间、新主键写在规则里 |
| 下拉过滤 | 给对象下拉加过滤和沿关系取值。过滤里写死的值,对所有能看到这个 Action 的人可见,应改用参数或对象属性做过滤 | 目前还没有;对象参数只能指向当前用户看得见的对象类型,「不该选的」用提交条件兜底 |
| 按条件覆盖 | 按条件改一个参数的必填、可见和默认值 | 目前还没有;不同用法拆成不同的 Action |
| 参数之间的依赖 | 默认值与下拉选项逐级计算,会拖慢表单,依赖链越平越好 | 没有默认值与过滤,也就没有这条依赖链 |
要点
- 参数是 Action 与所有调用方之间的接口,类型有基础类型、对象、对象集和列表。
- 限制写在参数上,界面、命令行和智能体都会被同一道关拦住。
- 能选的不要让人手敲:对象参数比字符串参数可靠。
- 执行人、时间、新主键在规则里写
$user、$now、$uuid,不做成参数。 - 一次最多改 10,000 个对象;默认值、下拉过滤、覆盖目前还没有。
练一练
为收料与采购设计参数
用示例工厂的采购流程练习:先想清楚谁填什么,再动手写。
receive-material 要收:一张采购订单、一种物料、实际收到的数量。写出这些参数的 name、type 和限制,其中数量至少为 1。
create-purchase-order 要写入 poNo、status、qty、expectedAt、supplierId、materialCode、ownerId、createdAt。哪些做成参数,哪些在规则里写死?逐个写出理由。
对任何一个带数值限制的 Action,运行 aidc semantic apply 加它的名字,用 --params 传一个超出 max 的值,再加上 --validate-only。读返回里逐个参数的结果。
小测
选一个答案,马上看解析。
Q1调用方要指定一条产线,release-work-order 该怎么设参数?
对象参数由平台检查对象存在、类型对、看得见;手敲的字符串可能拼错,也可能指向不存在的产线。
Q2scrapQty 是可选参数,这一班没有传,会怎样?
没传的可选参数在规则里取不到值,对应的属性就不会被改。要写成 0,得明确传 0。
Q3要把执行人记进采购订单的 ownerId,怎么做最稳妥?
参数由调用方决定,谁都可以填别人的名字。$user 来自登录凭证,改不了。提交条件只判断,不写值。