# 保存报文骨架 · 页签↔字段对照

一次保存 = 一个大 JSON，每个页签对应一个字段。**未配置的页签也要按空值占位一起提交**。
`<<...>>` = 从「定位结果 / getDeliverDetail 详情」自动回填；其余保持空占位，某页签要配置时按 `tabs/` 对应文件填。

```json
{
  "deliverId":       "<<deliverId>>",
  "projectId":       "<<projectId>>",
  "jiraCode":        "<<回显>>",
  "projectName":     "<<回显>>",
  "projectCode":     "<<回显>>",
  "onlineTime":      "<<时间戳>>",
  "serverInfo":      { "serverId": "<<serverId>>", "serverName": "<<SERVER_NAME>>" },
  "serverId":        "<<serverId>>",
  "serverName":      "<<SERVER_NAME>>",
  "optimistic":      "<<当前乐观锁>>",
  "configtypes":     "<<回显>>",
  "configtypeNames": "<<回显>>",
  "version":         "<<回显>>",

  "nacos": [],
  "sqlFile": [],
  "mq": [],
  "cronJobs": [],
  "innerGateway": [], "outGateway": [], "midGateway": [], "outFileGateway": [],
  "firewall": [], "errorCenter": [], "resourceImport": [], "message": [], "file": [],
  "webpermission": {}, "midpermission": {}, "managerpermission": {},
  "dataware": { "content": null, "files": [] },
  "nginx": { "protocolGroup": "", "serverId": null, "confId": null, "nginxServerId": null, "upstream": [], "location": [] },
  "contentConfig": {}, "business": {}, "others": {}, "onlinevalid": {}, "outserver": {}
}
```

**说明**
- `serverInfo` 与顶层 `serverId/serverName` 要一致（两处都传）。
- `configtypes` / `configtypeNames`：**后端会按报文内容重算**（已实测：传 `configtypes=nacos` 但报文里加了 `sqlFile`，保存后变成 `nacos,sqlFile`）。所以回显即可、**无需手动维护**，加了哪个页签后端自己会补进去。
- `upgrade`（数据升级）：**骨架里不放它**。规则是「有现值才带、空则不带」——若交付单已有 `upgrade` 现值，保存时**必须原样带上**，否则会被清空；没有就不要传空对象。（`run.py` 已按此处理。）
- 组装时先用服务器现值回填**每个字段**（含不在覆盖范围的页签，保持原样不动），再把「本次要配的 8 个页签」按下条**合并**进去。
- **合并语义（默认）**：本次内容与交付单现值**合并**，不是整体替换——nacos 按 `dataId`+`key` 去重、mq 按 `topic`、cronJobs 按 `jobHandler`、网关按 `type`（一个网关类型一份文件、同 type 换新文件）、sqlFile 追加去重。**只有整批重配**某页签时才整体替换，并提示用户。
- **完整报文必须带上所有字段**（未配置的页签用现值/空占位），否则可能清空其它页签或保存失败——所以骨架里的其余字段**保留但不由本 skill 填写**。

**本 skill 覆盖的 9 个页签 ↔ 字段名对照**

| 页签 | 字段 | 形态 | 默认 |
|---|---|---|---|
| nacos 配置文件 | `nacos` | 数组 | 命中 diff 就配 |
| SQL | `sqlFile` | 数组 | 命中 diff 就配 |
| rocketmq | `mq` | 数组 | 命中 diff 就配 |
| 定时任务 | `cronJobs` | 数组 | 命中 diff 就配 |
| 防火墙 | `firewall` | 数组 | 命中触发判据就配 |
| 内网网关 | `innerGateway` | 数组 | **默认不配**，用户要求才配 |
| 外网网关 | `outGateway` | 数组 | **默认不配**，用户要求才配 |
| 中台网关 | `midGateway` | 数组 | **默认不配**，用户要求才配 |
| 文件流网关 | `outFileGateway` | 数组 | **默认不配**，用户要求才配 |

> 其余字段（`nginx`/`errorCenter`/`file`/`upgrade`/`dataware`/`webpermission`/`midpermission`/`managerpermission`/`message`/`contentConfig`/`resourceImport`/`business`/`others`/`onlinevalid`/`outserver`）**不在覆盖范围**：报文里保留、值取交付单现值，不改动。
