¶Ô±ÈÐÂÎļþ |
| | |
| | | <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> |