index.vue 8.2 KB

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