OrderMarketingLogicV2.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace addons\ValetOrder\common\logic\order;
  3. use addons\Coupon\common\models\AddonsCoupon;
  4. use common\enums\AddonsEnum;
  5. use common\logic\order\marketing\AgentMarketing;
  6. use common\logic\order\marketing\BaseMarketing;
  7. use common\logic\order\marketing\CouponMarketing;
  8. use common\logic\order\marketing\DeductionMarketing;
  9. use common\logic\order\marketing\FreightFullReduceMarketing;
  10. use common\logic\order\marketing\FullReduceMarketing;
  11. use common\logic\order\marketing\MemberPriceMarketing;
  12. use common\logic\order\marketing\RegionalDividendMarketing;
  13. use common\logic\order\marketing\RepurchaseMarketing;
  14. use common\models\mall\MallAddons;
  15. use Exception;
  16. /**
  17. * 订单优惠相关处理
  18. *
  19. * @Author bing
  20. * @DateTime 2021-09-22 18:16:58
  21. * @copyright: Copyright (c) 2020 广东七件事集团
  22. */
  23. class OrderMarketingLogicV2 extends BaseOrderMarketing
  24. {
  25. public function getHandlers()
  26. {
  27. return [
  28. RepurchaseMarketing::class, //复购价格处理
  29. MemberPriceMarketing::class, // 会员价折扣
  30. FullReduceMarketing::class, // 满减减免处理
  31. AgentMarketing::class, // 渠道
  32. RegionalDividendMarketing::class, // 区域分红 - 合伙人 - 代理价
  33. CouponMarketing::class, // 优惠券
  34. FreeShippingMarketing::class, // 运费减免处理,涉及到包邮规则,必须在最后处理
  35. DeductionMarketing::class, // 会员积分抵扣
  36. ];
  37. }
  38. /**
  39. * 运行
  40. *
  41. * @param $form
  42. * @param bool $isNewRecord 创建记录
  43. *
  44. * @return object|mixed
  45. */
  46. public function run($form, $isNewRecord = false)
  47. {
  48. try {
  49. $extra = [];
  50. $group_order_goods = $form['group_order_goods'];
  51. $handlers = $this->getHandlers();
  52. $extra_shipping_fee = 0;
  53. if (!empty($form->process_extra_data['shipping_fee'])) {
  54. foreach ($form->process_extra_data['shipping_fee'] as $gid => $fees) {
  55. $extra_shipping_fee = array_sum($fees);
  56. }
  57. }
  58. if (empty($form->marketing['deduct']['shipping_fee']['money'])) $form->marketing['deduct']['shipping_fee']['money'] = 0;
  59. $form->marketing['deduct']['shipping_fee']['money'] += $extra_shipping_fee;
  60. // 判断是否有社区团购插件
  61. $is_install_community_addons = MallAddons::isInstall($form->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY);
  62. $is_filter_shipping = false;
  63. foreach ($group_order_goods as &$item) {
  64. // 运费减免处理
  65. foreach ($handlers as $key => $handler) {
  66. // 如果是社区团购订单,那么就不需要进行邮费处理 - 并且判断是否为送货上门/自提, 团长是否存在
  67. if ($form->is_force_free_shipping && $handler == FreeShippingMarketing::class) {
  68. continue;
  69. }
  70. /** @var BaseMarketing $class */
  71. $item = $handler::compute($item, $form, $extra);
  72. if ($item === false) throw new Exception($handler::getStaticError());
  73. }
  74. if (!$form->is_force_free_shipping) $item = FreightFullReduceMarketing::compute($item, $form);
  75. // 扩展费用
  76. if (!empty($form->process_extra_data['shipping_fee'])) {
  77. foreach ($form->process_extra_data['shipping_fee'] as $gid => $fees) {
  78. if (!empty($item['goods'][$gid])) {
  79. if (empty($item['mch_order_info']['shipping_money'])) $item['mch_order_info']['shipping_money'] = 0;
  80. $item['mch_order_info']['shipping_money'] += array_sum($fees);
  81. $item['mch_order_info']['pay_money'] += array_sum($fees);
  82. }
  83. }
  84. }
  85. $form['total_pay_money'] = round($form['total_pay_money'] + $item['mch_order_info']['pay_money'], 2);// 计算总额
  86. $form['total_pay_money_not_coupon'] = bcadd(
  87. $form['total_pay_money_not_coupon'], bcadd(
  88. $item['mch_order_info']['goods_price'], $item['mch_order_info']['coupon_money'] ?? 0, 2
  89. ), 2
  90. ); // 计算优惠券前金额
  91. }
  92. $form['group_order_goods'] = $group_order_goods;
  93. $form = AddonsCoupon::getCanUseCouponList($form, $isNewRecord);
  94. return $form;
  95. } catch (Exception $e) {
  96. $this->setError($e->getMessage());
  97. return false;
  98. }
  99. }
  100. }