7 changed files with 733 additions and 4 deletions
@ -0,0 +1,33 @@ |
|||
import { defHttp } from '@/utils/http/axios' |
|||
|
|||
export interface WarnPageReqVO extends PageParam { |
|||
mpId?: string |
|||
} |
|||
|
|||
export interface WarnVO { |
|||
id: number |
|||
warnStatus: number |
|||
|
|||
} |
|||
|
|||
export interface EXAHistoryReqVO { |
|||
itemName?: string |
|||
startTime?: string |
|||
endTime?: string |
|||
interval?: string |
|||
} |
|||
|
|||
// 查询预警列表-分页
|
|||
export function getWarnPage(params: WarnPageReqVO) { |
|||
return defHttp.get({ url: '/alert/warn/page', params }) |
|||
} |
|||
|
|||
// 修改预警
|
|||
export function updateWarn(data: WarnVO) { |
|||
return defHttp.put({ url: '/alert/warn/update', data }) |
|||
} |
|||
|
|||
// 查询预警详情
|
|||
export function getWarn(id: number) { |
|||
return defHttp.get({ url: `/alert/warn/get?id=${id}` }) |
|||
} |
@ -0,0 +1,88 @@ |
|||
<script lang="ts" setup> |
|||
import { ref, unref } from 'vue' |
|||
import { updateInstantForm } from './instant.data' |
|||
import { useI18n } from '@/hooks/web/useI18n' |
|||
import { useMessage } from '@/hooks/web/useMessage' |
|||
import { BasicForm, useForm } from '@/components/Form' |
|||
import { BasicModal, useModalInner } from '@/components/Modal' |
|||
import { getInstant, updateInstant } from '@/api/alert/run/instant/index' |
|||
|
|||
import { getModelVersionList } from '@/api/alert/run/model/index' |
|||
import { getCalcGroupList } from '@/api/alert/run/calcgroup/index' |
|||
|
|||
defineOptions({ name: 'InstantUpdateModal' }) |
|||
|
|||
const emit = defineEmits(['success', 'register']) |
|||
const { t } = useI18n() |
|||
const { createMessage } = useMessage() |
|||
const isUpdate = ref(true) |
|||
|
|||
const [registerForm, { updateSchema, setFieldsValue, resetFields, validate }] = useForm({ |
|||
labelWidth: 120, |
|||
baseColProps: { span: 24 }, |
|||
schemas: updateInstantForm, |
|||
showActionButtonGroup: false, |
|||
actionColOptions: { span: 23 }, |
|||
|
|||
}) |
|||
|
|||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { |
|||
resetFields() |
|||
// 如果是修改modal,则赋值给表单 |
|||
isUpdate.value = !!data?.isUpdate |
|||
if (unref(isUpdate)) { |
|||
const res = await getInstant(data.record.id) |
|||
setFieldsValue({ ...res }) |
|||
} |
|||
// 获取下拉框的数据 |
|||
const versionData = await getModelVersionList({ modelId: data?.record.modelId }) |
|||
const versionList = [] as any |
|||
// // 组名下拉框问题 |
|||
versionData.forEach((item) => { |
|||
versionList.push({ label: item.version, value: item.id }) |
|||
}) |
|||
const calcGroupData = await getCalcGroupList({ unitId: data?.record.unitId }) |
|||
const calcGroupList = [] as any |
|||
// // 组名下拉框问题 |
|||
calcGroupData.forEach((item) => { |
|||
calcGroupList.push({ label: item.groupName, value: item.id }) |
|||
}) |
|||
|
|||
// 将数据放入下拉框中 |
|||
updateSchema({ |
|||
field: 'modelVersionId', |
|||
componentProps: { |
|||
options: versionList, |
|||
}, |
|||
}) |
|||
updateSchema({ |
|||
field: 'calcGroup', |
|||
componentProps: { |
|||
options: calcGroupList, |
|||
}, |
|||
}) |
|||
setModalProps({ useWrapper: true, minHeight: 180, confirmLoading: false }) |
|||
}) |
|||
|
|||
async function handleSubmit() { |
|||
try { |
|||
const values = await validate() |
|||
setModalProps({ confirmLoading: true }) |
|||
if (unref(isUpdate)) |
|||
await updateInstant(values) |
|||
|
|||
closeModal() |
|||
emit('success') |
|||
createMessage.success(t('common.saveSuccessText')) |
|||
} |
|||
finally { |
|||
setModalProps({ confirmLoading: false }) |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<template> |
|||
<BasicModal v-bind="$attrs" :title="isUpdate ? t('action.edit') : t('action.create')" @register="registerModal" @ok="handleSubmit"> |
|||
<BasicForm @register="registerForm" /> |
|||
</BasicModal> |
|||
</template> |
@ -0,0 +1,125 @@ |
|||
<script lang="ts" setup> |
|||
import { Badge, Switch } from 'ant-design-vue' |
|||
import { onMounted, ref } from 'vue' |
|||
|
|||
import { useRoute } from 'vue-router' |
|||
import HistoryModal from '../../exa/config/HistoryModal.vue' |
|||
import { columns, searchFormSchema } from './warn.data' |
|||
import CreateModal from './CreateModal.vue' |
|||
import UpdateModal from './UpdateModal.vue' |
|||
|
|||
import { BasicTable, TableAction, useTable } from '@/components/Table' |
|||
import { getWarnPage, updateWarn } from '@/api/alert/warn' |
|||
import { getExaNow } from '@/api/alert/exa' |
|||
import { useI18n } from '@/hooks/web/useI18n' |
|||
import { router } from '@/router' |
|||
import { useMessage } from '@/hooks/web/useMessage' |
|||
import { IconEnum } from '@/enums/appEnum' |
|||
import { useModal } from '@/components/Modal' |
|||
|
|||
defineOptions({ name: 'Warn' }) |
|||
|
|||
const route = useRoute() |
|||
|
|||
const { createMessage } = useMessage() |
|||
const { t } = useI18n() |
|||
const [registerUpdateModal, { openModal: openUpdateModal }] = useModal() |
|||
const [registerTable, { getForm, reload, getDataSource, updateTableDataRecord }] = useTable({ |
|||
title: '预警测点列表', |
|||
api: getWarnPage, |
|||
rowKey: 'id', |
|||
immediate: true, |
|||
columns, |
|||
formConfig: { |
|||
labelWidth: 120, |
|||
schemas: searchFormSchema, |
|||
showResetButton: false, |
|||
showSubmitButton: false, |
|||
actionColOptions: { |
|||
span: 2, |
|||
}, |
|||
|
|||
}, |
|||
beforeFetch: (params) => { |
|||
// 方式二:通过查询前的事件增加默认值,然后设置到表单值中 |
|||
params.mpId = route.query.id |
|||
getForm().setFieldsValue(params) |
|||
return params |
|||
}, |
|||
useSearchForm: !route.query.id, |
|||
showTableSetting: true, |
|||
showIndexColumn: false, |
|||
actionColumn: { |
|||
width: 120, |
|||
title: t('common.action'), |
|||
dataIndex: 'action', |
|||
fixed: 'right', |
|||
}, |
|||
|
|||
}) |
|||
|
|||
async function updateStatus(record) { |
|||
await updateWarn(record) |
|||
createMessage.success(t('common.saveSuccessText')) |
|||
console.log(record) |
|||
reload() |
|||
} |
|||
function handleWarnConfig(record: Recordable) { |
|||
openUpdateModal(true, { record, isUpdate: true }) |
|||
} |
|||
|
|||
onMounted(async () => { |
|||
|
|||
}) |
|||
</script> |
|||
|
|||
<template> |
|||
<div> |
|||
<BasicTable @register="registerTable"> |
|||
<template #bodyCell="{ column, record }"> |
|||
<template v-if="column.key === 'action'"> |
|||
<TableAction |
|||
:actions="[ |
|||
|
|||
{ icon: IconEnum.WARN, label: t('action.warnConfig'), auth: 'run:instant:warnConfig', onClick: handleWarnConfig.bind(null, record) }, |
|||
|
|||
]" |
|||
/> |
|||
</template> |
|||
</template> |
|||
<template #warnStatus="{ record }"> |
|||
<Switch |
|||
v-model:checked="record.warnStatus" :checked-value="1" :un-checked-value="0" checked-children="是" |
|||
un-checked-children="否" @change="updateStatus(record)" |
|||
/> |
|||
</template> |
|||
<template #shortMessageOnOff="{ record }"> |
|||
<Switch |
|||
v-model:checked="record.shortMessageOnOff" :checked-value="1" :un-checked-value="0" checked-children="是" |
|||
un-checked-children="否" @change="updateStatus(record)" |
|||
/> |
|||
</template> |
|||
<template #gzpOnOff="{ record }"> |
|||
<Switch |
|||
v-model:checked="record.gzpOnOff" :checked-value="1" :un-checked-value="0" checked-children="是" |
|||
un-checked-children="否" @change="updateStatus(record)" |
|||
/> |
|||
</template> |
|||
<template #copyToDiagOnOff="{ record }"> |
|||
<Switch |
|||
v-model:checked="record.copyToDiagOnOff" :checked-value="1" :un-checked-value="0" checked-children="是" |
|||
un-checked-children="否" @change="updateStatus(record)" |
|||
/> |
|||
</template> |
|||
|
|||
<template #timeDurationThreshold="{ record }"> |
|||
{{ `${record.timeDurationThreshold}秒` }} |
|||
</template> |
|||
</BasicTable> |
|||
<UpdateModal @register="registerUpdateModal" @success="reload" /> |
|||
</div> |
|||
</template> |
|||
|
|||
<style lang="less" scoped> |
|||
|
|||
</style> |
@ -0,0 +1,88 @@ |
|||
<script lang="ts" setup> |
|||
import { ref, unref } from 'vue' |
|||
import { updateWarnForm } from './warn.data' |
|||
import { useI18n } from '@/hooks/web/useI18n' |
|||
import { useMessage } from '@/hooks/web/useMessage' |
|||
import { BasicForm, useForm } from '@/components/Form' |
|||
import { BasicModal, useModalInner } from '@/components/Modal' |
|||
import { getWarn, updateWarn } from '@/api/alert/warn/index' |
|||
|
|||
import { getModelVersionList } from '@/api/alert/run/model/index' |
|||
import { getCalcGroupList } from '@/api/alert/run/calcgroup/index' |
|||
|
|||
defineOptions({ name: 'WarnUpdateModal' }) |
|||
|
|||
const emit = defineEmits(['success', 'register']) |
|||
const { t } = useI18n() |
|||
const { createMessage } = useMessage() |
|||
const isUpdate = ref(true) |
|||
|
|||
const [registerForm, { updateSchema, setFieldsValue, resetFields, validate }] = useForm({ |
|||
labelWidth: 120, |
|||
baseColProps: { span: 24 }, |
|||
schemas: updateWarnForm, |
|||
showActionButtonGroup: false, |
|||
actionColOptions: { span: 23 }, |
|||
|
|||
}) |
|||
|
|||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { |
|||
resetFields() |
|||
setModalProps({ useWrapper: true, minHeight: 180, confirmLoading: false }) |
|||
// 如果是修改modal,则赋值给表单 |
|||
isUpdate.value = !!data?.isUpdate |
|||
if (unref(isUpdate)) { |
|||
const res = await getWarn(data.record.id) |
|||
setFieldsValue({ ...res }) |
|||
} |
|||
// // 获取下拉框的数据 |
|||
// const versionData = await getModelVersionList({ modelId: data?.record.modelId }) |
|||
// const versionList = [] as any |
|||
// // // 组名下拉框问题 |
|||
// versionData.forEach((item) => { |
|||
// versionList.push({ label: item.version, value: item.id }) |
|||
// }) |
|||
// const calcGroupData = await getCalcGroupList({ unitId: data?.record.unitId }) |
|||
// const calcGroupList = [] as any |
|||
// // // 组名下拉框问题 |
|||
// calcGroupData.forEach((item) => { |
|||
// calcGroupList.push({ label: item.groupName, value: item.id }) |
|||
// }) |
|||
|
|||
// // 将数据放入下拉框中 |
|||
// updateSchema({ |
|||
// field: 'modelVersionId', |
|||
// componentProps: { |
|||
// options: versionList, |
|||
// }, |
|||
// }) |
|||
// updateSchema({ |
|||
// field: 'calcGroup', |
|||
// componentProps: { |
|||
// options: calcGroupList, |
|||
// }, |
|||
// }) |
|||
}) |
|||
|
|||
async function handleSubmit() { |
|||
try { |
|||
const values = await validate() |
|||
setModalProps({ confirmLoading: true }) |
|||
if (unref(isUpdate)) |
|||
await updateWarn(values) |
|||
|
|||
closeModal() |
|||
emit('success') |
|||
createMessage.success(t('common.saveSuccessText')) |
|||
} |
|||
finally { |
|||
setModalProps({ confirmLoading: false }) |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<template> |
|||
<BasicModal v-bind="$attrs" :title="isUpdate ? t('action.edit') : t('action.create')" @register="registerModal" @ok="handleSubmit"> |
|||
<BasicForm @register="registerForm" /> |
|||
</BasicModal> |
|||
</template> |
@ -0,0 +1,352 @@ |
|||
import type { BasicColumn, FormSchema } from '@/components/Table' |
|||
|
|||
export const columns: BasicColumn[] = [ |
|||
{ |
|||
title: '编号', |
|||
dataIndex: 'id', |
|||
width: 80, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '点号', |
|||
dataIndex: 'pointId', |
|||
width: 150, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '描述', |
|||
dataIndex: 'pointName', |
|||
width: 200, |
|||
}, |
|||
{ |
|||
title: '单位', |
|||
dataIndex: 'unit', |
|||
width: 80, |
|||
}, |
|||
{ |
|||
title: '上限', |
|||
dataIndex: 'uplimit', |
|||
width: 80, |
|||
}, |
|||
{ |
|||
title: '下限', |
|||
dataIndex: 'lowlimit', |
|||
width: 80, |
|||
}, |
|||
{ |
|||
title: '实例名称', |
|||
dataIndex: 'mpName', |
|||
width: 250, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '专业', |
|||
dataIndex: 'systemName', |
|||
width: 200, |
|||
|
|||
}, |
|||
{ |
|||
title: '报警类型', |
|||
dataIndex: 'alarmModelRuleName', |
|||
width: 120, |
|||
|
|||
}, |
|||
{ |
|||
title: '报警限制', |
|||
dataIndex: 'warnConstraintName', |
|||
width: 120, |
|||
|
|||
}, |
|||
{ |
|||
title: '报警类型', |
|||
dataIndex: 'alarmModelRuleName', |
|||
width: 120, |
|||
|
|||
}, |
|||
{ |
|||
title: '告警延时', |
|||
dataIndex: 'timeDurationThreshold', |
|||
width: 100, |
|||
slots: { customRender: 'timeDurationThreshold' }, |
|||
}, |
|||
{ |
|||
title: '短信告警', |
|||
dataIndex: 'shortMessageOnOff', |
|||
width: 100, |
|||
slots: { customRender: 'shortMessageOnOff' }, |
|||
|
|||
}, |
|||
{ |
|||
title: '光字牌告警', |
|||
dataIndex: 'gzpOnOff', |
|||
width: 100, |
|||
slots: { customRender: 'gzpOnOff' }, |
|||
|
|||
}, |
|||
{ |
|||
title: '推送诊断', |
|||
dataIndex: 'copyToDiagOnOff', |
|||
width: 100, |
|||
slots: { customRender: 'copyToDiagOnOff' }, |
|||
|
|||
}, |
|||
{ |
|||
title: '已有实例数量', |
|||
dataIndex: 'number', |
|||
width: 100, |
|||
}, |
|||
{ |
|||
title: '参与报警', |
|||
dataIndex: 'warnStatus', |
|||
width: 100, |
|||
slots: { customRender: 'warnStatus' }, |
|||
fixed: 'right', |
|||
}, |
|||
// {
|
|||
// title: '实时值',
|
|||
// dataIndex: 'value',
|
|||
// width: 90,
|
|||
// className: 'value',
|
|||
// slots: { customRender: 'value' },
|
|||
|
|||
// }
|
|||
|
|||
] |
|||
|
|||
export const searchFormSchema: FormSchema[] = [ |
|||
{ |
|||
label: '模型实例id', |
|||
field: 'mpId', |
|||
component: 'Input', |
|||
defaultValue: '', |
|||
required: true, |
|||
show: false, |
|||
colProps: { span: 8 }, |
|||
}, |
|||
|
|||
] |
|||
|
|||
export const updateWarnForm: FormSchema[] = [ |
|||
{ |
|||
label: '编号', |
|||
field: 'id', |
|||
component: 'Input', |
|||
required: true, |
|||
show: false, |
|||
}, |
|||
{ |
|||
label: '残差上限', |
|||
field: 'uplimit', |
|||
component: 'Input', |
|||
required: true, |
|||
componentProps: { |
|||
placeholder: '请输入残差上限', |
|||
}, |
|||
rules: [{ required: true, message: '请输入残差上限' }], |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '残差下限', |
|||
field: 'lowlimit', |
|||
component: 'Input', |
|||
required: true, |
|||
componentProps: { |
|||
placeholder: '请输入残差下限', |
|||
}, |
|||
rules: [{ required: true, message: '请输入残差下限' }], |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '延时告警', |
|||
field: 'timeDurationThreshold', |
|||
component: 'Input', |
|||
required: true, |
|||
componentProps: { |
|||
placeholder: '请输入延时告警', |
|||
}, |
|||
rules: [{ required: true, message: '请输入延时告警' }], |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
|
|||
{ |
|||
label: '告警等级', |
|||
field: 'alarmLevel', |
|||
component: 'Select', |
|||
componentProps: { |
|||
options: [], |
|||
}, |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '光字牌名称', |
|||
field: 'gzpName', |
|||
component: 'Input', |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '光字牌状态', |
|||
field: 'gzpOnOff', |
|||
component: 'RadioGroup', |
|||
componentProps: { |
|||
// 数据源1:固定数据
|
|||
options: [ |
|||
{ label: '是', value: 1 }, |
|||
{ label: '否', value: 0 }, |
|||
], |
|||
}, |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
|
|||
{ |
|||
label: '短信推送', |
|||
field: 'shortMessageOnOff', |
|||
component: 'RadioGroup', |
|||
componentProps: { |
|||
options: [{ label: '是', value: 1 }, { label: '否', value: 0 }], |
|||
}, |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '推送诊断', |
|||
field: 'copyToDiagOnOff', |
|||
component: 'RadioGroup', |
|||
componentProps: { |
|||
options: [{ label: '是', value: 1 }, { label: '否', value: 0 }], |
|||
}, |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '告警限制名称', |
|||
field: 'warnConstraintName', |
|||
component: 'Input', |
|||
|
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
{ |
|||
label: '告警限制条件', |
|||
field: 'warnConstraint', |
|||
component: 'Input', |
|||
required: true, |
|||
colProps: { |
|||
span: 12, |
|||
}, |
|||
}, |
|||
] |
|||
export const InstantBasicInfo: any[] = [ |
|||
|
|||
{ |
|||
label: '实例名称', |
|||
field: 'mpName', |
|||
|
|||
}, |
|||
{ |
|||
label: '创建人', |
|||
field: 'creator', |
|||
}, |
|||
{ |
|||
label: '创建时间', |
|||
field: 'createTime', |
|||
}, |
|||
{ |
|||
label: '最近修改人', |
|||
field: 'updater', |
|||
}, |
|||
{ |
|||
label: '最近修改时间', |
|||
field: 'updateTime', |
|||
}, |
|||
{ |
|||
label: '算法', |
|||
field: 'algorithm_shortname', |
|||
}, |
|||
|
|||
// modelInfo中的字段
|
|||
{ |
|||
label: '训练采样间隔', |
|||
field: 'sampling', |
|||
}, |
|||
|
|||
{ |
|||
label: '参数个数', |
|||
field: 'pointInfo', |
|||
}, |
|||
{ |
|||
label: '最小主元贡献率', |
|||
field: 'rate', |
|||
}, |
|||
{ |
|||
label: '主元个数', |
|||
field: 'principal', |
|||
}, |
|||
{ |
|||
label: '模型精度', |
|||
field: 'rate', |
|||
}, |
|||
] |
|||
|
|||
export const detailColumns: BasicColumn[] = [ |
|||
{ |
|||
title: '编号', |
|||
dataIndex: 'id', |
|||
width: 80, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '测点编码', |
|||
dataIndex: 'inputInfo', |
|||
width: 150, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '测点名称', |
|||
dataIndex: 'inputName', |
|||
width: 200, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '单位', |
|||
dataIndex: 'unit', |
|||
width: 50, |
|||
fixed: 'left', |
|||
}, |
|||
{ |
|||
title: '重构值测点', |
|||
dataIndex: 'outPointInfo', |
|||
width: 200, |
|||
|
|||
}, |
|||
{ |
|||
title: '偏差值测点', |
|||
dataIndex: 'biasPointInfo', |
|||
width: 200, |
|||
}, |
|||
{ |
|||
title: '错误状态测点', |
|||
dataIndex: 'faultVariablePointInfo', |
|||
width: 200, |
|||
}, |
|||
] |
Loading…
Reference in new issue