参数:调用方该填什么

第 2 课 · 共 7 课 约 8 分钟

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

本课目标

读完这一课,你将能够

  • 为一个 Action 选对参数类型,并用限制把错误值挡在入口
  • 区分必填、可选与规则里写死的值($now、$user、$uuid)
  • 说出对象参数与对象集参数各在什么时候用

参数是什么,有哪些类型

上一节写的 confirm-order 只有一个订单参数。这一节专讲参数:它是 Action 与外面所有调用方(表单、工作流步骤、智能体)之间的接口。规则和提交条件都靠参数名取值,参数设计得好不好,直接决定 Action 好不好用。同一个 Action 的调用方各不相同:表单前的人、工作流的一步、智能体,它们传的是同一组参数,过的是同一套校验。

BASE TYPES

基础类型

string、integer、decimal、boolean、date、timestamp 等,与属性的基础类型一致。

OBJECT

对象

引用一个已存在的对象,值是它的主键,例如 SO-1001。平台会检查对象存在、类型对,并且当前用户看得见。

OBJECT SET

对象集

一组同类对象,值是对象集的引用或定义,用于「对这一批一起操作」。

ARRAY

列表

同类值的列表,元素可以是基础类型,也可以是对象。

有一条数字要记住:一个 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。

小测

选一个答案,马上看解析。

Q1调用方要指定一条产线,release-work-order 该怎么设参数?

Q2scrapQty 是可选参数,这一班没有传,会怎样?

Q3要把执行人记进采购订单的 ownerId,怎么做最稳妥?

延伸阅读