package com.dingzhuo.compute.engine.actor.device; import akka.actor.UntypedAbstractActor; import com.dingzhuo.compute.engine.function.FunctionEngine; import com.dingzhuo.compute.engine.message.device.DeviceStatus; import com.dingzhuo.compute.engine.message.device.DeviceStatusJudgeMessage; import com.dingzhuo.compute.engine.utils.CacheService; import com.dingzhuo.energy.common.core.lang.UUID; import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula; import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory; import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive; import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusHistoryService; import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService; 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; @Component("deviceStatusActor") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class DeviceStatusActor extends UntypedAbstractActor { public static final String ACTOR_NAME = "deviceStatusActor"; private final CacheService cacheService; private final IDeviceStatusLiveService liveService; private final IDeviceStatusHistoryService historyService; private final Logger logger = LoggerFactory.getLogger(this.getClass()); public DeviceStatusActor(CacheService cacheService, IDeviceStatusLiveService liveService, IDeviceStatusHistoryService historyService) { this.cacheService = cacheService; this.liveService = liveService; this.historyService = historyService; } @Override public void onReceive(Object message) { if (message instanceof DeviceStatusJudgeMessage) { judge((DeviceStatusJudgeMessage) message); } } private void judge(DeviceStatusJudgeMessage message) { try { String actorId = message.getActorId(); DeviceFormula formula = cacheService.getDeviceFormula(actorId); if (formula == null) { return; } DeviceStatus lastStatus = cacheService.getDeviceStatus(actorId); DateTime now = DateTime.now(); if (lastStatus == null) { lastStatus = new DeviceStatus(); lastStatus.setAlarm(false); lastStatus.setBeginTime(now.toDate()); } Object value = FunctionEngine.getInstance().eval(formula.getCalcText()); boolean isAlarm = (Boolean) value; if (isAlarm != lastStatus.isAlarm()) { lastStatus.setAlarm(isAlarm); cacheService.cacheDeviceStatus(actorId, lastStatus); if (isAlarm) { DeviceStatusLive live = new DeviceStatusLive(); live.setId(UUID.fastUUID().toString()); live.setDeviceId(formula.getDeviceId()); live.setStatusId(formula.getStateId()); live.setBeginTime(now.toString("yyyy-MM-dd HH:mm:ss")); liveService.insertDeviceStatusLive(live); } else { DeviceStatusHistory history = new DeviceStatusHistory(); DeviceStatusLive live = liveService .getDeviceStatus(formula.getDeviceId(), formula.getStateId()); history.setId(UUID.fastUUID().toString()); history.setDeviceId(formula.getDeviceId()); history.setStatusId(formula.getStateId()); history.setBeginTime(live.getBeginTime()); history.setEndTime(now.toString("yyyy-MM-dd HH:mm:ss")); historyService.saveHistoryStatus(history); } } } catch (Exception ex) { logger.error(ex.getMessage()); } } }