> **前置条件** — 执行以下任何命令前，请先确认已完成认证。如未认证，参见 [`../../shb-shared/SKILL.md`](../../shb-shared/SKILL.md)。

# PaaS 编辑(改)

**已有**数据的编辑。**编辑 = 更新 = 修改 = 保存,都是同一种操作**(底层同一个保存接口),用户无论说"改一下""更新""编辑""保存",都走本文档。本 skill 的增删改查分工:

| 操作 | 权威文档 |
|------|---------|
| 查(列表/筛选/计数) | [`shb-paas-search.md`](shb-paas-search.md) |
| 查(单条详情) | [`shb-paas-detail.md`](shb-paas-detail.md) |
| 增(建表单/字段/记录/发起流程) | [`shb-paas-create.md`](shb-paas-create.md) |
| **改(本文档)** | 按下表颗粒度分层 |
| 删(记录/表单/流程版本) | [`shb-paas-delete.md`](shb-paas-delete.md) |

## 编辑颗粒度速查(先选对层)

| 要改什么 | 命令 | 说明 |
|---------|------|------|
| 某条记录的字段值(编辑/更新) | `form save` | 见「记录字段值编辑」 |
| 某条记录子表里的某一行 | `form save`(子表结构) | 见「子表行编辑」 |
| 表单的字段定义(加字段/改定义) | `template add-fields` / `save-fields` | 见 [`shb-paas-fields.md`](shb-paas-fields.md)「字段定义写操作」 |
| 删除任何东西(记录/表单/版本) | — | 见 [`shb-paas-delete.md`](shb-paas-delete.md) |
| 流程图 / 流程版本 | `flow deploy` / `redeploy` / `version edit` | 见 [`shb-paas-flow.md`](shb-paas-flow.md) |

编辑前置(两个 id 一个 key,都不要臆造):

1. **改哪条记录** → `content-biz-id` 来自 `paas form search` 结果(见 search 文档)。
2. **改哪个字段** → 字段 key(`fieldName`,形如 `field_xxx`)与类型来自 `paas template fields --template-biz-id <id>`,按 `displayName` 把用户说的中文字段名映射成真实 key。
3. **改成什么值** → 先 `paas form get`(见 detail 文档)读当前值核对,复杂控件(select/user/address/logistics 等)按页面保存格式传 JSON 字符串,格式参照 create 文档。

## 记录字段值编辑(`form save`)

⚠️ 写操作:先 `--dry-run` 预演,确认无误再 `--confirm-write`;真实写入前核对 `shb-cli config` 的租户和用户。

```bash
shb-cli paas form save --data '{
  "contentBizId": "<content-biz-id>",
  "templateUUId": "<template-biz-id>",
  "isStore": 0,
  "isEdit": true,
  "type": 0,
  "flowStart": false,
  "formValueList": [
    {"fieldName": "<field_xxx>", "value": "<新值>", "isSubForm": 0}
  ],
  "deletefiles": []
}' --dry-run
```

- 后端接口是 `editWfFormContent`,与 `form create` 同接口(`create` 是新建语义别名),保存语义与 PC 端表单保存一致。
- `formValueList` 放要修改的字段;拿不准是否会影响未提交的字段时,先 `form get` 对照当前值,`--dry-run` 比对后再真实提交。
- 要删除记录上已有的附件,把附件标识放进 `deletefiles`。

## 子表行编辑

子表字段在 `formValueList` 里用 `isSubForm: 1` + `subFormContentFormList` 描述,**行级颗粒**由 `subFormContentBizId` 区分:

```json
{
  "fieldName": "<子表字段key>",
  "isSubForm": 1,
  "subFormContentFormList": [
    {
      "subFormContentBizId": "<已有行的id>",
      "subFormValueFormList": [
        {"fieldName": "<子表内字段key>", "value": "<新值>"}
      ]
    }
  ]
}
```

- **编辑已有行**:必须带该行的 `subFormContentBizId`(从 `form get` raw JSON 的 `subFormContentVOList` 里取)。
- **新增一行**:不传 `subFormContentBizId`(与 create 文档口径一致)。
- 改完后用 `form get` 的 raw JSON 核对 `subFormContentVOList` 是否真正落库(见 detail 文档)。

## 表单字段定义编辑(改的是结构,不是数据)

改**表单字段定义本身**(加字段 `template add-fields` / 全量替换 `template save-fields`)属于结构层写操作,与"改某条记录的数据值"是两回事,**统一见 [`shb-paas-fields.md`](shb-paas-fields.md)「字段定义写操作」**,本文档不重复。删字段(靠 `save-fields` 全量替换遗漏)见 [`shb-paas-delete.md`](shb-paas-delete.md)。

## 注意

- 所有编辑都属于写操作,执行前必须确认用户明确要求(见 SKILL.md 权限/安全表)。
- payload 用 `--data '<json>'` 内联优先;`--file` 仅本地已有现成 JSON 文件时用。
- 流程中记录的字段可编辑范围受当前节点权限约束,先 `template node-fields --content-biz-id <id>` 看当前节点哪些字段可写——`revisable==1` 才可填/可改,`revisable==0` 或 `null` 不要写进 `formValueList`(判定口径见 [`shb-paas-fields.md`](shb-paas-fields.md)「当前节点可填写字段」)。
