Merge pull request #38 from Andy-Yin/develop1.0
Develop1.0
| | |
| | | |
| | | String timeType = dto.getTimeType(); |
| | | String dataTime = dto.getDataTime(); |
| | | Date beginTime = DateTimeUtil.getTypeTime(timeType, dataTime); |
| | | Date beginTime = DateTimeUtil.getTime(timeType, dataTime); |
| | | DateTime endTime = null; |
| | | |
| | | // è·åèç¹ä¿¡æ¯ |
| | |
| | | public BranchAnalysisVO getBranchAnalysisService(BranchAnalysisDTO dto) { |
| | | String timeType = dto.getTimeType(); |
| | | String dataTime = dto.getDataTime(); |
| | | Date beginTime = DateTimeUtil.getTypeTime(timeType, dataTime); |
| | | Date beginTime = DateTimeUtil.getTime(timeType, dataTime); |
| | | DateTime endTime = null; |
| | | |
| | | List<ModelNodeIndexInfo> nodeIndexInfo = modelNodeMapper.getModelNodeIndexIdByNodeId(dto.getNodeId(), dto.getEnergyType()); |
| | |
| | | default: |
| | | throw new ServiceException("æ¶é´æ ¼å¼é误"); |
| | | } |
| | | //è·åæ°æ®é¡¹å表 |
| | | |
| | | List<DataItem> dataItemlist = dataItemMapper.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, timeType, indexlist); |
| | | |
| | | BranchAnalysisVO vo = new BranchAnalysisVO(); |
| | |
| | | |
| | | // è®¡ç®æ¯ç§è½æºçå½åå¼åå»å¹´çå¼ |
| | | for (String s : energyType) { |
| | | final double value = getValues(energyMap, upCarbonEmission,energyType); |
| | | final double lastYearValueNum = getValues(energyMap, upLastCarbonEmission,energyType); |
| | | final double value = getValues(energyMap, upCarbonEmission, s); |
| | | final double lastYearValueNum = getValues(energyMap, upLastCarbonEmission, s); |
| | | allValue += value; |
| | | allLastValue += lastYearValueNum; |
| | | final CarbonEmissionRankVO carbonEmissionRankVO = new CarbonEmissionRankVO(); |
| | |
| | | upData.add(carbonEmissionRankVOAll); |
| | | |
| | | // 计ç®ä¸æ¹çç¢³ææ¾å¹¶æåº |
| | | List<CarbonEmissionRankVO> carbonEmissionRankVOS = calculateDownCarbonEmission(beginTime, endTime, carbonEmissionDTO, energyMap,sysEnergies); |
| | | List<CarbonEmissionRankVO> carbonEmissionRankVOS = calculateDownCarbonEmission(beginTime, endTime, carbonEmissionDTO, energyMap, sysEnergies); |
| | | carbonEmissionRankVOS.sort(Comparator.comparing(CarbonEmissionRankVO::getAllValue).reversed()); |
| | | stringObjectMap.put("down", carbonEmissionRankVOS); |
| | | stringObjectMap.put("upData", upData); |
| | |
| | | |
| | | // 计ç®åæ¯å¢é¿ç |
| | | private double calculateYOY(double current, double last) { |
| | | if(last !=0.0) { |
| | | if (last != 0.0) { |
| | | return (current - last) / last * 100; |
| | | } |
| | | return 0; |
| | |
| | | } |
| | | |
| | | // 计ç®ä¸æ¹çç¢³ææ¾ |
| | | private List<CarbonEmissionRankVO> calculateDownCarbonEmission(Date beginTime, Date endTime, CarbonEmissionDTO carbonEmissionDTO, Map<String, SysEnergy> energyMap,List<SysEnergy> sysEnergies) { |
| | | private List<CarbonEmissionRankVO> calculateDownCarbonEmission(Date beginTime, Date endTime, CarbonEmissionDTO carbonEmissionDTO, Map<String, SysEnergy> energyMap, List<SysEnergy> sysEnergies) { |
| | | List<CarbonEmission> downCarbonEmission = dataItemMapper.getDownCarbonEmission(beginTime, endTime, carbonEmissionDTO.getTimeType(), carbonEmissionDTO.getNodeId()); |
| | | List<CarbonEmissionRankVO> carbonEmissionRankVOS = new ArrayList<>(); |
| | | |
| | |
| | | throw new RuntimeException("è·åç¢³ææ¾è½¬æ¢çæ¶åºé: ç³»ç»è½æºæ°æ®ä¸ä¸åå¨" + s + "è½æºç±»å"); |
| | | } |
| | | double value = v.stream().filter(ec -> ec.getEnergyId().equals(s)) |
| | | .mapToDouble(CarbonEmission::getValue) |
| | | .sum(); |
| | | .mapToDouble(CarbonEmission::getValue) |
| | | .sum(); |
| | | double calculatedValue = Double.parseDouble(df.format(sysEnergy.getCoefficient().doubleValue() * value)); |
| | | |
| | | switch (s) { |
| | |
| | | // ä¸ä¸æ¶é´æ®µçç¢³ææ¾æ°æ® |
| | | final List<CarbonEmission> lastCarbonEmissions = lastCollect.get(XAxis[i]); |
| | | // æ»å¼ |
| | | double totalValue = getValues(energyMap, carbonEmissions,energyType); |
| | | double totalValue = getValues(energyMap, carbonEmissions, energyType); |
| | | // ä¸ä¸æ¶é´æ®µçæ»å¼ |
| | | double totalLastValue = getValues(energyMap, lastCarbonEmissions,energyType); |
| | | double totalLastValue = getValues(energyMap, lastCarbonEmissions, energyType); |
| | | // å䏿¬¡çæ»å¼ |
| | | double totalFrontValue = (i == 0) ? 0.0 : getValues(energyMap, collect.get(XAxis[i - 1]),energyType); |
| | | final carbonEmissionYQVO carbonEmissionYQVO = new carbonEmissionYQVO(XAxis[i] , String.format("%.2f", totalValue) ,String.format("%.2f", calculateYOY(totalValue, totalLastValue)) , String.format("%.2f", calculateYOY(totalValue, totalFrontValue))); |
| | | double totalFrontValue = (i == 0) ? 0.0 : getValues(energyMap, collect.get(XAxis[i - 1]), energyType); |
| | | final carbonEmissionYQVO carbonEmissionYQVO = new carbonEmissionYQVO(XAxis[i], String.format("%.2f", totalValue), String.format("%.2f", calculateYOY(totalValue, totalLastValue)), String.format("%.2f", calculateYOY(totalValue, totalFrontValue))); |
| | | carbonEmissionYQVOS.add(carbonEmissionYQVO); |
| | | } |
| | | return carbonEmissionYQVOS; |
| | |
| | | } |
| | | |
| | | |
| | | public static double getValues(Map<String, SysEnergy> energyMap, List<CarbonEmission> carbonEmissions,List<String> energyType) { |
| | | public static double getValues(Map<String, SysEnergy> energyMap, List<CarbonEmission> carbonEmissions, List<String> energyTypeList) { |
| | | if (CollectionUtils.isEmpty(carbonEmissions)) { |
| | | return 0.0; |
| | | } |
| | | |
| | | // åå§åæ»å¼ |
| | | double allValue = 0.0; |
| | | |
| | | // æè½æºIDåç» |
| | | final Map<String, List<CarbonEmission>> energyValueMap = carbonEmissions.stream() |
| | | .collect(Collectors.groupingBy(CarbonEmission::getEnergyId)); |
| | | // final List<String> energyType = sysEnergies.stream().map(SysEnergy::getEnersno).collect(Collectors.toList()); |
| | | // è®¡ç®æ¯ç§è½æºçå½åå¼ |
| | | for (String s : energyType) { |
| | | SysEnergy sysEnergy = energyMap.get(s); |
| | | |
| | | for (String energyType : energyTypeList) { |
| | | // è®¡ç®æ¯ç§è½æºçå½åå¼ |
| | | SysEnergy sysEnergy = energyMap.get(energyType); |
| | | |
| | | // ç¡®ä¿è½æºåå¨ä¸ç³»æ°ä¸ä¸ºç©º |
| | | if (sysEnergy == null || sysEnergy.getCoefficient() == null) { |
| | | throw new RuntimeException("è·åç¢³ææ¾è½¬æ¢çæ¶åºé: ç³»ç»è½æºæ°æ®ä¸ä¸åå¨æç³»æ°ä¸ºç©º" + s + "è½æºç±»å"); |
| | | throw new RuntimeException("è·åç¢³ææ¾è½¬æ¢çæ¶åºé: ç³»ç»è½æºæ°æ®ä¸ä¸åå¨æç³»æ°ä¸ºç©º" + energyType + "è½æºç±»å"); |
| | | } |
| | | |
| | | // è·å对åºè½æºçå¼ |
| | | double value = energyValueMap.getOrDefault(s, Collections.emptyList()).stream() |
| | | double value = energyValueMap.getOrDefault(energyType, Collections.emptyList()).stream() |
| | | .mapToDouble(CarbonEmission::getValue) |
| | | .sum(); |
| | | |
| | | // ç´æ¥è®¡ç®æ»å¼ï¼é¿å
åä½çè½¬æ¢ |
| | | allValue += sysEnergy.getCoefficient().doubleValue() * value; |
| | | } |
| | | // æ ¼å¼åæç»ç»æ |
| | | return Double.parseDouble(new DecimalFormat("#.00").format(allValue)); |
| | | } |
| | | |
| | | public static double getValues(Map<String, SysEnergy> energyMap, List<CarbonEmission> carbonEmissions, String energyType) { |
| | | if (CollectionUtils.isEmpty(carbonEmissions)) { |
| | | return 0.0; |
| | | } |
| | | // åå§åæ»å¼ |
| | | double allValue = 0.0; |
| | | // æè½æºIDåç» |
| | | final Map<String, List<CarbonEmission>> energyValueMap = carbonEmissions.stream() |
| | | .collect(Collectors.groupingBy(CarbonEmission::getEnergyId)); |
| | | // è®¡ç®æ¯ç§è½æºçå½åå¼ |
| | | SysEnergy sysEnergy = energyMap.get(energyType); |
| | | |
| | | // ç¡®ä¿è½æºåå¨ä¸ç³»æ°ä¸ä¸ºç©º |
| | | if (sysEnergy == null || sysEnergy.getCoefficient() == null) { |
| | | throw new RuntimeException("è·åç¢³ææ¾è½¬æ¢çæ¶åºé: ç³»ç»è½æºæ°æ®ä¸ä¸åå¨æç³»æ°ä¸ºç©º" + energyType + "è½æºç±»å"); |
| | | } |
| | | |
| | | // è·å对åºè½æºçå¼ |
| | | double value = energyValueMap.getOrDefault(energyType, Collections.emptyList()).stream() |
| | | .mapToDouble(CarbonEmission::getValue) |
| | | .sum(); |
| | | |
| | | // ç´æ¥è®¡ç®æ»å¼ï¼é¿å
åä½çè½¬æ¢ |
| | | allValue += sysEnergy.getCoefficient().doubleValue() * value; |
| | | |
| | | // æ ¼å¼åæç»ç»æ |
| | | return Double.parseDouble(new DecimalFormat("#.00").format(allValue)); |
| | |
| | | if (ObjectUtils.isEmpty(parentNode)) { |
| | | return energyDataList; |
| | | } |
| | | List<String> nodeIds = modelNodeList.stream().filter(x -> ObjectUtils.isNotEmpty(x.getParentId())) |
| | | List<String> nodeIds = modelNodeList.stream().filter(x -> ObjectUtils.isNotEmpty(x.getParentId()) && parentNode.getNodeId().equals(x.getParentId())) |
| | | .map(ModelNode::getNodeId).collect(Collectors.toList()); |
| | | if (ObjectUtils.isEmpty(nodeIds)) { |
| | | return energyDataList; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request" |
| | | export default { |
| | | // å项ç¨è½åæ |
| | | itemizedEnergyAnalysis(data) { |
| | | return request({ |
| | | url: "/itemizedEnergyAnalysis/list", |
| | | method: "GET", |
| | | params: data, |
| | | }) |
| | | }, |
| | | // æ¯è·¯ç¨è½åæ |
| | | branchanalysis(data) { |
| | | return request({ |
| | | url: "/branchanalysis/list", |
| | | method: "GET", |
| | | params: data, |
| | | }) |
| | | }, |
| | | } |
| | |
| | | console.log("initChart", series) |
| | | let option = { |
| | | title: { |
| | | // text: props.chartData.title, |
| | | text: props.chartData.title || "", |
| | | left: "40", |
| | | textStyle: { |
| | | color: "#2979ff", |
| | |
| | | <div class="setting-drawer-block-checbox"> |
| | | <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')"> |
| | | <img src="@/assets/images/dark.svg" alt="dark" /> |
| | | <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;"> |
| | | <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block"> |
| | | <i aria-label="徿 : check" class="anticon anticon-check"> |
| | | <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class> |
| | | <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" /> |
| | | <svg |
| | | viewBox="64 64 896 896" |
| | | data-icon="check" |
| | | width="1em" |
| | | height="1em" |
| | | :fill="theme" |
| | | aria-hidden="true" |
| | | focusable="false" |
| | | class |
| | | > |
| | | <path |
| | | d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" |
| | | /> |
| | | </svg> |
| | | </i> |
| | | </div> |
| | | </div> |
| | | <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-light')"> |
| | | <img src="@/assets/images/light.svg" alt="light" /> |
| | | <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;"> |
| | | <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block"> |
| | | <i aria-label="徿 : check" class="anticon anticon-check"> |
| | | <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class> |
| | | <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" /> |
| | | <svg |
| | | viewBox="64 64 896 896" |
| | | data-icon="check" |
| | | width="1em" |
| | | height="1em" |
| | | :fill="theme" |
| | | aria-hidden="true" |
| | | focusable="false" |
| | | class |
| | | > |
| | | <path |
| | | d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" |
| | | /> |
| | | </svg> |
| | | </i> |
| | | </div> |
| | |
| | | <div class="drawer-item"> |
| | | <span>主é¢é¢è²</span> |
| | | <span class="comp-style"> |
| | | <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange"/> |
| | | <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange" /> |
| | | </span> |
| | | </div> |
| | | <el-divider /> |
| | |
| | | <el-button type="primary" plain icon="DocumentAdd" @click="saveSetting">ä¿åé
ç½®</el-button> |
| | | <el-button plain icon="Refresh" @click="resetSetting">éç½®é
ç½®</el-button> |
| | | </el-drawer> |
| | | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import variables from '@/assets/styles/variables.module.scss' |
| | | import axios from 'axios' |
| | | import { ElLoading, ElMessage } from 'element-plus' |
| | | import { useDynamicTitle } from '@/utils/dynamicTitle' |
| | | import useAppStore from '@/store/modules/app' |
| | | import useSettingsStore from '@/store/modules/settings' |
| | | import usePermissionStore from '@/store/modules/permission' |
| | | import { handleThemeStyle } from '@/utils/theme' |
| | | import variables from "@/assets/styles/variables.module.scss" |
| | | import axios from "axios" |
| | | import { ElLoading, ElMessage } from "element-plus" |
| | | import { useDynamicTitle } from "@/utils/dynamicTitle" |
| | | import useAppStore from "@/store/modules/app" |
| | | import useSettingsStore from "@/store/modules/settings" |
| | | import usePermissionStore from "@/store/modules/permission" |
| | | import { handleThemeStyle } from "@/utils/theme" |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const { proxy } = getCurrentInstance() |
| | | const appStore = useAppStore() |
| | | const settingsStore = useSettingsStore() |
| | | const permissionStore = usePermissionStore() |
| | | const showSettings = ref(false); |
| | | const theme = ref(settingsStore.theme); |
| | | const sideTheme = ref(settingsStore.sideTheme); |
| | | const storeSettings = computed(() => settingsStore); |
| | | const predefineColors = ref(["#409EFF", "#ff4500", "#ff8c00", "#ffd700", "#90ee90", "#00ced1", "#1e90ff", "#c71585"]); |
| | | const showSettings = ref(false) |
| | | const theme = ref(settingsStore.theme) |
| | | const sideTheme = ref(settingsStore.sideTheme) |
| | | const storeSettings = computed(() => settingsStore) |
| | | const predefineColors = ref(["#409EFF", "#ff4500", "#ff8c00", "#ffd700", "#90ee90", "#00ced1", "#1e90ff", "#c71585"]) |
| | | |
| | | /** æ¯å¦éè¦topnav */ |
| | | function topNavChange(val) { |
| | | if (!val) { |
| | | appStore.toggleSideBarHide(false); |
| | | permissionStore.setSidebarRouters(permissionStore.defaultRoutes); |
| | | appStore.toggleSideBarHide(false) |
| | | permissionStore.setSidebarRouters(permissionStore.defaultRoutes) |
| | | } |
| | | } |
| | | |
| | | function themeChange(val) { |
| | | settingsStore.theme = val; |
| | | handleThemeStyle(val); |
| | | settingsStore.theme = val |
| | | handleThemeStyle(val) |
| | | } |
| | | function handleTheme(val) { |
| | | settingsStore.sideTheme = val; |
| | | sideTheme.value = val; |
| | | settingsStore.sideTheme = val |
| | | sideTheme.value = val |
| | | } |
| | | function saveSetting() { |
| | | proxy.$modal.loading("æ£å¨ä¿åå°æ¬å°ï¼è¯·ç¨å..."); |
| | | proxy.$modal.loading("æ£å¨ä¿åå°æ¬å°ï¼è¯·ç¨å...") |
| | | let layoutSetting = { |
| | | "topNav": storeSettings.value.topNav, |
| | | "tagsView": storeSettings.value.tagsView, |
| | | "fixedHeader": storeSettings.value.fixedHeader, |
| | | "sidebarLogo": storeSettings.value.sidebarLogo, |
| | | "dynamicTitle": storeSettings.value.dynamicTitle, |
| | | "sideTheme": storeSettings.value.sideTheme, |
| | | "theme": storeSettings.value.theme |
| | | }; |
| | | localStorage.setItem("layout-setting", JSON.stringify(layoutSetting)); |
| | | topNav: storeSettings.value.topNav, |
| | | tagsView: storeSettings.value.tagsView, |
| | | fixedHeader: storeSettings.value.fixedHeader, |
| | | sidebarLogo: storeSettings.value.sidebarLogo, |
| | | dynamicTitle: storeSettings.value.dynamicTitle, |
| | | sideTheme: storeSettings.value.sideTheme, |
| | | theme: storeSettings.value.theme, |
| | | } |
| | | localStorage.setItem("layout-setting", JSON.stringify(layoutSetting)) |
| | | setTimeout(proxy.$modal.closeLoading(), 1000) |
| | | } |
| | | function resetSetting() { |
| | | proxy.$modal.loading("æ£å¨æ¸
é¤è®¾ç½®ç¼åå¹¶å·æ°ï¼è¯·ç¨å..."); |
| | | proxy.$modal.loading("æ£å¨æ¸
é¤è®¾ç½®ç¼åå¹¶å·æ°ï¼è¯·ç¨å...") |
| | | localStorage.removeItem("layout-setting") |
| | | setTimeout("window.location.reload()", 1000) |
| | | } |
| | | function openSetting() { |
| | | showSettings.value = true; |
| | | showSettings.value = true |
| | | } |
| | | |
| | | defineExpose({ |
| | |
| | | }) |
| | | </script> |
| | | |
| | | <style lang='scss' scoped> |
| | | <style lang="scss" scoped> |
| | | .setting-drawer-title { |
| | | margin-bottom: 12px; |
| | | color: rgba(0, 0, 0, 0.85); |
| | |
| | | margin: -3px 8px 0px 0px; |
| | | } |
| | | } |
| | | </style> |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="page"> |
| | | <div class="page-container"> |
| | | <div class="page-container-left"> |
| | | <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" /> |
| | | </div> |
| | | <div class="page-container-right"> |
| | | <div class="form-card"> |
| | | <el-form :model="queryParams" ref="queryRef" :inline="true"> |
| | | <el-form-item label="æé´" prop="timeType"> |
| | | <el-select |
| | | v-model="queryParams.timeType" |
| | | placeholder="æé´" |
| | | clearable |
| | | style="width: 120px" |
| | | @change="handleTimeType" |
| | | > |
| | | <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶é´"> |
| | | <el-date-picker |
| | | v-model="queryParams.dataTime" |
| | | :type="queryParams.timeType == 'YEAR' ? 'year' : queryParams.timeType == 'MONTH' ? 'month' : 'date'" |
| | | :format=" |
| | | queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD' |
| | | " |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="æ¶é´" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è½æºç±»å" prop="energyType"> |
| | | <el-select v-model="queryParams.energyType" placeholder="è½æºç±»å" style="width: 120px"> |
| | | <el-option |
| | | :label="item.enername" |
| | | :value="item.enersno" |
| | | v-for="item in energyTypeList" |
| | | :key="item.enersno" |
| | | @click="handleEnergyType(item)" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery"> æç´¢ </el-button> |
| | | <!-- <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> --> |
| | | </el-form-item> |
| | | <!-- <el-form-item> |
| | | <el-button type="warning" icon="Download" @click="handleExport"> å¯¼åº </el-button> |
| | | </el-form-item> --> |
| | | </el-form> |
| | | </div> |
| | | <div |
| | | style="height: calc(100vh - 220px) !important; max-height: calc(100vh - 220px) !important; overflow-y: auto" |
| | | v-loading="loading" |
| | | > |
| | | <BaseCard :title="queryParams.nodeName + '-æ¯è·¯ç¨è½åæ'"> |
| | | <div class=""> |
| | | <!-- <div id="Chart1" /> --> |
| | | <line-chart ref="LineChartRef" :chartData="lineChartData" :chartType="'bar'" /> |
| | | </div> |
| | | </BaseCard> |
| | | <BaseCard :title="queryParams.nodeName + '-æ¯è·¯ç¨è½è¯¦æ
-' + queryParams.enername"> |
| | | <div class="table-box"> |
| | | <!-- show-summary --> |
| | | <el-table :data="departmentList"> |
| | | <el-table-column label="èç¹" align="center" key="nodeName" prop="nodeName" fixed="left" /> |
| | | <el-table-column label="å计" align="center" key="total" prop="total" width="100" fixed="left" /> |
| | | <template v-if="queryParams.timeType == 'DAY'"> |
| | | <el-table-column |
| | | v-for="index in 24" |
| | | :key="index" |
| | | :label="index - 1 + 'æ¶'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | <template v-if="queryParams.timeType == 'MONTH'"> |
| | | <el-table-column |
| | | v-for="index in 31" |
| | | :key="index" |
| | | :label="index + 'æ¥'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | <template v-if="queryParams.timeType == 'YEAR'"> |
| | | <el-table-column |
| | | v-for="index in 12" |
| | | :key="index" |
| | | :label="index + 'æ'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | </el-table> |
| | | </div> |
| | | </BaseCard> |
| | | <!-- </el-col> |
| | | </el-row> --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="branchanalysis"> |
| | | import buildApi from "@/api/buildingConsumption/api" |
| | | import { listEnergyTypeList } from "@/api/modelConfiguration/energyType" |
| | | import LineChart from "@/components/Echarts/LineChart.vue" |
| | | const { proxy } = getCurrentInstance() |
| | | const { period } = proxy.useDict("period") |
| | | import { useRoute } from "vue-router" |
| | | import useSettingsStore from "@/store/modules/settings" |
| | | const settingsStore = useSettingsStore() |
| | | watch( |
| | | () => settingsStore.sideTheme, |
| | | (val) => { |
| | | getList() |
| | | } |
| | | ) |
| | | const energyTypeList = ref(undefined) |
| | | const departmentList = ref([]) |
| | | const loading = ref(false) |
| | | const data = reactive({ |
| | | queryParams: { |
| | | nodeId: null, |
| | | timeType: null, |
| | | dataTime: null, |
| | | energyType: null, |
| | | }, |
| | | query: { |
| | | modelCode: null, |
| | | }, |
| | | }) |
| | | const { queryParams, query } = toRefs(data) |
| | | const itemBuildData = ref({}) |
| | | const LineChartRef = ref() |
| | | const lineChartData = ref({}) |
| | | /** èç¹åå»äºä»¶ */ |
| | | function handleNodeClick(data) { |
| | | queryParams.value.nodeId = data.id |
| | | queryParams.value.nodeName = data.label |
| | | handleTimeType(period.value[0].value) |
| | | listEnergyTypeList().then((res) => { |
| | | energyTypeList.value = res.data |
| | | queryParams.value.energyType = energyTypeList.value[0].enersno |
| | | queryParams.value.enername = energyTypeList.value[0].enername |
| | | queryParams.value.muid = energyTypeList.value[0].muid |
| | | handleQuery() |
| | | }) |
| | | } |
| | | function handleTimeType(e) { |
| | | queryParams.value.timeType = e |
| | | queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD") |
| | | handleQuery() |
| | | } |
| | | function handleEnergyType(item) { |
| | | queryParams.value.enername = item.enername |
| | | queryParams.value.muid = item.muid |
| | | handleQuery() |
| | | } |
| | | function getList() { |
| | | loading.value = true |
| | | buildApi |
| | | .branchanalysis( |
| | | proxy.addDateRange({ |
| | | ...queryParams.value, |
| | | ...query.value, |
| | | }) |
| | | ) |
| | | .then((res) => { |
| | | if (!!res.code && res.code == 200) { |
| | | loading.value = false |
| | | let yData = [] |
| | | let xData = [] |
| | | if (!!res.data) { |
| | | departmentList.value = [res.data] || [] |
| | | } |
| | | let dataList = res.data || {} |
| | | if (queryParams.value.timeType == "DAY") { |
| | | for (let i = 0; i < 24; i++) { |
| | | xData.push(i + "æ¶") |
| | | yData.push(dataList[`value${i}`]) |
| | | } |
| | | } else if (queryParams.value.timeType == "MONTH") { |
| | | for (let i = 0; i < 31; i++) { |
| | | xData.push(i + 1 + "æ¥") |
| | | yData.push(dataList[`value${i}`]) |
| | | } |
| | | } else { |
| | | for (let i = 0; i < 12; i++) { |
| | | xData.push(i + 1 + "æ") |
| | | yData.push(dataList[`value${i}`]) |
| | | } |
| | | } |
| | | |
| | | lineChartData.value = { |
| | | title: queryParams.value.muid, |
| | | xAxis: xData, |
| | | series: [ |
| | | { |
| | | name: queryParams.value.enername, |
| | | data: yData, |
| | | }, |
| | | ], |
| | | } |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | loading.value = false |
| | | }) |
| | | } |
| | | function numFilter(value) { |
| | | // æªåå½åæ°æ®å°å°æ°ç¹åçå ä½ |
| | | let realVal = "" |
| | | if (!isNaN(value) && value !== "" && value !== null) { |
| | | realVal = parseFloat(value).toFixed(2) |
| | | } else { |
| | | realVal = "--" |
| | | } |
| | | return realVal |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-æç´¢ |
| | | function handleQuery() { |
| | | getList() |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-éç½® |
| | | function resetQuery() { |
| | | proxy.resetForm("queryRef") |
| | | handleTimeType(period.value[0].value) |
| | | queryParams.value.energyType = energyTypeList.value[0].enersno |
| | | queryParams.value.enername = energyTypeList.value[0].enername |
| | | queryParams.value.muid = energyTypeList.value[0].muid |
| | | queryParams.value.analysisType = "YOY" |
| | | handleQuery() |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-å¯¼åº |
| | | function handleExport() { |
| | | proxy.download( |
| | | "consumptionanalysis/energyExport", |
| | | { |
| | | ...queryParams.value, |
| | | ...query.value, |
| | | }, |
| | | `${queryParams.value.nodeName}-ååºè½èåæ_${new Date().getTime()}.xlsx` |
| | | ) |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | @import "@/assets/styles/page.scss"; |
| | | .el-tabs { |
| | | padding: 0 12px; |
| | | margin-top: 12px; |
| | | :deep(.el-tabs__header) { |
| | | margin: 0; |
| | | } |
| | | } |
| | | |
| | | .themeDark { |
| | | .build-sum { |
| | | border: 1px solid #8c8b8b; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | color: #fff; |
| | | .build-sum-item { |
| | | width: 25%; |
| | | text-align: center; |
| | | padding: 12px 0; |
| | | .count { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | margin-top: 8px; |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .themeLight { |
| | | .build-sum { |
| | | border: 1px solid #eaeaea; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | color: #333; |
| | | .build-sum-item { |
| | | width: 25%; |
| | | text-align: center; |
| | | padding: 12px 0; |
| | | .count { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | margin-top: 8px; |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="page"> |
| | | <div class="page-container"> |
| | | <div class="page-container-left"> |
| | | <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" /> |
| | | </div> |
| | | <div class="page-container-right"> |
| | | <div class="form-card"> |
| | | <el-form :model="queryParams" ref="queryRef" :inline="true"> |
| | | <el-form-item label="æé´" prop="timeType"> |
| | | <el-select |
| | | v-model="queryParams.timeType" |
| | | placeholder="æé´" |
| | | clearable |
| | | style="width: 120px" |
| | | @change="handleTimeType" |
| | | > |
| | | <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ¶é´"> |
| | | <el-date-picker |
| | | v-model="queryParams.dataTime" |
| | | :type="queryParams.timeType == 'YEAR' ? 'year' : queryParams.timeType == 'MONTH' ? 'month' : 'date'" |
| | | :format=" |
| | | queryParams.timeType == 'YEAR' ? 'YYYY' : queryParams.timeType == 'MONTH' ? 'YYYY-MM' : 'YYYY-MM-DD' |
| | | " |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="æ¶é´" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="è½æºç±»å" prop="energyType"> |
| | | <el-select v-model="queryParams.energyType" placeholder="è½æºç±»å" style="width: 120px"> |
| | | <el-option |
| | | :label="item.enername" |
| | | :value="item.enersno" |
| | | v-for="item in energyTypeList" |
| | | :key="item.enersno" |
| | | @click="handleEnergyType(item)" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="Search" @click="handleQuery"> æç´¢ </el-button> |
| | | <!-- <el-button icon="Refresh" @click="resetQuery">éç½®</el-button> --> |
| | | </el-form-item> |
| | | <!-- <el-form-item> |
| | | <el-button type="warning" icon="Download" @click="handleExport"> å¯¼åº </el-button> |
| | | </el-form-item> --> |
| | | </el-form> |
| | | </div> |
| | | <div |
| | | style="height: calc(100vh - 220px) !important; max-height: calc(100vh - 220px) !important; overflow-y: auto" |
| | | v-loading="loading" |
| | | > |
| | | <BaseCard :title="queryParams.nodeName + '-å项ç¨è½åæ'"> |
| | | <div class="build-sum"> |
| | | <div class="build-sum-item"> |
| | | <div>æ»ç¨é/{{ queryParams.muid }}</div> |
| | | <div class="count">{{ itemBuildData.total || 0 }}</div> |
| | | </div> |
| | | <div class="build-sum-item"> |
| | | <div>æå¤§ç¨é/{{ queryParams.muid }}</div> |
| | | <div class="count">{{ itemBuildData.max || 0 }}</div> |
| | | </div> |
| | | <div class="build-sum-item"> |
| | | <div>æå°ç¨é/{{ queryParams.muid }}</div> |
| | | <div class="count">{{ itemBuildData.min || 0 }}</div> |
| | | </div> |
| | | <div class="build-sum-item"> |
| | | <div>å¹³åç¨é/{{ queryParams.muid }}</div> |
| | | <div class="count">{{ itemBuildData.avg || 0 }}</div> |
| | | </div> |
| | | </div> |
| | | <div class=""> |
| | | <!-- <div id="Chart1" /> --> |
| | | <line-chart ref="LineChartRef" :chartData="lineChartData" /> |
| | | </div> |
| | | </BaseCard> |
| | | <BaseCard :title="queryParams.nodeName + '-å项ç¨è½è¯¦æ
-' + queryParams.enername"> |
| | | <div class="table-box"> |
| | | <!-- show-summary --> |
| | | <el-table :data="departmentList"> |
| | | <el-table-column label="èç¹" align="center" key="nodeName" prop="nodeName" fixed="left" /> |
| | | <el-table-column label="å计" align="center" key="total" prop="total" width="100" fixed="left" /> |
| | | <template v-if="queryParams.timeType == 'DAY'"> |
| | | <el-table-column |
| | | v-for="index in 24" |
| | | :key="index" |
| | | :label="index - 1 + 'æ¶'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | <template v-if="queryParams.timeType == 'MONTH'"> |
| | | <el-table-column |
| | | v-for="index in 31" |
| | | :key="index" |
| | | :label="index + 'æ¥'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | <template v-if="queryParams.timeType == 'YEAR'"> |
| | | <el-table-column |
| | | v-for="index in 12" |
| | | :key="index" |
| | | :label="index + 'æ'" |
| | | align="center" |
| | | min-width="130" |
| | | > |
| | | <template #default="scope">{{ scope.row[`value${index - 1}`] }}</template> |
| | | </el-table-column> |
| | | </template> |
| | | </el-table> |
| | | </div> |
| | | </BaseCard> |
| | | <!-- </el-col> |
| | | </el-row> --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="itemBuild"> |
| | | import buildApi from "@/api/buildingConsumption/api" |
| | | import { listEnergyTypeList } from "@/api/modelConfiguration/energyType" |
| | | import LineChart from "@/components/Echarts/LineChart.vue" |
| | | const { proxy } = getCurrentInstance() |
| | | const { period } = proxy.useDict("period") |
| | | import { useRoute } from "vue-router" |
| | | import useSettingsStore from "@/store/modules/settings" |
| | | const settingsStore = useSettingsStore() |
| | | watch( |
| | | () => settingsStore.sideTheme, |
| | | (val) => { |
| | | getList() |
| | | } |
| | | ) |
| | | const energyTypeList = ref(undefined) |
| | | const departmentList = ref([]) |
| | | const loading = ref(false) |
| | | const data = reactive({ |
| | | queryParams: { |
| | | nodeId: null, |
| | | timeType: null, |
| | | dataTime: null, |
| | | energyType: null, |
| | | }, |
| | | query: { |
| | | modelCode: null, |
| | | }, |
| | | }) |
| | | const { queryParams, query } = toRefs(data) |
| | | const itemBuildData = ref({}) |
| | | const LineChartRef = ref() |
| | | const lineChartData = ref({}) |
| | | /** èç¹åå»äºä»¶ */ |
| | | function handleNodeClick(data) { |
| | | queryParams.value.nodeId = data.id |
| | | queryParams.value.nodeName = data.label |
| | | handleTimeType(period.value[0].value) |
| | | listEnergyTypeList().then((res) => { |
| | | energyTypeList.value = res.data |
| | | queryParams.value.energyType = energyTypeList.value[0].enersno |
| | | queryParams.value.enername = energyTypeList.value[0].enername |
| | | queryParams.value.muid = energyTypeList.value[0].muid |
| | | handleQuery() |
| | | }) |
| | | } |
| | | function handleTimeType(e) { |
| | | queryParams.value.timeType = e |
| | | queryParams.value.dataTime = proxy.dayjs(new Date()).format("YYYY-MM-DD") |
| | | handleQuery() |
| | | } |
| | | function handleEnergyType(item) { |
| | | queryParams.value.enername = item.enername |
| | | queryParams.value.muid = item.muid |
| | | handleQuery() |
| | | } |
| | | function getList() { |
| | | loading.value = true |
| | | buildApi |
| | | .itemizedEnergyAnalysis( |
| | | proxy.addDateRange({ |
| | | ...queryParams.value, |
| | | ...query.value, |
| | | }) |
| | | ) |
| | | .then((res) => { |
| | | if (!!res.code && res.code == 200) { |
| | | loading.value = false |
| | | itemBuildData.value = res.data |
| | | let yData = [] |
| | | let xData = [] |
| | | let title = [] |
| | | if (!!res.data.dataList) { |
| | | departmentList.value = res.data.dataList || [] |
| | | } |
| | | let dataList = res.data.dataList || [] |
| | | if (queryParams.value.timeType == "DAY") { |
| | | for (let i = 0; i < 24; i++) { |
| | | xData.push(i + "æ¶") |
| | | yData.push(dataList[0][`value${i}`]) |
| | | } |
| | | } else if (queryParams.value.timeType == "MONTH") { |
| | | for (let i = 0; i < 31; i++) { |
| | | xData.push(i + 1 + "æ¥") |
| | | yData.push(dataList[0][`value${i}`]) |
| | | } |
| | | } else { |
| | | for (let i = 0; i < 12; i++) { |
| | | xData.push(i + 1 + "æ") |
| | | yData.push(dataList[0][`value${i}`]) |
| | | } |
| | | } |
| | | |
| | | lineChartData.value = { |
| | | title: queryParams.value.muid, |
| | | xAxis: xData, |
| | | series: [ |
| | | { |
| | | name: queryParams.value.enername, |
| | | data: yData, |
| | | }, |
| | | ], |
| | | } |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | loading.value = false |
| | | }) |
| | | } |
| | | function numFilter(value) { |
| | | // æªåå½åæ°æ®å°å°æ°ç¹åçå ä½ |
| | | let realVal = "" |
| | | if (!isNaN(value) && value !== "" && value !== null) { |
| | | realVal = parseFloat(value).toFixed(2) |
| | | } else { |
| | | realVal = "--" |
| | | } |
| | | return realVal |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-æç´¢ |
| | | function handleQuery() { |
| | | getList() |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-éç½® |
| | | function resetQuery() { |
| | | proxy.resetForm("queryRef") |
| | | handleTimeType(period.value[0].value) |
| | | queryParams.value.energyType = energyTypeList.value[0].enersno |
| | | queryParams.value.enername = energyTypeList.value[0].enername |
| | | queryParams.value.muid = energyTypeList.value[0].muid |
| | | queryParams.value.analysisType = "YOY" |
| | | handleQuery() |
| | | } |
| | | // è½è对æ¯åæ-ç§å®¤è½èåæ-å¯¼åº |
| | | function handleExport() { |
| | | proxy.download( |
| | | "consumptionanalysis/energyExport", |
| | | { |
| | | ...queryParams.value, |
| | | ...query.value, |
| | | }, |
| | | `${queryParams.value.nodeName}-ååºè½èåæ_${new Date().getTime()}.xlsx` |
| | | ) |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | @import "@/assets/styles/page.scss"; |
| | | .el-tabs { |
| | | padding: 0 12px; |
| | | margin-top: 12px; |
| | | :deep(.el-tabs__header) { |
| | | margin: 0; |
| | | } |
| | | } |
| | | |
| | | .themeDark { |
| | | .build-sum { |
| | | border: 1px solid #8c8b8b; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | color: #fff; |
| | | .build-sum-item { |
| | | width: 25%; |
| | | text-align: center; |
| | | padding: 12px 0; |
| | | .count { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | margin-top: 8px; |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .themeLight { |
| | | .build-sum { |
| | | border: 1px solid #eaeaea; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | color: #333; |
| | | .build-sum-item { |
| | | width: 25%; |
| | | text-align: center; |
| | | padding: 12px 0; |
| | | .count { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | margin-top: 8px; |
| | | color: #409eff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |