# 属性模版 — 功能需求说明

> 本文档在《属性模版功能需求-草稿》基础上整理，并关联 **《关联需求分析.md》**、**《店铺管理功能需求》**、平台侧 **《商品分类功能需求》**、**《商品服务管理功能需求》**、**《商品审核功能需求》** 及商家侧 **《商品列表功能需求》** 做边界与流程对齐。  
> 范围：**店铺经营管理端 · 商品管理** 对 **当前店铺下属性模版** 的列表、创建、编辑与删除。  
> **说明：** 本文档 **仅描述功能需求与业务规则**；不涉及数据库结构、接口定义及技术实现细节。  
> **v1.0：** 首版定稿；对齐草稿 §1～§6 及原型截图；补全属性/规格结构、店铺上下文、与商品列表的协作链。

---

## 1. 模块定位

### 1.1 业务目标

在农资商城 **店铺经营管理端（Web）· 商品管理** 提供 **属性模版** 管理能力，使 **店铺管理员**（商户经营账号及已授权子管理员）能够：

- 浏览 **当前店铺** 下全部有效属性模版；
- **添加、编辑** 模版，配置 **属性项/属性值**、**规格项/规格值**；
- **删除** 模版（单独 / 批量）；
- 按模版名称 **检索** 模版；
- 为 **商家端 · 商品列表** 发品时的 **「属性模版」** 字段提供可选数据源。

**不包含（本期或与它模块分工）：**

| 能力 | 说明 |
|------|------|
| **平台 · 属性模版** | **无** 平台级模版；模版 **仅归属店铺**，平台 **不** 维护、 **不** 代配 |
| **商品 CRUD / 上下架** | 见 **店铺后台 · 商品列表**；本模块 **不** 保存商品 |
| **运费模版维护** | 见运费模版专册（若有）；与属性模版 **独立** |
| **C 端展示规则** | C 端展示 **已保存商品** 的属性/规格数据；**不** 直接读取本模块 |
| **平台 · 商品审核** | 平台审商品 **详情** 时读 **商品档案** 中的属性/规格；**不** 操作本模块 |

### 1.2 与草稿的对应关系

| 草稿条目 | 定稿处理 |
|----------|----------|
| §1 模版名称列表 | §5；补充 **名称列表** 列含义、检索、批量删除 |
| §2 添加属性模版 | §7；区分 **属性** 与 **规格** 两段结构 |
| §3 按店铺查列表 | §5.1、§6 |
| §4 店铺上下文 | §6 |
| §5 编辑属性模版 | §8 |
| §6 删除（无商品引用） | §9；补充 **批量整批失败** |
| §7 异常返回 | 见 §12 **提示要点**；**不纳入** 实现格式 |
| §8 技术栈 | **不纳入** 本文档 |

### 1.3 在供给链中的位置

依据 **《关联需求分析.md》§5.1、§3.1**：

```text
【平台】商户管理 → 店铺管理 → 开店 + 经营账号
            ↓
【商家】登录 → 选择当前店铺（X-Shop-Id）
            ↓
【商家】属性模版（本模块）── 维护本店可复用模版
            ↓
【商家】商品列表 ── 发品时 **选用** 模版，并在模版基础上 **可增删** 属性/规格项及值
            ↓
【平台】商品管理 / 商品审核 ── 监管、检索（读 **商品档案**，不维护本模块）
            ↓
【C 端】商品详情展示 **商品已保存** 的属性与规格
```

| 关联模块 | 关系 | 边界说明 |
|----------|------|----------|
| **店铺管理** | 上游 | 模版 **归属当前店铺**；创建后 **不可换店** |
| **店铺商品分类** | 并列 | 分类组织商品；属性模版组织 **发品字段结构**；**相互独立** |
| **商品列表** | 下游消费 | 发品 **选用** 模版；保存时写入 **商品侧属性/规格数据**（见 §10） |
| **商品服务管理** | 并列 | 服务目录为平台主数据 + 商品快照；与本模块 **无** 数据耦合 |
| **商品审核（平台）** | 间接 | 审 **商品详情** 中的属性/规格展示；**不** 审核模版本身 |

### 1.4 使用端与角色

| 端 | 可操作角色 | 能力 |
|----|------------|------|
| **店铺经营管理端** | **商户经营账号** | 本模块全部能力（含切换店铺后操作对应店模版） |
| **店铺经营管理端** | 员工（子管理员） | 是否可访问由 **角色管理** 中商家端菜单权限决定 |
| **平台管理端** | 平台管理员 | **不使用** 本模块；**不** 查看/维护商家属性模版 |
| **C 端** | 买家/访客 | **不可** 直接访问；仅消费 **商品** 上已保存的属性/规格 |

### 1.5 数据范围

- **纳入：** 当前 **所属店铺** 下全部 **未逻辑删除** 的属性模版；
- **排除：** 其他店铺模版；已逻辑删除模版；
- **上下文：** 页头展示 **当前店铺名称**（只读）；切换店铺后列表 **整页刷新**。

---

## 2. 关联需求分析

### 2.1 与《关联需求分析》— 供给链

| 关联点 | 定稿 |
|--------|------|
| **§3 模块职责** | 商家维护 **本店** 发品辅助数据；平台 **商品管理** 监管 **商品状态与内容**，**不** 维护属性模版 |
| **§5.1 开业流程** | 开店后商家须 **先选当前店铺**；模版 **非** 发品硬前置，但 **选用模版发品** 时须已有可选模版 |
| **§8 不级联** | 修改/删除模版 **不自动** 改变已有商品的 **上下架/审核状态** |
| **§9.1 经营账号** | 登录后 **切换当前店铺** 再操作本模块 |
| **硬前置** | **无有效店铺** → 无法进入本模块 |

### 2.2 与《店铺管理功能需求》

| 项 | 定稿 |
|----|------|
| 店铺创建 | 平台开店后，本店属性模版初始 **为空**；**不** 在开店流程中预置模版 |
| 店铺停业 | 商家端 **仍可** 维护模版与商品资料；C 端该店 **禁止下单**（**不自动** 删改模版） |
| 店铺逻辑删除 | 本店模版 **不可再维护**；进入功能时提示店铺不可用 |
| 多店 | 每店模版 **相互独立**；须 **切换当前店铺** 后操作对应数据 |

### 2.3 与平台《商品分类功能需求》— 边界

| 维度 | 平台 · 商品分类 | 本模块 · 属性模版 |
|------|-----------------|-------------------|
| 用途 | 商品 **类目归属**（平台二级 / 店铺二级） | 商品 **属性与规格结构** 的 **可复用预设** |
| 维护端 | 平台 + 商家（店铺分类） | **仅** 商家 |
| 发品关系 | **必选/可选** 分类字段 | **可选** 选用模版；选用后 **仍可在商品表单增删** 项与值 |
| 删除规则 | 分类下有商品不可删 | 模版 **被商品引用** 不可删（见 §9） |

### 2.4 与平台《商品服务管理功能需求》— 边界

| 项 | 定稿 |
|----|------|
| 概念 | **商品服务** = 平台服务承诺标签；**属性模版** = 店铺维度属性/规格预设 |
| 发品 | 商品可同时 **勾选服务** 与 **选用属性模版**；保存时 **分别** 写入服务快照与属性/规格数据 |
| 变更 | 改平台服务目录 **不追溯** 已有商品；改本店模版 **不追溯** 已有商品（§10.2） |

### 2.5 与平台《商品审核功能需求》

| 项 | 定稿 |
|----|------|
| 审核对象 | **商品**（含其属性/规格展示）；**非** 属性模版 |
| 待审核编辑 | 商家可在 **商品列表** 修改属性/规格；**不** 要求同步回模版 |
| 平台下架 | **不** 因模版变更而触发 |

### 2.6 与商家侧《商品列表功能需求》— 消费方

| 项 | 定稿 |
|----|------|
| 分工 | **本模块** = 模版 **维护**；**商品列表** = 模版 **选用** + 商品级 **增删改** 属性/规格 |
| 发品字段 | 添加/编辑商品含 **「属性模版」**；下拉数据源 **来自本模块**（当前店铺有效模版） |
| 选用后行为 | 将模版中的 **属性项/属性值、规格项/规格值** **预填** 到商品表单；商家 **可继续增删** 各项及值 |
| 保存商品 | 以 **商品表单最终内容** 为准写入商品档案；**不** 仅保存模版 ID 作为展示来源 |
| 引用关系 | 商品保存时须 **记录所选用模版**（或等价关联），供本模块 **删除校验** |
| 商品列表 v1.0 | 商品列表定稿标注模版维护 **单独立项**；本模块即为该 **独立模块** |

### 2.7 与《角色管理》《员工管理》— 权限

| 项 | 定稿 |
|----|------|
| 菜单权限 | 本模块对应商家端菜单（如「属性模版」）；由 **角色管理** 配置 |
| 经营账号 | 默认具备商家端全部菜单（含本模块） |
| 子管理员 | 无权限则 **不可** 见菜单；直接访问须拒绝 |

---

## 3. 业务概念

| 概念 | 说明 |
|------|------|
| **当前店铺** | 登录后 `X-Shop-Id` 标识的店铺；本模块全部操作均限定于此 |
| **属性模版** | 本店可复用的 **属性 + 规格** 结构预设；发品时选用以 **减少重复录入** |
| **属性项** | 描述性参数名称（如 **品牌、屏幕、生产日期**）；下设多个 **属性值** |
| **属性值** | 某一属性项下的可选取值（如 品牌 → 小米、华为） |
| **规格项** | 用于 **销售规格 / 多规格 SKU** 的维度名称（如 **颜色、内存**）；下设多个 **规格值** |
| **规格值** | 某一规格项下的可选取值（如 颜色 → 红、白、绿） |
| **名称列表** | 列表页汇总列：该模版全部 **属性项名称** 与 **规格项名称**，逗号分隔；顺序 **先属性项、后规格项**（与表单一致） |
| **关联商品** | 发品时 **选用过该模版** 且 **未逻辑删除** 的商品 |

> **属性 vs 规格：** **属性** 侧重商品描述与展示参数；**规格** 侧重 **销售变体**（与商品列表「统一规格 / 多规格」「规格明细」衔接）。同一模版 **可同时** 包含属性段与规格段。

---

## 4. 功能结构

```text
属性模版（店铺 · 商品管理）
├── 模版列表（当前店铺；支持按名称检索、分页）
├── 添加属性模版（名称 + 属性段 + 规格段）
├── 编辑属性模版
└── 删除属性模版（单独 / 批量；被商品引用则阻断）
```

---

## 5. 属性模版列表

### 5.1 列表范围

- **纳入：** 当前店铺下全部 **有效** 属性模版；
- **排序：** 默认按 **创建时间降序**（最新在前）；若产品需按名称排序可配置，以原型为准；
- **分页：** 支持分页；默认每页条数以前端/产品为准（原型示例 **15 条/页**）；
- **上下文：** 展示 **当前店铺名称**（只读）。

### 5.2 列表字段

| 字段 | 说明 |
|------|------|
| 选择框 | 用于 **批量删除** |
| 属性模版名称 | 模版名称，如「宠物」「手机」 |
| 名称列表 | 全部属性项、规格项名称的 **逗号分隔** 摘要（见 §3） |
| 操作 | **编辑**、**删除** |

### 5.3 列表操作与入口

| 操作 | 说明 |
|------|------|
| **添加属性模版** | 见 §7 |
| **编辑** | 见 §8 |
| **删除** | 见 §9 |
| **批量删除** | 勾选多条后执行；**任一条不通过则整批失败** |
| **检索** | 按 **属性模版名称** 模糊匹配 |

### 5.4 检索规则

| 行为 | 说明 |
|------|------|
| 查询 | 名称模糊匹配；结果仍限定 **当前店铺** |
| 重置 | 清空条件并恢复默认列表 |
| 无结果 | 展示空态，引导 **添加属性模版** |

---

## 6. 店铺上下文（协作规则，对齐草稿 §4）

```text
商户经营账号 / 员工 ── 登录商家端
            ↓
      解析所属店铺 ID → 写入请求头 X-Shop-Id
      （商户管理员：默认该商户最先创建的店铺；
       多店时可切换店铺，更新 header）
            ↓
      属性模版等模块按 X-Shop-Id 读写当前店铺数据
```

| 规则 | 说明 |
|------|------|
| 未选店铺 | 访问本模块 **拒绝**；提示 **请先选择当前店铺** |
| 切换店铺 | 列表与 CRUD **立即** 切换为新店数据；**不可** 跨店操作 |
| 员工账号 | 须为当前商户有效绑定；店铺 ID 须 **属于** 当前商户 |

---

## 7. 添加属性模版

### 7.1 表单结构

表单分为三块（对齐原型 **添加/编辑属性模版** 弹窗）：

```text
* 属性模版名称
├── 【属性】
│     ├── 属性项 1：名称 + 多个属性值（可「+增加属性值」）
│     ├── 属性项 2 …
│     └── 「+添加属性项」
└── 【规格】
      ├── 规格项 1：名称 + 多个规格值（可「+增加规格值」）
      ├── 规格项 2 …
      └── 「+添加规格项」
```

### 7.2 字段规则

#### 7.2.1 模版名称

| 字段 | 必填 | 规则 |
|------|:----:|------|
| 属性模版名称 | 是 | 非空；**本店范围内** 模版名称 **不可重复** |

#### 7.2.2 属性段

| 要素 | 必填 | 规则 |
|------|:----:|------|
| 属性项 | 否* | 可 **零个或多个**；每项须填 **属性项名称** |
| 属性值 | 是** | 每个已填名称的属性项须 **至少一个** 属性值 |
| 同模版内属性项名称 | — | **不可重复** |
| 同一属性项下属性值 | — | **不可重复**；空值 **不允许** |

> *保存时 **至少** 存在 **一个属性项或一个规格项**（见 §7.4）。

#### 7.2.3 规格段

| 要素 | 必填 | 规则 |
|------|:----:|------|
| 规格项 | 否* | 可 **零个或多个**；每项须填 **规格项名称** |
| 规格值 | 是** | 每个已填名称的规格项须 **至少一个** 规格值 |
| 同模版内规格项名称 | — | **不可重复** |
| 同一规格项下规格值 | — | **不可重复**；空值 **不允许** |
| 与属性项重名 | — | **不建议**；若重名，保存时 **提示** 请使用不同名称（或 **阻断**，以实现为准，定稿倾向 **阻断**） |

### 7.3 动态交互

| 交互 | 说明 |
|------|------|
| +添加属性项 | 在属性段末尾新增一行属性项 |
| +增加属性值 | 为当前属性项新增一个属性值输入 |
| +添加规格项 | 在规格段末尾新增一行规格项 |
| +增加规格值 | 为当前规格项新增一个规格值输入 |
| 删除项/值 | 支持移除已添加的属性项、规格项及其下属值（至少保留结构合法性） |
| 取消 / 确认 | **取消** 放弃本次编辑；**确认** 提交校验并保存 |

### 7.4 添加流程

```text
店铺管理员进入「属性模版」（已携带 X-Shop-Id）
    → 点击「添加属性模版」
    → 填写模版名称
    → （可选）添加属性项及属性值
    → （可选）添加规格项及规格值
    → 校验（名称非空、本店唯一、至少一项、每项至少一值、无重复）
    → 保存成功 → 列表刷新
    → 模版可在「商品列表 · 添加商品」的「属性模版」中被选用
```

### 7.5 保存约束汇总

| 编号 | 规则 |
|------|------|
| AT-A1 | 模版名称 **必填** 且 **本店唯一** |
| AT-A2 | 保存时须 **至少一个属性项或一个规格项** |
| AT-A3 | 每个属性项/规格项 **名称必填**，且各自段内 **不重名** |
| AT-A4 | 每个属性项/规格项须 **至少一个** 非空属性值/规格值 |
| AT-A5 | 同一项下各值 **不可重复** |

---

## 8. 编辑属性模版

### 8.1 可编辑范围

- **属性模版名称**；
- **全部** 属性项、属性值（可增、删、改）；
- **全部** 规格项、规格值（可增、删、改）。

### 8.2 编辑约束

| 项 | 定稿 |
|----|------|
| 数据范围 | **仅当前店铺** 下模版可编辑 |
| 名称唯一 | 模版名称校验 **排除自身** |
| 结构校验 | 与 §7.2、§7.5 **相同** |
| 已被商品引用 | **允许编辑**；变更 **不自动** 同步至已保存商品（§10.2） |
| 状态联动 | 修改模版 **不自动** 改变任何商品的 **上下架/审核状态** |

### 8.3 编辑流程

```text
列表点击「编辑」
    → 弹窗回显模版名称、属性段、规格段
    → 修改后点击「确认」
    → 校验通过 → 保存 → 列表刷新
```

---

## 9. 删除属性模版

### 9.1 删除方式

- **单独删除**：行操作 **删除**；
- **批量删除**：勾选多条后 **批量删除**；**任一条不通过则整批失败**，不删除任何一条，并 **汇总提示** 失败原因。

### 9.2 删除前置校验

```text
删除属性模版
    → 校验是否存在「关联商品」
    ├── 有 → 阻断；提示须先解除引用或处理商品
    └── 无 → 二次确认 → 逻辑删除成功
```

### 9.3 关联商品定义

| 场景 | 规则 |
|------|------|
| 何谓「有关联商品」 | 存在 **未删除** 且 **发品时选用过该模版** 的商品 |
| 商品已改属性 | 只要 **仍关联该模版**（选用关系未清除），**仍视为** 有关联 |
| 商品已删除/逻辑删除 | **不** 阻塞模版删除 |
| 批量删除 | 对每条选中模版分别校验；**整批失败** |

### 9.4 规则汇总

| 项 | 规则 |
|----|------|
| 可删对象 | **当前店铺** 下、**无关联商品** 的模版 |
| 删除方式 | **逻辑删除**；列表不再展示 |
| 确认 | **二次确认**；批量删除失败须 **明确汇总** |

### 9.5 删除后影响

- 商品列表 **不可再选** 该模版；
- 已关联商品 **不受影响**（仍保留已保存的属性/规格数据）；
- 若需彻底移除模版，须 **先** 让全部关联商品 **不再引用** 该模版（改选其他模版或清空选用关系，以实现为准）。

---

## 10. 与商品列表的协作

### 10.1 发品选用（下游）

```text
添加/编辑商品（可编辑态）
    → 「属性模版」下拉
    → 仅列当前店铺 **有效** 模版（按名称展示）
    → 选择某一模版
    → 表单 **预填** 该模版的属性项/值、规格项/值
    → 商家 **可增删改** 预填内容
    → 保存商品 → 以 **表单最终内容** 写入商品档案，并 **记录模版选用关系**
```

| 场景 | 行为 |
|------|------|
| 未选模版 | 允许；商家 **手工** 维护属性/规格（与商品列表草稿一致） |
| 切换模版 | **覆盖** 当前表单中由模版带入的内容；**须二次确认** 防误覆盖 |
| 模版被删 | 下拉 **不再出现**；已保存商品 **保留** 历史数据 |
| 模版改名 | 下拉展示新名称；已保存商品 **不** 自动改名 |

### 10.2 变更不追溯（对齐商品服务快照原则）

| 事件 | 已有商品 | 新发品 |
|------|----------|--------|
| 编辑模版项/值 | **不变** | 选用后 **按新版** 预填 |
| 删除模版 | **不变**（若仍保留选用记录则仅 **不可再选**） | 不可再选 |
| 商品改模版 | 以 **新选用 + 表单编辑** 为准更新商品档案 | — |

### 10.3 与「销售规格」的衔接

| 项 | 定稿 |
|----|------|
| 规格项/规格值 | 模版中的 **规格段** 为商品列表 **「多规格」** 提供 **初始维度与候选值** |
| 统一规格 | 可选用 **仅含属性段** 的模版，或选用后 **忽略** 规格段 |
| 规格明细 | 市场价、库存等 **仍在商品表单** 维护；**不在** 本模块维护 |

### 10.4 平台端（间接）

| 项 | 定稿 |
|----|------|
| 平台商品详情 | 展示 **商品档案** 中的属性/规格；**不** 展示模版维护入口 |
| 平台检索 | 是否按属性/规格检索 **以平台商品管理定稿为准**；本模块 **不** 定义平台检索 |

---

## 11. 业务流程总览

### 11.1 端到端协作

```text
【平台】店铺管理 ── 开店
            ↓
【商家】登录 → X-Shop-Id → 属性模版 ── 添加/维护模版
            ↓
【商家】商品列表 ── 选用模版发品（可再编辑属性/规格）
            ↓
【平台】商品审核 / 商品管理 ── 读商品详情
            ↓
【C 端】商品详情 ── 展示商品已保存属性/规格
```

### 11.2 单模块内主流程

```text
列表浏览 ──┬── 按模版名称检索
           ├── 添加属性模版
           ├── 编辑属性模版
           └── 删除（单独 / 批量；无商品引用）
```

---

## 12. 校验与提示

| 场景 | 提示要点 |
|------|----------|
| 未选店铺 | 请先选择当前店铺 |
| 模版名称为空 | 请输入属性模版名称 |
| 模版名称重复 | 属性模版名称已存在 |
| 无属性项且无规格项 | 请至少添加一个属性项或规格项 |
| 项名称为空 | 请输入属性项/规格项名称 |
| 项名称重复 | 属性项/规格项名称不可重复 |
| 属性项与规格项重名 | 属性项与规格项名称不可相同 |
| 值为空 | 请为每项至少添加一个属性值/规格值 |
| 值重复 | 同一项下属性值/规格值不可重复 |
| 删除有引用 | 该属性模版已被商品使用，无法删除 |
| 批量删失败 | 部分模版不满足删除条件，整批操作已取消 |
| 跨店操作 | 属性模版不存在 / 无权限 |
| 商品切换模版 | 切换模版将覆盖当前属性/规格内容，是否继续？ |

---

## 13. 业务规则汇总

| 编号 | 规则 |
|------|------|
| **AT1** | 列表 = **当前店铺**（`X-Shop-Id`）下全部 **有效** 属性模版 |
| **AT2** | 模版 **仅商家端** 维护；平台 **不** 维护、 **不** 代配 |
| **AT3** | 模版名称 **本店唯一**；**必填** |
| **AT4** | 模版含 **属性段**（属性项→属性值）与 **规格段**（规格项→规格值）；保存时 **至少一段有项** |
| **AT5** | 每个属性项/规格项 **至少一个** 非空值；同段内项名 **不重复**；同项下值 **不重复** |
| **AT6** | 列表 **名称列表** = 全部属性项名 + 规格项名，逗号分隔 |
| **AT7** | **有关联商品** 的模版 **不可删除**；批量删除 **整批失败** |
| **AT8** | 编辑模版 **不追溯** 已保存商品；仅影响 **此后选用** 的预填内容 |
| **AT9** | 商品列表 **选用** 模版后 **仍可增删** 属性/规格项及值 |
| **AT10** | 修改/删除模版 **不自动** 改变商品上下架/审核状态 |
| **AT11** | 须 **切换当前店铺** 后再操作；店间模版 **相互独立** |
| **AT12** | 删除为 **逻辑删除**；二次确认 |

---

## 14. 非本期范围

| 项 | 说明 |
|----|------|
| 平台级属性模版 | 不做 |
| 模版与商品分类 **自动绑定** | 不做；选用关系在 **发品时人工选择** |
| 模版 **导入/导出** | 不做 |
| 模版 **版本历史** | 不做 |
| 属性/规格 **跨店共享** | 不做 |
| 运费模版 | 独立模块 |
| 异常返回 code/msg/data 格式 | 实现层 |
| 技术栈 | 实现层 |

---

## 15. 草稿对照与修订说明

| 草稿条目 | 本文档处理 |
|----------|------------|
| 列表 + 编辑删除 | §5、§8、§9 |
| 添加多属性项/规格项 | §7；区分属性段与规格段 |
| 按店铺 ID 查列表 | §5.1、§6 |
| 店铺 header 规则 | §6 |
| 无引用可删 | §9；补充批量与关联定义 |
| 异常返回、技术栈 | **不纳入** |
| 未写：检索、批量删、与商品列表协作 | 已定稿补充 |
| 未写：属性 vs 规格 | §3、§7、§10.3 |
| 未写：编辑不追溯 | §8.2、§10.2 |

---

## 16. 修订记录

| 版本 | 说明 |
|------|------|
| **v1.0** | 首版定稿：对齐草稿 §1～§6 及原型；关联《关联需求分析》《店铺管理》《商品列表》及平台商品相关需求 |
| **v1.1** | 对齐商品列表协作：发品保存 `attr_template_id` 已实现（见《店铺商品列表技术方案》v1.2） |
| **v1.2** | 对齐 `biz_goods_attr` 快照保存与预填流程（见《店铺商品列表技术方案》v1.4） |

---

*文档版本：v1.2 · 商家侧见《商品列表功能需求.md》v1.4*
