// src/views/AgentChat/utils/sessionUtils.js // 会话管理工具函数 /** * 格式化日期为显示标签 * @param {Date} date - 日期对象 * @param {Date} today - 今天的日期 * @returns {string} 格式化后的日期标签 */ const formatDateLabel = (date, today) => { const daysDiff = Math.floor((today - date) / (1000 * 60 * 60 * 24)); if (daysDiff === 0) { return '今天'; } else if (daysDiff === 1) { return '昨天'; } else if (daysDiff < 7) { const weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; return weekDays[date.getDay()]; } else { // 超过一周,显示具体日期 return `${date.getMonth() + 1}月${date.getDate()}日`; } }; /** * 获取日期的纯日期字符串(用于分组 key) * @param {Date} date - 日期对象 * @returns {string} YYYY-MM-DD 格式的日期字符串 */ const getDateKey = (date) => { return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; }; /** * 按日期分组会话列表(新版本 - 按具体日期分组) * * @param {Array} sessions - 会话列表 * @returns {Array} 分组后的会话数组 [{ dateKey, label, sessions, date }] * * @example * const groups = groupSessionsByDate(sessions); * // 返回: [ * // { dateKey: '2025-11-30', label: '今天', sessions: [...], date: Date }, * // { dateKey: '2025-11-29', label: '昨天', sessions: [...], date: Date }, * // ... * // ] */ export const groupSessionsByDate = (sessions) => { if (!sessions || sessions.length === 0) { return []; } const today = new Date(); today.setHours(0, 0, 0, 0); // 按日期分组到 Map const groupMap = new Map(); sessions.forEach((session) => { const sessionDate = new Date(session.created_at || session.timestamp); if (isNaN(sessionDate.getTime())) { // 无效日期,归到今天 const todayKey = getDateKey(today); if (!groupMap.has(todayKey)) { groupMap.set(todayKey, { dateKey: todayKey, label: '今天', sessions: [], date: today, }); } groupMap.get(todayKey).sessions.push(session); return; } const dateOnly = new Date(sessionDate); dateOnly.setHours(0, 0, 0, 0); const dateKey = getDateKey(dateOnly); if (!groupMap.has(dateKey)) { groupMap.set(dateKey, { dateKey, label: formatDateLabel(dateOnly, today), sessions: [], date: dateOnly, }); } groupMap.get(dateKey).sessions.push(session); }); // 转换为数组并按日期降序排序 const groups = Array.from(groupMap.values()).sort((a, b) => b.date - a.date); // 每个分组内部按时间降序排序 groups.forEach((group) => { group.sessions.sort((a, b) => { const dateA = new Date(a.created_at || a.timestamp); const dateB = new Date(b.created_at || b.timestamp); return dateB - dateA; }); }); return groups; }; /** * 旧版分组函数(保留兼容性) * @deprecated 请使用 groupSessionsByDate 替代 */ export const groupSessionsByDateLegacy = (sessions) => { const today = new Date(); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); const weekAgo = new Date(today); weekAgo.setDate(weekAgo.getDate() - 7); const groups = { today: [], yesterday: [], thisWeek: [], older: [], }; sessions.forEach((session) => { const sessionDate = new Date(session.created_at || session.timestamp); const daysDiff = Math.floor((today - sessionDate) / (1000 * 60 * 60 * 24)); if (daysDiff === 0) { groups.today.push(session); } else if (daysDiff === 1) { groups.yesterday.push(session); } else if (daysDiff <= 7) { groups.thisWeek.push(session); } else { groups.older.push(session); } }); return groups; };