Bläddra i källkod

feat: 告警开发

zhangwenya 1 år sedan
förälder
incheckning
78038446c4

+ 17 - 0
src/api/hl/hlDay.js

@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+// 查询健康度分数记录列表
+export function hlDayList(modelId,query) {
+    return request({
+        url: '/hl/hlDay/list/'+modelId,
+        method: 'get',
+        params: query
+    })
+}
+// 查询健康度分数记录列表
+export function hlDay(dayId) {
+    return request({
+        url: '/hl/hlDay/'+dayId,
+        method: 'get'
+    })
+}

+ 8 - 1
src/api/hl/hlScore.js

@@ -1,6 +1,5 @@
 import request from '@/utils/request'
 
-
 // 查询健康度分数记录列表
 export function hlsList(modelId,query) {
     return request({
@@ -9,3 +8,11 @@ export function hlsList(modelId,query) {
         params: query
     })
 }
+
+// 获取健康度分数记录详细信息
+export function hlScore(hlScoreId) {
+    return request({
+        url: 'hl/hlScore/'+hlScoreId,
+        method: 'get',
+    })
+}

+ 58 - 235
src/views/alarm/record/index.vue

@@ -1,98 +1,57 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="告警对象" prop="objId">
-        <el-input
-            v-model="queryParams.objId"
-            placeholder="请输入告警对象"
-            clearable
-            @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="告警指标" prop="objMetricsId">
-        <el-input
-            v-model="queryParams.objMetricsId"
-            placeholder="请输入告警指标"
-            clearable
-            @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="告警级别" prop="alarmLevel">
-        <el-select v-model="queryParams.alarmLevel" placeholder="请选择告警级别" clearable>
-          <el-option
-              v-for="dict in alarm_level"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="告警时间" style="width: 308px">
-        <el-date-picker
-            v-model="daterangeAlarmTime"
-            value-format="YYYY-MM-DD"
-            type="daterange"
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-            type="primary"
-            plain
-            icon="Plus"
-            @click="handleAdd"
-            v-hasPermi="['alarm:record:add']"
-        >新增
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="success"
-            plain
-            icon="Edit"
-            :disabled="single"
-            @click="handleUpdate"
-            v-hasPermi="['alarm:record:edit']"
-        >修改
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="danger"
-            plain
-            icon="Delete"
-            :disabled="multiple"
-            @click="handleDelete"
-            v-hasPermi="['alarm:record:remove']"
-        >删除
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-            v-hasPermi="['alarm:record:export']"
-        >导出
-        </el-button>
+      <el-col :span="16">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="0">
+          <el-form-item label="" prop="objId" style="margin-right:10px">
+            <el-select v-model="queryParams.objId" placeholder="请选择业务类型" style="width: 260px" clearable filterable remote reserve-keyword :remote-method="remoteMethod">
+              <el-option
+                  v-for="dict in objList"
+                  :key="dict.objId"
+                  :label="dict.objName"
+                  :value="dict.objId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="" prop="objMetricsId" style="margin-right:10px">
+            <el-input
+                v-model="queryParams.objMetricsId"
+                placeholder="请输入告警指标"
+                clearable
+                @keyup.enter="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="" prop="alarmLevel" style="margin-right:10px">
+            <el-select v-model="queryParams.alarmLevel" placeholder="请选择告警级别" clearable>
+              <el-option
+                  v-for="dict in alarm_level"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="" style="width: 308px;margin-right:10px">
+            <el-date-picker
+                v-model="daterangeAlarmTime"
+                value-format="YYYY-MM-DD"
+                type="daterange"
+                range-separator="-"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
       </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="recordList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center"/>
-      <el-table-column label="告警ID" align="center" prop="alarmId"/>
-      <el-table-column label="告警对象" align="center" prop="bizobj.objName"/>
+    <el-table v-loading="loading" :data="recordList" border>
+      <el-table-column label="告警ID" align="left" prop="alarmId" width="80"/>
+      <el-table-column label="告警对象" align="left" prop="bizobj.objName"/>
       <el-table-column label="告警指标" align="center" prop="bizObjMetrics.metricsName"/>
       <el-table-column label="告警级别" align="center" prop="alarmLevel">
         <template #default="scope">
@@ -100,19 +59,12 @@
         </template>
       </el-table-column>
       <el-table-column label="告警值" align="center" prop="alarmValue" :formatter="rounding"/>
-      <el-table-column label="告警时间" align="center" prop="alarmTime" width="180">
+      <el-table-column label="告警时间" align="center" prop="alarmTime" width="220">
         <template #default="scope">
           <span>{{ parseTime(scope.row.alarmTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
         </template>
       </el-table-column>
-      <!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
-      <!--        <template #default="scope">-->
-      <!--          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['alarm:record:edit']">修改</el-button>-->
-      <!--          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['alarm:record:remove']">删除</el-button>-->
-      <!--        </template>-->
-      <!--      </el-table-column>-->
     </el-table>
-
     <pagination
         v-show="total>0"
         :total="total"
@@ -120,67 +72,22 @@
         v-model:limit="queryParams.pageSize"
         @pagination="getList"
     />
-
-    <!-- 添加或修改告警记录对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="recordRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="告警对象;" prop="objId">
-          <el-input v-model="form.objId" placeholder="请输入告警对象"/>
-        </el-form-item>
-        <el-form-item label="告警指标" prop="objMetricsId">
-          <el-input v-model="form.objMetricsId" placeholder="请输入告警指标"/>
-        </el-form-item>
-        <el-form-item label="告警级别" prop="alarmLevel">
-          <el-select v-model="form.alarmLevel" placeholder="请选择告警级别">
-            <el-option
-                v-for="dict in alarm_level"
-                :key="dict.value"
-                :label="dict.label"
-                :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="告警值" prop="alarmValue">
-          <el-input v-model="form.alarmValue" placeholder="请输入告警值"/>
-        </el-form-item>
-        <el-form-item label="告警时间" prop="alarmTime">
-          <el-date-picker clearable
-                          v-model="form.alarmTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择告警时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
   </div>
 </template>
 
 <script setup name="Record">
-import {addRecord, delRecord, getRecord, listRecord, updateRecord} from "@/api/alarm/record";
-
+import {listRecord} from "@/api/alarm/record";
+import {listObj} from "@/api/obj/obj.js"
 const {proxy} = getCurrentInstance();
 const {alarm_level} = proxy.useDict('alarm_level');
 
 const recordList = ref([]);
-const open = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
 const total = ref(0);
 const title = ref("");
 const daterangeAlarmTime = ref([]);
+const objList = ref([]);
 
 const data = reactive({
   form: {},
@@ -197,6 +104,12 @@ const data = reactive({
 
 const {queryParams, form, rules} = toRefs(data);
 
+function remoteMethod(keyword){
+  listObj({ pageNum: 1,pageSize: 5,objName: keyword}).then(res=>{
+    objList.value = res.rows
+  })
+}
+
 /** 查询告警记录列表 */
 function getList() {
   loading.value = true;
@@ -212,31 +125,6 @@ function getList() {
   });
 }
 
-// 取消按钮
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 表单重置
-function reset() {
-  form.value = {
-    alarmId: null,
-    objId: null,
-    objMetricsId: null,
-    alarmType: null,
-    alarmLevel: null,
-    alarmValue: null,
-    alarmTime: null,
-    createBy: null,
-    createTime: null,
-    updateBy: null,
-    updateTime: null,
-    remark: null
-  };
-  proxy.resetForm("recordRef");
-}
-
 /** 搜索按钮操作 */
 function handleQuery() {
   queryParams.value.pageNum = 1;
@@ -250,71 +138,6 @@ function resetQuery() {
   handleQuery();
 }
 
-// 多选框选中数据
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.alarmId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
-
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "添加告警记录";
-}
-
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset();
-  const _alarmId = row.alarmId || ids.value
-  getRecord(_alarmId).then(response => {
-    form.value = response.data;
-    open.value = true;
-    title.value = "修改告警记录";
-  });
-}
-
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["recordRef"].validate(valid => {
-    if (valid) {
-      if (form.value.alarmId != null) {
-        updateRecord(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功");
-          open.value = false;
-          getList();
-        });
-      } else {
-        addRecord(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-}
-
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _alarmIds = row.alarmId || ids.value;
-  proxy.$modal.confirm('是否确认删除告警记录编号为"' + _alarmIds + '"的数据项?').then(function () {
-    return delRecord(_alarmIds);
-  }).then(() => {
-    getList();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {
-  });
-}
-
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download('alarm/record/export', {
-    ...queryParams.value
-  }, `record_${new Date().getTime()}.xlsx`)
-}
-
 /** 保留2位小数*/
 function rounding(row, column) {
   return parseFloat(row[column.property]).toFixed(2)

+ 30 - 11
src/views/hl/bm/component/healthSetting.vue

@@ -1,29 +1,31 @@
 <template>
-  <div style="font-size: 14px;">
+  <div style="font-size: 14px;margin-bottom: 20px" v-if="!details">
     当前总分:{{countEs}} <span style="margin:0 20px">/</span> 细项总分:{{countIz}}
   </div>
   <el-table
       :data="hlbData"
       :span-method="objectSpanMethod"
       border
-      style="width: 100%; margin-top: 20px"
+      style="width: 100%;"
   >
     <el-table-column prop="bri" label="业务风险项" width="180" />
-    <el-table-column prop="es" label="评价分值" width="100" align="center">
+    <el-table-column prop="es" label="评价分值" width="80" align="center">
       <template #default="scope">
-        <el-input v-model="scope.row.es" @change="changeEs(scope.row)"/>
+        <el-input v-model="scope.row.es" @change="changeEs(scope.row)" v-if="!details"/>
+        <span v-else>{{scope.row.es}}</span>
       </template>
     </el-table-column>
+    <el-table-column prop="cs" label="实际得分" width="80" align="center" v-if="details"/>
     <el-table-column prop="eo" label="评价对象" width="180" />
     <el-table-column prop="ri" label="风险指标" width="180" />
     <el-table-column prop="pds" label="扣分标准" width="180" />
-    <el-table-column prop="iz" label="细项分" width="180" />
-    <el-table-column label="当前健康评分标准" width="240">
+    <el-table-column prop="iz" label="细项分" width="100" align="center"/>
+    <el-table-column label="当前健康评分标准">
       <template #default="scope">
         <div v-html="scope.row.chss" />
       </template>
     </el-table-column>
-    <el-table-column label="日健康评分标准">
+    <el-table-column label="日健康评分标准"  width="250">
       <template #default="scope">
         <div v-html="scope.row.stand" />
       </template>
@@ -32,9 +34,24 @@
 </template>
 <script setup lang="ts">
 import { watchEffect} from "vue";
+import {hlScore} from "@/api/hl/hlScore"
 import {hlbDetails} from "@/api/hl/hlb"
+import {hlDay} from "@/api/hl/hlDay"
 import {updateHld} from "@/api/hl/hld"
-const props = defineProps(['modelId'])
+const props = defineProps({
+  modelId:{
+    type:Number,
+    required:true
+  },
+  details:{
+    type:Boolean,
+    default:false
+  },
+  dialogType:{
+    type:String,
+    default:"history"
+  }
+})
 const hlbData = ref([])
 const countEs=ref(0)
 const countIz=ref(0)
@@ -59,7 +76,7 @@ async function changeEs(row){
 }
 
 function  objectSpanMethod ({row,column,rowIndex,columnIndex,})  {
-  if (columnIndex === 0||columnIndex === 1||columnIndex === 2||columnIndex === 6) {
+  if (columnIndex === 0||columnIndex === 1||columnIndex === 2||(props.details && columnIndex === 3)||columnIndex === 6) {
     const f=row.length===row.lowLength
       if(f){
         return {
@@ -73,7 +90,7 @@ function  objectSpanMethod ({row,column,rowIndex,columnIndex,})  {
         }
       }
   }
-  if(columnIndex===7){
+  if(props.details?columnIndex===8:columnIndex===7){
     if(rowIndex===0){
       return {
         rowspan: hlbData.value.length,
@@ -89,7 +106,8 @@ function  objectSpanMethod ({row,column,rowIndex,columnIndex,})  {
 }
 
 function getHtlData(){
-  hlbDetails(props.modelId).then(res=>{
+  const request = props.details ? (props.dialogType==="day"? hlDay:hlScore) : hlbDetails
+  request(props.modelId).then(res=>{
     if(res.data){
       countEs.value = 0
       hlbData.value = []
@@ -108,6 +126,7 @@ function formattedData(data) {
             hlbData.value.push({
               es:cItem.hlObjScore,
               eo:cItem.hlObjName,
+              cs:ccItem.currScore || 0,
               length:cItem.hlDetailList.length,
               lowLength:cItem.hlDetailList.length-ccIndex,
               chss:cItem.hlObjStand.replace(/\n/g, '<br/>'),

+ 40 - 8
src/views/hl/bm/component/historyHealth.vue

@@ -2,14 +2,25 @@
   <el-table
       :data="hlsData"
       border
-      style="width: 100%; margin-top: 20px"
+      style="width: 100%;"
   >
-    <el-table-column prop="hlScoreId" label="ID" width="80" align="center" />
-    <el-table-column prop="updateTime" label="评分时间" />
+    <el-table-column label="ID" width="80" align="center">
+      <template #default="scope">
+        {{scope.row.hlScoreId || scope.row.dayId}}
+      </template>
+    </el-table-column>
+    <el-table-column prop="updateTime" label="评分时间">
+      <template #default="scope">
+        <span v-if="scope.row.hlDate">{{ parseTime(scope.row.hlDate, '{y}-{m}-{d}')}}</span>
+        <span v-else>
+          {{scope.row.updateTime}}
+        </span>
+      </template>
+    </el-table-column>
     <el-table-column prop="hlScore" label="健康度得分" width="200"  align="center" />
     <el-table-column label="操作" width="100" align="center">
       <template #default="scope">
-        <el-button type="text" plain icon="Tickets">明细</el-button>
+        <el-button type="text" plain icon="Tickets" @click="handleHistoryDetails(scope.row)">明细</el-button>
       </template>
     </el-table-column>
   </el-table>
@@ -20,25 +31,46 @@
       v-model:limit="params.pageSize"
       @pagination="getHlsData"
   />
+
+  <el-dialog :title="title" v-model="open" width="1600px" append-to-body style="margin-top:2px!important">
+    <health-setting :modelId="hlScoreId" :details="true" :dialogType="dialogType"/>
+  </el-dialog>
+
 </template>
 <script setup lang="ts">
 import {hlsList} from "@/api/hl/hlScore"
-const props = defineProps(['modelId'])
+import {hlDayList} from "@/api/hl/hlDay"
+import {onMounted, watch} from "vue"
+import healthSetting from "./healthSetting.vue"
+const props = defineProps(['modelId','dialogType'])
 const hlsData = ref([])
 const total = ref(0)
+const open = ref(false)
+const title = ref("")
+const hlScoreId = ref(0)
 const params=reactive({
   pageNum: 1,
   pageSize: 10,
 })
 
-watchEffect(()=>{
+onMounted(()=>{
   getHlsData()
 })
 
-
+function handleHistoryDetails(row){
+  if(props.dialogType === 'history'){
+    title.value = "历史健康度明细"
+    hlScoreId.value = row.hlScoreId
+  }else{
+    title.value = "日健康度明细"
+    hlScoreId.value = row.dayId
+  }
+  open.value = true
+}
 
 function getHlsData(){
-  hlsList(props.modelId,params).then(res=>{
+  const request = props.dialogType === 'history' ? hlsList : hlDayList
+  request(props.modelId,params).then(res=>{
     hlsData.value = res.rows
     total.value = res.total
   })

+ 3 - 6
src/views/hl/bm/component/step1.vue

@@ -3,9 +3,9 @@
     <el-form-item label="模型名称" prop="modelName">
       <el-input v-model="form.modelName" placeholder="请输入模型名称" />
     </el-form-item>
-    <el-form-item label="业务类型" prop="modelType">
-      <el-input v-model="form.modelType" placeholder="请输入业务类型" />
-    </el-form-item>
+<!--    <el-form-item label="业务类型" prop="modelType">-->
+<!--      <el-input v-model="form.modelType" placeholder="请输入业务类型" />-->
+<!--    </el-form-item>-->
     <el-form-item label="备注">
       <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" :autosize="{maxRows:6,minRows:3}" maxlength="300" show-word-limit/>
     </el-form-item>
@@ -26,9 +26,6 @@ const data=reactive({
     modelName:[
       {required:true,message:"请输入模型名称",trigger:"blur"}
     ],
-    modelType:[
-      {required:true,message:"请输入业务类型",trigger:"blur"}
-    ]
   }
 })
 const { form, rules} = toRefs(data)

+ 6 - 5
src/views/hl/bm/index.vue

@@ -31,17 +31,18 @@
     <el-table v-loading="loading" :data="bmList" border>
       <el-table-column label="模型ID" align="center" prop="modelId"  width="80"/>
       <el-table-column label="模型名称" align="left" prop="modelName" />
-      <el-table-column label="业务类型" align="left" prop="modelType" width="180"/>
+      <el-table-column label="昨日健康度" align="center" prop="yesterdayScore"  width="180"/>
+      <el-table-column label="最近一次健康度得分" align="center" prop="lastScore"  width="180"/>
       <el-table-column label="更新时间" align="left" prop="updateTime" width="180">
         <template #default="scope">
           <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" class-name="small-padding fixed-width" align="left" >
+      <el-table-column label="操作" width="480" class-name="small-padding fixed-width" align="left" >
         <template #default="scope">
           <el-button link type="primary" icon="Position" @click="handleHealthSet(scope.row,'health')">健康度配置</el-button>
           <el-button link type="primary" icon="Calendar" @click="handleHealthSet(scope.row,'history')">历史健康度</el-button>
-          <el-button link type="primary" icon="Clock">日健康度</el-button>
+          <el-button link type="primary" icon="Clock"  @click="handleHealthSet(scope.row,'day')">日健康度</el-button>
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hl:bm:edit']">修改</el-button>
           <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:bm:remove']">删除</el-button>
         </template>
@@ -59,7 +60,7 @@
     <!-- 添加或修改业务模型对话框 -->
     <el-dialog :title="title" v-model="open" :width="dialogType ==='health'?'1600px':'800px'" append-to-body :style="dialogType ==='health'?'margin-top:2px!important;':''">
       <add-bm-info ref="bmRef" @cancel="open = false" @success="getList" v-if="dialogType==='add'"/>
-      <component :is="activeComponent[currentActive]" v-else :modelId="modelId" />
+      <component :is="activeComponent[currentActive]" v-else-if="dialogType!=='add' && open" :modelId="modelId" :dialogType="dialogType"/>
     </el-dialog>
   </div>
 </template>
@@ -112,7 +113,7 @@ function handleHealthSet(row,type){
   currentActive.value = type === "health" ? 0 : 1
   dialogType.value = type
   open.value = true
-  title.value = type === "health" ? "健康度配置" : row.modelName+"健康度"
+  title.value = type === "health" ? "健康度配置" :(row.modelName + ((type==="day"?"日":"历史")+"健康度"))
 }