فهرست منبع

Add添加实时告警统计

YueYunyun 2 سال پیش
والد
کامیت
c946316f97

+ 3 - 1
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/analysis/dao/MonitorWarninginfoSetDao.java

@@ -38,7 +38,9 @@ public class MonitorWarninginfoSetDao extends BaseDaoSupport<MonitorWarninginfoS
 
 	public List<MonitorWarninginfoSet> selectByMonitorIds(List<Long> monitorIds){
 		QueryRule queryRule = QueryRule.getInstance();
-		queryRule.andIn("monitorId", monitorIds);
+		if(monitorIds!=null){
+			queryRule.andIn("monitorId", monitorIds);
+		}
 		dynamicDataSourceEntry.set(DataSourceConstant.DB_CURR);
 		return super.find(queryRule);
 	}

+ 28 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/analysis/dao/OnlineDataOverwarningInfoDao.java

@@ -53,5 +53,33 @@ public class OnlineDataOverwarningInfoDao extends BaseDaoSupport<OnlineDataOverw
 		queryRule.andBetween("warningTimeStart", startTime, endTime);
 		return super.find(queryRule);
 	}
+
+	/**
+	 * 获取未结束的告警
+	 * @param terminalIds	监测点ID列表
+	 * @param startTime	开始时间
+	 * @return
+	 */
+	public List<OnlineDataOverwarningInfo> getNotRecoverWarnByStartTime(List<String> terminalIds, Long startTime) {
+		QueryRule queryRule = QueryRule.getInstance();
+		queryRule.andIn("terminalId", terminalIds);
+		queryRule.andLessEqual("warningTimeStart", startTime);
+		queryRule.andIsNull("warningTimeEnd");
+		return super.find(queryRule);
+	}
+
+	/**
+	 * 获取未结束的告警
+	 * @param terminalIds	监测点ID列表
+	 * @param startTime	开始时间
+	 * @return
+	 */
+	public List<OnlineDataOverwarningInfo> getNotRecoverWarnByTimePeriod(List<String> terminalIds, Long startTime, Long endTime) {
+		QueryRule queryRule = QueryRule.getInstance();
+		queryRule.andIn("terminalId", terminalIds);
+		queryRule.andBetween("warningTimeStart", startTime, endTime);
+		queryRule.andIsNull("warningTimeEnd");
+		return super.find(queryRule);
+	}
 	
 }

+ 10 - 3
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/analysis/dao/OnlineDataQtyDao.java

@@ -40,9 +40,16 @@ public class OnlineDataQtyDao extends BaseDaoSupport<OnlineDataQty,Long>{
 		this.setDataSourceReadOnly(dataSource);
 		this.setDataSourceWrite(dataSource);
 	}
-	
-	
-	
+
+	public List<OnlineDataQty> selectByTime(List<String> terminalIds,Long getTime){
+		QueryRule queryRule = QueryRule.getInstance();
+		queryRule.andEqual("getTime", getTime);
+		queryRule.andIn("terminalId", terminalIds);
+		setDynamicDataSource(getTime);
+		return super.find(queryRule);
+	}
+
+
 	public List<OnlineDataQty> selectByDate(List<String> terminalIds,Long getDate) {
 		
 		if(null == terminalIds || terminalIds.size() == 0){ return new ArrayList<OnlineDataQty>(); }

+ 392 - 81
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/analysis/timer/impl/OverWarnTimer.java

@@ -1,215 +1,525 @@
 package cn.vbdsm.analysis.timer.impl;
 
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
+import java.util.*;
 
+import cn.vbdsm.analysis.dao.*;
+import cn.vbdsm.analysis.model.*;
+import cn.vbdsm.common.constants.MonitorWarnConstant;
+import cn.vbdsm.common.utils.MonitorUtil;
+import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import cn.vbdsm.analysis.dao.AnalDataOverwarningDao;
-import cn.vbdsm.analysis.dao.MonitorDao;
-import cn.vbdsm.analysis.dao.OnlineDataOverwarningInfoDao;
-import cn.vbdsm.analysis.model.AnalDataOverwarning;
-import cn.vbdsm.analysis.model.Monitor;
 import cn.vbdsm.analysis.model.Monitor.EmDistributionType;
-import cn.vbdsm.analysis.model.OnlineDataOverwarningInfo;
 import cn.vbdsm.common.annotation.Comment;
 import cn.vbdsm.common.constants.CronExpression;
 
+import javax.core.common.utils.ListUtils;
+import javax.core.common.utils.StringUtils;
 
 @Component
 @Comment("告警扫描")
 public class OverWarnTimer {
 
-	@Autowired private MonitorDao monitorDao;
-	@Autowired private AnalDataOverwarningDao analDataOverwarningDao;
-	@Autowired private OnlineDataOverwarningInfoDao onlineDataOverwarningInfoDao;
-	
+	@Autowired
+	private MonitorDao monitorDao;
+	@Autowired
+	private AnalDataOverwarningDao analDataOverwarningDao;
+	@Autowired
+	private OnlineDataOverwarningInfoDao onlineDataOverwarningInfoDao;
+	@Autowired
+	private MonitorWarninginfoSetDao warninginfoSetDao;
+
+	@Autowired
+	private OnlineDataPowerDao onlineDataPowerDao;
+
+	@Autowired
+	private OnlineDataQtyDao onlineDataQtyDao;
+
+	@Autowired
+	private OnlineDataHarmonicIDao harmonicIDao;
+
+	@Autowired
+	private OnlineDataHarmonicUDao harmonicUDao;
+
 	private Logger LOG = Logger.getLogger(this.getClass());
-	
+
+	/**
+	 * 5分钟计算一次监测点告警
+	 */
+	@Scheduled(cron = CronExpression.EVERY_5_MINUTE_2_DELAY)
+	@Comment("监测点日越限信息统计")
+	@Async
+//    @PostConstruct
+	public void calcOnlineDataOverWarn(Date startTime,Date endTime){
+		if(startTime == null){
+			//执行上一个点的告警
+			Calendar calendar = Calendar.getInstance();
+			calcOnlineDataOverWarn(calendar.getTime());
+		}else{
+			Calendar c = Calendar.getInstance();
+			if(null == endTime){ endTime = startTime; }
+			c.setTime(startTime);
+			while(c.getTime().compareTo(endTime) == 0 || c.getTime().before(endTime)){
+				calcOnlineDataOverWarn(c.getTime());
+				c.add(Calendar.MINUTE, 5);
+			}
+		}
+	}
+
+	public void calcOnlineDataOverWarn(Date executeDate){
+		Calendar calendar = Calendar.getInstance();
+		if(executeDate != null){
+			calendar.setTime(executeDate);
+		}
+		calendar.add(Calendar.MINUTE,-calendar.get(Calendar.MINUTE) % 5);
+		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
+		Long curTime = Long.parseLong(df.format(calendar.getTime()) + "00");
+		LOG.info("开始统计监测点告警,执行时间" + curTime);
+		Calendar calendar1 = (Calendar) calendar.clone();
+		calendar1.add(Calendar.DATE, -2);
+		Long twoDaysAgoTime = Long.parseLong(df.format(calendar1.getTime()) + "00");
+
+		List<MonitorWarninginfoSet> monitorWarninginfoSets = warninginfoSetDao.selectByMonitorIds(null);
+		if (monitorWarninginfoSets.isEmpty()) {
+			return;
+		}
+		Map<Long, List<MonitorWarninginfoSet>> monitorWaringInfoSetMap = new HashMap<Long, List<MonitorWarninginfoSet>>();
+		for (MonitorWarninginfoSet monitorWarninginfoSet :
+				monitorWarninginfoSets) {
+			if (!monitorWaringInfoSetMap.containsKey(monitorWarninginfoSet.getMonitorId())) {
+				monitorWaringInfoSetMap.put(monitorWarninginfoSet.getMonitorId(), new ArrayList<MonitorWarninginfoSet>());
+			}
+			monitorWaringInfoSetMap.get(monitorWarninginfoSet.getMonitorId()).add(monitorWarninginfoSet);
+		}
+
+		//监测点分组处理,500个一组
+		List<List<Long>> monitorForPage = getMonitorIdPage(new ArrayList<Long>(monitorWaringInfoSetMap.keySet()));
+		List<OnlineDataOverwarningInfo> replaceWarnInfoList = new ArrayList<OnlineDataOverwarningInfo>();
+		for (List<Long> pageData :
+				monitorForPage) {
+			List<Monitor> monitorList = monitorDao.selectByIds(new ArrayList<Long>(pageData));
+			Map<Long, Monitor> monitorMap = new HashMap<Long, Monitor>();
+			Set<String> terminalIds = new HashSet<String>();
+			for (Monitor monitor : monitorList) {
+				if (monitor.getSeeType().compareTo(EmDistributionType.virtual.value) == 0 || monitor.getTerminalId() == null) {
+					continue;
+				}
+				terminalIds.add(monitor.getTerminalId());
+				monitorMap.put(monitor.getId(), monitor);
+			}
+			if (terminalIds.isEmpty()) {
+				continue;
+			}
+			//查询电力数据
+			Map<String, OnlineDataPower> onlineDataPowerMap = new HashMap<String, OnlineDataPower>();
+			Map<String, OnlineDataQty> onlineDataQtyMap = new HashMap<String, OnlineDataQty>();
+			Map<String, List<OnlineDataHarmonicI>> onlineDataHarmonicIMap = new HashMap<String, List<OnlineDataHarmonicI>>();
+			Map<String, List<OnlineDataHarmonicU>> onlineDataHarmonicUMap = new HashMap<String, List<OnlineDataHarmonicU>>();
+			List<String> queryTerminalIds = new ArrayList<String>(terminalIds);
+			List<OnlineDataPower> onlineDataPowerList = onlineDataPowerDao.selectByTime(queryTerminalIds, Long.valueOf(curTime));
+			List<OnlineDataQty> onlineDataQtyList = onlineDataQtyDao.selectByTime(queryTerminalIds, Long.valueOf(curTime));
+			List<OnlineDataHarmonicI> harmonicIList = harmonicIDao.selectByTime(queryTerminalIds, Long.valueOf(curTime));
+			List<OnlineDataHarmonicU> harmonicUList = harmonicUDao.selectByTime(queryTerminalIds, Long.valueOf(curTime));
+			for (OnlineDataPower onlineDataPower : onlineDataPowerList) {
+				onlineDataPowerMap.put(onlineDataPower.getTerminalId(), onlineDataPower);
+			}
+			for (OnlineDataQty onlineDataQty : onlineDataQtyList) {
+				onlineDataQtyMap.put(onlineDataQty.getTerminalId(), onlineDataQty);
+			}
+			for (OnlineDataHarmonicI i : harmonicIList) {
+				if (!onlineDataHarmonicIMap.containsKey(i.getTerminalId())) {
+					onlineDataHarmonicIMap.put(i.getTerminalId(), new ArrayList<OnlineDataHarmonicI>());
+				}
+				onlineDataHarmonicIMap.get(i.getTerminalId()).add(i);
+			}
+			for (OnlineDataHarmonicU u : harmonicUList) {
+				if (!onlineDataHarmonicUMap.containsKey(u.getTerminalId())) {
+					onlineDataHarmonicUMap.put(u.getTerminalId(), new ArrayList<OnlineDataHarmonicU>());
+				}
+				onlineDataHarmonicUMap.get(u.getTerminalId()).add(u);
+			}
+			//查询2天内没有恢复的告警
+			List<OnlineDataOverwarningInfo> notRecoverWarns = onlineDataOverwarningInfoDao.getNotRecoverWarnByTimePeriod(new ArrayList<String>(terminalIds), Long.valueOf(twoDaysAgoTime), Long.valueOf(curTime));
+			//监测点、告警类型、越限类型、开始时间确定唯一值
+			Map<String,Map<String,OnlineDataOverwarningInfo>> notRecoverWarnMap = new HashMap<String, Map<String, OnlineDataOverwarningInfo>>();
+			for (OnlineDataOverwarningInfo warn : notRecoverWarns) {
+				if(!notRecoverWarnMap.containsKey(warn.getTerminalId())){
+					notRecoverWarnMap.put(warn.getTerminalId(),new HashMap<String, OnlineDataOverwarningInfo>());
+				}
+				notRecoverWarnMap.get(warn.getTerminalId()).put(warn.getWarningInfoId()+ "_" + warn.getOverFlag(),warn);
+			}
+			for (Map.Entry<Long, Monitor> monitorMapEntry :
+					monitorMap.entrySet()) {
+				//查询电力相关数据
+				String terminalId = monitorMapEntry.getValue().getTerminalId();
+				List<MonitorWarninginfoSet> monitorWarninginfoSetList = monitorWaringInfoSetMap.get(monitorMapEntry.getKey());
+				for (MonitorWarninginfoSet monitorWarninginfoSet:
+						monitorWarninginfoSetList) {
+					List<MonitorWarnConstant.OnlineDataWarnTypeEnum> onlineDataWarnTypeEnums =  MonitorWarnConstant.OnlineDataWarnTypeEnum.getWarnTypeBySysCode(monitorWarninginfoSet.getWarningInfoId());
+					OnlineDataPower onlineDataPower = onlinePowerAddCtPt(monitorMapEntry.getValue(),onlineDataPowerMap.get(terminalId));
+					OnlineDataQty onlineDataQty = onlineDataQtyMap.get(terminalId);
+					List<OnlineDataHarmonicI> onlineDataHarmonicIs = onlineDataHarmonicIMap.get(terminalId);
+					List<OnlineDataHarmonicU> onlineDataHarmonicUs = onlineDataHarmonicUMap.get(terminalId);
+					Map<String,OnlineDataOverwarningInfo> terminalNotRecoverWarns = notRecoverWarnMap.get(terminalId);
+					for (MonitorWarnConstant.OnlineDataWarnTypeEnum onlineDataWarnTypeEnum:
+							onlineDataWarnTypeEnums) {
+						BigDecimal infoMin = monitorWarninginfoSet.getInfoMin();
+						BigDecimal infoMax = monitorWarninginfoSet.getInfoMax();
+						switch (onlineDataWarnTypeEnum.getOnlineDataType()){
+							case Power:
+								if(onlineDataPower != null){
+									BigDecimal value = getMethodInvoke(onlineDataPower,onlineDataWarnTypeEnum.getTableEnum().getDataColumn(),BigDecimal.class);
+									handleWarnJudgement(curTime, twoDaysAgoTime, replaceWarnInfoList, terminalId, terminalNotRecoverWarns, onlineDataWarnTypeEnum, infoMin, infoMax, value);
+								}
+								break;
+							case QTY:
+								if(onlineDataQty != null){
+									BigDecimal value = getMethodInvoke(onlineDataQty,onlineDataWarnTypeEnum.getTableEnum().getDataColumn(),BigDecimal.class);
+									handleWarnJudgement(curTime, twoDaysAgoTime, replaceWarnInfoList, terminalId, terminalNotRecoverWarns, onlineDataWarnTypeEnum, infoMin, infoMax, value);
+								}
+								break;
+							case Harmonic_i:
+								if(onlineDataHarmonicIs != null){
+									for (OnlineDataHarmonicI onlineDataHarmonicI:
+											onlineDataHarmonicIs) {
+										String type = getMethodInvoke(onlineDataHarmonicI,onlineDataWarnTypeEnum.getTableEnum().getTypeColumnName(),String.class);
+										if(type.equals(onlineDataWarnTypeEnum.getTableEnum().getTypeColumnValue())){
+											BigDecimal value = getMethodInvoke(onlineDataHarmonicI,onlineDataWarnTypeEnum.getTableEnum().getDataColumn(),BigDecimal.class);
+											handleWarnJudgement(curTime, twoDaysAgoTime, replaceWarnInfoList, terminalId, terminalNotRecoverWarns, onlineDataWarnTypeEnum, infoMin, infoMax, value);
+										}
+									}
+								}
+								break;
+							case Harmonic_u:
+								if(onlineDataHarmonicUs != null){
+									for (OnlineDataHarmonicU onlineDataHarmonicU:
+											onlineDataHarmonicUs) {
+										String type = getMethodInvoke(onlineDataHarmonicU,onlineDataWarnTypeEnum.getTableEnum().getTypeColumnName(),String.class);
+										if(type.equals(onlineDataWarnTypeEnum.getTableEnum().getTypeColumnValue())){
+											BigDecimal value = getMethodInvoke(onlineDataHarmonicU,onlineDataWarnTypeEnum.getTableEnum().getDataColumn(),BigDecimal.class);
+											handleWarnJudgement(curTime, twoDaysAgoTime, replaceWarnInfoList, terminalId, terminalNotRecoverWarns, onlineDataWarnTypeEnum, infoMin, infoMax, value);
+										}
+									}
+								}
+								break;
+						}
+					}
+				}
+			}
+
+		}
+
+		LOG.info("本次更新告警记录条数:" + replaceWarnInfoList.size());
+		if (replaceWarnInfoList.size() > 0) {
+			int i = onlineDataOverwarningInfoDao.replaceAll(replaceWarnInfoList);
+		}
+	}
+
+	/**
+	 * 告警判断
+	 * @param curTime
+	 * @param twoDaysAgoTime
+	 * @param replaceWarnInfoList
+	 * @param terminalId
+	 * @param terminalNotRecoverWarns
+	 * @param onlineDataWarnTypeEnum
+	 * @param infoMin
+	 * @param infoMax
+	 * @param value
+	 */
+	private void handleWarnJudgement(Long curTime, Long twoDaysAgoTime, List<OnlineDataOverwarningInfo> replaceWarnInfoList, String terminalId, Map<String, OnlineDataOverwarningInfo> terminalNotRecoverWarns, MonitorWarnConstant.OnlineDataWarnTypeEnum onlineDataWarnTypeEnum, BigDecimal infoMin, BigDecimal infoMax, BigDecimal value) {
+		if(value != null){
+			if ((onlineDataWarnTypeEnum.getCompareType() & 1) > 0){
+				//比较下限值
+				OnlineDataOverwarningInfo notRecoverWarn = terminalNotRecoverWarns != null ? terminalNotRecoverWarns.get(onlineDataWarnTypeEnum.getCode()+"_"+0) : null;
+				if(value.compareTo(infoMin) < 0){
+					if(notRecoverWarn == null){
+						notRecoverWarn = createNewWarnInfo(curTime, terminalId, infoMin,infoMax, value, onlineDataWarnTypeEnum.getCode(),0);
+						replaceWarnInfoList.add(notRecoverWarn);
+					}
+				}else if(notRecoverWarn != null){
+					handleWarnRecovery(notRecoverWarn,twoDaysAgoTime);
+					replaceWarnInfoList.add(notRecoverWarn);
+				}
+			}
+			if((onlineDataWarnTypeEnum.getCompareType() & 2) > 0){
+				//比较上限值
+				OnlineDataOverwarningInfo notRecoverWarn = terminalNotRecoverWarns != null ? terminalNotRecoverWarns.get(onlineDataWarnTypeEnum.getCode()+"_"+1) : null;
+				if(value.compareTo(infoMax) > 0){
+					if(notRecoverWarn == null){
+						notRecoverWarn = createNewWarnInfo(curTime, terminalId, infoMin,infoMax, value, onlineDataWarnTypeEnum.getCode(),1);
+						replaceWarnInfoList.add(notRecoverWarn);
+					}
+				}else if(notRecoverWarn != null){
+					handleWarnRecovery(notRecoverWarn,twoDaysAgoTime);
+					replaceWarnInfoList.add(notRecoverWarn);
+				}
+			}
+		}
+	}
+
+	private OnlineDataOverwarningInfo createNewWarnInfo(Long startTime, String terminalId, BigDecimal infoMin,BigDecimal infoMax, BigDecimal value, Integer warnTypeCode,Integer overFlag) {
+		OnlineDataOverwarningInfo onlineDataOverwarningInfo = new OnlineDataOverwarningInfo();
+		onlineDataOverwarningInfo.setTerminalId(terminalId);
+		onlineDataOverwarningInfo.setValueMin(infoMin.doubleValue());
+		onlineDataOverwarningInfo.setValueMax(infoMax.doubleValue());
+		onlineDataOverwarningInfo.setWarningInfoId(warnTypeCode);
+		onlineDataOverwarningInfo.setOverFlag(overFlag);
+		onlineDataOverwarningInfo.setValue(value.doubleValue());
+		onlineDataOverwarningInfo.setReadFlag(0);
+		onlineDataOverwarningInfo.setWarningTimeStart(startTime);
+		onlineDataOverwarningInfo.setWarningTimeEnd(null);
+		return onlineDataOverwarningInfo;
+	}
+
+	private void handleWarnRecovery(OnlineDataOverwarningInfo onlineDataOverwarningInfo,Long endTime){
+		onlineDataOverwarningInfo.setWarningTimeEnd(endTime);
+	}
+
+	public OnlineDataPower onlinePowerAddCtPt(Monitor monitor, OnlineDataPower onlineDataPowerParam) {
+		if(onlineDataPowerParam == null){
+			return onlineDataPowerParam;
+		}
+		OnlineDataPower onlineDataPower = new OnlineDataPower();
+		try {
+			PropertyUtils.copyProperties(onlineDataPower,onlineDataPowerParam);
+			onlineDataPower.setP(MonitorUtil.calcCtPt(monitor, onlineDataPower.getP()));
+			onlineDataPower.setPa(MonitorUtil.calcCtPt(monitor, onlineDataPower.getPa()));
+			onlineDataPower.setPb(MonitorUtil.calcCtPt(monitor, onlineDataPower.getPb()));
+			onlineDataPower.setPc(MonitorUtil.calcCtPt(monitor, onlineDataPower.getPc()));
+			onlineDataPower.setQ(MonitorUtil.calcCtPt(monitor, onlineDataPower.getQ()));
+			onlineDataPower.setQa(MonitorUtil.calcCtPt(monitor, onlineDataPower.getQa()));
+			onlineDataPower.setQb(MonitorUtil.calcCtPt(monitor, onlineDataPower.getQb()));
+			onlineDataPower.setQc(MonitorUtil.calcCtPt(monitor, onlineDataPower.getQc()));
+
+			onlineDataPower.setIa(MonitorUtil.calcCt(monitor, onlineDataPower.getIa()));
+			onlineDataPower.setIb(MonitorUtil.calcCt(monitor, onlineDataPower.getIb()));
+			onlineDataPower.setIc(MonitorUtil.calcCt(monitor, onlineDataPower.getIc()));
+			onlineDataPower.setIz(MonitorUtil.calcCt(monitor, onlineDataPower.getIz()));
+
+			onlineDataPower.setUa(MonitorUtil.calcPt(monitor, onlineDataPower.getUa()));
+			onlineDataPower.setUb(MonitorUtil.calcPt(monitor, onlineDataPower.getUb()));
+			onlineDataPower.setUc(MonitorUtil.calcPt(monitor, onlineDataPower.getUc()));
+			onlineDataPower.setUab(MonitorUtil.calcPt(monitor, onlineDataPower.getUab()));
+			onlineDataPower.setUbc(MonitorUtil.calcPt(monitor, onlineDataPower.getUbc()));
+			onlineDataPower.setUca(MonitorUtil.calcPt(monitor, onlineDataPower.getUca()));
+			return onlineDataPower;
+		} catch (Exception ex){
+			LOG.error("onlinePowerAddCtPt copyProperties",ex);
+			return null;
+		}
+	}
+
+	private <T> T getMethodInvoke(Object object, String fieldName,Class<T> returnClass){
+		T result = null;
+		try {
+			Method method = object.getClass().getMethod("get" + StringUtils.upperCaseFirstChar(fieldName));
+			result = (T) method.invoke(object);
+		} catch (Exception e) {
+			LOG.error("getMethodInvoke error",e);
+		}finally {
+			return result;
+		}
+	}
+
+
+	private List<List<Long>> getMonitorIdPage(List<Long> monitorIds) {
+		List<List<Long>> monitorForPage = new ArrayList<List<Long>>();
+		int pageNo = 1, pageSize = 500;
+		List<Long> page = ListUtils.pagination(monitorIds, pageNo, pageSize);
+		monitorForPage.add(page);
+		while (page.size() > 0) {
+			pageNo++;
+			page = ListUtils.pagination(monitorIds, pageNo, pageSize);
+			if (page.size() > 0) {
+				monitorForPage.add(page);
+			}
+		}
+		return monitorForPage;
+	}
+
 	/**
 	 * 每天凌晨1点10分开始计算
 	 */
-	@Scheduled(cron=CronExpression.TIME_1_10_HOUR)
+	@Scheduled(cron = CronExpression.TIME_1_10_HOUR)
 	@Comment("监测点日越限信息统计")
 	@Async
-	public void warnningInfoTimer(){
+	public void warnningInfoTimer() {
 		LOG.info("====================监测点日越限信息统计开始=======================");
-		Map<Long, List<Monitor>> companyMonitorMap = new HashMap<Long, List<Monitor>>();	//机构与监测点对应关系
-		Map<Long, List<String>> companyTerminalMap = new TreeMap<Long, List<String>>();	//机构与监测点ID对应关系
-		Map<String, Monitor> monitorMap = new HashMap<String, Monitor>();	//监测点ID与监测点对应关系
+		Map<Long, List<Monitor>> companyMonitorMap = new HashMap<Long, List<Monitor>>();    //机构与监测点对应关系
+		Map<Long, List<String>> companyTerminalMap = new TreeMap<Long, List<String>>();    //机构与监测点ID对应关系
+		Map<String, Monitor> monitorMap = new HashMap<String, Monitor>();    //监测点ID与监测点对应关系
 		List<Monitor> monintorList = monitorDao.getAll();
 		for (Monitor monitor : monintorList) {
-			if(EmDistributionType.virtual.value == monitor.getSeeType()) continue;//虚拟节点不记
-			if(!companyMonitorMap.containsKey(monitor.getCompanyId())) {
+			if (EmDistributionType.virtual.value == monitor.getSeeType()) continue;//虚拟节点不记
+			if (!companyMonitorMap.containsKey(monitor.getCompanyId())) {
 				companyMonitorMap.put(monitor.getCompanyId(), new ArrayList<Monitor>());
 			}
 			companyMonitorMap.get(monitor.getCompanyId()).add(monitor);
-			
-			if(!companyTerminalMap.containsKey(monitor.getCompanyId())) {
+
+			if (!companyTerminalMap.containsKey(monitor.getCompanyId())) {
 				companyTerminalMap.put(monitor.getCompanyId(), new ArrayList<String>());
 			}
 			companyTerminalMap.get(monitor.getCompanyId()).add(monitor.getTerminalId());
-			
+
 			monitorMap.put(monitor.getTerminalId(), monitor);
 		}
-		
+
 		SimpleDateFormat dateSdf = new SimpleDateFormat("yyyyMMdd");
 		Calendar c = Calendar.getInstance();
 //		c.add(Calendar.DAY_OF_YEAR, -1);
-		String today = dateSdf.format(c.getTime());	//获取当前日期
+		String today = dateSdf.format(c.getTime());    //获取当前日期
 		calculateAnalDataOverwarning(companyTerminalMap, today);
-		
+
 		LOG.info("====================监测点日越限信息统计结束=======================");
 	}
-	
+
 	private void calculateAnalDataOverwarning(Map<Long, List<String>> companyTerminalMap, String day) {
 		int count = 1;
 		for (Long companyId : companyTerminalMap.keySet()) {
-			if(companyTerminalMap.get(companyId).isEmpty()) continue;
-			List<OnlineDataOverwarningInfo> onlineWarnList = onlineDataOverwarningInfoDao.getOverwarningByTerminilIds(companyTerminalMap.get(companyId), Long.valueOf(day+"000000"), Long.valueOf(day+"242359"));
+			if (companyTerminalMap.get(companyId).isEmpty()) continue;
+			List<OnlineDataOverwarningInfo> onlineWarnList = onlineDataOverwarningInfoDao.getOverwarningByTerminilIds(companyTerminalMap.get(companyId), Long.valueOf(day + "000000"), Long.valueOf(day + "242359"));
 			Map<String, List<OnlineDataOverwarningInfo>> dataMap = new HashMap<String, List<OnlineDataOverwarningInfo>>();
 			for (OnlineDataOverwarningInfo online : onlineWarnList) {
-				String mapKey = online.getTerminalId()+"_"+online.getWarningInfoId()+"_"+online.getOverFlag();
-				if(!dataMap.containsKey(mapKey)) {
+				String mapKey = online.getTerminalId() + "_" + online.getWarningInfoId() + "_" + online.getOverFlag();
+				if (!dataMap.containsKey(mapKey)) {
 					dataMap.put(mapKey, new ArrayList<OnlineDataOverwarningInfo>());
 				}
 				dataMap.get(mapKey).add(online);
 			}
-			
+
 			Map<String, AnalDataOverwarning> analDataMap = new HashMap<String, AnalDataOverwarning>();
 			for (String key : dataMap.keySet()) {
 				String[] keys = key.split("_");
 				String terminalId = keys[0], warningInfoId = keys[1], overFlag = keys[2];
 				AnalDataOverwarning analData = new AnalDataOverwarning();
-				if(analDataMap.containsKey(terminalId))
+				if (analDataMap.containsKey(terminalId))
 					analData = analDataMap.get(terminalId);
 				else {
 					analData.setTerminalId(terminalId);
 					analData.setGetDate(Long.valueOf(day));
 					analDataMap.put(terminalId, analData);
 				}
-				
-				if(warningInfoId.equals("1")&&overFlag.equals("0")){	//A相电压越下限
+
+				if (warningInfoId.equals("1") && overFlag.equals("0")) {    //A相电压越下限
 					analData.setUaLTimes(dataMap.get(key).size());
 					analData.setUaLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("1")&&overFlag.equals("1")) {	//A相电压越上限
+				} else if (warningInfoId.equals("1") && overFlag.equals("1")) {    //A相电压越上限
 					analData.setUaUTimes(dataMap.get(key).size());
 					analData.setUaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("2")&&overFlag.equals("0")) {	//B相电压越下限
+				} else if (warningInfoId.equals("2") && overFlag.equals("0")) {    //B相电压越下限
 					analData.setUbLTimes(dataMap.get(key).size());
 					analData.setUbLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("2")&&overFlag.equals("1")) {	//B相电压越上限
+				} else if (warningInfoId.equals("2") && overFlag.equals("1")) {    //B相电压越上限
 					analData.setUbUTimes(dataMap.get(key).size());
 					analData.setUbUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("3")&&overFlag.equals("0")) {	//C相电压越下限
+				} else if (warningInfoId.equals("3") && overFlag.equals("0")) {    //C相电压越下限
 					analData.setUcLTimes(dataMap.get(key).size());
 					analData.setUcLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("3")&&overFlag.equals("1")) {	//C相电压越上限
+				} else if (warningInfoId.equals("3") && overFlag.equals("1")) {    //C相电压越上限
 					analData.setUcUTimes(dataMap.get(key).size());
 					analData.setUcUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("4")&&overFlag.equals("1")) {	//三相电压不平衡度越上限
+				} else if (warningInfoId.equals("4") && overFlag.equals("1")) {    //三相电压不平衡度越上限
 					analData.setuBalanceUTimes(dataMap.get(key).size());
 					analData.setuBalanceUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("5")&&overFlag.equals("0")){		//Uab线电压越下限
+				} else if (warningInfoId.equals("5") && overFlag.equals("0")) {        //Uab线电压越下限
 					analData.setUabLTimes(dataMap.get(key).size());
 					analData.setUabLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("5")&&overFlag.equals("1")) {	//Uab线电压越上限
+				} else if (warningInfoId.equals("5") && overFlag.equals("1")) {    //Uab线电压越上限
 					analData.setUabUTimes(dataMap.get(key).size());
 					analData.setUabUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("6")&&overFlag.equals("0")) {	//Ubc线电压越下限
+				} else if (warningInfoId.equals("6") && overFlag.equals("0")) {    //Ubc线电压越下限
 					analData.setUbcLTimes(dataMap.get(key).size());
 					analData.setUbcLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("6")&&overFlag.equals("1")) {	//Ubc线电压越上限
+				} else if (warningInfoId.equals("6") && overFlag.equals("1")) {    //Ubc线电压越上限
 					analData.setUbcUTimes(dataMap.get(key).size());
 					analData.setUbcUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("7")&&overFlag.equals("0")) {	//Uca线电压越下限
+				} else if (warningInfoId.equals("7") && overFlag.equals("0")) {    //Uca线电压越下限
 					analData.setUcaLTimes(dataMap.get(key).size());
 					analData.setUcaLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("7")&&overFlag.equals("1")) {	//Uca线电压越上限
+				} else if (warningInfoId.equals("7") && overFlag.equals("1")) {    //Uca线电压越上限
 					analData.setUcaUTimes(dataMap.get(key).size());
 					analData.setUcaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("8")&&overFlag.equals("1")) {	//三相线电压不平衡度越上限
+				} else if (warningInfoId.equals("8") && overFlag.equals("1")) {    //三相线电压不平衡度越上限
 					analData.setUnBalanceUTimes(dataMap.get(key).size());
 					analData.setUnBalanceUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("9")&&overFlag.equals("1")) {	//A相电流越上限
+				} else if (warningInfoId.equals("9") && overFlag.equals("1")) {    //A相电流越上限
 					analData.setIaUTimes(dataMap.get(key).size());
 					analData.setIaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("10")&&overFlag.equals("1")) {	//B相电流越上限
+				} else if (warningInfoId.equals("10") && overFlag.equals("1")) {    //B相电流越上限
 					analData.setIbUTimes(dataMap.get(key).size());
 					analData.setIbUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("11")&&overFlag.equals("1")) {	//C相电流越上限
+				} else if (warningInfoId.equals("11") && overFlag.equals("1")) {    //C相电流越上限
 					analData.setIcUTimes(dataMap.get(key).size());
 					analData.setIcUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("12")&&overFlag.equals("1")) {	//三相电流不平衡度越上限
+				} else if (warningInfoId.equals("12") && overFlag.equals("1")) {    //三相电流不平衡度越上限
 					analData.setiBalanceUTimes(dataMap.get(key).size());
 					analData.setiBalanceUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("13")&&overFlag.equals("1")) {	//零线电流越上限
+				} else if (warningInfoId.equals("13") && overFlag.equals("1")) {    //零线电流越上限
 					analData.setIzUTimes(dataMap.get(key).size());
 					analData.setIzUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("14")&&overFlag.equals("1")) {	//A相负荷越上限
+				} else if (warningInfoId.equals("14") && overFlag.equals("1")) {    //A相负荷越上限
 					analData.setPaUTimes(dataMap.get(key).size());
 					analData.setPaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("15")&&overFlag.equals("1")) {	//B相负荷越上限
+				} else if (warningInfoId.equals("15") && overFlag.equals("1")) {    //B相负荷越上限
 					analData.setPbUTimes(dataMap.get(key).size());
 					analData.setPbUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("16")&&overFlag.equals("1")) {	//C相负荷越上限
+				} else if (warningInfoId.equals("16") && overFlag.equals("1")) {    //C相负荷越上限
 					analData.setPcUTimes(dataMap.get(key).size());
 					analData.setPcUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("17")&&overFlag.equals("1")) {	//总负荷越上限
+				} else if (warningInfoId.equals("17") && overFlag.equals("1")) {    //总负荷越上限
 					analData.setpUTimes(dataMap.get(key).size());
 					analData.setpUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("18")&&overFlag.equals("0")){	//A相功率因数越下限
+				} else if (warningInfoId.equals("18") && overFlag.equals("0")) {    //A相功率因数越下限
 					analData.setPfaLTimes(dataMap.get(key).size());
 					analData.setPfaLTime(getWarningTime(dataMap.get(key)));
 				}/* else if(warningInfoId.equals("18")&&overFlag.equals("1")) {	//A相功率因数越上限
 					analData.setPfaUTimes(dataMap.get(key).size());
 					analData.setPfaUTime(getWarningTime(dataMap.get(key)));
-				}*/ else if(warningInfoId.equals("19")&&overFlag.equals("0")) {	//B相功率因数越下限
+				}*/ else if (warningInfoId.equals("19") && overFlag.equals("0")) {    //B相功率因数越下限
 					analData.setPfbLTimes(dataMap.get(key).size());
 					analData.setPfbLTime(getWarningTime(dataMap.get(key)));
 				}/* else if(warningInfoId.equals("19")&&overFlag.equals("1")) {	//B相功率因数越上限
 					analData.setPfbUTimes(dataMap.get(key).size());
 					analData.setPfbUTime(getWarningTime(dataMap.get(key)));
-				}*/ else if(warningInfoId.equals("20")&&overFlag.equals("0")) {	//C相功率因数越下限
+				}*/ else if (warningInfoId.equals("20") && overFlag.equals("0")) {    //C相功率因数越下限
 					analData.setPfcLTimes(dataMap.get(key).size());
 					analData.setPfcLTimes(getWarningTime(dataMap.get(key)));
 				}/* else if(warningInfoId.equals("20")&&overFlag.equals("1")) {	//C相功率因数越上限
 					analData.setPfcUTimes(dataMap.get(key).size());
 					analData.setPfcUTime(getWarningTime(dataMap.get(key)));
-				}*/ else if(warningInfoId.equals("22")&&overFlag.equals("0")) {	//频率越下限
+				}*/ else if (warningInfoId.equals("22") && overFlag.equals("0")) {    //频率越下限
 					analData.setfLTimes(dataMap.get(key).size());
 					analData.setfLTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("22")&&overFlag.equals("1")) {	//频率越上限
+				} else if (warningInfoId.equals("22") && overFlag.equals("1")) {    //频率越上限
 					analData.setfUTimes(dataMap.get(key).size());
 					analData.setfUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("23")&&overFlag.equals("1")) {	//A相谐波电流总畸变率越上限
+				} else if (warningInfoId.equals("23") && overFlag.equals("1")) {    //A相谐波电流总畸变率越上限
 					analData.setThdiaUTimes(dataMap.get(key).size());
 					analData.setThdiaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("24")&&overFlag.equals("1")) {	//B相谐波电流总畸变率越上限
+				} else if (warningInfoId.equals("24") && overFlag.equals("1")) {    //B相谐波电流总畸变率越上限
 					analData.setThdibUTimes(dataMap.get(key).size());
 					analData.setThdibUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("25")&&overFlag.equals("1")) {	//C相谐波电流总畸变率越上限
+				} else if (warningInfoId.equals("25") && overFlag.equals("1")) {    //C相谐波电流总畸变率越上限
 					analData.setThdicUTimes(dataMap.get(key).size());
 					analData.setThdicUTimes(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("26")&&overFlag.equals("1")) {	//A相谐波电压总畸变率越上限
+				} else if (warningInfoId.equals("26") && overFlag.equals("1")) {    //A相谐波电压总畸变率越上限
 					analData.setThduaUTimes(dataMap.get(key).size());
 					analData.setThduaUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("27")&&overFlag.equals("1")) {	//B相谐波电压总畸变率越上限
+				} else if (warningInfoId.equals("27") && overFlag.equals("1")) {    //B相谐波电压总畸变率越上限
 					analData.setThdubUTimes(dataMap.get(key).size());
 					analData.setThdubUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("28")&&overFlag.equals("1")) {	//C相谐波电压总畸变率越上限
+				} else if (warningInfoId.equals("28") && overFlag.equals("1")) {    //C相谐波电压总畸变率越上限
 					analData.setThducUTimes(dataMap.get(key).size());
 					analData.setThducUTime(getWarningTime(dataMap.get(key)));
-				} else if(warningInfoId.equals("31")&&overFlag.equals("0")) {	//总功率因数越下限
+				} else if (warningInfoId.equals("31") && overFlag.equals("0")) {    //总功率因数越下限
 					analData.setPfLTimes(dataMap.get(key).size());
 					analData.setPfLTime(getWarningTime(dataMap.get(key)));
 				}/* else if(warningInfoId.equals("31")&&overFlag.equals("1")) {	//总功率因数越上限
@@ -217,19 +527,20 @@ public class OverWarnTimer {
 					analData.setPfUTime(getWarningTime(dataMap.get(key)));
 				}*/
 			}
-			List<AnalDataOverwarning> analWarnList = new ArrayList<AnalDataOverwarning>(analDataMap.values());;
+			List<AnalDataOverwarning> analWarnList = new ArrayList<AnalDataOverwarning>(analDataMap.values());
+			;
 			analDataOverwarningDao.replaceForBatch(analWarnList);//保存或更新记录
-			LOG.info("监测点日越限信息统计>>>共"+companyTerminalMap.size()+"个机构,当前第"+(count++)+"个,机构ID:" + companyId + ",监测点个数:"+companyTerminalMap.get(companyId).size()+",更新记录数:" + analWarnList.size());
-			
-			int delete = onlineDataOverwarningInfoDao.deleteAll(onlineWarnList);//删除历史记录
-			if(delete>0) LOG.info("删除监测点实时告警记录成功。");
+			LOG.info("监测点日越限信息统计>>>共" + companyTerminalMap.size() + "个机构,当前第" + (count++) + "个,机构ID:" + companyId + ",监测点个数:" + companyTerminalMap.get(companyId).size() + ",更新记录数:" + analWarnList.size());
+
+//            int delete = onlineDataOverwarningInfoDao.deleteAll(onlineWarnList);//删除历史记录
+//            if (delete > 0) LOG.info("删除监测点实时告警记录成功。");
 		}
 	}
-	
-	private int getWarningTime(List<OnlineDataOverwarningInfo> dataList){
+
+	private int getWarningTime(List<OnlineDataOverwarningInfo> dataList) {
 		int time = 0;
 		for (OnlineDataOverwarningInfo onlineData : dataList) {
-			if(null != onlineData.getWarningTimeEnd()&&0 != onlineData.getWarningTimeEnd()) {
+			if (null != onlineData.getWarningTimeEnd() && 0 != onlineData.getWarningTimeEnd()) {
 				time += onlineData.getWarningTimeEnd() - onlineData.getWarningTimeStart();
 			} else {
 				time += 5;

+ 6 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/common/constants/CronExpression.java

@@ -262,6 +262,12 @@ public class CronExpression {
     @Comment("每隔5分钟触发")
     public static final String EVERY_5_MINUTE = "0 0/5 * * * ?";
 
+    /**
+     * 第2分钟开始,每隔5分钟触发
+     */
+    @Comment("第2分钟开始,每隔5分钟触发")
+    public static final String EVERY_5_MINUTE_2_DELAY = "0 2/5 * * * ?";
+
     /**
      * 每隔30分钟触发
      */

+ 207 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/common/constants/MonitorWarnConstant.java

@@ -0,0 +1,207 @@
+package cn.vbdsm.common.constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MonitorWarnConstant {
+    public enum OnlineDataWarnTypeEnum {
+        Ua(1, "A相电压","00080003","V",3,OnlineDataTableEnum.Ua),
+        Ub(2, "B相电压","00080003","V",3,OnlineDataTableEnum.Ub),
+        Uc(3, "C相电压","00080003","V",3,OnlineDataTableEnum.Uc),
+        UNBalance (4, "三相电压不平衡度","00080013","%",2,OnlineDataTableEnum.UNBalance),
+        Uab (5, "Uab电压","00080004","V",3,OnlineDataTableEnum.Uab),
+        Ubc (6, "Ubc电压","00080004","V",3,OnlineDataTableEnum.Ubc),
+        Uca (7, "Uca电压","00080004","V",3,OnlineDataTableEnum.Uca),
+//        UBalance (8, "线电压不平衡度","00080013","%"),
+        Ia (9, "A相电流","00080001","A",3,OnlineDataTableEnum.Ia),
+        Ib (10, "B相电流","00080001","A",3,OnlineDataTableEnum.Ib),
+        Ic (11, "C相电流","00080001","A",3,OnlineDataTableEnum.Ic),
+        INBalance (12, "三相电流不平衡度","00080014","%",2,OnlineDataTableEnum.INBalance),
+        Iz (13, "零线电流","00080002","A",3,OnlineDataTableEnum.Iz),
+        Pa (14, "A相负荷","00080005","kW",3,OnlineDataTableEnum.Pa),
+        Pb (15, "B相负荷","00080005","kW",3,OnlineDataTableEnum.Pb),
+        Pc (16, "C相负荷","00080005","kW",3,OnlineDataTableEnum.Pc),
+        P (17, "总负荷","00080006","kW",3,OnlineDataTableEnum.P),
+        PFa (18, "A相功率因数","00080007","",1,OnlineDataTableEnum.PFa),
+        PFb (19, "B相功率因数","00080007","",1,OnlineDataTableEnum.PFb),
+        PFc (20, "C相功率因数","00080007","",1,OnlineDataTableEnum.PFc),
+        PF (21, "总功率因数","00080008","",1,OnlineDataTableEnum.PF),
+        F (22, "频率","00080010","Hz",3,OnlineDataTableEnum.F),
+        IaHar  (23, "A相电流谐波畸变率","00080012","%",2,OnlineDataTableEnum.IaHar),
+        IbHar  (24, "B相电流谐波畸变率","00080012","%",2,OnlineDataTableEnum.IbHar),
+        IcHar  (25, "C相电流谐波畸变率","00080012","%",2,OnlineDataTableEnum.IcHar),
+        UaHar  (26, "A相电压谐波畸变率","00080011","%",2,OnlineDataTableEnum.UaHar),
+        UbHar  (27, "B相电压谐波畸变率","00080011","%",2,OnlineDataTableEnum.UbHar),
+        UcHar  (28, "C相电压谐波畸变率","00080011","%",2,OnlineDataTableEnum.UcHar),
+        T (31, "温度","00080015","℃",3,OnlineDataTableEnum.T) ,
+        Uaw (40, "A相电压偏差","00080016","%",2,OnlineDataTableEnum.Uaw),
+        Ubw (41, "B相电压偏差","00080016","%",2,OnlineDataTableEnum.Ubw),
+        Ucw (42, "C相电压偏差","00080016","%",2,OnlineDataTableEnum.Ucw),
+        Uabw (43, "Uab线电压偏差","00080017","%",2,OnlineDataTableEnum.Uabw),
+        Ubcw (44, "Ubc线电压偏差","00080017","%",2,OnlineDataTableEnum.Ubcw),
+        Ucaw (45, "Uca线电压偏差","00080017","%",2,OnlineDataTableEnum.Ucaw);
+        private Integer code;//数值编码
+        private String name;//名称
+        private String categoryCode;//分类编码 相电压,相电流,相功率因数等
+        private String unit;//单位
+        private int compareType;//比较类型:ob01 越下限 ob10 越上线 0b11 都需要比较
+        private OnlineDataTableEnum tableEnum;//数据存储类型
+
+        OnlineDataWarnTypeEnum(Integer code, String name, String categoryCode, String unit, int compareType, OnlineDataTableEnum tableEnum) {
+            this.code = code;
+            this.name = name;
+            this.categoryCode = categoryCode;
+            this.unit = unit;
+            this.compareType = compareType;
+            this.tableEnum = tableEnum;
+        }
+
+        public OnlineDataTableEnum getTableEnum() {
+            return tableEnum;
+        }
+
+        public int getCompareType() {
+            return compareType;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+
+        public String getCategoryCode() {
+            return categoryCode;
+        }
+
+        public static List<OnlineDataWarnTypeEnum> getWarnTypeBySysCode(String categoryCode){
+            List<OnlineDataWarnTypeEnum> onlineDataWarnTypeEnums = new ArrayList<OnlineDataWarnTypeEnum>();
+            for (OnlineDataWarnTypeEnum warnTypeEnum:
+                    OnlineDataWarnTypeEnum.values()) {
+                if(categoryCode.equals(warnTypeEnum.getCategoryCode())){
+                    onlineDataWarnTypeEnums.add(warnTypeEnum);
+                }
+            }
+            return onlineDataWarnTypeEnums;
+        }
+
+        public OnlineDataTypeEnum getOnlineDataType(){
+            switch (this){
+                case Ua:
+                case Ub:
+                case Uc:
+                case Uab:
+                case Ubc:
+                case Uca:
+                case Ia:
+                case Ib:
+                case Ic:
+                case Iz:
+                case Pa:
+                case Pb:
+                case Pc:
+                case P:
+                case PFa:
+                case PFb:
+                case PFc:
+                case PF:
+                    return OnlineDataTypeEnum.Power;
+                case UNBalance:
+                case INBalance:
+                case F:
+                case T:
+                case Uaw:
+                case Ubw:
+                case Ucw:
+                case Uabw:
+                case Ubcw:
+                case Ucaw:
+                    return OnlineDataTypeEnum.QTY;
+                case IaHar:
+                case IbHar:
+                case IcHar:
+                    return OnlineDataTypeEnum.Harmonic_i;
+                case UaHar:
+                case UbHar:
+                case UcHar:
+                    return OnlineDataTypeEnum.Harmonic_u;
+                    default:
+                        return OnlineDataTypeEnum.Other;
+            }
+        }
+    }
+
+    public enum OnlineDataTableEnum {
+        Ua("ua", "A相电压","t_online_data_power","",""),
+        Ub("ub", "B相电压","t_online_data_power","",""),
+        Uc("uc", "C相电压","t_online_data_power","",""),
+        UNBalance ("unbalance", "三相电压不平衡度","t_online_data_qty","",""),
+        Uab ("uab", "Uab电压","t_online_data_power","",""),
+        Ubc ("ubc", "Ubc电压","t_online_data_power","",""),
+        Uca ("uca", "Uca电压","t_online_data_power","",""),
+//        UBalance (8, "线电压不平衡度","00080013","%"),
+        Ia ("Ia", "A相电流","t_online_data_power","",""),
+        Ib ("Ib", "B相电流","t_online_data_power","",""),
+        Ic ("Ic", "C相电流","t_online_data_power","",""),
+        INBalance ("inbalance", "三相电流不平衡度","00080014","",""),
+        Iz ("iz", "零线电流","t_online_data_power","",""),
+        Pa ("pa", "A相负荷","t_online_data_power","",""),
+        Pb ("pb", "B相负荷","t_online_data_power","",""),
+        Pc ("pc", "C相负荷","t_online_data_power","",""),
+        P ("p", "总负荷","00080006","",""),
+        PFa ("pfa", "A相功率因数","t_online_data_power","",""),
+        PFb ("pfb", "B相功率因数","t_online_data_power","",""),
+        PFc ("pfc", "C相功率因数","t_online_data_power","",""),
+        PF ("pf", "总功率因数","t_online_data_power","",""),
+        F ("f", "频率","t_online_data_qty","",""),
+        IaHar  ("baseI", "A相电流谐波畸变率","t_online_data_harmonic_i","htype","IA"),
+        IbHar  ("baseI", "B相电流谐波畸变率","t_online_data_harmonic_i","htype","IB"),
+        IcHar  ("baseI", "C相电流谐波畸变率","t_online_data_harmonic_i","htype","IC"),
+        UaHar  ("baseU", "A相电压谐波畸变率","t_online_data_harmonic_u","htype","UA"),
+        UbHar  ("baseU", "B相电压谐波畸变率","t_online_data_harmonic_u","htype","UB"),
+        UcHar  ("baseU", "C相电压谐波畸变率","t_online_data_harmonic_u","htype","UC"),
+        T ("t", "温度","t_online_data_qty","","") ,
+        Uaw ("uaw", "A相电压偏差","t_online_data_qty","",""),
+        Ubw ("ubw", "B相电压偏差","t_online_data_qty","",""),
+        Ucw ("ucw", "C相电压偏差","t_online_data_qty","",""),
+        Uabw ("uabw", "Uab线电压偏差","t_online_data_qty","",""),
+        Ubcw ("ubcw", "Ubc线电压偏差","t_online_data_qty","",""),
+        Ucaw ("ucaw", "Uca线电压偏差","t_online_data_qty","","");
+        private String dataColumn;//数据字段
+        private String name;//名称
+        private String tableName;//数据表名称
+        private String typeColumnName;//类型字段名称
+        private String typeColumnValue;//类型字段名称
+
+        OnlineDataTableEnum(String dataColumn, String name, String tableName, String typeColumnName, String typeColumnValue) {
+            this.dataColumn = dataColumn;
+            this.name = name;
+            this.tableName = tableName;
+            this.typeColumnName = typeColumnName;
+            this.typeColumnValue = typeColumnValue;
+        }
+
+        public String getDataColumn() {
+            return dataColumn;
+        }
+
+        public String getTypeColumnName() {
+            return typeColumnName;
+        }
+
+        public String getTypeColumnValue() {
+            return typeColumnValue;
+        }
+    }
+
+    public enum OnlineDataTypeEnum {
+        Power("t_online_data_power"),Energy("t_online_data_energy"),QTY("t_online_data_qty"),
+        Harmonic_i("t_online_data_harmonic_i"),Harmonic_u("t_online_data_harmonic_u"),
+        Other("t_online_data_other");
+        private String type;
+
+        OnlineDataTypeEnum(String type) {
+            this.type = type;
+        }
+    }
+
+
+}

+ 35 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/java/cn/vbdsm/common/utils/MonitorUtil.java

@@ -82,5 +82,40 @@ public class MonitorUtil {
 		d *= ((m.getUseCt() == 1 ? m.getCt() : 1) * (m.getUsePt() == 1 ? m.getPt() : 1));
 		return new BigDecimal(d);
 	}
+
+	/**
+	 * 计算Ct
+	 * @param m
+	 * @param val
+	 * @return
+	 */
+	public static BigDecimal calcCt(Monitor m,BigDecimal val){
+		double d = Math.abs(val.doubleValue());
+		d *= m.getUseCt() == 1 ? m.getCt() : 1;
+		return new BigDecimal(d);
+	}
+
+	/**
+	 * 计算Pt
+	 * @param m
+	 * @param val
+	 * @return
+	 */
+	public static BigDecimal calcPt(Monitor m,BigDecimal val){
+		double d = Math.abs(val.doubleValue());
+		d *= m.getUsePt() == 1 ? m.getPt() : 1;
+		return new BigDecimal(d);
+	}
+
+	/**
+	 * 计算Pt
+	 * @param
+	 * @param val
+	 * @return
+	 */
+	public static BigDecimal setAbs(BigDecimal val){
+		double d = Math.abs(val.doubleValue());
+		return new BigDecimal(d);
+	}
 	
 }

+ 43 - 40
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/resources/local/schedule.xml

@@ -1,60 +1,63 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <timers>
 
-    <timer>clearLogsTimer.clearHistroyLog</timer>
-    <timer>clearBibleWaringInfoTimer.clearHistroy</timer>
-    <!-- <timer>energyPriceTimer.energyPrice</timer> -->
+<!--    <timer>clearLogsTimer.clearHistroyLog</timer>-->
+<!--    <timer>clearBibleWaringInfoTimer.clearHistroy</timer>-->
+<!--    &lt;!&ndash; <timer>energyPriceTimer.energyPrice</timer> &ndash;&gt;-->
 
-    <timer>fgpTimer.companyFgp</timer>
-    <timer>fgpTimer.companyFgpForLastDate</timer>
-    <timer>fgpTimer.companyFgpFor7DaysAgo</timer>
-    <!-- <timer>fgpTimer.companyFgpForYestDayDate</timer> -->
+<!--    <timer>fgpTimer.companyFgp</timer>-->
+<!--    <timer>fgpTimer.companyFgpForLastDate</timer>-->
+<!--    <timer>fgpTimer.companyFgpFor7DaysAgo</timer>-->
+<!--    &lt;!&ndash; <timer>fgpTimer.companyFgpForYestDayDate</timer> &ndash;&gt;-->
 
-    <timer>fgpTimer.monitorFgpForEvery</timer>
-    <timer>fgpTimer.monitorFgpForLastDate</timer>
-    <timer>fgpTimer.monitorFgpFor7DaysAgo</timer>
-    <!-- <timer>fgpTimer.monitorFgpForYestDayDate</timer> -->
+<!--    <timer>fgpTimer.monitorFgpForEvery</timer>-->
+<!--    <timer>fgpTimer.monitorFgpForLastDate</timer>-->
+<!--    <timer>fgpTimer.monitorFgpFor7DaysAgo</timer>-->
+<!--    &lt;!&ndash; <timer>fgpTimer.monitorFgpForYestDayDate</timer> &ndash;&gt;-->
 
-    <timer>monitorLimitTimer.monitorDateTimer</timer>
-    <timer>monitorLimitTimer.monitorLastDateTimer</timer>
-    <timer>monitorLimitTimer.monitorMonthAndYearTimer</timer>
-    <timer>monitorLimitTimer.monitorLastYearTimer</timer>
+<!--    <timer>monitorLimitTimer.monitorDateTimer</timer>-->
+<!--    <timer>monitorLimitTimer.monitorLastDateTimer</timer>-->
+<!--    <timer>monitorLimitTimer.monitorMonthAndYearTimer</timer>-->
+<!--    <timer>monitorLimitTimer.monitorLastYearTimer</timer>-->
 
-    <timer>divisionLimitTimer.divisionDateTimer</timer>
-    <timer>divisionLimitTimer.divisionMonthTimer</timer>
+<!--    <timer>divisionLimitTimer.divisionDateTimer</timer>-->
+<!--    <timer>divisionLimitTimer.divisionMonthTimer</timer>-->
 
-    <timer>powerOnlineTimer.powerTimer</timer>
-    <timer>powerOnlineTimer.powerDayTimer</timer>
+<!--    <timer>powerOnlineTimer.powerTimer</timer>-->
+<!--    <timer>powerOnlineTimer.powerDayTimer</timer>-->
 
-    <timer>shiftsEnergyTimer.today</timer>
-    <timer>shiftsEnergyTimer.yesterAndBefore</timer>
+<!--    <timer>shiftsEnergyTimer.today</timer>-->
+<!--    <timer>shiftsEnergyTimer.yesterAndBefore</timer>-->
 
-    <!--    <timer>stationEnergyTimer.today</timer>-->
-    <!--    <timer>stationEnergyTimer.yesterAndBefore</timer>-->
+<!--    &lt;!&ndash;    <timer>stationEnergyTimer.today</timer>&ndash;&gt;-->
+<!--    &lt;!&ndash;    <timer>stationEnergyTimer.yesterAndBefore</timer>&ndash;&gt;-->
 
-    <timer>enterpriseStateTimer.EnterpriseStateTimingTask</timer>
+<!--    <timer>enterpriseStateTimer.EnterpriseStateTimingTask</timer>-->
 
-    <timer>powerFactorAlarmTimer.powerFactorAlarm</timer>
-    <timer>voltageMessageAlarmTimer.voltageMessageAlarm</timer>
-    <timer>threePhaseUnbalanceTimer.threePhaseUnbalanceAlarm</timer>
-    <timer>loadMessageAlarmTimer.loadMessageAlarm</timer>
-    <timer>harmonicAlarmTimer.harmonicAlarm</timer>
-    <timer>zeroSequenceCurrentTimer.allCommand</timer>
-    <timer>phaseFaultTimer.allCommand</timer>
-    <timer>basicElectricityChargeTimer.allCommand</timer>
+<!--    <timer>powerFactorAlarmTimer.powerFactorAlarm</timer>-->
+<!--    <timer>voltageMessageAlarmTimer.voltageMessageAlarm</timer>-->
+<!--    <timer>threePhaseUnbalanceTimer.threePhaseUnbalanceAlarm</timer>-->
+<!--    <timer>loadMessageAlarmTimer.loadMessageAlarm</timer>-->
+<!--    <timer>harmonicAlarmTimer.harmonicAlarm</timer>-->
+<!--    <timer>zeroSequenceCurrentTimer.allCommand</timer>-->
+<!--    <timer>phaseFaultTimer.allCommand</timer>-->
+<!--    <timer>basicElectricityChargeTimer.allCommand</timer>-->
 
-    <timer>monitorOnlineTimer.updateMonitorOnline</timer>
+<!--    <timer>monitorOnlineTimer.updateMonitorOnline</timer>-->
 
-    <timer>waterGasHeatStatisticsTimer.integralPoint</timer>
-    <timer>waterGasHeatStatisticsTimer.dayMaximum</timer>
-    <timer>waterGasHeatStatisticsTimer.monthMaximum</timer>
-    <timer>waterGasHeatStatisticsTimer.yearMaximum</timer>
-    <timer>waterGasHeatStatisticsTimer.otherEnergydailyDosage</timer>
+<!--    <timer>waterGasHeatStatisticsTimer.integralPoint</timer>-->
+<!--    <timer>waterGasHeatStatisticsTimer.dayMaximum</timer>-->
+<!--    <timer>waterGasHeatStatisticsTimer.monthMaximum</timer>-->
+<!--    <timer>waterGasHeatStatisticsTimer.yearMaximum</timer>-->
+<!--    <timer>waterGasHeatStatisticsTimer.otherEnergydailyDosage</timer>-->
 
-    <timer>overWarnTimer.warnningInfoTimer</timer>
-    <timer>h24Timer.h24Timer</timer>
+<!--    <timer>overWarnTimer.warnningInfoTimer</timer>-->
+<!--    <timer>overWarnTimer.calcOnlineDataOverWarn</timer>-->
+<!--    <timer>h24Timer.h24Timer</timer>-->
 
     <!--    <timer>fgpTimer.monitorFgpForEvery</timer>-->
     <!--    <timer>fgpTimer.monitorFgpForLastDate</timer>-->
     <!--    <timer>fgpTimer.monitorFgpFor7DaysAgo</timer>-->
+    <timer>overWarnTimer.calcOnlineDataOverWarn</timer>
+
 </timers>

+ 2 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/resources/product/schedule.xml

@@ -52,6 +52,8 @@
     <timer>waterGasHeatStatisticsTimer.otherEnergydailyDosage</timer>
 
     <timer>overWarnTimer.warnningInfoTimer</timer>
+    <timer>overWarnTimer.calcOnlineDataOverWarn</timer>
+
     <timer>h24Timer.h24Timer</timer>
 
 </timers>

+ 1 - 0
VB_DSM_V2.1/vbdsm-statistics/vbdsm-analysis/src/main/resources/test/schedule.xml

@@ -52,6 +52,7 @@
     <timer>waterGasHeatStatisticsTimer.otherEnergydailyDosage</timer>
 
     <timer>overWarnTimer.warnningInfoTimer</timer>
+    <timer>overWarnTimer.calcOnlineDataOverWarn</timer>
     <timer>h24Timer.h24Timer</timer>
 
 </timers>