Browse Source

修改通知插件设置

yukai 2 years ago
parent
commit
fe85d2f894

+ 2 - 1
src/api/notice/index.ts

@@ -1,5 +1,4 @@
 import { get, post, del, put } from "/@/utils/request";
 import { get, post, del, put } from "/@/utils/request";
-
 export default {
 export default {
   config: {
   config: {
     getList: (params: object) => get("/notice/config/list", params),
     getList: (params: object) => get("/notice/config/list", params),
@@ -7,6 +6,8 @@ export default {
     delete: (ids: number) => del("/notice/config/delete", { ids }),
     delete: (ids: number) => del("/notice/config/delete", { ids }),
     edit: (data: object) => put("/notice/config/edit", data),
     edit: (data: object) => put("/notice/config/edit", data),
     detail: (id: number) => get("/notice/config/get", { id }),
     detail: (id: number) => get("/notice/config/get", { id }),
+    save: (data: object) => post("/system/plugins_config/save", data),
+    getbyname: (data: object) => get("/system/plugins_config/getbyname", data),
   },
   },
   template: {
   template: {
     getList: (params: object) => get("/notice/template/list", params),
     getList: (params: object) => get("/notice/template/list", params),

+ 1 - 1
src/views/iot/alarm/setting/index.vue

@@ -407,6 +407,7 @@ export default defineComponent({
 }
 }
 .card-state.success {
 .card-state.success {
 	background-color: #f6ffed;
 	background-color: #f6ffed;
+	color: #000;
 }
 }
 .iot-card .card-warp .card-content .card-state.error {
 .iot-card .card-warp .card-content .card-state.error {
     background-color: rgba(229,0,18,.1);
     background-color: rgba(229,0,18,.1);
@@ -455,7 +456,6 @@ export default defineComponent({
 }
 }
 .ant-badge-status-text {
 .ant-badge-status-text {
 	margin-left: 8px;
 	margin-left: 8px;
-	color: rgba(0, 0, 0, 0.85);
 	font-size: 14px;
 	font-size: 14px;
 }
 }
 .ant-btn {
 .ant-btn {

+ 186 - 0
src/views/iot/noticeservices/config/component/edit.vue

@@ -0,0 +1,186 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id !== 0 ? '设置' : '设置') + '配置插件'" v-model="isShowDialog" width="50%">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
+
+			
+		<el-form-item label="配置内容" prop="content">
+          <el-input v-model="ruleForm.value" type="textarea" placeholder="配置内容,一行一条"></el-input>
+        </el-form-item>
+				
+		<el-form-item label="配置说明" prop="doc">
+          <el-input v-model="ruleForm.doc" type="textarea" placeholder="请输入配置说明"></el-input>
+        </el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '设 置' : '添 加' }}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/notice';
+
+
+import { ElMessage } from 'element-plus';
+import { Delete, Plus, CircleClose, Top, Bottom, Minus, Right } from '@element-plus/icons-vue';
+
+interface RuleFormState {
+	id: number;
+	name: string;
+	type: string;
+	value:string;
+	doc:string;
+	
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	rules: {};
+	configData: {};
+	id: number;
+	type_name: string;
+
+}
+
+export default defineComponent({
+	name: 'Edit',
+	components: { Delete, Plus, CircleClose, Minus, Right, Top, Bottom },
+
+	setup(prop, { emit }) {
+		const myRef = ref<HTMLElement | null>(null);
+		const formRef = ref<HTMLElement | null>(null);
+		const state = reactive<DicState>({
+			id: 0,
+			configData:[],
+			type_name:'',
+			isShowDialog: false,
+			ruleForm: {
+				id: 0,
+				name: "",
+				type: "notice",
+				value:'',
+				doc:'',
+			},
+			rules: {
+				value: [{ required: true, message: '配置内容不能为空', trigger: 'blur' }],
+				
+			},
+		});
+
+
+
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+
+			if (row) {
+				state.type_name = row.value;
+
+				api.config.getbyname({ name: row.value,type:'notice' }).then((res: any) => {
+					state.ruleForm = res || [];
+				});
+			}
+
+			state.isShowDialog = true;
+		};
+
+		
+
+		const resetForm = () => {
+		
+			state.ruleForm = {
+				id: 0,
+				name: "",
+				type: "notice",
+				value:'',
+				doc:'',
+			};
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+
+		// 新增
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any;
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					state.ruleForm.name=state.type_name;
+					state.ruleForm.type="notice";
+					api.config.save(state.ruleForm).then(() => {
+							ElMessage.success('插件设置成功');
+							closeDialog(); // 关闭弹窗
+							emit('dataList');
+						});
+				}
+			});
+		};
+
+	
+
+
+		return {
+		
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			myRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+<style>
+.inline {
+	display: inline-flex;
+}
+.el-input__wrapper {
+	width: 98%;
+}
+
+.box-content {
+	border: 1px solid #e8e8e8;
+	margin: 10px;
+	padding: 10px;
+}
+
+.content-f {
+	display: flex;
+	margin-bottom: 10px;
+}
+.content-f .el-input__wrapper {
+	margin-right: 5px;
+}
+.addbutton {
+	width: 100%;
+	margin-top: 10px;
+	background: #fff;
+	border: 1px solid #d1d1d1;
+	color: #8d8b8b;
+}
+.conicon {
+	width: 55px;
+	height: 25px;
+
+	font-size: 28px;
+	line-height: 28px;
+	cursor: pointer;
+}
+.jv-node {
+	margin-left: 25px;
+}
+</style>

+ 1 - 1
src/views/iot/noticeservices/config/component/setEdit.vue

@@ -6,7 +6,7 @@
 					<el-input v-model="ruleForm.title" placeholder="请输入名称" />
 					<el-input v-model="ruleForm.title" placeholder="请输入名称" />
 				</el-form-item>
 				</el-form-item>
 
 
-				<el-form-item label="配置类型" prop="types">
+				<el-form-item label="通知类型" prop="types">
 					<el-radio-group v-model="ruleForm.types">
 					<el-radio-group v-model="ruleForm.types">
 						<el-radio label="1"  value="1">即时发送</el-radio>
 						<el-radio label="1"  value="1">即时发送</el-radio>
 						<el-radio label="2" value="2">预约发送</el-radio>
 						<el-radio label="2" value="2">预约发送</el-radio>

File diff suppressed because it is too large
+ 3 - 3
src/views/iot/noticeservices/config/index.vue


+ 114 - 0
src/views/iot/noticeservices/log/component/detail.vue

@@ -0,0 +1,114 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog title="日志详情" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
+				<el-form-item label="规则名称">
+					{{ ruleForm.ruleName }}
+				</el-form-item>
+				<el-form-item label="告警类型">
+					<span v-if="ruleForm.type == 1">规则告警</span>
+					<span v-else>设备自主告警</span>
+				</el-form-item>
+				<el-form-item label="产品名称">
+					{{ product_name }}
+				</el-form-item>
+				<el-form-item label="设备名称">
+					{{ devcie_name }}
+				</el-form-item>
+
+				<el-form-item label="告警级别">
+					{{ alarmLevel_name }}
+				</el-form-item>
+
+				<el-form-item label="告警时间">
+					{{ ruleForm.createdAt }}
+				</el-form-item>
+				<el-form-item label="告警数据">
+					<JsonViewer :value="jsonData" boxed sort theme="jv-dark" @click="onKeyclick" />
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/alarm';
+import { ElMessage } from 'element-plus';
+import 'vue3-json-viewer/dist/index.css';
+
+import vue3cron from '/@/components/vue3cron/vue3cron.vue';
+
+interface RuleFormState {
+	id?: number;
+	name: string;
+	interval: string;
+	key: string;
+	desc: string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	product_name: '';
+	devcie_name: '';
+	alarmLevel_name: '';
+	jsonData: {};
+}
+
+export default defineComponent({
+	name: 'Edit',
+	components: { vue3cron },
+
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+		const state = reactive<DicState>({
+			isShowDialog: false,
+			product_name: '',
+			devcie_name: '',
+			alarmLevel_name: '',
+			ruleForm: {},
+			jsonData: {},
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+			//resetForm();
+			api.log.detail(row.id).then((res: any) => {
+				state.ruleForm = res.data;
+				state.jsonData = JSON.parse(res.data.data);
+				state.product_name = res.data.product.name;
+				state.devcie_name = res.data.devcie.name;
+				state.alarmLevel_name = res.data.alarmLevel.name;
+			});
+
+			state.isShowDialog = true;
+		};
+		const resetForm = () => {
+			state.ruleForm = {};
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+

+ 108 - 0
src/views/iot/noticeservices/log/component/edit.vue

@@ -0,0 +1,108 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog title="告警处理" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
+				<el-form-item label="处理状态" prop="status">
+					<el-radio-group v-model="ruleForm.status">
+						<el-radio :label="1">已处理</el-radio>
+						<el-radio :label="2">忽略</el-radio>
+					</el-radio-group>
+				</el-form-item>
+				<el-form-item label="处理意见" prop="content">
+					<el-input v-model="ruleForm.content" type="textarea" placeholder="请输入内容"></el-input>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">确定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/alarm';
+import { ElMessage } from 'element-plus';
+
+
+interface RuleFormState {
+	id?: number;
+	status: number;
+	content: string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	rules: {};
+}
+
+export default defineComponent({
+	name: 'Edit',
+
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+		const state = reactive<DicState>({
+			isShowDialog: false,
+			ruleForm: {
+				status: 1,
+				content: '',
+			},
+			rules: {
+				status: [{ required: true, message: '处理状态不能为空', trigger: 'blur' }],
+			},
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+			resetForm();
+			api.log.detail(row.id).then((res: any) => {
+				state.ruleForm.id = res.data.id;
+			});
+
+			state.isShowDialog = true;
+		};
+		const resetForm = () => {
+			state.ruleForm = {
+				status: 1,
+				content: '',
+			};
+		};
+
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any;
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					api.log.handle(state.ruleForm).then(() => {
+						ElMessage.success('告警出来成功');
+						closeDialog(); // 关闭弹窗
+						emit('dataList');
+					});
+				}
+			});
+		};
+
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+

+ 190 - 0
src/views/iot/noticeservices/log/index.vue

@@ -0,0 +1,190 @@
+<template>
+	<div class="system-dic-container">
+		<el-card shadow="hover">
+			<div class="system-user-search mb15">
+				<el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="68px">
+					<el-form-item label="创建时间" prop="dateRange">
+						<el-date-picker
+							v-model="tableData.param.dateRange"
+							size="default"
+							style="width: 240px"
+							value-format="YYYY-MM-DD"
+							type="daterange"
+							range-separator="-"
+							start-placeholder="开始日期"
+							end-placeholder="结束日期"
+						></el-date-picker>
+					</el-form-item>
+					<el-form-item>
+						<el-button size="default" type="primary" class="ml10" @click="typeList">
+							<el-icon>
+								<ele-Search />
+							</el-icon>
+							查询
+						</el-button>
+						<el-button size="default" @click="resetQuery(queryRef)">
+							<el-icon>
+								<ele-Refresh />
+							</el-icon>
+							重置
+						</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+			<el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
+				<el-table-column label="ID" align="center" prop="id" width="60" v-col="'ID'" />
+				<el-table-column label="告警类型" prop="type" :show-overflow-tooltip="true" v-col="'type'">
+					<template #default="scope">
+						<span v-if="scope.row.type == 1">规则告警</span>
+						<span v-else>设备自主告警</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="规则名称" prop="ruleName" :show-overflow-tooltip="true" v-col="'ruleName'" />
+				<el-table-column label="规则级别" prop="alarmLevel" :show-overflow-tooltip="true" v-col="'alarmLevel'">
+					<template #default="scope">
+						{{ scope.row.alarmLevel.name }}
+					</template>
+				</el-table-column>
+				<el-table-column label="产品标识" prop="productKey" :show-overflow-tooltip="true" v-col="'productKey'" />
+				<el-table-column label="设备标识" prop="deviceKey" :show-overflow-tooltip="true" v-col="'deviceKey'" />
+
+				<el-table-column prop="status" label="告警状态" width="100" align="center" v-col="'status'">
+					<template #default="scope">
+						<el-tag type="success" size="small" v-if="scope.row.status">已处理</el-tag>
+						<el-tag type="info" size="small" v-else>未处理</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="createdAt" label="告警时间" align="center" width="180" v-col="'createdAt'"></el-table-column>
+				<el-table-column label="操作" width="150" align="center" fixed="right" v-col="'handle'">
+					<template #default="scope">
+						<el-button size="small" text type="primary" @click="onOpenDetailDic(scope.row)" v-auth="'detail'">详情</el-button>
+						<el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-if="scope.row.status == 0" v-auth="'edit'">处理</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<pagination
+				v-show="tableData.total > 0"
+				:total="tableData.total"
+				v-model:page="tableData.param.pageNum"
+				v-model:limit="tableData.param.pageSize"
+				@pagination="typeList"
+			/>
+		</el-card>
+
+		<EditDic ref="editDicRef" @dataList="typeList" />
+		<DetailDic ref="detailRef" @dataList="typeList" />
+	</div>
+</template>
+  
+  <script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import api from '/@/api/alarm';
+import EditDic from './component/edit.vue';
+import DetailDic from './component/detail.vue';
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	id: number;
+	name: string;
+	deviceType: string;
+	status: number;
+	desc: string;
+	createBy: string;
+}
+interface TableDataState {
+	ids: number[];
+	tableData: {
+		data: Array<TableDataRow>;
+		total: number;
+		loading: boolean;
+		param: {
+			pageNum: number;
+			pageSize: number;
+
+			dateRange: string[];
+		};
+	};
+}
+
+export default defineComponent({
+	name: 'log',
+	components: { EditDic, DetailDic },
+
+	setup() {
+		const addDicRef = ref();
+		const editDicRef = ref();
+		const detailRef = ref();
+		const queryRef = ref();
+		const state = reactive<TableDataState>({
+			ids: [],
+			tableData: {
+				data: [],
+				total: 0,
+				loading: false,
+				param: {
+					pageNum: 1,
+					pageSize: 10,
+					status: '',
+					dateRange: [],
+				},
+			},
+		});
+		// 初始化表格数据
+		const initTableData = () => {
+			//typeList();
+		};
+		const typeList = () => {
+			state.tableData.loading = true;
+			api.log
+				.getList(state.tableData.param)
+				.then((res: any) => {
+					state.tableData.data = res.list;
+					state.tableData.total = res.Total;
+				})
+				.finally(() => (state.tableData.loading = false));
+		};
+
+		//打开详情页
+		const onOpenDetailDic = (row: TableDataRow) => {
+			detailRef.value.openDialog(row);
+		};
+		// 打开新增产品弹窗
+		const onOpenAddDic = () => {
+			editDicRef.value.openDialog();
+		};
+		// 打开修改产品弹窗
+		const onOpenEditDic = (row: TableDataRow) => {
+			editDicRef.value.openDialog(row);
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		/** 重置按钮操作 */
+		const resetQuery = (formEl: FormInstance | undefined) => {
+			if (!formEl) return;
+			formEl.resetFields();
+			typeList();
+		};
+		// 多选框选中数据
+		const handleSelectionChange = (selection: TableDataRow[]) => {
+			state.ids = selection.map((item) => item.id);
+		};
+		return {
+			addDicRef,
+			editDicRef,
+			queryRef,
+			detailRef,
+			onOpenDetailDic,
+			onOpenAddDic,
+			onOpenEditDic,
+			typeList,
+			resetQuery,
+			handleSelectionChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+  

Some files were not shown because too many files changed in this diff