On this page
订单发货
控制器 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');