> **先读** [`shb-warehouse-bom-mutation-common.md`](shb-warehouse-bom-mutation-common.md)（本域全部变更安全规则的唯一出处，含 `--yes` 强制、摘空组件级联删除、提交前复述影响面）。

# shb-cli warehouse bom delete / revert（删除BOM、摘除组成物料、撤销删除）

覆盖 `bom delete`（删除 BOM）、`bom delete materials`（摘除组成物料）、`bom revert`（撤销删除）。三个命令语义互相关联：`delete` 只删 BOM 头、组件关系保留——这样 `revert` 才能区分"整个 BOM 被删"和"只是摘掉了某些组件"。

## 删除 BOM（`bom delete`）

```bash
shb-cli warehouse bom delete --ids <bomId1>,<bomId2> --yes

# 预览而不真正发起
shb-cli warehouse bom delete --ids <bomId1> --dry-run
```

- **必须传 `--yes`**（或 `--dry-run`），否则拒绝执行（原因见 mutation-common 安全规则第 1 条）。
- 是软删除，无库存/引用类阻塞前置条件（比物料删除更宽松），但会级联清理关联的 OSS 附件（爆炸图，不可恢复）。
- 删除的是 BOM 头，组成物料关系数据保留不动。
- 可通过 `bom revert --id <bomId>` 撤销（见下）。

## 摘除组成物料（`bom delete materials`）

从某个 BOM 里摘掉指定的组件物料（不删除整个 BOM）：

```bash
shb-cli warehouse bom delete materials --bom-id <bomId> --material-ids <物料id1>,<物料id2> --yes
```

- `--bom-id`（BOM 的 id）和 `--material-ids`（要摘除的组件**物料**id，不是组件关联行 id）都必填，且必须传 `--yes`。
- **如果 `--material-ids` 覆盖了这个 BOM 当前的全部组件，后端会自动级联把整个 BOM 头也软删除**——命令执行前会检测这种情况并在提示里明确告知，不会静默发生（见 mutation-common 安全规则第 4 条）。

## 撤销删除（`bom revert`）

```bash
shb-cli warehouse bom revert --id <bomId>

# 关联到某次具体的删除审计记录（可选，一般不需要）
shb-cli warehouse bom revert --id <bomId> --record-id <recordId>
```

- 只是把 `deleted` 标记翻回 `false`，**不是按历史版本还原数据**——如果 BOM 被删除后又发生了别的改动（不太可能，因为删除后通常不会再操作已删除的记录），revert 也只是恢复"未删除"状态，不会撤销其它字段变更。
- 无需 `--yes`（撤销删除本身风险低，操作错了可以再删一次纠正）。

## 典型组合场景

### 批量删除一批已禁用的 BOM

```bash
# 1. 先搜到目标 BOM，拿到 id 列表（搜索用法见 shb-warehouse-bom-search.md）
shb-cli warehouse bom search --enabled disabled --format-data --fields sn,id,materialName

# 2. 确认后删除
shb-cli warehouse bom delete --ids <id1>,<id2> --yes
```
