| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <?php
- namespace addons\Store\common\logic\order;
- use addons\Coupon\common\models\AddonsCoupon;
- use addons\Store\common\logic\order\marketing\CouponMarketing;
- use addons\Store\common\logic\order\marketing\CreditMarketing;
- use addons\Store\common\logic\order\marketing\FreeShippingMarketing;
- use addons\Store\common\logic\order\marketing\FullReduceMarketing;
- use addons\Store\common\logic\order\marketing\GiveMarketing;
- use addons\Store\common\logic\order\marketing\HigoMarketing;
- use addons\Store\common\logic\order\marketing\MemberPriceMarketing;
- use addons\Store\common\logic\order\marketing\ScoreDeductionMarketing;
- use addons\Store\common\logic\order\marketing\ScoreMarketing;
- use addons\Store\common\logic\order\marketing\MemberCardMarketing;
- use addons\Store\common\logic\order\marketing\RepurchaseMarketing;
- use addons\Store\common\models\StoreCoupon;
- use common\logic\order\BaseOrderMarketing;
- use common\logic\order\marketing\BaseMarketing;
- /**
- * 订单优惠相关处理
- * @Author bing
- * @DateTime 2021-09-22 18:16:58
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- class OrderMarketingLogic extends BaseOrderMarketing
- {
- public function getHandlers()
- {
- // TODO: Implement getHandlers() method.
- return [
- RepurchaseMarketing::class,
- FreeShippingMarketing::class, // 运费减免处理
- MemberPriceMarketing::class, // 会员价折扣
- FullReduceMarketing::class, // 满减减免处理
- CreditMarketing::class, // 赠送处理
- HigoMarketing::class, //嗨值,嗨贝抵扣处理
- MemberCardMarketing::class,// 用户卡处理
- ScoreDeductionMarketing::class, // 积分抵扣 (因为优惠券需要判断积分抵扣后是否满足条件。所以移动到优惠券前面)
- CouponMarketing::class, // 优惠券处理
- GiveMarketing::class, // 赠送处理
- ];
- }
- /**
- * 运行
- * @param $form
- * @param bool $isNewRecord 创建记录
- * @return object|mixed
- */
- public function run($form, $isNewRecord = false)
- {
- try {
- $extra = [];
- $group_order_goods = $form['group_order_goods'];
- $handlers = $this->getHandlers();
- $total_pay_money = 0;
- foreach ($group_order_goods as &$item) {
- // 运费减免处理
- foreach ($handlers as $key => $handler) {
- /** @var BaseMarketing $class*/
- $item = $handler::compute($item, $form, $extra);
- if ($item === false) throw new \Exception($handler::getStaticError());
- }
- //$form['total_pay_money'] = $item['mch_order_info']['pay_money']; // 计算总额
- $total_pay_money = bcadd($total_pay_money, $item['mch_order_info']['pay_money'], 2);
- // 计算优惠券最后一单金额
- $goodsNum = count($item['goods']);
- if (!empty($item['goods']) && $goodsNum > 1) {
- // 多个商品时其优惠比例计算容易出现浮点数误差,所以在计算最后一个订单优惠金额时(总金额-前面所有优惠金额)
- $goodsEndMoney = $this->setEndMoney($item['goods'], $item['mch_order_info']['goods_price']);
- $goodsKeys = array_keys($item['goods']);
- $lastKey = end($goodsKeys);
- foreach ($item['goods'] as $key => $goods) {
- if ($key == $lastKey) {
- $item['goods'][$key]['goods_price'] = $goodsEndMoney;
- // 因为订单详情是列表,所以需要循环设置优惠金额
- $detailEndMoney = $this->setEndMoney($goods['goods_details'], $item['goods'][$key]['goods_price']);
- $detailKeys = array_keys($goods['goods_details']);
- $lastKey = end($detailKeys);
- foreach ($goods['goods_details'] as $k => $goodsDetail) {
- if ($k == $lastKey) {
- $item['goods'][$key]['goods_details'][$k]['goods_price'] = $detailEndMoney;
- }
- }
- }
- }
- }
- $form['total_pay_money_not_coupon'] = bcadd(
- $form['total_pay_money_not_coupon'] ?? 0,
- bcadd(
- $item['mch_order_info']['goods_price'] ?? 0,
- $item['mch_order_info']['coupon_money'] ?? 0,
- 2
- ),
- 2
- ); // 计算优惠券前金额
- }
- $form['total_pay_money'] = $total_pay_money;
- $form['group_order_goods'] = $group_order_goods;
- $form = StoreCoupon::getCanUseCouponList($form, $isNewRecord);
- return $form;
- } catch (\Exception $e) {
- $this->setError($e->getMessage());
- return false;
- }
- }
- /**
- * 设置最后一个商品的优惠金额
- * @param array $list
- * @param $money
- * @return string
- */
- public function setEndMoney(array $list, $money = 0)
- {
- $otherList = array_slice($list, 0 , count($list) - 1);
- $otherMoney = array_sum(array_column($otherList, 'goods_price'));
- return bcsub(round($money, 2), $otherMoney, 2);
- }
- }
|