mirror of
https://github.com/kuaifan/dootask.git
synced 2026-10-30 06:20:44 +00:00
- 删除友盟别名接口、模型、日志清理及 hedeqiang/umeng 依赖,迁移删除 umeng_alias / umeng_logs 表 - 系统配置(默认):通过官方 DooPush 共享通道自助注册租户,按 App 上报的推送 Token 绑定设备 - 自定义:沿用自有 DooPush 应用凭证;关闭:不推送也不记录设备 - 老站点升级后统一为系统配置,原自定义凭证保留 - PushUmengMsg 更名为 PushAppMsg;同步语言包、API 对照表与 ai-kb
102 lines
2.9 KiB
PHP
102 lines
2.9 KiB
PHP
<?php
|
||
namespace App\Tasks;
|
||
|
||
use App\Models\WebSocketDialogMsgRead;
|
||
use App\Module\AppPush\AppPush;
|
||
use Cache;
|
||
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
||
|
||
/**
|
||
* 推送 APP 消息(DooPush)
|
||
*/
|
||
class PushAppMsg extends AbstractTask
|
||
{
|
||
protected $userid = 0;
|
||
protected $array = [];
|
||
protected $endPush = []; // 需要在 end() 方法中处理的延迟推送列表
|
||
|
||
/**
|
||
* @param array|int $userid
|
||
* @param array $array
|
||
*/
|
||
public function __construct($userid, $array = [])
|
||
{
|
||
parent::__construct(...func_get_args());
|
||
$this->userid = $userid;
|
||
$this->array = is_array($array) ? $array : [];
|
||
}
|
||
|
||
public function start()
|
||
{
|
||
if (empty($this->userid) || empty($this->array)) {
|
||
return;
|
||
}
|
||
if (!AppPush::enabled()) {
|
||
return;
|
||
}
|
||
|
||
// 消息ID
|
||
$msgId = isset($this->array['extra']['msg_id']) ? intval($this->array['extra']['msg_id']) : 0;
|
||
|
||
// 处理用户列表
|
||
$userids = is_array($this->userid) ? $this->userid : [$this->userid];
|
||
$directPushUsers = []; // 直接推送的用户
|
||
$delayedPushUsers = []; // 需要延迟推送的用户
|
||
|
||
foreach ($userids as $uid) {
|
||
if ($this->getDelay() > 0) {
|
||
// 已经延迟过,检查消息是否已读
|
||
if ($msgId > 0) {
|
||
$isRead = WebSocketDialogMsgRead::whereMsgId($msgId)
|
||
->whereUserid($uid)
|
||
->whereNotNull('read_at')
|
||
->exists();
|
||
if ($isRead) {
|
||
// 已读,跳过推送
|
||
continue;
|
||
}
|
||
}
|
||
// 未读或无法判断,执行推送
|
||
$directPushUsers[] = $uid;
|
||
} else {
|
||
// 首次推送,检查 PC 端是否活跃
|
||
$lastActive = Cache::get("user_pc_active:{$uid}");
|
||
$isPcActive = $lastActive && (time() - $lastActive) < 60;
|
||
|
||
if ($isPcActive) {
|
||
// PC 端活跃,需要延迟推送
|
||
$delayedPushUsers[] = $uid;
|
||
} else {
|
||
// PC 端不活跃,直接推送
|
||
$directPushUsers[] = $uid;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 直接推送
|
||
if ($directPushUsers) {
|
||
AppPush::pushToUsers($directPushUsers, $this->array);
|
||
}
|
||
|
||
// 创建延迟推送任务
|
||
if ($delayedPushUsers) {
|
||
$this->endPush[] = [
|
||
'userid' => $delayedPushUsers,
|
||
'array' => $this->array,
|
||
];
|
||
}
|
||
}
|
||
|
||
public function end()
|
||
{
|
||
if (empty($this->endPush)) {
|
||
return;
|
||
}
|
||
foreach ($this->endPush as $item) {
|
||
$task = new PushAppMsg($item['userid'], $item['array']);
|
||
$task->delay(10);
|
||
Task::deliver($task);
|
||
}
|
||
}
|
||
}
|