You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aquaculture/app/Admin/Controllers/OrderController.php

244 lines
10 KiB

<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Post\OrderReceivedAction; // 引入订单已收货操作
use App\Admin\Actions\Post\OrderRefundAction; // 引入订单退款操作
use App\Admin\Actions\Post\OrderShipAction; // 引入订单发货操作
use App\Admin\Extensions\ReceivedButton; // 引入收货按钮扩展
use App\Admin\Extensions\ShipButton; // 引入发货按钮扩展
use App\Admin\Transforms\OrderDetailTransform; // 引入订单详情转换器
use App\Admin\Transforms\OrderPayTypeTransform; // 引入订单支付方式转换器
use App\Admin\Transforms\OrderShipStatusTransform; // 引入订单物流状态转换器
use App\Admin\Transforms\OrderStatusTransform; // 引入订单状态转换器
use App\Admin\Transforms\OrderTypeTransform; // 引入订单类型转换器
use App\Admin\Transforms\YesNoTransform; // 引入是/否转换器
use App\Enums\OrderShipStatusEnum; // 引入订单物流状态枚举
use App\Enums\OrderStatusEnum; // 引入订单状态枚举
use App\Http\Controllers\Controller; // 引入基础控制器
use App\Models\Order; // 引入订单模型
use App\Models\User; // 引入用户模型
use Encore\Admin\Controllers\HasResourceActions; // 引入资源控制器特性
use Encore\Admin\Facades\Admin; // 引入 Admin 门面
use Encore\Admin\Grid; // 引入网格构建器
use Encore\Admin\Grid\Displayers\Actions; // 引入操作显示器
use Encore\Admin\Grid\Filter; // 引入过滤器
use Encore\Admin\Layout\Content; // 引入内容布局
use Encore\Admin\Show; // 引入展示构建器
use Encore\Admin\Widgets\Form; // 引入表单构建器
use Illuminate\Http\Request; // 引入请求类
use Illuminate\Support\Facades\DB; // 引入数据库门面
use Yansongda\Pay\Pay; // 引入支付处理类
class OrderController extends Controller
{
use HasResourceActions; // 使用资源控制器特性,使该控制器支持资源操作
/**
* 显示订单列表页面.
*
* @param Content $content 内容布局实例
* @return Content 返回内容布局
*/
public function index(Content $content)
{
return $content
->header('订单列表') // 设置页面标题
->description('') // 设置页面描述(可选)
->body($this->grid()); // 渲染网格
}
/**
* 显示订单详情页面.
*
* @param mixed $id 订单 ID
* @param Content $content 内容布局实例
* @return Content 返回内容布局
*/
public function show($id, Content $content)
{
return $content
->header('详情') // 设置页面标题
->description('') // 设置页面描述(可选)
->body($this->detail($id)); // 渲染订单详情
}
/**
* 创建网格构建器.
*
* @return Grid 返回网格实例
*/
protected function grid()
{
$grid = new Grid(new Order); // 创建新的网格实例,基于 Order 模型
$grid->model()->withTrashed()->latest(); // 显示软删除的记录,并按创建时间降序排列
// 定义网格的列
$grid->column('id'); // 显示订单 ID
$grid->column('no', '流水号'); // 显示订单流水号
$grid->column('user.name', '用户'); // 显示用户名称
$grid->column('origin_amount', '订单原价'); // 显示订单原价
$grid->column('post_amount', '邮费'); // 显示邮费
$grid->column('coupon_amount', '优惠'); // 显示优惠金额
$grid->column('amount', '总价'); // 显示总价
$grid->column('status', '状态')->display(function ($status) {
// 如果订单已付款,显示物流状态
if ($status == OrderStatusEnum::PAID) {
return OrderShipStatusTransform::trans($this->ship_status); // 转换并显示物流状态
}
return OrderStatusTransform::trans($status); // 转换并显示订单状态
});
$grid->column('type', '订单类型')->display(function ($type) {
return OrderTypeTransform::trans($type); // 转换并显示订单类型
});
$grid->column('pay_type', '支付方式')->display(function ($type) {
return OrderPayTypeTransform::trans($type); // 转换并显示支付方式
});
$grid->column('pay_no', '支付流水号'); // 显示支付流水号
$grid->column('paid_at', '支付时间'); // 显示支付时间
$grid->column('consignee_name', '收货人姓名'); // 显示收货人姓名
$grid->column('consignee_phone', '收货人手机'); // 显示收货人手机
$grid->column('created_at', '创建时间'); // 显示创建时间
// 禁用行选择器和创建按钮
$grid->disableRowSelector();
$grid->disableCreateButton();
// 自定义操作按钮
$grid->actions(function (Grid\Displayers\DropdownActions $actions) {
$order = $actions->row; // 获取当前行的订单数据
// 根据订单状态添加相应的操作按钮
if ($order->status == OrderStatusEnum::APPLY_REFUND) {
$actions->add(new OrderRefundAction()); // 添加退款操作按钮
} elseif ($order->status == OrderStatusEnum::PAID) {
if ($order->ship_status == OrderShipStatusEnum::PENDING) {
$actions->add(new OrderShipAction()); // 添加发货操作按钮
} elseif ($order->ship_status == OrderShipStatusEnum::DELIVERED) {
$actions->add(new OrderReceivedAction()); // 添加确认收货操作按钮
}
}
$actions->disableEdit(); // 禁用编辑按钮
});
// 添加过滤器
$grid->filter(function (Filter $filter) {
$filter->disableIdFilter(); // 禁用 ID 过滤
$filter->like('no', '流水号'); // 添加流水号模糊查询
$filter->where(function ($query) {
// 根据用户名称查询用户 ID
$users = User::query()->where('name', 'like', "%{$this->input}%")->pluck('id');
$query->whereIn('user_id', $users->all()); // 根据用户 ID 查询订单
}, '用户');
});
return $grid; // 返回构建好的网格
}
/**
* 创建订单详情展示构建器.
*
* @param mixed $id 订单 ID
* @return Show 返回展示实例
*/
protected function detail($id)
{
$show = new Show(Order::query()->withTrashed()->findOrFail($id)); // 查找并显示指定 ID 的订单记录
// 定义详情展示的字段
$show->field('id'); // 显示订单 ID
$show->field('no', '流水号'); // 显示订单流水号
$show->field('user', '用户')->as(function ($user) {
return optional($user)->name; // 显示用户名称
});
$show->divider(); // 添加分隔线
$show->field('amount', '总计'); // 显示订单总计
$show->field('status', '状态')->as(function ($status) {
// 如果订单已付款,显示物流状态
if ($status == OrderStatusEnum::PAID) {
return OrderShipStatusTransform::trans($this->ship_status); // 转换并显示物流状态
}
return OrderStatusTransform::trans($status); // 转换并显示订单状态
});
$show->field('type', '订单类型')->as(function ($type) {
return OrderTypeTransform::trans($type); // 转换并显示订单类型
});
$show->divider(); // 添加分隔线
$show->field('express_company', '物流公司'); // 显示物流公司
$show->field('express_no', '物流单号'); // 显示物流单号
$show->divider(); // 添加分隔线
$show->field('consignee_name', '收货人'); // 显示收货人姓名
$show->field('consignee_phone', '收货人手机'); // 显示收货人手机
$show->field('consignee_address', '收货地址'); // 显示收货地址
$show->divider(); // 添加分隔线
$show->field('pay_type', '支付类型')->as(function ($type) {
return OrderPayTypeTransform::trans($type); // 转换并显示支付类型
});
$show->field('refund_reason', '退款理由'); // 显示退款理由
$show->field('pay_trade_no', '退款单号'); // 显示退款单号
$show->field('pay_no', '支付单号'); // 显示支付单号
$show->field('paid_at', '支付时间'); // 显示支付时间
$show->field('created_at', '创建时间'); // 显示创建时间
$show->field('updated_at', '修改时间'); // 显示修改时间
// 显示订单详情
$show->details('详情', function (Grid $details) {
$details->column('id'); // 显示订单详情 ID
$details->column('product.name', '商品名字'); // 显示商品名称
$details->column('price', '单价'); // 显示单价
$details->column('number', '数量'); // 显示数量
$details->column('is_commented', '是否评论')->display(function ($is) {
return YesNoTransform::trans($is); // 转换并显示是否评论
});
$details->column('total', '小计'); // 显示小计
// 禁用行选择器、创建按钮、过滤器和操作按钮
$details->disableRowSelector();
$details->disableCreateButton();
$details->disableFilter();
$details->disableActions();
});
return $show; // 返回构建好的详情视图
}
/**
* 删除指定订单.
*
* @param mixed $id 订单 ID
* @return \Illuminate\Http\JsonResponse 返回 JSON 响应
*/
public function destroy($id)
{
try {
DB::transaction(function () use ($id) {
$order = Order::withTrashed()->findOrFail($id); // 查找指定 ID 的订单
$order->details()->delete(); // 删除订单详情
$order->forceDelete(); // 强制删除订单
});
$data = [
'status' => true,
'message' => trans('admin.delete_succeeded'), // 返回成功消息
];
} catch (\Throwable $e) {
$data = [
'status' => false,
'message' => trans('admin.delete_failed') . $e->getMessage(), // 返回失败消息及错误信息
];
}
return response()->json($data); // 返回 JSON 响应
}
}