package alarm import ( "context" "fmt" "log/slog" "bj_power_mes/constants" "bj_power_mes/ent" "bj_power_mes/ent/alarm" "bj_power_mes/internal/eventbus" ) // Service 报警服务,负责创建报警并发布事件。 type Service struct { entClient *ent.Client bus eventbus.Bus } // NewService 创建报警服务。 func NewService(entClient *ent.Client, bus eventbus.Bus) *Service { return &Service{entClient: entClient, bus: bus} } // Raise 创建报警并发布 ALARM_RAISED 事件。 func (s *Service) Raise(ctx context.Context, alarmCode string, alarmMessage string, level constants.AlarmLevel, equipmentID int, jobID int, source string) (*ent.Alarm, error) { a, err := s.entClient.Alarm.Create(). SetAlarmCode(alarmCode). SetAlarmMessage(alarmMessage). SetLevel(level). SetNillableEquipmentId(&equipmentID). SetNillableJobId(&jobID). SetSource(source). Save(ctx) if err != nil { return nil, fmt.Errorf("create alarm: %w", err) } evt := eventbus.NewAlarmRaisedEvent(a.ID, alarmCode, string(level), equipmentID, source) if err := s.bus.Publish(ctx, evt); err != nil { slog.Error("alarm: publish event failed", "alarmId", a.ID, "error", err) } return a, nil } // FindActive 检查是否已存在同编码的未处理报警(去重)。 func (s *Service) FindActive(ctx context.Context, alarmCode string) (*ent.Alarm, error) { return s.entClient.Alarm.Query(). Where(alarm.AlarmCodeEQ(alarmCode), alarm.ResolvedEQ(false)). First(ctx) }