en un clic
create-action
为 Uniplat 模型新增 Action(业务操作),修改 JSON 配置 + Groovy 钩子方法
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
为 Uniplat 模型新增 Action(业务操作),修改 JSON 配置 + Groovy 钩子方法
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
读取并分析 PRD 需求文档,提取要点和任务拆分。在 dev-flow 流程的第 1 步自动加载。
Uniplat 低代码平台编码规范速查。在 Uniplat 项目中进行任何开发任务时参考。
编码实现方法论:垂直切片 + TDD 核心循环。在 dev-flow 流程的第 5 步自动加载。
生成开发总结文档,记录交付物、依赖、设计要点。在 dev-flow 流程的第 8 步自动加载。
编码实现方法论:垂直切片,逐步推进。
在指定子项目目录下创建 Uniplat 数据模型脚手架(JSON 元数据 + Groovy 钩子文件)
| name | create-action |
| description | 为 Uniplat 模型新增 Action(业务操作),修改 JSON 配置 + Groovy 钩子方法 |
| version | 1.0.3 |
本 skill 用于为已有模型添加新的 Action(业务操作,如"审批"、"提交"、"导出"等)。
$ARGUMENTS 应包含:
approve、submit_reviewcustom(默认)、insert、update、delete示例:
path/to/model.json approve → 添加审批 Actionpath/to/model.json batch_export custom → 添加批量导出| behavior 值 | 含义 | 是否需要 Groovy 方法 |
|---|---|---|
"insert" | 平台内置插入 | 不需要 |
"update" | 平台内置更新 | 不需要 |
"delete" | 平台内置删除 | 不需要 |
"myCustomMethod" | 自定义方法名 | 需要,在 Groovy 中定义对应方法 |
"" | 空,无行为 | 不需要(纯跳转/弹窗类) |
只有自定义 behavior 才需要在 Groovy 中写方法。 使用平台内置的 insert/update 不需要。
action 上两个条件表达式含义不同:
| 字段 | 含义 | 不满足时 |
|---|---|---|
when | 是否显示 | 隐藏 |
enable(=enabled) | 是否启用/可点击 | 置灰仍显示,不执行该逻辑 |
enable 与 enabled 同义(action_defs[] 多写 enable,list 引用/intent 写 enabled),可与 when 并列。
空值铁律:when/enable 引用 object 时先 object != null &&——on:"list"/on:"none" 等场景 object 为 null,直接点属性会 NPE:
// ✅ 先守卫 object 非空
{"when": "object != null && object.getValue('status') == 0"}
{"enable": "object != null && object.getValue('status') == 0"}
{"when": "object != null && (object.Status.value==2 || object.Status.value==3)"}
// 关联/joint 字段用 object.get('本地键#joint名.字段').value
{"when": "object != null && object.get('id#order_joint.OrderId').value != ''"}
// 常量无需守卫
{"when": "1"}
// ❌ object 可能为空时直接点属性 → NPE
{"when": "object.status.value == 0"}
取值:object.getValue('字段')(推荐,无字段返回 null)或 object.字段.value(可空字段加 ?.)。
| 字段 | 取值 | 说明 |
|---|---|---|
on | object | list | none | each | action 作用域:单条行 / 整个列表 / 无数据(全局) / 逐条 |
tx | true | false | 是否由容器自动管理事务 |
{"name": "batch_close", "on": "list", "when": "1", "behavior": "batch_close", "tx": true}
{"name": "approve", "on": "object", "when": "object != null && object.getValue('status')==0", "behavior": "approve_behavior"}
on:"object"的行操作,其when/enable必须做object != null守卫。
用 Glob 查找用户指定的模型文件。如果找不到,提示用户先使用 /uniplat:create-model 创建模型。
用 AskUserQuestion 询问:
Action 名:approve
Action 标签:审批
容器类型:dialog(弹窗)/ none(直接执行)
是否需要自定义 behavior:是/否
- 否 → 使用平台内置 behavior(insert/update)
- 是 → 指定自定义方法名
表单参数:...
when 条件:(默认 "1",或表达式)
{
"name": "publish",
"when": "object != null && object.getValue('status') == 0",
"label": "发布",
"container": "none",
"parameters": {
"server": [
{"property": "status", "result": "1"},
{"property": "publish_time", "result": "env.now.value"},
{"property": "updated_by", "result": "env.user_id.value"}
],
"inputs": []
},
"behavior": "update",
"forward": "refresh",
"prompt": "确认发布?"
}
这种情况下,Groovy 不需要写方法。
{
"name": "approve",
"when": "object != null && object.getValue('status') == 0",
"label": "审批",
"container": "dialog",
"parameters": {
"server": [
{"property": "approved_by", "result": "env.user_id.value"},
{"property": "approved_time", "result": "env.now.value"}
],
"inputs": [
{
"property": "approve_status",
"label": "审批结果",
"type": "mapping",
"mapping": "approve_status_mapping",
"required": true,
"span": 24
},
{
"property": "comment",
"label": "审批意见",
"type": "text",
"span": 24
}
]
},
"validator": "approve_validator",
"behavior": "approve_behavior",
"forward": "refresh",
"prompt": ""
}
这种情况下,需要在 Groovy 中写 approve_behavior 和 approve_validator 方法。
// ====== 审批校验 ======
def approve_validator(ActionValidatorContext ctx) {
def obj = ctx.dataList.fetchOne()
def inputs = ctx.inputs
AssertUtils.isTrue(inputs.approve_status.value, "请选择审批结果")
AssertUtils.isFalse(obj.getBoolean("is_del"), "已删除的数据不能审批")
def currentStatus = obj.status.value as int
AssertUtils.isTrue(currentStatus == 0, "只有待审批状态才能审批")
}
// ====== 审批行为 ======
def approve_behavior(ActionBehaviorContext ctx) {
def obj = ctx.dataList.fetchOne()
def inputs = ctx.inputs
def host = ctx.host
def now = host.getTimestamp()
def operator = host.getUser().id as long
def status = inputs.approve_status.value as int
def comment = inputs.comment.value ?: ""
obj.update([
status : status,
approve_comment: comment,
approved_by : operator,
approved_time : now,
updated_by : operator,
updated_time : now
])
return [result: 0, id: obj.getKeyValue(), msg: "审批成功"]
}
在 JSON 的 list.row_actions 或 list.actions 数组中添加新 Action 名:
"list": {
"row_actions": ["update", "delete", "approve"],
"actions": ["insert", "publish"]
}
完成后展示:
Action 已添加:
名称:approve (审批)
显示条件:object != null && object.getValue('status') == 0
behavior:approve_behavior(自定义方法)
已在 Groovy 中添加:
- approve_validator:校验方法
- approve_behavior:行为方法
已添加到:list.row_actions
{
"name": "publish",
"when": "object != null && object.getValue('status') == 0",
"label": "发布",
"container": "none",
"parameters": {
"server": [
{"property": "status", "result": "1"},
{"property": "publish_time", "result": "env.now.value"}
],
"inputs": []
},
"behavior": "update",
"forward": "refresh",
"prompt": "确认发布?"
}
不需要 Groovy 方法。
{
"name": "delete",
"when": "object != null && object.getValue('is_del') == 0",
"label": "删除",
"container": "none",
"parameters": {
"server": [
{"property": "is_del", "result": "1"},
{"property": "updated_by", "result": "env.user_id.value"},
{"property": "updated_time", "result": "env.now.value"}
],
"inputs": []
},
"behavior": "update",
"forward": "refresh",
"prompt": "确认删除?"
}
不需要 Groovy 方法。
{
"name": "approve",
"when": "object != null && object.getValue('status') == 0",
"label": "审批",
"container": "dialog",
"parameters": {
"server": [
{"property": "approved_by", "result": "env.user_id.value"},
{"property": "approved_time", "result": "env.now.value"}
],
"inputs": [
{"property": "approve_status", "label": "结果", "type": "mapping", "mapping": "approve_status_mapping", "required": true},
{"property": "comment", "label": "意见", "type": "text"}
]
},
"validator": "approve_validator",
"behavior": "approve_behavior",
"forward": "refresh"
}
需要 Groovy 方法:approve_validator + approve_behavior
{
"name": "setDefault",
"when": "object != null && object.getValue('is_default') != 1",
"on": "object",
"label": "设为默认",
"container": "dialog",
"parameters": {
"server": [
{"property": "updated_by", "result": "env.user_id.value"},
{"property": "updated_time", "result": "env.now.value"}
],
"inputs": [
{"property": "is_default", "label": "设置默认", "type": "hidden", "default_value": "1"}
]
},
"behavior": "setDefault",
"forward": "refresh"
}
需要 Groovy 方法:setDefault(需要取消其他默认项的复杂逻辑)
{
"name": "view_detail",
"when": "1",
"label": "查看详情",
"container": "",
"parameters": {"server": [], "inputs": []},
"forward": "/path/to/detail/{{object.id.value}}",
"open_in_new_tab": true
}
不需要 Groovy 方法。
{
"name": "submit_audit",
"when": "object != null && object.getValue('status') == 0 && object.getValue('audit_status') != 2",
"label": "提交审核",
"container": "none",
"parameters": {
"server": [
{"property": "audit_status", "result": "1"},
{"property": "submit_time", "result": "env.now.value"}
],
"inputs": []
},
"behavior": "update",
"forward": "refresh",
"prompt": "确认提交审核?"
}
when(显示)/enable(启用)引用 object 时先 object != null &&:特别是 on:"object" 行操作&& 或 ||:先 object != null 再判各字段is_del=1 + behavior: "update" 实现