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.
244 lines
10 KiB
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 响应
|
|
}
|
|
}
|