# 定时器
* * * * * 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

tp5定时器的更多相关文章

  1. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  2. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  3. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  4. Node+fs+定时器(node-schedule)+MySql

    目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...

  5. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  6. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  7. 转载---javascript 定时器总结

    转载:http://www.jb51.net/article/40193.htm JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延 ...

  8. Node中的定时器详解

    在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时 ...

  9. spring定时器,定时器一次执行两次的问题

    Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...

随机推荐

  1. mix-in class selectors

    语言特性 | Less 中文网 http://lesscss.cn/features/#mixins-feature Mixins "mix-in" properties from ...

  2. geometric mean

    w

  3. iOS 横竖屏适配

    关于横竖屏适配 也没做过,今天读别人的源码,遇到了.为了了解清楚,就系统的学习一下. 一 横竖屏方向枚举 关于横竖屏一共有三种枚举 UIInterfaceOrientation UIInterface ...

  4. 【python】-- Django Form

    Django  Form Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容(自定义样式) 一.F ...

  5. xenserver 模板导出导入

    由于业务需求,新增一台xenserver,需要将原先创建好的模板环境导入到新的母机上面,此处记录一下 1.导出模板 # 获取需要导出的模板uuid [root@localhost ~]# xe tem ...

  6. SQL Server 2008 收缩日志 清空删除大日志文件

    SQL2008 的收缩日志 由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消: (SQL2005) BackupLog DNName ...

  7. Python3.6全栈开发实例[020]

    20.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 1**3 + 5**3 + 3**3 num = i ...

  8. 数据库之MySQL(四)

    数据库中的范式: 第一范式(1NF): 数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性. 例如: userInfo: '山东省烟台市 1318162008' 依照第一范式 ...

  9. 我的Android进阶之旅------>adbd cannot run as root in production builds 的解决方法

    今天用adb root命令时候,报了错误:adbd cannot run as root in production builds C:\Documents and Settings\Administ ...

  10. 【Java工程师之路】[1-2.2]Java10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...