DYL
2025-02-08 bf11e1376ff82a5f32509ee4cb69cbc1782fddf4
Merge branch 'refs/heads/develop1.0' into dyl_dev
已添加5个文件
已删除1个文件
已修改5个文件
978 ■■■■■ 文件已修改
zhitan-system/src/main/java/com/zhitan/consumptionanalysis/service/impl/ConsumptionAnalysisServiceImpl.java 369 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/images/font01.png 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/images/img_logo.png 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/images/login-background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/images/login-background.png 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/assets/images/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/login copy.vue 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-vue/src/views/login.vue 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/java/com/zhitan/consumptionanalysis/service/impl/ConsumptionAnalysisServiceImpl.java
@@ -44,20 +44,20 @@
    private final ModelNodeMapper modelNodeMapper;
    private final EnergyIndicatorsMapper energyIndicatorsMapper;
    private final ProductOutputMapper productOutputMapper;
    private final SysEnergyMapper sysEnergyMapper;
    private final IDataItemService dataItemService;
    private final IModelNodeService modelNodeService;
    @Override
    public ConsumptionAnalysisVO getByArea(ConsumptionAnalysisDTO dto) {
        List<ConsumptionAnalysisData> dataList = new ArrayList<>();
        List<ChartData> chartDataList = new ArrayList<>();
        ConsumptionAnalysisVO consumptionAnalysisVO = new ConsumptionAnalysisVO();
        final String analysisType = dto.getAnalysisType();
        final String nodeId = dto.getNodeId();
@@ -67,7 +67,7 @@
        /**
         * æŸ¥è¯¢ç‚¹ä½ä¸Žç”¨èƒ½å•元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
@@ -88,7 +88,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetDay(beginTime, -1);
                lastEndTime = DateUtil.offsetDay(endTime, -1);
@@ -103,7 +103,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
@@ -118,18 +118,18 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetMonth(beginTime,  -1);
                lastEndTime = DateUtil.offsetMonth(endTime,  -1);
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
            }
            timeFormat = "yyyy-MM";
        }
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        List<DataItem> lastDataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
            lastDataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(lastTime, lastEndTime, shixuTimeType, indexIds);
        }
@@ -144,11 +144,11 @@
            final String compareTime;
            DateTime dateTime;
            if (TimeType.DAY.name().equals(queryTimeType)) {
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetDay(beginTime, -1);
                }
@@ -158,7 +158,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
@@ -168,25 +168,25 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetMonth(beginTime,  -1);
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
                compareTime = DateUtil.format(dateTime, timeFormat);
            }
            final List<DataItem> dataItems = dataItemMap.get(currentTime);
            final List<DataItem> lastDataItems = lastDataItemMap.get(compareTime);
            BigDecimal sum = new BigDecimal(0);
            BigDecimal lastSum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                 // æ±‚å’Œ
                 sum = BigDecimal.valueOf(dataItems.stream()
                // æ±‚å’Œ
                sum = BigDecimal.valueOf(dataItems.stream()
                        .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            }
            if(CollectionUtils.isNotEmpty(lastDataItems)) {
            if (CollectionUtils.isNotEmpty(lastDataItems)) {
                lastSum = BigDecimal.valueOf(lastDataItems.stream()
                        .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            }
@@ -194,7 +194,7 @@
            data.setCompareValue(lastSum.doubleValue());
            data.setCurrentTime(currentTime);
            data.setCompareTime(compareTime);
            if ("YOY".equals(analysisType)) {
                //同比分析
@@ -238,7 +238,7 @@
            chartDataList.add(chartData);
        });
        consumptionAnalysisVO.setDataList(dataList);
        consumptionAnalysisVO.setChartDataList(chartDataList);
        return consumptionAnalysisVO;
@@ -252,32 +252,32 @@
        String queryTimeType = dto.getTimeType();
        // åˆ›å»ºä¸€ä¸ªMap来存储总和
        Map<String, BigDecimal> result = new HashMap<>();
        //根据模型名称查询modelCode
        final String parentId = dto.getNodeId();
        //根据总结点查询
        final List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeByParentId(parentId);
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getEnername));
        final Map<String, String> nodeNameMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String nodeId = n.getNodeId();
            final String name = n.getName();
            if(!nodeNameMap.containsKey(nodeId)){
                nodeNameMap.put(nodeId,name);
            if (!nodeNameMap.containsKey(nodeId)) {
                nodeNameMap.put(nodeId, name);
            }
        });
        // æŒ‰ç…§ç‚¹ä½è¿›è¡Œåˆ†ç»„
        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect(
                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
        // æ ¹æ®nodeId获取能源类型
        // æ‰€æœ‰ç‚¹ä½ä¿¡æ¯
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).distinct().collect(Collectors.toList());
@@ -300,27 +300,26 @@
            endTime = DateUtil.endOfYear(queryTime);
            shixuTimeType = TimeType.MONTH.name();
        }
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        final Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        // æ ¹æ®ç‚¹ä½åˆ†ç»„,求和
        Map<String,BigDecimal> dataItemTotalMap = new HashMap<>();
        dataItemMap.forEach((key,value)->{
        Map<String, BigDecimal> dataItemTotalMap = new HashMap<>();
        dataItemMap.forEach((key, value) -> {
            BigDecimal sum = BigDecimal.valueOf(value.stream()
                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            dataItemTotalMap.put(key,sum);
            dataItemTotalMap.put(key, sum);
        });
        nodeIndexMap.forEach((nodeId,indexList)->{
            indexList.forEach(index->{
        nodeIndexMap.forEach((nodeId, indexList) -> {
            indexList.forEach(index -> {
                final String energyId = index.getEnergyId();
                final String indexId = index.getIndexId();
                final BigDecimal total = dataItemTotalMap.getOrDefault(indexId, BigDecimal.ZERO);
@@ -337,15 +336,15 @@
            String energyId = keys[1];
            BigDecimal totalEnergy = entry.getValue();
            chartData.setEnergyTypeNo(energyId);
            chartData.setEnergyTypeName(energyNameMap.getOrDefault(energyId,""));
            chartData.setNodeName(nodeNameMap.getOrDefault(nodeId,""));
            chartData.setEnergyTypeName(energyNameMap.getOrDefault(energyId, ""));
            chartData.setNodeName(nodeNameMap.getOrDefault(nodeId, ""));
            chartData.setEnergyConsumption(totalEnergy.doubleValue());
            chartData.setNodeId(nodeId);
            rankingEnergyData.add(chartData);
        }
        final Map<String, List<RankingEnergyData>> collect = rankingEnergyData.stream().collect(Collectors.groupingBy(RankingEnergyData::getNodeId));
        nodeNameMap.forEach((key,value)->{
        nodeNameMap.forEach((key, value) -> {
            final List<RankingEnergyData> rankingEnergyData1 = collect.get(key);
            RankingDataVO rankingDataVO = new RankingDataVO();
            rankingDataVO.setNodeId(key);
@@ -353,7 +352,7 @@
            rankingDataVO.setData(rankingEnergyData1);
            rankingDataVOArrayList.add(rankingDataVO);
        });
        return rankingDataVOArrayList;
    }
@@ -382,7 +381,7 @@
        List<EnergyProportion> energyProportionList = new ArrayList<>();
        ConsumptionAnalysisVO consumptionAnalysisVO = new ConsumptionAnalysisVO();
        //todo hmj ç»¼åˆèƒ½è€—先默认取同比
        final String analysisType = "YOY";
        final String nodeId = dto.getNodeId();
@@ -392,24 +391,25 @@
        /**
         * æŸ¥è¯¢ç‚¹ä½ä¸Žç”¨èƒ½å•元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
//        }
        //修改过滤统计点位
        nodeIndexInforList = nodeIndexInforList.stream().filter(x -> "STATISTIC".equals(x.getIndexType())).collect(Collectors.toList());
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno,SysEnergy::getEnername));
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getEnername));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -428,7 +428,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetDay(beginTime, -1);
                lastEndTime = DateUtil.offsetDay(endTime, -1);
@@ -443,7 +443,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
@@ -458,10 +458,10 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 æ˜¨å¤©
                lastTime = DateUtil.offsetMonth(beginTime,  -1);
                lastEndTime = DateUtil.offsetMonth(endTime,  -1);
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
            }
            timeFormat = "yyyy-MM";
@@ -469,7 +469,7 @@
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        List<DataItem> lastDataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
            lastDataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(lastTime, lastEndTime, shixuTimeType, indexIds);
        }
@@ -478,7 +478,7 @@
        //  å€çއ
        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
        Map<String,Double> energyProportionMap = new HashMap<>();
        Map<String, Double> energyProportionMap = new HashMap<>();
        while (!beginTime.after(endTime)) {
            ConsumptionAnalysisData data = new ConsumptionAnalysisData();
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -489,7 +489,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetDay(beginTime, -1);
                }
@@ -499,7 +499,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
@@ -509,9 +509,9 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 æ˜¨å¤©
                    dateTime = DateUtil.offsetMonth(beginTime,  -1);
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
                compareTime = DateUtil.format(dateTime, timeFormat);
            }
@@ -523,38 +523,40 @@
            BigDecimal lastSum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // æ±‚å’Œ
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
//                    if(energyProportionMap.containsKey(energyId)) {
//                        energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum.doubleValue());
//                    }else {
//                        energyProportionMap.put(energyId, sum.doubleValue());
//                    }
                }
            }
            if(CollectionUtils.isNotEmpty(lastDataItems)) {
                for (int i=0;i<lastDataItems.size(); i++){
            if (CollectionUtils.isNotEmpty(lastDataItems)) {
                for (int i = 0; i < lastDataItems.size(); i++) {
                    final DataItem dataItem = lastDataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    lastSum = lastSum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    lastSum = lastSum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
                }
            }
            data.setCurrentValue(sum.doubleValue());
@@ -605,34 +607,34 @@
            chartDataList.add(chartData);
        });
        Double eneryTotal =  energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Double eneryTotal = energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Map<String, List<DataItem>> indexDataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        indexDataItemMap.forEach((indexId,value)->{
        indexDataItemMap.forEach((indexId, value) -> {
            final String energyId = indexIdEnergyIdMap.get(indexId);
            final BigDecimal coefficient = energyCoefficientMap.get(energyId);
            if(coefficient == null){
            if (coefficient == null) {
                throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
            }
            final double sum = value.stream().map(DataItem::getValue).mapToDouble(Double::doubleValue).sum();
            if(energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            }else {
            if (energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId, energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            } else {
                energyProportionMap.put(energyId, sum * coefficient.doubleValue());
            }
        });
        energyProportionMap.forEach((key,value)->{
        energyProportionMap.forEach((key, value) -> {
            EnergyProportion energyProportion = new EnergyProportion();
            energyProportion.setEnergyNo(key);
            energyProportion.setEnergyName(energyNameMap.getOrDefault(key,""));
            energyProportion.setEnergyName(energyNameMap.getOrDefault(key, ""));
            energyProportion.setCount(value);
            energyProportion.setPercentage(value/eneryTotal * 100);
            energyProportion.setPercentage(value / eneryTotal * 100);
            energyProportionList.add(energyProportion);
        });
@@ -660,50 +662,50 @@
        } else {
            timeFormat = "yyyy";
        }
        final Double currTotalEnergy = getTotalEnergy(dto);
        DateTime tongbiTime = DateUtil.offsetMonth(queryTime, -12);
        dto.setDataTime(tongbiTime);
        final Double tongbiTotalEnergy = getTotalEnergy(dto);
        DateTime huanbiTime = DateUtil.offsetMonth(queryTime, -1);
        dto.setDataTime(huanbiTime);
        final Double huanbiTotalEnergy = getTotalEnergy(dto);
        tongbi.setCurrentTime(DateUtil.format(queryTime,timeFormat));
        tongbi.setCompareTime(DateUtil.format(tongbiTime,timeFormat));
        tongbi.setCurrentTime(DateUtil.format(queryTime, timeFormat));
        tongbi.setCompareTime(DateUtil.format(tongbiTime, timeFormat));
        tongbi.setCurrentValue(currTotalEnergy);
        tongbi.setCompareValue(tongbiTotalEnergy);
        if(tongbiTotalEnergy != 0) {
        if (tongbiTotalEnergy != 0) {
            final double tongbiRatio = (currTotalEnergy - tongbiTotalEnergy) / tongbiTotalEnergy * 100;
            BigDecimal bd = new BigDecimal(tongbiRatio);
            bd = bd.setScale(2, RoundingMode.HALF_UP);
            tongbi.setRatio(bd.doubleValue());
        }else {
        } else {
            tongbi.setRatio(0);
        }
        huanbi.setCurrentTime(DateUtil.format(queryTime,timeFormat));
        huanbi.setCompareTime(DateUtil.format(huanbiTime,timeFormat));
        huanbi.setCurrentTime(DateUtil.format(queryTime, timeFormat));
        huanbi.setCompareTime(DateUtil.format(huanbiTime, timeFormat));
        huanbi.setCompareValue(huanbiTotalEnergy);
        huanbi.setCurrentValue(currTotalEnergy);
        if(huanbiTotalEnergy != 0) {
        if (huanbiTotalEnergy != 0) {
            final double huanbiRatio = (currTotalEnergy - huanbiTotalEnergy) / huanbiTotalEnergy * 100;
            BigDecimal bd = new BigDecimal(huanbiRatio);
            bd = bd.setScale(2, RoundingMode.HALF_UP);
            huanbi.setRatio(bd.doubleValue());
        }else {
        } else {
            huanbi.setRatio(0);
        }
        consumptionAnalysisVO.setTongbi(tongbi);
        consumptionAnalysisVO.setHuanbi(huanbi);
        return consumptionAnalysisVO;
    }
    public Double getTotalEnergy(ConsumptionAnalysisDTO dto){
    public Double getTotalEnergy(ConsumptionAnalysisDTO dto) {
        //todo hmj ç»¼åˆèƒ½è€—先默认取同比
        final String nodeId = dto.getNodeId();
        final String energyType = dto.getEnergyType();
@@ -712,23 +714,23 @@
        /**
         * æŸ¥è¯¢ç‚¹ä½ä¸Žç”¨èƒ½å•元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
//        }
        nodeIndexInforList = nodeIndexInforList.stream().filter(x -> "STATISTIC".equals(x.getIndexType())).collect(Collectors.toList());
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -757,12 +759,12 @@
        }
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), timeFormat)));
        Map<String,Double> energyProportionMap = new HashMap<>();
        Map<String, Double> energyProportionMap = new HashMap<>();
        while (!beginTime.after(endTime)) {
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -770,17 +772,18 @@
            BigDecimal sum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // æ±‚å’Œ
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
//                    if(energyProportionMap.containsKey(energyId)) {
//                        energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum.doubleValue());
//                    }else {
@@ -804,26 +807,24 @@
        }
        Map<String, List<DataItem>> indexDataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        indexDataItemMap.forEach((indexId,value)->{
        indexDataItemMap.forEach((indexId, value) -> {
            final String energyId = indexIdEnergyIdMap.get(indexId);
            final BigDecimal coefficient = energyCoefficientMap.get(energyId);
            if(coefficient == null){
            if (coefficient == null) {
                throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
            }
            final double sum = value.stream().map(DataItem::getValue).mapToDouble(Double::doubleValue).sum();
            if(energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            }else {
            if (energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId, energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            } else {
                energyProportionMap.put(energyId, sum * coefficient.doubleValue());
            }
        });
        Double eneryTotal =  energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Double eneryTotal = energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        return eneryTotal.doubleValue();
    }
@@ -839,11 +840,11 @@
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeByParentId(nodeId);
        final Map<String, String> nodeNameMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String id = n.getNodeId();
            final String name = n.getName();
            if(!nodeNameMap.containsKey(id)){
                nodeNameMap.put(id,name);
            if (!nodeNameMap.containsKey(id)) {
                nodeNameMap.put(id, name);
            }
        });
        // æŒ‰ç…§ç‚¹ä½è¿›è¡Œåˆ†ç»„
@@ -851,17 +852,17 @@
                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        //能源编号和能源折标系数
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        //index和能源
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -886,22 +887,22 @@
        }
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        Map<String,BigDecimal> resultMap = new HashMap<>();
        Map<String, BigDecimal> resultMap = new HashMap<>();
        nodeIndexMap.forEach((key, value) -> {
            // æ‰¾å‡ºindexIds
            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
            indexIdList.forEach(indexId->{
            indexIdList.forEach(indexId -> {
                final List<DataItem> dataItems = dataItemMap.get(indexId);
                final String energyId = indexIdEnergyIdMap.get(indexId);
                final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                if(CollectionUtils.isNotEmpty(dataItems) ){
                if (CollectionUtils.isNotEmpty(dataItems)) {
                    BigDecimal sum = BigDecimal.valueOf(dataItems.stream()
                            .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(coefficient);
@@ -914,7 +915,7 @@
            });
        });
        resultMap.forEach((key,value)->{
        resultMap.forEach((key, value) -> {
            RankingEnergyData rankingEnergyData = new RankingEnergyData();
            rankingEnergyData.setNodeId(key);
            rankingEnergyData.setNodeName(nodeNameMap.get(key));
@@ -950,30 +951,30 @@
        }
        LambdaQueryWrapper<EnergyIndicators> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EnergyIndicators::getTimeType,queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime,DateUtil.format(dto.getDataTime(),timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId,dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType,dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getTimeType, queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime, DateUtil.format(dto.getDataTime(), timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId, dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType, dto.getEnergyType());
        // 0 æ˜¯è®¡åˆ’量
        queryWrapper.eq(EnergyIndicators::getIndicatorsType,"0");
        queryWrapper.eq(EnergyIndicators::getIndicatorsType, "0");
        final EnergyIndicators plan = energyIndicatorsMapper.selectOne(queryWrapper);
        if(null != plan && null!= plan.getNumber()) {
        if (null != plan && null != plan.getNumber()) {
            consumptionAnalysisVO.setPlanCount(plan.getNumber().divide(new BigDecimal(between), CommonConst.DIGIT_2, RoundingMode.HALF_UP).doubleValue());
        }else {
        } else {
            consumptionAnalysisVO.setPlanCount(0D);
        }
        queryWrapper.clear();
        queryWrapper.eq(EnergyIndicators::getTimeType,queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime,DateUtil.format(dto.getDataTime(),timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId,dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType,dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getIndicatorsType,"1");
        queryWrapper.eq(EnergyIndicators::getTimeType, queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime, DateUtil.format(dto.getDataTime(), timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId, dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType, dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getIndicatorsType, "1");
        final EnergyIndicators prod = energyIndicatorsMapper.selectOne(queryWrapper);
        if(null != prod && null!= prod.getNumber()) {
        if (null != prod && null != prod.getNumber()) {
            consumptionAnalysisVO.setPlanCount(prod.getNumber().divide(new BigDecimal(between), CommonConst.DIGIT_2, RoundingMode.HALF_UP).doubleValue());
        }else {
        } else {
            consumptionAnalysisVO.setProdCount(0D);
        }
        return consumptionAnalysisVO;
@@ -993,19 +994,19 @@
        /**
         * æŸ¥è¯¢ç‚¹ä½ä¸Žç”¨èƒ½å•元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -1032,12 +1033,11 @@
            shixuTimeType = TimeType.MONTH.name();
            timeFormat = "yyyy-MM";
        }
        // æ ¹æ®indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), timeFormat)));
@@ -1045,12 +1045,12 @@
        while (!beginTime.after(endTime)) {
            //查询开始时间和结束时间之间的产量
            LambdaQueryWrapper<ProductOutput> indicatorsWrapper = new LambdaQueryWrapper<>();
            indicatorsWrapper.eq(ProductOutput::getTimeType,shixuTimeType);
            indicatorsWrapper.eq(ProductOutput::getNodeId,dto.getNodeId());
            indicatorsWrapper.eq(ProductOutput::getDataTime,DateUtil.format(beginTime,timeFormat));
            indicatorsWrapper.eq(ProductOutput::getTimeType, shixuTimeType);
            indicatorsWrapper.eq(ProductOutput::getNodeId, dto.getNodeId());
            indicatorsWrapper.eq(ProductOutput::getDataTime, DateUtil.format(beginTime, timeFormat));
            List<ProductOutput> energyIndicators = productOutputMapper.selectList(indicatorsWrapper);
            prodCountMap.put(DateUtil.format(beginTime,timeFormat),energyIndicators);
            prodCountMap.put(DateUtil.format(beginTime, timeFormat), energyIndicators);
            ConsumptionAnalysisData data = new ConsumptionAnalysisData();
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -1058,17 +1058,18 @@
            BigDecimal sum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // æ±‚å’Œ
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
                }
            }
@@ -1090,18 +1091,18 @@
                    break;
            }
        }
        dataList.forEach(d->{
        dataList.forEach(d -> {
            ProductEnergyAnalysisData productEnergyAnalysisData = new ProductEnergyAnalysisData();
            final String currentTime = d.getCurrentTime();
            productEnergyAnalysisData.setDateTime(currentTime);
            final List<ProductOutput> productOutputs = prodCountMap.get(currentTime);
            if(StringUtils.isEmpty(dto.getProdType())){
            if (StringUtils.isEmpty(dto.getProdType())) {
                productEnergyAnalysisData.setEnergyCount(format2Double(d.getCurrentValue()));
                final double sum = productOutputs.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                productEnergyAnalysisData.setProductCount(format2Double(sum));
                if(sum != 0) {
                if (sum != 0) {
                    final double averageEnergy = productEnergyAnalysisData.getEnergyCount() / productEnergyAnalysisData.getProductCount();
                    // åˆ›å»ºDecimalFormat对象,设置保留两位小数
                    DecimalFormat df = new DecimalFormat("#.00");
@@ -1109,15 +1110,15 @@
                    // æ ¼å¼åŒ–结果
                    String formattedResult = df.format(averageEnergy);
                    productEnergyAnalysisData.setAverage(Double.valueOf(formattedResult));
                }else {
                } else {
                    productEnergyAnalysisData.setAverage(0);
                }
            }else {
                if(CollectionUtils.isNotEmpty(productOutputs)) {
            } else {
                if (CollectionUtils.isNotEmpty(productOutputs)) {
                    final Map<String, List<ProductOutput>> productTypeMap = productOutputs.stream().collect(Collectors.groupingBy(ProductOutput::getProductType));
                    final double sum = productOutputs.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                    final List<ProductOutput> outputList = productTypeMap.get(dto.getProdType());
                    if(CollectionUtils.isNotEmpty(outputList)) {
                    if (CollectionUtils.isNotEmpty(outputList)) {
                        final double enengyProd = outputList.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                        productEnergyAnalysisData.setProductCount(format2Double(enengyProd));
                        productEnergyAnalysisData.setEnergyCount(format2Double(d.getCurrentValue() * enengyProd / sum));
@@ -1128,19 +1129,19 @@
                        } else {
                            productEnergyAnalysisData.setAverage(0);
                        }
                    }else {
                    } else {
                        productEnergyAnalysisData.setProductCount(0);
                        productEnergyAnalysisData.setEnergyCount(d.getCurrentValue());
                        productEnergyAnalysisData.setAverage(0);
                    }
                }else {
                } else {
                    productEnergyAnalysisData.setProductCount(0);
                    productEnergyAnalysisData.setEnergyCount(d.getCurrentValue());
                    productEnergyAnalysisData.setAverage(0);
                }
            }
            chart.add(productEnergyAnalysisData);
        });
@@ -1149,9 +1150,9 @@
        final double totalProd = chart.stream().map(ProductEnergyAnalysisData::getProductCount).mapToDouble(Double::doubleValue).sum();
        productEnergyAnalysisVO.setTotalEnergy(format2Double(totalEnergy));
        productEnergyAnalysisVO.setTotalProduct(format2Double(totalProd));
        if(totalProd != 0) {
        if (totalProd != 0) {
            productEnergyAnalysisVO.setAverageEnergy(format2Double(totalEnergy / totalProd));
        }else {
        } else {
            productEnergyAnalysisVO.setAverageEnergy(0D);
        }
        return productEnergyAnalysisVO;
zhitan-system/src/main/java/com/zhitan/model/domain/vo/ModelNodeIndexInfor.java
@@ -32,6 +32,8 @@
   */
  private String energyId;
  private String indexType;
  public String getNodeId() {
    return nodeId;
  }
@@ -63,4 +65,12 @@
  public void setEnergyId(String energyId) {
    this.energyId = energyId;
  }
  public String getIndexType() {
    return indexType;
  }
  public void setIndexType(String indexType) {
    this.indexType = indexType;
  }
}
zhitan-system/src/main/resources/mapper/dataitem/DataItemMapper.xml
@@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhitan.dataitem.mapper.DataItemMapper">
    <resultMap type="StagseDataEntry" id="stagseDataEntryResult">
    <resultMap type="com.zhitan.dataitem.domain.StagseDataEntry" id="stagseDataEntryResult">
        <result property="code" column="code"/>
        <result property="name" column="name"/>
        <result property="indexId" column="index_id"/>
@@ -15,7 +15,7 @@
        <result property="dataTime" column="data_time"/>
    </resultMap>
    <select id="getSettingIndex" parameterType="StagseDataEntry" resultMap="stagseDataEntryResult">
    <select id="getSettingIndex" parameterType="com.zhitan.dataitem.domain.StagseDataEntry" resultMap="stagseDataEntryResult">
        SELECT
        ei.index_id,
@@ -33,7 +33,7 @@
        and si.time_type = #{timeType}
        AND si.calc_type = #{calcType}
   </select>
    <select id="getSettingEdit" parameterType="StagseDataEntry" resultMap="stagseDataEntryResult">
    <select id="getSettingEdit" parameterType="com.zhitan.dataitem.domain.StagseDataEntry" resultMap="stagseDataEntryResult">
        SELECT
            ei.index_id,
            code,
@@ -54,7 +54,7 @@
            AND data_time &gt;= #{beginTime}
            AND data_time &lt;= #{endTime}
    </select>
    <select id="stagseDataByCode" parameterType="StagseDataEntry" resultMap="stagseDataEntryResult">
    <select id="stagseDataByCode" parameterType="com.zhitan.dataitem.domain.StagseDataEntry" resultMap="stagseDataEntryResult">
        SELECT
            ei.index_id,
            code,
zhitan-system/src/main/resources/mapper/model/ModelNodeMapper.xml
@@ -382,7 +382,8 @@
        SELECT mn.node_id  nodeId,
               mn."name"   "name",
               ni.index_id indexId,
               ei.energy_id energyId
               ei.energy_id energyId,
               ei.index_type indexType
        FROM "model_node" mn
        LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
        LEFT JOIN energy_index ei on ni.index_id = ei.index_id
zhitan-vue/src/assets/images/font01.png
zhitan-vue/src/assets/images/img_logo.png
zhitan-vue/src/assets/images/login-background.jpg
Binary files differ
zhitan-vue/src/assets/images/login-background.png
zhitan-vue/src/assets/images/logo.png
zhitan-vue/src/views/login copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
<template>
  <div class="login">
    <!-- <div
      class="login-logo-bg"
      v-if="systemInfo && systemInfo.homeLogo"
      :style="{ backgroundImage: 'url(' + systemInfo.homeLogo + ')', backgroundSize: '100% 100%' }"
    ></div> -->
    <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" />
    <div class="login-font" v-else>{{ systemInfo.systemName || "能源管理系统" }}</div>
    <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
      <!-- <h3 class="title">充电桩后台管理系统</h3> -->
      <el-form-item prop="username">
        <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
          <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
        </el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input
          v-model="loginForm.password"
          type="password"
          size="large"
          auto-complete="off"
          placeholder="密码"
          show-password
          @keyup.enter="handleLogin"
        >
          <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
        </el-input>
      </el-form-item>
      <el-form-item prop="code" v-if="captchaEnabled">
        <el-input
          v-model="loginForm.code"
          size="large"
          auto-complete="off"
          placeholder="验证码"
          style="width: 63%"
          @keyup.enter="handleLogin"
        >
          <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
        </el-input>
        <div class="login-code">
          <img :src="codeUrl" @click="getCode" class="login-code-img" />
        </div>
      </el-form-item>
      <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
      <el-form-item style="width: 100%">
        <el-button
          :loading="loading"
          size="large"
          type="primary"
          style="width: 100%"
          color="#626aef"
          :dark="isDark"
          @click.prevent="handleLogin"
        >
          <span v-if="!loading">登 å½•</span>
          <span v-else>登 å½• ä¸­...</span>
        </el-button>
      </el-form-item>
    </el-form>
    <!--  åº•部  -->
    <div class="el-login-footer">
      <!-- <span>Copyright Â© 2021-2024 ZhiTanCloud All Rights Reserved.</span> -->
      <span>{{ systemInfo.copyRight || "Copyright Â© 2017-2024 ZhiTanCloud All Rights Reserved." }}</span>
    </div>
  </div>
</template>
<script setup>
import { getCodeImg } from "@/api/login"
import Cookies from "js-cookie"
import { encrypt, decrypt } from "@/utils/jsencrypt"
import useUserStore from "@/store/modules/user"
const userStore = useUserStore()
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance()
const systemInfo1 = JSON.parse(Cookies.get("SystemInfo") || "{}")
const systemInfo = {
  ...systemInfo1,
  homeLogo: systemInfo1.homeLogo
    ? systemInfo1.homeLogo.includes("http")
      ? systemInfo1.homeLogo
      : "https://demo-ems.zhitancloud.com" + systemInfo1.homeLogo
    : "",
}
console.log(systemInfo)
const loginForm = ref({
  username: "admin",
  password: "admin123",
  rememberMe: false,
  code: "",
  uuid: "",
})
const loginRules = {
  username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
  password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
  code: [{ required: true, trigger: "change", message: "请输入验证码" }],
}
const codeUrl = ref("")
const loading = ref(false)
// éªŒè¯ç å¼€å…³
const captchaEnabled = ref(true)
// æ³¨å†Œå¼€å…³
const register = ref(false)
const redirect = ref(undefined)
watch(
  route,
  (newRoute) => {
    redirect.value = newRoute.query && newRoute.query.redirect
  },
  { immediate: true }
)
function handleLogin() {
  proxy.$refs.loginRef.validate((valid) => {
    if (valid) {
      loading.value = true
      // å‹¾é€‰äº†éœ€è¦è®°ä½å¯†ç è®¾ç½®åœ¨ cookie ä¸­è®¾ç½®è®°ä½ç”¨æˆ·åå’Œå¯†ç 
      if (loginForm.value.rememberMe) {
        Cookies.set("username", loginForm.value.username, { expires: 30 })
        Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
        Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
      } else {
        // å¦åˆ™ç§»é™¤
        Cookies.remove("username")
        Cookies.remove("password")
        Cookies.remove("rememberMe")
      }
      // è°ƒç”¨action的登录方法
      userStore
        .login(loginForm.value)
        .then(() => {
          const query = route.query
          const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
            if (cur !== "redirect") {
              acc[cur] = query[cur]
            }
            return acc
          }, {})
          router.push({ path: redirect.value || "/", query: otherQueryParams })
        })
        .catch(() => {
          loading.value = false
          // é‡æ–°èŽ·å–éªŒè¯ç 
          if (captchaEnabled.value) {
            getCode()
          }
        })
    }
  })
}
function getCode() {
  getCodeImg().then((res) => {
    captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
    if (captchaEnabled.value) {
      codeUrl.value = "data:image/gif;base64," + res.img
      loginForm.value.uuid = res.uuid
    }
  })
}
function getCookie() {
  const username = Cookies.get("username")
  const password = Cookies.get("password")
  const rememberMe = Cookies.get("rememberMe")
  loginForm.value = {
    username: username === undefined ? loginForm.value.username : username,
    password: password === undefined ? loginForm.value.password : decrypt(password),
    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
  }
}
getCode()
getCookie()
</script>
<style lang="scss" scoped>
.login {
  display: flex;
  align-items: center;
  height: 100%;
  background-image: url("@/assets/images/login-bg.jpg");
  background-size: 100% 100%;
  flex-direction: column;
  position: relative;
  min-width: 700px;
  min-height: 700px;
}
.title {
  margin: 0px auto 30px auto;
  text-align: center;
  color: #707070;
}
.login-form {
  position: absolute;
  left: 50%;
  top: 60%;
  transform: translate(-50%, -50%);
  border-radius: 6px;
  // background: #ffffff;
  width: 400px;
  padding: 25px 25px 5px 25px;
  .el-input {
    height: 40px;
    input {
      height: 40px;
    }
  }
  .input-icon {
    height: 39px;
    width: 14px;
    margin-left: 0px;
  }
}
.login-tip {
  font-size: 13px;
  text-align: center;
  color: #bfbfbf;
}
.login-code {
  width: 33%;
  height: 40px;
  float: right;
  img {
    cursor: pointer;
    vertical-align: middle;
  }
}
.el-login-footer {
  height: 40px;
  line-height: 40px;
  position: fixed;
  bottom: 0;
  width: 100%;
  text-align: center;
  color: #fff;
  font-family: Arial;
  font-size: 12px;
  letter-spacing: 1px;
}
.login-code-img {
  height: 40px;
  padding-left: 12px;
}
.login-logo-bg {
  width: 514px;
  height: 177px;
  // background-image: url('@/assets/images/login-logo.png');
  // background-size: 100% 100%;
  position: absolute;
  left: 50%;
  top: 22%;
  transform: translate(-50%, -50%);
}
.login-logo-img {
  // width: 100%;
  // height: 100%;
  // transform: translate(-50%, -50%);
  max-height: 200px;
  margin: 0 auto;
  position: absolute;
  top: 17%;
}
.login-font {
  font-size: 50px;
  color: #fff;
  top: 32%;
  position: absolute;
  left: 50%;
  width: 514px;
  text-align: center;
  transform: translate(-50%, -50%);
}
</style>
zhitan-vue/src/views/login.vue
@@ -1,67 +1,83 @@
<template>
  <div class="login">
    <!-- <div
      class="login-logo-bg"
      v-if="systemInfo && systemInfo.homeLogo"
      :style="{ backgroundImage: 'url(' + systemInfo.homeLogo + ')', backgroundSize: '100% 100%' }"
    ></div> -->
    <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" />
    <div class="login-font" v-else>{{ systemInfo.systemName || "能源管理系统" }}</div>
    <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
      <!-- <h3 class="title">充电桩后台管理系统</h3> -->
      <el-form-item prop="username">
        <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
          <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
        </el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input
          v-model="loginForm.password"
          type="password"
          size="large"
          auto-complete="off"
          placeholder="密码"
          show-password
          @keyup.enter="handleLogin"
        >
          <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
        </el-input>
      </el-form-item>
      <el-form-item prop="code" v-if="captchaEnabled">
        <el-input
          v-model="loginForm.code"
          size="large"
          auto-complete="off"
          placeholder="验证码"
          style="width: 63%"
          @keyup.enter="handleLogin"
        >
          <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
        </el-input>
        <div class="login-code">
          <img :src="codeUrl" @click="getCode" class="login-code-img" />
    <!-- <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" />
    <div class="login-font" v-else>{{ systemInfo.systemName || "能源管理系统" }}</div> -->
    <!-- å·¦ä¸Šè§’logo -->
    <div>
      <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" />
    </div>
    <!-- ä¸­é—´éƒ¨åˆ†form -->
    <div class="middle-view">
      <div class="left-wrapper">
        <div class="login-font">{{ systemInfo.systemName || "" }}</div>
        <img src="@/assets/images/font01.png" alt="" style="width: 406px" />
        <img src="@/assets/images/img_logo.png" alt="" style="width: 200px; margin-top: 20px" />
      </div>
      <div class="right-wrapper">
        <div class="header">
          <span>账号登录</span>
        </div>
      </el-form-item>
      <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
      <el-form-item style="width: 100%">
        <el-button
          :loading="loading"
          size="large"
          type="primary"
          style="width: 100%"
          color="#626aef"
          :dark="isDark"
          @click.prevent="handleLogin"
        >
          <span v-if="!loading">登 å½•</span>
          <span v-else>登 å½• ä¸­...</span>
        </el-button>
      </el-form-item>
    </el-form>
        <div class="bottom-block"></div>
        <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form" :label-position="'top'">
          <el-form-item prop="username" label="账号">
            <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
              <!-- <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> -->
            </el-input>
          </el-form-item>
          <el-form-item prop="password" label="密码">
            <el-input
              v-model="loginForm.password"
              type="password"
              size="large"
              auto-complete="off"
              placeholder="密码"
              show-password
              @keyup.enter="handleLogin"
            >
              <!-- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> -->
            </el-input>
          </el-form-item>
          <el-form-item prop="code" v-if="captchaEnabled" label="验证码">
            <el-input
              v-model="loginForm.code"
              size="large"
              auto-complete="off"
              placeholder="验证码"
              style="width: 266px"
              @keyup.enter="handleLogin"
            >
              <!-- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> -->
            </el-input>
            <div class="login-code">
              <img :src="codeUrl" @click="getCode" class="login-code-img" />
            </div>
          </el-form-item>
          <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
          <el-form-item style="width: 100%">
            <el-button
              :loading="loading"
              size="large"
              type="primary"
              style="width: 100%"
              color="#626aef"
              :dark="isDark"
              @click.prevent="handleLogin"
              class="submit-btn"
            >
              <span v-if="!loading">登 å½•</span>
              <span v-else>登 å½• ä¸­...</span>
            </el-button>
          </el-form-item>
        </el-form>
      </div>
    </div>
    <!--  åº•部  -->
    <div class="el-login-footer">
      <!-- <span>Copyright Â© 2021-2024 ZhiTanCloud All Rights Reserved.</span> -->
      <span>{{ systemInfo.copyRight || "Copyright Â© 2017-2024 ZhiTanCloud All Rights Reserved." }}</span>
      <span>{{
        systemInfo.copyRight || "Copyright Â© 2017-" + new Date().getFullYear() + " ZhiTanCloud All Rights Reserved."
      }}</span>
    </div>
  </div>
</template>
@@ -76,12 +92,20 @@
const route = useRoute()
const router = useRouter()
const { proxy } = getCurrentInstance()
const systemInfo = JSON.parse(Cookies.get("SystemInfo") || "{}")
const systemInfo1 = JSON.parse(Cookies.get("SystemInfo") || "{}")
const systemInfo = {
  ...systemInfo1,
  homeLogo: systemInfo1.homeLogo
    ? systemInfo1.homeLogo.includes("http")
      ? systemInfo1.homeLogo
      : "https://demo-ems.zhitancloud.com" + systemInfo1.homeLogo
    : "",
}
console.log(systemInfo)
const loginForm = ref({
  username: "admin",
  password: "admin123",
  username: "guestUser",
  password: "guest@123456",
  rememberMe: false,
  code: "",
  uuid: "",
@@ -178,29 +202,93 @@
  display: flex;
  align-items: center;
  height: 100%;
  background-image: url("@/assets/images/login-bg.jpg");
  background-size: 100% 100%;
  background-image: url("@/assets/images/login-background.png");
  background-repeat: no-repeat;
  background-size: cover;
  flex-direction: column;
  position: relative;
  min-width: 700px;
  min-height: 700px;
}
.title {
  margin: 0px auto 30px auto;
  text-align: center;
  color: #707070;
.middle-view {
  display: flex;
  align-items: center;
  justify-content: space-around;
  height: 100%;
  width: 1200px;
  .left-wrapper {
    width: 420px;
    display: flex;
    flex-direction: column;
  }
  .login-font {
    font-size: 34px;
    font-weight: 700;
    color: #d5f8ff;
    margin-bottom: 12px;
  }
}
.right-wrapper {
  border-radius: 23px;
  background: #ffffff;
  width: 480px;
  position: relative;
  .header {
    height: 70px;
    line-height: 70px;
    border-bottom: 1px solid #f1f1f1;
    color: #3b3b3b;
    font-size: 22px;
    margin-bottom: 22px;
    span {
      display: inline-block;
      height: 70px;
      line-height: 70px;
      border-bottom: 6px solid #3a83fc;
      margin-left: 50px;
    }
  }
}
:deep(.el-input__wrapper) {
  background-color: #f7f8fa !important;
  border: none;
}
:deep(.el-input__inner) {
  color: #3b3b3b;
}
:deep(.el-form-item__label) {
  color: #3b3b3b !important;
}
:deep(.el-checkbox__label) {
  color: #2e2e2e;
}
.bottom-block {
  height: 140px;
  width: 90%;
  background-color: rgba(255, 255, 255, 0.3);
  position: absolute;
  left: 5%;
  bottom: -20px;
  border-radius: 20px;
}
.login-form {
  position: absolute;
  left: 50%;
  top: 60%;
  transform: translate(-50%, -50%);
  border-radius: 6px;
  // background: #ffffff;
  width: 400px;
  padding: 25px 25px 5px 25px;
  padding: 0 50px 30px;
  .submit-btn {
    width: 382px;
    height: 54px;
    background: #3a83fc;
    border-radius: 3px;
    font-size: 20px;
    box-shadow: 1px 2px 5px #3a83fc;
    border: none;
    border-radius: 6px;
  }
  .el-input {
    height: 40px;
@@ -224,7 +312,7 @@
}
.login-code {
  width: 33%;
  // width: 120px;
  height: 40px;
  float: right;
@@ -232,54 +320,29 @@
    cursor: pointer;
    vertical-align: middle;
  }
  .login-code-img {
    height: 40px;
    // padding-left: 12px;
  }
}
.login-logo-img {
  max-height: 100px;
  margin: 0 auto;
  position: absolute;
  top: 35px;
  left: 65px;
}
.el-login-footer {
  height: 40px;
  line-height: 40px;
  height: 60px;
  line-height: 60px;
  position: fixed;
  bottom: 0;
  width: 100%;
  text-align: center;
  color: #fff;
  font-family: Arial;
  font-size: 12px;
  font-size: 16px;
  letter-spacing: 1px;
}
.login-code-img {
  height: 40px;
  padding-left: 12px;
}
.login-logo-bg {
  width: 514px;
  height: 177px;
  // background-image: url('@/assets/images/login-logo.png');
  // background-size: 100% 100%;
  position: absolute;
  left: 50%;
  top: 22%;
  transform: translate(-50%, -50%);
}
.login-logo-img {
  // width: 100%;
  // height: 100%;
  // transform: translate(-50%, -50%);
  max-height: 200px;
  margin: 0 auto;
  position: absolute;
  top: 17%;
}
.login-font {
  font-size: 50px;
  color: #fff;
  top: 32%;
  position: absolute;
  left: 50%;
  width: 514px;
  text-align: center;
  transform: translate(-50%, -50%);
}
</style>