142 lines
3.9 KiB
JavaScript
142 lines
3.9 KiB
JavaScript
// 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;
|
||
};
|