index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <div class="system-dic-container">
  3. <el-card shadow="hover">
  4. <div class="system-user-search mb15">
  5. <el-form :model="state.tableData.param" ref="queryRef" :inline="true" label-width="90px">
  6. <el-form-item label="时间范围" prop="dateRange">
  7. <el-date-picker v-model="state.tableData.param.dateRange"
  8. size="default"
  9. style="width: 240px"
  10. value-format="YYYY-MM-DD"
  11. type="daterange"
  12. range-separator="-"
  13. start-placeholder="开始日期"
  14. end-placeholder="结束日期">
  15. </el-date-picker>
  16. </el-form-item>
  17. <el-form-item label="排序" prop="sort">
  18. <el-select v-model="state.tableData.param.sort" placeholder="按照选择进行排名" filterable clearable size="default">
  19. <el-option label="总耗热" :value="1" />
  20. <el-option label="热单耗" :value="2" />
  21. <el-option label="总耗电" :value="3" />
  22. <el-option label="电单耗" :value="4" />
  23. <el-option label="总耗水" :value="5" />
  24. <el-option label="水单耗" :value="6" />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="排序方式" prop="isdesc">
  28. <el-select v-model="state.tableData.param.isdesc" placeholder="按照选择进行排名" filterable clearable size="default">
  29. <el-option label="正序" :value="2" />
  30. <el-option label="倒序" :value="1" />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item label="换热站名称" prop="stationName">
  34. <el-input v-model="state.tableData.param.stationName" placeholder="输入" clearable size="default">
  35. </el-input>
  36. </el-form-item>
  37. <el-form-item label="环路名称" prop="loopName">
  38. <el-input v-model="state.tableData.param.loopName" placeholder="输入" clearable size="default">
  39. </el-input>
  40. </el-form-item>
  41. <el-form-item>
  42. <el-button size="default" type="primary" v-auth="'query'" class="ml10" @click="queryList">
  43. <el-icon>
  44. <ele-Search />
  45. </el-icon>
  46. 查询
  47. </el-button>
  48. <el-button size="default" v-auth="'reset'" @click="resetQuery(queryRef)">
  49. <el-icon>
  50. <ele-Refresh />
  51. </el-icon>
  52. 重置
  53. </el-button>
  54. <!-- <el-button size="default" type="success" class="ml10" @click="onOpenDialog()">
  55. <el-icon>
  56. <ele-FolderAdd />
  57. </el-icon>
  58. 导入
  59. </el-button> -->
  60. </el-form-item>
  61. </el-form>
  62. </div>
  63. <div class="title">环路数据统计</div>
  64. <el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%" >
  65. <el-table-column type="index" label="序号" align="center" width="60" />
  66. <el-table-column label="环路名称" prop="huanLuName" />
  67. <el-table-column label="所属换热站" prop="stationName" />
  68. <el-table-column label="总热耗" prop="unitConsumptionTotal" />
  69. <el-table-column label="热单耗" prop="unitConsumption" />
  70. <el-table-column label="总耗电" prop="elctricConsumptionTotal" />
  71. <el-table-column label="电单耗" prop="elctricConsumption" />
  72. <el-table-column label="总耗水" prop="flowLossTotal" />
  73. <el-table-column label="水单耗" prop="flowLoss" />
  74. </el-table>
  75. <pagination
  76. v-show="state.tableData.total>0"
  77. :total="state.tableData.total"
  78. v-model:page="state.tableData.param.pageNum"
  79. v-model:limit="state.tableData.param.pageSize"
  80. @pagination="queryList" />
  81. <!-- <div class="title mt20">能耗红榜</div>
  82. <div class="chart-grid">
  83. <div style="height: 250px" ref="redChartOneRef"></div>
  84. <div style="height: 250px" ref="redChartTwoRef"></div>
  85. <div style="height: 250px" ref="redChartThreeRef"></div>
  86. </div>
  87. <div class="title mt20">能耗黑榜</div>
  88. <div class="chart-grid">
  89. <div style="height: 250px" ref="blackChartOneRef"></div>
  90. <div style="height: 250px" ref="blackChartTwoRef"></div>
  91. <div style="height: 250px" ref="blackChartThreeRef"></div>
  92. </div> -->
  93. </el-card>
  94. </div>
  95. </template>
  96. <script lang="ts" setup>
  97. import { toRefs, reactive, onMounted, ref, watch, nextTick } from 'vue';
  98. import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
  99. import * as echarts from 'echarts';
  100. import { useStore } from '/@/store/index';
  101. import energyApi from '/@/api/energyAnalysis';
  102. import heatApi from '/@/api/heatStation';
  103. let global: any = {
  104. redChartOneRef: null,
  105. redChartTwoRef: null,
  106. redChartThreeRef: null,
  107. blackChartOneRef: null,
  108. blackChartTwoRef: null,
  109. blackChartThreeRef: null,
  110. dispose: [null, '', undefined],
  111. };
  112. const queryRef = ref();
  113. const redChartOneRef = ref();
  114. const redChartTwoRef = ref();
  115. const redChartThreeRef = ref();
  116. const blackChartOneRef = ref();
  117. const blackChartTwoRef = ref();
  118. const blackChartThreeRef = ref();
  119. const store = useStore();
  120. const state = reactive({
  121. myCharts: [],
  122. charts: {
  123. theme: '',
  124. bgColor: '',
  125. color: '#303133',
  126. },
  127. heatList: [],
  128. tableData: {
  129. data: [],
  130. loading: false,
  131. total: 0,
  132. param: {
  133. sort: 1,
  134. isdesc: 2,
  135. stationName: '',
  136. loopName: '',
  137. dateRange: [],
  138. pageNum: 1,
  139. pageSize: 10
  140. }
  141. }
  142. });
  143. const queryTree = () => {
  144. heatApi.heatStation.getList({
  145. name: '',
  146. code: '',
  147. status: -1
  148. })
  149. .then((res: any) => {
  150. state.heatList = res || [];
  151. });
  152. };
  153. const queryList = () => {
  154. state.tableData.loading = true
  155. energyApi.getEnergyPerformance(state.tableData.param)
  156. .then(res => {
  157. state.tableData.data = res.list || []
  158. state.tableData.total = res.Total
  159. state.tableData.loading = false
  160. })
  161. }
  162. // 页面加载时
  163. onMounted(() => {
  164. // queryTree()
  165. queryList()
  166. });
  167. /** 重置按钮操作 */
  168. const resetQuery = (formEl: FormInstance | undefined) => {
  169. if (!formEl) return;
  170. formEl.resetFields();
  171. queryList();
  172. };
  173. let chartArr = [
  174. { globalKey: 'redChartOneRef', refKey: redChartOneRef },
  175. { globalKey: 'redChartTwoRef', refKey: redChartTwoRef },
  176. { globalKey: 'redChartThreeRef', refKey: redChartThreeRef },
  177. { globalKey: 'blackChartOneRef', refKey: blackChartOneRef },
  178. { globalKey: 'blackChartTwoRef', refKey: blackChartTwoRef },
  179. { globalKey: 'blackChartThreeRef', refKey: blackChartThreeRef }
  180. ]
  181. const initChart = () => {
  182. chartArr.forEach((item) => {
  183. initBarChart(item.globalKey, item.refKey)
  184. })
  185. }
  186. // 初始化图表
  187. const initBarChart = (gk: string, refKey: any) => {
  188. if (!global.dispose.some((b: any) => b === global[gk])) global[gk].dispose();
  189. global[gk] = <any>echarts.init(refKey.value, state.charts.theme);
  190. const option = {
  191. tooltip: {
  192. trigger: 'axis',
  193. axisPointer: {
  194. type: 'shadow'
  195. }
  196. },
  197. legend: {},
  198. grid: {
  199. left: '3%',
  200. right: '4%',
  201. bottom: '3%',
  202. containLabel: true
  203. },
  204. xAxis: [
  205. {
  206. type: 'category',
  207. data: ['换热站1', '换热站2', '换热站3', '换热站4', '换热站5', '换热站6', '换热站7']
  208. }
  209. ],
  210. yAxis: [
  211. {
  212. type: 'value'
  213. }
  214. ],
  215. series: [
  216. {
  217. name: '供水流量',
  218. type: 'bar',
  219. emphasis: {
  220. focus: 'series'
  221. },
  222. data: [320, 332, 301, 334, 390, 330, 320]
  223. }
  224. ]
  225. };
  226. (<any>global[gk]).setOption(option);
  227. (<any>state.myCharts).push(global[gk]);
  228. }
  229. // 批量设置 echarts resize
  230. const initEchartsResizeFun = () => {
  231. nextTick(() => {
  232. for (let i = 0; i < state.myCharts.length; i++) {
  233. setTimeout(() => {
  234. (<any>state.myCharts[i]).resize();
  235. }, i * 1000);
  236. }
  237. });
  238. };
  239. // 批量设置 echarts resize
  240. const initEchartsResize = () => {
  241. window.addEventListener('resize', initEchartsResizeFun);
  242. };
  243. // 页面加载时
  244. onMounted(() => {
  245. initEchartsResize();
  246. });
  247. // 监听 vuex 中是否开启深色主题
  248. watch(
  249. () => store.state.themeConfig.themeConfig.isIsDark,
  250. (isIsDark) => {
  251. nextTick(() => {
  252. state.charts.theme = isIsDark ? 'transparent' : '';
  253. state.charts.bgColor = isIsDark ? 'transparent' : '';
  254. state.charts.color = isIsDark ? '#dadada' : '#303133';
  255. setTimeout(() => {
  256. // initChart();
  257. }, 500)
  258. });
  259. },
  260. {
  261. deep: true,
  262. immediate: true,
  263. }
  264. );
  265. </script>
  266. <style lang="scss" scoped>
  267. .title {
  268. font-size: 16px;
  269. font-weight: bold;
  270. }
  271. .chart-grid {
  272. display: grid;
  273. grid-template-columns: repeat(3, 1fr);
  274. grid-column-gap: 10px;
  275. }
  276. .mt20 {
  277. margin-top: 20px;
  278. }
  279. </style>