Files
zyt/server/app/common/command/UpdateAppointmentStatus.php
T
2026-04-01 09:46:25 +08:00

59 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
namespace app\common\command;
use app\common\model\doctor\Appointment;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
use think\facade\Log;
/**
* 挂号单状态自动更新
* - 预约时间已过超过 35 分钟(且未满 8 小时):status -> 4(已过号)
* - 预约时间已过超过 8 小时:status -> 2(已取消)
* - 不处理:status=3(已完成)、未到时间、刚过号未满 35 分钟的单子
*/
class UpdateAppointmentStatus extends Command
{
protected function configure()
{
$this->setName('update_appointment_status')
->setDescription('自动更新挂号单状态:过号超35分钟->4,超8小时->2(已取消)')
->addOption('dry', null, Option::VALUE_NONE, '仅预览不执行');
}
protected function execute(Input $input, Output $output)
{
$dryRun = $input->getOption('dry');
$now = time();
$table = (new Appointment())->getTable();
// 1. 超过8小时 -> 已取消(status=2)
$cancelWhere = "status = 1 AND CONCAT(appointment_date, ' ', IFNULL(appointment_time, '00:00:00')) <= DATE_SUB(NOW(), INTERVAL 8 HOUR)";
$cancelSql = "UPDATE {$table} SET status = 2, update_time = ? WHERE {$cancelWhere}";
$cancelCount = $dryRun ? 0 : Db::execute($cancelSql, [$now]);
// 2. 已过预约时间超过 35 分钟且未满 8 小时 -> 已过号(status=4)
$missedWhere = "status = 1 AND CONCAT(appointment_date, ' ', IFNULL(appointment_time, '00:00:00')) < DATE_SUB(NOW(), INTERVAL 35 MINUTE) AND CONCAT(appointment_date, ' ', IFNULL(appointment_time, '00:00:00')) > DATE_SUB(NOW(), INTERVAL 8 HOUR)";
$missedSql = "UPDATE {$table} SET status = 4, update_time = ? WHERE {$missedWhere}";
$missedCount = $dryRun ? 0 : Db::execute($missedSql, [$now]);
if ($dryRun) {
$cancelPreview = Db::query("SELECT id FROM {$table} WHERE {$cancelWhere}");
$missedPreview = Db::query("SELECT id FROM {$table} WHERE {$missedWhere}");
$output->writeln('[预览] 将改为已取消: ' . count($cancelPreview) . ' 条');
$output->writeln('[预览] 将改为已过号: ' . count($missedPreview) . ' 条');
return;
}
$output->writeln("已取消(超8小时): {$cancelCount} 条");
$output->writeln("已过号: {$missedCount} 条");
Log::info("update_appointment_status: 已取消 {$cancelCount}, 已过号 {$missedCount}");
}
}