""" ERP 模块信号处理 在任务创建/更新时清除缓存,实现实时推送 """ from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from django.core.cache import cache from .models import InboundBill, OutboundBill import logging logger = logging.getLogger(__name__) # 缓存键名(与 sse_views.py 中的保持一致) CACHE_KEY_TASK_COUNTS = 'erp_task_counts' def invalidate_task_counts_cache(): """清除任务数缓存""" cache.delete(CACHE_KEY_TASK_COUNTS) logger.debug("已清除 ERP 任务数缓存") @receiver(post_save, sender=InboundBill) def inbound_bill_saved(sender, instance, **kwargs): """入库单保存时清除缓存""" # 只要 bound_status 或 is_delete 字段变化,都可能影响任务数,清除缓存 # 任务数统计条件:bound_status=0 且 is_delete=False # 所以任何保存操作都可能影响计数,直接清除缓存 invalidate_task_counts_cache() logger.debug(f"入库单 {instance.number} 保存(bound_status={instance.bound_status}, is_delete={instance.is_delete}),已清除任务数缓存") @receiver(post_save, sender=OutboundBill) def outbound_bill_saved(sender, instance, **kwargs): """出库单保存时清除缓存""" # 只要 bound_status 或 is_delete 字段变化,都可能影响任务数,清除缓存 # 任务数统计条件:bound_status=0 且 is_delete=False # 所以任何保存操作都可能影响计数,直接清除缓存 invalidate_task_counts_cache() logger.debug(f"出库单 {instance.number} 保存(bound_status={instance.bound_status}, is_delete={instance.is_delete}),已清除任务数缓存") @receiver(post_delete, sender=InboundBill) def inbound_bill_deleted(sender, instance, **kwargs): """入库单删除时清除缓存""" invalidate_task_counts_cache() logger.debug(f"入库单 {instance.number} 删除,已清除任务数缓存") @receiver(post_delete, sender=OutboundBill) def outbound_bill_deleted(sender, instance, **kwargs): """出库单删除时清除缓存""" invalidate_task_counts_cache() logger.debug(f"出库单 {instance.number} 删除,已清除任务数缓存")