index.vue 19 KB

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