addHz.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <div>
  3. <el-form ref="objRef" :model="form" :rules="rules" label-width="120px" label-suffix=":" size="small">
  4. <el-row :gutter="20">
  5. <el-col :span="12">
  6. <el-form-item label="指标" prop="metricsId">
  7. <el-select v-model="form.metricsId" filterable placeholder="请输入..." style="width: 100%"
  8. @change="changeMetricsId">
  9. <el-option v-for="item in metricsData" :key="item.metricsId" :label="item.metricsName"
  10. :value="item.metricsId"/>
  11. </el-select>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="12">
  15. <el-form-item label="分析类型" prop="riskType">
  16. <el-select v-model="form.riskType" disabled placeholder="请选择分析类型" clearable style="width: 100%">
  17. <el-option
  18. v-for="dict in risk_type"
  19. :key="dict.value"
  20. :label="dict.label"
  21. :value="dict.value"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="12">
  27. <el-form-item label="趋势恶化方向" prop="upDown">
  28. <el-select v-model="form.upDown" placeholder="请选择分析类型" clearable style="width: 100%">
  29. <el-option
  30. v-for="dict in risk_up"
  31. :key="dict.value"
  32. :label="dict.label"
  33. :value="dict.value"
  34. />
  35. </el-select>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="12">
  39. <el-form-item label="置信区间" required>
  40. <el-input-number v-model="form.confidenceLevel" :min="95" :max="99" />
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="12">
  44. <el-form-item label="定时分析" required>
  45. <el-select v-model="form.timeSwitch" placeholder="请选择是否定时分析">
  46. <el-option
  47. v-for="dict in sys_yes_no"
  48. :key="dict.value"
  49. :label="dict.label"
  50. :value="dict.value"
  51. />
  52. </el-select>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="24">
  56. <el-form-item label="指标对象" prop="objType" required>
  57. <el-select v-model="form.objType" filterable placeholder="请选择..." style="width: 240px"
  58. :disabled="!form.metricsId" @change="changeObjType">
  59. <el-option v-for="item in [{key:'1',label:'全部'},{key:'2',label:'自定义'}]" :key="item.key"
  60. :label="item.label" :value="item.key"/>
  61. </el-select>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="24" v-if="form.objType === '2'">
  65. <el-form-item label="">
  66. <div class="tree-row" >
  67. <el-tree style="max-width: 600px" :props="propsNode" :data="modelTreeData" show-checkbox ref="treeRef"
  68. node-key="objId"
  69. @check-change="handleCheckChange"/>
  70. </div>
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. </el-form>
  75. <div class="btn-row">
  76. <el-button type="primary" @click="submitForm">提交</el-button>
  77. <el-button @click="emit('cancel')">取消</el-button>
  78. </div>
  79. </div>
  80. </template>
  81. <script setup lang="ts">
  82. import {onMounted, reactive} from "vue";
  83. import {listModelMs, listModelObj} from "@/api/risk/r2";
  84. import {addModel, updateModel} from "@/api/risk/model";
  85. const props = defineProps({
  86. riskType:{
  87. type:String,
  88. default:"1"
  89. }
  90. })
  91. const objRef = ref(null)
  92. const {proxy} = getCurrentInstance()
  93. const {
  94. analy_result,
  95. risk_up,
  96. sys_yes_no,
  97. risk_type
  98. } = proxy.useDict('risk_type', 'analy_result', 'risk_up', 'sys_yes_no');
  99. const emit = defineEmits(["cancel", "success"])
  100. const treeRef = ref(null)
  101. const riskIds = ref(null)
  102. const treeIndex = ref([])
  103. const data = reactive({
  104. form: {
  105. metricsName: "",
  106. riskType: props.riskType,
  107. upDown:"",
  108. metricsId: null,
  109. objType: "1",
  110. timeSwitch:"Y",
  111. confidenceLevel:95,
  112. objIds: []
  113. },
  114. rules: {
  115. metricsId: {required: true, message: "请选择指标"},
  116. riskType: {required: true, message: "请选择分析类型"},
  117. upDown: {required: true, message: "请选择趋势恶化方向"},
  118. }
  119. })
  120. const metricsData = ref([])
  121. const modelTreeData = ref([])
  122. const {form, rules} = toRefs(data)
  123. const propsNode = {
  124. label: 'objName',
  125. }
  126. function handleCheckChange(data, checked) {
  127. form.value.objIds = checked ? [...form.value.objIds, data.objId] : form.value.objIds.filter(item => item !== data.objId)
  128. }
  129. function changeMetricsId(id) {
  130. form.value.metricsName = metricsData.value.find(item => item.metricsId === id).metricsName
  131. changeObjType(form.value.objType)
  132. }
  133. async function changeObjType(val) {
  134. if (val === "2") {
  135. form.value.objIds = []
  136. const res = await listModelObj(form.value.metricsId)
  137. modelTreeData.value = res.data
  138. } else {
  139. form.value.objIds = []
  140. }
  141. }
  142. onMounted(async () => {
  143. const res = await listModelMs()
  144. metricsData.value = res.data
  145. })
  146. async function submitForm() {
  147. objRef.value.validate(async valid => {
  148. if (valid) {
  149. const res = riskIds.value ? await updateModel({...form.value, riskId: riskIds.value}) : await addModel(form.value)
  150. proxy.$message.success(res.msg)
  151. emit('success')
  152. }
  153. })
  154. }
  155. async function editInfo(row) {
  156. treeIndex.value = []
  157. const {metricsName, riskType,upDown, timeSwitch, metricsId, objType, riskId,confidenceLevel} = row
  158. form.value = {metricsName, riskType, upDown,timeSwitch, metricsId, objType, confidenceLevel,objIds:[]}
  159. riskIds.value = riskId
  160. await changeObjType(objType)
  161. treeRef.value!.setCheckedNodes(row.riskObjList)
  162. }
  163. defineExpose({editInfo})
  164. </script>
  165. <style scoped lang="scss">
  166. .tree-row {
  167. width: 100%;
  168. border: 1px solid #f1f1f1;
  169. padding: 5px;
  170. }
  171. .btn-row {
  172. display: flex;
  173. justify-content: center;
  174. margin: 0px -20px 0 -20px;
  175. padding-top: 20px;
  176. border-top: 1px solid #f1f1f1;
  177. }
  178. </style>