where('settle_state', DealerOrderSettleState::Processed) ->whereNotNull('paied_time') ->chunkById(200, function ($orders) use (&$page) { $orders->load('dealer.userInfo'); foreach ($orders as $order) { try { DB::beginTransaction(); $this->handleDealerOrder($order); DB::commit(); } catch (Throwable $e) { DB::rollBack(); report($e); } } $page++; }); if ($page === 0) { sleep(60); } else { sleep(30); } } } /** * 处理经销商订单 * * @param \App\Models\DealerOrder $order * @return void */ protected function handleDealerOrder(DealerOrder $order) { $this->handleManagerSalesLogs($order); $this->handleManageSubsidyLogs($order); $this->handleChannelSubsidyLogs($order); $this->handlePurchaseLogs($order); $this->handleOrder($order); } protected function handleManagerSalesLogs(DealerOrder $order) { DealerManagerSalesLog::where('order_id', $order->id)->update([ 'order_completed_at' => $this->getOrderCompletedAt($order), ]); } protected function handleManageSubsidyLogs(DealerOrder $order) { DealerManageSubsidyLog::where('order_id', $order->id)->update([ 'order_completed_at' => $this->getOrderCompletedAt($order), ]); } protected function handleChannelSubsidyLogs(DealerOrder $order) { $channelSubsidyLogIds = DealerChannelSubsidyLog::where('order_id', $order->id)->get('id')->toArray(); DealerChannelSubsidyLog::whereIn('id', $channelSubsidyLogIds)->update([ 'order_completed_at' => $this->getOrderCompletedAt($order), ]); if ($order->consignor_id !== null) { DealerEarning::where('earningable_type', 'dealer_channel_subsidy_log')->whereIn('earningable_id', $channelSubsidyLogIds)->update([ 'settle_at' => now(), ]); } } protected function handlePurchaseLogs(DealerOrder $order) { DealerPurchaseLog::where('order_id', $order->id)->update([ 'order_completed_at' => $this->getOrderCompletedAt($order), ]); } protected function handleOrder(DealerOrder $order) { $salesValue = $order->total_amount; if (bccomp($salesValue, '0', 2) < 1) { return; } $salesValueLogs = []; if (bccomp($salesValue, '0', 2) === 1) { $ts = now()->toDateTimeString(); $order->dealer->update([ 'self_sales_value' => DB::raw("self_sales_value+{$salesValue}"), ]); $salesValueLogs[] = [ 'user_id' => $order->user_id, 'loggable_type' => $order->getMorphClass(), 'loggable_id' => $order->id, 'type' => DealerSalesValueLogType::Personal, 'change_sales_value' => $salesValue, 'remark' => '个人进货', 'created_at' => $ts, 'updated_at' => $ts, ]; if (count($pids = $order->dealer->userInfo->parent_ids) > 0) { foreach ($order->dealer->userInfo->parent_ids as $pid) { $salesValueLogs[] = [ 'user_id' => $pid, 'loggable_type' => $order->getMorphClass(), 'loggable_id' => $order->id, 'type' => DealerSalesValueLogType::Team, 'change_sales_value' => $salesValue, 'remarks' => '团队成员进货', 'created_at' => $ts, 'updated_at' => $ts, ]; } // 更新上级的团队团队业绩 Dealer::whereIn('user_id', $pids)->update([ 'team_sales_value' => DB::raw("team_sales_value + {$salesValue}"), ]); } } // 保存销售值日志 DealerSalesValueLog::insert($salesValueLogs); // 将订单标记未已结算 $order->forceFill([ 'settle_state' => DealerOrderSettleState::Completed, ])->save(); } /** * 获取订单完成时间 * * @param DealerOrder $order * @return Carbon */ protected function getOrderCompletedAt(DealerOrder $order): Carbon { if ($order->paied_time->lt('2022-04-19 12:00:00')) { return now(); } return $order->paied_time; } }