# 镜片 SKU 供应商生产能力设计方案

## 一、背景

`doc/jykj/ERP功能与权限需求规格草案_V1.0.md` 中 `2.6 商品中心` 要求：

> 同一镜片 SKU 可绑定多个镜片厂，并维护各厂生产范围、周期、限制和成本。

该需求的核心不是维护一个普通供应商报价，而是维护“某个镜片厂对某个镜片 SKU 的生产能力”。同一个镜片 SKU，不同镜片厂可能存在：

- 可生产范围不同。
- 生产周期不同。
- 是否支持加急不同。
- 是否支持散光、ADD、棱镜等特殊参数不同。
- 成本、加价规则不同。
- 限制说明和内部备注不同。

因此，不应把这些字段直接放在 `product` 上，而应落在“供应商 + SKU”的绑定关系上。

## 二、设计目标

1. 支持一个镜片 SKU 绑定多个镜片厂。
2. 支持维护每个镜片厂对该 SKU 的生产范围、周期、限制和成本。
3. 支持根据订单处方参数筛选可生产镜片厂。
4. 支持下单员查看可选镜片厂和周期，但不查看成本。
5. 支持财务、管理层、系统管理员查看成本和历史报价。
6. 支持后续生产超期、供应商能力分析和镜片厂选择推荐。

## 三、现有基础

当前系统已有 `supplier_product` 模型：

```text
app/Model/SupplierProduct.php
```

它已经表达了：

```text
supplier_id + product_id
```

即某个供应商绑定某个 ERP 产品 SKU，并已有价格、币种、MOQ 等字段。

现有字段包括：

| 字段 | 说明 |
| --- | --- |
| `supplier_id` | 供应商 ID |
| `product_id` | 产品 SKU ID |
| `price` | 价格 |
| `currency` | 币种 |
| `exw_price` | 出厂价 |
| `fob_price` | FOB 价 |
| `moq` | 最小起订量 |
| `admin_remark` | 内部备注 |

因此，建议继续以 `supplier_product` 作为“SKU 绑定供应商”的主关系，不重新发明一张绑定主表。

## 四、总体模型

推荐两层模型：

```text
product
  └─ supplier_product
       └─ supplier_product_optical_capability
```

含义：

| 层级 | 定位 |
| --- | --- |
| `product` | ERP 内部镜片 SKU，例如 `Clear Lenses · 1.61 High-Index` |
| `supplier` | 镜片厂 |
| `supplier_product` | 某镜片厂是否绑定该镜片 SKU，以及默认价格、周期、状态 |
| `supplier_product_optical_capability` | 该镜片厂对该 SKU 的具体生产范围、限制、周期、加价规则 |

## 五、supplier_product 扩展设计

`supplier_product` 继续作为主绑定表，建议补充字段：

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `production_status` | tinyint | 生产状态：0停用，10可生产，20暂停接单，90停产 |
| `lead_time_min_days` | int | 常规最短生产周期，单位天 |
| `lead_time_max_days` | int | 常规最长生产周期，单位天 |
| `rush_available` | tinyint | 是否支持加急：0否，1是 |
| `rush_lead_time_days` | int | 加急周期，单位天 |
| `capability_mode` | tinyint | 能力配置方式：0未配置，10简单配置，20规则明细 |
| `production_remark` | varchar(500) | 下单员可见生产说明 |
| `supplier_visible_remark` | varchar(500) | 供应商可见备注 |
| `internal_remark` | varchar(500) | 内部备注，供应商不可见 |

状态建议：

| 值 | 状态 | 说明 |
| --- | --- | --- |
| `0` | 停用 | 不参与镜片厂选择 |
| `10` | 可生产 | 正常可选 |
| `20` | 暂停接单 | 展示但默认不可选，需人工确认 |
| `90` | 停产 | 不可选 |

这层解决“这个镜片厂是否能做这个 SKU、默认周期多少、默认成本多少”。

## 六、生产能力明细表设计

建议新增表：

```text
supplier_product_optical_capability
```

建议实际表名：

```text
hg_supplier_product_optical_capability
```

### 6.1 字段设计

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | bigint unsigned | 主键 |
| `company_id` | varchar(64) | 企业 ID |
| `supplier_product_id` | bigint unsigned | 供应商 SKU 绑定 ID |
| `supplier_id` | bigint unsigned | 供应商 ID，冗余便于查询 |
| `product_id` | bigint unsigned | 镜片 SKU ID，冗余便于查询 |
| `status` | tinyint | 状态：0停用，10启用 |
| `rule_name` | varchar(128) | 规则名称 |
| `sph_min` | decimal(6,2) | 球镜最小值 |
| `sph_max` | decimal(6,2) | 球镜最大值 |
| `cyl_min` | decimal(6,2) | 柱镜最小值 |
| `cyl_max` | decimal(6,2) | 柱镜最大值 |
| `add_min` | decimal(6,2) | ADD 最小值 |
| `add_max` | decimal(6,2) | ADD 最大值 |
| `axis_required` | tinyint | 有散光时是否必须轴位 |
| `pd_min` | decimal(6,2) | PD 最小值 |
| `pd_max` | decimal(6,2) | PD 最大值 |
| `prism_supported` | tinyint | 是否支持棱镜 |
| `max_prism` | decimal(6,2) | 最大棱镜 |
| `diameter_min` | decimal(6,2) | 最小直径 |
| `diameter_max` | decimal(6,2) | 最大直径 |
| `lead_time_days` | int | 该规则下生产周期 |
| `extra_days` | int | 特殊参数额外天数 |
| `base_cost` | decimal(12,4) | 基础成本 |
| `currency` | varchar(8) | 成本币种 |
| `extra_cost_rule` | json | 加价规则 |
| `restriction_json` | json | 其他限制 |
| `remark` | varchar(500) | 说明 |
| `create_admin_id` | bigint unsigned | 创建人 |
| `edit_admin_id` | bigint unsigned | 编辑人 |
| `create_time` | datetime | 创建时间 |
| `update_time` | datetime | 更新时间 |

### 6.2 示例

同一个 `Clear Lenses · 1.61 High-Index` 镜片 SKU：

| 镜片厂 | 生产范围 | 周期 | 成本 | 说明 |
| --- | --- | --- | --- | --- |
| A 厂 | SPH -6.00 到 +4.00，CYL 到 -2.00 | 3 天 | 30 CNY | 不支持棱镜 |
| B 厂 | SPH -10.00 到 +6.00，CYL 到 -4.00 | 5 天 | 45 CNY | 支持棱镜 |
| C 厂 | SPH -4.00 到 +3.00 | 2 天 | 28 CNY | 暂停接单 |

## 七、匹配逻辑

订单拉取后，系统已经根据 Shopify 订单行或元字段匹配出镜片 `product_id`。

选择镜片厂时：

1. 根据 `product_id` 查询 `supplier_product`。
2. 过滤 `production_status = 10` 的供应商绑定。
3. 如果 `capability_mode = 20`，继续匹配 `supplier_product_optical_capability`。
4. 根据处方参数匹配：
   - 左右眼 SPH 是否在范围内。
   - 左右眼 CYL 是否在范围内。
   - ADD 是否在范围内。
   - PD 是否在范围内。
   - 棱镜是否支持。
   - 直径等特殊参数是否满足。
5. 返回可生产镜片厂列表。
6. 计算预计生产周期和预计完成时间。
7. 下单员手动选择镜片厂，系统不强制自动分配。

## 八、接口设计

### 8.1 镜片 SKU 绑定供应商列表

```text
GET /admin/supplier-product/index
```

常用参数：

| 参数 | 说明 |
| --- | --- |
| `product_id` | 镜片 SKU ID |
| `supplier_id` | 镜片厂 ID |
| `production_status` | 生产状态 |

### 8.2 新增或编辑供应商 SKU 绑定

```text
POST /admin/supplier-product/add
POST /admin/supplier-product/edit
```

用于维护：

- 默认价格。
- 默认周期。
- 是否支持加急。
- 是否可生产。
- 下单员可见说明。
- 内部备注。

### 8.3 生产能力明细列表

```text
GET /admin/supplier-product-optical-capability/index
```

常用参数：

| 参数 | 说明 |
| --- | --- |
| `supplier_product_id` | 供应商 SKU 绑定 ID |
| `supplier_id` | 镜片厂 ID |
| `product_id` | 镜片 SKU ID |
| `status` | 启用状态 |

### 8.4 新增或编辑生产能力明细

```text
POST /admin/supplier-product-optical-capability/add
POST /admin/supplier-product-optical-capability/edit
```

用于维护：

- SPH/CYL/ADD 范围。
- PD 范围。
- 棱镜支持。
- 生产周期。
- 成本。
- 加价规则。
- 限制说明。

### 8.5 镜片厂可选列表接口

建议新增：

```text
POST /admin/supplier-product-optical-capability/match
```

请求参数：

| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `product_id` | 是 | 镜片 SKU ID |
| `prescription` | 是 | 处方参数 |
| `need_cost` | 否 | 是否返回成本字段，后端按权限二次判断 |

返回给下单员：

| 字段 | 说明 |
| --- | --- |
| `supplier_id` | 镜片厂 ID |
| `supplier_title` | 镜片厂名称 |
| `matched` | 是否可生产 |
| `lead_time_days` | 生产周期 |
| `estimated_finish_time` | 预计完成时间 |
| `restriction_message` | 限制说明 |
| `rush_available` | 是否支持加急 |

返回给财务、管理层、系统管理员时可额外返回：

| 字段 | 说明 |
| --- | --- |
| `base_cost` | 基础成本 |
| `currency` | 成本币种 |
| `extra_cost` | 额外成本 |
| `total_cost` | 预计总成本 |

## 九、权限设计

| 岗位 | 可见内容 | 可操作内容 |
| --- | --- | --- |
| 下单员 | 镜片厂、可生产状态、周期、限制说明 | 选择镜片厂；不可看成本 |
| 采购 | 供应商、生产范围、周期、供应状态 | 维护供应商绑定和生产能力；成本按权限控制 |
| 财务 | 成本、报价、历史价格 | 成本核对、对账 |
| 管理层 | 全部 | 查看和审计 |
| 系统管理员 | 全部 | 管理配置，不绕过财务审批 |
| 镜片厂 | 仅本厂能力和本厂下单单 | 提交价格、更新进度；不可看其他工厂 |

## 十、前端页面建议

### 10.1 镜片 SKU 详情页

增加 Tab：

```text
镜片厂能力
```

列表字段：

| 字段 | 说明 |
| --- | --- |
| 镜片厂 | supplier |
| 可生产状态 | production_status |
| 常规周期 | lead_time_min_days / lead_time_max_days |
| 加急 | rush_available |
| 生产范围 | 汇总能力明细 |
| 限制 | production_remark |
| 成本 | 有权限才显示 |

### 10.2 能力明细编辑页

按规则维护：

- SPH 范围。
- CYL 范围。
- ADD 范围。
- PD 范围。
- 是否支持棱镜。
- 生产周期。
- 成本和加价。
- 限制说明。

## 十一、与现有流程关系

### 11.1 与 Shopify 订单拉取

Shopify 订单拉取只负责匹配镜片 `product_id`。镜片厂选择发生在订单核查或镜片下单阶段。

### 11.2 与定制履约部件

`custom_item_component` 中镜片部件关联的 `product_id` 是镜片 SKU。选择镜片厂后，应将供应商 ID 写入镜片部件或委外单。

### 11.3 与委外单

生成镜片委外单时，应携带：

- 供应商 ID。
- 镜片 SKU。
- 处方参数。
- 生产周期。
- 成本快照。
- 限制说明。

成本快照用于后续对账，避免供应商能力或价格后续变更影响历史订单。

## 十二、落地步骤

### 第一阶段：数据结构

1. 扩展 `supplier_product` 增加生产状态、周期、加急和备注字段。
2. 新增 `supplier_product_optical_capability` 表。
3. 增加模型和基础 CRUD。

### 第二阶段：商品中心维护

1. 镜片 SKU 详情页增加“镜片厂能力”。
2. 支持绑定镜片厂。
3. 支持维护生产范围、周期、限制和成本。
4. 成本字段按权限隐藏。

### 第三阶段：镜片下单匹配

1. 新增可选镜片厂匹配接口。
2. 订单核查或镜片下单时展示可选镜片厂。
3. 下单员手动选择镜片厂。
4. 生成委外单时保存供应商能力和成本快照。

## 十三、验收标准

| 编号 | 验收项 | 标准 |
| --- | --- | --- |
| LSC-01 | 多厂绑定 | 一个镜片 SKU 可绑定多个镜片厂。 |
| LSC-02 | 能力范围 | 可维护 SPH、CYL、ADD、PD、棱镜等生产范围。 |
| LSC-03 | 周期维护 | 可维护常规周期和加急周期。 |
| LSC-04 | 成本权限 | 下单员不可见成本，财务和管理层可见。 |
| LSC-05 | 工厂匹配 | 根据镜片 SKU 和处方参数返回可生产镜片厂。 |
| LSC-06 | 限制提示 | 不可生产时返回明确限制原因。 |
| LSC-07 | 历史快照 | 委外单保存选择时的供应商、周期和成本快照。 |

