multiPatrol.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <template>
  2. <div class="qpage" @click="contextmenu.hide()">
  3. <h4 style="margin:0px auto 10px;text-align: center;height:20px">{{crtOrg}}</h4>
  4. <div class="qpage-body">
  5. <PatrolTable
  6. ref="patrolTable"
  7. page-info-opts="total, prev, pager, next,sizes"
  8. url="/multipatrol/loadPatrolWell"
  9. :autoLoad="false"
  10. :pageSize="20"
  11. @cell-contextmenu="cellContextmenuHandle"
  12. :beforeBindData="beforeBindDataHandle"
  13. >
  14. <template #tabColumns={indexGenerate}>
  15. <el-table-column type="index" :index="indexGenerate" label="序号" width="60" align="center" fixed="left"/>
  16. <el-table-column v-for="(col, index) in tableHead"
  17. :key="index"
  18. :prop="col.paramCode"
  19. :align="col.align || 'center'"
  20. :width="col.width || 100"
  21. :label="col.paramName"
  22. :fixed="col.fixed"
  23. >
  24. <template #default="scope">
  25. <el-tooltip trigger="hover" placement="top" width="auto" :disabled="!(scope.row[col.paramCode]?.alarm)"
  26. effect="dark" :content="scope.row[col.paramCode]?.alarm"
  27. >
  28. <div class="val-cell" :class="{'alarm-cell':(scope.row[col.paramCode]?.alarm)}">{{scope.row[col.paramCode]?.val}}</div>
  29. </el-tooltip>
  30. </template>
  31. </el-table-column>
  32. </template>
  33. </PatrolTable>
  34. </div>
  35. <template>
  36. <Contextmenu ref="contextmenu">
  37. <ContextmenuItem @click="ctxtMenuClickHandle($event,'ParamAlarmDefine','报警设置')">报警设置</ContextmenuItem>
  38. <ContextmenuItem @click="ctxtMenuClickHandle($event,'ParamHisData','历史数据')">历史数据</ContextmenuItem>
  39. <ContextmenuItem @click="ctxtMenuClickHandle($event,'ParamHisCurve','历史曲线')">历史曲线</ContextmenuItem>
  40. </Contextmenu>
  41. </template>
  42. <el-dialog v-model="dialogCtr.show" :title="dialogCtr.title" :close-on-click-modal="false" :destroy-on-close="true" width="70%">
  43. <component :is="dialogInnerComp[dialogCompKey]" :ctxObj="ctxcell"></component>
  44. <template #footer>
  45. <el-button @click="dialogCtr.show=false">关闭</el-button>
  46. </template>
  47. </el-dialog>
  48. </div>
  49. </template>
  50. <script setup>
  51. import {reactive,ref,watch,onMounted} from 'vue'
  52. import PatrolTable from '../../components/crudtable/PatrolTable.vue'
  53. import ColumnFun from '../../components/crudtable/ColumnFun.vue'
  54. import { storeToRefs } from 'pinia'
  55. import { useHomeStore } from '../../store/home.js'
  56. import multiPatrolAPI from '../../api/multiPatrol.js'
  57. import {ElMessageBox,ElMessage} from 'element-plus'
  58. import ParamAlarmDefine from '../alarm/ParamAlarmDefine.vue'
  59. import ParamHisData from '../single/ParamHisData.vue'
  60. import ParamHisCurve from '../single/ParamHisCurve.vue'
  61. import { directive, Contextmenu, ContextmenuItem } from 'v-contextmenu';
  62. import 'v-contextmenu/dist/themes/default.css'
  63. const patrolTable=ref(null)
  64. const contextmenu=ref(null)
  65. const store=useHomeStore()
  66. const {currentTreeNode} = storeToRefs(store)
  67. const crtOrg=ref(null)
  68. const tableHead=ref([])
  69. const dialogCtr=reactive({
  70. show:false,
  71. title:'查看窗口',
  72. })
  73. const dialogInnerComp={
  74. ParamAlarmDefine,
  75. ParamHisData,
  76. ParamHisCurve
  77. }
  78. const dialogCompKey=ref(null)
  79. const getOrgInfo=(orgId)=>{
  80. multiPatrolAPI.getMultiTemp(orgId).then(resp=>{
  81. console.log(resp)
  82. if(resp.code!=0){
  83. ElMessage.error(resp.msg||'获取井站信息失败')
  84. return
  85. }
  86. tableHead.value=JSON.parse(resp.data.tempContent)
  87. setTimeout(()=>{patrolTable.value.query({orgId})},100)
  88. }).catch(err=>{
  89. ElMessage.error(err||'获取井站信息失败')
  90. })
  91. }
  92. watch(currentTreeNode,(newNode, oldNode)=>{
  93. if(newNode&&newNode.nodeType=='org'){
  94. crtOrg.value=newNode.name
  95. tableHead.value=[]
  96. getOrgInfo(newNode.id)
  97. }
  98. },{ immediate: true })
  99. const ctxcell=reactive({
  100. wellName:null,
  101. wellId:null,
  102. paramCode:null,
  103. paramName:null,
  104. paramId:null
  105. })
  106. const cellContextmenuHandle=(row, column, cell, event)=>{
  107. event.preventDefault()
  108. contextmenu.value.hide()
  109. if(column.type=='index'||'time;status;wellName'.indexOf(column.property)>=0){
  110. return
  111. }
  112. contextmenu.value.show({top:event.pageY,left:event.pageX})
  113. ctxcell.wellId=row.wellId.val
  114. ctxcell.wellName=row.wellName.val
  115. ctxcell.paramCode=column.property
  116. ctxcell.paramName=column.label
  117. }
  118. const ctxtMenuClickHandle=(event,action,actionName)=>{
  119. dialogCompKey.value=action
  120. dialogCtr.title=`${actionName}【${ctxcell.wellName}】`
  121. dialogCtr.show=true
  122. }
  123. const parseCellVal=(valStr)=>{
  124. //console.log(valStr)
  125. if(valStr){
  126. return valStr.split(";")
  127. }
  128. return []
  129. }
  130. const beforeBindDataHandle=(datas)=>{
  131. datas.forEach(data=>{
  132. for(let key in data){
  133. //console.log(data)
  134. if(data[key]!=null){
  135. let [val,grade,alarm]=(data[key].toString()).split(';')
  136. if(key=="casing_press"){
  137. alarm='套压过高'
  138. }
  139. data[key]={val,grade,alarm}
  140. }
  141. //console.log(data)
  142. }
  143. })
  144. return datas
  145. }
  146. </script>
  147. <style scoped>
  148. @import url('../../assets/css/qpage.css');
  149. .v-contextmenu-item{
  150. padding:8px 20px;
  151. }
  152. .alarm-cell{
  153. background-color: #ff0000 !important;
  154. color:#fff;
  155. }
  156. .val-cell{
  157. /* background-color: #ff0000; */
  158. line-height:24px;
  159. }
  160. </style>