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

209 lines
7.5 KiB
PHP

<?php
namespace App\Admin\Controllers\Store;
use Dcat\Admin\{Form, Grid, Admin, Show};
use Dcat\Admin\Http\Controllers\AdminController;
use App\Models\{Order, OrderProduct, OrderPackage};
use App\Enums\PayWay;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Widgets\{Box, Tab, Card};
use App\Constants\OrderStatus;
class OrderController extends AdminController
{
public $statusMap = [
0 => '待付款',
1 => '待发货',
2 => '发货中',
3 => '已发货',
9 => '已完成',
10 => '已取消',
];
public $statusColor = [
0 => 'primary',
1 => 'warning',
2 => 'danger',
3 => 'success',
9 => 'success',
10 => '#b3b9bf',
];
protected $translation = 'store-order';
protected function grid()
{
$grid = new Grid(Order::with(['user', 'inviter', 'store']));
$user = Admin::user();
$canAdmin = $this->canAdmin();
if (!$canAdmin) {
$stores = $user->stores->pluck('id');
$grid->model()->whereIn('store_id', $stores);
}
$grid->model()->whereNotNull('store_id')->orderBy('created_at', 'desc');
$grid->column('store.title', '门店');
$grid->column('sn')->copyable();
$grid->column('user.phone')->copyable();
$grid->column('inviter.phone')->copyable();
$grid->column('total_amount')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('market_price')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('cost_price')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('sales_value');
$grid->column('order_status')->using($this->statusMap)->dot($this->statusColor);
$grid->column('pay_way')->display(function ($v) {
return $v?->mallText();
})->circleDot(PayWay::colors());
$grid->column('pay_at');
$grid->column('created_at');
$grid->showViewButton($user->can('dcat.admin.store.order.show'));
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('store_id', '门店')->select('api/store')->width(3);
$filter->like('sn')->width(3);
$filter->like('user.phone')->width(3);
$filter->like('inviter.phone')->width(3);
$filter->equal('pay_way')->select([
PayWay::WxpayMiniProgram->value => PayWay::WxpayMiniProgram->text(),
PayWay::Offline->value => PayWay::Offline->text(),
])->width(3);
$filter->where('order_status', function ($q) {
switch ($this->input) {
case OrderStatus::PENDING:
$q->where('status', Order::STATUS_PENDING);
break;
case OrderStatus::WAIT_SHIPPING:
$q->where('status', Order::STATUS_PAID)->where('shipping_state', Order::SHIPPING_STATE_PENDING);
break;
case OrderStatus::SHIPPING:
$q->where('status', Order::STATUS_PAID)->where('shipping_state', Order::SHIPPING_STATE_PROCESSING);
break;
case OrderStatus::SHIPPED:
$q->where('status', Order::STATUS_PAID)->where('shipping_state', Order::SHIPPING_STATE_PROCESSED);
break;
case OrderStatus::COMPLETED:
$q->where('status', Order::STATUS_COMPLETED);
break;
case OrderStatus::CANCELLED:
$q->where('status', Order::STATUS_CANCELLED);
break;
}
})->select([
OrderStatus::PENDING => '待付款',
OrderStatus::WAIT_SHIPPING => '待发货',
OrderStatus::SHIPPING => '发货中',
OrderStatus::SHIPPED => '已发货',
OrderStatus::COMPLETED => '已完成',
OrderStatus::CANCELLED => '已取消'
])->width(3);
$filter->between('created_at')->dateTime()->width(6);
});
return $grid;
}
protected function detail($id)
{
$show = Show::make($id, Order::with(['user', 'inviter']));
$show->field('id');
$show->field('sn');
$show->field('user.phone');
$show->field('inviter.phone');
$show->field('total_amount')->as(function ($value) {
return bcdiv($value, 100, 2);
});
$show->field('market_price')->as(function ($value) {
return bcdiv($value, 100, 2);
});
$show->field('cost_price')->as(function ($value) {
return bcdiv($value, 100, 2);
});
$show->field('sales_value');
$show->field('order_status')->as(function ($v) {
return $this->order_status;
})->using($this->statusMap)->dot($this->statusColor);
$show->field('pay_way')->as(function ($v) {
return $this->pay_way?->mallText();
})->circleDot(PayWay::colors());
$show->field('pay_at');
$show->field('created_at');
$show->panel()->tools(function ($tools) {
$tools->disableEdit();
$tools->disableDelete();
});
$row = new Row();
$row->column(5, $show);
$tab = Tab::make()->withCard();
$tab->add('商品', Card::make($this->gridProduct($id)));
$tab->add('提货记录', Card::make($this->gridPackage($id)));
$row->column(7, $tab);
return $row;
}
protected function gridProduct($id)
{
$grid = Grid::make(OrderProduct::with([]));
$grid->model()->where('order_id', $id);
$grid->column('name');
$grid->column('specs', '规格')->label();
$grid->column('sell_price', '销售价格')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('vip_price', '会员价格')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('quantity');
$grid->column('sales_value');
$grid->column('remain_quantity');
$grid->column('product_total_amount')->display(function () {
return bcdiv($this->total_amount, 100, 2);
})->prepend('¥');
$grid->disableActions();
$grid->disablePagination();
$grid->disableRefreshButton();
return $grid;
}
protected function gridPackage($id)
{
$grid = Grid::make(OrderPackage::with(['inviter', 'orderProducts']));
$grid->model()->where('order_id', $id)->orderBy('created_at', 'desc');
$grid->column('products', '商品')->display(function () {
$html = '';
foreach($this->orderProducts as $item) {
$html .= '<div><span class="label bg-primary">'.$item->name.'</span><span class="label bg-danger">'.$item->pivot->quantity.'</span></div>';
}
return $html;
});
$grid->column('created_at', '提货时间');
$grid->column('inviter.phone', '员工');
$grid->disableActions();
$grid->disablePagination();
$grid->disableRefreshButton();
return $grid;
}
protected function canAdmin()
{
return Admin::user()->isRole('administrator');
}
}