2026-10-12-product-nutrition-sync-design.md 3.6 KB

商品推荐同步至营养产品功能设计

1. 需求背景

在商品编辑页面(ProductEdit.vue)增加"推荐商品"选项(单选:是/否)。当商品被标记为推荐时,将商品的核心信息同步/更新至 nutrition_product 表(通过 local_product_id 关联)。商品后续变更时,自动同步更新营养产品对应记录。

2. 数据模型变更

2.1 products 表新增字段

字段 类型 默认值 说明
is_recommended TINYINT(1) 0 是否推荐商品:0=否,1=是

2.2 nutrition_product 表关联字段(已存在)

字段 说明
local_product_id 关联本平台商品ID (products.id)
name 产品名称
description 产品描述
image_url 产品图/封面图
price 当前售价
original_price 原价
product_images 商品图片URL(JSON数组)
spec 规格

3. 同步字段映射

Product 字段 → NutritionProduct 字段 备注
id local_product_id 关联键
name name -
description description -
intro 可选,补充描述 不直接映射
coverImage image_url 封面图
images product_images JSON数组
price (分) price (元) 需除以100
memberPrice (分) original_price (元) 会员价作为原价,需除以100
productType - 不同步
stock - 不同步,营养产品有自己的库存逻辑

4. 同步逻辑

4.1 触发时机

  • 管理员创建商品时(adminCreate)
  • 管理员更新商品时(adminUpdate)
  • 管理员复制商品时(adminCopy)——新商品默认不推荐

4.2 同步规则

  1. 商品设为推荐 (is_recommended=1):
    • 若 nutrition_product 表无对应记录 → 创建新记录
    • 若已有记录 → 更新字段
  2. 商品取消推荐 (is_recommended=0):
    • 保留 nutrition_product 记录,但将 status=0(下架),不删除
  3. 商品未变更推荐状态:
    • 若已推荐 → 同步更新营养产品字段
    • 未推荐 → 不操作

4.3 实现位置

  • ProductService.adminCreate() / adminUpdate() 内部调用 syncToNutritionProduct(product)
  • ProductService.syncToNutritionProduct(product) 处理创建/更新逻辑
  • 依赖 NutritionProductService 注入

5. 前端变更

5.1 ProductEdit.vue

  • 在"商品类型"下方或"关联成长档案"上方增加"推荐商品"单选项
  • 使用 el-radio-group:是/否
  • 绑定 form.isRecommended (Boolean)

5.2 后端 DTO

  • ProductCreateRequest 新增 isRecommended 字段

6. 数据库迁移

在 DatabaseInitializer.runMigrations() 中添加迁移:

ensureColumn("products", "is_recommended", "TINYINT(1) DEFAULT 0 COMMENT '是否推荐商品 0否 1是'");

同时更新 schema.sql 的 products 表建表语句。

7. 实现步骤

  1. 数据库迁移 + schema.sql 同步
  2. Product 实体类新增 isRecommended 字段
  3. ProductCreateRequest DTO 新增 isRecommended
  4. ProductService 新增 syncToNutritionProduct() 方法
  5. AdminProductController create/update 透传字段
  6. ProductEdit.vue 前端表单增加单选项
  7. 编译验证

8. 验收标准

  • 商品编辑页可见"推荐商品"单选项
  • 勾选"是"保存后,nutrition_product 表有对应记录(local_product_id = product.id)
  • 修改商品名称/价格/描述/图片后保存,nutrition_product 对应字段同步更新
  • 取消推荐后,nutrition_product.status 变为 0,记录保留
  • 复制商品时,新商品 is_recommended 默认 0