Laravel餐厅系统动态促销按匹配次数叠加折扣开发问题
餐厅系统动态促销功能开发问题
功能规则
正在开发餐厅系统动态促销功能,核心规则:订单中商品每次满足促销配置的数量要求时,即应用一次对应折扣。需支持的促销场景示例:
- 买1份奶昔(Milkshake)送1份
- 买2个汉堡(Burger)送1份奶昔
现有数据结构
已完成数据库模型设计及示例数据准备,各表结构与示例数据如下:
items(商品表):存储商品基础信息,字段包含id、name(商品名)、price(单价)。示例数据:id=1的奶昔单价2.00,id=2的汉堡单价4.00。promotions(促销规则表):存储促销基础信息,字段包含id、name(促销名)、price(单次促销折扣额)。示例数据:id=1的「买1奶昔送1」单次折扣2.00,id=2的「买2汉堡送1奶昔」单次折扣8.00。promotion_items(促销商品关联表):存储促销要求的商品及对应数量,字段包含id、promotion_id(关联促销ID)、item_id(关联商品ID)、quantity(要求数量)。示例数据:促销1需2份奶昔,促销2需2个汉堡+1份奶昔。orders(订单表):存储订单汇总信息,字段包含id、sub_total(小计)、discount_total(折扣总额)、final_total(实付总额)。表中id=1的订单为期望结果参考:小计8.00、折扣4.00、实付4.00,目前折扣与实付额的自动计算逻辑尚未实现。order_items(订单商品明细表):存储订单内商品明细,字段包含id、order_id(关联订单ID)、item_id(关联商品ID)、price(商品单价)、quantity(数量)、final_total(行小计)。示例订单1共包含4份奶昔,因商品附加选项差异拆分为3行存储,总原价8.00。
补充说明:
order_items表未将同ID商品合并为单条quantity=4的记录,是为了支持商品差异化附加选项(如奶昔可选半脱脂奶/全脂奶),本次问题暂不涉及附加选项相关逻辑。
当前卡点
按照规则,示例订单1含4份奶昔,应触发2次id=1的「买1奶昔送1」促销,累计折扣4.00,最终实付4.00。
目前已编写applyOffer方法基础代码,无法实现的逻辑点为:促销规则与订单商品的匹配逻辑、单个促销可应用次数的计算、总折扣额的累加。
现有基础代码如下:
<?php public function applyOffer() { // 示例数据中id=1的订单包含4份奶昔(商品id=1) $order = Order::with('orderItems.item')->where('id', 1)->firstOrFail(); // 获取所有关联了商品要求的促销 $promotions = Promotion::has('promotionItems')->get(); $discount_total = 0.00; if($promotions->count() > 0) { foreach($promotions as $promotion) { // 遍历到的第一个促销为「买1奶昔送1」(促销id=1) // 待实现逻辑:通过$promotion->promotionItems匹配$order->orderItems,按可应用次数累加对应折扣(本示例应累加2次,共4.00) // if(?) { $discount_total = $discount_total + $promotion->price; // } } } $order->sub_total = $order->orderItems->sum('final_total'); $order->discount_total = $discount_total; $order->final_total = $order->sub_total - $discount_total; $order->save(); } ?>
内容的提问来源于stack exchange,提问作者Koala
相关产品推荐
相关产品推荐

