114 lines
4.4 KiB
PHP
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);
|
|
}
|
|
}
|