Commit dd5821ad authored by 张俊's avatar 张俊
parents dc06204c d4cb7dd6
......@@ -33,7 +33,8 @@ steps: # 定义流水线执行步骤,这些步骤将顺序执行
commands:
# - npm install -g cnpm --registry=https://registry.npm.taobao.org
# - cnpm install
- yarn
- npm install -g cnpm --registry=https://registry.npm.taobao.org
- cnpm install
- export NODE_ENV=production
- yarn build
......
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"GitCommitPlugin.ShowEmoji": false,
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"volar.inlayHints.eventArgumentInInlineHandlers": false,
// "path-intellisense.mappings": {
// "@": "${workspaceFolder}/src"
// },
"path-intellisense.mappings": {
"@": "${workspaceFolder}/src"
},
// 文件保存自动格式化
"editor.formatOnSave": true,
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"vue.codeActions.enabled": false
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
\ No newline at end of file
<template>
<Codemirror
v-model="code"
:placeholder="placeholder"
:style="{ ...options.style, ...options.style }"
class="code-style"
:mode="options.mode"
:disabled="disabled"
:spellcheck="options.spellcheck"
:indentWithTab="options.indentWithTab"
:autofocus="options.autofocus"
:tabSize="options.tabSize"
:extensions="options.extensions"
@change="Change($event)"
@blur="Blur($event)" />
</template>
<script setup>
import { Codemirror } from "vue-codemirror";
import { oneDark } from "@codemirror/theme-one-dark";
import { ref, watch, reactive, nextTick } from "vue";
const jsonData = ref("");
const options = reactive({
style: { height: "100%" },
mode: "text/x-c++src",
spellcheck: true,
autofocus: true,
indentWithTab: true,
tabSize: 2,
extensions: [oneDark],
});
const props = defineProps({
modelValue: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
placeholder: {
type: String,
default: "请输入表达式",
},
});
const code = ref("");
watch(
() => props.modelValue,
(n) => {
code.value = n;
},
{
immediate: true,
}
);
const emits = defineEmits(["update:modelValue", "change", "blur"]);
const Change = async ($event) => {
await nextTick();
emits("update:modelValue", code.value);
emits("change", { $event, value: code.value });
};
const Blur = async ($event) => {
await nextTick();
emits("update:modelValue", code.value);
emits("blur", { $event, value: code.value });
};
</script>
<style lang="scss" scoped>
.code-style {
text-align: left;
}
</style>
<style>
.cm-editor {
border-radius: 4px;
overflow: hidden;
}
</style>
......@@ -21,6 +21,7 @@ import BgTags from "./bg-tags.vue";
import BgSwitch from "./bg-switch.vue";
import BgRichText from "./bg-rich-text.vue";
import BgCodeEditor from "./bg-code-editor.vue";
import BgCodemirror from "./bg-codemirror.vue";
import BgFilter from "./bg-filter.vue";
import BgSort from "./bg-sort.vue";
import BgFilterDate from "./bg-filter-date.vue";
......@@ -58,6 +59,7 @@ const components = {
BgSwitch, // 开关
BgRichText, // 富文本
BgCodeEditor, //代码输入
BgCodemirror, //代码输入
BgFilter, // 首页筛选
BgSort, // 首页排序
BgFilterDate,
......
......@@ -4,12 +4,7 @@
<GapTitle title="手动下发"></GapTitle>
</template>
<div class="manual-distribution">
<Form
labelWidth="80px"
:methodLists="ORDER_METHODS"
:history="history"
:user_list_url="user_list_url"
ref="form" />
<Form labelWidth="80px" :methodLists="ORDER_METHODS" :history="history" ref="form" :is_all="is_all" />
</div>
<template #footer>
<el-button size="default" @click="Close">关闭</el-button>
......@@ -61,6 +56,8 @@ const history = computed(() => {
*/
return props.row?.history || null;
});
const is_all = computed(() => props.is_all);
const emits = defineEmits(["update:visible"]);
const form = ref(null);
// 关闭调用
......
import { createI18n } from "vue-i18n/index";
import lang from "./index";
import { createI18n } from "vue-i18n/index.js";
import lang from "./index.js";
const i18n = createI18n({
locale: localStorage.lang || "zh",
......
......@@ -7,7 +7,7 @@ import { ElMessage } from "element-plus";
import mavonEditor from "mavon-editor";
import "mavon-editor/dist/css/index.css";
import locale from "element-plus/lib/locale/lang/zh-cn";
import locale from "element-plus/dist/locale/zh-cn.mjs";
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
......@@ -29,7 +29,7 @@ import "../src/assets/item.css";
import store from "@/store";
import i18n from "./i18n/i18n.js";
// import i18n from "./i18n/i18n.js";
import axios from "./request/http.js";
import api from "./request/api.js";
......@@ -116,7 +116,7 @@ Promise.all([getUser(), getMenu("1e99371c-187f-4966-94cf-32f116f42ce6")])
console.error(e);
})
.finally(() => {
createVue.use(ElementPlus, { locale }).use(store).use(router).use(i18n).use(bgui).use(mavonEditor);
createVue.use(ElementPlus, { locale }).use(store).use(router).use(bgui).use(mavonEditor);
createVue.mount("#app");
});
......
......@@ -23,6 +23,7 @@
<div class="info">
<div class="indicator-expression">
<bg-code-editor v-model="info.indicator_expression" disabled></bg-code-editor>
<!-- <bg-codemirror :disabled="true" v-model="info.indicator_expression"></bg-codemirror> -->
</div>
</div>
<gap-title :hasLine="true" title="预警范围"></gap-title>
......@@ -129,7 +130,6 @@ const rule_data = ref({});
const ruleTypeOptions = ref({});
const getRuleTypeOptions = async () => {
ruleTypeOptions.value = await GetRuleTypeOptions();
console.log("ruleTypeOptions.value: ", ruleTypeOptions.value);
getInfoData();
};
const advanced_label = [
......
......@@ -34,7 +34,7 @@ const SaveSubmit = async () => {
});
};
const Cancle = () => {
router.go(-1);
router.push(`/forewarning/indicator-config?class_id=${class_id}`);
};
const getInfoData = () => {
axios
......
......@@ -2,20 +2,38 @@
<div class="detail_container">
<bg-breadcrumb></bg-breadcrumb>
<div class="detail_container-main">
<Slide v-model="node" />
<Slide v-model="nodeData" />
<div class="main-content">
<bg-filter-group @search="changeSearch" v-model="filter.metric_name" placeholder="请输入指标名称">
<template v-slot:left_action>
<div class="apaas_button">
<el-button type="primary" @click="addRule">
<el-button
type="primary"
class="add-btn"
@click="addRule"
:disabled="nodeData?.node?.level == 1"
:style="[noType ? 'cursor: not-allowed' : '']">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-add"></bg-icon>
新增
</el-button>
<el-button type="default" @click="batchDelete">批量删除</el-button>
<span class="header_info">
已选择 <span style="color: #202531; font-weight: bold"> {{ state.selected.length }} </span>
<el-button
type="default"
@click="batchDelete"
:disabled="nodeData?.node?.level == 1"
:style="[noType ? 'cursor: not-allowed' : '']">
批量删除
</el-button>
<span class="header_info selected-count">
已选择
<span style="color: #202531"> {{ state.selected.length }} </span>
</span>
<span
class="header_info can_click_text clear-selected"
:class="{ 'is-disabled': nodeData?.node?.level == 1 }"
@click="clearSelected">
清空
</span>
<span class="header_info can_click_text" @click="clearSelected">清空</span>
</div>
</template>
<template v-slot:filter_group>
......@@ -65,12 +83,19 @@
{{ row.metric_name }}
</span>
</template>
<template #is_enabled="{ row }">
<bg-switch
<template #status="{ row }">
<el-switch
v-model="row.status"
active-text="是"
inactive-text="否"
inline-prompt
@change="stateChange(row)">
</el-switch>
<!-- <bg-switch
@click="stateChange(row)"
:labels="['否', '是']"
:values="[2, 1]"
v-model="row.is_enabled"></bg-switch>
v-model="row.is_enabled"></bg-switch> -->
</template>
<template v-slot:created_at="{ row }">
{{ dateStringToDate(row.created_at) }}
......@@ -115,12 +140,18 @@ import axios from "@/request/http.js";
import { useRouter } from "vue-router";
import { dateStringToDate } from "@/components/env";
const router = useRouter();
const node = ref({});
const nodeData = ref({});
const noType = computed(() => {
return !nodeData.value?.data?.class_id;
});
const active_node_id = ref("");
watch(
() => node.value,
() => nodeData.value,
(n) => {
if (n?.data.class_id) {
if (n.node.level == 1) return;
if (n?.data.class_id && active_node_id.value != n?.data.class_id) {
getTableRows();
active_node_id.value = n.data.class_id;
}
},
{ deep: true }
......@@ -149,7 +180,7 @@ const state = reactive({
},
{
label: "是否启用",
prop: "is_enabled",
prop: "status",
},
{
label: "创建人",
......@@ -211,15 +242,16 @@ const selectable = (row, index) => {
return row.is_enabled === 2;
};
const getTableRows = () => {
const [start_time = "", end_time = ""] = state.filter.time;
let params = { ...state.filter, class_id: node.value.data.class_id, start_time, end_time };
const [start_time = "", end_time = ""] = state.filter.time || [];
let params = { ...state.filter, class_id: nodeData.value.data.class_id, start_time, end_time };
Reflect.deleteProperty(params, "time");
axios.get("/v1/api/metric_config/list", { params }).then((res) => {
if (res.data.code == 200) {
state.tableRows =
res.data.data?.list?.map((e) => {
res.data.data?.list.map((e) => {
return {
...e,
status: e.is_enabled == 1,
};
}) || [];
state.tableTotal = res.data.data.total_count;
......@@ -248,6 +280,7 @@ const deleteRow = (row) => {
}; // 删除
const batchDelete = () => {
// console.log("批量删除");
if (noType.value) return;
if (!state.selected || state.selected.length == 0) {
ElMessage.error("请先勾选要删除的数据");
return;
......@@ -283,14 +316,16 @@ const delConfirm = () => {
});
}; // 确定删除
const clearSelected = () => {
if (nodeData.value.node.level == 1) return;
dataTable.value.clearTable();
}; // 清空
const addRule = () => {
// console.log("新增");
if (noType.value) return;
router.push({
path: `/forewarning/indicator-config/add`,
query: {
class_id: node.value.data.class_id,
class_id: nodeData.value.data?.class_id,
},
});
}; // 新增规则
......@@ -300,7 +335,7 @@ const editRow = (row) => {
path: `/forewarning/indicator-config/edit`,
query: {
id: row.id,
class_id: node.value.data.class_id,
class_id: nodeData.value.data.class_id,
},
});
}; // 编辑
......@@ -308,16 +343,21 @@ const stateChange = async (row) => {
await nextTick();
const params = {
id: row.id,
is_enabled: row.is_enabled,
is_enabled: row.status ? 1 : 2,
};
axios.put("/v1/api/metric_config", params).then((res) => {
axios
.put("/v1/api/metric_config", params)
.then((res) => {
if (res.data.code == 200) {
ElMessage.success(`状态更新成功`);
getTableRows();
} else {
row.is_enabled = row.is_enabled == 1 ? 2 : 1;
row.status = !row.status;
ElMessage.error(res.data.msg);
}
})
.catch((e) => {
row.status = !row.status;
});
};
const { headers, tableRows, tableTotal, filter, noticeTypes, isEnabledOptions, delDialog } = toRefs(state);
......@@ -362,6 +402,21 @@ const { headers, tableRows, tableTotal, filter, noticeTypes, isEnabledOptions, d
}
}
}
.selected-count {
color: #404a62;
font-size: 14px;
margin: 0 24px 0 40px;
}
.clear-selected {
color: #3759be;
font-size: 14px;
cursor: pointer;
&.is-disabled {
color: #c0c4cc;
cursor: not-allowed;
}
}
.table_container {
flex: 1;
width: 100%;
......@@ -385,4 +440,12 @@ const { headers, tableRows, tableTotal, filter, noticeTypes, isEnabledOptions, d
}
}
}
.add-btn.is-disabled {
&,
&:hover {
background-image: none;
background-color: rgb(149, 163, 202);
border-color: rgb(149, 163, 202);
}
}
</style>
......@@ -8,6 +8,7 @@
<el-form-item label="指标表达式" prop="indicator_expression">
<div class="indicator-expression">
<bg-code-editor v-model="state.form.indicator_expression"></bg-code-editor>
<!-- <bg-codemirror v-model="state.form.indicator_expression"></bg-codemirror> -->
</div>
</el-form-item>
<el-form-item label="预警范围" prop="">
......@@ -53,9 +54,12 @@
</el-form-item>
</div>
<el-form-item label="检查周期" prop="inspection_cycle">
<div style="flex: 1; display: flex; align-items: center; gap: 8px">
<el-select style="flex: 1" v-model="state.form.inspection_cycle" placeholder="请选择检查周期">
<el-option v-for="item in inspectionCycleOptions" :key="item" :label="item" :value="item"> </el-option>
</el-select>
<span>分钟</span>
</div>
</el-form-item>
<el-form-item label="是否立即启用">
<el-switch
......@@ -143,14 +147,27 @@ const Submit = async () => {
});
let table_form_valid = await table_form_ref.value.Submit();
if (form_valid && table_form_valid) {
return {
let obj = {
...state.form,
...table_form_ref.value?.form,
};
if (!isEdit.value) {
setTimeout(() => {
state.form.indicator_expression = "";
table_form_ref.value.form_ref.resetFields();
form_ref.value.resetFields();
}, 100);
}
return obj;
}
ElMessage.error("有必填项没有填写");
return;
};
watch(
() => state.form.indicator_expression,
(n) => {
form_ref.value?.validateField(["indicator_expression"]);
}
);
// 监听是否是编辑,是则插入原数据
watch(
() => props.row,
......
......@@ -5,7 +5,8 @@ const setParams = (res, { id, class_id }) => {
class_id: +class_id,
metric_name: res.name,
expr: res.indicator_expression,
alert_range: res.warningScopeRows.map((e) => {
alert_range:
res.warningScopeRows.map((e) => {
return {
variable_name: e.key,
metric_name: e.indicator_scope,
......@@ -20,20 +21,20 @@ const setParams = (res, { id, class_id }) => {
check_period: res.inspection_cycle,
is_enabled: res.state,
alert_rule_type: res.rule_type,
}
};
if (id) {
params.id = id
params.id = id;
}
return params;
}
};
export const Save = (res, p, cb) => {
let params = setParams(res, p);
axios[p.id ? 'put' : 'post']('/v1/api/metric_config', params).then(res => {
axios[p.id ? "put" : "post"]("/v1/api/metric_config", params).then((res) => {
if (res.data.code == 200) {
ElMessage.success(`${p.id ? '编辑' : '新增'}成功`)
cb && cb()
ElMessage.success(`${p.id ? "编辑" : "新增"}成功`);
cb && cb();
} else {
ElMessage.error(res.data.data)
ElMessage.error(res.data.data);
}
})
}
\ No newline at end of file
});
};
......@@ -62,7 +62,7 @@
<el-button type="primary" size="default" @click="Save"> 保存 </el-button>
</template>
</el-dialog>
<el-dialog :close-on-click-modal="false" v-model="addWarnTarget" width="558px" :before-close="Cancel">
<el-dialog :close-on-click-modal="false" v-model="addWarnTarget" width="558px" :before-close="CancelAddWarnTarget">
<template #header>
<GapTitle :title="isEditWarnType ? '编辑预警对象' : '新增预警对象'"></GapTitle>
</template>
......@@ -88,11 +88,13 @@
<el-button type="primary" size="default" @click="SaveAddWarnTarget"> 保存 </el-button>
</template>
</el-dialog>
<el-dialog v-model="delWarnType" width="400px" :before-close="Cancel">
<el-dialog v-model="delWarnType" width="400px" :before-close="CancelDel">
<template #header>
<GapTitle title="删除预警分类"></GapTitle>
<GapTitle :title="`删除预警${activeTree.node.level == 1 ? '分类' : '对象'}`"></GapTitle>
</template>
<div style="padding: 20px 0">是否确定删除 {{ activeTree.own.label }} 这个预警分类</div>
<div style="padding: 20px 0">
是否确定删除 {{ activeTree.own.label }} 这个预警{{ activeTree.node.level == 1 ? "分类" : "对象" }}
</div>
<template #footer>
<el-button size="default" @click="CancelDel">取消</el-button>
<el-button type="primary" size="default" @click="ConfirmDel"> 确定 </el-button>
......@@ -105,6 +107,9 @@ import { nextTick, onBeforeMount, reactive, ref } from "vue";
import GapTitle from "@/components/gap-title.vue";
import axios from "@/request/http.js";
import { ElMessage } from "element-plus";
import { useRoute } from "vue-router";
const route = useRoute();
const { class_id } = route.query;
const props = defineProps({
modelValue: {
type: Object,
......@@ -121,9 +126,31 @@ const treeProps = {
const treeRef = ref(null);
const selectId = ref("");
const getSlideTree = () => {
axios.get("/v1/api/alert_class/tree").then(async (res) => {
axios.get("/v1/api/alert_class/tree").then((res) => {
if (res.data.code == 200) {
slideTree.value = res.data.data;
async function nodeChoose(item) {
await nextTick();
treeRef.value.setCurrentKey(item.class_id);
const node = treeRef.value.getNode(item);
if (node) {
treeNodeChoose(item, node);
}
}
if (class_id) {
let item = null;
slideTree.value.forEach((e) => {
if (e.children && e.children.length > 0) {
e.children.forEach((e) => {
if (e.class_id == class_id) {
item = e;
}
});
}
});
nodeChoose(item);
return;
}
try {
slideTree.value.forEach((e) => {
if (e.children && e.children.length > 0) {
......@@ -131,12 +158,7 @@ const getSlideTree = () => {
}
});
} catch (item) {
await nextTick();
treeRef.value.setCurrentKey(item.class_id);
const node = treeRef.value.getNode(item);
if (node) {
treeNodeChoose(item, node);
}
nodeChoose(item);
}
} else {
ElMessage.error(res.data.msg);
......@@ -145,7 +167,7 @@ const getSlideTree = () => {
};
const filterNode = (value, data) => {
if (!value) return data;
return data.label.includes(value);
return data.class_name.includes(value);
};
const Search = async () => {
await nextTick();
......@@ -154,9 +176,8 @@ const Search = async () => {
const Add = () => {
addWarnType.value = true;
};
const emits = defineEmits(["undate:modelValue"]);
const emits = defineEmits(["update:modelValue"]);
const treeNodeChoose = (data, node) => {
if (node.level == 1) return;
emits("update:modelValue", { data, node });
};
const getBrotherNodes = (node) => {
......@@ -333,7 +354,7 @@ const SaveAddWarnTarget = () => {
let method = isEditWarnType.value ? "put" : "post";
axios[method]("/v1/api/alert_class", params).then((res) => {
if (res.data.code == 200) {
ElMessage.success("预警对象新建成功");
ElMessage.success(`预警对象${isEditWarnType.value ? "编辑" : "新建"}成功`);
CancelAddWarnTarget();
getSlideTree();
} else {
......
......@@ -26,10 +26,11 @@ const Cancle = () => {
};
const add_form = ref(null);
const SaveSubmit = async () => {
let res = await add_form.value.Submit();
let { res, cb } = await add_form.value.Submit();
if (!res) return;
Save(res, {}, () => {
Cancle();
cb && cb();
});
};
</script>
......
......@@ -13,7 +13,7 @@
</template>
</Info>
</div>
<div class="warn-scope" v-if="detection_type == 1">
<div class="warn-scope" v-if="detection_type == 1 && watning_scope_data_key.length > 0">
<gap-title :hasLine="true" title="预警范围"></gap-title>
<div class="info">
<Info :labelData="warning_scope_label" :valueData="watning_scope_data"> </Info>
......@@ -23,6 +23,7 @@
<gap-title :hasLine="true" title="指标表达式"></gap-title>
<div class="indicator-expression">
<bg-code-editor v-model="indicator_expression" :disabled="true"></bg-code-editor>
<!-- <bg-codemirror :disabled="true" v-model="indicator_expression"></bg-codemirror> -->
</div>
</div>
<gap-title :hasLine="true" title="预警规则"></gap-title>
......@@ -125,6 +126,9 @@ const labelData = [
const info = ref({});
const warning_scope_label = ref([]);
const watning_scope_data = ref({});
const watning_scope_data_key = computed(() => {
return Object.keys(watning_scope_data.value);
});
const advanced_label = [
[
{
......@@ -210,11 +214,12 @@ const getInfoData = () => {
data.alert_range.forEach((e) => {
warning_scope_label.value.push([
{
prop: e.name,
prop: e.chinese_name || e.name,
label: e.chinese_name || e.name,
},
]);
watning_scope_data.value[e.name] = e.value == ".*" ? "全部" : `${selectRule[e.compare]} ${e.value}`;
watning_scope_data.value[e.chinese_name || e.name] =
e.value == ".*" ? "全部" : `${selectRule[e.compare]} ${e.value}`;
});
let isEmpty = Empty(data.alert_rule_type, ruleTypeOptions.value);
if (!isEmpty) {
......@@ -230,7 +235,11 @@ const getInfoData = () => {
ruleRows.value = data.alert_condition.map((e) => {
let min = e.thresholds_min + unit;
if (e.thresholds_min === undefined) {
if (ruleTypeOptions.value[data.alert_rule_type].down !== "") {
if (
data.alert_rule_type &&
ruleTypeOptions.value[data.alert_rule_type] &&
ruleTypeOptions.value[data.alert_rule_type]?.down !== ""
) {
min = ruleTypeOptions.value[data.alert_rule_type].down + unit;
} else {
min = WIELESS_SMALL;
......@@ -238,10 +247,14 @@ const getInfoData = () => {
}
let max = e.thresholds_max + unit;
if (e.thresholds_max === undefined) {
if (ruleTypeOptions.value[data.alert_rule_type].up !== "") {
if (
data.alert_rule_type &&
ruleTypeOptions.value[data.alert_rule_type] &&
ruleTypeOptions.value[data.alert_rule_type].up !== ""
) {
max = ruleTypeOptions.value[data.alert_rule_type].up + unit;
} else {
max = WIELESS_SMALL;
max = WIELESS_BIG;
}
}
return {
......
......@@ -32,9 +32,8 @@ const Cancle = () => {
};
const add_form = ref(null);
const SaveSubmit = async () => {
let res = await add_form.value.Submit();
let { res, cb } = await add_form.value.Submit();
if (!res) return;
console.log("res: ", res);
Save(res, { id }, () => {
Cancle();
});
......@@ -65,12 +64,7 @@ const getInfoData = () => {
warn_indicator: data.metric_config_id,
warn_target: findTypeBySecond(data.class_id)?.class_id || "",
rule_type: data.alert_rule_type,
},
};
if (isEmpty) {
obj.type_com_ref.risk_level = data.alert_condition[0].risk_level;
} else {
obj.type_com_ref.warning_scpoe_form =
warning_scpoe_form:
data.alert_range?.map((e) => {
return {
...e,
......@@ -78,7 +72,12 @@ const getInfoData = () => {
select: e.value == ".*" ? "all" : e.compare,
options: [],
};
}) || [];
}) || [],
},
};
if (isEmpty) {
obj.type_com_ref.risk_level = data.alert_condition[0].risk_level;
} else {
obj.type_com_ref.ruleRows =
data.alert_condition?.map((e) => {
return {
......
......@@ -23,7 +23,8 @@
ref="type_com_ref"
:is="typeCom[state.form.type_key]"
:isEdit="isEdit"
:form="typrFormData"></component>
:form="typrFormData"
@update-duration="updateDuration"></component>
<gap-title :hasLine="true" title="高级配置"></gap-title>
<div class="add-form-item">
<div class="duration">
......@@ -108,6 +109,7 @@ import ManualDistributionForm from "@/components/manual-distribution/form.vue";
import Static from "./static.vue";
import Custom from "./custom.vue";
import { MAX_DAY } from "@/components/env.js";
import { ElMessage } from "element-plus";
const props = defineProps({
row: {
type: Object,
......@@ -151,6 +153,14 @@ const inputNum = () => {
state.form.time = max;
}
};
const updateDuration = (data) => {
const { duration, duration_unit, check_period } = data;
state.form.time = duration;
state.form.unit = duration_unit;
state.form.inspection_cycle = check_period;
};
const types = {
static: "静态阈值",
custom: "自定义",
......@@ -159,16 +169,6 @@ const changeType = async (key) => {
state.form.type_key = key;
form_ref.value.clearValidate();
};
const durationOptions = [
{
id: 1,
name: "直接产生预警",
},
{
id: 2,
name: "当预警持续",
},
];
const timeOptions = [10, 20, 60, 120, 180, 300];
const inspectionCycleOptions = ref([1, 3, 5, 10, 20]);
const form_ref = ref(null);
......@@ -180,14 +180,26 @@ const Submit = async () => {
let type_com_ref_valid = await type_com_ref.value.Submit();
let manual_distribution_form_valid = await manual_distribution_form.value.Submit();
if (form_valid && type_com_ref_valid && manual_distribution_form_valid) {
return {
let obj = {
...state.form,
type_com_ref: type_com_ref.value?.form || {},
manual_distribution_form: manual_distribution_form.value?.form || {},
};
return {
res: obj,
cb: () => {
if (!isEdit.value) {
setTimeout(() => {
type_com_ref.value.form_ref.resetFields();
manual_distribution_form.value.form_ref.resetFields();
form_ref.value.resetFields();
}, 100);
}
},
};
}
ElMessage.error("有必填项没有填写");
return;
return {};
};
watch(
() => props.row,
......
......@@ -38,6 +38,7 @@
<el-form-item label="" prop="indicator_expression">
<div class="indicator-expression">
<bg-code-editor v-model="state.form.indicator_expression"></bg-code-editor>
<!-- <bg-codemirror v-model="state.form.indicator_expression"></bg-codemirror> -->
</div>
</el-form-item>
</div>
......@@ -250,11 +251,10 @@ const inputNum = (index, key) => {
if (state.form.ruleRows[index][key] == "") return;
if (state.form.ruleRows[index][key] == "-") return;
state.form.ruleRows[index][key] = `${state.form.ruleRows[index][key]}`
.replace(/[^\-?\d.]/g, "") //只允许输入负号,数字,小数点
.replace(/(\-)+/, "$1") //过滤连续多个负号
.replace(/(\.)+/, "$1") //过滤连续多个小数点
.replace(/(\.\d+)\./g, "$1") //过滤出现多个小数点
.replace(/(\d)\-/g, "$1"); //过滤处于非开头的负号
.replace(/[^\-?\d.]/g, "")
.replace(/(\.)+/, "$1")
.replace(/(\.\d+)\.+/g, "$1")
.replace(/(\..*)\./g, "$1");
};
const changeWarningThresholdFrom = (index) => {
let { down, up } = limit.value;
......@@ -274,18 +274,13 @@ const changeWarningThresholdFrom = (index) => {
}
let rows = setLimits(index);
if (rows.length == 0) return;
try {
rows.forEach((e) => {
if (from !== "") {
if (i == 0 && e.down === "" && +from <= +e.up) {
throw "";
}
if (e.up !== "" && e.down !== "" && +e.up >= +from && +from > +e.down) {
throw "";
}
}
let items = rows.filter((e, i) => {
let isPassDown = e.down !== "" ? +e.down <= +from : false;
let isLessUp = e.up !== "" ? +e.up >= +from : false;
let isLessDownAndPassUp = e.down !== "" && e.up !== "" && to !== "" ? +from < +e.down && +to > +e.up : false;
return (isPassDown && isLessUp) || isLessDownAndPassUp;
});
} catch (e) {
if (items.length > 0) {
ElMessage.error(`该范围已被设置`);
state.form.ruleRows[index].from = "";
}
......@@ -308,18 +303,13 @@ const changeWarningThresholdTo = (index) => {
}
let rows = setLimits(index);
if (rows.length == 0) return;
try {
rows.forEach((e) => {
if (to !== "") {
if (i == rows.length - 1 && e.up === "" && +to > +e.down) {
throw "";
}
if (e.up !== "" && e.down !== "" && +e.up > +to && +to > +e.down) {
throw "";
}
}
let items = rows.filter((e, i) => {
let isPassDown = e.down !== "" ? +e.down <= +to : false;
let isLessUp = e.up !== "" ? +e.up >= +to : false;
let isLessDownAndPassUp = e.down !== "" && e.up !== "" && from !== "" ? +from < +e.down && +to > +e.up : false;
return (isPassDown && isLessUp) || isLessDownAndPassUp;
});
} catch (e) {
if (items.length > 0) {
ElMessage.error(`该范围已被设置`);
state.form.ruleRows[index].to = "";
}
......
......@@ -130,10 +130,20 @@ const state = reactive({
},
tableRules: {
from: (index) => {
return [{ validator: (rule, value, callback) => validateFrom(rule, value, callback, index), trigger: "blur" }];
return [
{
validator: (rule, value, callback) => validateFrom(rule, value, callback, index),
trigger: "blur",
},
];
},
to: (index) => {
return [{ validator: (rule, value, callback) => validateTo(rule, value, callback, index), trigger: "blur" }];
return [
{
validator: (rule, value, callback) => validateTo(rule, value, callback, index),
trigger: "blur",
},
];
},
risk_level: [{ required: true, message: "请选择", trigger: "change" }],
},
......@@ -218,7 +228,7 @@ const limit = computed(() => {
const changeWarningThresholdFrom = (index) => {
let { down, up } = limit.value;
let { from, to } = state.form.ruleRows[index];
if (to !== "" && from !== "" && from > +to) {
if (to !== "" && from !== "" && from >= +to) {
ElMessage.error(`下限不能大于上限`);
state.form.ruleRows[index].from = "";
return;
......@@ -233,18 +243,13 @@ const changeWarningThresholdFrom = (index) => {
}
let rows = setLimits(index);
if (rows.length == 0) return;
try {
rows.forEach((e, i) => {
if (from !== "") {
if (i == 0 && e.down === "" && +from <= +e.up) {
throw "";
}
if (e.up !== "" && e.down !== "" && +e.up >= +from && +from > +e.down) {
throw "";
}
}
let items = rows.filter((e, i) => {
let isPassDown = e.down !== "" ? +e.down <= +from : false;
let isLessUp = e.up !== "" ? +e.up >= +from : false;
let isLessDownAndPassUp = e.down !== "" && e.up !== "" && to !== "" ? +from < +e.down && +to > +e.up : false;
return (isPassDown && isLessUp) || isLessDownAndPassUp;
});
} catch (e) {
if (items.length > 0) {
ElMessage.error(`该范围已被设置`);
state.form.ruleRows[index].from = "";
}
......@@ -262,7 +267,7 @@ const inputNum = (index, key) => {
const changeWarningThresholdTo = (index) => {
let { down, up } = limit.value;
let { from, to } = state.form.ruleRows[index];
if (to !== "" && from !== "" && from > +to) {
if (to !== "" && from !== "" && from >= +to) {
ElMessage.error(`下限不能大于上限`);
state.form.ruleRows[index].to = "";
return;
......@@ -277,18 +282,13 @@ const changeWarningThresholdTo = (index) => {
}
let rows = setLimits(index);
if (rows.length == 0) return;
try {
rows.forEach((e, i) => {
if (to !== "") {
if (i == rows.length - 1 && e.up === "" && +to > +e.down) {
throw "";
}
if (e.up !== "" && e.down !== "" && +e.up > +to && +to > +e.down) {
throw "";
}
}
let items = rows.filter((e, i) => {
let isPassDown = e.down !== "" ? +e.down <= +to : false;
let isLessUp = e.up !== "" ? +e.up >= +to : false;
let isLessDownAndPassUp = e.down !== "" && e.up !== "" && from !== "" ? +from < +e.down && +to > +e.up : false;
return (isPassDown && isLessUp) || isLessDownAndPassUp;
});
} catch (e) {
if (items.length > 0) {
ElMessage.error(`该范围已被设置`);
state.form.ruleRows[index].to = "";
}
......
import { ElMessage } from "element-plus";
import axios from "@/request/http.js";
// max(container_fs_usage_bytes{pod!=\"\", namespace!=\"arms-prom\",namespace!=\"monitoring\"}) by (pod_name, namespace, device)/max(container_fs_limit_bytes{pod!=\"\"}) by (pod_name,namespace, device) * 100
const setParams = (res, { id }) => {
let isEmpty = res.type_com_ref.isEmpty
let params = {
......@@ -69,13 +68,12 @@ const setParams = (res, { id }) => {
compare: e.select == 'all' ? '=~' : e.select
}
}),
// // 预警规则(下拉)
// 预警规则(下拉)
alert_rule_type: res.type_com_ref.alert_rule_type,
}
}
}
let alert_condition = []
// debugger;
if (isEmpty) {
alert_condition = [{
thresholds_max: 0,
......
......@@ -89,7 +89,7 @@
</template>
<script setup>
import { computed, nextTick, onMounted, reactive, ref, shallowReactive } from "vue";
import { computed, nextTick, onMounted, reactive, ref, shallowReactive, watch } from "vue";
import gapTitle from "@/components/gap-title.vue";
import Gateway from "./gateway.vue";
import { ElMessage } from "element-plus";
......@@ -132,13 +132,6 @@ const props = defineProps({
default: false,
},
});
// const changeSelect = (index, item) => {
// if (showSelect.includes(item.is_linked)) {
// state.form.warning_scpoe_form[index].value = [];
// } else {
// state.form.warning_scpoe_form[index].value = "";
// }
// };
const validateValue = (rule, value, callback, item, index) => {
if (!item.is_required || item.select == "all") return callback();
if (item.value == "") {
......@@ -160,6 +153,22 @@ const state = reactive({
risk_level: [{ required: true, message: "请选择风险程度", trigger: "change" }],
},
});
const info = () => {
state.form.warn_type =
props.form.warn_target && props.form.warn_type ? [props.form.warn_target, props.form.warn_type] : [];
state.form.warn_indicator = props.form.warn_indicator;
alert_rule_type.value = props.form.rule_type || "1";
let params = {
page: 1,
page_size: 10000000000000,
class_id: props.form.warn_type,
is_enabled: 1,
};
getWarningIndicator(params, () => {
state.form.warning_scpoe_form = props.form?.warning_scpoe_form || [];
});
state.form.risk_level = props.form.risk_level;
};
const ruleTypeOptions = ref({});
const getRuleTypeOptions = async (cb) => {
ruleTypeOptions.value = await GetRuleTypeOptions();
......@@ -167,11 +176,22 @@ const getRuleTypeOptions = async (cb) => {
info();
}
};
watch(
() => props.form,
(n) => {
if (!n) return;
info();
},
{
deep: true,
}
);
const module_data = ref({});
const alert_rule_type = ref("");
const isEmpty = computed(() => {
return Empty(alert_rule_type.value, ruleTypeOptions.value);
});
const emits = defineEmits(["update-duration"]);
const chooseWarnIndicator = () => {
axios
.get("/v1/api/metric_config", {
......@@ -192,6 +212,7 @@ const chooseWarnIndicator = () => {
loading: false,
};
});
emits("update-duration", module_data.value);
} else {
ElMessage.error(res.data.data);
}
......@@ -219,10 +240,29 @@ const cascaderProps = {
label: "class_name",
};
const staticTypeOptions = ref([]);
const staticTypeFormat = (res) => {
let arr = res?.map((e) => {
let children = [];
let is_disabled = false;
if (e.children?.length == 0 && e.parent_id == 0) {
children = [];
is_disabled = true;
} else {
children = staticTypeFormat(e.children);
is_disabled = false;
}
return {
...e,
children: children,
disabled: is_disabled,
};
});
return arr;
};
const getStaticTypeOptions = () => {
axios.get("/v1/api/alert_class/tree").then(async (res) => {
if (res.data.code == 200) {
staticTypeOptions.value = res.data.data;
staticTypeOptions.value = staticTypeFormat(res.data.data);
} else {
ElMessage.error(res.data.msg);
}
......@@ -249,7 +289,8 @@ const warningIndexOptions = ref({});
const cascader_ref = ref(null);
const changeWarnStaticType = async () => {
let class_id = state.form.warn_type[1];
let params = { page: 1, page_size: 10000000000000, class_id };
if (!class_id) return;
let params = { page: 1, page_size: 10000000000000, class_id, is_enabled: 1 };
getWarningIndicator(params);
};
const getWarningIndicator = (params, cb) => {
......@@ -293,16 +334,6 @@ const ruleHeaders = [
},
];
const rule_rows = computed(() => props.form?.ruleRows || []);
const info = () => {
state.form.warn_type =
props.form.warn_target && props.form.warn_type ? [props.form.warn_target, props.form.warn_type] : [];
state.form.warn_indicator = props.form.warn_indicator;
alert_rule_type.value = props.form.rule_type || "1";
let params = { page: 1, page_size: 10000000000000, class_id: props.form.warn_type };
getWarningIndicator(params, () => {
state.form.warning_scpoe_form = props.form?.warning_scpoe_form || [];
});
};
onMounted(() => {
getStaticTypeOptions();
getRuleTypeOptions();
......
......@@ -89,7 +89,7 @@ const save = () => {
if (res.data.code == 200) {
ElMessage.success(res.data.msg);
} else {
ElMessage.error(res.data.data);
ElMessage.error(res.data.msg);
}
});
}
......
......@@ -4,16 +4,16 @@
<div class="parent_container">
<div class="left_container bgc_white">
<el-menu default-active="1" @select="switchMenu">
<el-menu-item index="1">
<el-menu-item :index="1">
<span>license授权</span>
</el-menu-item>
<el-menu-item index="2">
<el-menu-item :index="2">
<span>登录页管理</span>
</el-menu-item>
<el-menu-item index="3">
<el-menu-item :index="3">
<span>安全相关</span>
</el-menu-item>
<el-menu-item index="4">
<el-menu-item :index="4">
<span>登录注册配置</span>
</el-menu-item>
</el-menu>
......@@ -74,16 +74,16 @@ const switchMenu = (index) => {
state.activeIndex = index;
nextTick(() => {
switch (index) {
case "1":
case 1:
authorityFormRef.value.setFormData(state.sysOptions);
break;
case "2":
case 2:
loginPageFormRef.value.setFormData(state.sysOptions);
break;
case "3":
case 3:
secureFormRef.value.setFormData(state.sysOptions);
break;
case "4":
case 4:
registerFormRef.value.setFormData(state.sysOptions);
break;
default:
......@@ -107,16 +107,16 @@ const getPreferenceConfig = () => {
//保存表单项
const save = () => {
switch (state.activeIndex) {
case "1":
case 1:
authorityFormRef.value.save();
break;
case "2":
case 2:
loginPageFormRef.value.save();
break;
case "3":
case 3:
secureFormRef.value.save();
break;
case "4":
case 4:
registerFormRef.value.save();
break;
default:
......
......@@ -46,6 +46,7 @@
v-model="filter.finish_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
:disabled-date="disabledDate"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
......@@ -134,6 +135,9 @@ const filterClear = () => {
const tableTotal = ref(0);
const ticketLevelOptions = ["全部", "紧急任务", "重要任务", "一般任务"];
const statusOptions = ["全部", "待处置", "已完成", "已关闭"];
const disabledDate = (time) => {
return time.getTime() > Date.now();
};
let headers = reactive([
{
label: "工单名称",
......
......@@ -231,6 +231,10 @@ let headers = reactive([
fixed: "right",
},
]);
const history = ref({
methods: [],
lists: [],
});
let rows = ref([]);
const selectable = (row, index) => {
return !row.timing_state;
......@@ -279,6 +283,26 @@ const active_row = ref(null);
const operation = (row) => {
active_row.value = row;
visible.value = true;
const params = {
id: row.id,
};
axios.get("/v1/api/work_order/work_order_manage/details", { params }).then((res) => {
if (res.data.code == 200) {
let { data } = res.data;
if (!data) return;
active_row.value.history = {
method: data.push_obj.push_method == 3 ? ["1", "2"] : [`${data.push_obj.push_method}`] || [],
lists:
data.push_obj.user_obj?.map((e) => {
return {
user_id: e.system_account,
user_name: e.user_name,
phone: e.phone,
};
}) || [],
};
}
});
};
// 编辑调用
const Edit = (row) => {
......
......@@ -46,6 +46,7 @@
v-model="filter.finish_time"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
:disabled-date="disabledDate"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间">
......@@ -132,6 +133,9 @@ const filterClear = () => {
const tableTotal = ref(0);
const ticketLevelOptions = ["全部", "紧急任务", "重要任务", "一般任务"];
const statusOptions = ["全部", "待处置", "已完成", "已关闭"];
const disabledDate = (time) => {
return time.getTime() > Date.now();
};
let headers = reactive([
{
label: "工单名称",
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment