diff --git a/app/Admin/Controllers/AfterSaleController.php b/app/Admin/Controllers/AfterSaleController.php index dc069b7b..1ff97cc9 100644 --- a/app/Admin/Controllers/AfterSaleController.php +++ b/app/Admin/Controllers/AfterSaleController.php @@ -136,6 +136,7 @@ class AfterSaleController extends AdminController AfterSaleModel::STATE_SHIPPING=>'primary', AfterSaleModel::STATE_FINANCE=>'primary', AfterSaleModel::STATE_FINISH=>'success', + AfterSaleModel::STATE_CANCEL=>'#b3b9bf', ]); // $show->field('order_product.cover')->image(); $show->field('created_at'); diff --git a/app/Admin/Controllers/OrderController.php b/app/Admin/Controllers/OrderController.php index 83f23177..3b835800 100644 --- a/app/Admin/Controllers/OrderController.php +++ b/app/Admin/Controllers/OrderController.php @@ -5,11 +5,15 @@ namespace App\Admin\Controllers; use App\Admin\Actions\Grid\CreateOrderPackage; use App\Admin\Repositories\Order; use App\Models\Order as OrderModel; +use App\Models\OrderLog; +use App\Models\OrderPackage; use App\Models\OrderProduct; use Dcat\Admin\Form; use Dcat\Admin\Grid; 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 @@ -21,35 +25,75 @@ class OrderController extends AdminController */ protected function grid() { - $order = Order::with('user'); - return Grid::make(new Order(), function (Grid $grid) { + $builder = Order::with('user'); + return Grid::make($builder, function (Grid $grid) { $grid->column('id')->sortable(); $grid->column('sn'); $grid->column('user.phone'); // $grid->column('user_coupon_id'); // $grid->column('coupon_discount_amount'); - $grid->column('products_total_amount'); - $grid->column('vip_discount_amount'); - $grid->column('coupon_discount_amount'); - $grid->column('reduced_amount'); - $grid->column('weight'); - $grid->column('shipping_fee'); - $grid->column('total_amount'); + // $grid->column('products_total_amount')->display(function ($value) { + // return bcdiv($value, 100, 2); + // })->prepend('¥'); + // $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('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('remark'); // $grid->column('pay_sn'); $grid->column('pay_way'); - // $grid->column('pay_at'); + $grid->column('pay_at'); // $grid->column('consignee_name'); // $grid->column('consignee_telephone'); // $grid->column('consignee_zone'); // $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('created_at')->sortable(); + $grid->model()->orderBy('created_at', 'desc'); + $grid->actions(function (Grid\Displayers\Actions $actions) { - $actions->append(new CreateOrderPackage()); + $actions->disableView(false); + // $actions->append(new CreateOrderPackage()); }); $grid->filter(function (Grid\Filter $filter) { @@ -67,32 +111,103 @@ class OrderController extends AdminController */ protected function detail($id) { - return Show::make($id, new Order(), function (Show $show) { - $show->field('id'); - $show->field('user_id'); - $show->field('sn'); - $show->field('user_coupon_id'); - $show->field('coupon_discount_amount'); - $show->field('vip_discount_amount'); - $show->field('reduced_amount'); - $show->field('shipping_fee'); - $show->field('products_total_amount'); - $show->field('total_amount'); - $show->field('weight'); - $show->field('note'); - $show->field('remark'); - $show->field('pay_sn'); - $show->field('pay_way'); - $show->field('pay_at'); - $show->field('consignee_name'); - $show->field('consignee_telephone'); - $show->field('consignee_zone'); - $show->field('consignee_address'); - $show->field('status'); - $show->field('completed_at'); - $show->field('created_at'); - $show->field('updated_at'); - }); + return function (Row $row) use ($id) { + $row->column(5, function ($column) use ($id) { + $builder = Order::with(['user', 'userCoupon']); + $column->row(Show::make($id, $builder, function (Show $show) { + $show->field('id'); + $show->field('sn'); + $show->field('total_amount')->as(function ($v) { + return bcdiv($v, 100, 2); + })->prepend('¥'); + $show->field('created_at'); + $show->field('pay_way'); + $show->field('pay_at'); + + $show->field('user.phone'); + $show->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('¥'); + $show->field('userCoupon.coupon_name')->label(); + $show->field('coupon_discount_amount')->as(function ($v) { + return bcdiv($v, 100, 2); + })->prepend('¥'); + $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(''); + $column->row($packagesBox->collapsable()); + $logsBox = Box::make('操作记录', $orderLogoGrid); + $logsBox->tool(''); + $logsBox->tool(''); + $logsBox->tool(''); + $column->row($logsBox->collapsable()); + }); + }; } /** diff --git a/app/Models/Order.php b/app/Models/Order.php index 41178ede..1d01f1bf 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -3,12 +3,14 @@ namespace App\Models; use App\Helpers\Numeric; +use Dcat\Admin\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Model; class Order extends Model { use Filterable; + use HasDateTimeFormatter; public const STATUS_PENDING = 0; // 待付款 public const STATUS_PAID = 1; // 已付款 @@ -75,6 +77,26 @@ class Order extends Model 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'); + } + /** * 仅查询支付过期的订单 */ diff --git a/app/Models/OrderLog.php b/app/Models/OrderLog.php new file mode 100644 index 00000000..2016243e --- /dev/null +++ b/app/Models/OrderLog.php @@ -0,0 +1,24 @@ +belongsTo(Administrator::class, 'administrator_id'); + } + + public function order() + { + return $this->belongsTo(Order::class, 'order_id'); + } +} diff --git a/database/migrations/2021_12_16_210143_create_order_logs_table.php b/database/migrations/2021_12_16_210143_create_order_logs_table.php new file mode 100644 index 00000000..3d77a992 --- /dev/null +++ b/database/migrations/2021_12_16_210143_create_order_logs_table.php @@ -0,0 +1,34 @@ +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'); + } +} diff --git a/resources/lang/zh_CN/order.php b/resources/lang/zh_CN/order.php index f763dba8..b35b53e7 100644 --- a/resources/lang/zh_CN/order.php +++ b/resources/lang/zh_CN/order.php @@ -10,6 +10,9 @@ return [ 'user'=>[ 'phone' => '手机号', ], + 'userCoupon'=>[ + 'coupon_name' => '优惠券', + ], 'sn' => '订单编号', 'user_coupon_id' => '使用优惠券', 'coupon_discount_amount' => '优惠券金额', @@ -29,8 +32,15 @@ return [ 'consignee_zone' => '收货地区', 'consignee_address' => '收货地址', 'status' => '订单状态', + 'shipping_state'=>'物流状态', 'completed_at' => '完成时间', 'created_at' => '下单时间', + 'name'=>'商品名称', + 'cover'=>'商品图', + 'sell_price'=>'价格', + 'quantity' => '数量', + 'after_sale_state'=>'售后状态', + 'product_total_amount'=>'总价', ], 'options' => [ ],