# 定制履约与现有生产工序质检委外融合方案

## 1. 结论

定制化履约单元不建议直接并入现有生产、工序、质检、委外表。

推荐定位如下：

```text
custom_order_item        定制订单履约单元，负责订单级履约编排
custom_item_component    定制部件，负责部件来源和齐套状态
custom_item_process      定制履约节点，负责跨模块流程跟踪

production_receipt       现有生产工单，负责生产执行
production_receipt_process 现有生产工序，负责生产工序执行
process_receipt          现有报工单，负责工序完工反馈
qc_receipt/qc_receipt_detail 现有质检单，负责质检结果
entrust                  现有委外单，负责委外执行
purchase_order/detail    现有采购单，负责采购执行
repository_receipt/detail 现有出入库单，负责库存执行
```

核心原则：

- `custom_*` 作为“履约编排层”。
- 现有生产、工序、质检、委外、采购、库存模块作为“业务执行层”。
- 两层通过 `ref_module/ref_id` 和业务外键弱关联，不强制合表。
- 履约节点只记录本节点状态、计划、异常、快照和执行单据引用。
- 具体数量、质检、报工、入库、委外金额等仍由原系统单据承载。

## 2. 为什么不能直接合并

### 2.1 custom_item_process 的范围更大

`custom_item_process` 不只是生产工序，它还可能表示：

- 采购
- 库存备料
- 委外
- 自产加工
- 装配
- 质检
- 入库
- 发货
- 客户确认
- 异常处理
- 重做

现有 `production_receipt_process` 只适合表达生产工单内的工序执行。

### 2.2 现有生产工序依赖生产工单

`production_receipt_process` 依赖：

- `production_receipt_id`
- `technology_id`
- `process_id`
- `product_id`
- `plan_num`
- `finish_num`

它是“生产工单下的工序”，不是订单履约全流程节点。

如果把采购、交付、客户确认、异常处理都塞进生产工序，会导致语义混乱。

### 2.3 定制履约需要跨模块跟踪

一个定制眼镜履约单元可能同时包含：

- 镜架库存备料
- 左镜片采购
- 右镜片采购
- 装配生产
- 质检
- 出库交付

这些动作分布在多个模块，不适合只用生产工序表表达。

## 3. 推荐总体架构

```text
销售订单
sale_order
  └─ sale_order_detail
      └─ custom_order_item 履约单元
          ├─ custom_item_component 部件
          │   ├─ purchase_order_detail
          │   ├─ entrust
          │   ├─ production_receipt
          │   ├─ repository_freeze_log
          │   └─ repository_receipt_detail
          │
          └─ custom_item_process 履约节点
              ├─ process
              ├─ production_receipt_process
              ├─ process_receipt
              ├─ qc_receipt
              ├─ entrust
              ├─ purchase_order
              └─ repository_receipt
```

`custom_item_component` 解决“这个部件从哪里来”。

`custom_item_process` 解决“整个履约流程走到哪一步”。

现有业务单据解决“具体怎么执行、怎么入库、怎么报工、怎么质检”。

## 4. 与生产模块融合

### 4.1 适用场景

当某个定制部件或定制单元需要自产时，需要生成现有生产单据。

例如：

- 定制家具需要自产板件。
- 定制眼镜需要镜片加工。
- 定制设备需要组装。

### 4.2 推荐关联方式

`custom_item_component` 已有字段：

```text
production_receipt_id
```

`custom_item_process` 已有字段：

```text
ref_module
ref_id
```

推荐使用方式：

```text
custom_item_component.production_receipt_id = production_receipt.id

custom_item_process.ref_module = production_receipt
custom_item_process.ref_id = production_receipt.id
```

如果履约节点精确到生产工序：

```text
custom_item_process.ref_module = production_receipt_process
custom_item_process.ref_id = production_receipt_process.id
```

### 4.3 生产单生成规则

触发条件：

- `custom_item_component.source_type = 4` 自产
- 或 `custom_item_process.process_type = production`
- 或模板配置中该工序被标记为生产执行节点

生成逻辑：

1. 根据 `custom_order_item.product_id` 或 `custom_item_component.product_id` 找产品。
2. 根据产品匹配 `technology` 工艺路线。
3. 创建 `production_receipt`。
4. 由现有 `ProductionReceipt::generateProductionReceiptProcess()` 生成 `production_receipt_process`。
5. 回写关联：
   - `custom_item_component.production_receipt_id`
   - `custom_item_process.ref_module/ref_id`

### 4.4 状态同步

生产模块状态变化后同步履约状态：

| 现有生产状态 | 定制履约状态 |
| --- | --- |
| 生产工单创建 | `custom_item_process.status = 10` 进行中 |
| 工序部分报工 | 仍为 `10` 进行中 |
| 工序全部完成 | `custom_item_process.status = 20` 已完成 |
| 生产工单完成 | 部件 `custom_item_component.status = 50` 已完成 |
| 生产异常/返工/报废 | `custom_item_process.status = 80` 异常 |

## 5. 与系统工序融合

### 5.1 process 作为基础工序档案

现有 `process` 表可作为标准工序档案。

建议给定制流程模板增加可选引用：

```text
custom_process_template.process_id
custom_item_process.process_id
```

作用：

- 前端配置定制流程时，可以选择系统已有工序。
- 生成履约工序时，把 `process_id` 快照到 `custom_item_process`。
- 如果后续生成生产工单，可通过 `process_id` 找到标准工序。

### 5.2 不同工序类型处理

| custom_item_process.process_type | 是否适合绑定 process | 说明 |
| --- | --- | --- |
| `prepare` | 可选 | 备料可作为内部工序，也可只是履约节点 |
| `production` | 是 | 自产加工建议绑定 |
| `assemble` | 是 | 装配建议绑定 |
| `qc` | 可选 | 可绑定质检工序，也可直接生成质检单 |
| `purchase` | 否 | 应关联采购单 |
| `outsource` | 否 | 应关联委外单 |
| `stock_in` | 否 | 应关联入库单 |
| `ship` | 否 | 应关联发货/出库 |

## 6. 与报工模块融合

### 6.1 现有报工链路

现有报工由 `process_receipt` 表承载。

关键字段：

```text
production_receipt_id
production_receipt_process_id
plan_num
finish_num
good_num
rework_num
scrap_num
qc_status
```

### 6.2 推荐关联方式

当 `custom_item_process` 关联的是生产工序时：

```text
custom_item_process.ref_module = production_receipt_process
custom_item_process.ref_id = production_receipt_process.id
```

报工记录仍写入：

```text
process_receipt.production_receipt_process_id
```

不建议把报工数量直接写入 `custom_item_process`，避免和现有生产统计重复。

### 6.3 状态同步

报工新增后：

1. 现有 `ProcessReceipt::afterAddData()` 会调用 `ProductionReceiptProcess::processing()`。
2. `production_receipt_process.finish_num` 更新。
3. 定制履约可根据 `production_receipt_process.status` 同步 `custom_item_process.status`。
4. 如果报工中有返工或报废，写入 `custom_process_log`。

## 7. 与质检模块融合

### 7.1 现有质检链路

现有质检由：

```text
qc_receipt
qc_receipt_detail
```

承载。

质检来源包括：

- 工序质检：`process_receipt_id`
- 委外质检：`entrust_id`
- 产品：`product_id`

### 7.2 推荐关联方式

定制履约节点中：

```text
custom_item_process.process_type = qc
custom_item_process.ref_module = qc_receipt
custom_item_process.ref_id = qc_receipt.id
```

如需精确到质检明细：

```text
custom_item_process.ref_module = qc_receipt_detail
custom_item_process.ref_id = qc_receipt_detail.id
```

部件级质检也可以回写：

```text
custom_item_component.status = 50 已完成
custom_item_component.is_abnormal = 1/0
custom_item_component.abnormal_reason = 质检异常原因
```

### 7.3 质检结果映射

| 质检结果 | 定制履约处理 |
| --- | --- |
| 全部合格 | 工序 `status = 20`，部件/履约继续下一步 |
| 部分返工 | 工序 `status = 80`，生成重做或返工日志 |
| 报废 | 工序 `status = 80`，部件异常，必要时生成重做履约单元 |
| 免检 | 工序可直接完成 |

### 7.4 重做处理

如果质检导致重做：

1. 原 `custom_order_item.status = 80`。
2. 写入 `custom_process_log.event = remake`。
3. 新建一个 `custom_order_item`：
   - `is_remake = 1`
   - `remake_from_id = 原履约单元 ID`
4. 复制原参数快照 `params_snapshot`。
5. 根据重做范围生成新的部件和工序。

## 8. 与委外模块融合

### 8.1 适用场景

当部件或工序需要外部供应商完成时，走现有 `entrust`。

例如：

- 镜片外发加工。
- 家具喷涂外包。
- 设备某工序外协。

### 8.2 推荐关联方式

部件级委外：

```text
custom_item_component.source_type = 3
custom_item_component.entrust_id = entrust.id
```

工序级委外：

```text
custom_item_process.process_type = outsource
custom_item_process.ref_module = entrust
custom_item_process.ref_id = entrust.id
```

如果委外是某个生产工序的委外：

```text
entrust.production_receipt_process_id = production_receipt_process.id
custom_item_process.ref_module = entrust
custom_item_process.ref_id = entrust.id
```

### 8.3 委外状态同步

| 委外状态 | 定制履约状态 |
| --- | --- |
| 委外单创建 | 工序 `status = 10` 进行中 |
| 委外审核通过 | 部件/工序进行中 |
| 委外质检合格 | 工序 `status = 20` 已完成 |
| 委外入库完成 | 部件 `status = 50` 已完成 |
| 返工/报废 | 工序 `status = 80` 异常 |

## 9. 与采购模块融合

### 9.1 适用场景

当定制部件需要采购时，走现有采购单。

例如：

- 左镜片采购。
- 右镜片采购。
- 特殊配件采购。

### 9.2 推荐关联方式

```text
custom_item_component.source_type = 2
custom_item_component.purchase_order_id = purchase_order.id
custom_item_component.purchase_order_detail_id = purchase_order_detail.id
```

对应履约工序：

```text
custom_item_process.process_type = purchase
custom_item_process.ref_module = purchase_order
custom_item_process.ref_id = purchase_order.id
```

如果要精确到采购明细：

```text
custom_item_process.ref_module = purchase_order_detail
custom_item_process.ref_id = purchase_order_detail.id
```

### 9.3 采购状态同步

| 采购状态 | 定制部件/工序状态 |
| --- | --- |
| 采购单创建 | 部件 `status = 20` 采购中 |
| 采购到货/入库 | 部件 `status = 50` 已完成 |
| 部分到货 | 部件保持 `20`，记录日志 |
| 采购异常 | 部件 `status = 80` 异常 |

## 10. 与库存模块融合

### 10.1 库存备料

如果部件从库存取：

```text
custom_item_component.source_type = 1
custom_item_component.repository_freeze_log_id = repository_freeze_log.id
```

冻结成功：

```text
custom_item_component.status = 10 已备齐
```

出库完成：

```text
custom_item_component.repository_receipt_detail_id = repository_receipt_detail.id
custom_item_component.status = 50 已完成
```

### 10.2 入库

生产、采购、委外完成后，如果需要入库：

```text
custom_item_process.process_type = stock_in
custom_item_process.ref_module = repository_receipt
custom_item_process.ref_id = repository_receipt.id
```

入库审核通过后：

```text
custom_item_process.status = 20
custom_item_component.status = 50
```

## 11. 建议补充字段

当前 SQL 已有 `ref_module/ref_id` 和部分业务外键，可以支撑弱关联。

如果要更好融合现有工序，建议后续补充：

```sql
ALTER TABLE hg_custom_process_template
ADD COLUMN process_id int(11) unsigned DEFAULT NULL COMMENT '关联系统工序ID' AFTER process_type;

ALTER TABLE hg_custom_item_process
ADD COLUMN process_id int(11) unsigned DEFAULT NULL COMMENT '关联系统工序ID' AFTER process_template_id;

ALTER TABLE hg_custom_item_process
ADD COLUMN ref_detail_id int(11) unsigned DEFAULT NULL COMMENT '关联明细ID，如质检明细/采购明细/入库明细' AFTER ref_id;
```

说明：

- `process_id` 用于对接系统标准工序。
- `ref_module/ref_id` 关联主单据。
- `ref_detail_id` 可关联明细级记录。

如果不想加 `ref_detail_id`，也可以继续通过 `ref_module = qc_receipt_detail / purchase_order_detail / repository_receipt_detail` 直接指向明细。

## 12. 推荐业务流程

### 12.1 下单后生成履约

```text
sale_order 审核/确认
  -> 根据 sale_order_detail 生成 custom_order_item
  -> 根据 custom_flow_template 生成 custom_item_component
  -> 根据 custom_process_template 生成 custom_item_process
```

### 12.2 部件齐套

```text
custom_item_component
  source_type = 库存 -> 冻结库存/出库
  source_type = 采购 -> 采购单
  source_type = 委外 -> 委外单
  source_type = 自产 -> 生产工单
```

### 12.3 工序执行

```text
custom_item_process
  purchase   -> purchase_order/detail
  outsource  -> entrust
  production -> production_receipt/process
  assemble   -> production_receipt_process 或 process_receipt
  qc         -> qc_receipt/detail
  stock_in   -> repository_receipt/detail
  ship       -> delivery/repository_receipt
```

### 12.4 状态回写

现有业务单据变更后统一回写：

```text
业务单据状态
  -> custom_item_process.status
  -> custom_item_component.status
  -> custom_order_item.status
  -> custom_process_log
```

## 13. 状态聚合规则

### 13.1 履约单元状态

`custom_order_item.status` 建议由部件和工序聚合得出：

| 条件 | 履约单元状态 |
| --- | --- |
| 任一部件/工序异常 | `80` 异常 |
| 全部工序完成且已交付 | `50` 已交付 |
| 全部工序完成未交付 | `40` 已完成 |
| 存在质检中工序 | `30` 质检中 |
| 存在生产/装配/采购/委外进行中 | `20` 生产加工中 |
| 已生成履约但未启动 | `10` 准备中 |
| 未生成执行计划 | `0` 待处理 |

### 13.2 部件状态

`custom_item_component.status` 由对应来源单据决定：

| 来源 | 完成依据 |
| --- | --- |
| 库存 | 冻结/出库完成 |
| 采购 | 采购入库完成 |
| 委外 | 委外质检/入库完成 |
| 自产 | 生产完成/入库完成 |

### 13.3 工序状态

`custom_item_process.status` 由 `ref_module/ref_id` 指向的单据决定：

| 单据 | 完成依据 |
| --- | --- |
| `purchase_order` | 到货/入库完成 |
| `entrust` | 委外完成/入库完成 |
| `production_receipt_process` | 工序完成数达到计划数 |
| `process_receipt` | 报工完成且质检通过 |
| `qc_receipt` | 质检完成 |
| `repository_receipt` | 审核通过 |

## 14. 前端展示建议

订单详情页建议展示三层：

```text
履约单元
  参数快照
  部件齐套
  工序进度
  异常/日志
```

工序节点展示：

- 工序名称
- 计划时间
- 实际时间
- 状态
- 执行人/供应商
- 关联单据入口
- 异常原因

关联单据入口根据：

```text
ref_module
ref_id
```

跳转到现有模块详情页。

## 15. 实施优先级

### 第一阶段：弱关联

- 保持现有表结构。
- 使用 `custom_item_process.ref_module/ref_id` 关联现有单据。
- 使用 `custom_item_component` 上已有业务外键关联采购、委外、生产、库存。
- 手动或服务层同步状态。

### 第二阶段：工序融合

- 给模板和履约工序补 `process_id`。
- 支持从 `process` 选择标准工序。
- 支持根据产品工艺路线生成履约工序。

### 第三阶段：自动编排

- 销售订单确认后自动生成履约单元。
- 按部件来源自动生成采购/委外/生产/库存冻结。
- 业务单据状态自动回写履约状态。
- 异常、返工、重做形成闭环。

## 16. 最终建议

不要让现有生产模块承担“订单定制履约全流程”的职责。

推荐架构是：

```text
custom_* 负责看板、编排、状态聚合、异常闭环
现有采购/委外/生产/报工/质检/库存负责执行
```

这样既能复用现有成熟模块，又不会破坏现有生产工艺、报工和质检的边界。

