6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/PointLogController.php

85 lines
2.8 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Admin\Repositories\PointLog as PointLogRepository;
use App\Admin\Widgets\InfoBox;
use App\Enums\PointLogAction;
use App\Models\PointLog;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Row;
class PointLogController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
Admin::style(
<<<CSS
.card-header {
margin-top: 1.5rem !important;
margin-bottom: -1rem !important;
}
CSS
);
$builder = PointLogRepository::with(['user', 'administrator']);
return Grid::make($builder, function (Grid $grid) {
$grid->model()->orderBy('id', 'desc');
$grid->column('id')->sortable();
$grid->column('user.phone')->copyable();
$grid->column('action')->display(fn ($action) => $action->label())->label();;
$grid->column('change_points')->display(function ($value) {
return bcdiv($value, 100, 2);
});
$grid->column('before_points')->display(function ($value) {
return bcdiv($value, 100, 2);
});
$grid->column('after_points')->display(function ($value) {
return bcdiv($value, 100, 2);
});
$grid->column('remark');
$grid->column('administrator.name', '操作人');
$grid->column('created_at');
$grid->disableActions();
$grid->header(function ($collection) use ($grid) {
return tap(new Row(), function ($row) use ($grid) {
$query = PointLog::query();
$grid->model()->getQueries()->unique()->each(function ($value) use (&$query) {
if (in_array($value['method'], ['paginate', 'get', 'orderBy', 'orderByDesc'], true)) {
return;
}
$query = call_user_func_array([$query, $value['method']], $value['arguments'] ?? []);
});
$totalPoints = (clone $query)->sum('change_points');
$row->column(2, new InfoBox('积分总数', bcdiv($totalPoints, 100, 2), 'fa fa-ticket'));
});
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(false);
$filter->equal('user.phone')->width(3);
$filter->like('administrator.name', '操作人')->width(3);
$filter->in('action')->multipleSelect(PointLogAction::options())->width(3);
$filter->between('created_at')->dateTime()->width(3);
});
return $grid;
});
}
}