|int $userid * @param array{title?:string, body?:string, extra?:array} $array */ public static function pushToUsers($userid, array $array): void { if (empty($userid) || empty($array)) { return; } $userids = is_array($userid) ? array_values(array_filter($userid)) : [(int) $userid]; if (empty($userids)) { return; } // userid -> badge 数;按 badge 分组合并下发 $byBadge = []; foreach ($userids as $uid) { $badge = WebSocketDialogMsgRead::whereUserid($uid) ->whereSilence(0) ->whereReadAt(null) ->count(); $byBadge[$badge][] = (int) $uid; } foreach ($byBadge as $badge => $batch) { try { $msg = $array; $msg['badge'] = (int) $badge; $resp = DooPushClient::pushToUserids($batch, $msg); if (!$resp->successful()) { info('[DooPush] non-2xx: ' . $resp->status() . ' ' . $resp->body()); } } catch (\Throwable $e) { info('[DooPush] exception: ' . $e->getMessage()); } } } }