# 定时器
* * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 1 >> /tmp/dexin_timer.log 2>&1
* * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 2 >> /tmp/dexin_timer.log 2>&1
* * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 3 >> /tmp/dexin_timer.log 2>&1
* * * * * cd /home/wwwroot/default/dexin/dragon && /usr/bin/php think order --option 4 >> /tmp/dexin_timer.log 2>&1
<?php
namespace app\cron\command;
use app\common\model\OrderModel;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\Db;
class OrderTimer extends Command
{
protected function configure()
{
$this->setName('order')
->addOption('option', null, Option::VALUE_REQUIRED, 'Option todo')
->setDescription('Auto Deal Order');
}
protected function execute(Input $input, Output $output)
{
$option = $input->getOption('option');
if (!$option) {
return $output->writeln("Please Input Option");
}
switch ($option) {
case 1:
case 'cancel_not_payed_order':
$count = $this->cancel_not_payed_order();
return $output->writeln(date("Y-m-d H:i:s")." Deal Not Payed Order Num:".$count);
break;
case 2:
case 'clear_invalid_order':
$count = $this->clear_invalid_order();
return $output->writeln(date("Y-m-d H:i:s")." Deal Not Invalid Order Num:".$count);
break;
case 3:
case 'auto_done_order':
$count = $this->auto_done_order();
return $output->writeln(date("Y-m-d H:i:s")." Deal Done Order Num:".$count);
break;
case 4:
case 'auto_done_not_receive_order':
$count = $this->auto_done_not_receive_order();
return $output->writeln(date("Y-m-d H:i:s")." Deal Done Not Receive Order Num:".$count);
break;
default:
return $output->writeln("Invalid Option");
break;
}
}
// 清理未支付订单 订单为状态为0
public function clear_invalid_order() {
// 订单超过1个小时未生成,将清理
$order_list = Db::name('order')
->where('status',OrderModel::ORDER_ADD)
->where('add_time','lt',time()-60*60)
->select();
// 遍历清理
Db::startTrans();
$error = 0;
foreach ($order_list as $k => $v) {
// 删除订单商品数据
$r_del = Db::name('order_product')
->where('order_num',$v['order_num'])
->delete();
if (!$r_del && $r_del !== 0) {
$error ++ ;
}
// 删除订单
$r_del = Db::name('order')
->where('id',$v['id'])
->delete();
if (!$r_del && $r_del !== 0) {
$error ++ ;
}
}
if ($error == 0) {
Db::commit();
return count($order_list);
} else {
Db::rollback();
return -1;
}
}
// 清理未支付订单 订单为状态为1
public function cancel_not_payed_order() {
// 订单超过3个小时未支付,将取消
$order_list = Db::name('order')
->where('status',OrderModel::ORDER_CREATE)
->where('create_time','lt',time()-3*60*60)
->select();
// 遍历处理
Db::startTrans();
$error = 0;
foreach ($order_list as $k => $v) {
// 设置订单为取消
$update_data = [
'cancel_ok_time' => time(),
'status' => OrderModel::ORDER_CANCEL
];
$r_update = Db::name('order')
->where('id',$v['id'])
->data($update_data)
->update();
if (!$r_update && $r_update !== 0) {
$error ++ ;
}
}
if ($error == 0) {
Db::commit();
return count($order_list);
} else {
Db::rollback();
return -1;
}
}
// 确认收货订单自动完成 订单为状态为7
public function auto_done_order() {
// 确认收货状态订单,时间超过7天,将自动完成
$order_list = Db::name('order')
->where('status',OrderModel::ORDER_RECEIVE)
->where('receive_ok_time','lt',time()-7*24*60*60)
->select();
// 遍历处理
Db::startTrans();
$error = 0;
foreach ($order_list as $k => $v) {
// 设置订单完成
$update_data = [
'status' => OrderModel::ORDER_DONE
];
$r_update = Db::name('order')
->where('id',$v['id'])
->data($update_data)
->update();
if (!$r_update && $r_update !== 0) {
$error ++ ;
}
}
if ($error == 0) {
Db::commit();
return count($order_list);
} else {
Db::rollback();
return -1;
}
}
// 未收货订单,超过14天,将自动完成,订单状态为6
public function auto_done_not_receive_order() {
$order_list = Db::name('order')
->where('status',OrderModel::ORDER_SEND)
->where('send_time','lt',time()-14*24*60*60)
->select();
// 遍历处理
Db::startTrans();
$error = 0;
foreach ($order_list as $k => $v) {
// 设置订单完成
$update_data = [
'status' => OrderModel::ORDER_DONE
];
$r_update = Db::name('order')
->where('id',$v['id'])
->data($update_data)
->update();
if (!$r_update && $r_update !== 0) {
$error ++ ;
}
}
if ($error == 0) {
Db::commit();
return count($order_list);
} else {
Db::rollback();
return -1;
}
}
}
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [
'app\cron\command\OrderTimer',
'app\cron\command\CommandTest',
];
# tail -n 10 /tmp/dexin_timer.log
2018-09-19 14:04:01 Deal Done Not Receive Order Num:0
2018-09-19 14:04:01 Deal Done Order Num:0
2018-09-19 14:04:01 Deal Not Invalid Order Num:1
2018-09-19 14:04:01 Deal Not Payed Order Num:0