feat: 故障管理-专家库

master
李小林 6 months ago
parent 568c8e8b30
commit b8d2cad598
  1. 66
      src/api/fault/index.ts
  2. 25
      src/api/fault/types.ts
  3. 674
      src/views/family/operate/fault-management/components/AdvancedQueries.vue
  4. 10
      src/views/family/operate/fault-management/components/Diagnosis.vue
  5. 120
      src/views/family/operate/fault-management/components/ExpertLib.vue
  6. 119
      src/views/family/operate/fault-management/components/ExpertLibForm.vue
  7. 6
      src/views/family/operate/fault-management/components/ServiceEndpointStatus.vue
  8. 24
      src/views/family/operate/fault-management/index.vue

@ -1,5 +1,13 @@
import request from "@/utils/request";
import { FaultBasicInfoVO, FaultDiagnosisResult, FaultQuery, FaultQueryVO } from "@/api/fault/types";
import {
AlgForm,
CpeForm, ExpertLibForm,
ExpertLibPageResult,
FaultBasicInfoVO,
FaultDiagnosisResult,
FaultQuery,
FaultQueryVO
} from "@/api/fault/types";
import { AxiosPromise } from "axios";
export function faultQueryList(data: FaultQuery): AxiosPromise<FaultQueryVO[]> {
@ -44,3 +52,59 @@ export function faultServiceStatus(
},
});
}
export function updateAlg(data: AlgForm, devId?: number) {
return request({
url: "/api/fault/v1/update-alg",
method: "POST",
params: {
devId,
},
data,
});
}
export function updateCpe(data: CpeForm, devId?: number) {
return request({
url: "/api/fault/v1/update-cpe",
method: "POST",
params: {
devId,
},
data,
});
}
export function getExpertLibPage(
data: PageQuery
): AxiosPromise<ExpertLibPageResult> {
return request({
url: "/api/expert/v1/query",
method: "POST",
data,
});
}
export function deleteExpertLib(code?: string){
return request({
url: `/api/expert/v1/delete/${code}`,
method: "DELETE",
});
}
export function addExpertLib(data: ExpertLibForm){
return request({
url: `/api/expert/v1/add`,
method: "POST",
data,
});
}
export function getExpertLib(code?: string): AxiosPromise<ExpertLibForm> {
return request({
url: `/api/expert/v1/${code}`,
method: "GET",
});
}
export function updateExpertLib(data: ExpertLibForm){
return request({
url: `/api/expert/v1/edit`,
method: "POST",
data,
});
}

@ -46,3 +46,28 @@ export interface FaultDiagnosisResult {
endTime?: string;
}
export interface AlgForm {
h323Enable?: string;
sIPEnable?: string;
rTSPEnable?: string;
l2TPEnable?: string;
iPSECEnable?: string;
}
export interface CpeForm {
cpeNum?: number;
}
export interface ExpertLibVO {
expertSuggestId?: string;
expertSuggestText?: string;
expertSuggestDesc?: string;
}
export type ExpertLibPageResult = PageResult<ExpertLibVO[]>;
export interface ExpertLibForm {
expertSuggestId?: string;
expertSuggestText?: string;
expertSuggestDesc?: string;
}

@ -0,0 +1,674 @@
<template>
<div v-loading="loading">
<el-descriptions direction="vertical" border :column="6">
<template #title>
<el-button
type="primary"
link
:icon="Grid"
:disabled="prop.devId === 0"
@click="advanceQuery('AlgQuery')"
>ALG功能开启
</el-button>
</template>
<el-descriptions-item
label="H323开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ enableEnum(alg["serviceList"]) }}
</el-descriptions-item>
<el-descriptions-item
label=" SIP开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ enableEnum(alg["SIPEnable"]) }}
</el-descriptions-item>
<el-descriptions-item
label=" RTSP开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>{{ enableEnum(alg["RTSPEnable"]) }}
</el-descriptions-item>
<el-descriptions-item
label="L2TP开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ enableEnum(alg["L2TPEnable"]) }}
</el-descriptions-item>
<el-descriptions-item
label="IPSEC开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ enableEnum(alg["IPSECEnable"]) }}
</el-descriptions-item>
<el-descriptions-item
label="ALG操作"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<el-button
type="primary"
link
:icon="Edit"
@click="openAlgForm"
v-if="alg['state'] === '2' && alg['state'] != undefined"
>修改</el-button
>
</el-descriptions-item>
<el-descriptions-item
label-align="center"
align="left"
label-class-name="my-label-none"
class-name="my-content"
width="150px"
v-if="alg['state'] != '2' && alg['state'] != undefined"
>
<div style="color: red; padding: 0 8px; font-size: 10px">
错误信息{{ alg["result"] }}
</div>
</el-descriptions-item>
</el-descriptions>
<el-descriptions direction="vertical" border :column="12">
<template #title>
<el-button
type="primary"
link
:icon="Grid"
:disabled="prop.devId === 0"
@click="advanceQuery('WLanInfoQuery')"
>WLAN详细信息
</el-button>
</template>
<el-descriptions-item
label="SSID名称"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="240px"
>
<div v-if="wlan['SSID'] != undefined">
<div
:style="
index != wlan['SSID'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['SSID'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="功率级别"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['Signal'] != undefined">
<div
:style="
index != wlan['Signal'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['Signal'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="隐藏/广播"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['SSIDHide'] != undefined">
<div
:style="
index != wlan['SSIDHide'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['SSIDHide'].split(':')"
:key="index"
>
{{ SSSIdHide(item) }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="WLAN开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['APModuleEnable'] != undefined">
<div
:style="
index != wlan['APModuleEnable'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['APModuleEnable'].split(':')"
:key="index"
>
{{ SSSIdStatus(item) }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="加密方式"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['BeaconType'] != undefined">
<div
:style="
index != wlan['BeaconType'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['BeaconType'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="认证方式"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['WEPAuthenticationMode'] != undefined">
<div
:style="
index != wlan['WEPAuthenticationMode'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['WEPAuthenticationMode'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label=" WPS关键字"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['KeyWord'] != undefined">
<div
:style="
index != wlan['KeyWord'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['KeyWord'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="信道"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['ChannelsInUse'] != undefined">
<div
:style="
index != wlan['ChannelsInUse'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['ChannelsInUse'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="当前功率(dBm)"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="180px"
>
<div v-if="wlan['PowerValue'] != undefined">
<div
:style="
index != wlan['PowerValue'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['PowerValue'].split(':')"
:key="index"
>
{{ item }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="SSID开关"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['Status'] != undefined">
<div
:style="
index != wlan['Status'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['Status'].split(':')"
:key="index"
>
{{ SSSIdStatus(item) }}
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="操作"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['SSID'] != undefined">
<div
:style="
index != wlan['SSID'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['SSID'].split(':')"
:key="index"
>
<el-button type="primary" link :icon="Edit">无线设置</el-button>
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label="隐藏广播"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<div v-if="wlan['SSID'] != undefined">
<div
:style="
index != wlan['SSID'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['SSID'].split(':')"
:key="index"
>
<el-button type="primary" link :icon="Edit">隐藏广播</el-button>
</div>
</div>
</el-descriptions-item>
<el-descriptions-item
label-align="center"
align="left"
label-class-name="my-label-none"
class-name="my-content"
width="150px"
v-if="wlan['state'] != '2' && wlan['state'] != undefined"
>
<div style="color: red; padding: 0 8px; font-size: 10px">
错误信息{{ wlan["result"] }}
</div>
</el-descriptions-item>
</el-descriptions>
<el-descriptions direction="vertical" border :column="2">
<template #title>
<el-button
type="primary"
link
:icon="Grid"
:disabled="prop.devId === 0"
@click="advanceQuery('CpeNumberQuery')"
>终端上网查询
</el-button>
</template>
<el-descriptions-item
label="上网数目"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
{{ cpe["TotalTerminalNumber"] }}
</el-descriptions-item>
<el-descriptions-item
label="上网操作"
label-align="center"
align="center"
label-class-name="my-label"
class-name="my-content"
width="150px"
>
<el-button
type="primary"
link
:icon="Edit"
@click="openCpe"
v-if="cpe['state'] === '2' && cpe['state'] != undefined"
>修改</el-button
>
</el-descriptions-item>
<el-descriptions-item
label-align="center"
align="left"
label-class-name="my-label-none"
class-name="my-content"
width="150px"
v-if="alg['state'] != '2' && alg['state'] != undefined"
>
<div style="color: red; padding: 0 8px; font-size: 10px">
错误信息{{ alg["result"] }}
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<el-dialog v-model="algFlag" class="com-dialog" title="修改ALG">
<el-form :model="algForm" ref="algFormRef" v-loading="algFormLoading">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="H323开关" prop="h323Enable">
<el-select v-model="algForm.h323Enable">
<el-option
v-for="(item, index) in algOption"
:label="item.label"
:value="item.value"
:key="index"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="SIP开关" prop="sIPEnable">
<el-select v-model="algForm.sIPEnable">
<el-option
v-for="(item, index) in algOption"
:label="item.label"
:value="item.value"
:key="index"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="RTSP开关" prop="rTSPEnable">
<el-select v-model="algForm.rTSPEnable">
<el-option
v-for="(item, index) in algOption"
:label="item.label"
:value="item.value"
:key="index"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="L2TP开关" prop="l2TPEnable">
<el-select v-model="algForm.l2TPEnable">
<el-option
v-for="(item, index) in algOption"
:label="item.label"
:value="item.value"
:key="index"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="IPSEC开关" prop="iPSECEnable">
<el-select v-model="algForm.iPSECEnable">
<el-option
v-for="(item, index) in algOption"
:label="item.label"
:value="item.value"
:key="index"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button type="primary" @click="algSubmit">确定</el-button>
<el-button @click="algFlag = false">取消</el-button>
</template>
</el-dialog>
<el-dialog class="com-dialog" title="终端上网修改" v-model="cpeFlag">
<el-form :model="cpeForm" ref="cpeFormRef" v-loading="cpeFormLoading">
<el-form-item
label="上网数目"
prop="cpeNum"
:rules="[
{ required: true, message: '请输入上网数目' },
{ type: 'number', message: '参数类型只能为整数类型' },
]"
>
<el-input
v-model.number="cpeForm.cpeNum"
placeholder="请输入上网数目"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="cpeSubmitForm(cpeFormRef)"
>确认</el-button
>
<el-button @click="cpeFlag = false">取消</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { Edit, Grid } from "@element-plus/icons-vue";
import { faultServiceStatus, updateAlg, updateCpe } from "@/api/fault";
import { AlgForm, CpeForm } from "@/api/fault/types";
import { FormInstance } from "element-plus";
import { confirm } from "@/utils/confirm";
const prop = defineProps<{
devId?: number;
}>();
const loading = ref<boolean>(false);
const alg = ref<any>({});
const wlan = ref<any>({});
const cpe = ref<any>({});
const algFlag = ref<boolean>(false);
const algForm = ref<AlgForm>({});
const algFormRef = ref<FormInstance>();
const algFormLoading = ref<boolean>(false);
const algOption = ref<OptionType[]>([
{ label: "开启", value: "true" },
{ label: "关闭", value: "false" },
]);
const cpeFlag = ref<boolean>(false);
const cpeForm = ref<CpeForm>({});
const cpeFormRef = ref<FormInstance>();
const cpeFormLoading = ref<boolean>(false);
const openAlgForm = () => {
resetForm(algFormRef.value);
algForm.value.h323Enable = alg.value["serviceList"];
algForm.value.sIPEnable = alg.value["SIPEnable"];
algForm.value.rTSPEnable = alg.value["RTSPEnable"];
algForm.value.l2TPEnable = alg.value["L2TPEnable"];
algForm.value.iPSECEnable = alg.value["IPSECEnable"];
algFlag.value = true;
};
const openCpe = () => {
resetForm(cpeFormRef.value);
cpeForm.value.cpeNum = parseInt(cpe.value["TotalTerminalNumber"]);
cpeFlag.value = true;
};
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
};
const algSubmit = () => {
confirm("确定修改ALG吗?", () => {
algFormLoading.value = true;
console.log(algForm.value);
updateAlg(algForm.value, prop.devId)
.then(() => {
ElMessage.success({ duration: 1000, message: "操作成功" });
})
.finally(() => {
algFormLoading.value = false;
});
});
};
const cpeSubmitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.validate((valid) => {
if (valid) {
confirm("确认修改吗?", () => {
cpeFormLoading.value = true;
updateCpe(cpeForm.value, prop.devId)
.then(() => {
ElMessage.success({ duration: 1000, message: "操作成功" });
cpeFlag.value = false;
})
.finally(() => {
cpeFormLoading.value = false;
});
});
} else {
console.log("error");
}
});
};
function enableEnum(str?: string) {
if (str) {
switch (str) {
case "true":
return "开启";
case "false":
return "关闭";
}
}
}
function SSSIdHide(str?: string) {
if (str) {
switch (str) {
case "1":
return "隐藏";
default:
return "广播";
}
}
}
function SSSIdStatus(str?: string) {
if (str) {
switch (str) {
case "true":
return "开启";
case "1":
return "开启";
default:
return "关闭";
}
}
}
const advanceQuery = (remote: string) => {
loading.value = true;
faultServiceStatus(prop.devId, remote)
.then(({ data }) => {
switch (remote) {
case "AlgQuery":
alg.value = data;
break;
case "WLanInfoQuery":
wlan.value = data;
break;
case "CpeNumberQuery":
cpe.value = data;
break;
}
})
.finally(() => {
loading.value = false;
});
};
</script>
<style scoped>
:deep(.my-content) {
height: 32px;
}
:deep(
.el-descriptions__body
.el-descriptions__table.is-bordered
.el-descriptions__cell
) {
padding: 8px 0;
}
</style>

@ -27,8 +27,8 @@
class-name="my-content"
width="150px"
>
<div class="my-content">
进行{{ name }} 综合诊断{{ result.endTime }}
<div class="result-content">
进行{{ name }} 综合诊断 &nbsp;{{ result.endTime }}
</div>
</el-descriptions-item>
<el-descriptions-item
@ -38,7 +38,7 @@
class-name="my-content"
width="150px"
>
<div class="my-content">测试结果 : {{ result.testResult }}</div>
<div class="result-content">测试结果 : {{ result.testResult }}</div>
</el-descriptions-item>
<el-descriptions-item
label-align="left"
@ -47,7 +47,7 @@
class-name="my-content"
width="150px"
>
<div class="my-content">
<div class="result-content">
修复建议 :
<span style="color: red; font-size: 10px">{{
result.errorDesc
@ -91,7 +91,7 @@ const openDiagnosis = (remote: string) => {
display: none !important;
background: var(--el-color-white) !important;
}
.my-content {
.result-content {
font-size: 14px;
color: var(--el-text-color-regular);
}

@ -0,0 +1,120 @@
<template>
<el-card shadow="never">
<template #header>
<div class="flex justify-between">
<div style="display: flex; align-items: center">
<el-icon size="15"> <Grid /> </el-icon>&nbsp;<span
style="font-weight: 500; font-size: 14px; line-height: 16px"
>专家库列表</span
>
</div>
<div>
<el-button
type="primary"
:icon="Plus"
@click="openExpertLibForm('新增专家库', undefined)"
>新增</el-button
>
</div>
</div>
</template>
<div class="any-table">
<el-table :data="tableData" border v-loading="loading">
<el-table-column label="原因码" align="center" prop="expertSuggestId" />
<el-table-column
label="故障描述"
align="center"
prop="expertSuggestText"
/>
<el-table-column
label="分析和建议"
align="center"
prop="expertSuggestDesc"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
:icon="Edit"
@click="
openExpertLibForm('专家库修改', scope.row.expertSuggestId)
"
>
修改
</el-button>
<el-button
link
type="danger"
:icon="Delete"
@click="handleDelete(scope.row.expertSuggestId)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-if="total > 0"
v-model:total="total"
v-model:page="page.pageNum"
v-model:limit="page.pageSize"
@pagination="getData"
/>
</div>
</el-card>
<expert-lib-form ref="expertLibFormRef" @success="getData" />
</template>
<script setup lang="ts">
import { Delete, Edit, Grid, Plus } from "@element-plus/icons-vue";
import { ExpertLibVO } from "@/api/fault/types";
import { deleteExpertLib, getExpertLibPage } from "@/api/fault";
import { confirm } from "@/utils/confirm";
import ExpertLibForm from "@/views/family/operate/fault-management/components/ExpertLibForm.vue";
const tableData = ref<ExpertLibVO[]>([]);
const page = ref<PageQuery>({
pageNum: 1,
pageSize: 10,
});
const total = ref<number>(0);
const loading = ref<boolean>(false);
const expertLibFormRef = ref();
const getData = () => {
loading.value = true;
getExpertLibPage(page.value)
.then(({ data }) => {
tableData.value = data.list;
total.value = data.total;
})
.finally(() => {
loading.value = false;
});
};
const handleDelete = (code?: string) => {
confirm("确定删除吗", () => {
loading.value = true;
deleteExpertLib(code)
.then(() => {
ElMessage.success({
message: "操作成功",
duration: 1000,
onClose: () => {
getData();
},
});
})
.finally(() => {
loading.value = false;
});
});
};
const openExpertLibForm = (title: string, code?: string) => {
expertLibFormRef.value.openExpert(title, code);
};
onMounted(() => {
getData();
});
</script>
<style scoped></style>

@ -0,0 +1,119 @@
<template>
<el-dialog class="com-dialog" :title="title" v-model="expertLibFormFlag">
<el-form
:model="formData"
ref="ruleFormRef"
:rules="rules"
v-loading="loading"
label-position="top"
>
<el-form-item label="故障描述" prop="expertSuggestText">
<el-input
v-model="formData.expertSuggestText"
type="textarea"
placeholder="请输入故障描述"
/>
</el-form-item>
<el-form-item label="分析和建议" prop="expertSuggestDesc">
<el-input
v-model="formData.expertSuggestDesc"
type="textarea"
placeholder="请输入分析和建议"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm(ruleFormRef)"
>确定</el-button
>
<el-button @click="expertLibFormFlag = false">取消</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ExpertLibForm } from "@/api/fault/types";
import { FormInstance, FormRules } from "element-plus";
import { addExpertLib, getExpertLib, updateExpertLib } from "@/api/fault";
const expertLibFormFlag = ref<boolean>(false);
const title = ref<string>();
const loading = ref<boolean>(false);
const formData = ref<ExpertLibForm>({});
const ruleFormRef = ref<FormInstance>();
const rules = reactive<FormRules<ExpertLibForm>>({
expertSuggestDesc: [
{ required: true, message: "请输入分析和建议", trigger: "blur" },
],
expertSuggestText: [
{ required: true, message: "请输入故障描述", trigger: "blur" },
],
});
const openExpert = (title_: string, code_?: string) => {
resetForm(ruleFormRef.value);
formData.value = {};
title.value = title_;
if (code_) {
loading.value = true;
getExpertLib(code_)
.then(({ data }) => {
formData.value = data;
})
.finally(() => {
loading.value = false;
});
}
expertLibFormFlag.value = true;
};
defineExpose({ openExpert });
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
};
const emit = defineEmits(["success"]);
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
loading.value = true;
let code = formData.value.expertSuggestId;
if (code) {
updateExpertLib(formData.value)
.then(() => {
ElMessage.success({
message: "操作成功",
duration: 1000,
onClose: () => {
emit("success");
expertLibFormFlag.value = false;
},
});
})
.finally(() => {
loading.value = false;
});
} else {
addExpertLib(formData.value)
.then(() => {
ElMessage.success({
message: "操作成功",
duration: 1000,
onClose: () => {
emit("success");
expertLibFormFlag.value = false;
},
});
})
.finally(() => {
loading.value = false;
});
}
} else {
console.log("error submit!", fields);
}
});
};
</script>
<style scoped></style>

@ -264,14 +264,14 @@
class-name="my-content"
width="150px"
>
<div v-if="wlan['WPAEncryptionModes'] != undefined">
<div v-if="wlan['BeaconType'] != undefined">
<div
:style="
index != wlan['WPAEncryptionModes'].split(':').length - 1
index != wlan['BeaconType'].split(':').length - 1
? 'border-bottom: var(--el-descriptions-table-border)'
: ''
"
v-for="(item, index) in wlan['WPAEncryptionModes'].split(':')"
v-for="(item, index) in wlan['BeaconType'].split(':')"
:key="index"
>
{{ item }}

@ -89,12 +89,12 @@
>
高级查询
</div>
<div
@click="changTab(4)"
:class="'tags-item ' + (isActive(4) ? 'active' : '')"
>
健康库
</div>
<!-- <div-->
<!-- @click="changTab(4)"-->
<!-- :class="'tags-item ' + (isActive(4) ? 'active' : '')"-->
<!-- >-->
<!-- 健康库-->
<!-- </div>-->
<div
@click="changTab(5)"
:class="'tags-item ' + (isActive(5) ? 'active' : '')"
@ -111,9 +111,13 @@
<service-endpoint-status :dev-id="currentFaultQueryVO.devId" />
</div>
<div v-show="currentTab === 2">故障诊断应用</div>
<div v-show="currentTab === 3">高级查询</div>
<div v-show="currentTab === 4">健康库</div>
<div v-show="currentTab === 5">专家库</div>
<div v-show="currentTab === 3">
<advanced-queries :dev-id="currentFaultQueryVO.devId" />
</div>
<!-- <div v-show="currentTab === 4">健康库</div>-->
<div v-show="currentTab === 5">
<expert-lib />
</div>
</div>
</el-card>
</div>
@ -125,6 +129,8 @@ import { FaultQuery, FaultQueryVO } from "@/api/fault/types";
import { faultQueryList } from "@/api/fault";
import { Close } from "@element-plus/icons-vue";
import ServiceEndpointStatus from "@/views/family/operate/fault-management/components/ServiceEndpointStatus.vue";
import AdvancedQueries from "@/views/family/operate/fault-management/components/AdvancedQueries.vue";
import ExpertLib from "@/views/family/operate/fault-management/components/ExpertLib.vue";
defineOptions({
name: "FaultManagement",

Loading…
Cancel
Save