• 你这个现象我已经定位并修了,核心原因是节点匹配和设备映射都有歧义。
已修改:
- 节点识别优先用 id,只有找不到才回退 code,避免子节点被匹配成父节点
ServerService.php (/E:/code/php/Xboard-new/app/Services/ServerService.php#L101)
- 在线设备解析补全 node_key/node_id,并按真实节点键归类
UserOnlineService.php (/E:/code/php/Xboard-new/app/Services/UserOnlineService.php#L43)
- 用户端流量日志设备映射改为按 node_key 精确匹配
StatController.php (/E:/code/php/Xboard-new/app/Http/Controllers/V1/User/StatController.php#L43)
- 管理端同样改为按 node_key 映射
StatController.php (/E:/code/php/Xboard-new/app/Http/Controllers/V2/Admin/StatController.php#L270)
说明:
- 这次不涉及数据库结构变更,不需要 migrate。
- 对管理后台现有统计接口兼容,不会破坏原有 u/d/record_at/server_rate 显示。
- 旧的历史日志如果之前已经按父节点入库,不会自动改名;新流量会按修复后的逻辑记录。
This commit is contained in:
@@ -100,15 +100,23 @@ class ServerService
|
||||
*/
|
||||
public static function getServer($serverId, ?string $serverType)
|
||||
{
|
||||
return Server::query()
|
||||
$baseQuery = Server::query()
|
||||
->when($serverType, function ($query) use ($serverType) {
|
||||
$query->where('type', Server::normalizeType($serverType));
|
||||
})
|
||||
->where(function ($query) use ($serverId) {
|
||||
$query->where('code', $serverId)
|
||||
->orWhere('id', $serverId);
|
||||
})
|
||||
->orderByRaw('CASE WHEN code = ? THEN 0 ELSE 1 END', [$serverId])
|
||||
});
|
||||
|
||||
$serverIdValue = is_scalar($serverId) ? (string) $serverId : '';
|
||||
$isCanonicalInt = preg_match('/^(0|[1-9][0-9]*)$/', $serverIdValue) === 1;
|
||||
|
||||
if ($isCanonicalInt) {
|
||||
$serverById = (clone $baseQuery)->whereKey((int) $serverIdValue)->first();
|
||||
if ($serverById) {
|
||||
return $serverById;
|
||||
}
|
||||
}
|
||||
|
||||
return (clone $baseQuery)
|
||||
->where('code', $serverIdValue)
|
||||
->first();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user