package com.ld.igds.es.manager; import com.ld.igds.common.CoreCommonService; import com.ld.igds.common.CoreSerService; import com.ld.igds.constant.BizType; import com.ld.igds.constant.Constant; import com.ld.igds.constant.RespCodeEnum; import com.ld.igds.data.ChartLine; import com.ld.igds.data.PageResponse; 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.service.CoreEsService; import com.ld.igds.io.EsRemoteManager; import com.ld.igds.io.RemoteEsService; import com.ld.igds.io.constant.OrderRespEnum; import com.ld.igds.io.request.BaseRequest; import com.ld.igds.io.response.BaseResponse; import com.ld.igds.models.Depot; import com.ld.igds.models.DepotConf; import com.ld.igds.models.DeviceSer; import com.ld.igds.order.ExeOrderService; import com.ld.igds.order.data.ExeRequest; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.DateUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; /** * 能耗管理 * * @author: andy.jia * @description: * @version: * @data:2020年2月17日 */ @Slf4j @Component public class EsManager { @Autowired private CoreEsService coreEsService; @Autowired private CoreCommonService commonService; @Autowired private CoreSerService coreSerService; @Autowired private EsRemoteManager remoteManager; @Autowired private ExeOrderService exeOrderService; public PageResponse> querySummaryData(EsParam param) { Map result = new HashMap<>(); if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getCompanyId()); } // 第一步,根据参数获取每个仓库的统计信息,用于页面的柱状图,同时用来汇总 List list = coreEsService.getSummaryGroupByDepot(param); if (null == list || list.isEmpty()) { log.debug("---------没有获取到数据信息-------"); return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "根据条件获取数据为空"); } // 第二步,根据列表获取总数据信息 EsSummary sum = new EsSummary(); Depot depot; for (EsSummary esSummary : list) { sum.setEpSum(sum.getEpSum() + esSummary.getEpSum()); sum.setEqSum(sum.getEqSum() + esSummary.getEqSum()); sum.setEsSum(sum.getEsSum() + esSummary.getEsSum()); depot = commonService.getCacheDepot(param.getCompanyId(), esSummary.getGroupTag()); // 获取仓库名称 if (null != depot) { esSummary.setDepotName(depot.getName()); } else { esSummary.setDepotName(esSummary.getGroupTag()); } } sum.setEsCur(sum.getEsSum()); // 固定获取上个月的能耗统计 Date date = param.getCheckDate(); Date start = DateUtil.getPreMonthFirst(date); Date end = DateUtil.getMonthFirst(date); param.setStart(start); param.setEnd(end); EsSummary esSummary = coreEsService.getSummaryByParam(param); sum.setEsMom(esSummary.getEsSum()); // 固定获取去年本月的能耗信息 start = DateUtils.addYears(start, -1); start = DateUtils.addMonths(start, 1); end = DateUtils.addYears(end, -1); end = DateUtils.addMonths(end, 1); param.setStart(start); param.setEnd(end); esSummary = coreEsService.getSummaryByParam(param); sum.setEsYoy(esSummary.getEsSum()); result.put("esSum", sum); result.put("esSumList", list); return new PageResponse>(RespCodeEnum.CODE_0000, result); } public PageResponse> queryDetailData(EsParam param) { Map result = new HashMap(); if (null == param.getCompanyId()) { param.setCompanyId(ContextUtil.getDefaultCompanyId()); } if (null == param.getDepotId()) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到需要查询的仓库信息"); } // 第一步,根据参数获取满足条件内的数据信息 List list = coreEsService.listDetailChartData(param); if (null == list || list.isEmpty()) { log.debug("---------没有获取到数据信息-------"); return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "根据条件获取数据为空"); } // 第二步,根据列表获取总数据信息 EsSummary sum = new EsSummary(); for (EsData esData : list) { sum.setEpSum(sum.getEpSum() + esData.getEp()); sum.setEqSum(sum.getEqSum() + esData.getEq()); sum.setEsSum(sum.getEsSum() + esData.getEs()); } sum.setEsCur(sum.getEsSum()); // 固定获取上个月的能耗统计 Date date = param.getCheckDate(); Date start = DateUtil.getPreMonthFirst(date); Date end = DateUtil.getMonthFirst(date); param.setStart(start); param.setEnd(end); EsSummary esSummary = coreEsService.getSummaryByParam(param); sum.setEsMom(esSummary.getEsSum()); // 固定获取去年本月的能耗信息 start = DateUtils.addYears(start, -1); start = DateUtils.addMonths(start, 1); end = DateUtils.addYears(end, -1); end = DateUtils.addMonths(end, 1); param.setStart(start); param.setEnd(end); esSummary = coreEsService.getSummaryByParam(param); sum.setEsYoy(esSummary.getEsSum()); // 第三步,缓存获取当前实时能耗信息 EsData esCur = coreEsService.getCacheEsData(param.getCompanyId(), param.getDepotId()); result.put("esCur", esCur); result.put("esSum", sum); result.put("esSumList", list); return new PageResponse>(RespCodeEnum.CODE_0000, result); } /** * 大屏页面主动获取能耗统计信息,并更新缓存,推送到大屏,默认15天走势 * * @param companyId * @return */ public ChartLine queryScreenEsChart(String companyId) { EsParam esParam = new EsParam(); esParam.setCompanyId(companyId); esParam.setStart(DateUtil.getNewByDay(new Date(), -15)); return coreEsService.queryScreenEsChart(esParam, true); } /** * 根据配置信息获取能耗 * * @param depotConf * @return */ public BaseResponse checkEsByConf(DepotConf depotConf) { DeviceSer deviceSer = coreSerService.getCacheSer(depotConf.getCompanyId(), depotConf.getEsSer()); if (null == deviceSer) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "执行失败:没有配置能耗分机"); } if (null == deviceSer.getProtocol()) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "执行失败:没有配置通讯协议。"); } // if (Constant.YN_N.equals(deviceSer.getStatus())) { // return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), // "执行失败:能耗分机不在线。"); // } RemoteEsService remoteEsService = remoteManager.getRemoteEsService(deviceSer.getProtocol()); if (null == remoteEsService) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "执行失败:能耗分机配置协议未实现。"); } BaseRequest request = new BaseRequest(); request.setSerId(deviceSer.getId()); request.setPort(deviceSer.getPort()); request.setIp(deviceSer.getIp()); request.setCompanyId(deviceSer.getCompanyId()); request.setBizType(BizType.ES.getCode()); request.setSerName(deviceSer.getName()); request.setDepotId(depotConf.getDepotId()); request.setDepotName(depotConf.getDepotName()); ExeRequest exeRequest = new ExeRequest(request); exeOrderService.checkExecute(exeRequest); BaseResponse response = remoteEsService.checkEs(request); exeOrderService.addCache(exeRequest); return response; } public PageResponse> queryCurEsData() { Map result = coreEsService.getCacheEsDataMap(ContextUtil.getCompanyId()); if (null == result || result.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到实时信息"); } //获取有能耗配置的仓库列表 List listDepot = this.listEsDepot(null); if (null == listDepot || listDepot.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_1007.getCode(), "没有获取到实时信息"); } List list = new ArrayList<>(); EsData dto; //标记仓库是否有电表数据 boolean flag; for (Depot depot : listDepot) { flag = true; for (String key : result.keySet()) { if(key.startsWith(depot.getId())){ dto = result.get(key); dto.setDepotName(depot.getName()); if(StringUtils.isNotEmpty(dto.getDeviceName())){ dto.setDepotName(depot.getName() + " - " + dto.getDeviceName()); } dto.setDepotId(key); list.add(dto); flag = false; } } if (flag){ //标识没有当前仓库的电表数据,加入当前电表 dto = new EsData(); dto.setDepotName(depot.getName()); dto.setDepotId(depot.getId()); dto.setUa(0.0); dto.setUb(0.0); dto.setUc(0.0); dto.setIa(0.0); dto.setIb(0.0); dto.setIc(0.0); dto.setEsInc(0.0); dto.setUpdateTime(new Date()); } } return new PageResponse>(RespCodeEnum.CODE_0000, list); } /** * 获取配置能耗分机的仓库列表 * * @param deptId * @return */ public List listEsDepot(String deptId) { if (StringUtils.isEmpty(deptId)) { deptId = ContextUtil.subDeptId(null); } String companyId = ContextUtil.getCompanyId(); List list = commonService.getCacheDepotList(companyId, deptId); if (null == list || list.isEmpty()) { return list; } List result = new ArrayList<>(); DepotConf depotConf; for (Depot depot : list) { depotConf = commonService.getCacheDepotConf(companyId, depot.getId()); if (null == depotConf) { continue; } if (StringUtils.isNotEmpty(depotConf.getEsSer())) { result.add(depot); } } return result; } }