feat(assets): 完成故障维修运维 BI 与 Excel 报表导出
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import { Hono } from 'hono';
|
||||
import { FAULT_OVERVIEW_METRICS, type FaultOverviewMetric } from '../../../shared/assets/faults.js';
|
||||
import type { AuthUser } from '../../auth/types.js';
|
||||
import { analyzeFaults, faultOverview, faultAnalysis, parseFaultQuery, visibleFaults } from './model.js';
|
||||
import { faultWeeklyReport, faultWeeklyAnalysis, parseFaultWeeklyQuery } from './weekly-report.js';
|
||||
import { loadFaults } from './repository.js';
|
||||
import { faultTrend, faultTrendAnalysis, parseFaultTrendQuery } from './trend.js';
|
||||
|
||||
export function createFaultRouter(load = loadFaults) {
|
||||
const app = new Hono<{ Variables: { user: AuthUser } }>();
|
||||
for (const path of ['/trend', '/trend-analysis'] as const) {
|
||||
app.get(path, async c => {
|
||||
const user = c.get('user');
|
||||
if (!user) return c.json({ error: 'Unauthorized' }, 401);
|
||||
let query;
|
||||
try { query = parseFaultTrendQuery(c.req.query()); }
|
||||
catch (error) { return c.json({ error: (error as Error).message }, 400); }
|
||||
try {
|
||||
const data = await load();
|
||||
const rows = visibleFaults(data.rows, user);
|
||||
c.header('Cache-Control', 'no-store');
|
||||
return c.json(path === '/trend' ? faultTrend(rows, query, data.updatedAt) : faultTrendAnalysis(rows, query, data.updatedAt));
|
||||
} catch (error) {
|
||||
console.error('Fault trend failed:', error instanceof Error ? error.message : 'unknown');
|
||||
return c.json({ error: '故障趋势暂时不可用,请稍后重试' }, 503);
|
||||
}
|
||||
});
|
||||
}
|
||||
for (const path of ['/weekly-report', '/weekly-report-analysis'] as const) {
|
||||
app.get(path, async c => {
|
||||
const user = c.get('user');
|
||||
if (!user) return c.json({ error: 'Unauthorized' }, 401);
|
||||
let query;
|
||||
try { query = parseFaultWeeklyQuery(c.req.query()); }
|
||||
catch (error) { return c.json({ error: (error as Error).message }, 400); }
|
||||
try {
|
||||
const data = await load();
|
||||
const rows = visibleFaults(data.rows, user);
|
||||
c.header('Cache-Control', 'no-store');
|
||||
return c.json(path === '/weekly-report' ? faultWeeklyReport(rows, query, data.updatedAt) : faultWeeklyAnalysis(rows, query, data.updatedAt));
|
||||
} catch (error) {
|
||||
console.error('Fault weekly report failed:', error instanceof Error ? error.message : 'unknown');
|
||||
return c.json({ error: '故障运维周报暂时不可用,请稍后重试' }, 503);
|
||||
}
|
||||
});
|
||||
}
|
||||
app.get('/overview', async c => {
|
||||
const user = c.get('user');
|
||||
if (!user) return c.json({ error: 'Unauthorized' }, 401);
|
||||
try {
|
||||
const data = await load();
|
||||
c.header('Cache-Control', 'no-store');
|
||||
return c.json(faultOverview(visibleFaults(data.rows, user), data.updatedAt));
|
||||
} catch (error) {
|
||||
console.error('Fault overview failed:', error instanceof Error ? error.message : 'unknown');
|
||||
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
|
||||
}
|
||||
});
|
||||
app.get('/analysis', async c => {
|
||||
const user = c.get('user');
|
||||
if (!user) return c.json({ error: 'Unauthorized' }, 401);
|
||||
const metric = c.req.query('metric') || '';
|
||||
if (!Object.hasOwn(FAULT_OVERVIEW_METRICS, metric)) return c.json({ error: '无效统计指标' }, 400);
|
||||
try {
|
||||
const data = await load();
|
||||
c.header('Cache-Control', 'no-store');
|
||||
return c.json(faultAnalysis(visibleFaults(data.rows, user), metric as FaultOverviewMetric, data.updatedAt));
|
||||
} catch (error) {
|
||||
console.error('Fault analysis failed:', error instanceof Error ? error.message : 'unknown');
|
||||
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
|
||||
}
|
||||
});
|
||||
app.get('/', async c => {
|
||||
const user = c.get('user');
|
||||
if (!user) return c.json({ error: 'Unauthorized' }, 401);
|
||||
let query;
|
||||
try { query = parseFaultQuery(c.req.query()); }
|
||||
catch (error) { return c.json({ error: (error as Error).message }, 400); }
|
||||
try {
|
||||
const data = await load();
|
||||
c.header('Cache-Control', 'no-store');
|
||||
return c.json(analyzeFaults(visibleFaults(data.rows, user, query.subject), query, data.updatedAt));
|
||||
} catch (error) {
|
||||
console.error('Fault BI query failed:', error instanceof Error ? error.message : 'unknown');
|
||||
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
|
||||
}
|
||||
});
|
||||
return app;
|
||||
}
|
||||
export default createFaultRouter();
|
||||
Reference in New Issue
Block a user