Browse Source

fix:模型实例插入预警表功能

pull/61/head
肖晋飞 1 month ago
parent
commit
1a57c503c7
  1. 7
      src/api/alert/run/instant/index.ts
  2. 5
      src/api/alert/run/model/index.ts
  3. 119
      src/views/run/instant/CreateModal.vue
  4. 51
      src/views/run/instant/index.vue
  5. 42
      src/views/run/model/ModelTable.vue
  6. 7
      src/views/run/model/model.data.ts

7
src/api/alert/run/instant/index.ts

@ -72,6 +72,13 @@ export function updateInstant(data: InstantVO) {
return defHttp.put({ url: '/alert/instant/update', data }) return defHttp.put({ url: '/alert/instant/update', data })
} }
// 删除模型实例
export function deleteInstant(id: number) {
return defHttp.delete({ url: `/alert/instant/delete?id=${id}` })
}
// 获取模型实例数量 // 获取模型实例数量
export function getInstantCount() { export function getInstantCount() {
return defHttp.get({ url: '/alert/instant/count' }) return defHttp.get({ url: '/alert/instant/count' })

5
src/api/alert/run/model/index.ts

@ -12,7 +12,10 @@ export interface ModelVersionPageReqVO extends PageParam {
export function getModelPage(params: ModelPageReqVO) { export function getModelPage(params: ModelPageReqVO) {
return defHttp.get({ url: '/alert/model/page', params }) return defHttp.get({ url: '/alert/model/page', params })
} }
// 查询模型版本实例列表
export function getModelVersionPage(params: ModelPageReqVO) {
return defHttp.get({ url: '/alert/model/version/page', params })
}
// 查询模型版本列表-不分页 // 查询模型版本列表-不分页
export function getModelVersionList(params: ModelVersionPageReqVO) { export function getModelVersionList(params: ModelVersionPageReqVO) {
return defHttp.get({ url: '/alert/model/version/list', params }) return defHttp.get({ url: '/alert/model/version/list', params })

119
src/views/run/instant/CreateModal.vue

@ -1,32 +1,47 @@
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue' import {reactive, ref, watch} from 'vue'
import { Card, Divider, Steps } from 'ant-design-vue' import {Card, Divider, Steps} from 'ant-design-vue'
import ModalTable from '../model/ModelTable.vue' import ModalTable from '../model/ModelTable.vue'
import PointTable from '../model/PointTable.vue' import PointTable from '../model/PointTable.vue'
import { createInstantForm } from './instant.data' import {createInstantForm} from './instant.data'
import { useI18n } from '@/hooks/web/useI18n' import {useI18n} from '@/hooks/web/useI18n'
import { BasicModal, useModalInner } from '@/components/Modal' import {BasicModal, useModalInner} from '@/components/Modal'
import { BasicForm, useForm } from '@/components/Form' import {BasicForm, useForm} from '@/components/Form'
import { getModelVersionList } from '@/api/alert/run/model/index' import {getModelVersionList} from '@/api/alert/run/model/index'
import { getCalcGroupList } from '@/api/alert/run/calcgroup/index' import {getCalcGroupList} from '@/api/alert/run/calcgroup/index'
import { createInstant } from '@/api/alert/run/instant/index' import {createInstant} from '@/api/alert/run/instant/index'
import { useMessage } from '@/hooks/web/useMessage' import {useMessage} from '@/hooks/web/useMessage'
const emit = defineEmits(['success']) const emit = defineEmits(['success'])
const { createMessage } = useMessage()
const { t } = useI18n()
const [registerCreateModal, { setModalProps, closeModal }] = useModalInner(async (data) => { const props = defineProps({
setModalProps({ destroyOnClose: true, showCancelBtn: false, showOkBtn: false }) isDisabled: {
type: Boolean,
default: true,
}
})
const {createMessage} = useMessage()
const {t} = useI18n()
const [registerCreateModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
setModalProps({destroyOnClose: true, showCancelBtn: false, showOkBtn: false})
}) })
const current = ref<number>(0) const current = ref<number>(0)
function next() { function next() {
current.value++ current.value++
} }
function prev() { function prev() {
current.value-- current.value--
if (current.value == 0) {
console.log(state.selectedRowKeys)
console.log(state.selectedData)
}
} }
const steps = [ const steps = [
{ {
title: '壹', title: '壹',
@ -37,16 +52,16 @@ const steps = [
content: 'Second-content', content: 'Second-content',
}, },
] ]
const items = steps.map(item => ({ key: item.title, title: item.title })) const items = steps.map(item => ({key: item.title, title: item.title}))
const [registerForm, { validate, setFieldsValue, updateSchema, setProps }] = useForm({ const [registerForm, {validate, resetFields, setFieldsValue, updateSchema, setProps}] = useForm({
labelWidth: 100, labelWidth: 100,
schemas: createInstantForm, schemas: createInstantForm,
showSubmitButton: false, showSubmitButton: false,
showResetButton: false, showResetButton: false,
layout: 'horizontal', layout: 'horizontal',
actionColOptions: { span: 2 }, actionColOptions: {span: 2},
disabled: true, disabled: true,
}) })
@ -54,18 +69,37 @@ interface instantForms {
modelId?: string modelId?: string
mpName?: string mpName?: string
} }
const instantForm = reactive<instantForms>({ const instantForm = reactive<instantForms>({
modelId: '', modelId: '',
mpName: '', mpName: '',
}) })
// isDisabled
const isDisabled = ref<boolean>(true) const isDisabled = ref<boolean>(true)
// isDisabled
watch(() => props.isDisabled, (newVal) => {
if (newVal !== undefined) {
isDisabled.value = newVal
}
}, {immediate: true}) // immediatetrue
const state = reactive<any>({ const state = reactive<any>({
selectedRowKeys: [],
selectedData: [],
pointInfo: [], pointInfo: [],
type: false, type: false,
}) })
async function updatempName(selectedRowKeys, selectedRows) {
console.log(selectedRows.length)
async function updatempName(selectedRowKeys, selectedRows) {
console.log(selectedRowKeys)
console.log(selectedRows)
console.log(instantForm)
resetFields()
state.selectedRowKeys = selectedRowKeys;
state.selectedData = selectedRows;
//
if (selectedRows.length !== 0) { if (selectedRows.length !== 0) {
state.type = selectedRows[0].algorithm === 'ANN' state.type = selectedRows[0].algorithm === 'ANN'
console.log(state.type) console.log(state.type)
@ -76,31 +110,31 @@ async function updatempName(selectedRowKeys, selectedRows) {
p.algorithm = selectedRows[0].algorithm p.algorithm = selectedRows[0].algorithm
} }
} }
// //
isDisabled.value = selectedRows.length === 0 isDisabled.value = selectedRows.length === 0
console.log(isDisabled)
if (selectedRows.length === 0) if (selectedRows.length === 0)
setProps({ disabled: true }) setProps({disabled: true})
else else
setProps({ disabled: false }) setProps({disabled: false})
instantForm.modelId = selectedRows.length !== 0 ? `${selectedRows[0].id}` : `` instantForm.modelId = selectedRows.length !== 0 ? `${selectedRows[0].id}` : ``
instantForm.mpName = selectedRows.length !== 0 ? `${selectedRows[0].modelName}-实例` : `` instantForm.mpName = selectedRows.length !== 0 ? `${selectedRows[0].modelName}-实例` : ``
setFieldsValue(instantForm) setFieldsValue(instantForm)
const versionData = selectedRows.length !== 0 ? await getModelVersionList({ modelId: selectedRows[0].id }) : [] const versionData = selectedRows.length !== 0 ? await getModelVersionList({modelId: selectedRows[0].id}) : []
const versionList = [] as any const versionList = [] as any
// // // //
versionData.forEach((item) => { versionData.forEach((item) => {
versionList.push({ label: item.version, value: item.id }) versionList.push({label: `${item.version} (${item.conditionName})`, value: item.id})
}) })
const calcGroupData = selectedRows.length !== 0 ? await getCalcGroupList({ unitId: selectedRows[0].unitId }) : [] const calcGroupData = selectedRows.length !== 0 ? await getCalcGroupList({unitId: selectedRows[0].unitId}) : []
const calcGroupList = [] as any const calcGroupList = [] as any
// // // //
calcGroupData.forEach((item) => { calcGroupData.forEach((item) => {
calcGroupList.push({ label: item.groupName, value: item.id }) calcGroupList.push({label: item.groupName, value: item.id})
}) })
// //
@ -122,16 +156,19 @@ function onCanel() {
current.value = 0 current.value = 0
closeModal() closeModal()
} }
const loading = ref<boolean>(false) const loading = ref<boolean>(false)
const pointRef = ref() const pointRef = ref()
async function CompleteCreate() { async function CompleteCreate() {
try { try {
loading.value = true loading.value = true
// confirmLoading // confirmLoading
setModalProps({ confirmLoading: true, loading: true }) setModalProps({confirmLoading: true, loading: true})
const values = await validate() const values = await validate()
console.log(values)
// if (unref(isUpdate)) { // if (unref(isUpdate)) {
// await updateDemo02Category(values) // await updateDemo02Category(values)
// } else { // } else {
@ -146,33 +183,35 @@ async function CompleteCreate() {
emit('success') emit('success')
createMessage.success(t('common.saveSuccessText')) createMessage.success(t('common.saveSuccessText'))
} } finally {
finally {
closeModal() closeModal()
loading.value = false loading.value = false
// confirmLoading // confirmLoading
setModalProps({ confirmLoading: false, loading: false }) setModalProps({confirmLoading: false, loading: false})
} }
} }
</script> </script>
<template> <template>
<BasicModal v-bind="$attrs" title="新增模型实例" width="80%" @cancel="onCanel" @register="registerCreateModal"> <BasicModal v-bind="$attrs" title="新增模型实例" width="80%" @cancel="onCanel"
@register="registerCreateModal">
<Card title="实例信息"> <Card title="实例信息">
<BasicForm @register="registerForm" /> <BasicForm @register="registerForm" ref="instantFormRef"/>
</Card> </Card>
<Divider /> <Divider/>
<Steps :current="current" :items="items" /> <Steps :current="current" :items="items"/>
<div class="steps-content"> <div class="steps-content">
<ModalTable v-if="current === 0" @success="updatempName" /> <ModalTable v-if="current === 0" :selectedRowKeys="state.selectedRowKeys"
<PointTable v-if="current === 1" ref="pointRef" :data="state.pointInfo" :type="state.type" /> :selected-data="state.selectedData" @success="updatempName"/>
<PointTable v-if="current === 1" ref="pointRef" :data="state.pointInfo" :type="state.type"/>
</div> </div>
<!-- modal 底部区域插槽实现--替换原按钮 --> <!-- modal 底部区域插槽实现--替换原按钮 -->
<template #footer> <template #footer>
<div class="steps-action"> <div class="steps-action">
<a-button v-if="current < steps.length - 1 " :disabled="isDisabled" type="primary" @click="next"> <a-button v-if="current < steps.length - 1 " :disabled="isDisabled" type="primary"
@click="next">
下一步 下一步
</a-button> </a-button>
<a-button <a-button
@ -183,9 +222,9 @@ async function CompleteCreate() {
> >
完成 完成
</a-button> </a-button>
<!-- <a-button v-if="current > 0" style="margin-left: 8px" @click="prev"> <a-button v-if="current > 0" style="margin-left: 8px" @click="prev">
上一步+ 上一步
</a-button> --> </a-button>
</div> </div>
</template> </template>
</BasicModal> </BasicModal>

51
src/views/run/instant/index.vue

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Badge, Switch } from 'ant-design-vue' import { Tag,Badge, Switch } from 'ant-design-vue'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import HistoryModal from '../../exa/config/HistoryModal.vue' import HistoryModal from '../../exa/config/HistoryModal.vue'
@ -8,7 +8,7 @@ import CreateModal from './CreateModal.vue'
import UpdateModal from './UpdateModal.vue' import UpdateModal from './UpdateModal.vue'
import { BasicTable, TableAction, useTable } from '@/components/Table' import { BasicTable, TableAction, useTable } from '@/components/Table'
import { getInstantCount, getInstantPage, updateInstant } from '@/api/alert/run/instant' import { getInstantCount, getInstantPage, updateInstant,deleteInstant } from '@/api/alert/run/instant'
import { getExaNow } from '@/api/alert/exa' import { getExaNow } from '@/api/alert/exa'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { router } from '@/router' import { router } from '@/router'
@ -72,7 +72,7 @@ function handleEdit(record: Recordable) {
openUpdateModal(true, { record, isUpdate: true }) openUpdateModal(true, { record, isUpdate: true })
} }
async function handleDelete(record: Recordable) { async function handleDelete(record: Recordable) {
await deleteRole(record.id) await deleteInstant(record.id)
createMessage.success(t('common.delSuccessText')) createMessage.success(t('common.delSuccessText'))
reload() reload()
} }
@ -132,6 +132,10 @@ async function getNow() {
getExaNow(pointCode).then((result) => { getExaNow(pointCode).then((result) => {
updateTableDataRecord(item.id, Object.assign(item, { pointSte: result })) updateTableDataRecord(item.id, Object.assign(item, { pointSte: result }))
}) })
.catch((error) => {
console.error('Error:', error)
updateTableDataRecord(item.id, Object.assign(item, { pointSte: pointCode }))
})
}) })
} }
@ -159,7 +163,7 @@ function handleWarnConfig(record: Recordable) {
<!-- 统计量点击跳转历史曲线 --> <!-- 统计量点击跳转历史曲线 -->
<template #history="{ record }"> <template #history="{ record }">
<a @click="handleHistory(record)"> <a @click="handleHistory(record)">
{{ record.pointSte }} {{(JSON.parse(record.instantInfo)).model_state}}
</a> </a>
<!-- <SlidersOutlined class="click-status" /> --> <!-- <SlidersOutlined class="click-status" /> -->
</template> </template>
@ -188,22 +192,29 @@ function handleWarnConfig(record: Recordable) {
/> />
</template> </template>
<template #runStatus="{ record }"> <template #runStatus="{ record }">
<div v-if="record.runningLog === '模式已停运'"> <Tag v-if="record.runningLog === '模式已停运'" color="default">模式已停运</Tag>
<span style="color:black">模式已停运</span> <Tag v-else-if="record.running === '0'" color="red">运行失败</Tag>
</div> <Tag v-else-if="record.runningLog === '模式外运行'" color="blue">模式外运行</Tag>
<div v-else-if="record.running === '0'"> <Tag v-else-if="record.isUpdate === '1'" color="orange">版本更新</Tag>
<span style="color:red">运行失败</span> <Tag v-else-if="record.runningLog === '运行正常'" color="green">正常运行</Tag>
</div>
<div v-else-if="record.runningLog === '模式外运行'">
<span style="color:#0B55A4">模式外运行</span>
</div>
<div v-else-if="record.isUpdate === '1'">
<span style="color:orange">版本更新</span>
</div>
<div v-else>
<span style="color:green">正常运行</span>
</div>
</template> </template>
<!-- <template #runStatus="{ record }">-->
<!-- <div v-if="record.runningLog === '模式已停运'">-->
<!-- <span style="color:black">模式已停运</span>-->
<!-- </div>-->
<!-- <div v-else-if="record.running === '0'">-->
<!-- <span style="color:red">运行失败</span>-->
<!-- </div>-->
<!-- <div v-else-if="record.runningLog === '模式外运行'">-->
<!-- <span style="color:#0B55A4">模式外运行</span>-->
<!-- </div>-->
<!-- <div v-else-if="record.isUpdate === '1'">-->
<!-- <span style="color:orange">版本更新</span>-->
<!-- </div>-->
<!-- <div v-else-if="record.runningLog === '运行正常'">-->
<!-- <span style="color:green">正常运行</span>-->
<!-- </div>-->
<!-- </template>-->
<template #status="{ record }"> <template #status="{ record }">
<Switch <Switch
v-model:checked="record.status" :checked-value="1" :un-checked-value="0" checked-children="开" v-model:checked="record.status" :checked-value="1" :un-checked-value="0" checked-children="开"
@ -234,7 +245,7 @@ function handleWarnConfig(record: Recordable) {
</template> </template>
</BasicTable> </BasicTable>
<HistoryModal :item-name="itemName" :legend-name="legendName" @register="registerHistoryModal" /> <HistoryModal :item-name="itemName" :legend-name="legendName" @register="registerHistoryModal" />
<CreateModal :item-name="itemName" :legend-name="legendName" @register="registerCreateModal" @success="reload" /> <CreateModal :is-disabled="true" @register="registerCreateModal" @success="reload" />
<UpdateModal @register="registerUpdateModal" @success="reload" /> <UpdateModal @register="registerUpdateModal" @success="reload" />
</div> </div>
</template> </template>

42
src/views/run/model/ModelTable.vue

@ -1,23 +1,50 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, reactive, ref, watch } from 'vue' import { onMounted, reactive, ref, watch,computed} from 'vue'
import { columns, searchFormSchema } from './model.data' import { columns, searchFormSchema } from './model.data'
import { BasicTable, TableAction, useTable } from '@/components/Table' import { BasicTable, TableAction, useTable } from '@/components/Table'
import { getModelPage } from '@/api/alert/run/model' import {getModelPage, getModelVersionPage} from '@/api/alert/run/model'
import { IconEnum } from '@/enums/appEnum' import { IconEnum } from '@/enums/appEnum'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
defineOptions({ name: 'ModelTable' }) defineOptions({ name: 'ModelTable' })
const emit = defineEmits(['success']) const emit = defineEmits(['success'])
const props = defineProps({
selectedRowKeys: { type: Array<number>, default: [] },
selectedData: { type: Array<Recordable>, default: [] },
})
const selectedData = ref<Recordable[]>(props.selectedData)
interface RowKeys {
selectedRowKeys: number[]
}
const state = reactive<RowKeys>({
selectedRowKeys: props.selectedRowKeys
})
const { t } = useI18n() const { t } = useI18n()
watch(
() => props.selectedRowKeys,
() => {
setSelectedRowKeys(props.selectedRowKeys)
setSelectedRows(props.selectedData)
state.selectedRowKeys = props.selectedRowKeys
console.log(state.selectedRowKeys)
selectedData.value=props.selectedData
},
)
const [registerTable, { setSelectedRowKeys }] = useTable({ const [registerTable, { getSelectRows,setSelectedRowKeys,setSelectedRows }] = useTable({
title: '模型列表', title: '模型版本列表',
api: getModelPage, api: getModelPage,
rowKey: 'id', rowKey: 'id',
rowSelection: { type: 'radio', async onChange(selectedRowKeys, selectedRows) { rowSelection: {
type: 'radio', async onChange(selectedRowKeys, selectedRows) {
console.log(selectedRowKeys, selectedRows)
emit('success', selectedRowKeys, selectedRows) emit('success', selectedRowKeys, selectedRows)
} }, },
},
size: 'small', size: 'small',
immediate: true, immediate: true,
columns, columns,
@ -35,6 +62,9 @@ const [registerTable, { setSelectedRowKeys }] = useTable({
}) })
onMounted(async () => { onMounted(async () => {
setSelectedRowKeys(props.selectedRowKeys)
setSelectedRows(props.selectedData)
}) })
// watch( // watch(

7
src/views/run/model/model.data.ts

@ -23,23 +23,24 @@ export const columns: BasicColumn[] = [
width: 250, width: 250,
fixed: 'left', fixed: 'left',
}, },
{ {
title: '算法', title: '算法',
dataIndex: 'algorithmName', dataIndex: 'algorithmName',
width: 200, width: 120,
}, },
{ {
title: '测点个数', title: '测点个数',
dataIndex: 'pointNumber', dataIndex: 'pointNumber',
width: 200, width: 100,
slots: { customRender: 'pointNumber' }, slots: { customRender: 'pointNumber' },
}, },
{ {
title: '模型精度', title: '模型精度',
dataIndex: 'precision', dataIndex: 'precision',
width: 200, width: 100,
slots: { customRender: 'precision' }, slots: { customRender: 'precision' },
}, },
] ]

Loading…
Cancel
Save