getHandlers(); $extra_shipping_fee = 0; if (!empty($form->process_extra_data['shipping_fee'])) { foreach ($form->process_extra_data['shipping_fee'] as $gid => $fees) { $extra_shipping_fee = array_sum($fees); } } if (empty($form->marketing['deduct']['shipping_fee']['money'])) $form->marketing['deduct']['shipping_fee']['money'] = 0; $form->marketing['deduct']['shipping_fee']['money'] += $extra_shipping_fee; // 判断是否有社区团购插件 $is_install_community_addons = MallAddons::isInstall($form->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY); $is_filter_shipping = false; foreach ($group_order_goods as &$item) { // 运费减免处理 foreach ($handlers as $key => $handler) { // 如果是社区团购订单,那么就不需要进行邮费处理 - 并且判断是否为送货上门/自提, 团长是否存在 if ($form->is_force_free_shipping && $handler == FreeShippingMarketing::class) { continue; } /** @var BaseMarketing $class*/ $item = $handler::compute($item, $form, $extra); if($item === false) throw new Exception($handler::getStaticError()); } if (!$form->is_force_free_shipping) $item = FreightFullReduceMarketing::compute($item, $form); // 扩展费用 if (!empty($form->process_extra_data['shipping_fee'])) { foreach ($form->process_extra_data['shipping_fee'] as $gid => $fees) { if (!empty($item['goods'][$gid])) { if (empty($item['mch_order_info']['shipping_money'])) $item['mch_order_info']['shipping_money'] = 0; $item['mch_order_info']['shipping_money'] += array_sum($fees); $item['mch_order_info']['pay_money'] += array_sum($fees); } } } $form['total_pay_money'] = round($form['total_pay_money']+$item['mch_order_info']['pay_money'],2);// 计算总额 $form['total_pay_money_not_coupon'] = bcadd( $form['total_pay_money_not_coupon'], bcadd( $item['mch_order_info']['goods_price'], $item['mch_order_info']['coupon_money'] ?? 0, 2 ), 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['group_order_goods'] = $group_order_goods; $form = AddonsCoupon::getCanUseCouponList($form, $isNewRecord); $form = GiveScoreService::setGoodsMarketing($form); 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), bcmul($otherMoney, 1, 2), 2); } }