# 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 违规,本节不适用。