allocatr/application/common/command/CheckOrderDispatchGotCommand.php
2025-06-08 11:54:14 +08:00

130 lines
4.8 KiB
PHP

<?php
namespace app\common\command;
use app\admin\controller\AutoDispatchLogic;
use app\admin\model\Order;
use app\admin\model\OrderDispatch;
use app\common\Logic\OrderLogic;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
use think\Exception;
use think\Hook;
class CheckOrderDispatchGotCommand extends Command
{
protected $title = '【自动派单未接单检测,五分钟未接单,重派派单】/【自动派接单五分钟未预约,重新派单】/【自动派单上门时间已到,未完成上门】,每分钟执行一次';
protected function configure()
{
$this->setName('check:dispatch-toget')
->setDescription($this->title);
}
protected function execute(Input $input, Output $output){
$this->_toget();
$this->_toplan();
$this->_toarrive();
$output->info('OVER');
}
//未接单检测
private function _toget(){
try {
$Model = new OrderDispatch();
$now = date('Y-m-d H:i:s', time() - 5 * 60); //创建三十分名以上未接的任务
$OrderLogic = new OrderLogic();
$Model->where('status', OrderDispatch::STATUS_TOGET)
->where('type', 2)
->where('create_time', '<=', $now)
->chunk(100, function ($list) use ($OrderLogic) {
foreach ($list as $item) {
try {
//取消旧单
$OrderLogic->noWorkerCanGetIt($item);
//自动重派新单
$order = Order::get($item->order_id);
AutoDispatchLogic::autoDispatch($order);
echo 'succ:' . $item->id . PHP_EOL;
} catch (Exception $exception) {
echo $exception->getMessage() . PHP_EOL;
}
}
});
}catch (Exception $exception){
echo $exception->getMessage(). PHP_EOL;
Db::name('debug_log')->insert([
'title' => $this->title,
'content' => '未接,错误内容:'.$exception->getMessage().',错误行:'. $exception->getLine().',错误文件:'. $exception->getFile(),
'create_time' => date('Y-m-d H:i:s', time())
]);
}
}
//未预约
private function _toplan(){
try {
$Model = new OrderDispatch();
$now = date('Y-m-d H:i:s', time() - 5 * 60); //创建三十分名以上未接的任务
$OrderLogic = new OrderLogic();
$Model->where('status', OrderDispatch::STATUS_GOTIT)
->where('type', 2)
->where('got_time', '<=', $now)
->chunk(100, function ($list) use ($OrderLogic) {
foreach ($list as $item) {
try {
//取消旧单
$OrderLogic->noWorkerCanGetIt($item);
//自动重派新单
$order = Order::get($item->order_id);
AutoDispatchLogic::autoDispatch($order);
echo 'succ:' . $item->id . PHP_EOL;
} catch (Exception $exception) {
echo $exception->getMessage() . PHP_EOL;
}
}
});
}catch (Exception $exception){
echo $exception->getMessage(). PHP_EOL;
Db::name('debug_log')->insert([
'title' => $this->title,
'content' => '未预约,错误内容:'.$exception->getMessage().',错误行:'. $exception->getLine().',错误文件:'. $exception->getFile(),
'create_time' => date('Y-m-d H:i:s', time())
]);
}
}
//预约时间过了未上门检测
private function _toarrive(){
try {
//自动派单,改为待跟进
$Model = new OrderDispatch();
$now = date('Y-m-d H:i:s');
$count = $Model->whereIn('status', [OrderDispatch::STATUS_PLANIT,OrderDispatch::STATUS_OVERTIME])
->where('type', 2)
->where('follow', 1)
->where('plan_time', '<=', $now)
->update(['follow'=>0]);
echo 'arrive_count:'. $count. PHP_EOL;
}catch (Exception $exception){
echo $exception->getMessage(). PHP_EOL;
Db::name('debug_log')->insert([
'title' => $this->title,
'content' => '超时,错误内容:'.$exception->getMessage().',错误行:'. $exception->getLine().',错误文件:'. $exception->getFile(),
'create_time' => date('Y-m-d H:i:s', time())
]);
}
}
}