using Oms.Domain.XhsAggregate.Entities; namespace Oms.Application.Shared; /// /// 小红书模块通用辅助。 /// public static class XhsHelper { public const int OnlineThresholdSeconds = 90; public static bool IsAgentOnline(XhsAgent agent, DateTime? now = null) { if (!string.Equals(agent.Status, "online", StringComparison.OrdinalIgnoreCase)) { return false; } if (agent.LastHeartbeatTime == null) { return false; } var current = now ?? DateTime.Now; return (current - agent.LastHeartbeatTime.Value).TotalSeconds <= OnlineThresholdSeconds; } public static string BuildContentPreview(string? content, int maxLen = 200) { if (string.IsNullOrWhiteSpace(content)) { return string.Empty; } var text = content.Trim(); return text.Length <= maxLen ? text : text[..maxLen]; } public static string? ExtractRecipeNotes(string? recipeJson) { if (string.IsNullOrWhiteSpace(recipeJson)) { return null; } try { using var doc = System.Text.Json.JsonDocument.Parse(recipeJson); if (doc.RootElement.TryGetProperty("notes", out var notes)) { var text = notes.GetString(); if (!string.IsNullOrWhiteSpace(text)) { return text.Trim(); } } if (doc.RootElement.TryGetProperty("body", out var body) && body.TryGetProperty("domain", out var domain)) { return domain.GetString()?.Trim(); } } catch { return null; } return null; } public static string SerializeFeedsForPrompt(object? feeds) { if (feeds == null) { return string.Empty; } var json = OmsDocHelper.SerializeJson(feeds) ?? string.Empty; return json.Length <= 12000 ? json : json[..12000]; } /// /// Agent 上报的 browse 结果可能是 { summary, raw },raw 内为 CLI JSON 输出。 /// public static object? NormalizeBrowseTaskResult(object? result) { if (result == null) { return null; } var json = OmsDocHelper.SerializeJson(result); var obj = OmsDocHelper.DeserializeJson>(json); if (obj == null) { return result; } if (obj.ContainsKey("feeds") || obj.ContainsKey("items") || obj.ContainsKey("notes")) { return obj; } if (obj.TryGetValue("raw", out var raw) && raw != null) { var rawText = raw.ToString(); if (!string.IsNullOrWhiteSpace(rawText)) { var parsed = OmsDocHelper.DeserializeJsonObject(rawText); if (parsed != null) { return parsed; } } } return result; } }