package com.ld.igds.es.service; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.ld.igds.constant.BizType; import com.ld.igds.data.ChartLine; import com.ld.igds.data.ChartSeries; import com.ld.igds.grain.dto.GrainData; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.util.ContextUtil; import com.ld.igds.websocket.WebSocketPacket; import com.ld.igds.websocket.WebSocketServer; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ld.igds.constant.RedisConst; import com.ld.igds.es.dto.EsData; import com.ld.igds.es.dto.EsParam; import com.ld.igds.es.dto.EsSummary; import com.ld.igds.es.mapper.EsServiceMapper; import com.ld.igds.util.DateUtil; import com.ld.igds.util.RedisUtil; @Slf4j @Component(CoreEsService.BEAN_ID) public class CoreEsServiceImpl implements CoreEsService { // @Autowired // private WebSocketServer socketServer; @Autowired private EsServiceMapper esServiceMapper; @Autowired private RedisUtil redisUtil; @Override public List getSummaryGroupByDepot(EsParam param) { if (null == param.getCheckDate()) { return null; } // 说明按照日期来的 if ("day".equals(param.getTimeType())) { param.setStart(DateUtil.getCurZero(param.getCheckDate())); param.setEnd(DateUtil.getNextZero(param.getCheckDate())); } if ("month".equals(param.getTimeType())) { param.setStart(DateUtil.getMonthFirst(param.getCheckDate())); param.setEnd(DateUtil.getNextMonthFirst(param.getCheckDate())); } return esServiceMapper.getSummaryGroupByDepot(param); } @Override public EsSummary getSummaryByParam(EsParam param) { if (null == param.getStart()) new EsSummary(); if (null == param.getEnd()) new EsSummary(); EsSummary result = esServiceMapper.getSummaryByParam(param); if (null == result) result = new EsSummary(); return result; } @Override public List listSumGroupByDay(EsParam param) { if (null == param.getStart()) { param.setStart(DateUtil.getNewByDay(null, -30)); } return esServiceMapper.listSumGroupByDay(param); } @Override public List listDetailChartData(EsParam param) { if (null == param.getStart()) { param.setStart(DateUtil.getNewByDay(null, -30)); } if (null != param.getEnd()) { param.setEnd(DateUtil.getNextZero(param.getEnd())); } return esServiceMapper.listDetailChartData(param); } @Override public EsData getCacheEsData(String companyId, String depotId) { Map dataMap = getCacheEsDataMap(companyId); if (null == dataMap || dataMap.isEmpty()) { return null; } EsData result = null; for (String key : dataMap.keySet()) { if(key.startsWith(depotId)){ if(null == result){ result = dataMap.get(key); }else { result.setEp(result.getEp() + dataMap.get(key).getEp()); result.setEq(result.getEq() + dataMap.get(key).getEq()); result.setEs(result.getEs() + dataMap.get(key).getEs()); } } } return result; } @Override public EsData getCacheEsDepotData(String companyId, String depotId, String deviceId) { Map dataMap = getCacheEsDataMap(companyId); if (null == dataMap || dataMap.isEmpty()) { return null; } return dataMap.get(depotId + "-" + deviceId); } @Override public void updateCacheEsData(EsData esData) { Map dataMap = getCacheEsDataMap(esData.getCompanyId()); if (null == dataMap) { dataMap = new HashMap(); } else { dataMap.put(esData.getDepotId() + "-" + esData.getDeviceId(), esData); } String deptId = ContextUtil.subDeptId(null); String key = RedisConst.buildKey(esData.getCompanyId(), RedisConst.KEY_ES_DATA_MAP, deptId); redisUtil.set(key, dataMap); } @SuppressWarnings("unchecked") @Override public Map getCacheEsDataMap(String companyId) { String deptId = ContextUtil.subDeptId(null); String key = RedisConst.buildKey(companyId, RedisConst.KEY_ES_DATA_MAP, deptId); Map result = (Map) redisUtil.get(key); if (null == result) { log.info("系统中没有获取到能耗数据缓存信息!!"); } return result; } @Override public void saveAndUpdateInc(EsData data) { // 获取上次的缓存信息,如果缓存中的数据跟当前数据时间差小于12个小时,则计算增量,否则增量为0,增量不可为负数。 EsData oldData = getCacheEsDepotData(data.getCompanyId(), data.getDepotId(), data.getDeviceId()); if (null != oldData && oldData.getEs() > 0) { long time = data.getUpdateTime().getTime() - oldData.getUpdateTime().getTime(); if (time <= 12 * 60 * 60 * 1001) { data.setEpInc(data.getEp() - oldData.getEp()); data.setEpInc(data.getEpInc() > 0 ? data.getEpInc() : 0.0); data.setEqInc(data.getEq() - oldData.getEq()); data.setEqInc(data.getEqInc() > 0 ? data.getEqInc() : 0.0); data.setEsInc(data.getEs() - oldData.getEs()); data.setEsInc(data.getEsInc() > 0 ? data.getEsInc() : 0.0); } } if (null == data.getUpdateTime()) { data.setUpdateTime(new Date()); } if (StringUtils.isEmpty(data.getId())) { data.setId(data.getCompanyId() + "-" + data.getDepotId() + "-" + data.getDeviceId() + "-" + ContextUtil.getCurTimeMillis()); } // 更新缓存 this.updateCacheEsData(data); // 持久化数据库 esServiceMapper.insertData(data); } @SuppressWarnings("static-access") @Override public ChartLine queryScreenEsChart(EsParam esParam, boolean toWeb) { if (StringUtils.isEmpty(esParam.getCompanyId())) { esParam.setCompanyId(ContextUtil.getDefaultCompanyId()); } if (StringUtils.isEmpty(esParam.getDeptId())) { esParam.setDeptId(ContextUtil.subDeptId(null)); } List list = this.listSumGroupByDay(esParam); if (null == list || list.isEmpty()) return null; // 从新排序 list.sort((a, b) -> a.getGroupTag().compareTo(b.getGroupTag())); // 调整对象,groupTag = yyyy-MM-dd ChartLine line = new ChartLine(); ChartSeries series = new ChartSeries(); for (EsSummary sum : list) { line.getXaxisData().add(sum.getGroupTag().substring(5)); series.getData().add(String.valueOf(sum.getEpSum())); } line.getSeries().add(series); if (toWeb) { // 大屏的数据存放缓存,并推送页面 WebSocketPacket packet = new WebSocketPacket(); packet.setCompanyId(ContextUtil.getDefaultCompanyId()); packet.setBizType(BizType.SCREEN.getCode()); packet.setDeptId(esParam.getDeptId()); packet.setBizId(BizType.ES.getCode()); packet.setData(line); WebSocketServer.sendByPocket(packet); } return line; } }