Skip to content
关注公众号,获取新课通知

订单发货


控制器 app/controller/admin/Order.php

php
// 发货
   public function ship(){
       $order = request()->Model;
       // 判断订单未付款
       if (!$order->paid_time) {
           ApiException('订单未付款');
       }
       // 判断订单是否关闭
       if ($order->closed) {
           ApiException('订单已关闭');
       }
       // 判断当前订单已发货
       if ($order->ship_status !== 'pending') {
           ApiException('订单已发货');
       }
       
       // 判断是否已退款
       if ($order->refund_status !== 'pending') {
           ApiException('订单已退款');
       }
       
       // 将订单发货状态改为已发货,并存入物流信息
       $param = request()->param();
       $order->ship_status = 'delivered';
       $order->ship_data = [
           'express_company'=>$param['express_company'],
           'express_no'=>$param['express_no'],
           'express_time'=>time()
       ];
       
       $result = $order->save();
       if($result){
       	// 触发自动确认收货任务
           Queue::later(config('cms.order.received_delay'),'autoReceived',[
               'orderId'=>$order->id
           ]);
       }
       
       return showSuccess($result);
   }

配置文件 config/cms.php

php
// 订单相关
   'order'=>[
       // 订单超时1800秒(半小时)后自动关闭
       'delay'=>1800,
       // 自动收货(7天)
       'received_delay'=>604800,
   ],

延时任务(自动确认收货) app/job/autoReceived.php

php
<?php

namespace app\job;

use think\queue\Job;
use think\facade\Db;
class autoReceived{

    public function fire(Job $job, $data){
        //通过这个方法可以检查这个任务已经重试了几次了
        if ($job->attempts() > 3) {
            trace('[自动确认收货] 任务超过三次失败', 'error');
            $job->delete();
        }
        // 拿到当前订单
        $orderId = $data['orderId'];
        $order = \app\model\Order::find($orderId);
        trace('[自动确认收货] 获取订单', 'info');
        // 如果已经确认收货,直接退出
        if ($order->ship_status == 'received') {
            trace('[自动确认收货] 用户已确认收货', 'info');
            return $job->delete();
        }
        // 确认收货
        $order->ship_status = 'received';
        $result = $order->save();

        if ($result) {
            // 如果任务执行成功,删除任务
            trace('[自动确认收货] 任务成功,结束', 'info');
            $job->delete();
        } else {
            // 重新发布任务
            trace('[自动确认收货] 任务失败,重试', 'error');
            $job->release();
        }
    }

    public function failed($data){
        // ...任务达到最大重试次数后,失败了
    }
}

验证器 app/validate/admin/Order.php

php
// 验证规则
protected $rule = [
    // ...
    'id'=>'require|integer|>:0|isExist:Order',
	'express_company|物流公司'=>'require',
    'express_no|物流公司'=>'require',
    // ...
];

protected $scene = [
    // ...
    'ship'=>['id','express_company','express_no'],
];

路由 router/admin.php

php
Route::post('order/:id/ship','admin.Order/ship');