193 lines
9.0 KiB
PHP
193 lines
9.0 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
use App\Admin\Repositories\OfflineOrder as OfflineOrderRepository;
|
|
use App\Admin\Widgets\InfoBox;
|
|
use App\Enums\OfflineOrderStatus;
|
|
use App\Enums\PayWay;
|
|
use App\Models\OfflineOrder;
|
|
use App\Models\OfflineOrderItem;
|
|
use App\Models\Order;
|
|
use App\Models\Store\Store;
|
|
use App\Models\UserInfo;
|
|
use Dcat\Admin\Admin;
|
|
use Dcat\Admin\Grid;
|
|
use Dcat\Admin\Grid\Column;
|
|
use Dcat\Admin\Http\Controllers\AdminController;
|
|
use Dcat\Admin\Layout\Row;
|
|
use Dcat\Admin\Show;
|
|
use Dcat\Admin\Widgets\Box;
|
|
|
|
class OfflineOrderController extends AdminController
|
|
{
|
|
protected function grid()
|
|
{
|
|
Admin::style(
|
|
<<<CSS
|
|
.card-header {
|
|
margin-top: 1.5rem !important;
|
|
margin-bottom: -1rem !important;
|
|
}
|
|
CSS
|
|
);
|
|
|
|
$grid = new Grid(OfflineOrderRepository::with(['user', 'userInfo', 'store']));
|
|
|
|
$grid->model()->orderBy('id', 'desc');
|
|
|
|
$grid->column('id')->sortable()->if(function () {
|
|
return Admin::user()->can('dcat.admin.offline_orders.show');
|
|
})->then(function (Column $column) {
|
|
$column->link(function ($value) {
|
|
return admin_route('offline_orders.show', ['offline_order' => $value]);
|
|
});
|
|
});
|
|
$grid->column('sn')->copyable();
|
|
$grid->column('user_id')->display(function () {
|
|
$nickname = $this->userInfo?->nickname ?? '---';
|
|
$avatar = $this->userInfo?->avatar ?? 'https://via.placeholder.com/45x45.png';
|
|
$phone = $this->user?->phone;
|
|
return <<<HTML
|
|
<img src="{$avatar}" width="45" />
|
|
<span class="label bg-danger">{$nickname}</span>
|
|
<span class="label bg-success">{$phone}</span>
|
|
HTML;
|
|
});
|
|
$grid->column('store_id')->display(fn() => $this->store?->title);
|
|
$grid->column('products_total_amount')->display(fn($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('discount_reduction_amount')->display(fn($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('points_deduction_amount')->display(fn($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('payment_amount')->display(fn($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('status')->display(fn($v) => $v->label());
|
|
$grid->column('payment_method')->display(fn($v) => $v?->dot());
|
|
$grid->column('payment_time');
|
|
$grid->column('created_at');
|
|
|
|
$grid->filter(function (Grid\Filter $filter) {
|
|
$filter->panel();
|
|
$filter->like('sn')->width(3);
|
|
$filter->where('user_id', function ($q) {
|
|
$q->where(function ($q) {
|
|
$q->whereHas('user', fn($q) => $q->where('phone', 'like', '%'.$this->input.'%'))
|
|
->orWhereHas('userinfo', fn($q) => $q->where('nickname', 'like', '%'.$this->input.'%'));
|
|
});
|
|
})->width(3)->placeholder('昵称/手机号');
|
|
$filter->like('payment_sn')->width(3);
|
|
$filter->like('out_trade_no')->width(3);
|
|
$filter->equal('store_id')->select(Store::pluck('title', 'id'))->width(3);
|
|
$filter->where('type', function ($builder) {
|
|
if ($this->input == 1) {
|
|
$builder->where('points_deduction_amount', '>', 0);
|
|
} else {
|
|
$builder->where('points_deduction_amount', 0);
|
|
}
|
|
}, '类型')->select([1 => '积分订单', 2 => '其它订单'])->width(3);
|
|
$filter->in('status')->multipleSelect(OfflineOrderStatus::options())->width(3);
|
|
$filter->equal('payment_method')->select([
|
|
PayWay::WxpayMiniProgram->value => PayWay::WxpayMiniProgram->text(),
|
|
PayWay::None->value => PayWay::None->text(),
|
|
])->width(3);
|
|
$filter->between('created_at')->dateTime()->width(6);
|
|
});
|
|
|
|
$user = Admin::user();
|
|
|
|
$grid->actions(function (Grid\Displayers\Actions $actions) use ($user) {
|
|
if ($user->can('dcat.admin.offline_orders.show')) {
|
|
$actions->disableView(false);
|
|
}
|
|
});
|
|
|
|
$grid->header(function ($collection) use ($grid) {
|
|
return tap(new Row(), function ($row) use ($grid) {
|
|
$query = OfflineOrder::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'] ?? []);
|
|
});
|
|
$productsTotalAmount = (clone $query)->sum('products_total_amount');
|
|
$discountReductionAmount = (clone $query)->sum('discount_reduction_amount');
|
|
$pointsDiscountAmount = (clone $query)->sum('points_deduction_amount');
|
|
$paymentAmount = (clone $query)->sum('payment_amount');
|
|
|
|
$row->column(2, new InfoBox('订单总额', bcdiv($productsTotalAmount, 100, 2), 'fa fa-ticket'));
|
|
$row->column(2, new InfoBox('折扣优惠', bcdiv($discountReductionAmount, 100, 2), 'fa fa-ticket'));
|
|
$row->column(2, new InfoBox('积分抵扣', bcdiv($pointsDiscountAmount, 100, 2), 'fa fa-ticket'));
|
|
$row->column(2, new InfoBox('实付金额', bcdiv($paymentAmount, 100, 2), 'fa fa-ticket'));
|
|
});
|
|
});
|
|
|
|
return $grid;
|
|
}
|
|
|
|
protected function detail($id)
|
|
{
|
|
return function (Row $row) use ($id) {
|
|
$row->column(5, function ($column) use ($id) {
|
|
$builder = OfflineOrderRepository::with(['user', 'userInfo', 'store', 'staff', 'staffInfo']);
|
|
$column->row(Show::make($id, $builder, function (Show $show) {
|
|
$show->row(function (Show\Row $show) {
|
|
$show->width(6)->field('sn');
|
|
$show->width(6)
|
|
->field('phone')
|
|
->as(fn () => $this->user?->phone);
|
|
$show->field('store_id')
|
|
->as(fn () => $this->store?->title);
|
|
$show->field('staff_id')
|
|
->as(fn () => $this->staffInfo?->nickname ?? $this->staff?->phone);
|
|
$show->field('products_total_amount')
|
|
->as(fn ($v) => bcdiv($v, 100, 2))
|
|
->prepend('¥');
|
|
$show->field('discount_reduction_amount')
|
|
->as(fn ($v) => bcdiv($v, 100, 2))
|
|
->prepend('-¥');
|
|
$show->field('points_deduction_amount')
|
|
->as(fn ($v) => bcdiv($v, 100, 2))
|
|
->prepend('-¥');
|
|
$show->field('payment_amount')
|
|
->as(fn ($v) => bcdiv($v, 100, 2))
|
|
->prepend('¥');
|
|
$show->field('status')
|
|
->escape(false)
|
|
->as(fn () => $this->status->label());
|
|
$show->field('payment_method')
|
|
->escape(false)
|
|
->as(fn () => $this->payment_method?->dot());
|
|
$show->field('payment_time');
|
|
$show->field('payment_sn');
|
|
$show->field('out_trade_no');
|
|
$show->field('created_at');
|
|
});
|
|
$show->panel()->tools(function (Show\Tools $tools) use ($show) {
|
|
$tools->disableEdit();
|
|
$tools->disableDelete();
|
|
});
|
|
}));
|
|
});
|
|
$row->column(7, function ($column) use ($id) {
|
|
$orderItemGrid = Grid::make(OfflineOrderItem::with(['productCategory'])->where('order_id', $id), function (Grid $grid) {
|
|
$grid->column('product_category_name')
|
|
->display(fn() => $this->productCategory?->name ?: 'Unknown');
|
|
$grid->column('products_total_amount', '商品总额')
|
|
->display(fn ($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('discount_reduction_amount', '折扣优惠')
|
|
->display(fn ($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('points_deduction_amount', '积分抵扣')
|
|
->display(fn ($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->column('payment_amount', '实付金额')
|
|
->display(fn ($v) => bcdiv($v, 100, 2))->prepend('¥');
|
|
$grid->disableActions();
|
|
$grid->disablePagination();
|
|
$grid->disableRefreshButton();
|
|
});
|
|
|
|
$column->row(Box::make('订单明细', $orderItemGrid));
|
|
});
|
|
};
|
|
}
|
|
}
|