widget.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <tf-page>
  3. <template v-slot:action>
  4. <ActionHeader
  5. :kplaceholder="'支持指标名称搜索'"
  6. :selected="selected"
  7. :actived="isActive"
  8. :loading="loading"
  9. @search="onSearch"
  10. @add="onAdd"
  11. @del="onDelete"
  12. @import="onImport"
  13. @export="onExport"
  14. />
  15. </template>
  16. <tf-table :columns="tableCols" :data="tableData" v-loading="loading.search" @selection-change="onSelectionChange">
  17. <template v-slot:operation="{ row }">
  18. <el-button type="text" style="padding: 0" @click="editor(row)">编辑</el-button>
  19. <el-button type="text" style="padding: 0" @click="remove(row)">删除</el-button>
  20. </template>
  21. </tf-table>
  22. <IndexForm
  23. :visible.sync="visible"
  24. :loading="loading.add || loading.update"
  25. :data="current"
  26. :title="`${current.id ? '编辑' : '新增'}`"
  27. @submit="onSubmit"
  28. />
  29. </tf-page>
  30. </template>
  31. <script lang="ts">
  32. import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
  33. import { getIndexList, addIndexData, editIndexData, deleteIndexDataById, deleteIndexData } from '../commonAPI/request'
  34. import ActionHeader from '../components/ActionHeader.vue'
  35. import { IMTableColumns } from '../commonAPI/settings'
  36. import { ILoading } from '../commonAPI/common'
  37. import IndexForm from './IndexForm.vue'
  38. import axios from '@/utils/request'
  39. const exporUrl = '/tofly-sxgk/bigScreenData/exportExcel'
  40. const importUrl = '/tofly-sxgk/bigScreenData/importExcel'
  41. //指标管理
  42. @Component({
  43. name: 'IndexManagement',
  44. components: { ActionHeader, IndexForm }
  45. })
  46. export default class IndexManagement extends Vue {
  47. visible: boolean = false
  48. isActive: boolean = false
  49. loading: ILoading = { search: false, add: false, update: false, delete: false, import: false, export: false }
  50. tableCols = IMTableColumns
  51. tableData: any = []
  52. current: any = {}
  53. selected: any = []
  54. mounted() {
  55. this.isActive = true
  56. }
  57. onSearch(data?) {
  58. this.loading.search = true
  59. let params = {}
  60. if (data) {
  61. params = {
  62. indexName: data ? data.keyword : ''
  63. }
  64. params['isNew'] = data.islatest ? 1 : 0
  65. // if (data.latest) {
  66. // params['isNew'] = 1
  67. // }
  68. // if (data.notlatest) {
  69. // params['isNew'] = 0
  70. // }
  71. // if (data.latest && data.notlatest) {
  72. // delete params['isNew']
  73. // }
  74. }
  75. getIndexList(params).then((res) => {
  76. try {
  77. this.tableData = res.result.map((item) => {
  78. Object.keys(item).forEach((val) => (item[val] = item[val] || '/'))
  79. return { ...item, source: item.source == '1' ? '本地导入' : '人工', isNew: item.isNew == '1' ? '是' : '否' }
  80. })
  81. } catch (error) {
  82. console.log(error)
  83. }
  84. this.loading.search = false
  85. })
  86. }
  87. onAdd() {
  88. this.current = {}
  89. this.visible = true
  90. }
  91. editor(row) {
  92. this.current = { ...row }
  93. this.visible = true
  94. }
  95. async remove(row) {
  96. await this.$confirm(`是否确认删除此项指标?`, '提示', {
  97. confirmButtonText: '确定',
  98. cancelButtonText: '取消',
  99. type: 'warning'
  100. })
  101. this.loading.delete = true
  102. try {
  103. const { result } = await deleteIndexDataById({ id: row.id })
  104. this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
  105. result && this.onSearch()
  106. } catch (error) {
  107. console.log(error)
  108. }
  109. this.loading.delete = false
  110. }
  111. async onSubmit(data) {
  112. this.loading[data.id ? 'update' : 'add'] = true
  113. data['isNew'] = data['isNew'] == '是' ? 1 : 0
  114. data['source'] = '人工'
  115. try {
  116. const { result } = await (data.id ? editIndexData({ ...data }) : addIndexData({ ...data }))
  117. this.$message[result ? 'success' : 'error'](`${data.id ? '修改' : '新增'}指标${result ? '成功!' : '失败!'}`)
  118. if (result) {
  119. this.visible = false
  120. this.onSearch()
  121. }
  122. } catch (error) {
  123. console.log(error)
  124. }
  125. this.loading[data.id ? 'update' : 'add'] = false
  126. }
  127. async onDelete(ids) {
  128. await this.$confirm(`是否确认删除这${this.selected.length}项指标?`, '提示', {
  129. confirmButtonText: '确定',
  130. cancelButtonText: '取消',
  131. type: 'warning'
  132. })
  133. this.loading.delete = true
  134. try {
  135. const { result } = await deleteIndexData({ ids })
  136. this.$message[result ? 'success' : 'error'](`删除指标${result ? '成功!' : '失败!'}`)
  137. result && this.onSearch()
  138. } catch (error) {
  139. console.log(error)
  140. }
  141. this.loading.delete = false
  142. }
  143. onImport(data) {
  144. this.loading.import = true
  145. axios
  146. .request({
  147. headers: {
  148. 'Content-Type': 'multipart/form-data',
  149. Authorization: 'bearer ' + sessionStorage.getItem('token')
  150. },
  151. method: 'post',
  152. url: importUrl,
  153. data: { file: data.file }
  154. })
  155. .then((res) => {
  156. this.$message[res.code === 1 ? 'success' : 'error'](`数据导入${res.code === 1 ? '成功!' : '失败!'}`)
  157. this.onSearch()
  158. this.loading.import = false
  159. })
  160. .catch((err) => {
  161. console.log(err)
  162. })
  163. }
  164. onExport(data) {
  165. this.loading.export = true
  166. axios
  167. .request({
  168. headers: {
  169. 'Content-Type': 'application/json;charset=UTF-8',
  170. Authorization: 'bearer ' + sessionStorage.getItem('token')
  171. },
  172. method: 'get',
  173. url: exporUrl,
  174. params: { isNew: 1, indexName: data ? data.keyword : '' },
  175. responseType: 'blob'
  176. })
  177. .then((res) => {
  178. var blob = res
  179. let binaryData = []
  180. binaryData.push(blob)
  181. const href = window.URL.createObjectURL(new Blob(binaryData)) // 创建新的URL表示指定的blob对象
  182. const a = document.createElement('a')
  183. a.style.display = 'none'
  184. a.href = href // 指定下载链接
  185. a.download = '指标数据.xls' // 指定下载文件名
  186. a.click()
  187. this.loading.export = false
  188. })
  189. .catch((err) => {
  190. console.log(err)
  191. this.loading.export = false
  192. })
  193. }
  194. onSelectionChange(selections) {
  195. this.selected = [...selections]
  196. }
  197. }
  198. </script>
  199. <style lang='scss' scoped>
  200. /deep/ .el-table__fixed-right-patch {
  201. background-color: transparent;
  202. }
  203. </style>