订单管理
parent
3b141e7a27
commit
9edfc4c9f6
|
|
@ -136,6 +136,7 @@ class AfterSaleController extends AdminController
|
||||||
AfterSaleModel::STATE_SHIPPING=>'primary',
|
AfterSaleModel::STATE_SHIPPING=>'primary',
|
||||||
AfterSaleModel::STATE_FINANCE=>'primary',
|
AfterSaleModel::STATE_FINANCE=>'primary',
|
||||||
AfterSaleModel::STATE_FINISH=>'success',
|
AfterSaleModel::STATE_FINISH=>'success',
|
||||||
|
AfterSaleModel::STATE_CANCEL=>'#b3b9bf',
|
||||||
]);
|
]);
|
||||||
// $show->field('order_product.cover')->image();
|
// $show->field('order_product.cover')->image();
|
||||||
$show->field('created_at');
|
$show->field('created_at');
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,15 @@ namespace App\Admin\Controllers;
|
||||||
use App\Admin\Actions\Grid\CreateOrderPackage;
|
use App\Admin\Actions\Grid\CreateOrderPackage;
|
||||||
use App\Admin\Repositories\Order;
|
use App\Admin\Repositories\Order;
|
||||||
use App\Models\Order as OrderModel;
|
use App\Models\Order as OrderModel;
|
||||||
|
use App\Models\OrderLog;
|
||||||
|
use App\Models\OrderPackage;
|
||||||
use App\Models\OrderProduct;
|
use App\Models\OrderProduct;
|
||||||
use Dcat\Admin\Form;
|
use Dcat\Admin\Form;
|
||||||
use Dcat\Admin\Grid;
|
use Dcat\Admin\Grid;
|
||||||
use Dcat\Admin\Http\Controllers\AdminController;
|
use Dcat\Admin\Http\Controllers\AdminController;
|
||||||
|
use Dcat\Admin\Layout\Row;
|
||||||
use Dcat\Admin\Show;
|
use Dcat\Admin\Show;
|
||||||
|
use Dcat\Admin\Widgets\Box;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class OrderController extends AdminController
|
class OrderController extends AdminController
|
||||||
|
|
@ -21,35 +25,75 @@ class OrderController extends AdminController
|
||||||
*/
|
*/
|
||||||
protected function grid()
|
protected function grid()
|
||||||
{
|
{
|
||||||
$order = Order::with('user');
|
$builder = Order::with('user');
|
||||||
return Grid::make(new Order(), function (Grid $grid) {
|
return Grid::make($builder, function (Grid $grid) {
|
||||||
$grid->column('id')->sortable();
|
$grid->column('id')->sortable();
|
||||||
$grid->column('sn');
|
$grid->column('sn');
|
||||||
$grid->column('user.phone');
|
$grid->column('user.phone');
|
||||||
// $grid->column('user_coupon_id');
|
// $grid->column('user_coupon_id');
|
||||||
// $grid->column('coupon_discount_amount');
|
// $grid->column('coupon_discount_amount');
|
||||||
$grid->column('products_total_amount');
|
// $grid->column('products_total_amount')->display(function ($value) {
|
||||||
$grid->column('vip_discount_amount');
|
// return bcdiv($value, 100, 2);
|
||||||
$grid->column('coupon_discount_amount');
|
// })->prepend('¥');
|
||||||
$grid->column('reduced_amount');
|
// $grid->column('vip_discount_amount')->display(function ($value) {
|
||||||
$grid->column('weight');
|
// return bcdiv($value, 100, 2);
|
||||||
$grid->column('shipping_fee');
|
// })->prepend('¥');
|
||||||
$grid->column('total_amount');
|
// $grid->column('coupon_discount_amount')->display(function ($value) {
|
||||||
|
// return bcdiv($value, 100, 2);
|
||||||
|
// })->prepend('¥');
|
||||||
|
// $grid->column('reduced_amount')->display(function ($value) {
|
||||||
|
// return bcdiv($value, 100, 2);
|
||||||
|
// })->prepend('¥');
|
||||||
|
// $grid->column('weight');
|
||||||
|
// $grid->column('shipping_fee')->display(function ($value) {
|
||||||
|
// return bcdiv($value, 100, 2);
|
||||||
|
// })->prepend('¥');
|
||||||
|
$grid->column('total_amount')->display(function ($value) {
|
||||||
|
return bcdiv($value, 100, 2);
|
||||||
|
})->prepend('¥');
|
||||||
// $grid->column('note');
|
// $grid->column('note');
|
||||||
// $grid->column('remark');
|
// $grid->column('remark');
|
||||||
// $grid->column('pay_sn');
|
// $grid->column('pay_sn');
|
||||||
$grid->column('pay_way');
|
$grid->column('pay_way');
|
||||||
// $grid->column('pay_at');
|
$grid->column('pay_at');
|
||||||
// $grid->column('consignee_name');
|
// $grid->column('consignee_name');
|
||||||
// $grid->column('consignee_telephone');
|
// $grid->column('consignee_telephone');
|
||||||
// $grid->column('consignee_zone');
|
// $grid->column('consignee_zone');
|
||||||
// $grid->column('consignee_address');
|
// $grid->column('consignee_address');
|
||||||
$grid->column('status');
|
$grid->column('status')->using([
|
||||||
|
0=>'待支付',
|
||||||
|
1=>'待收货',
|
||||||
|
9=>'已完成',
|
||||||
|
10=>'已取消',
|
||||||
|
])->dot([
|
||||||
|
0=>'primary',
|
||||||
|
1=>'danger',
|
||||||
|
9=>'success',
|
||||||
|
10=>'#b3b9bf',
|
||||||
|
]);
|
||||||
|
$grid->column('shipping_state')->display(function ($v) {
|
||||||
|
if ($this->status <1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return $v;
|
||||||
|
})->using([
|
||||||
|
-1=> '-',
|
||||||
|
0 => '待发货',
|
||||||
|
1 => '发货中',
|
||||||
|
2 => '已完成',
|
||||||
|
])->dot([
|
||||||
|
0 => 'primary',
|
||||||
|
1 => 'danger',
|
||||||
|
2 => 'success',
|
||||||
|
]);
|
||||||
// $grid->column('completed_at');
|
// $grid->column('completed_at');
|
||||||
$grid->column('created_at')->sortable();
|
$grid->column('created_at')->sortable();
|
||||||
|
|
||||||
|
$grid->model()->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
||||||
$actions->append(new CreateOrderPackage());
|
$actions->disableView(false);
|
||||||
|
// $actions->append(new CreateOrderPackage());
|
||||||
});
|
});
|
||||||
|
|
||||||
$grid->filter(function (Grid\Filter $filter) {
|
$grid->filter(function (Grid\Filter $filter) {
|
||||||
|
|
@ -67,32 +111,103 @@ class OrderController extends AdminController
|
||||||
*/
|
*/
|
||||||
protected function detail($id)
|
protected function detail($id)
|
||||||
{
|
{
|
||||||
return Show::make($id, new Order(), function (Show $show) {
|
return function (Row $row) use ($id) {
|
||||||
$show->field('id');
|
$row->column(5, function ($column) use ($id) {
|
||||||
$show->field('user_id');
|
$builder = Order::with(['user', 'userCoupon']);
|
||||||
$show->field('sn');
|
$column->row(Show::make($id, $builder, function (Show $show) {
|
||||||
$show->field('user_coupon_id');
|
$show->field('id');
|
||||||
$show->field('coupon_discount_amount');
|
$show->field('sn');
|
||||||
$show->field('vip_discount_amount');
|
$show->field('total_amount')->as(function ($v) {
|
||||||
$show->field('reduced_amount');
|
return bcdiv($v, 100, 2);
|
||||||
$show->field('shipping_fee');
|
})->prepend('¥');
|
||||||
$show->field('products_total_amount');
|
$show->field('created_at');
|
||||||
$show->field('total_amount');
|
$show->field('pay_way');
|
||||||
$show->field('weight');
|
$show->field('pay_at');
|
||||||
$show->field('note');
|
|
||||||
$show->field('remark');
|
$show->field('user.phone');
|
||||||
$show->field('pay_sn');
|
$show->field('products_total_amount')->as(function ($v) {
|
||||||
$show->field('pay_way');
|
return bcdiv($v, 100, 2);
|
||||||
$show->field('pay_at');
|
})->prepend('¥');
|
||||||
$show->field('consignee_name');
|
$show->field('vip_discount_amount')->as(function ($v) {
|
||||||
$show->field('consignee_telephone');
|
return bcdiv($v, 100, 2);
|
||||||
$show->field('consignee_zone');
|
})->prepend('¥');
|
||||||
$show->field('consignee_address');
|
$show->field('userCoupon.coupon_name')->label();
|
||||||
$show->field('status');
|
$show->field('coupon_discount_amount')->as(function ($v) {
|
||||||
$show->field('completed_at');
|
return bcdiv($v, 100, 2);
|
||||||
$show->field('created_at');
|
})->prepend('¥');
|
||||||
$show->field('updated_at');
|
$show->field('reduced_amount')->as(function ($v) {
|
||||||
});
|
return bcdiv($v, 100, 2);
|
||||||
|
})->prepend('¥');
|
||||||
|
$show->field('shipping_fee')->as(function ($v) {
|
||||||
|
return bcdiv($v, 100, 2);
|
||||||
|
})->prepend('¥');
|
||||||
|
|
||||||
|
|
||||||
|
$show->panel()
|
||||||
|
->tools(function (Show\Tools $tools) use ($show) {
|
||||||
|
$tools->disableEdit();
|
||||||
|
$tools->disableDelete();
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
$row->column(7, function ($column) use ($id) {
|
||||||
|
$builder = OrderProduct::where('order_id', $id);
|
||||||
|
$productGrid = Grid::make($builder, function (Grid $grid) {
|
||||||
|
$grid->column('name');
|
||||||
|
$grid->column('cover')->image(50, 50);
|
||||||
|
$grid->column('sell_price')->display(function ($value) {
|
||||||
|
return bcdiv($value, 100, 2);
|
||||||
|
})->prepend('¥');
|
||||||
|
$grid->column('quantity');
|
||||||
|
$grid->column('product_total_amount')->display(function () {
|
||||||
|
return bcdiv($this->sell_price * $this->quantity, 100, 2);
|
||||||
|
})->prepend('¥');
|
||||||
|
$grid->column('after_sale_state')->using([
|
||||||
|
0=>'正常',
|
||||||
|
1=>'售后中',
|
||||||
|
2=>'售后完成',
|
||||||
|
])->dot([
|
||||||
|
0=>'success',
|
||||||
|
1=>'danger',
|
||||||
|
2=>'primary',
|
||||||
|
]);
|
||||||
|
$grid->disableActions();
|
||||||
|
$grid->disablePagination();
|
||||||
|
$grid->disableRefreshButton();
|
||||||
|
});
|
||||||
|
$packageBuilder = OrderPackage::with('packageProducts')->where('order_id', $id);
|
||||||
|
$packageGrid = Grid::make($packageBuilder, function (Grid $grid) {
|
||||||
|
$grid->column('shipping_company', '物流公司');
|
||||||
|
$grid->column('shipping_number', '物流单号');
|
||||||
|
$grid->column('packageProducts', '包裹商品')->setHeaderAttributes(['style' => 'color:#5b69bc']);
|
||||||
|
$grid->column('created_at', '发货时间');
|
||||||
|
|
||||||
|
$grid->disableActions();
|
||||||
|
$grid->disablePagination();
|
||||||
|
$grid->disableRefreshButton();
|
||||||
|
});
|
||||||
|
$logBuilder = OrderLog::with('administrator')->where('order_id', $id);
|
||||||
|
$orderLogoGrid = Grid::make($logBuilder, function (Grid $grid) {
|
||||||
|
$grid->column('administrator', '操作人');
|
||||||
|
$grid->column('content', '操作明细');
|
||||||
|
$grid->column('craeted_at', '操作时间');
|
||||||
|
|
||||||
|
$grid->disableActions();
|
||||||
|
$grid->disablePagination();
|
||||||
|
$grid->disableRefreshButton();
|
||||||
|
});
|
||||||
|
|
||||||
|
$column->row(Box::make('订单商品', $productGrid));
|
||||||
|
$packagesBox = Box::make('发货包裹', $packageGrid);
|
||||||
|
$packagesBox->tool('<button class="btn btn-sm btn-light shadow-none">发货</button>');
|
||||||
|
$column->row($packagesBox->collapsable());
|
||||||
|
$logsBox = Box::make('操作记录', $orderLogoGrid);
|
||||||
|
$logsBox->tool('<button class="btn btn-sm btn-light shadow-none">改价</button>');
|
||||||
|
$logsBox->tool('<button class="btn btn-sm btn-light shadow-none">支付</button>');
|
||||||
|
$logsBox->tool('<button class="btn btn-sm btn-light shadow-none">修改收货地址</button>');
|
||||||
|
$column->row($logsBox->collapsable());
|
||||||
|
});
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,14 @@
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use App\Helpers\Numeric;
|
use App\Helpers\Numeric;
|
||||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||||
use EloquentFilter\Filterable;
|
use EloquentFilter\Filterable;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
class Order extends Model
|
class Order extends Model
|
||||||
{
|
{
|
||||||
use Filterable;
|
use Filterable;
|
||||||
|
use HasDateTimeFormatter;
|
||||||
|
|
||||||
public const STATUS_PENDING = 0; // 待付款
|
public const STATUS_PENDING = 0; // 待付款
|
||||||
public const STATUS_PAID = 1; // 已付款
|
public const STATUS_PAID = 1; // 已付款
|
||||||
|
|
@ -75,6 +77,26 @@ class Order extends Model
|
||||||
self::PAY_WAY_BALANCE => '余额',
|
self::PAY_WAY_BALANCE => '余额',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下单人
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function user()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class, 'user_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用的优惠券
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function userCoupon()
|
||||||
|
{
|
||||||
|
return $this->hasOne(UserCoupon::class, 'id', 'user_coupon_id');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 仅查询支付过期的订单
|
* 仅查询支付过期的订单
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Models\Admin\Administrator;
|
||||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class OrderLog extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
use HasDateTimeFormatter;
|
||||||
|
|
||||||
|
public function administrator()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Administrator::class, 'administrator_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function order()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Order::class, 'order_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateOrderLogsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('order_logs', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('order_id')->comment('订单ID');
|
||||||
|
$table->unsignedBigInteger('administrator_id')->comment('操作人');
|
||||||
|
$table->string('content')->nullable()->comment('操作内容');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('order_logs');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,9 @@ return [
|
||||||
'user'=>[
|
'user'=>[
|
||||||
'phone' => '手机号',
|
'phone' => '手机号',
|
||||||
],
|
],
|
||||||
|
'userCoupon'=>[
|
||||||
|
'coupon_name' => '优惠券',
|
||||||
|
],
|
||||||
'sn' => '订单编号',
|
'sn' => '订单编号',
|
||||||
'user_coupon_id' => '使用优惠券',
|
'user_coupon_id' => '使用优惠券',
|
||||||
'coupon_discount_amount' => '优惠券金额',
|
'coupon_discount_amount' => '优惠券金额',
|
||||||
|
|
@ -29,8 +32,15 @@ return [
|
||||||
'consignee_zone' => '收货地区',
|
'consignee_zone' => '收货地区',
|
||||||
'consignee_address' => '收货地址',
|
'consignee_address' => '收货地址',
|
||||||
'status' => '订单状态',
|
'status' => '订单状态',
|
||||||
|
'shipping_state'=>'物流状态',
|
||||||
'completed_at' => '完成时间',
|
'completed_at' => '完成时间',
|
||||||
'created_at' => '下单时间',
|
'created_at' => '下单时间',
|
||||||
|
'name'=>'商品名称',
|
||||||
|
'cover'=>'商品图',
|
||||||
|
'sell_price'=>'价格',
|
||||||
|
'quantity' => '数量',
|
||||||
|
'after_sale_state'=>'售后状态',
|
||||||
|
'product_total_amount'=>'总价',
|
||||||
],
|
],
|
||||||
'options' => [
|
'options' => [
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue