isDeductionDisable()) { trace_log()->deduction('订单关闭的抵扣类型',''); return collect(); } $deductions = $this->getDeductions($preOrder); $sort = array_flip($preOrder->getParams('deduction_ids')); $deductions = $deductions->sortBy(function ($deduction) use ($sort) { return array_get($sort, $deduction->code, 999); }); return $deductions; } protected function getDeductions(PreOrder $preOrder) { if (!isset($this->deductions)) { /** * 商城开启的抵扣 * @var Collection $deductions */ $deductions = Deduction::getEnable(); trace_log()->deduction('开启的抵扣类型', $deductions->pluck('code')->toJson()); if ($deductions->isEmpty()) { return collect(); } // 过滤调无效的 $deductions = $deductions->filter(function (Deduction $deduction) use ($preOrder) { /** * @var MemberCoin $memberCoin */ $memberCoin = $deduction->memberCoin($preOrder->belongsToMember); if ($memberCoin) { $this->setMemberCoin($deduction->getCode(), $memberCoin); } /** * @var Deduction $deduction */ return $deduction->valid() && $memberCoin && $memberCoin->useLimit(); }); $this->deductions = $deductions; } return $this->deductions; } protected function setMemberCoin($code, $class) { if (!$this->instances[$code]) { $this->instances[$code] = $class; } } //缓存抵扣用户模型 //解决分单每个订单都独立获取用户抵扣值模型问题 public function getMemberCoin($code) { if ($this->instances[$code]) { return $this->instances[$code]; } trace_log()->deduction('抵扣不存在:'.$code,""); //这里以防万一没有缓存,重新获取 return app('CoinManager')->make('MemberCoinManager')->make($code, [Member::current()]); } }