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); } }