Files
Chengdong Zhang 9e3abf95ef feat(marketing): add threshold promotions (满减)
Shop-scoped threshold rules with bilingual names, integer
threshold/reduction (reduction < threshold), active windows and display
order. Checkout applies the best eligible rule per shop with currency
conversion; coupon/threshold/activity pricing are mutually exclusive per
shop order. Reduction persists in orders.discount_minor +
threshold_promotion_id and flows into payment totals; checkout
idempotency covers the threshold selection. Delete archives referenced
rules, hard-deletes unreferenced ones.

- migration 0026: threshold_promotions + orders.threshold_promotion_id
  + coupon/threshold exclusivity CHECK
- api: modules/promotion (CRUD, preview, checkout integration)
- shared: ThresholdPromotion types, shop CRUD + preview client methods,
  checkout threshold_by_shop
- shop-admin: promotions page + nav + en/zh locales
- mall: exclusive promotion radio on checkout, live preview wiring,
  threshold label on order detail
- tests: promotions.rs (scoping, validation, best-rule, exclusivity,
  activity-priced 409, totals, replay, archive-vs-delete)
- openspec: archived 2026-10-19-add-threshold-promotions; spec
  threshold-promotions created, order/frontend specs updated
2026-10-19 18:14:38 +08:00

1.3 KiB

Index: Marketing (coupons, threshold promotions, flash sales, group buying, points)

Domain design: docs/domains/marketing.md. Specs: openspec/specs/shop-coupons/, threshold-promotions/, flash-sales/, group-buying/, points-mall/.

Backend (apps/api)

Module Holds
modules/coupon/ template CRUD, claim, checkout discount + redemption
modules/promotion/ threshold rule CRUD (archive-vs-delete), best-eligible evaluation, checkout reduction, cart preview
modules/flash_sale/ sessions/items CRUD, activity price resolution, reserved stock
modules/group_buying/ activities, groups, seat claim at payment
modules/points/ points catalog, redemption, fulfillment

Migrations: 0011_shop_coupons.sql, 0012_points_mall.sql, 0013_flash_sales.sql, 0014_group_buying.sql, 0026_threshold_promotions.sql. Tests: tests/coupons.rs, tests/promotions.rs, tests/flash_sales.rs, tests/group_buying.rs, tests/points.rs.

Frontends

  • Mall: pages/seckill.vue, pages/collective.vue, pages/integral.vue, pages/user/coupons.vue; exclusive coupon/threshold radio in pages/checkout/index.vue
  • Shop-admin: pages/coupons.vue, pages/promotions.vue, pages/flash-sales.vue, pages/group-buying.vue
  • Admin: pages/points-products.vue, pages/points-orders.vue