index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
  2. <div class="app-container">
  3. <div>
  4. <el-card>
  5. <div slot="header" class="clearfix">
  6. <b><span>逆变器信息</span></b>
  7. <el-button :loading="loadButton" style="float: right;padding:3px 10px 3px 3px;" type="text"
  8. @click="exportDataEvent">导出数据
  9. </el-button>
  10. </div>
  11. <el-button type="primary" @click="insertEvent" size="small" style="round-clip: 10px" :loading="loadButton">添加</el-button>
  12. <el-button
  13. size="small"
  14. :loading="loadButton"
  15. type="primary"
  16. style="round-clip: 10px"
  17. @click="piInsertEvent">
  18. 批量添加
  19. </el-button>
  20. <el-button
  21. size="small"
  22. :loading="loadButton"
  23. type="danger"
  24. style="round-clip: 10px"
  25. @click="getSelectionEvent">
  26. 批量删除
  27. </el-button>
  28. <div style="padding-top: 10px">
  29. <vxe-table
  30. ref="xTable"
  31. border
  32. export-config
  33. keep-source
  34. auto-resize
  35. resizable
  36. highlight-current-row
  37. :loading="loading"
  38. :edit-rules="rules"
  39. :data="tableData"
  40. v-show="showTable"
  41. :edit-config="{trigger: 'manual', mode: 'row',autoClear:false,showStatus: true,icon:'none'}">
  42. <vxe-table-column title="逆变器信息" align="center">
  43. <vxe-table-column type="checkbox" width="3%"></vxe-table-column>
  44. <vxe-table-column field="name" title="名称" width="8%" align="center"
  45. :edit-render="{name: '$input', attrs: {type: 'text'}}"></vxe-table-column>
  46. <vxe-table-column field="modelNumber" title="型号" width="8%" align="center"
  47. :edit-render="{name: '$input', attrs: {type: 'text'}}"></vxe-table-column>
  48. <vxe-table-column field="manufacturer" title="生产商" width="8%" align="center"
  49. :edit-render="{name: '$input', attrs: {type: 'text'}}"></vxe-table-column>
  50. <vxe-table-column width="150px" field="installationTime" title="安装时间" align="center"
  51. :edit-render="{props: {type: 'default'}}">
  52. <template v-slot:edit="{ row }">
  53. <el-date-picker
  54. size="mini"
  55. v-model="row.installationTime"
  56. style="width: 100%"
  57. type="date"
  58. placeholder="选择日期:"
  59. />
  60. </template>
  61. <template v-slot="{ row }">{{ timestampToTime(row.installationTime) }}</template>
  62. </vxe-table-column>
  63. <vxe-table-column field="report" title="是否上报" width="8%" align="center"
  64. :edit-render="{name: '$select', options: trueOrFalse}"></vxe-table-column>
  65. <vxe-table-column field="capacity" title="额定功率" width="8%" align="center"
  66. :edit-render="{name: '$input', attrs: {type: 'text'}}"></vxe-table-column>
  67. <vxe-table-column field="efficiency" title="效率" width="8%" align="center"
  68. :edit-render="{name: '$input', attrs: {type: 'text'}}"></vxe-table-column>
  69. <vxe-table-column field="box" title="箱式变压器" width="8%" align="center"
  70. :edit-render="{name: '$input', props: {type: 'text'}}"></vxe-table-column>
  71. <vxe-table-column field="collectorCircuit" title="集电线路" width="8%" align="center"
  72. :edit-render="{name: '$input', props: {type: 'text'}}"></vxe-table-column>
  73. <vxe-table-column field="batteryModel" title="光组型号" width="8%" align="center"
  74. :edit-render="{name: '$select', options: pvInfoMode}"></vxe-table-column>
  75. <vxe-table-column field="batteryNumber" title="光组个数" width="8%" align="center"
  76. :edit-render="{name: '$input', props: {type: 'number'}}"></vxe-table-column>
  77. <vxe-table-column field="groupSeries" title="是否组串" width="6%" align="center"
  78. :edit-render="{name: '$select', options: trueOrFalse}"></vxe-table-column>
  79. <vxe-table-column field="sample" title="是否样板" width="6%" align="center"
  80. :edit-render="{name: '$select', options: trueOrFalse}"></vxe-table-column>
  81. <vxe-table-column field="backupA" width="10%" title="样板机编号"
  82. :edit-render="{name: '$input',attrs:{type:'text'}}"/>
  83. <vxe-table-column field="backupB" title="经度" width="8%" align="center"
  84. :edit-render="{name: '$input', props: {type: 'text'}}"></vxe-table-column>
  85. <vxe-table-column field="backupC" title="纬度" width="8%" align="center"
  86. :edit-render="{name: '$input', props: {type: 'text'}}"></vxe-table-column>
  87. <vxe-table-column field="interval" title="入库间隔(单位s)" width="8%" align="center"
  88. :edit-render="{name: '$select', options: intervals}"></vxe-table-column>
  89. <vxe-table-column title="操作" fixed="right" width="10%" align="center">
  90. <template v-slot="{ row }">
  91. <template v-if="$refs.xTable.isActiveByRow(row)">
  92. <el-button
  93. type="success"
  94. style="padding: 3px 4px 3px 4px;margin: 2px;"
  95. size="medium"
  96. icon="el-icon-edit"
  97. @click="editSave(row)">保存
  98. </el-button>
  99. <el-button
  100. class="cancel-btn"
  101. icon="el-icon-refresh"
  102. type="warning"
  103. style="padding: 3px 4px 3px 4px;margin: 2px;"
  104. size="medium"
  105. @click="cancelRowEvent(row)">取消
  106. </el-button>
  107. </template>
  108. <template v-else>
  109. <el-button
  110. :loading="loadButton"
  111. type="primary"
  112. style="padding: 3px 4px 3px 4px;margin: 2px;"
  113. size="medium "
  114. icon="el-icon-edit"
  115. @click="editRowEvent(row)">编辑
  116. </el-button>
  117. <el-button
  118. :loading="loadButton"
  119. type="danger"
  120. style="padding: 3px 4px 3px 4px;margin: 2px;"
  121. size="medium "
  122. icon="el-icon-delete"
  123. @click="deleteRowEvent(row)">删除
  124. </el-button>
  125. </template>
  126. </template>
  127. </vxe-table-column>
  128. </vxe-table-column>
  129. </vxe-table>
  130. <vxe-pager
  131. perfect
  132. :current-page.sync="currentPage"
  133. :page-size.sync="pageSize"
  134. :total="total"
  135. :page-sizes=[10,50,100]
  136. :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
  137. @page-change="handlePageChange"
  138. v-show="!loadButton&&showTable"
  139. >
  140. </vxe-pager>
  141. </div>
  142. </el-card>
  143. </div>
  144. <!-- 删除提示框 -->
  145. <el-dialog :visible.sync="delVisible" title="提示" width="300px" center>
  146. <div class="del-dialog-cnt">删除不可恢复,是否确定删除?</div>
  147. <span slot="footer" class="dialog-footer">
  148. <el-button type="primary" @click="deleteCancel()">取 消</el-button>
  149. <el-button type="primary" @click="deleteInfo()">确 定</el-button>
  150. </span>
  151. </el-dialog>
  152. </div>
  153. </template>
  154. <script>
  155. import request from '@/utils/request'
  156. export default {
  157. data() {
  158. const checkName = (rule, value, callback) => {
  159. var s6 = this.tableData
  160. if (value == null || value === '') {
  161. callback(new Error('请填写逆变器名称'))
  162. }
  163. for (let i = 0; i < s6.length; i++) {
  164. if (this.id == '' || this.id == undefined) {
  165. // 新增
  166. if ((value == s6[i].name)) {
  167. callback(new Error('名称不能重复'))
  168. }
  169. } else {
  170. // 修改
  171. if (this.id != s6[i].id) {
  172. if ((value == s6[i].name)) {
  173. callback(new Error('名称不能重复'))
  174. }
  175. }
  176. }
  177. }
  178. callback()
  179. }
  180. return {
  181. id:'',
  182. currentPage: 1,
  183. pageSize: 10,
  184. total: 0,
  185. isSample: '',
  186. piadd: '',
  187. loadButton: false,
  188. loading: false,
  189. rowId: "",
  190. options: [{value: true, label: '样板机'},
  191. {value: null, label: '所有'}],
  192. option: "",
  193. tableData: [],
  194. showTable: true,
  195. batchAddData: [],
  196. delVisible: false,
  197. //是否为编辑
  198. isEdit: false,
  199. pvInfo: [],
  200. pvInfoMode: [],
  201. pvRotationMode: [],
  202. trueOrFalse: [{label: '是', value: true},
  203. {label: '否', value: false}],
  204. intervals:[{ key: 0, value: 0, label: '不入库' },{key:60,value:60,label:'一分钟'},{key:900,value:900,label:'十五分钟'}],
  205. // 表单验证规则
  206. rules: {
  207. name: [
  208. {required: true, validator:checkName}
  209. ],
  210. modelNumber: [
  211. {required: true, message: '逆变器型号不能为空', trigger: 'blur'}
  212. ],
  213. capacity: [
  214. {required: true, message: '额定容量不能为空', trigger: 'blur'},
  215. {pattern: /^\d+(\.\d{1,2})?$/, message: '只能输入正数数字或带小数点2位以内的数字'},
  216. ],
  217. efficiency: [
  218. {required: true, message: '逆变器效率不能为空', trigger: 'blur'},
  219. {pattern: /^\d+(\.\d{1,2})?$/, message: '只能输入正数数字或带小数点2位以内的数字'},
  220. ],
  221. backupB: [
  222. { required: true, message: '请正确填写经度' },
  223. {pattern: /^\d+(\.\d{1,4})?$/, message: '只能输入正数数字或带小数点4位以内的数字'}
  224. // {message: '输入过长', max: 10}
  225. ],
  226. backupC: [
  227. { required: true, message: '请正确填写纬度' },
  228. {pattern: /^\d+(\.\d{1,4})?$/, message: '只能输入正数数字或带小数点4位以内的数字'}
  229. // {message: '输入过长', max: 10}
  230. ],
  231. box: [
  232. {required: true, message: '箱变不能为空', trigger: 'blur'},
  233. ],
  234. collectorCircuit: [
  235. {required: true, message: '集电线不能为空', trigger: 'blur'},
  236. ],
  237. batteryModel: [
  238. {required: true, message: '光组型号不能为空', trigger: 'blur'},
  239. ],
  240. batteryNumber: [
  241. {required: true, message: '光组个数不能为空', trigger: 'blur'}
  242. ],
  243. groupSeries: [
  244. {required: true, message: '是否组串式逆变器不能为空', trigger: 'change'}
  245. ],
  246. sample: [
  247. {required: true, message: '是否样板机不能为空', trigger: 'change'}
  248. ],
  249. manufacturer: [
  250. {required: true, message: '制造商名称不能为空'},
  251. ],
  252. installationTime: [
  253. {required: true, message: '请选择日期'}
  254. ],
  255. report: [
  256. {required: true, message: '是否上报不能为空', trigger: 'change'}
  257. ]
  258. }
  259. }
  260. },
  261. created() {
  262. this.getData(this.currentPage, this.pageSize)
  263. },
  264. activated() {
  265. console.log("2激活activated钩子函数");
  266. },
  267. deactivated() {
  268. console.log("2激活deactivated钩子函数");
  269. },
  270. methods: {
  271. getData(currentPage, pageSize) {
  272. this.loading = true
  273. let url = currentPage + '/' + pageSize
  274. this.$axios.get('/inverterInfo/' + url).then(res => {
  275. if (res.data.content == "") {
  276. this.showTable = false
  277. } else {
  278. this.showTable = true
  279. }
  280. this.tableData = res.data.content
  281. this.total = res.data.totalElements
  282. this.loading = false
  283. // console.log(res.data)
  284. this.getPvData()
  285. }).catch((error) => {
  286. this.$message.error('获取逆变器信息出错' + error)
  287. })
  288. },
  289. handlePageChange({currentPage, pageSize}) {
  290. this.currentPage = currentPage
  291. this.pageSize = pageSize
  292. this.getData(this.currentPage, this.pageSize)
  293. },
  294. getPvData() {
  295. this.$axios.get('/pvModuleModel/').then(res => {
  296. this.pvInfo = res.data
  297. this.pvInfoMode = []
  298. for (let i = 0; i < this.pvInfo.length; i++) {
  299. const pInfo = {label: this.pvInfo[i].model, value: this.pvInfo[i].id}
  300. this.pvInfoMode.push(pInfo)
  301. }
  302. console.log("获取所有光伏组件信息成功")
  303. }).catch((error) => {
  304. this.$message.error('获取逆变器信息出错' + error)
  305. })
  306. },
  307. timestampToTime(time) {
  308. const date = new Date(time) // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
  309. const Y = date.getFullYear() + '-'
  310. const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  311. const D = date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()
  312. return Y + M + D
  313. },
  314. getSelectionEvent() {
  315. let selectRecords = this.$refs.xTable.getCheckboxRecords()
  316. if(selectRecords==""){
  317. this.$message.error('请选择要删除的对象')
  318. return
  319. }
  320. this.rowId = ''
  321. for (let i = 0; i < selectRecords.length; i++)
  322. this.rowId += (selectRecords[i].id + ",")
  323. // console.log(this.rowId)
  324. this.delVisible = true
  325. },
  326. piInsertEvent(row) {
  327. this.piadd = true;
  328. this.showTable = true
  329. this.isEdit = false;
  330. this.loadButton = true;
  331. this.$refs.xTable.insert({interval: 60}).then(({row}) => this.$refs.xTable.setActiveRow(row))
  332. },
  333. insertEvent(row) {
  334. this.id = ''
  335. this.showTable = true
  336. this.piadd = false;
  337. this.isEdit = false;
  338. this.loadButton = true;
  339. this.$refs.xTable.insert({interval: 60}).then(({row}) => this.$refs.xTable.setActiveRow(row))
  340. },
  341. async insertBatchEvent(row) {
  342. /*const { row: newRow } = await this.$refs.bTable.insert()*/
  343. // alert(1111)
  344. // 插入一条数据并触发校验
  345. let {row: newRow} = await this.$refs.bTable.insertAt(row)
  346. await this.$refs.bTable.setActiveRow(newRow)
  347. // alert(2222)
  348. /* const errMap = await this.$refs.bTable.validate(newRow).catch(errMap => errMap)
  349. if (errMap) {
  350. }*/
  351. },
  352. async fullValidEvent() {
  353. const errMap = await this.$refs.bTable.fullValidate().catch(errMap => errMap)
  354. if (errMap) {
  355. let msgList = []
  356. Object.values(errMap).forEach(errList => {
  357. errList.forEach(params => {
  358. let {rowIndex, column, rules} = params
  359. rules.forEach(rule => {
  360. msgList.push(`第 ${rowIndex} 行 ${column.title} 校验错误:${rule.message}`)
  361. })
  362. })
  363. })
  364. this.$XModal.message({
  365. status: 'error',
  366. message: () => {
  367. return [
  368. < div
  369. class
  370. = "red"
  371. style = "max-height: 400px;overflow: auto;" >
  372. {
  373. msgList.map(msg => < div > {msg} < /div>)
  374. }
  375. < /div>
  376. ]
  377. }
  378. })
  379. } else {
  380. this.$XModal.message({status: 'success', message: '校验成功!'})
  381. }
  382. },
  383. saveBatchEvent() {
  384. const {insertRecords, removeRecords, updateRecords} = this.$refs.bTable.getRecordset()
  385. this.$XModal.alert(`insertRecords=${insertRecords.length} removeRecords=${removeRecords.length} updateRecords=${updateRecords.length}`)
  386. },
  387. editRowEvent(row) {
  388. this.id = row.id
  389. for (let i = 0; i < this.pvInfoMode.length; i++) {
  390. if (row.batteryModel == this.pvInfoMode[i].value) {
  391. row.batteryModel = this.pvInfoMode[i].value
  392. }
  393. }
  394. this.isEdit = true
  395. this.loadButton = true
  396. this.$refs.xTable.setActiveRow(row)
  397. },
  398. //设计有判断是否批量添加,批量添加弹窗表明添加条数,然后批量生成保存
  399. editSave(row) {
  400. this.$refs.xTable.validate(this.$refs.xTable.getCurrentRecord(),valid => {
  401. if (valid) {
  402. if (this.piadd) {
  403. const inviter = row
  404. this.$prompt('请输入开始编号(例:1-0,其中0为开始值)', '提示', {
  405. confirmButtonText: '确定',
  406. cancelButtonText: '取消',
  407. inputType: 'number',
  408. }).then(({value}) => {
  409. const startValue = value
  410. if (startValue >= 0 && startValue != null) {
  411. this.$prompt('请输入添加数目', '提示', {
  412. confirmButtonText: '确定',
  413. cancelButtonText: '取消',
  414. inputType: 'number',
  415. }).then(({value}) => {
  416. const endValue = value
  417. if (endValue >= 0) {
  418. this.$axios.post('/inverterInfo/saveAll/' + startValue + '/' + endValue, row).then(res => {
  419. this.$message({
  420. message: '保存成功',
  421. type: 'success'
  422. })
  423. this.loadButton = false
  424. this.piadd = false
  425. this.getData(this.currentPage, this.pageSize)
  426. }).catch((error) => {
  427. this.$refs.xTable.setActiveRow(row)
  428. this.$message.error('保存逆变器出错' + error)
  429. })
  430. } else {
  431. alert("数量必须是正整数")
  432. }
  433. })
  434. } else {
  435. alert("开始值必须是正整数并且不能为空")
  436. }
  437. })
  438. } else {
  439. this.$refs.xTable.clearActived().then(() => {
  440. if (this.isEdit) {
  441. row.equipmentType = row.equipmentType.code
  442. //编辑保存
  443. this.$axios.put('/inverterInfo/', row).then(res => {
  444. this.$message({
  445. message: '修改成功',
  446. type: 'success'
  447. })
  448. this.loadButton = false;
  449. this.getData(this.currentPage, this.pageSize)
  450. }).catch((error) => {
  451. this.$refs.xTable.setActiveRow(row)
  452. this.$message.error('修改逆变器出错' + error)
  453. })
  454. } else {
  455. //新增保存
  456. this.$axios.post('/inverterInfo/', row).then(res => {
  457. this.$message({
  458. message: '保存成功',
  459. type: 'success'
  460. })
  461. this.loadButton = false;
  462. this.getData(this.currentPage, this.pageSize)
  463. }).catch((error) => {
  464. this.$refs.xTable.setActiveRow(row)
  465. this.$message.error('保存逆变器出错' + error)
  466. })
  467. }
  468. })
  469. }
  470. } else {
  471. this.$XModal.message({status: 'error', message: '校验不通过!'})
  472. }
  473. })
  474. },
  475. cancelRowEvent(row) {
  476. const xTable = this.$refs.xTable
  477. xTable.clearActived().then(() => {
  478. // 还原行数据
  479. if (this.isEdit) {
  480. //编辑
  481. xTable.revertData(row)
  482. } else {
  483. //新增
  484. xTable.remove(row)
  485. }
  486. this.loadButton = false;
  487. })
  488. },
  489. // 删除场站信息
  490. deleteRowEvent(row) {
  491. this.rowId = row.id
  492. this.delVisible = true
  493. },
  494. deleteCancel() {
  495. this.delVisible = false
  496. },
  497. deleteInfo() {
  498. this.$axios.delete('/inverterInfo/' + '' + this.rowId).then(res => {
  499. this.$message({
  500. message: '删除成功',
  501. type: 'success'
  502. })
  503. this.delVisible = false
  504. this.getData(this.currentPage, this.pageSize)
  505. }).catch((error) => {
  506. this.$message.error('删除逆变器信息出错' + error)
  507. })
  508. },
  509. exportDataEvent() {
  510. // this.loading = true
  511. this.$axios.get('/inverterInfo/').then(res => {
  512. const data = res.data.content
  513. this.$refs.xTable.exportData({
  514. filename: '逆变器信息',
  515. type: 'csv',
  516. isHeader: true,
  517. isFooter: true,
  518. data
  519. })
  520. // this.loading = false
  521. }).catch(e => {
  522. // this.loading = false
  523. })
  524. },
  525. /*dataUpload(item) {
  526. },*/
  527. importDataEvent(item) {
  528. this.loadButton = true
  529. const formData = new FormData()
  530. formData.append('file', item.file)
  531. // console.log('上传文件', item.file)
  532. this.$axios.post('/console/importPvModuleModelCsv/', formData).then(res => {
  533. this.$message({
  534. message: '导入光伏组件信息成功',
  535. type: 'success'
  536. })
  537. }).catch((error) => {
  538. this.$message({
  539. message: '导入光伏组件信息成功',
  540. type: 'success'
  541. })
  542. })
  543. this.loadButton = false
  544. /* this.$refs.xTable.importData({ types: ['csv'] })*/
  545. },
  546. }
  547. }
  548. </script>
  549. <style scoped>
  550. .my_table_insert .vxe-body--row.is--new {
  551. background-color: #f1fdf1;
  552. }
  553. </style>