editIndicator.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <el-form :model="form" label-width="120" label-suffix=":" :rules="rules" ref="fRef">
  3. <el-row :gutter="10">
  4. <el-col :span="12">
  5. <el-form-item label="数据指标">{{ rowsInfo.metricsDef.metricsName }}</el-form-item>
  6. </el-col>
  7. <el-col :span="12">
  8. <el-form-item label="指标类型">
  9. <dict-tag :options="metrics_category" :value="rowsInfo.metricsDef.metricsType"/>
  10. </el-form-item>
  11. </el-col>
  12. <el-col :span="12">
  13. <el-form-item label="指标编码">{{ rowsInfo.metricsDef.metricsCode }}</el-form-item>
  14. </el-col>
  15. <el-col :span="12">
  16. <el-form-item label="自动发现" prop="findFlag" v-if="disabled">
  17. <el-switch v-model="form.findFlag"/>
  18. </el-form-item>
  19. </el-col>
  20. </el-row>
  21. <el-form-item label="数据接口配置" prop="dataExp" v-if="disabled">
  22. <el-input type="textarea" v-model="form.dataExp" placeholder="请输入数据接口配置" :autosize="{minRows: 3}"
  23. style="width:342px;margin-right:10px;"/>
  24. <!-- <el-button type="primary" @click="handleConfigKey">公式组装</el-button>-->
  25. </el-form-item>
  26. <el-form-item label="自动发现规则" prop="findRule" v-if="disabled && form.findFlag">
  27. <el-input v-model="form.findRule" type="textarea" :autosize="{minRows: 3}" placeholder="请输入自动发现规则"/>
  28. </el-form-item>
  29. <el-form-item label="关键字" prop="findKey" v-if="disabled && form.findFlag">
  30. <el-input v-model="form.findKey" placeholder="请输入关键字"/>
  31. </el-form-item>
  32. <el-row :gutter="10">
  33. <el-col :span="12">
  34. <el-form-item label="风险-低">
  35. <el-input v-model="form.alarmLow" @change="checkInput"/>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="12">
  39. <el-form-item label="风险-中">
  40. <el-input v-model="form.alarmMid" @change="checkInput"/>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="12">
  44. <el-form-item label="风险-高">
  45. <el-input v-model="form.alarmHigh" @change="checkInput"/>
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="12">
  49. <el-form-item label="健康事件">
  50. <el-input v-model="form.event" @change="checkInput"/>
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. </el-form>
  55. <div class="food-btn">
  56. <el-button type="primary" @click="handleSubmit">提交</el-button>
  57. <el-button @click="emit('close')">取消</el-button>
  58. </div>
  59. </template>
  60. <script setup lang="ts">
  61. import {updateDetail} from "@/api/metrics/detail";
  62. import {updateMc} from "@/api/biz/mc"
  63. const {proxy, emit} = getCurrentInstance()
  64. const {metrics_category, sys_yes_no} = proxy.useDict("metrics_category", "sys_yes_no")
  65. const props = defineProps({
  66. rowsInfo: {
  67. type: Object,
  68. default: () => {
  69. }
  70. },
  71. mc: {
  72. type: Boolean,
  73. default: false
  74. }
  75. })
  76. const form = ref({
  77. dataExp: "",
  78. findFlag: "",
  79. findRule: "",
  80. findKey: "",
  81. alarmLow: "",
  82. alarmMid: "",
  83. alarmHigh: "",
  84. event: ""
  85. })
  86. const passValidate = ref(true)
  87. const disabled = computed(() => props.rowsInfo.metricsDef.metricsType != "1")
  88. const rules = {
  89. dataExp: {required: true, message: '请输入数据接口配置', trigger: 'change'},
  90. findRule: {required: true, message: '请选择自动发现规则', trigger: 'change'},
  91. findKey: {required: true, message: '请输入关键字', trigger: 'change'},
  92. findFlag: {required: true, message: '请选择自动发现', trigger: 'change'}
  93. }
  94. const handleConfigKey = () => {
  95. proxy.getConfigKey("pm.web.url").then(res => {
  96. if (res.code === 200) {
  97. window.open(res.msg, '_blank');
  98. }
  99. })
  100. }
  101. const checkInput = (range) => {
  102. if (range) {
  103. passValidate.value = validateRange(range);
  104. if (!passValidate.value) {
  105. proxy.$message.error("请输入正确的区间格式!")
  106. }
  107. }
  108. }
  109. const validateRange = (range) => {
  110. // 正则表达式匹配各种区间的格式
  111. const regex = /^(\[|\()\s*([0-9]+(\.[0-9]+)?|)\s*,\s*([0-9]+(\.[0-9]+)?|)\s*(\]|\))$/;
  112. const match = range.match(regex);
  113. if (!match) {
  114. return false; // 如果格式不正确,则返回false
  115. }
  116. // 提取括号类型和两个数值
  117. const openBracket = match[1];// 开始的括号
  118. const num1Str = match[2]; // 第一个数
  119. const num2Str = match[4]; // 第二个数
  120. const closeBracket = match[7]; // 结束的括号
  121. let num1 = num1Str ? parseFloat(num1Str) : -Infinity;
  122. let num2 = num2Str ? parseFloat(num2Str) : Infinity;
  123. // 检查区间的有效性
  124. if (openBracket === '[' && num1 > num2) return false; // [x,y] 要求 x <= y
  125. if (openBracket === '(' && num1 >= num2) return false; // (x,y) 要求 x < y
  126. if (closeBracket === ']' && num1 > num2) return false; // (x,y] 要求 x < y
  127. if (closeBracket === ')' && num1 >= num2) return false; // [x,y) 要求 x < y
  128. return true;
  129. }
  130. const editData = (row) => {
  131. const keys = Object.keys(form.value)
  132. keys.forEach(p => {
  133. form.value[p] = row[p]
  134. })
  135. form.value.findFlag = row.findFlag === "Y"
  136. setTimeout(() => {
  137. proxy.$refs.fRef.clearValidate()
  138. })
  139. }
  140. const handleSubmit = () => {
  141. proxy.$refs.fRef.validate(valid => {
  142. if (valid) {
  143. const data = {...form.value}
  144. data.findFlag = data.findFlag ? "Y" : "N"
  145. handleUpdate({...props.rowsInfo, ...data})
  146. }
  147. })
  148. }
  149. // 更新
  150. const handleUpdate = (row) => {
  151. if (!passValidate.value) return proxy.$message.error("区间无效,请检查")
  152. const request = props.mc ? updateMc : updateDetail
  153. request({...row}).then(res => {
  154. proxy.$modal.msgSuccess("修改成功");
  155. emit("reload")
  156. })
  157. }
  158. defineExpose({editData})
  159. </script>
  160. <style scoped lang="scss">
  161. .food-btn {
  162. text-align: center;
  163. margin-top: 10px;
  164. border-top: 1px solid #F9F9F9;
  165. padding-top: 10px;
  166. }
  167. </style>