statement-prod.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <el-col :span="4" :xs="24">
  5. <div class="head-container">
  6. <el-input v-model="areaName" placeholder="请输入区域名称" clearable size="small" prefix-icon="el-icon-search"
  7. style="margin-bottom: 20px" />
  8. </div>
  9. <div class="head-container" style="height: 100vh; overflow: hidden; position: relative;">
  10. <el-tree :data="areaOptions" :props="defaultProps" :expand-on-click-node="false"
  11. :filter-node-method="filterNode" ref="tree" node-key="id" default-expand-all highlight-current
  12. @node-click="handleNodeClick" style="height: calc(100vh - 50px); overflow-y: auto;" />
  13. </div>
  14. </el-col>
  15. <el-col :span="20" :xs="24">
  16. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  17. <!-- 开始时间选择器 -->
  18. <el-form-item label="开始时间" prop="startRecTime">
  19. <el-date-picker
  20. v-model="queryParams.startRecTime"
  21. type="datetime"
  22. value-format="yyyy-MM-dd HH:00:00"
  23. :picker-options="startPickerOptions"
  24. placeholder="请选择开始时间"
  25. @change="handleTimeChange('startRecTime')">
  26. </el-date-picker>
  27. </el-form-item>
  28. <!-- 结束时间选择器 -->
  29. <el-form-item label="结束时间" prop="endRecTime">
  30. <el-date-picker
  31. v-model="queryParams.endRecTime"
  32. type="datetime"
  33. value-format="yyyy-MM-dd HH:00:00"
  34. :picker-options="endPickerOptions"
  35. placeholder="请选择结束时间"
  36. @change="handleTimeChange('endRecTime')">
  37. </el-date-picker>
  38. </el-form-item>
  39. <el-form-item>
  40. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  41. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  42. <el-button type="warning" plain icon="el-icon-download" size="mini" v-hasPermi="['ems:EmsEcoD:export']" @click="handleExport">导出</el-button>
  43. </el-form-item>
  44. </el-form>
  45. <el-table v-loading="loading" :data="pvSupplyHList" @selection-change="handleSelectionChange">
  46. <el-table-column label="日期" align="center" prop="date" width="180">
  47. <template slot-scope="scope">
  48. <span>{{ parseTime(scope.row.date, '{y}-{m}-{d}') }}</span>
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="时间" align="center" prop="time">
  52. <template slot-scope="scope">
  53. <span>{{ scope.row.time }}</span>
  54. </template>
  55. </el-table-column>
  56. <el-table-column label="总发电量(kW·h)" align="center" prop="genElecQuantity"/>
  57. <el-table-column label="自用电量(kW·h)" align="center" prop="useElecQuantity"/>
  58. <el-table-column label="上网电量(kW·h)" align="center" prop="upElecQuantity"/>
  59. <el-table-column label="上网收益(¥)" align="center" prop="upElecEarn"/>
  60. </el-table>
  61. <pagination
  62. v-show="total>0"
  63. :total="total"
  64. :page.sync="queryParams.pageNum"
  65. :limit.sync="queryParams.pageSize"
  66. @pagination="getList"
  67. />
  68. </el-col>
  69. </el-row>
  70. </div>
  71. </template>
  72. <script>
  73. import { areaTreeByFacsCategory } from '@/api/basecfg/area'
  74. import {listPvSupplyH} from "@/api/mgr/pgSupplyH";
  75. export default {
  76. name: "EmsEcoD",
  77. data() {
  78. return {
  79. // 遮罩层
  80. loading: true,
  81. // 选中数组
  82. ids: [],
  83. // 非单个禁用
  84. single: true,
  85. // 非多个禁用
  86. multiple: true,
  87. // 显示搜索条件
  88. showSearch: true,
  89. // 总条数
  90. total: 0,
  91. // 节能计量日表格数据
  92. EmsEcoDList: [],
  93. pvSupplyHList: [],
  94. // 弹出层标题
  95. title: "",
  96. // 是否显示弹出层
  97. open: false,
  98. // 表单参数
  99. areaOptions: [],
  100. areaName: undefined,
  101. facsCategory: 'E',
  102. facsSubCategory: 'E5',
  103. // 设施选项
  104. facsOptions: undefined,
  105. defaultProps: {
  106. children: "children",
  107. label: "label"
  108. },
  109. // 查询参数
  110. queryParams: {
  111. pageNum: 1,
  112. pageSize: 10,
  113. areaCode: null,
  114. startRecTime: null,
  115. endRecTime: null,
  116. },
  117. // 表单参数
  118. form: {},
  119. // 表单校验
  120. rules: {
  121. areaCode: [
  122. {required: true, message: "园区代码不能为空", trigger: "blur"}
  123. ],
  124. date: [
  125. {required: true, message: "日期不能为空", trigger: "blur"}
  126. ],
  127. },
  128. // 时间选择器配置
  129. startPickerOptions: {
  130. disabledDate: (time) => {
  131. return time.getTime() > Date.now() - 8.64e7 // 禁用未来时间
  132. },
  133. selectableRange: this.generateHourRanges()
  134. },
  135. endPickerOptions: {
  136. disabledDate: (time) => {
  137. if (this.queryParams.startRecTime) {
  138. return time.getTime() < new Date(this.queryParams.startRecTime).getTime() ||
  139. time.getTime() > Date.now() - 8.64e7
  140. }
  141. return time.getTime() > Date.now() - 8.64e7
  142. },
  143. selectableRange: this.generateHourRanges()
  144. }
  145. };
  146. },
  147. created() {
  148. this.getAreaList();
  149. this.getList();
  150. },
  151. methods: {
  152. /** 查询节能计量日列表 */
  153. getList() {
  154. this.loading = true;
  155. listPvSupplyH(this.queryParams).then(response => {
  156. this.pvSupplyHList = response.rows
  157. this.total = response.total
  158. this.loading = false
  159. })
  160. },
  161. // 查询区域列表
  162. async getAreaList () {
  163. await areaTreeByFacsCategory(this.facsCategory, this.facsSubCategory, false).then(response => {
  164. this.areaOptions = [{
  165. id: '-1',
  166. label: '全部',
  167. children: []
  168. }].concat(response.data)
  169. this.selectedLabel = '全部'
  170. this.queryParams.areaCode = '-1'
  171. })
  172. },
  173. // 生成整点时间范围
  174. generateHourRanges() {
  175. const ranges = []
  176. for (let i = 0; i < 24; i++) {
  177. const start = `${i.toString().padStart(2, '0')}:00:00`
  178. const end = `${i.toString().padStart(2, '0')}:59:59`
  179. ranges.push(`${start} - ${end}`)
  180. }
  181. return ranges
  182. },
  183. // 时间选择处理
  184. handleTimeChange(field) {
  185. if (this.queryParams[field]) {
  186. const date = new Date(this.queryParams[field])
  187. // 手动格式化日期(替代moment.js)
  188. const formatDate = (d) => {
  189. const pad = (n) => String(n).padStart(2, '0')
  190. return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:00:00`
  191. }
  192. this.queryParams[field] = formatDate(date)
  193. }
  194. // 自动同步结束时间范围
  195. if (field === 'startRecTime' && this.queryParams.endRecTime) {
  196. this.$nextTick(() => {
  197. this.$refs.queryForm.validateField('endRecTime')
  198. })
  199. }
  200. },
  201. // 取消按钮
  202. cancel() {
  203. this.open = false;
  204. this.reset();
  205. },
  206. // 表单重置
  207. reset() {
  208. this.form = {
  209. id: null,
  210. areaCode: null,
  211. date: null
  212. };
  213. this.resetForm("form");
  214. },
  215. /** 搜索按钮操作 */
  216. handleQuery() {
  217. this.queryParams.pageNum = 1;
  218. this.getList();
  219. },
  220. /** 重置按钮操作 */
  221. resetQuery() {
  222. this.resetForm("queryForm");
  223. this.handleQuery();
  224. },
  225. /** 导出按钮操作 */
  226. handleExport() {
  227. this.download('ems/prod/pv/hour/export', {
  228. ...this.queryParams
  229. }, `产能报表_${new Date().getTime()}.xlsx`)
  230. },
  231. // 筛选节点
  232. filterNode (value, data) {
  233. if (!value) return true
  234. return data.label.indexOf(value) !== -1
  235. },
  236. // 节点单击事件
  237. handleNodeClick (data) {
  238. this.queryParams.areaCode = data.id
  239. this.selectedLabel = data.label
  240. this.getList()
  241. }
  242. }
  243. };
  244. </script>