Skip to content

Celery-задачи

Конфигурация: narmak/celery.py
Брокер: redis://redis:6379
Backend: redis://redis:6379
Timezone: Europe/Moscow

Запуск воркеров

bash
# Запуск воркера
celery -A narmak worker -l info

# Запуск планировщика (cron-задачи)
celery -A narmak beat -l info

# Мониторинг (Flower)
celery -A narmak flower --port=5555

Полный список задач

app.document

ЗадачаТриггерОписание
sync_paymentscron (ежечасно)Синхронизация платёжных операций с банком
sync_documentssignal / cronСинхронизация документов с МойСклад
sync_document_by_urlsignalСинхронизация конкретного документа по URL
sync_processing_documentscronСинхронизация документов обработки
sync_document_positionssignalСинхронизация позиций документов
set_currency_rate_savecron (ежедневно 10:00)Загрузка курсов валют с ЦБ РФ
set_document_end_date_after_savesignal post_saveУстановка даты окончания документа
set_document_in_payment_registersignal post_saveДобавление документа в реестр платежей
sync_assortimentcronСинхронизация ассортимента с МойСклад
write_off_from_manufacture_positionsignal post_saveСписание материалов при закрытии позиции производства
applicable_processingordersignalПроведение заказа на производство
applicable_production_stage_completionsignalЗавершение этапа производства
set_inventory_applicablemanualПроведение инвентаризации
notificate_chance_manufacture_position_tasksignalУведомление об изменении позиции производства
create_qc_for_manufacture_positionsignal post_saveСоздание задания QC для позиции производства
create_qc_for_supply_positionsignal post_saveСоздание задания QC для приёмки

app.manufacture

ЗадачаТриггерОписание
post_save_work_shiftssignal post_saveПересчёт итоговых часов при изменении смены

app.marketplace

ЗадачаТриггерОписание
sync_wb_orderscron (каждые 15 мин)Загрузка новых заказов WB
sync_ozon_orderscron (каждые 15 мин)Загрузка новых заказов Ozon
update_all_marketplace_stockscron (каждые 2ч)Обновление остатков на всех МП
sync_wb_stocksmanualПринудительное обновление остатков WB

app.contracts

ЗадачаТриггерОписание
check_contract_expirycron (ежедневно)Уведомление об истекающих договорах
update_contract_statussignalОбновление статуса договора

app.bank

ЗадачаТриггерОписание
import_bank_statementmanualИмпорт банковской выписки
match_bank_operationssignalСопоставление операций с документами

app.ats

ЗадачаТриггерОписание
process_ats_applicationsignalОбработка новой заявки кандидата
send_ats_notificationssignalУведомление о статусе заявки

app.counterparty

ЗадачаТриггерОписание
enrich_counterparty_from_dadatasignal post_saveОбогащение данных через DaData

app.plantmaintenance

ЗадачаТриггерОписание
plantmaintenance.generate_ppr_itemsmanual / сервисный вызовГенерация элементов ППР для выбранного графика
plantmaintenance.generate_active_ppr_itemscronГенерация элементов ППР по всем активным графикам
plantmaintenance.check_overdue_inspectionscron (ежедневно)Пометка просроченных планов осмотра
plantmaintenance.check_meter_thresholdscron (ежедневно)Контроль порогов счётчиков и trigger к обслуживанию
plantmaintenance.auto_create_repair_requestscronАвтосоздание заявок по просроченным строкам ППР
plantmaintenance.send_reminderscronНапоминания по просроченным осмотрам, зависшим нарядам и активным простоям

app.meeting

ЗадачаТриггерОписание
send_meeting_remindercron (каждые 5 мин)Напоминание о встрече за 15 мин

app.employee_leads

ЗадачаТриггерОписание
process_new_leadsignalОбработка нового лида и уведомление в Mattermost
lead_automationsignalАвтоматические действия по воронке

Расписание Celery Beat

python
# narmak/celery.py
app.conf.beat_schedule = {
    'update-currency-rates': {
        'task': 'app.document.tasks.set_currency_rate_save',
        'schedule': crontab(hour=10, minute=0),  # ежедневно в 10:00
    },
    'sync-wb-orders': {
        'task': 'app.marketplace.tasks.sync_wb_orders',
        'schedule': crontab(minute='*/15'),  # каждые 15 минут
    },
    'sync-ozon-orders': {
        'task': 'app.marketplace.tasks.sync_ozon_orders',
        'schedule': crontab(minute='*/15'),
    },
    'update-marketplace-stocks': {
        'task': 'app.marketplace.tasks.update_all_marketplace_stocks',
        'schedule': crontab(minute=0, hour='*/2'),  # каждые 2 часа
    },
    'check-contract-expiry': {
        'task': 'app.contracts.tasks.check_contract_expiry',
        'schedule': crontab(hour=9, minute=0),  # ежедневно в 9:00
    },
    'send-meeting-reminders': {
        'task': 'app.meeting.tasks.send_meeting_reminder',
        'schedule': crontab(minute='*/5'),  # каждые 5 минут
    },
}

Мониторинг задач

Flower (веб-интерфейс)

http://localhost:5555/

Показывает:

  • Активные задачи
  • Статистику выполнения
  • Историю последних задач
  • Состояние воркеров

Логи

bash
# Логи воркера
docker-compose logs -f celery

# Фильтр по конкретной задаче
docker-compose logs celery | grep "sync_wb_orders"

Обработка ошибок

Задачи используют стандартный механизм retry Celery:

python
@app.task(bind=True, max_retries=3, default_retry_delay=60)
def sync_wb_orders(self):
    try:
        # логика
        ...
    except Exception as exc:
        logger.error(f"WB orders sync failed: {exc}")
        raise self.retry(exc=exc, countdown=60)

Неуспешные задачи после max_retries попадают в dead letter queue и логируются.

См. также