dashboard.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { Router } from 'express';
  2. import { query } from 'express-validator';
  3. import { authenticate } from '../middleware/auth.js';
  4. import { asyncHandler } from '../middleware/error.js';
  5. import { validateRequest } from '../middleware/validate.js';
  6. import { WorkDayStatisticsService } from '../services/WorkDayStatisticsService.js';
  7. const router = Router();
  8. const workDayStatisticsService = new WorkDayStatisticsService();
  9. router.use(authenticate);
  10. /**
  11. * GET /api/dashboard/trend
  12. * 获取数据趋势(直接调用 Node 统计服务,不再经 Python 转发)
  13. * 按平台分组返回,每个平台一条曲线
  14. *
  15. * 查询参数:
  16. * - days: 天数(默认30天)
  17. * - account_id: 账号ID(可选,不填则查询所有平台)
  18. */
  19. router.get(
  20. '/trend',
  21. [
  22. query('days').optional().isInt({ min: 1, max: 30 }).withMessage('days 必须是 1-30 之间的整数'),
  23. query('account_id').optional().isInt().withMessage('account_id 必须是整数'),
  24. validateRequest,
  25. ],
  26. asyncHandler(async (req, res) => {
  27. const days = req.query.days ? parseInt(req.query.days as string) : 30;
  28. const accountId = req.query.account_id ? parseInt(req.query.account_id as string) : undefined;
  29. const data = await workDayStatisticsService.getTrend(req.user!.userId, {
  30. days,
  31. accountId,
  32. });
  33. return res.json({ success: true, data });
  34. })
  35. );
  36. export default router;