consumableImport.js挂载在/api根路径,使用router.use(authMiddleware) 会拦截所有/api/*请求(包括公开路由如/api/auth/login), 导致登录等公开接口返回401。 修复方案:移除router.use(authMiddleware),改为在每个具体路由上 单独添加authMiddleware中间件。
171 lines
5.1 KiB
JavaScript
171 lines
5.1 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { Op } = require('sequelize');
|
|
const { authMiddleware } = require('../middleware/auth');
|
|
const Device = require('../models/Device');
|
|
const Rack = require('../models/Rack');
|
|
const Room = require('../models/Room');
|
|
const User = require('../models/User');
|
|
const Ticket = require('../models/Ticket');
|
|
|
|
router.get('/', authMiddleware, async (req, res) => {
|
|
try {
|
|
const now = new Date();
|
|
const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
const twoWeeksAgo = new Date(now.getTime() - 14 * 24 * 60 * 60 * 1000);
|
|
|
|
const weekDays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
|
|
const dayQueries = [];
|
|
|
|
for (let i = 6; i >= 0; i--) {
|
|
const dayStart = new Date(now);
|
|
dayStart.setDate(now.getDate() - i);
|
|
dayStart.setHours(0, 0, 0, 0);
|
|
|
|
const dayEnd = new Date(dayStart);
|
|
dayEnd.setHours(23, 59, 59, 999);
|
|
|
|
const dayOfWeek = (dayStart.getDay() + 6) % 7;
|
|
|
|
dayQueries.push({
|
|
label: weekDays[dayOfWeek],
|
|
query: Device.count({
|
|
where: {
|
|
createdAt: {
|
|
[Op.gte]: dayStart,
|
|
[Op.lt]: dayEnd,
|
|
},
|
|
},
|
|
}),
|
|
});
|
|
}
|
|
|
|
const dayResults = await Promise.all(dayQueries.map(d => d.query));
|
|
const deviceTrendData = dayQueries.map((d, index) => ({
|
|
label: d.label,
|
|
value: dayResults[index],
|
|
}));
|
|
|
|
const [
|
|
totalDevices,
|
|
faultDevices,
|
|
totalRacks,
|
|
rooms,
|
|
totalUsers,
|
|
activeTickets,
|
|
newDevicesThisWeek,
|
|
newDevicesLastWeek,
|
|
faultDevicesThisWeek,
|
|
faultDevicesLastWeek,
|
|
newUsersThisWeek,
|
|
newUsersLastWeek,
|
|
newTicketsThisWeek,
|
|
newTicketsLastWeek,
|
|
runningDevices,
|
|
maintenanceDevices,
|
|
offlineDevices,
|
|
] = await Promise.all([
|
|
Device.count(),
|
|
Device.count({ where: { status: 'fault' } }),
|
|
Rack.count(),
|
|
Room.findAll(),
|
|
User.count(),
|
|
Ticket.count({ where: { status: 'open' } }),
|
|
Device.count({ where: { createdAt: { [Op.gte]: oneWeekAgo } } }),
|
|
Device.count({ where: { createdAt: { [Op.gte]: twoWeeksAgo, [Op.lt]: oneWeekAgo } } }),
|
|
Device.count({ where: { status: 'fault', updatedAt: { [Op.gte]: oneWeekAgo } } }),
|
|
Device.count({
|
|
where: { status: 'fault', updatedAt: { [Op.gte]: twoWeeksAgo, [Op.lt]: oneWeekAgo } },
|
|
}),
|
|
User.count({ where: { createdAt: { [Op.gte]: oneWeekAgo } } }),
|
|
User.count({ where: { createdAt: { [Op.gte]: twoWeeksAgo, [Op.lt]: oneWeekAgo } } }),
|
|
Ticket.count({ where: { createdAt: { [Op.gte]: oneWeekAgo } } }),
|
|
Ticket.count({ where: { createdAt: { [Op.gte]: twoWeeksAgo, [Op.lt]: oneWeekAgo } } }),
|
|
Device.count({ where: { status: 'running' } }),
|
|
Device.count({ where: { status: 'maintenance' } }),
|
|
Device.count({ where: { status: 'offline' } }),
|
|
]);
|
|
|
|
let deviceGrowth = 0;
|
|
if (newDevicesLastWeek > 0) {
|
|
deviceGrowth = parseFloat(
|
|
(((newDevicesThisWeek - newDevicesLastWeek) / newDevicesLastWeek) * 100).toFixed(1)
|
|
);
|
|
} else if (newDevicesThisWeek > 0) {
|
|
deviceGrowth = 100;
|
|
} else {
|
|
deviceGrowth = 0;
|
|
}
|
|
|
|
let faultTrend = 0;
|
|
if (faultDevicesLastWeek > 0) {
|
|
faultTrend = parseFloat(
|
|
(((faultDevicesThisWeek - faultDevicesLastWeek) / faultDevicesLastWeek) * 100).toFixed(1)
|
|
);
|
|
} else if (faultDevicesThisWeek > 0) {
|
|
faultTrend = 100;
|
|
} else {
|
|
faultTrend = 0;
|
|
}
|
|
|
|
let userGrowth = 0;
|
|
if (newUsersLastWeek > 0) {
|
|
userGrowth = parseFloat(
|
|
(((newUsersThisWeek - newUsersLastWeek) / newUsersLastWeek) * 100).toFixed(1)
|
|
);
|
|
} else if (newUsersThisWeek > 0) {
|
|
userGrowth = 100;
|
|
} else {
|
|
userGrowth = 0;
|
|
}
|
|
|
|
let ticketTrend = 0;
|
|
if (newTicketsLastWeek > 0) {
|
|
ticketTrend = parseFloat(
|
|
(((newTicketsThisWeek - newTicketsLastWeek) / newTicketsLastWeek) * 100).toFixed(1)
|
|
);
|
|
} else if (newTicketsThisWeek > 0) {
|
|
ticketTrend = 100;
|
|
} else {
|
|
ticketTrend = 0;
|
|
}
|
|
|
|
const onlineRate =
|
|
totalDevices > 0 ? ((runningDevices / totalDevices) * 100).toFixed(1) : 100;
|
|
|
|
const totalRooms = rooms.length;
|
|
|
|
const racks = await Rack.findAll();
|
|
const totalPower = racks.reduce((sum, rack) => sum + (rack.currentPower || 0), 0);
|
|
const totalMaxPower = racks.reduce((sum, rack) => sum + (rack.maxPower || 0), 0);
|
|
|
|
res.json({
|
|
totalDevices,
|
|
totalRacks,
|
|
totalRooms,
|
|
totalUsers,
|
|
activeTickets,
|
|
faultDevices,
|
|
deviceGrowth,
|
|
faultTrend,
|
|
userGrowth,
|
|
ticketTrend,
|
|
onlineRate,
|
|
powerUsage: Math.floor(totalPower) || 0,
|
|
totalMaxPower: Math.floor(totalMaxPower) || 10000,
|
|
deviceStatus: {
|
|
running: runningDevices,
|
|
maintenance: maintenanceDevices,
|
|
fault: faultDevices,
|
|
offline: offlineDevices,
|
|
},
|
|
deviceTrendData,
|
|
});
|
|
} catch (error) {
|
|
console.error('获取统计数据失败:', error);
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|