|
|
|
@ -672,17 +672,21 @@ app.get('/api/active-stats', (req, res) => { |
|
|
|
// 从user_active_logs表中查询活跃统计数据
|
|
|
|
const activeStatsSql = ` |
|
|
|
SELECT |
|
|
|
COUNT(DISTINCT user_id) as totalActive, |
|
|
|
SUM(active_duration) as totalDuration |
|
|
|
FROM user_active_logs |
|
|
|
WHERE active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
COUNT(DISTINCT ual.user_id) as totalActive, |
|
|
|
SUM(ual.active_duration) as totalDuration |
|
|
|
FROM user_active_logs ual |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 查询一周内活跃客户数
|
|
|
|
const weekActiveSql = ` |
|
|
|
SELECT COUNT(DISTINCT user_id) as weekActive |
|
|
|
FROM user_active_logs |
|
|
|
WHERE active_date >= DATE(DATE_SUB(NOW(), INTERVAL 7 DAY)) |
|
|
|
SELECT COUNT(DISTINCT ual.user_id) as weekActive |
|
|
|
FROM user_active_logs ual |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date >= DATE(DATE_SUB(NOW(), INTERVAL 7 DAY)) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 并行执行查询
|
|
|
|
@ -829,9 +833,11 @@ app.get('/api/active-stats/details', (req, res) => { |
|
|
|
|
|
|
|
// 查询总数
|
|
|
|
const countSql = ` |
|
|
|
SELECT COUNT(DISTINCT user_id) as total |
|
|
|
FROM user_active_logs |
|
|
|
WHERE active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
SELECT COUNT(DISTINCT ual.user_id) as total |
|
|
|
FROM user_active_logs ual |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 查询客户活跃详情
|
|
|
|
@ -843,8 +849,9 @@ app.get('/api/active-stats/details', (req, res) => { |
|
|
|
SUM(ual.active_duration) as totalDuration, |
|
|
|
MAX(ual.last_active_time) as lastActiveTime |
|
|
|
FROM user_active_logs ual |
|
|
|
LEFT JOIN users u ON ual.user_id = u.userId |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
GROUP BY ual.user_id, u.phoneNumber, u.created_at |
|
|
|
ORDER BY lastActiveTime DESC |
|
|
|
LIMIT ? OFFSET ? |
|
|
|
@ -911,9 +918,11 @@ app.get('/api/active-stats/details/new', (req, res) => { |
|
|
|
|
|
|
|
// 查询总数
|
|
|
|
const countSql = ` |
|
|
|
SELECT COUNT(DISTINCT user_id) as total |
|
|
|
FROM user_active_logs |
|
|
|
WHERE active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
SELECT COUNT(DISTINCT ual.user_id) as total |
|
|
|
FROM user_active_logs ual |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 查询客户活跃详情
|
|
|
|
@ -925,8 +934,9 @@ app.get('/api/active-stats/details/new', (req, res) => { |
|
|
|
SUM(ual.active_duration) as totalDuration, |
|
|
|
MAX(ual.last_active_time) as lastActiveTime |
|
|
|
FROM user_active_logs ual |
|
|
|
LEFT JOIN users u ON ual.user_id = u.userId |
|
|
|
JOIN users u ON ual.user_id = u.userId |
|
|
|
WHERE ual.active_date BETWEEN DATE(?) AND DATE(?) |
|
|
|
AND u.type != 'Colleague' |
|
|
|
GROUP BY ual.user_id, u.phoneNumber, u.created_at |
|
|
|
ORDER BY lastActiveTime DESC |
|
|
|
LIMIT ? OFFSET ? |
|
|
|
@ -1293,6 +1303,7 @@ app.get('/api/stats', (req, res) => { |
|
|
|
WHERE ual.active_date >= DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
|
|
|
|
UNION ALL |
|
|
|
SELECT 'total_active_7d', COUNT(DISTINCT ual.user_id) |
|
|
|
@ -1301,6 +1312,7 @@ app.get('/api/stats', (req, res) => { |
|
|
|
WHERE ual.active_date >= DATE(DATE_SUB(NOW(), INTERVAL 7 DAY)) |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
) |
|
|
|
SELECT * FROM dashboard_stats |
|
|
|
`;
|
|
|
|
@ -2398,6 +2410,7 @@ app.get('/api/active-stats', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 查询时间范围内的活跃客户数
|
|
|
|
@ -2408,6 +2421,7 @@ app.get('/api/active-stats', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 查询总活跃时长
|
|
|
|
@ -2418,6 +2432,7 @@ app.get('/api/active-stats', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 并行执行查询
|
|
|
|
@ -3149,6 +3164,7 @@ app.get('/api/active-stats/details', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
GROUP BY ual.user_id, u.phoneNumber, u.created_at |
|
|
|
ORDER BY lastActiveTime DESC |
|
|
|
LIMIT ? OFFSET ? |
|
|
|
@ -3162,6 +3178,7 @@ app.get('/api/active-stats/details', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 并行执行查询
|
|
|
|
@ -3363,6 +3380,7 @@ app.get('/api/daily-active-stats', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
GROUP BY ual.active_date |
|
|
|
ORDER BY ual.active_date DESC |
|
|
|
`;
|
|
|
|
@ -3447,6 +3465,7 @@ app.get('/api/total-active-duration', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
GROUP BY ual.user_id, u.phoneNumber, u.created_at, u.updated_at |
|
|
|
ORDER BY totalDuration DESC, activeDays DESC, lastActiveTime DESC |
|
|
|
LIMIT ? OFFSET ? |
|
|
|
@ -3460,6 +3479,7 @@ app.get('/api/total-active-duration', (req, res) => { |
|
|
|
WHERE ual.active_date BETWEEN ? AND ? |
|
|
|
AND u.phoneNumber IS NOT NULL AND u.phoneNumber != '' |
|
|
|
AND u.created_at IS NOT NULL |
|
|
|
AND u.type != 'Colleague' |
|
|
|
`;
|
|
|
|
|
|
|
|
// 并行执行查询
|
|
|
|
|