DI2: удаление старого модуля финансов — пул БД и аудит перенесены в finance-di2
- server/finance/ (19 файлов) удалён: пул финансовой БД перенесён в server/finance-di2/db-core.ts, db-client.ts теперь реэкспортирует из ./db-core - Шедулер аудита перенесён в server/finance-di2/audit-scheduler.ts (03:00 МСК, setInterval, без node-cron), запуск из registerDi2Routes с защитой от повторного старта - История аудита DI2 теперь персистентна: загрузка/запись data/finance-audit-history.json в audit-agent.ts (порт из удалённого server/finance/audit.ts) - registerFinanceRoutes убран из server/routes/index.ts, registerDi2Routes остался на его месте - Клиент: удалены pages/finance/, components/finance/, hooks/useFinance.ts, hooks/useColumnLabels.ts, lib/format.ts, pages/salary.tsx; роуты /finance*, /income*, /expenses*, /salary и lazy-импорты убраны из App.tsx - Навигация: «Финансы» в Sidebar и MobileBottomNav ведёт на субапп /di2 (внешняя ссылка), гейт moduleAccess.finance + finance.view сохранён - index.css: удалён блок .hover-elevate/.hover-elevate-2/.active-elevate (использовался только старым модульным DataTable) - FinanceBottomNav.tsx сохранён как референс для этапа 3 (.superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx) - Не тронуто: client-di2/, сиды прав finance.view/manage, finance_access (module-access)
This commit is contained in:
@@ -47,9 +47,33 @@ interface DirectionAudit {
|
||||
treeBreakdown: { name: string; total: number; count: number; isPrimary: boolean }[];
|
||||
}
|
||||
|
||||
const auditHistory: AuditResult[] = [];
|
||||
const HISTORY_PATH = path.join(process.cwd(), "data", "finance-audit-history.json");
|
||||
const MAX_HISTORY = 50;
|
||||
|
||||
let auditHistory: AuditResult[] = [];
|
||||
|
||||
// Персистентность истории аудита (порт из удалённого server/finance/audit.ts):
|
||||
// загрузка при старте модуля, запись после каждого runIntegrityAudit.
|
||||
function loadHistory(): void {
|
||||
if (!fs.existsSync(HISTORY_PATH)) return;
|
||||
try {
|
||||
const parsed = JSON.parse(fs.readFileSync(HISTORY_PATH, "utf-8"));
|
||||
if (Array.isArray(parsed)) auditHistory = parsed;
|
||||
} catch {
|
||||
// повреждённый файл — начинаем с чистой истории
|
||||
}
|
||||
}
|
||||
|
||||
function saveHistory(): void {
|
||||
try {
|
||||
fs.writeFileSync(HISTORY_PATH, JSON.stringify(auditHistory, null, 2), "utf-8");
|
||||
} catch (err) {
|
||||
console.error("[AUDIT-AGENT] Ошибка сохранения истории:", err);
|
||||
}
|
||||
}
|
||||
|
||||
loadHistory();
|
||||
|
||||
function loadJSON(filePath: string): any {
|
||||
try {
|
||||
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
||||
@@ -437,6 +461,7 @@ export async function runIntegrityAudit(): Promise<AuditResult> {
|
||||
|
||||
auditHistory.unshift(result);
|
||||
if (auditHistory.length > MAX_HISTORY) auditHistory.pop();
|
||||
saveHistory();
|
||||
|
||||
console.log(`[AUDIT-AGENT] Аудит завершён: ${result.summary}`);
|
||||
console.log(`[AUDIT-AGENT] Доходы: БД=${income.dbCount} строк, деревья=${income.treeCount}, excluded=${income.excludedCount}, нераспр=${income.uncategorizedCount}, gap=${income.gapCount}`);
|
||||
|
||||
Reference in New Issue
Block a user