# 定时器
* * * * * 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. 《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?

    原创文章,欢迎转载.转载请注明:关东升的博客 类和结构体非常相似,很多情况下没有区别.如果你是设计人员在进行系统设计时候,是将某种类型设计成为类还是结构体? 类和结构体异同: 类和结构体都有如下功能: ...

  2. 清空javascript数组数据

    var arrayObj = new Array(); arrayObj.splice(0, arrayObj.length);//清空数组数据

  3. J - 迷宫问题(BFS)

    J - 迷宫问题 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descriptio ...

  4. Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式

    Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...

  5. python 时间模块小结

    python有两个重要的时间模块,分别是time和datetime time模块 表示时间的几种方法 时间元组 time.struct_time( tm_year=2016, tm_mon=7, tm ...

  6. python模块学习(三)

    logging模块 简单应用 import logging  logging.debug('debug message')  logging.info('info message')  logging ...

  7. linux 安装zip/unzip/g++/gdb/vi/vim等软件

    近期公司新配置了一台64位云server.去部署的时候发现,没有安装zip/unzip压缩解压软件. 于是仅仅好自己安装这两个软件.linux最好用的还是yum. 两个指令就安装好了. 首先把软件安装 ...

  8. Python 学习之旅

    流程图 第一章  Python简介 第二章  Python基础 第三章  流程控制 第四章  字符编码 第五章  文件处理 第六章  函数 第七章 模块与包 第八章 面向对象 第九章 异常处理 第十章 ...

  9. PAAS、IAAS和SAAS区别

    IaaS: Infrastructure-as-a-Service(基础设施即服务) 有了IaaS,你可以将硬件外包到别的地方去.IaaS公司会提供场外服务器,存储和网络硬件,你可以租用.节省了维护成 ...

  10. 在eclipse中构建solr项目+添加core+整合mysql+添加中文分词器

    最近在研究solr,这里只记录一下eclipse中构建solr项目,添加core,整合mysql,添加中文分词器的过程. 版本信息:solr版本6.2.0+tomcat8+jdk1.8 推荐阅读:so ...