order = $order; // 订单优惠券使用记录集合 $this->orderCoupons = $order->newCollection(); $order->setRelation('orderCoupons', $this->orderCoupons); // 订单优惠使用记录集合 $this->orderDiscounts = $order->newCollection(); $order->setRelation('orderDiscounts', $this->orderDiscounts); } public function getDiscounts() { //blank not discount if ($this->order->isDiscountDisable()) { return collect(); } if (!isset($this->discounts)) { $this->discounts = collect(); foreach (\app\common\modules\shop\ShopConfig::current()->get('shop-foundation.order-discount') as $configItem) { $this->discounts->put($configItem['key'], call_user_func($configItem['class'], $this->order)); } //todo 加载顺序问题,这里只是注入订单优惠项还没计算,所以没有等级优惠金额 //$this->setOrderDiscounts(); } return $this->discounts; } public function getAmount() { //todo 想放到 OrderGoodsPriceNode 节点里的但节点会重复调用,这里只有获取一次 $this->addGoodsDiscounts(); return $this->getDiscounts()->sum(function (BaseDiscount $discount) { // 每一种订单优惠 return $discount->getAmount(); }); } private function addGoodsDiscounts() { // 将所有订单商品的优惠 $orderGoodsDiscounts = $this->order->orderGoods->reduce(function (Collection $result, PreOrderGoods $aOrderGoods) { return $result->merge($aOrderGoods->getOrderGoodsDiscounts()); }, collect()); $preOrderDiscount = collect([]); // 按每个种类的优惠分组 求金额的和 $orderGoodsDiscounts->each(function ($orderGoodsDiscount) use ($preOrderDiscount) { // 新类型添加 if ($this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) { if ($preOrderDiscount->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) { $preDiscount = new PreOrderDiscount([ 'discount_code' => $orderGoodsDiscount->discount_code, 'amount' => $orderGoodsDiscount->amount, 'name' => $orderGoodsDiscount->name, 'no_show' => isset($orderGoodsDiscount->no_show)?$orderGoodsDiscount->no_show:0, ]); $preOrderDiscount->push($preDiscount); return; } // 已存在的类型累加 $preOrderDiscount->where('discount_code', $orderGoodsDiscount->discount_code)->first()->amount += $orderGoodsDiscount->amount; } }); $preOrderDiscount->each(function (PreOrderDiscount $orderDiscount) { $orderDiscount->setOrder($this->order); }); } private function setOrderDiscounts() { // 将所有订单商品的优惠 $orderGoodsDiscounts = $this->order->orderGoods->reduce(function (Collection $result, PreOrderGoods $aOrderGoods) { return $result->merge($aOrderGoods->getOrderGoodsDiscounts()); }, collect()); // 按每个种类的优惠分组 求金额的和 $orderGoodsDiscounts->each(function ($orderGoodsDiscount) { // 新类型添加 if ($this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) { $preOrderDiscount = new PreOrderDiscount([ 'discount_code' => $orderGoodsDiscount->discount_code, 'amount' => $orderGoodsDiscount->amount, 'name' => $orderGoodsDiscount->name, ]); $preOrderDiscount->setOrder($this->order); return; } // 已存在的类型累加 $this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->first()->amount += $orderGoodsDiscount->amount; }); } /** * @param $code * @return BaseDiscount */ public function getAmountByCode($code) { return $this->discounts[$code]; } }