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

199 lines
9.3 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\OfflineOrderRevoke;
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->dot());
$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);
}
if ($user->can('dcat.admin.offline_orders.revoke') && $actions->row->isPending()) {
$actions->append(new OfflineOrderRevoke());
}
});
$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->dot());
$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->field('revoked_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));
});
};
}
}