[已解决] 优惠卷的规则验证以及多产品支持的实现方式寻求更好的思路]
下面的逻辑是我暂时想到的实现方式, 但是不能够优雅的实现需要的业务
而且在后续增加产品, 增加更多优惠, 一些列的验证会很复杂...
故此需求更好的思路
// 订单ID
$orderId = 1;
// 优惠劵ID
$couponId = 1;
// 最初的需要支付价格
$payPrice = 100;
// 已经优惠的索引, 存入表,用于后续查看订单都使用了哪些优惠
$disList = [];
// 优惠劵服务类
$coupon = Coupon:make($couponId);
// 获取年卡会员优惠信息
if($user['is_vip']) {
$vipDis = UserVipSrv::dis($payPrice);
// 向优惠索引插入年卡的折扣信息
$disList['vip'] = $vipDis;
// 年卡折扣后的价格
$payPrice = $vipDis['price'];
// 这里传入已使用年卡折扣后的价格, 用于优惠券计算最终支付价格 && 优惠劵与年互斥
$coupon->vip($vipDis['price']);
}
// 更多优惠减价规则操作
// ...
// 这里向优惠劵类, 传入是否支持拼团的套餐, 用于优惠劵类验证: 是否与拼团互斥
if(!empty($isPink)) {
$coupon->isPink();
}
if($coupon->isDis()) {
$couponDis = $coupon->getDis();
// 向优惠索引插入优惠劵的折扣信息
$disList['coupon'] = $couponDis;
// 优惠劵折扣后的价格, 这里是最终支付价格
$payPrice = $couponDis['price'];
}
// 更新订单的折扣信息索引
if(!empty($disList) && Helper::isArray($disList)) {
OrderSrv::update($orderId, ['pay_price' => $payPrice, 'dis_list' => json_encode($dis_list)]);
}
// 支付流程
pay($orderId);
我在贴最后一次。。。
优惠券,满减,打折,vip,都是优惠,只是类型不一样。
你说的管道,更好的使用场景是针对某个对象进行流式处理,比如创建订单,处理优惠,切换订单状态等。
这里就能看到区别,处理优惠是其中的某一步,你也可以说我这个管道就是处理优惠的!也可以,但是没有用!!
比如:我现在需要知道,到底哪个优惠活动力度最大,你通过管道是体现不出来的!这样讲能明白吗?
那下面的$maps变量里面存储的就是个个优惠的优惠价格,我直接拿出来就可以比较了!我觉得这样更灵活一些,不要过度设计!!!!!!!!!