表单规则
面向不使用平台自身前端的外部项目提供的规则执行接口。
调用方无需实现前端 $cx 运行时、无需执行后端生成的 JS,只需按平台外部 API 规范认证后,
提交表单 code、触发事件与表单数据,平台在服务端完整执行匹配的规则并返回执行效果。
1. 接口清单
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | api/FrontEnd/RuleEngine/ExecuteRule | 服务端完整执行表单规则(核心) |
| GET | api/FrontEnd/RuleEngine/GetRules/{formCode} | 获取表单启用的规则元数据(调试/展示用) |
2. 认证(遵循平台外部 API 接口规则)
- 请求头必须携带:
Authorization: Bearer {登录令牌}、TnCode: {租户编码} - 非本机、非 IP 白名单环境调用时,另需携带:
UserId: {用户 ObjectID}Timestamp: {13 位毫秒时间戳}Datatoken: {按平台数据令牌规则生成},公式:- GET:
urlHash = SM3(pathAndQuery),Datatoken = SM3(timestamp + "zhouju@2025" + userId + urlHash) - POST:
Datatoken = SM3(timestamp + "zhouju@2025" + userId + SM3(请求体))
- GET:
- 每个 Datatoken 只能使用一次
- 建议把外部前端/网关的出口 IP 加入平台 IP 白名单,则仅需
Authorization+TnCode
3. POST api/FrontEnd/RuleEngine/ExecuteRule
请求体
{
"formCode": "表单code(必填)",
"subFormCode": "", // 子表code;不填只执行主表规则
"trigger": "formLoaded", // 触发事件:formLoaded/buttonBefore/buttonAfter/fieldWatch/listLoaded;不填执行该表单全部规则
"buttonTitle": "", // trigger 为 buttonBefore/After 时,用于匹配规则触发点(按钮标题)
"fieldCode": "", // trigger 为 fieldWatch 时,用于匹配规则触发点(字段code)
"dataId": "", // 业务数据id(可选)
"formData": { "f_xxx": "值" }, // 表单数据(字段code -> 值)
"variables": {}, // 初始临时变量(可选)
"listData": {} // 列表数据(列表规则使用,如选中行)
}
响应体
{
"Success": true,
"Result": {
"ruleResults": [
{
"ruleId": "规则id",
"ruleName": "规则名称",
"success": true,
"error": null,
"execution": {
"variables": { "total": 20 }, // 执行后的临时变量(含节点结果回写)
"formDataUpdates": { "f_result": "值" }, // setFormValue 节点需要回写的字段
"messages": [ { "type": "success", "message": "文本" } ], // message 节点消息
"logs": [ { "tag": "标签", "content": "内容" } ], // log 节点日志
"disabledOptions": [ { "fieldCode": "f_x", "options": [] } ], // 复选/单选禁用选项
"stop": false, // true=触发了 stop 节点,后续操作应终止
"closeView": false, // true=触发了 closeFormView 节点
"warnings": [], // 服务端无法执行的节点警告(如自定义JS节点)
"executedNodeIds": [] // 实际执行过的节点id
}
}
]
},
"Message": null
}
执行语义(与平台前端执行保持一致)
- 按
formCode加载规则,过滤:启用状态、category != list、触发点匹配(subFormCode + trigger + buttonTitle/fieldCode) - 支持节点:assigns(表单值/函数值/数据表/系统表)、ifElse、ifElseMultiple、loop、traverse(含 exitLoop/skipLoop)、 setFormValue、message、log、stop、closeFormView、checkBoxDisable/radioBoxDisable、apiCall、executeSql、 connectorApi、formAdd/formEdit/formDelete、getListValue/insertToList/listAggreText/textSplitList/appendNewTextNode
- 不支持服务端执行:customNode(JS 脚本节点,跳过并记入 warnings)
- 表达式支持
$temp['x']、$form['f_xxx']、$form['子表code']['字段']、$list['x']、$method.xxx(...)(contains/sum/count/max/min/concat/daysDiff 等常用函数,Java 侧实现) - 节点执行结果按
assignCfg[0]自动写入variables,并按声明类型(String/Number/Boolean/Object/Array)强转
4. 示例调用(curl)
curl -X POST 'https://<平台>/api/FrontEnd/RuleEngine/ExecuteRule' \
-H 'Authorization: Bearer <token>' \
-H 'TnCode: 00000000' \
-H 'Content-Type: application/json' \
-d '{
"formCode": "form_x",
"trigger": "formLoaded",
"formData": { "f_amount": "100" }
}'