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

466 lines
20 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\CreateOrderPackage;
use App\Admin\Actions\Grid\Exports\ShippingOrder as ExportShippingOrder;
use App\Admin\Actions\Grid\OrderSetTag;
use App\Admin\Actions\Show\OrderConsigneeInfo;
use App\Admin\Actions\Show\OrderCreatePackage;
use App\Admin\Actions\Show\OrderPay;
use App\Admin\Actions\Show\OrderReduce;
use App\Admin\Actions\Show\OrderRemark;
use App\Admin\Renderable\Grid\Filter\OrderStatusIn;
use App\Admin\Renderable\PackageProductSimpleTable;
use App\Admin\Repositories\Order;
use App\Models\Order as OrderModel;
use App\Models\OrderLog;
use App\Models\OrderPackage;
use App\Models\OrderProduct;
use App\Models\Tag;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
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;
use Illuminate\Http\Request;
class OrderController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$builder = Order::with(['user', 'tags']);
return Grid::make($builder, function (Grid $grid) {
$grid->column('id')->sortable()->if(function () {
return Admin::user()->can('dcat.admin.orders.show');
})->then(function (Column $column) {
$column->link(function ($value) {
return admin_route('orders.show', ['order' => $value]);
});
});
$grid->tools(function (Grid\Tools $tools) {
//设置规格
if (Admin::user()->can('dcat.admin.orders.export_shipping_orders')) {
$tools->append(new ExportShippingOrder());
}
});
$grid->column('sn')->copyable();
$grid->column('tags', '标签')->display(function ($tags) {
$array = [];
foreach ($this->tags as $key => $tag) {
$array[] = $tag->name;
}
return $array;
})->label();
$grid->column('user.phone')->copyable();
$grid->column('total_amount')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('order_status')->display(function ($value) {
return $this->order_status;
})->using([
0=>'待付款',
1=>'待发货',
2=>'发货中',
3=>'已发货',
9=>'已完成',
10=>'已取消',
])->dot([
0=>'primary',
1=>'warning',
2=>'danger',
3=>'success',
9=>'success',
10=>'#b3b9bf',
])->filter(
OrderStatusIn::make([
0=>'待付款',
1=>'待发货',
2=>'发货中',
3=>'已发货',
9=>'已完成',
10=>'已取消',
])
);
$grid->column('pay_way')->display(function ($v) {
if ($v) {
return '<i class="fa fa-circle" style="font-size: 13px;color: '.$v->color().'"></i>&nbsp;&nbsp;'.$v->getMallOrderText();
}
return '';
});
$grid->column('pay_at');
// $grid->column('consignee_name');
// $grid->column('consignee_telephone');
// $grid->column('consignee_zone');
// $grid->column('consignee_address');
$grid->column('created_at')->sortable();
$grid->model()->orderBy('created_at', 'desc');
$grid->actions(function (Grid\Displayers\Actions $actions) {
if (Admin::user()->can('dcat.admin.orders.show')) {
$actions->disableView(false);
}
if (Admin::user()->can('dcat.admin.orders.tags')) {
$actions->append(new OrderSetTag());
}
if (Admin::user()->can('dcat.admin.distribution_pre_incomes.index')) {
$actions->append('<a href="'.admin_route('distribution_pre_incomes.index', ['order[sn]'=>$actions->row->sn]).'" target="_blank"><i class="fa fa-eye"></i> 预收益明细</a>');
}
// $actions->append(new CreateOrderPackage());
});
$grid->setResource('orders');
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->like('sn')->width(3);
$filter->like('user.phone')->width(3);
$filter->where('tags', function ($query) {
$query->whereHas('tags', function ($q) {
$q->whereIn('tags.id', $this->input);
});
}, '标签')->multipleSelect(Tag::orderTag()->pluck('name', 'id'))->width(3);
$filter->between('created_at')->dateTime()->width(7);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return function (Row $row) use ($id) {
$row->column(5, function ($column) use ($id) {
$builder = OrderModel::with(['user', 'userCoupon', 'tags'])->withCount('afterSales');
$column->row(Show::make($id, $builder, function (Show $show) {
// $show->field('id');
$show->row(function (Show\Row $show) {
$show->width(6)->field('sn');
$show->field('order_status')->as(function ($v) {
return $this->order_status;
})->using([
0=>'待付款',
1=>'待发货',
2=>'发货中',
3=>'已发货',
9=>'已完成',
10=>'已取消',
])->dot([
0=>'primary',
1=>'warning',
2=>'danger',
3=>'success',
9=>'success',
10=>'#b3b9bf',
]);
$show->field('created_at');
$show->width(6)->field('tags')->as(function () {
return $this->tags->pluck('name');
})->label();
$show->field('pay_at');
$show->field('pay_way')->unescape()->as(function () {
$content = '';
if ($this->pay_way) {
$content = '<i class="fa fa-circle" style="font-size: 13px;color: '.$this->pay_way->color().'"></i>&nbsp;&nbsp;'.$this->pay_way->getMallOrderText();
}
return $content;
});
});
$show->row(function (Show\Row $show) {
$show->width(6)->field('consignee_name');
$show->field('consignee_telephone');
$show->width(12)->field('consignee')->width(10, 1)->as(function () {
return $this->consignee_zone . ' '. $this->consignee_address;
});
});
$userCouponId = $show->model()->user_coupon_id;
$show->row(function (Show\Row $show) use ($userCouponId) {
$show->width(6)->field('products_total_amount')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('¥');
$show->field('vip_discount_amount')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('- ¥');
if ($userCouponId) {
$show->field('user_coupon.coupon_name', '优惠券')->label();
$show->field('coupon_discount_amount')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('- ¥');
}
$show->field('shipping_fee')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('+ ¥');
$show->field('reduced_amount')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('- ¥');
$show->field('total_amount')->as(function ($v) {
return bcdiv($v, 100, 2);
})->prepend('¥');
});
$show->row(function (Show\Row $show) use ($userCouponId) {
$show->width(6)->field('sales_value', '总销售值');
$show->field('is_settle', '是否结算')->using([
0=>'未结算',
1=>'已结算',
])->dot([
0=>'danger',
1=>'success',
]);
$show->field('completed_at', '完成时间');
$show->width(12)->field('note')->width(10, 1);
$show->width(12)->field('remark')->width(10, 1);
});
$show->panel()
->tools(function (Show\Tools $tools) use ($show) {
$tools->disableEdit();
$tools->disableDelete();
if ($show->model()->status == OrderModel::STATUS_PENDING) {
if (Admin::user()->can('dcat.admin.orders.reduce')) {
$tools->append(new OrderReduce());
}
if (Admin::user()->can('dcat.admin.orders.pay')) {
$tools->append(new OrderPay());
}
}
$tools->append(new OrderRemark());
if ($show->model()->isPending() || $show->model()->isWaitShipping() || $show->model()->isShipping()) {
$tools->append(new OrderConsigneeInfo());
}
});
}));
});
$row->column(7, function ($column) use ($id) {
$builder = OrderProduct::withCount('afterSales')->where('order_id', $id);
$productGrid = Grid::make($builder, function (Grid $grid) {
$grid->column('name')->display(function ($value) {
if ($this->gift_for_sku_id) {
$value .= '-【赠品】';
}
return $value;
});
// $grid->column('cover')->image(50, 50);
$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('vip_discount_amount', '会员折扣')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('coupon_discount_amount', '优惠券折扣')->display(function ($value) {
return bcdiv($value, 100, 2);
})->prepend('¥');
$grid->column('sales_value', '销售值');
$grid->column('remain_quantity');
$grid->column('product_total_amount')->display(function () {
return bcdiv($this->total_amount, 100, 2);
})->prepend('¥');
$grid->column('afterSalesCount', '售后情况')->display(function ($value) {
return $value > 0 ? 1 : 0;
})->using([
0=>'正常', 1=>'有售后',
])->dot([
0=>'success',
1=>'danger',
])->if(function () {
return $this->afterSalesCount > 0 && Admin::user()->can('dcat.admin.after_sales.index');
})
->then(function (Column $column) {
$column->link(function ($value) {
return admin_url('after-sales?order_product_id='.$this->id);
});
});
$grid->disableActions();
$grid->disablePagination();
$grid->disableRefreshButton();
});
$packageBuilder = OrderPackage::where('order_id', $id);
$packageGrid = Grid::make($packageBuilder, function (Grid $grid) {
$grid->column('shipping_company', '物流公司');
$grid->column('shipping_number', '物流单号');
$grid->column('packageProducts', '包裹商品')->display('包裹商品')->modal(function ($modal) {
$modal->title('商品');
return PackageProductSimpleTable::make(['id'=>$this->id]);
})->setHeaderAttributes(['style' => 'color:#5b69bc']);
$grid->column('created_at', '发货时间');
$grid->column('status', '包裹状态')->using([
OrderPackage::STATUS_WAIT => '揽收',
OrderPackage::STATUS_ONTHEWAY =>'途中',
OrderPackage::STATUS_DISTRIBUTE=>'派送',
OrderPackage::STATUS_CHECK=>'签收',
OrderPackage::STATUS_QUESTION => '疑难',
OrderPackage::STATUS_REFUND => '退签',
OrderPackage::STATUS_REFUSE => '拒签',
OrderPackage::STATUS_OTHER => '其他',
OrderPackage::STATUS_AUTOCHECK => '自动签收',
])->dot([
OrderPackage::STATUS_REFUND =>'danger',
OrderPackage::STATUS_REFUSE =>'danger',
OrderPackage::STATUS_AUTOCHECK =>'success',
OrderPackage::STATUS_CHECK =>'success',
OrderPackage::STATUS_WAIT =>'primary',
OrderPackage::STATUS_ONTHEWAY =>'primary',
OrderPackage::STATUS_DISTRIBUTE=>'primary',
OrderPackage::STATUS_QUESTION =>'warning',
]);
$grid->column('is_failed', '正常')->bool([
0=>true,
1=>false,
]);
$grid->model()->orderBy('created_at', 'desc');
$grid->disableActions();
$grid->disablePagination();
$grid->disableRefreshButton();
});
$logBuilder = OrderLog::with('administrator')->where('order_id', $id);
$orderLogoGrid = Grid::make($logBuilder, function (Grid $grid) {
$grid->column('administrator.name', '操作人');
$grid->column('content', '操作明细')->display(function ($content) {
return $content;
});
$grid->column('created_at', '操作时间');
$grid->model()->orderBy('created_at', 'desc');
$grid->disableActions();
$grid->disablePagination();
$grid->disableRefreshButton();
});
$column->row(Box::make('订单商品', $productGrid));
$packagesBox = Box::make('发货包裹', $packageGrid);
//显示发货动作
$order = OrderModel::findOrFail($id);
if ($order->isWaitShipping() || $order->isShipping()) {
$packagesBox->tool(new OrderCreatePackage($id));
}
$column->row($packagesBox->collapsable());
$logsBox = Box::make('操作记录', $orderLogoGrid);
$column->row($logsBox->collapsable());
});
};
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Order(), function (Form $form) {
$form->display('id');
$form->text('user_id');
$form->text('sn');
$form->text('user_coupon_id');
$form->text('coupon_discount_amount');
$form->text('vip_discount_amount');
$form->text('reduced_amount');
$form->text('shipping_fee');
$form->text('products_total_amount');
$form->text('total_amount');
$form->text('weight');
$form->text('note');
$form->text('remark');
$form->text('pay_sn');
$form->text('pay_way');
$form->text('pay_at');
$form->text('consignee_name');
$form->text('consignee_telephone');
$form->text('consignee_zone');
$form->text('consignee_address');
$form->text('status');
$form->text('completed_at');
$form->display('created_at');
$form->display('updated_at');
});
}
public function orders(Request $request)
{
$sn = $request->input('q');
$query = OrderModel::select('id', 'sn as text');
if ($sn) {
$query->where('sn', 'like', "%$sn%");
return $query->paginate(null);
}
return response()->json($query->get());
}
public function orderProducts(Request $request)
{
$orderId = $request->input('q');
$query = OrderProduct::select('id', 'name as text');
if ($orderId) {
$query->where('order_id', $orderId);
}
return response()->json($query->get());
}
public function exportShippingOrder(Request $request)
{
return response()->streamDownload(function () {
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToBrowser('发货单'.date('Ymd').'.xlsx');
$writer->addRow(WriterEntityFactory::createRowFromArray([
'订单编号', '下单手机号', '商品编号', '商品名称', '数量', '姓名', '电话', '地址', '下单时间', '快递公司', '发货单号', '发货数量',
]));
foreach (OrderModel::with('products', 'user')->needShipping()->cursor() as $order) {
foreach ($order->products as $product) {
if ($product->remain_quantity > 0) {
$writer->addRow(WriterEntityFactory::createRowFromArray([
$order->sn,
$order->user->phone,
$product->sku_id,
$product->name.'数量:'.$product->remain_quantity,
$product->remain_quantity,
$order->consignee_name,
$order->consignee_telephone,
$order->consignee_zone.$order->consignee_address,
$order->created_at->toDateTimeString(),
]));
}
}
};
$writer->close();
});
}
}