OrderMarketingLogic.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace addons\Store\common\logic\order;
  3. use addons\Coupon\common\models\AddonsCoupon;
  4. use addons\Store\common\logic\order\marketing\CouponMarketing;
  5. use addons\Store\common\logic\order\marketing\CreditMarketing;
  6. use addons\Store\common\logic\order\marketing\FreeShippingMarketing;
  7. use addons\Store\common\logic\order\marketing\FullReduceMarketing;
  8. use addons\Store\common\logic\order\marketing\GiveMarketing;
  9. use addons\Store\common\logic\order\marketing\HigoMarketing;
  10. use addons\Store\common\logic\order\marketing\MemberPriceMarketing;
  11. use addons\Store\common\logic\order\marketing\ScoreDeductionMarketing;
  12. use addons\Store\common\logic\order\marketing\ScoreMarketing;
  13. use addons\Store\common\logic\order\marketing\MemberCardMarketing;
  14. use addons\Store\common\logic\order\marketing\RepurchaseMarketing;
  15. use addons\Store\common\models\StoreCoupon;
  16. use common\logic\order\BaseOrderMarketing;
  17. use common\logic\order\marketing\BaseMarketing;
  18. /**
  19. * 订单优惠相关处理
  20. * @Author bing
  21. * @DateTime 2021-09-22 18:16:58
  22. * @copyright: Copyright (c) 2020 广东七件事集团
  23. */
  24. class OrderMarketingLogic extends BaseOrderMarketing
  25. {
  26. public function getHandlers()
  27. {
  28. // TODO: Implement getHandlers() method.
  29. return [
  30. RepurchaseMarketing::class,
  31. FreeShippingMarketing::class, // 运费减免处理
  32. MemberPriceMarketing::class, // 会员价折扣
  33. FullReduceMarketing::class, // 满减减免处理
  34. CreditMarketing::class, // 赠送处理
  35. HigoMarketing::class, //嗨值,嗨贝抵扣处理
  36. MemberCardMarketing::class,// 用户卡处理
  37. ScoreDeductionMarketing::class, // 积分抵扣 (因为优惠券需要判断积分抵扣后是否满足条件。所以移动到优惠券前面)
  38. CouponMarketing::class, // 优惠券处理
  39. GiveMarketing::class, // 赠送处理
  40. ];
  41. }
  42. /**
  43. * 运行
  44. * @param $form
  45. * @param bool $isNewRecord 创建记录
  46. * @return object|mixed
  47. */
  48. public function run($form, $isNewRecord = false)
  49. {
  50. try {
  51. $extra = [];
  52. $group_order_goods = $form['group_order_goods'];
  53. $handlers = $this->getHandlers();
  54. $total_pay_money = 0;
  55. foreach ($group_order_goods as &$item) {
  56. // 运费减免处理
  57. foreach ($handlers as $key => $handler) {
  58. /** @var BaseMarketing $class*/
  59. $item = $handler::compute($item, $form, $extra);
  60. if ($item === false) throw new \Exception($handler::getStaticError());
  61. }
  62. //$form['total_pay_money'] = $item['mch_order_info']['pay_money']; // 计算总额
  63. $total_pay_money = bcadd($total_pay_money, $item['mch_order_info']['pay_money'], 2);
  64. // 计算优惠券最后一单金额
  65. $goodsNum = count($item['goods']);
  66. if (!empty($item['goods']) && $goodsNum > 1) {
  67. // 多个商品时其优惠比例计算容易出现浮点数误差,所以在计算最后一个订单优惠金额时(总金额-前面所有优惠金额)
  68. $goodsEndMoney = $this->setEndMoney($item['goods'], $item['mch_order_info']['goods_price']);
  69. $goodsKeys = array_keys($item['goods']);
  70. $lastKey = end($goodsKeys);
  71. foreach ($item['goods'] as $key => $goods) {
  72. if ($key == $lastKey) {
  73. $item['goods'][$key]['goods_price'] = $goodsEndMoney;
  74. // 因为订单详情是列表,所以需要循环设置优惠金额
  75. $detailEndMoney = $this->setEndMoney($goods['goods_details'], $item['goods'][$key]['goods_price']);
  76. $detailKeys = array_keys($goods['goods_details']);
  77. $lastKey = end($detailKeys);
  78. foreach ($goods['goods_details'] as $k => $goodsDetail) {
  79. if ($k == $lastKey) {
  80. $item['goods'][$key]['goods_details'][$k]['goods_price'] = $detailEndMoney;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. $form['total_pay_money_not_coupon'] = bcadd(
  87. $form['total_pay_money_not_coupon'] ?? 0,
  88. bcadd(
  89. $item['mch_order_info']['goods_price'] ?? 0,
  90. $item['mch_order_info']['coupon_money'] ?? 0,
  91. 2
  92. ),
  93. 2
  94. ); // 计算优惠券前金额
  95. }
  96. $form['total_pay_money'] = $total_pay_money;
  97. $form['group_order_goods'] = $group_order_goods;
  98. $form = StoreCoupon::getCanUseCouponList($form, $isNewRecord);
  99. return $form;
  100. } catch (\Exception $e) {
  101. $this->setError($e->getMessage());
  102. return false;
  103. }
  104. }
  105. /**
  106. * 设置最后一个商品的优惠金额
  107. * @param array $list
  108. * @param $money
  109. * @return string
  110. */
  111. public function setEndMoney(array $list, $money = 0)
  112. {
  113. $otherList = array_slice($list, 0 , count($list) - 1);
  114. $otherMoney = array_sum(array_column($otherList, 'goods_price'));
  115. return bcsub(round($money, 2), $otherMoney, 2);
  116. }
  117. }