indicatorManger.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template>
  2. <el-row :gutter="20">
  3. <el-col :span="24" class="mb8">
  4. <el-button type="primary" plain @click="handleAdd">新增</el-button>
  5. </el-col>
  6. <el-col :span="24">
  7. <el-table v-loading="loading" :data="listData" border size="small">
  8. <el-table-column label="指标ID" align="center" prop="metricsId" width="80"/>
  9. <!-- <el-table-column label="指标分类" align="left" width="160">-->
  10. <!-- <template #default="scope">-->
  11. <!-- <span v-for="(item,i) in scope.row.metricsDef.metricsTypes" :key="`${scope.$index}_${item}`">-->
  12. <!-- {{ item.typeName }}<span v-if="i!==scope.row.metricsTypes.length-1">、</span>-->
  13. <!-- </span>-->
  14. <!-- </template>-->
  15. <!-- </el-table-column>-->
  16. <el-table-column label="指标名称" align="left">
  17. <template #default="scope">
  18. {{ scope.row.metricsDef.metricsName }}
  19. </template>
  20. </el-table-column>
  21. <el-table-column label="指标编码" align="left" prop="metricsCode" width="160"/>
  22. <el-table-column label="告警-低" align="center" width="80">
  23. <template #default="scope">
  24. {{ scope.row.alarmLow }}
  25. </template>
  26. </el-table-column>
  27. <el-table-column label="告警-中" align="center" width="80">
  28. <template #default="scope">
  29. {{ scope.row.alarmMid }}
  30. </template>
  31. </el-table-column>
  32. <el-table-column label="告警-高" align="center" width="80">
  33. <template #default="scope">
  34. {{ scope.row.alarmHigh }}
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="健康事件" align="center" width="80">
  38. <template #default="scope">
  39. {{ scope.row.event }}
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
  43. <template #default="scope">
  44. <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row)">
  45. 修改
  46. </el-button>
  47. <el-popconfirm title="确定要删除吗?删除后无法恢复!" @confirm="handleDelete(scope.row)" width="260">
  48. <template #reference>
  49. <el-button link type="primary" icon="Delete">删除</el-button>
  50. </template>
  51. </el-popconfirm>
  52. </template>
  53. </el-table-column>
  54. </el-table>
  55. <pagination
  56. v-show="total>0"
  57. :total="total"
  58. v-model:page="queryParams.pageNum"
  59. v-model:limit="queryParams.pageSize"
  60. @pagination="getSelectDetails(null)"
  61. />
  62. </el-col>
  63. </el-row>
  64. <!-- 添加或修改指标模板对话框 -->
  65. <el-dialog title="新增指标" v-model="open" width="1100" append-to-body>
  66. <div>
  67. <el-form :model="adParams" ref="queryRef" :inline="true" label-width="0" @submit.native.prevent>
  68. <el-form-item label="" prop="metricsName" style="margin-right:10px">
  69. <el-input
  70. v-model="adParams.metricsName"
  71. placeholder="请输入应用名称"
  72. clearable
  73. @keyup.enter="getSelectData"
  74. />
  75. </el-form-item>
  76. <el-form-item>
  77. <el-button type="primary" icon="Search" @click="getSelectData">搜索</el-button>
  78. </el-form-item>
  79. </el-form>
  80. <el-table :data="addListData" border size="small" @selection-change="handleSelectionChange">
  81. <el-table-column type="selection" width="55" align="center"/>
  82. <el-table-column label="指标ID" align="center" prop="metricsId" width="80"/>
  83. <el-table-column label="指标分类" align="left" width="160">
  84. <template #default="scope">
  85. <span v-for="(item,i) in scope.row.metricsTypes" :key="`${scope.$index}_${item}`">
  86. {{ item.typeName }}<span v-if="i!==scope.row.metricsTypes.length-1">、</span>
  87. </span>
  88. </template>
  89. </el-table-column>
  90. <el-table-column label="指标名称" align="left" prop="metricsName"/>
  91. <el-table-column label="指标编码" align="left" prop="metricsCode" width="160"/>
  92. <el-table-column label="告警-低" align="left" width="80" prop="alarmLow"/>
  93. <el-table-column label="告警-中" align="left" width="80" prop="alarmMid"/>
  94. <el-table-column label="告警-高" align="left" width="80" prop="alarmHigh"/>
  95. </el-table>
  96. <pagination
  97. v-show="adTotal>0"
  98. :total="adTotal"
  99. v-model:page="adParams.pageNum"
  100. v-model:limit="adParams.pageSize"
  101. @pagination="getSelectData"
  102. />
  103. </div>
  104. <template #footer>
  105. <div class="dialog-footer">
  106. <el-button type="primary" @click="handleAddMetrics">添 加</el-button>
  107. <el-button @click="open = false">取 消</el-button>
  108. </div>
  109. </template>
  110. </el-dialog>
  111. <el-dialog title="指标修改" v-model="visible" width="600" append-to-body>
  112. <edit-indicator :rowsInfo="rowsInfo" ref="eiRef" @close="visible=false" @reload="getSelectData"/>
  113. </el-dialog>
  114. </template>
  115. <script setup lang="ts">
  116. import {addDetailByTplId, delDetail, listDetail, selectDetails, updateDetail} from "@/api/metrics/detail";
  117. import editIndicator from "./editIndicator.vue";
  118. const {proxy, emit} = getCurrentInstance();
  119. const listData = ref([]);
  120. const loading = ref(false);
  121. const editRow = ref([]);
  122. const rowTplId = ref(null);
  123. const open = ref(false);
  124. const addListData = ref([]);
  125. const ids = ref([]);
  126. const total = ref(0);
  127. const adTotal = ref(0);
  128. const passValidate = ref(true)
  129. const visible = ref(false);
  130. const rowsInfo = ref({})
  131. const adParams = reactive({
  132. pageNum: 1,
  133. pageSize: 10,
  134. metricsName: null
  135. });
  136. const queryParams = reactive({
  137. pageNum: 1,
  138. pageSize: 10,
  139. tplId: 0
  140. });
  141. // 选择指标
  142. const getSelectDetails = (tplId: number) => {
  143. loading.value = true;
  144. editRow.value = [];
  145. if (tplId) {
  146. rowTplId.value = tplId;
  147. queryParams.tplId = tplId
  148. }
  149. listDetail(queryParams).then((response) => {
  150. listData.value = response.rows
  151. passValidate.value = true
  152. total.value = response.total
  153. });
  154. loading.value = false;
  155. }
  156. // 修改
  157. const handleEdit = (row) => {
  158. visible.value = true
  159. rowsInfo.value = {...row}
  160. proxy.$nextTick(()=>{
  161. proxy.$refs.eiRef.editData(row)
  162. })
  163. }
  164. // 多选框选中数据
  165. function handleSelectionChange(selection) {
  166. ids.value = selection.map(item => item.metricsId);
  167. }
  168. // 添加指标
  169. function handleAddMetrics() {
  170. addDetailByTplId(rowTplId.value, {metricsIds: ids.value.join(",")}).then(res => {
  171. proxy.$modal.msgSuccess("添加成功");
  172. open.value = false
  173. getSelectDetails(rowTplId.value)
  174. emit("updateList")
  175. })
  176. }
  177. // 删除
  178. const handleDelete = (row) => {
  179. delDetail(row.tplDetailId).then(res => {
  180. proxy.$modal.msgSuccess("删除成功");
  181. getSelectDetails(rowTplId.value)
  182. emit("updateList")
  183. })
  184. }
  185. // 更新
  186. const handleUpdate = (row) => {
  187. if(!passValidate.value) return proxy.$message.error("区间无效,请检查")
  188. updateDetail({...row}).then(res => {
  189. proxy.$modal.msgSuccess("修改成功");
  190. editRow.value = editRow.value.filter(p => p !== row.metricsId)
  191. })
  192. }
  193. // 新增
  194. const handleAdd = () => {
  195. addListData.value = []
  196. open.value = true
  197. adParams.pageNum = 1
  198. getSelectData()
  199. }
  200. const getSelectData = () => {
  201. visible.value = false
  202. selectDetails(rowTplId.value, adParams).then(res => {
  203. addListData.value = res.rows
  204. adTotal.value = res.total
  205. })
  206. }
  207. defineExpose({
  208. getSelectDetails
  209. })
  210. </script>
  211. <style scoped lang="scss">
  212. </style>