tp5定时器
# 定时器
* * * * * 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定时器的更多相关文章
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- [Java定时器]用Spring Task实现一个简单的定时器.
今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...
- Node+fs+定时器(node-schedule)+MySql
目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...
- 深入理解定时器系列第一篇——理解setTimeout和setInterval
× 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- 转载---javascript 定时器总结
转载:http://www.jb51.net/article/40193.htm JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延 ...
- Node中的定时器详解
在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时 ...
- spring定时器,定时器一次执行两次的问题
Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...
随机推荐
- 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
[BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...
- Apple 企业开发者账号申请记录
1.账号分类 Apple开发者账号分三种,个人,公司,还有企业.个人和公司都称为标准账号. 还有一种是教育机构的账号. 记录:申请日期2013年4月26,看申请周期多长. 个人和公司的就不说了,现在只 ...
- Farm Tour(最小费用最大流模板)
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18150 Accepted: 7023 Descri ...
- Linux下带宽流量工具iftop实践
在Linux/类Unix系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop ...
- coursera 《现代操作系统》 -- 第十三周 期末考试
一些概念在书上不好找,可以通过谷歌搜索,比如搜索中断向量, site:coursera.org 中断向量 3 下列关于中断和异常的叙述中,哪一个是错误的? x86系列处理器提供的4个处理器特权级 ...
- MySQL中自适应哈希索引
自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预.自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SEL ...
- Python3.6全栈开发实例[013]
13.用户输入的信息,如果出现了列表中的敏感词汇,请用*替代. li = ["苍老师","东京热","武藤兰","波多野结衣&qu ...
- 登录案例locustfile.py
# 保存为locustfile.py # coding=utf-8 from locust import HttpLocust, TaskSet, task ''' 实现场景:先登录(只登录一次),然 ...
- springboot 2.0 配置 logback
springboot2.0默认已经引入日志jar依赖,所以直接配置日志信息就可以了. 在application.properties中加入: logging.config=classpath:logb ...
- ABAP发邮件函数
步骤: 一.检查输入参数, (1)未指定文件類別代碼,(2)未指定郵件主題, (3)未指定郵件內容, (4)未指定發送人郵件地址, (5)未指定接收人郵件地址, 二.调用发送功能, (1)创建发送请求 ...