ufutx.dma/app/Console/Commands/RemindDailyStep.php
2026-03-04 14:42:40 +08:00

116 lines
3.8 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Facades\ChatService;
use App\Models\Band;
use App\Models\BatteryHistory;
use App\Models\DailyStep;
use App\Models\Guide;
use App\Models\GuideTemplate;
use App\Models\Order;
use App\Models\ServiceRole;
use Illuminate\Console\Command;
class RemindDailyStep extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'remind:daily_step';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
// 正在进行中的订单
$orders = Order::whereHas("guides", function ($sql) {
$sql->where("phase_date", ">=", date("Y-m-d", strtotime("-1 day")));
})->where("status", Order::STARTING_STATUS)->get();
foreach ($orders as $order) {
// 用户的步数
$step = $this->getDailyStep($order->user_id);
// 餐单模板步数
$templateStep = $this->getTemplateStep($order->id);
if (empty($templateStep))
continue;
// 电量
list($timestamp, $battery_percentage) = $this->getBatteryInfo($order->user_id);
// 获取消息内容
$noticeMsg = $this->getNoticeMsg((string) $order->name, $step, $templateStep, (int) $battery_percentage, $timestamp);
// 发送消息
ChatService::sendImMsgUserToUser($order->id, "系统通知", $noticeMsg, "", "", [ServiceRole::MAIN_COACH, ServiceRole::COACH, ServiceRole::CUSTOMER]);
}
return Command::SUCCESS;
}
public function getDailyStep(int $userId): int
{
$time = date("Y-m-d", strtotime("-1 day"));
$step = DailyStep::where(["user_id" => $userId, "date" => $time])->value("step");
return $step ?: 0;
}
public function getTemplateStep(int $orderId): int
{
$step = 0;
$time = date("Y-m-d", strtotime("-1 day"));
$guide = Guide::where(["order_id" => $orderId, "phase_date" => $time])->first();
if (empty($guide))
return $step;
switch ($guide->phase_title) {
case "装修日":
$type = 0;
break;
case "准备日":
$type = 1;
break;
case "清洁日":
$type = 2;
break;
default:
return $step;
}
$step = GuideTemplate::where(["order_id" => $orderId, "type" => $type])->value("step");
return $step ?: 0;
}
public function getBatteryInfo(int $userId): array
{
$timestamp = $battery_percentage = "";
$band = Band::where(["user_id" => $userId, "status" => 1])->first();
if (empty($band))
return [$timestamp, $battery_percentage];
$log = BatteryHistory::where(["band_id" => $band->id])->orderByDesc("timestamp")->first();
if (empty($log))
return [$timestamp, $battery_percentage];
return [$log->timestamp, $log->battery_percentage];
}
public function getNoticeMsg(string $name, int $step, int $templateStep, int $battery_percentage, string $timestamp): string
{
$status = ($step >= $templateStep) ? "完成了" : "未完成";
$msg = "用户【" . $name . "" . $status . "走路目标:实际步数:" . $step . "步, 目标步数:" . $templateStep . "\n";
if ($battery_percentage) {
$msg .= "最后一次数据同步时间:" . $timestamp . " (当时电量:" . $battery_percentage . "%)";
} else {
$msg .= "没有最近一次手环电量同步信息";
}
return $msg;
}
}