# Implementation Plan: 商品规格（SKU 规格）管理

**Branch**: `test`（按用户要求不创建特性分支，直接在 test 分支开发） | **Date**: 2026-07-15 | **Spec**: [spec.md](spec.md)

**Input**: Feature specification from `/specs/013-food-spec/spec.md`

**Note**: This template is filled in by the `/speckit-plan` command.

## Summary

将 cte_server 的商品规格功能（"规格加价"模型）移植到 foodie_server。引入规格组(`food_specs`)、规格值(`food_specs_value`)、商品-规格关联(`food_spec_relation`)三张表，复用 foodie 现有 MyBatis-Plus + fastjson + 若依技术栈。能力覆盖：商家端规格模板管理 CRUD、商品保存时挂载/更新规格关联、商品列表与详情接口返回规格结构、下单/促销链路按规格加价计价。保留现有 `pos_food.food_sku` JSON 字段与结构化关联双写，以兼容既有前端与订单读取逻辑。

## Technical Context

**Language/Version**: Java（Spring Boot + MyBatis-Plus），编译用 JDK 21（graalvm-jdk-21.0.7）；前端 Vue.js + Element UI。

**Primary Dependencies**: Spring Boot；MyBatis-Plus（BaseMapper/IService/LambdaQueryWrapper）；fastjson（JSONArray/JSONObject）；若依 BaseController/AjaxResult/TableDataInfo；自定义 `@Auth` 注解 + JwtUtil；前端 vue-i18n、Element UI、axios。

**Storage**: MySQL。复用现有 `pos_food` 表；新增 `food_specs`、`food_specs_value`、`food_spec_relation` 三张表；保留 `pos_food.food_sku` 列。

**Testing**: 项目无自动化测试框架，采用手动接口验证（Postman/curl）+ [quickstart.md](quickstart.md) 端到端场景。

**Target Platform**: Java 后端服务（若依多模块）+ Vue 商家端（foodie-store）。

**Project Type**: web-service（后端）+ web-frontend（商家端）。

**Performance Goals**: 常规后台/商家端接口，无特殊性能指标；商品列表注入规格采用批量查询 + 内存分组，避免 N+1。

**Constraints**:
- 模块依赖 admin→system 不可反向（实体/mapper/service 在 ruoyi-system，controller 在 ruoyi-admin）。
- 后端文件也是 CRLF 换行（编辑 Java/XML 注意匹配）。
- 数据库变更写入 `updatesql/sql.md`，不直接执行。
- 前端新增面向用户文字必须 `$t()` 国际化，四语言文件（zh/tw/en/vi）同步。
- 新增字段须全栈同步（实体→xml→dto→service→controller→vue→i18n→sql）。
- 规格名称是商家录入的动态多语言数据，按 `language` 字段承载，不做 i18n key。

**Scale/Scope**: 后端 3 实体 + 3 mapper(+xml) + 3 service + 1 新建 `FoodSpecController` + 改 `PosFoodController`（setposfood 挂规格、列表/详情注入规格）；前端 1 规格管理页 + 商品编辑页规格选择区 + 列表/详情规格展示；1 份 SQL 迁移。

## Constitution Check

`.specify/memory/constitution.md` 当前为未填写的占位模板，无实际项目原则/gates 约束 → **PASS**，无违规需论证。

## Project Structure

### Documentation (this feature)

```text
specs/013-food-spec/
├── plan.md              # 本文件（/speckit-plan 产出）
├── research.md          # Phase 0 决策记录（/speckit-plan）
├── data-model.md        # Phase 1 数据模型（/speckit-plan）
├── quickstart.md        # Phase 1 验证指南（/speckit-plan）
├── contracts/           # Phase 1 接口契约（/speckit-plan）
│   └── api.md
└── tasks.md             # Phase 2 任务清单（/speckit-tasks 产出，本阶段不创建）
```

### Source Code (repository root)

```text
ruoyi-system/src/main/java/com/ruoyi/system/
  domain/    FoodSpecs.java, FoodSpecsValue.java, FoodSpecRelation.java
             扩展 PosFood.java（transient: foodSpecs, sku）
  mapper/    FoodSpecsMapper.java, FoodSpecsValueMapper.java, FoodSpecRelationMapper.java
  service/   IFoodSpecsService(+Impl), IFoodSpecsValueService(+Impl), IFoodSpecRelationService(+Impl)
ruoyi-system/src/main/resources/mapper/system/
  FoodSpecsMapper.xml, FoodSpecsValueMapper.xml, FoodSpecRelationMapper.xml

ruoyi-admin/src/main/java/com/ruoyi/app/mendian/
  FoodSpecController.java（新建：规格管理 CRUD）
  PosFoodController.java（改：setposfood/add/edit 写规格关联+food_sku；getfood/getidlist/stallFoodList/foodSearch 注入规格）

前端（E:\QtwCode\foodie\foodie-store\src\）:
  views/  规格管理页（新建）+ 商品编辑页规格选择区（改）
  api/    specs.js（新建）+ food.js（改 setposfood 提交规格）
  lang/   zh.js / tw.js / en.js / vi.js（新增规格相关 i18n）

数据库: updatesql/sql.md（新增三表 DDL + pos_food.food_sku 列确认）
```

**Structure Decision**: 遵循现有若依多模块分层（domain/mapper/service 在 ruoyi-system，controller 在 ruoyi-admin，与 PosFood/PosFenlei 完全一致）；前端落在商家端 foodie-store（与商品管理同端）。

## Complexity Tracking

无 Constitution 违规，本节不适用。
