from django.db import models from flower.common import ModelBase class NotifierChannelEnum(models.TextChoices): WECOM_WEBHOOK = "wecom_webhook", "企业微信机器人" class NotificationEventKeyEnum(models.TextChoices): MISSION_CREATED = "mission.created", "任务已创建" MISSION_REPLIED = "mission.replied", "任务有新回应" MISSION_COMPLETED = "mission.completed", "任务已完成" MISSION_REPLY_REJECTED = "mission.reply_rejected", "任务回应已撤销" MISSION_REOPENED = "mission.reopened", "任务已重新打开" MISSION_CANCELLED = "mission.cancelled", "任务已取消" class Notifier(ModelBase): id = models.BigAutoField(primary_key=True) merchant = models.ForeignKey( "basic_info.Merchant", on_delete=models.PROTECT, related_name="notifiers", verbose_name="所属商户", ) name = models.CharField(max_length=100, verbose_name="通知器名称") event_key = models.CharField( max_length=100, choices=NotificationEventKeyEnum.choices, db_index=True, verbose_name="事件标识", ) channel = models.CharField( max_length=50, choices=NotifierChannelEnum.choices, default=NotifierChannelEnum.WECOM_WEBHOOK, verbose_name="通知渠道", ) template_key = models.CharField(max_length=100, verbose_name="模板标识") is_enabled = models.BooleanField(default=True, db_index=True, verbose_name="是否启用") config = models.JSONField(default=dict, blank=True, verbose_name="渠道配置") description = models.TextField(blank=True, null=True, verbose_name="备注描述") def get_template_name(self) -> str: return f"notifier/events/{self.template_key}.md" def get_config_value(self, key: str, default=None): config = self.config or {} return config.get(key, default) def __str__(self): return f"{self.name} ({self.event_key})" class Meta: verbose_name = "通知器" verbose_name_plural = "通知器" constraints = [ models.UniqueConstraint(fields=["merchant", "name"], name="unique_notifier_name_per_merchant"), ] indexes = [ models.Index(fields=["merchant", "event_key", "is_enabled"]), ]