leftJoin('users', 'credit_line.user_id', '=', 'users.id') ->select( 'credit_line.*', 'users.phone as user_phone', 'users.email as user_email' ); $user_id = $request->input('user_id'); if ($user_id) $query->where('credit_line.user_id', $user_id); $keyword = $request->input('keyword'); if ($keyword) { $query->where(function ($q) use ($keyword) { $q->where('users.phone', 'like', "%{$keyword}%") ->orWhere('users.email', 'like', "%{$keyword}%"); }); } $data = $query->orderBy('credit_line.id', 'desc')->paginate($request->input('limit', 20)); $statusMap = ['0' => 'Disabled', '1' => 'Active']; foreach ($data as $item) { $item->status_text = $statusMap[$item->status] ?? ''; } return $this->layuiData($data); } public function grant(Request $request) { $user_id = intval($request->input('user_id')); $total_amount = floatval($request->input('total_amount')); $daily_rate = floatval($request->input('daily_rate')); $cycle_days = intval($request->input('cycle_days')); $credit_score = intval($request->input('credit_score', 0)); $status = intval($request->input('status', 1)); if (!$user_id || $total_amount < 0 || $daily_rate < 0 || $cycle_days <= 0) { return $this->error('Invalid params'); } DB::beginTransaction(); try { $line = CreditLine::where('user_id', $user_id)->lockForUpdate()->first(); if (!$line) { CreditLine::create([ 'user_id' => $user_id, 'total_amount' => $total_amount, 'used_amount' => 0, 'available_amount' => $total_amount, 'daily_rate' => $daily_rate, 'cycle_days' => $cycle_days, 'credit_score' => $credit_score, 'status' => $status, ]); } else { $used = floatval($line->used_amount); if ($total_amount < $used) { DB::rollBack(); return $this->error('Total cannot be less than used'); } $line->total_amount = $total_amount; $line->available_amount = bc_sub($total_amount, $used, 6); $line->daily_rate = $daily_rate; $line->cycle_days = $cycle_days; $line->credit_score = $credit_score; $line->status = $status; $line->save(); } DB::commit(); return $this->success('OK'); } catch (\Exception $e) { DB::rollBack(); return $this->error('System error'); } } public function orderList(Request $request) { $query = CreditIeoOrder::query() ->leftJoin('users', 'credit_ieo_order.user_id', '=', 'users.id') ->leftJoin('ieo_project', 'credit_ieo_order.project_id', '=', 'ieo_project.id') ->select( 'credit_ieo_order.*', 'users.phone as user_phone', 'users.email as user_email', 'ieo_project.name as project_name', 'ieo_project.symbol as symbol' ); $status = $request->input('status'); if ($status !== null && $status !== '') $query->where('credit_ieo_order.status', intval($status)); $project_id = $request->input('project_id'); if ($project_id) $query->where('credit_ieo_order.project_id', $project_id); $data = $query->orderBy('credit_ieo_order.id', 'desc')->paginate($request->input('limit', 20)); $statusMap = ['0' => 'Pending Repayment', '1' => 'Repaid', '2' => 'Overdue']; foreach ($data as $item) { $item->status_text = $statusMap[$item->status] ?? ''; } return $this->layuiData($data); } }