index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  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">
  10. <el-tree :data="areaOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"
  11. node-key="id" default-expand-all highlight-current @node-click="handleNodeClick" />
  12. </div>
  13. </el-col>
  14. <el-col :span="20" :xs="24">
  15. <el-tabs v-model="activeTab" @tab-click="handleTabChange">
  16. <el-tab-pane label="电表抄报" name="first">
  17. </el-tab-pane>
  18. <el-tab-pane label="水表抄报" name="second">
  19. </el-tab-pane>
  20. </el-tabs>
  21. <!--表格 -->
  22. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
  23. <el-form-item label="表记编号" prop="deviceCode">
  24. <el-input v-model="queryParams.deviceCode" placeholder="请输入设备代码" clearable @keyup.enter.native="handleQuery" />
  25. </el-form-item>
  26. <el-form-item>
  27. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  28. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  29. </el-form-item>
  30. </el-form>
  31. <el-table v-loading="loading" :data="deviceList">
  32. <el-table-column label="表计名称" align="left" prop="deviceName" width="200px">
  33. <template slot-scope="scope">
  34. <span>{{ scope.row.deviceName }}</span>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="设备代码" align="center" prop="deviceCode" />
  38. <el-table-column label="计量标签" align="center" prop="objTag">
  39. <template slot-scope="scope">
  40. <span>{{ getObjTagName(scope.row.objTag) }}</span>
  41. </template>
  42. </el-table-column>
  43. <el-table-column label="抄表周期" align="center" prop="colCycle">
  44. <template slot-scope="scope">
  45. <span>{{ getColCycleName(scope.row.colCycle) }}</span>
  46. </template>
  47. </el-table-column>
  48. <el-table-column label="上次抄表日期" align="center" prop="lastTime" />
  49. <el-table-column label="上次抄表示数" align="center" prop="lastReading" />
  50. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  51. <template slot-scope="scope">
  52. <el-button size="mini" type="text" :disabled="!canFill(scope.row.lastTime)" icon="el-icon-info" @click="handleRecord(scope.row)">
  53. 填报</el-button>
  54. <el-button size="mini" type="text" icon="el-icon-document" @click="handleViewRec(scope.row)">
  55. 查看</el-button>
  56. </template>
  57. </el-table-column>
  58. </el-table>
  59. <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  60. @pagination="getList" />
  61. <!-- 历史抄表记录 -->
  62. <!-- <el-dialog :title="title" :visible.sync="recListOpen" width="1200px" append-to-body>-->
  63. <el-form ref="recListForm" :model="recListForm" label-width="80px">
  64. <el-form-item label="年份" prop="year">
  65. <el-date-picker v-model="recListForm.year" :clearable="false" @change="getHistoryList" value-format="yyyy" type="year"
  66. placeholder="选择年份">
  67. </el-date-picker>
  68. </el-form-item>
  69. <el-form-item label="计量设备" prop="year">
  70. <el-input disabled :value="recListForm.deviceCode" />
  71. </el-form-item>
  72. <el-form-item label="抄表历史" prop="recList">
  73. <el-table v-loading="loading" :data="recListForm.recList" max-height="280px">
  74. <el-table-column label="年份" align="center" prop="year" />
  75. <el-table-column label="月份" align="center" prop="meterMonth" >
  76. <template slot-scope="scope">
  77. <!-- 使用 JavaScript 字符串方法截取月份部分 -->
  78. {{ scope.row.meterMonth.slice(-2) }}
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="抄表示数" align="center" prop="meterReading" />
  82. <el-table-column label="用量" align="center" prop="increase" />
  83. <el-table-column label="抄表日期" align="center" prop="meterTime" />
  84. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  85. <template slot-scope="scope">
  86. <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="!canEdit(scope.row.meterMonth)"
  87. @click="updateRecord(scope.row)">修改</el-button>
  88. </template>
  89. </el-table-column>
  90. </el-table>
  91. </el-form-item>
  92. </el-form>
  93. <!-- <div slot="footer" class="dialog-footer">-->
  94. <!-- <el-button @click="closeRecList">关 闭</el-button>-->
  95. <!-- </div>-->
  96. <!-- </el-dialog>-->
  97. <!-- 填报 -->
  98. <el-dialog :title="fillTitle" :visible.sync="fillFormOpen" width="500px" append-to-body>
  99. <el-form ref="fillForm" :model="fillForm" label-width="150px">
  100. <el-form-item label="表计编号">
  101. <el-input disabled :value="fillForm.deviceCode" />
  102. </el-form-item>
  103. <el-form-item label="上次抄表日期">
  104. <el-input disabled :value="fillForm.lastTime" />
  105. </el-form-item>
  106. <el-form-item label="上次抄表示数">
  107. <el-input disabled :value="fillForm.lastReading" />
  108. </el-form-item>
  109. <hr>
  110. <el-form-item label="本次抄表月份">
  111. <el-input disabled :value="currentMonth" />
  112. </el-form-item>
  113. <el-form-item required :rules="[{required:true,message:'请输入本次抄表示数'}]" label="本次抄表示数" prop="meterReading">
  114. <el-input v-model="fillForm.meterReading" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入本次抄表示数" />
  115. </el-form-item>
  116. <el-form-item label="综合倍率" prop="magnification">
  117. <el-input disabled :value="fillForm.magnification" />
  118. </el-form-item>
  119. <el-form-item :label="`参考增量(${activeTab==='first'?'度':'吨'})`">
  120. <el-input disabled :value="increase" />
  121. </el-form-item>
  122. </el-form>
  123. <div slot="footer" class="dialog-footer">
  124. <el-button type="primary" @click="submitFillForm">确 定</el-button>
  125. <el-button @click="fillCancel">取 消</el-button>
  126. </div>
  127. </el-dialog>
  128. <!-- &lt;!&ndash; 历史抄表记录 &ndash;&gt;-->
  129. <!-- <el-dialog :title="title" :visible.sync="recListOpen" width="1200px" append-to-body>-->
  130. <!-- <el-form ref="recListForm" :model="recListForm" label-width="80px">-->
  131. <!-- <el-form-item label="年份" prop="year">-->
  132. <!-- <el-date-picker v-model="recListForm.year" :clearable="false" @change="getHistoryList" value-format="yyyy" type="year"-->
  133. <!-- placeholder="选择年份">-->
  134. <!-- </el-date-picker>-->
  135. <!-- </el-form-item>-->
  136. <!-- <el-form-item label="计量设备" prop="year">-->
  137. <!-- <el-input disabled :value="recListForm.deviceCode" />-->
  138. <!-- </el-form-item>-->
  139. <!-- <el-form-item label="抄表历史" prop="recList">-->
  140. <!-- <el-table v-loading="loading" :data="recListForm.recList" max-height="280px">-->
  141. <!-- <el-table-column label="年份" align="center" prop="year" />-->
  142. <!-- <el-table-column label="月份" align="center" prop="meterMonth" >-->
  143. <!-- <template slot-scope="scope">-->
  144. <!-- &lt;!&ndash; 使用 JavaScript 字符串方法截取月份部分 &ndash;&gt;-->
  145. <!-- {{ scope.row.meterMonth.slice(-2) }}-->
  146. <!-- </template>-->
  147. <!-- </el-table-column>-->
  148. <!-- <el-table-column label="抄表示数" align="center" prop="meterReading" />-->
  149. <!-- <el-table-column label="用量" align="center" prop="increase" />-->
  150. <!-- <el-table-column label="抄表日期" align="center" prop="meterTime" />-->
  151. <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
  152. <!-- <template slot-scope="scope">-->
  153. <!-- <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="!canEdit(scope.row.meterMonth)"-->
  154. <!-- @click="updateRecord(scope.row)">修改</el-button>-->
  155. <!-- </template>-->
  156. <!-- </el-table-column>-->
  157. <!-- </el-table>-->
  158. <!-- </el-form-item>-->
  159. <!-- </el-form>-->
  160. <!-- <div slot="footer" class="dialog-footer">-->
  161. <!-- <el-button @click="closeRecList">关 闭</el-button>-->
  162. <!-- </div>-->
  163. <!-- </el-dialog>-->
  164. </el-col>
  165. </el-row>
  166. </div>
  167. </template>
  168. <script>
  169. import { listDevice } from '@/api/device/meterDevice'
  170. import { listMeterReadingByParam, getLastRecord, addMeterReading, updateMeterReading } from '@/api/device/meterRead'
  171. import { areaTreeSelect } from '@/api/basecfg/area'
  172. import Treeselect from '@riophae/vue-treeselect'
  173. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  174. import { dateFormat } from '@/utils/index.js'
  175. export default {
  176. name: 'Device',
  177. components: { Treeselect },
  178. data() {
  179. const nowDay = new Date()
  180. return {
  181. currentMonth: dateFormat(nowDay, 'yyyyMM'),
  182. activeTab: 'first',
  183. // 遮罩层
  184. loading: true,
  185. // 总条数
  186. total: 0,
  187. // 计量设备表格数据
  188. deviceList: [],
  189. // 弹出层标题
  190. title: '',
  191. // 记录表单开启
  192. recListOpen: false,
  193. // 填报表单开启
  194. fillFormOpen: false,
  195. // 区域名称
  196. areaName: undefined,
  197. areaOptions: [],
  198. defaultProps: {
  199. children: 'children',
  200. label: 'label'
  201. },
  202. // 能源分类树
  203. emsClsOptions: [
  204. { code: 45, name: '电表' },
  205. { code: 70, name: '水表' }
  206. ],
  207. // 查询参数
  208. queryParams: {
  209. pageNum: 1,
  210. pageSize: 10,
  211. areaCode: null,
  212. deviceCode: null,
  213. deviceName: null,
  214. meterCls: 45
  215. },
  216. // 电表表单参数
  217. recListForm: {
  218. year: '',
  219. deviceCode: '',
  220. recList: []
  221. },
  222. fillTitle: '',
  223. fillForm: {
  224. id: '',
  225. deviceCode: '',
  226. areaCode: '',
  227. lastTime: '',
  228. lastReading: '',
  229. meterTime: '',
  230. meterReading: '',
  231. increase: '',
  232. magnification: 1
  233. },
  234. curRow: {},
  235. ifAdd: true // 判断 新增还是修改
  236. }
  237. },
  238. computed: {
  239. increase() {
  240. const { meterReading, magnification, lastReading } = this.fillForm
  241. if (meterReading && magnification) {
  242. return (meterReading - (lastReading || 0)) * magnification
  243. }
  244. return ''
  245. }
  246. },
  247. created() {
  248. this.getAreaTreeSelect('0', false)
  249. this.getList()
  250. },
  251. methods: {
  252. /** 查询计量设备列表 */
  253. getList() {
  254. this.loading = true
  255. listDevice(this.queryParams).then(response => {
  256. this.deviceList = response.rows.map(item=>({
  257. ...item,
  258. meterMonth:'',
  259. lastTime:'',
  260. lastReading:'',
  261. }))
  262. this.total = response.total
  263. this.loading = false
  264. this.deviceList.forEach(async item => {
  265. await getLastRecord(item.areaCode, item.deviceCode).then(({ data }) => {
  266. if (data) {
  267. item.lastTime = data.meterTime
  268. item.meterMonth = data.meterMonth
  269. item.lastReading = data.meterReading
  270. }
  271. })
  272. })
  273. })
  274. },
  275. /** 搜索按钮操作 */
  276. handleQuery() {
  277. this.queryParams.pageNum = 1
  278. this.getList()
  279. },
  280. /** 重置按钮操作 */
  281. resetQuery() {
  282. this.resetForm('queryForm')
  283. this.handleQuery()
  284. },
  285. handleTabChange() {
  286. // 根据newTabName给someParam赋值
  287. if (this.activeTab === 'first') {
  288. // 电表抄表
  289. this.queryParams.meterCls = '45'
  290. } else if (this.activeTab === 'second') {
  291. // 水表抄表
  292. this.queryParams.meterCls = '70'
  293. }
  294. this.handleQuery()
  295. },
  296. getObjTypeName(objType) {
  297. const typeMap = {
  298. 1: '区块',
  299. 2: '设备'
  300. }
  301. return typeMap[objType] || '未知'
  302. },
  303. getColCycleName(colCycle) {
  304. const cycleMap = {
  305. 0: '实时',
  306. 1: '分钟',
  307. 2: '小时',
  308. 3: '天',
  309. 4: '月'
  310. }
  311. return cycleMap[colCycle] || ''
  312. },
  313. getObjTagName(objTag) {
  314. const tagMap = {
  315. 0: '公摊表',
  316. 1: '个户表'
  317. }
  318. return tagMap[objTag] || '未知'
  319. },
  320. async getAreaTreeSelect(areaCode, recursion) {
  321. await areaTreeSelect(areaCode, recursion).then(response => {
  322. this.areaOptions = response.data
  323. })
  324. },
  325. // 筛选节点
  326. filterNode(value, data) {
  327. if (!value) return true
  328. return data.label.indexOf(value) !== -1
  329. },
  330. // 节点单击事件
  331. handleNodeClick(data) {
  332. this.queryParams.areaCode = data.id
  333. this.handleQuery()
  334. },
  335. handleViewRec(row) {
  336. this.recListForm = this.$options.data().recListForm
  337. this.resetForm('recListForm')
  338. this.title = row.deviceName
  339. this.curRow = row
  340. this.recListForm.year = dateFormat(new Date(), 'yyyy')
  341. this.recListForm.deviceCode = row.deviceCode
  342. this.getHistoryList()
  343. this.recListOpen = true
  344. },
  345. getHistoryList() {
  346. const { areaCode, deviceCode } = this.curRow
  347. listMeterReadingByParam({
  348. areaCode,
  349. deviceCode,
  350. year: this.recListForm.year,
  351. orderFlag: 'desc'
  352. }).then(response => {
  353. this.recListForm.recList = response.data || []
  354. })
  355. },
  356. async handleRecord(row) {
  357. this.fillForm = this.$options.data().fillForm
  358. this.resetForm('fillForm')
  359. this.fillTitle = row.deviceName
  360. this.fillForm.deviceCode = row.deviceCode
  361. this.fillForm.areaCode = row.areaCode
  362. this.fillForm.magnification = row.magnification
  363. this.fillForm.lastTime = row.lastTime
  364. this.fillForm.lastReading = row.lastReading
  365. this.ifAdd = true
  366. // let existFlag = false
  367. // // 获取上次填报记录
  368. // await getLastRecord(row.areaCode, row.deviceCode).then(({ data }) => {
  369. // if (data) {
  370. // if (data.meterMonth === this.currentMonth) {
  371. // existFlag = true
  372. // } else {
  373. // this.fillForm.lastTime = data.meterTime
  374. // this.fillForm.lastReading = data.meterReading
  375. // }
  376. // }
  377. // })
  378. // if (row.meterMonth===this.currentMonth) {
  379. // this.$modal.msgError('当前月份已填报')
  380. // } else {
  381. this.fillFormOpen = true
  382. // }
  383. },
  384. canEdit(meterMonth) {
  385. return meterMonth === this.currentMonth
  386. },
  387. canFill (lastTime) {
  388. return dateFormat(new Date(lastTime),'yyyyMM')!==this.currentMonth
  389. },
  390. updateRecord(row) {
  391. this.ifAdd = false
  392. this.fillFormOpen = true
  393. this.fillForm = this.$options.data().fillForm
  394. this.resetForm('fillForm')
  395. this.fillTitle = this.curRow.objName
  396. this.fillForm.deviceCode = this.curRow.deviceCode
  397. this.fillForm.areaCode = this.curRow.areaCode
  398. this.fillForm.magnification = this.curRow.magnification
  399. this.fillForm.id = row.id
  400. this.fillForm.lastTime = row.lastTime
  401. this.fillForm.lastReading = row.lastReading
  402. this.fillForm.meterReading = row.meterReading
  403. },
  404. submitFillForm() {
  405. this.$refs['fillForm'].validate(valid => {
  406. if (valid) {
  407. this.fillForm.increase = this.increase
  408. if (this.ifAdd) {
  409. addMeterReading(this.fillForm).then(({ code, msg }) => {
  410. if (code === 200) {
  411. this.$modal.msgSuccess('填报成功')
  412. this.fillFormOpen = false
  413. } else {
  414. this.$modal.msgError(msg)
  415. }
  416. })
  417. } else {
  418. updateMeterReading(this.fillForm).then(({ code, msg }) => {
  419. if (code === 200) {
  420. this.$modal.msgSuccess('修改成功')
  421. this.getHistoryList()
  422. this.fillFormOpen = false
  423. } else {
  424. this.$modal.msgError(msg)
  425. }
  426. })
  427. }
  428. }
  429. })
  430. },
  431. fillCancel() {
  432. this.fillFormOpen = false
  433. },
  434. closeRecList() {
  435. this.recListOpen = false
  436. }
  437. }
  438. }
  439. </script>