feat: триггер schedule для автоматизаций — ежедневный запуск по МСК

- планировщик server/workers/automation-scheduler.ts (тик 60 сек, все организации)
- защита от дублей: automations.last_scheduled_run_at (миграция 0065), catch-up в пределах суток
- UI: выбор триггера 'По расписанию' и времени запуска в Automations.tsx
- MCP: create_automation/update_automation принимают trigger 'schedule'
- triggerData: { trigger: 'schedule', scheduledAt }
This commit is contained in:
2026-07-24 13:52:03 +03:00
parent c152a670ae
commit b4bded2ffb
8 changed files with 130 additions and 7 deletions

View File

@@ -689,4 +689,17 @@ export class ContentStorage extends DataTablesStorage {
.where(and(eq(automations.id, id), eq(automations.organizationId, organizationId)));
}
// Все активные schedule-автоматизации всех организаций (для планировщика, вызывать в withSuperAdmin)
async getActiveScheduleAutomations(): Promise<Automation[]> {
return db.select().from(automations)
.where(and(eq(automations.trigger, 'schedule'), eq(automations.isActive, true)))
.orderBy(asc(automations.id));
}
async markAutomationScheduledRun(id: number): Promise<void> {
await db.update(automations)
.set({ lastScheduledRunAt: new Date() })
.where(eq(automations.id, id));
}
}