DetailTable.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <template>
  2. <div class="detail-table-wrap">
  3. <div class="top-wrap">
  4. <div class="filter-box">
  5. <el-select
  6. v-model="filterState.terminalCode"
  7. placeholder="终端编码"
  8. multiple
  9. clearable
  10. collapse-tags
  11. style="width:250px"
  12. @change="handleRefreshList"
  13. >
  14. <el-option
  15. v-for="item in terminalCodeOpts"
  16. :key="item.TerminalCode"
  17. :label="item.Name"
  18. :value="item.TerminalCode"
  19. />
  20. </el-select>
  21. <el-cascader
  22. v-model="filterState.user"
  23. placeholder="创建人"
  24. :options="sysUserOpts"
  25. :props="props"
  26. collapse-tags
  27. :show-all-levels="false"
  28. clearable
  29. @change="handleRefreshList"
  30. filterable
  31. style="width:250px"
  32. />
  33. <el-select
  34. v-model="filterState.frequency"
  35. placeholder="频度"
  36. multiple
  37. clearable
  38. collapse-tags
  39. style="width:250px"
  40. @change="handleRefreshList"
  41. >
  42. <el-option
  43. v-for="item in frequencyOpt"
  44. :key="item"
  45. :label="item"
  46. :value="item"
  47. />
  48. </el-select>
  49. <el-input
  50. placeholder="指标ID/指标名称"
  51. prefix-icon="el-icon-search"
  52. v-model="filterState.keyword"
  53. clearable
  54. style="width:250px"
  55. @input="handleRefreshList"
  56. />
  57. </div>
  58. <img src="~@/assets/img/data_m/set_icon.png" alt="" style="cursor: pointer;" @click="showSetTableCols=true">
  59. </div>
  60. <el-table
  61. v-loading="tableLoading"
  62. ref="tableIns"
  63. :data="tableData"
  64. border
  65. @sort-change="handleTableSortChange"
  66. >
  67. <el-table-column
  68. v-for="col in tableColOpts"
  69. :key="col.ColumnKey"
  70. :column-key="col.ColumnKey"
  71. :label="col.ColumnName"
  72. :prop="col.ColumnKey"
  73. :sortable="col.IsSort===1?'custom':false"
  74. align="center"
  75. :width="getColWidth(col.ColumnKey)"
  76. >
  77. <template slot="header" slot-scope="scope">
  78. <span>{{col.ColumnName}}</span>
  79. <el-tooltip
  80. effect="dark"
  81. :content="getTableHeadTips(col.ColumnKey)"
  82. placement="top-start"
  83. >
  84. <i class="el-icon-info" v-if="tipsKeysArr.includes(col.ColumnKey)"></i>
  85. </el-tooltip>
  86. </template>
  87. <template slot-scope="scope">
  88. <span v-if="col.ColumnKey==='IsAdd'">{{scope.row.IsAdd===1?'是':'否'}}</span>
  89. <span v-else-if="col.ColumnKey==='NeedRefresh'">{{scope.row.NeedRefresh===1?'是':'否'}}</span>
  90. <span v-else-if="col.ColumnKey==='HasRefresh'">{{scope.row.HasRefresh===1?'是':'否'}}</span>
  91. <span v-else-if="col.ColumnKey==='DataUpdateResult'">{{scope.row.DataUpdateResult===1?'是':'否'}}</span>
  92. <span v-else>{{scope.row[col.ColumnKey]}}</span>
  93. </template>
  94. </el-table-column>
  95. <div slot="empty">
  96. <tableNoData text="暂无数据"/>
  97. </div>
  98. </el-table>
  99. <el-pagination
  100. layout="total,prev,pager,next,jumper"
  101. background
  102. @current-change="handleCurrentChange"
  103. :page-size="pageSize"
  104. @size-change="handleSizeChange"
  105. :total="total"
  106. style="float: right;margin-top:20px"
  107. />
  108. <!-- 自定义列表 -->
  109. <SetTableCols v-model="showSetTableCols" :ColumnType="1" @change="handleTableColChange"/>
  110. </div>
  111. </template>
  112. <script>
  113. import {apiDataSource} from '@/api/modules/dataSource'
  114. import {frequencyOpt} from '../utils/config'
  115. import SetTableCols from './SetTableCols.vue'
  116. import { departInterence } from "@/api/api.js";
  117. export default {
  118. components:{SetTableCols},
  119. data() {
  120. return {
  121. tipsKeysArr:['EdbNameSource','DataUpdateTime','ErDataUpdateDate','NeedRefresh','HasRefresh','UpdateTime'],
  122. frequencyOpt,
  123. terminalCodeOpts:[],
  124. sysUserOpts:[],
  125. props: {
  126. value: "AdminId",
  127. label: "RealName",
  128. children: "ChildrenList",
  129. multiple: true,
  130. emitPath:false
  131. },
  132. filterState:{
  133. frequency:'',
  134. keyword:'',
  135. sortKey:'',
  136. sortType:'',
  137. terminalCode:'',
  138. user:[],
  139. dateVal:this.$moment().format('YYYY-MM-DD')||''
  140. },
  141. checkAll:false,
  142. tableColOpts:[],
  143. tableData:[],
  144. pageSize:10,
  145. page:1,
  146. total:0,
  147. tableLoading:false,
  148. showSetTableCols:false,
  149. }
  150. },
  151. created() {
  152. this.getTableColOpts()
  153. this.getTerminalCodeOpts()
  154. this.getSysUserList()
  155. },
  156. methods: {
  157. //获取表格数据
  158. getTableList(){
  159. this.tableLoading=true
  160. apiDataSource.GLDetailTableList({
  161. CurrentIndex:this.page,
  162. PageSize:this.pageSize,
  163. SortParam:this.filterState.sortKey,
  164. SortType:this.filterState.sortType,
  165. CreateTime:this.filterState.dateVal,
  166. TerminalCode:this.filterState.terminalCode?this.filterState.terminalCode.join(','):'',
  167. SysUserId:this.filterState.user?this.filterState.user.join(','):'',
  168. Frequency:this.filterState.frequency?this.filterState.frequency.join(','):'',
  169. KeyWord:this.filterState.keyword
  170. }).then(res=>{
  171. this.tableLoading=false
  172. if(res.Ret===200){
  173. const arr=res.Data.List||[]
  174. this.tableData=arr
  175. this.total=res.Data.Paging.Totals
  176. }
  177. })
  178. },
  179. handleCurrentChange(e){
  180. this.page=e
  181. this.getTableList()
  182. },
  183. // 筛选项刷新列表
  184. handleRefreshList(){
  185. this.page=1
  186. this.getTableList()
  187. },
  188. // 获取表格列配置项
  189. getTableColOpts(){
  190. this.tableLoading=true
  191. this.tableColOpts=[]
  192. apiDataSource.GLTableColOpts({ColumnType:1}).then(res=>{
  193. if(res.Ret===200){
  194. const arr=res.Data.List||[]
  195. this.tableColOpts=arr.filter(item=>item.IsShow===1)
  196. this.$nextTick(()=>{
  197. // this.$refs.tableIns.doLayout()
  198. this.tableLoading=false
  199. })
  200. this.getTableList()
  201. }
  202. })
  203. },
  204. // 表格配置项变更
  205. handleTableColChange(){
  206. this.getTableColOpts()
  207. },
  208. // 排序
  209. handleTableSortChange({column, prop, order}){
  210. console.log(column, prop, order);
  211. this.filterState.sortKey=prop
  212. this.filterState.sortType=order==='descending'?'desc':order==='ascending'?'asc':''
  213. this.handleRefreshList()
  214. },
  215. // 获取终端编码数据
  216. getTerminalCodeOpts(){
  217. apiDataSource.terminalCodeArr().then(res=>{
  218. if(res.Ret===200){
  219. this.terminalCodeOpts=res.Data.List||[]
  220. }
  221. })
  222. },
  223. // 获取所有系统用户
  224. async getSysUserList() {
  225. const res = await departInterence.getQuestionAdminList();
  226. if (res.Ret === 200) {
  227. this.sysUserOpts = res.Data.List||[];
  228. }
  229. },
  230. handleShowSetTableCol(){
  231. this.showSetTableCols=true
  232. },
  233. // table说明文案
  234. getTableHeadTips(key){
  235. const tipsMap={
  236. EdbNameSource:'指标在数据源的全称',
  237. DataUpdateTime:'指标最近一次数据发生变化的时间',
  238. ErDataUpdateDate:'指标数据发生变化的最早日期',
  239. NeedRefresh:'该指标今日是否设置了定时刷新任务',
  240. HasRefresh:'该指标是否发起了刷新任务',
  241. UpdateTime:'指标最近一次执行刷新任务的时间'
  242. }
  243. return tipsMap[key]
  244. },
  245. // 设置列的宽度
  246. getColWidth(key){
  247. const widthMap={
  248. EdbCode:'150px',
  249. LatestDate:'150px',
  250. DataUpdateTime:'180px',
  251. ErDataUpdateDate:'200px',
  252. UpdateTime:'180px'
  253. }
  254. return widthMap[key]
  255. }
  256. },
  257. }
  258. </script>
  259. <style lang="scss">
  260. .detail-table-wrap{
  261. .top-wrap{
  262. .el-cascader__search-input{
  263. min-width: 30px;
  264. }
  265. }
  266. }
  267. </style>
  268. <style lang="scss" scoped>
  269. .top-wrap{
  270. display: flex;
  271. justify-content: space-between;
  272. align-items: flex-start;
  273. margin-bottom: 30px;
  274. .filter-box{
  275. margin-right: 100px;
  276. display: flex;
  277. flex-wrap: wrap;
  278. align-items: center;
  279. gap: 10px 20px;
  280. }
  281. .right-opt-box{
  282. display: flex;
  283. align-items: center;
  284. gap: 20px;
  285. .set-icon{
  286. width: 40px;
  287. cursor: pointer;
  288. }
  289. }
  290. }
  291. </style>