Files
repo-backend/app/Http/Controllers/Admin/CreditController.php
T

114 lines
4.4 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\CreditLine;
use App\CreditIeoOrder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreditController extends Controller
{
public function index() { return view('manages.credit.index'); }
public function orderIndex() { return view('manages.credit.orders'); }
public function list(Request $request)
{
$query = CreditLine::query()
->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);
}
}