278 lines
8.9 KiB
PHP
278 lines
8.9 KiB
PHP
<?php
|
|
|
|
namespace Modules\Mall\Http\Controllers\Admin;
|
|
|
|
use Encore\Admin\Controllers\AdminController;
|
|
use Encore\Admin\Form;
|
|
use Encore\Admin\Grid;
|
|
use Encore\Admin\Layout\Content;
|
|
use Illuminate\Support\MessageBag;
|
|
use Modules\Mall\Facades\Item;
|
|
use Modules\Mall\Http\Controllers\Admin\Action\Order\Audit;
|
|
use Modules\Mall\Http\Controllers\Admin\Action\Order\Delivered;
|
|
use Modules\Mall\Http\Controllers\Admin\Action\Order\Pay;
|
|
use Modules\Mall\Http\Exporter\OrderExporter;
|
|
use Modules\Mall\Models\Address;
|
|
use Modules\Mall\Models\Express;
|
|
use Modules\Mall\Models\GoodsSku;
|
|
use Modules\Mall\Models\Order;
|
|
use Modules\Mall\Models\Shop;
|
|
use Modules\User\Models\User;
|
|
use Modules\Mall\Facades\Order as OrderFacade;
|
|
|
|
class OrderController extends AdminController
|
|
{
|
|
|
|
protected $title = '订单管理';
|
|
|
|
/**
|
|
* Index interface.
|
|
*
|
|
* @param Content $content
|
|
* @return Content
|
|
*/
|
|
public function index(Content $content)
|
|
{
|
|
return $content->header('订单列表')->body($this->grid());
|
|
}
|
|
|
|
/**
|
|
* 已支付
|
|
*
|
|
* @param Content $content [description]
|
|
* @return Content [type] [description]
|
|
* @author 玄尘 2020-03-03
|
|
*/
|
|
public function paid(Content $content)
|
|
{
|
|
return $content->header('待发货')->body($this->grid(Order::STATUS_PAID));
|
|
}
|
|
|
|
/**
|
|
* 已发货
|
|
*
|
|
* @param Content $content [description]
|
|
* @return \Encore\Admin\Layout\Content [type] [description]
|
|
* @author 玄尘 2020-03-03
|
|
*/
|
|
public function delivered(Content $content)
|
|
{
|
|
return $content->header('已发货')->body($this->grid(Order::STATUS_DELIVERED));
|
|
}
|
|
|
|
protected function grid($state = ''): Grid
|
|
{
|
|
$grid = new Grid(new Order());
|
|
|
|
$grid->model()
|
|
->when($state, function ($q) use ($state) {
|
|
$q->where('state', $state);
|
|
})
|
|
->whereIn('type', [Order::TYPE_NORMAL, Order::TYPE_SCORE])
|
|
->with(['shop', 'items', 'user'])
|
|
->withCount('versions');
|
|
|
|
$grid->disableExport(false);
|
|
$grid->exporter(new OrderExporter);
|
|
$grid->disableCreateButton();
|
|
$grid->quickSearch('order_no')->placeholder('搜索订单编号');
|
|
|
|
$grid->filter(function (Grid\Filter $filter) {
|
|
$filter->scope('unPay', '未付款')->unPay();
|
|
$filter->scope('paid', '待发货')->paid();
|
|
$filter->scope('delivered', '已发货')->delivered();
|
|
$filter->scope('signed', '已签收')->signed();
|
|
$filter->scope('completed', '已完成')->completed();
|
|
|
|
$filter->column(1 / 2, function (Grid\Filter $filter) {
|
|
$filter->like('order_no', '订单编号');
|
|
$filter->equal('shop_id', '所属店铺')->select(Shop::pluck('name', 'id'));
|
|
$filter->equal('user_id', '下单用户')->select()->ajax(route('admin.user.users.ajax'));
|
|
$filter->equal('type', '订单类型')->select(Order::TYPE_MAP);
|
|
});
|
|
$filter->column(1 / 2, function (Grid\Filter $filter) {
|
|
$filter->between('created_at', '下单时间')->datetime();
|
|
$filter->between('paid_at', '付款时间')->datetime();
|
|
$filter->between('expired_at', '过期时间')->datetime();
|
|
});
|
|
});
|
|
|
|
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
|
$actions->disableEdit();
|
|
$actions->disableDelete();
|
|
$actions->disableView();
|
|
if ($actions->row->can('pay') && $this->row->type == Order::TYPE_NORMAL) {
|
|
$actions->add(new Pay());
|
|
}
|
|
if ($actions->row->can('deliver')) {
|
|
$actions->add(new Delivered);
|
|
}
|
|
});
|
|
|
|
$grid->model()->with(['shop', 'user.info']);
|
|
|
|
$grid->column('order_no', '订单编号')->display(function () {
|
|
return sprintf('<a href="%s">%s</a>', route('admin.mall.orders.show', $this), $this->order_no);
|
|
});
|
|
$grid->column('user.username', '下单用户')
|
|
->display(function () {
|
|
return $this->user->username."({$this->user->info->nickname})";
|
|
});
|
|
|
|
if ($state == Order::STATUS_PAID) {
|
|
$grid->column('收货地址')
|
|
->display(function () {
|
|
return $this->express ? $this->express->getAllAddress() : '';
|
|
});
|
|
|
|
} else {
|
|
$grid->column('type', '订单类型')->using(Order::TYPE_MAP)->label();
|
|
$grid->column('expired_at', '过期时间')->sortable();
|
|
}
|
|
|
|
|
|
$grid->column('amount', '商品金额');
|
|
$grid->column('freight', '运费');
|
|
$grid->column('qty', '发货数量')
|
|
->display(function () {
|
|
return $this->items()->sum('qty');
|
|
});
|
|
$grid->column('订单金额')->display(function () {
|
|
return $this->total;
|
|
});
|
|
$grid->column('state', '订单状态')
|
|
->display(function () {
|
|
return $this->state_text;
|
|
})
|
|
->label();
|
|
$grid->column('paid_at', '支付时间')->sortable();
|
|
$grid->column('versions_count', '操作日志')->link(function () {
|
|
return route('admin.mall.versions', [
|
|
'model' => get_class($this),
|
|
'key' => $this->id,
|
|
]);
|
|
}, '_self');
|
|
$grid->column('created_at', '下单时间')->sortable();
|
|
|
|
return $grid;
|
|
}
|
|
|
|
/**
|
|
* Notes: 添加订单
|
|
*
|
|
* @Author: 玄尘
|
|
* @Date: 2022/7/29 13:21
|
|
* @return Form
|
|
*/
|
|
public function form(): Form
|
|
{
|
|
$form = new Form(new Order());
|
|
|
|
$form->select('user_id', '用户')
|
|
->options(function ($userId) {
|
|
$user = User::find($userId);
|
|
|
|
if ($user) {
|
|
return [$user->id => $user->username.' ['.$user->info->nickname.']'];
|
|
}
|
|
})
|
|
->ajax(route('admin.user.users.ajax'))
|
|
->load('address_id', route('admin.mall.ajax.address'))
|
|
->required();
|
|
|
|
$form->select('address_id', '收货地址')
|
|
->load('goods_sku_id', route('admin.mall.ajax.goods'))
|
|
->required();
|
|
$form->select('goods_sku_id', '商品')
|
|
->required();
|
|
$form->number('qty', '数量')->default(1);
|
|
|
|
$form->select('express_id', '物流')
|
|
->options(function () {
|
|
return Express::pluck('name', 'id');
|
|
})
|
|
->rules('required', ['required' => '物流公司必须选择']);
|
|
$form->text('express_no', '物流单号')->rules('required');
|
|
|
|
return $form;
|
|
}
|
|
|
|
/**
|
|
* Notes: 获取提交数据
|
|
*
|
|
* @Author: 玄尘
|
|
* @Date: 2022/7/29 14:16
|
|
* @return mixed|void
|
|
* @throws \Exception
|
|
*/
|
|
public function store()
|
|
{
|
|
$user_id = request('user_id', 0);
|
|
$remark = request('remark', '后台录入');
|
|
$address_id = request('address_id', 0);
|
|
$goods_sku_id = request('goods_sku_id', 0);
|
|
$qty = request('qty', 0);
|
|
$express_id = request('express_id');
|
|
$express_no = request('express_no');
|
|
|
|
$user = User::find($user_id);
|
|
$address = Address::find($address_id);
|
|
$goods_sku = GoodsSku::find($goods_sku_id);
|
|
|
|
if (! $goods_sku) {
|
|
$error = new MessageBag([
|
|
'title' => '错误',
|
|
'message' => '未找到商品',
|
|
]);
|
|
|
|
return back()->withInput()->with(compact('error'));
|
|
}
|
|
|
|
$stockData = $user->getStockData();
|
|
|
|
if ($qty > $stockData['residue']) {
|
|
$error = new MessageBag([
|
|
'title' => '错误',
|
|
'message' => '用户库存不足',
|
|
]);
|
|
|
|
return back()->withInput()->with(compact('error'));
|
|
} else {
|
|
$detail = collect();
|
|
$item = new Item($goods_sku, $address, $qty);
|
|
$detail->push($item);
|
|
|
|
$orders = (new OrderFacade)->user($user)
|
|
->remark($remark)
|
|
->type(Order::TYPE_SAMPLE)
|
|
->items($detail)
|
|
->address($address)
|
|
->create();
|
|
|
|
foreach ($orders as $order) {
|
|
$order->pay();//设置已支付
|
|
$order->deliver($express_id, $express_no);//发货
|
|
}
|
|
|
|
admin_toastr('操作完成');
|
|
return redirect()->to('/admin/mall/orders?user_id='.$user->id);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes : 订单详情
|
|
*
|
|
* @Date : 2021/3/16 1:46 下午
|
|
* @Author : < Jason.C >
|
|
* @param string $orderNo 订单的 order_no
|
|
*/
|
|
protected function detail(string $orderNo)
|
|
{
|
|
$order = Order::query()->firstWhere(['order_no' => $orderNo]);
|
|
|
|
return view('mall::admin.order.detail', compact('order'));
|
|
}
|
|
|
|
}
|