4d434c9c67
Co-authored-by: Cursor <cursoragent@cursor.com>
5.8 KiB
5.8 KiB
杜康好客 · v3.5.4 商品规格(SPU + SKU)
2026-08-21 · mini-user / admin-web / h5-partner / API / Prisma
目标:商品详情页内可选销售规格;价格、权益、69 码、履约、上下架按 SKU;箱装按瓶当量起购与物流。
范围
| # | 项 | 交付 |
|---|---|---|
| 1 | 数据模型 | common_product_item 升级为 SPU;新增 spec_attr / spec_value / sku / sku_spec;订单快照 sku_id / sale_unit / bottles_per_unit |
| 2 | 存量迁移 | 每商品 1 个默认瓶装 SKU;SQL:prisma/migrate-product-sku-v354.sql;脚本:prisma/backfill-product-skus.ts |
| 3 | Catalog | 列表附加 specEnabled/saleUnit;详情附加 specAttrs/skus/defaultSkuId;旧字段拍平保留 |
| 4 | Trade | preview/create 可选 skuId;无 SKU 回落 SPU;有可售 SKU 用默认/唯一 |
| 5 | Admin | PUT /admin/products/:id/specs、PUT .../skus;商品抽屉加宽;规格弹窗填写;每规格主图 |
| 6 | mini-user | 详情规格 chips;选规格切主图;确认页带 skuId;箱装数量文案 |
| 7 | 代下单 | HQ / 合伙人可选规格 SKU |
| 8 | 权益文案 | 「好客权益券」→「好客权益」;首页角标「享{amount}好客权益」(去掉门店 icon) |
| 9 | SKU 码 | 系统生成 DK + 6 位数字,后台不可填;每规格独立 69 码 |
| 10 | 规格主图 | common_product_sku.image_url 可选;空则 C 端回落商品封面 |
不做:库存、把现有酒祖 10/15/20 合并为一个 SPU。
兼容规则(线上)
- 不改
/api/v1前缀;只增字段,不删旧字段语义。 - 旧客户端不传
skuId:- 有 ≥1 个可售 SKU → 用默认(或第一个)可售 SKU
- 没有任何可售 SKU(未回填)→ 回落 SPU 字段,照常下单(禁止再报「商品暂无可售规格」)
- 传入
skuId(新客户端选规格)→ 按该 SKU 校验。 - 旧 admin
PUT /admin/products/:id不传规格时:仅同步唯一默认 SKU(多规格时不同步,防误改);不同步覆盖已生成的 DK 码。 - SPU 上
sku_code/barcode_69去掉唯一约束,唯一下沉到common_product_sku;SPU 列保留为默认 SKU 冗余。 - 订单
sku_id可空;无规格快照走商品 69 码 / 价格。
发版一并执行
按顺序在目标环境库执行(先测试后生产)。本机 npx ts-node … 只改本地 .env 库,不会自动打线上。
- 规格表
server/dukang-api/prisma/migrate-product-sku-v354.sql
建 spec/sku 表,订单加sku_id/sale_unit/bottles_per_unit。 - 回填默认 SKU
cd server/dukang-api && npx ts-node prisma/backfill-product-skus.ts
尚无 SKU 的商品各建 1 条默认瓶装 SKU(码用 DK)。 - SKU 主图列
server/dukang-api/prisma/migrate-sku-image.sqlALTER TABLE `common_product_sku` ADD COLUMN `image_url` VARCHAR(512) NULL AFTER `sort_order`; - SKU 码改 DK(生产须在服务器用
.env.production的DATABASE_URL)
npx dotenv -e .env.production -- npx ts-node prisma/rewrite-sku-codes-dk.ts
已是DK+数字的不动;JZ-10/QX-001等会改。不改 69 码、订单、价格。 - 发票品类列(同批次)
server/dukang-api/prisma/migrate-invoice-category.sqlALTER TABLE `user_invoice` ADD COLUMN `invoice_category` VARCHAR(16) NOT NULL DEFAULT 'LIQUOR' AFTER `invoice_kind`; - 发布 API + mini-user + admin-web。
此时不要给商品加第二规格,等新小程序上线后再配「单瓶 / 整箱」。
起购与物流
bottleQty = quantity × bottlesPerUnit- 城市起购阈值仍是瓶;箱装 SKU(
bottlesPerUnit=6)数量 1 即可过同城 2 / 跨城 6。 - 大单拦截、承运商
goodsNum使用瓶当量。
关键表摘要
common_product_spec_attr/common_product_spec_valuecommon_product_sku(sale_unit=BOTTLE|BOX,bottles_per_unit,image_url可选)common_product_sku_specuser_order.sku_id/sale_unit/bottles_per_unituser_invoice.invoice_category:LIQUOR酒水类 /CATERING餐饮类;票种 C 端固定增值税普通发票
SKU 码与 69 码
- SKU 码:服务端生成
DK000001起,后台只展示。 - 每个规格必须填写互不相同的 69 码(全局不可与其它商品 SKU 冲突)。
- 总部「规格与 SKU」点「填写」弹窗编辑 69 码 / 价 / 履约 / 主图。
权益与小程序 UI(同批次)
| 位置 | 变更 |
|---|---|
| 门店详情等 | 「好客权益券」→「好客权益」 |
首页商品角标 CouponBadge |
纯文案 「享{amount}好客权益」,无门店 icon |
| 商品详情 | 规格区与「好客权益」说明之间加大间距 |
| 待支付 / 收银台 | 顶部 logo 使用 public/images/logo2.png(杜康印章) |
| 门店详情 | 「使用规则」四字红色,放在「门店详情」上面;门店详情正文限高,超出上下滚动 |
| 发票申请 | 票种写死增值税普通发票;类型选酒水类/餐饮类;申请备注;抬头邮箱必填打 * |
其它页 BenefitFigure(我的/权益/核销等)仍保留门店核销图标,仅首页角标去 icon。
验收
- 未配规格:旧小程序/H5/代下单路径与现网一致(无 SKU 也能下单)
- 多规格:详情选规格后价格/权益/履约/主图变化
- 整箱 SKU:数量 1 过起购;订单快照
bottles_per_unit=6 GET /catalog/products/:id仍含id/name/price/spec/skuCode/...- 小程序无「好客权益券」字样;首页角标为「享{金额}好客权益」且无门店 icon
- 后台 SKU 码为 DK 开头且不可手填;每规格独立 69 码与主图
- 门店详情「使用规则」红色且在门店详情上方;门店详情超长可滚动
- 待支付页顶部为 logo2 印章