package com.dingzhuo.compute.engine.actor.alarm; import com.dingzhuo.compute.engine.function.FunctionEngine; import com.dingzhuo.compute.engine.message.alarm.AlarmJudgeMessage; import com.dingzhuo.compute.engine.message.alarm.AlarmStatus; import com.dingzhuo.energy.common.utils.time.TimeManager; import com.dingzhuo.energy.common.utils.time.TimeType; import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem; import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm; import com.greenpineyu.fel.context.FelContext; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * @author fanxinfu */ @Component("periodAlarmActor") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class PeriodAlarmActor extends BaseAlarmActor { public static final String ACTOR_NAME = "periodAlarmActor"; private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override void judge(AlarmJudgeMessage message) { try { String actorId = message.getActorId(); AlarmItem item = cacheService.getAlarmItem(actorId); TimeType timeType = TimeType.valueOf(item.getTimeSlot()); String timeCode = TimeManager.getTimeCode(DateTime.now().toDate(), timeType); String lastTimeCode = TimeManager.getTimeCode(TimeManager.getTime(timeCode, -1), timeType); RealTimeAlarm alarm = realtimeAlarmService .getAlarmByItemIdAndTimeCode(item.getId(), lastTimeCode); if (alarm != null) { insertPeriodHistoryAlarm(item, new DateTime(TimeManager.getEndTime(lastTimeCode)), lastTimeCode, alarm); } AlarmStatus lastStatus = cacheService.getAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType()); DateTime now = DateTime.now(); if (lastStatus == null) { lastStatus = new AlarmStatus(); lastStatus.setAlarm(false); lastStatus.setBeginTime(now.toDate()); } FelContext context = FunctionEngine.getInstance().getContext(); context.set("timeCode", timeCode); Object value = FunctionEngine.getInstance().eval(item.getCalcText(), context); boolean isAlarm = (Boolean) value; if (isAlarm != lastStatus.isAlarm()) { lastStatus.setAlarm(isAlarm); cacheService.cacheAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType(), lastStatus); if (isAlarm) { insertRealtimeAlarm(item, now, null, null, timeCode); } else { insertPeriodHistoryAlarm(item, now, timeCode, null); } } } catch (Exception ex) { logger.error(ex.getMessage()); } } }