Laravel实现:待付款订单,超48小时自动关闭

实现待付款订单超过48小时自动关闭的功能,需要在系统中添加一个定时任务,周期性地检查待付款订单的创建时间,如果订单的创建时间超过了48小时并且订单状态为待付款,则将订单状态更新为已关闭。

以下是一个简单的示例,展示如何使用 Laravel 的任务调度器来实现这个功能:

1 创建一个新的任务:

php artisan make:task ClosePendingOrders

2 打开生成的 ClosePendingOrders 任务文件,例如 app/Tasks/ClosePendingOrders.php,并在 handle 方法中编写任务逻辑:
48小时:Carbon::now()->subHours(48)

namespace App\Tasks;

use Carbon\Carbon;
use App\Models\Order;
use Illuminate\Support\Facades\Log;

class ClosePendingOrders
{
    public function handle()
    {
        $pendingOrders = Order::where('status', 'pending') // 待付款状态
            ->where('created_at', '<=', Carbon::now()->subHours(48)) // 超过48小时
            ->get();

        foreach ($pendingOrders as $order) {
            $order->update(['status' => 'closed']); // 更新订单状态为已关闭
            Log::info('Closed pending order: '.$order->id);
        }
    }
}

3 在 app/Console/Kernel.php 文件中的 schedule 方法中,添加任务调度器的调度规则:

protected function schedule(Schedule $schedule)
{
    $schedule->job(new ClosePendingOrders)->hourly(); // 将任务设定为每小时执行一次
}

4 运行任务调度器(Cron Job):

php artisan schedule:run

这将会在每个小时的整点时检查待付款订单,如果订单超过48小时,则会将其状态更新为已关闭。请根据你的需求和项目实际情况进行调整。同时,确保你已经正确配置了 Laravel 的任务调度器和日志功能。

本作品采用《CC 协议》,转载必须注明作者和本文链接
温馨提示如果你需要 开通 JetBrains 全家桶账号&& 正式版激活码 推荐: 点击这里免费获取
Laravel00
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 24

查询那条sql直接改成update会不会好点?

1个月前 评论
hhhzzz 1个月前
Laravel00 (楼主) 1个月前
sanders 1个月前
GcHoung

先查出来再循环更新,万一状态已经变化就有问题了。

1个月前 评论
阿珂 1个月前

$order->where('status','pending') ->update(['status' => 'closed']);

1个月前 评论

这个需求或许队列是个更优解 :smirk:

1个月前 评论
DogLoML

用延迟队列

1个月前 评论
高延迟战神 1周前
高延迟战神 1个月前
欧皇降临 1周前

使用chunkById 会不会好一点万一数据量大咋办

1个月前 评论

直接改一个为啥不直接update 要循环

1个月前 评论
sanders

我这么理解哈,一般业务定时在小时级别的,我们处理一般就需要在分钟级别。所以我可能会每分钟都去按匹配条件改一次状态。

前面有人提到了使用延迟队列任务来处理,这是个好办法,但与你目前的处理方法其实不冲突。因为定时任务执行一般会比队列更稳定,作为补救脚本我们认为是必要的。

1个月前 评论

定时任务执行时间不精确,我选择延迟队列

1个月前 评论

这个肯定要用延迟队列的,计划任务不行

1个月前 评论

Order::where(‘status’, ‘pending’)->where(‘created_at’, ‘<=’, Carbon::now()->subHours(48)) ->update(‘status’,’closed’)

2周前 评论
Complicated 2周前
FM (作者) 2周前
Complicated 2周前
自由与温暖是遥不可及的梦想

其实呢 这个问题 还是很好解决的

  1. 定时任务 每半个小时或一个小时 执行一次查询,查询快要到期的数据
  2. 查询到数据之后 根据每个订单的情况放入延迟队列用队列来触发关闭订单
2周前 评论

为啥要先查出来,然后再循环更新呢

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
资深程序猿 @ XX科技
文章
61
粉丝
37
喜欢
249
收藏
565
排名:290
访问:3.2 万
私信
所有博文
社区赞助商