index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  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="6%"></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. name: [
  201. {required: true, validator: checkName}
  202. ],
  203. modelNumber: [
  204. {required: true, message: '逆变器型号不能为空', trigger: 'blur'}
  205. ],
  206. capacity: [
  207. {required: true, message: '额定容量不能为空', trigger: 'blur'},
  208. {pattern: /^\d+(\.\d{1,2})?$/, message: '只能输入正数数字或带小数点2位以内的数字'},
  209. ],
  210. efficiency: [
  211. {required: true, message: '逆变器效率不能为空', trigger: 'blur'},
  212. {pattern: /^\d+(\.\d{1,2})?$/, message: '只能输入正数数字或带小数点2位以内的数字'},
  213. ],
  214. collectorCircuit: [
  215. {required: true, message: '集电线不能为空', trigger: 'blur'},
  216. ],
  217. groupSeries: [
  218. {required: true, message: '是否组串式逆变器不能为空', trigger: 'change'}
  219. ],
  220. sample: [
  221. {required: true, message: '是否样板机不能为空', trigger: 'change'}
  222. ],
  223. report: [
  224. {required: true, message: '是否上报不能为空', trigger: 'change'}
  225. ]
  226. }
  227. }
  228. },
  229. created() {
  230. this.getStationList()
  231. this.getData()
  232. },
  233. activated() {
  234. console.log("2激活activated钩子函数");
  235. },
  236. deactivated() {
  237. console.log("2激活deactivated钩子函数");
  238. },
  239. methods: {
  240. getStationList() {
  241. this.$axios.get('/electricField/getElectricField').then((res) => {
  242. this.stationList = res.data
  243. }).catch((error) => {
  244. this.$message.error('获取场站下拉框出错' + error)
  245. })
  246. },
  247. getData() {
  248. this.loading = true
  249. let queryParam = this.stationCode;
  250. if (queryParam == '') {
  251. queryParam = "ALL"
  252. }
  253. let url = this.currentPage + '/' + this.pageSize + '/' + queryParam
  254. this.$axios.get('/inverterInfo/' + url).then(res => {
  255. this.tableData = res.data.content
  256. this.total = res.data.totalElements
  257. this.loading = false
  258. // console.log(res.data)
  259. this.getPvData()
  260. }).catch((error) => {
  261. this.$message.error('获取逆变器信息出错' + error)
  262. })
  263. },
  264. handlePageChange({currentPage, pageSize}) {
  265. this.currentPage = currentPage
  266. this.pageSize = pageSize
  267. this.getData()
  268. },
  269. getPvData() {
  270. this.$axios.get('/pvModuleModel/').then(res => {
  271. this.pvInfo = res.data
  272. this.pvInfoMode = []
  273. for (let i = 0; i < this.pvInfo.length; i++) {
  274. const pInfo = {label: this.pvInfo[i].model, value: this.pvInfo[i].id}
  275. this.pvInfoMode.push(pInfo)
  276. }
  277. console.log("获取所有光伏组件信息成功")
  278. }).catch((error) => {
  279. this.$message.error('获取逆变器信息出错' + error)
  280. })
  281. },
  282. timestampToTime(time) {
  283. const date = new Date(time) // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
  284. const Y = date.getFullYear() + '-'
  285. const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  286. const D = date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()
  287. return Y + M + D
  288. },
  289. getSelectionEvent() {
  290. let selectRecords = this.$refs.xTable.getCheckboxRecords()
  291. if (selectRecords == "") {
  292. this.$message.error('请选择要删除的对象')
  293. return
  294. }
  295. this.rowId = ''
  296. for (let i = 0; i < selectRecords.length; i++)
  297. this.rowId += (selectRecords[i].id + ",")
  298. // console.log(this.rowId)
  299. this.delVisible = true
  300. },
  301. piInsertEvent(row) {
  302. this.piadd = true;
  303. this.showTable = true
  304. this.isEdit = false;
  305. this.loadButton = true;
  306. this.$refs.xTable.insert({interval: 60}).then(({row}) => this.$refs.xTable.setActiveRow(row))
  307. },
  308. insertEvent(row) {
  309. this.id = ''
  310. this.showTable = true
  311. this.piadd = false;
  312. this.isEdit = false;
  313. this.loadButton = true;
  314. this.$refs.xTable.insert({interval: 60}).then(({row}) => this.$refs.xTable.setActiveRow(row))
  315. },
  316. async insertBatchEvent(row) {
  317. /*const { row: newRow } = await this.$refs.bTable.insert()*/
  318. // alert(1111)
  319. // 插入一条数据并触发校验
  320. let {row: newRow} = await this.$refs.bTable.insertAt(row)
  321. await this.$refs.bTable.setActiveRow(newRow)
  322. // alert(2222)
  323. /* const errMap = await this.$refs.bTable.validate(newRow).catch(errMap => errMap)
  324. if (errMap) {
  325. }*/
  326. },
  327. async fullValidEvent() {
  328. const errMap = await this.$refs.bTable.fullValidate().catch(errMap => errMap)
  329. if (errMap) {
  330. let msgList = []
  331. Object.values(errMap).forEach(errList => {
  332. errList.forEach(params => {
  333. let {rowIndex, column, rules} = params
  334. rules.forEach(rule => {
  335. msgList.push(`第 ${rowIndex} 行 ${column.title} 校验错误:${rule.message}`)
  336. })
  337. })
  338. })
  339. this.$XModal.message({
  340. status: 'error',
  341. message: () => {
  342. return [
  343. < div
  344. class
  345. ="red"
  346. style="max-height: 400px;overflow: auto;">
  347. {
  348. msgList.map(msg => < div> {msg} < /div>)
  349. }
  350. < /div>
  351. ]
  352. }
  353. })
  354. } else {
  355. this.$XModal.message({status: 'success', message: '校验成功!'})
  356. }
  357. },
  358. saveBatchEvent() {
  359. const {insertRecords, removeRecords, updateRecords} = this.$refs.bTable.getRecordset()
  360. this.$XModal.alert(`insertRecords=${insertRecords.length} removeRecords=${removeRecords.length} updateRecords=${updateRecords.length}`)
  361. },
  362. editRowEvent(row) {
  363. this.id = row.id
  364. for (let i = 0; i < this.pvInfoMode.length; i++) {
  365. if (row.batteryModel == this.pvInfoMode[i].value) {
  366. row.batteryModel = this.pvInfoMode[i].value
  367. }
  368. }
  369. this.isEdit = true
  370. this.loadButton = true
  371. this.$refs.xTable.setActiveRow(row)
  372. },
  373. //设计有判断是否批量添加,批量添加弹窗表明添加条数,然后批量生成保存
  374. editSave(row) {
  375. this.$refs.xTable.validate(this.$refs.xTable.getCurrentRecord(), valid => {
  376. if (valid) {
  377. if (this.piadd) {
  378. const inviter = row
  379. this.$prompt('请输入开始编号(例:1-0,其中0为开始值)', '提示', {
  380. confirmButtonText: '确定',
  381. cancelButtonText: '取消',
  382. inputType: 'number',
  383. }).then(({value}) => {
  384. const startValue = value
  385. if (startValue >= 0 && startValue != null) {
  386. this.$prompt('请输入添加数目', '提示', {
  387. confirmButtonText: '确定',
  388. cancelButtonText: '取消',
  389. inputType: 'number',
  390. }).then(({value}) => {
  391. const endValue = value
  392. if (endValue >= 0) {
  393. this.$axios.post('/inverterInfo/saveAll/' + startValue + '/' + endValue, row).then(res => {
  394. this.$message({
  395. message: '保存成功',
  396. type: 'success'
  397. })
  398. this.loadButton = false
  399. this.piadd = false
  400. this.getData()
  401. }).catch((error) => {
  402. this.$refs.xTable.setActiveRow(row)
  403. this.$message.error('保存逆变器出错' + error)
  404. })
  405. } else {
  406. alert("数量必须是正整数")
  407. }
  408. })
  409. } else {
  410. alert("开始值必须是正整数并且不能为空")
  411. }
  412. })
  413. } else {
  414. this.$refs.xTable.clearActived().then(() => {
  415. if (this.isEdit) {
  416. row.equipmentType = row.equipmentType.code
  417. //编辑保存
  418. this.$axios.put('/inverterInfo/', row).then(res => {
  419. this.$message({
  420. message: '修改成功',
  421. type: 'success'
  422. })
  423. this.loadButton = false;
  424. this.getData()
  425. }).catch((error) => {
  426. this.$refs.xTable.setActiveRow(row)
  427. this.$message.error('修改逆变器出错' + error)
  428. })
  429. } else {
  430. //新增保存
  431. this.$axios.post('/inverterInfo/', row).then(res => {
  432. this.$message({
  433. message: '保存成功',
  434. type: 'success'
  435. })
  436. this.loadButton = false;
  437. this.getData()
  438. }).catch((error) => {
  439. this.$refs.xTable.setActiveRow(row)
  440. this.$message.error('保存逆变器出错' + error)
  441. })
  442. }
  443. })
  444. }
  445. } else {
  446. this.$XModal.message({status: 'error', message: '校验不通过!'})
  447. }
  448. })
  449. },
  450. cancelRowEvent(row) {
  451. const xTable = this.$refs.xTable
  452. xTable.clearActived().then(() => {
  453. // 还原行数据
  454. if (this.isEdit) {
  455. //编辑
  456. xTable.revertData(row)
  457. } else {
  458. //新增
  459. xTable.remove(row)
  460. }
  461. this.loadButton = false;
  462. })
  463. },
  464. // 删除场站信息
  465. deleteRowEvent(row) {
  466. this.rowId = row.id
  467. this.delVisible = true
  468. },
  469. deleteCancel() {
  470. this.delVisible = false
  471. },
  472. deleteInfo() {
  473. this.$axios.delete('/inverterInfo/' + '' + this.rowId).then(res => {
  474. this.$message({
  475. message: '删除成功',
  476. type: 'success'
  477. })
  478. this.delVisible = false
  479. this.getData()
  480. }).catch((error) => {
  481. this.$message.error('删除逆变器信息出错' + error)
  482. })
  483. },
  484. exportDataEvent() {
  485. // this.loading = true
  486. this.$axios.get('/inverterInfo/').then(res => {
  487. const data = res.data.content
  488. this.$refs.xTable.exportData({
  489. filename: '逆变器信息',
  490. type: 'csv',
  491. isHeader: true,
  492. isFooter: true,
  493. data
  494. })
  495. // this.loading = false
  496. }).catch(e => {
  497. // this.loading = false
  498. })
  499. },
  500. /*dataUpload(item) {
  501. },*/
  502. importDataEvent(item) {
  503. this.loadButton = true
  504. const formData = new FormData()
  505. formData.append('file', item.file)
  506. // console.log('上传文件', item.file)
  507. this.$axios.post('/console/importPvModuleModelCsv/', formData).then(res => {
  508. this.$message({
  509. message: '导入光伏组件信息成功',
  510. type: 'success'
  511. })
  512. }).catch((error) => {
  513. this.$message({
  514. message: '导入光伏组件信息成功',
  515. type: 'success'
  516. })
  517. })
  518. this.loadButton = false
  519. /* this.$refs.xTable.importData({ types: ['csv'] })*/
  520. },
  521. }
  522. }
  523. </script>
  524. <style scoped>
  525. .my_table_insert .vxe-body--row.is--new {
  526. background-color: #f1fdf1;
  527. }
  528. </style>