Ver Fonte

reactor:新增预警分析页面;

zhangchong há 1 mês atrás
pai
commit
effc87a8af

+ 1 - 1
.env.development

@@ -3,7 +3,7 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 业务系统基础请求地址
-VITE_API_URL=http://110.188.24.28:50100
+VITE_API_URL=http://110.188.24.28:50300
 # 业务系统socket请求地址
 VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 业务系统文件上传上传请求地址

+ 124 - 0
src/views/early/manage/components/Detail.vue

@@ -0,0 +1,124 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增预警设置" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef" :disabled="loading">
+			<p class="border-title mb10">预警信息</p>
+			<el-row :gutter="10">
+				<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+					<el-form-item label="预警名称"> </el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+					<el-form-item label="预警类型"> </el-form-item>
+				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+					<el-form-item label="预警级别"> </el-form-item>
+				</el-col>
+				<el-col>
+					<el-form-item label="预警地点"> </el-form-item>
+				</el-col>
+			</el-row>
+			<p class="border-title mb10 mt20">推送工单</p>
+			<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true, keyField: 'id' }"
+				ref="tableRef"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 100 }"
+				showHeaderOverflow
+				max-height="500"
+			>
+				<vxe-column field="no" title="工单编码"></vxe-column>
+				<vxe-column field="title" title="工单标题" min-width="200">
+					<template #default="{ row }">
+						<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="order.creationTime" title="受理时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="hotspotName" title="热点分类"></vxe-column>
+				<vxe-column field="hotspotName" title="事发地址"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+				<vxe-column field="statusText" title="推送状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+			</vxe-table>
+			<p class="border-title mb10 mt20">报告文件</p>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { addEarlySetting, getEarlySettingBaseData } from '@/api/early/setting';
+import { getEarlyManageDetail } from '@/api/early/manage';
+import { formatDate } from '@/utils/formatTime';
+
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {},
+	tableData: [],
+});
+// 获取详情
+let loading = ref<boolean>(false); // 加载状态
+const getDetail = (id: string) => {
+	loading.value = true;
+	getEarlyManageDetail(id)
+		.then((res: any) => {
+			console.log(res);
+			loading.value = false;
+		})
+		.catch((err) => {
+			console.log(err);
+			loading.value = false;
+		});
+};
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (id: string) => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+		getDetail(id);
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 161 - 7
src/views/early/manage/index.vue

@@ -1,11 +1,165 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-
+	<div class="early-manage-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading">
+				<el-form-item label="预警名称" prop="EarlyWarningName">
+					<el-input
+						v-model="state.queryParams.EarlyWarningName"
+						placeholder="请填写预警名称"
+						clearable
+						@keyup.enter="handleQuery"
+						class="keyword-input"
+					/>
+				</el-form-item>
+				<el-form-item label="预警级别" prop="EarlyWarningLevelValue">
+					<el-select v-model="state.queryParams.EarlyWarningLevelValue" placeholder="请选择预警级别" @change="handleQuery">
+						<el-option v-for="item in earlyWarningLevel" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true, useKey: true }"
+					:row-config="{ isCurrent: true, isHover: true, useKey: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="earlyManage"
+					:custom-config="{ storage: true }"
+					:sort-config="{ remote: true }"
+					@sort-change="sortChange"
+				>
+					<vxe-column field="earlyWarningSetting.earlyWarningName" title="预警名称"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningLevelName" title="预警级别"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="时间/时间段"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="预警类型"></vxe-column>
+					<vxe-column field="earlyWarningSetting.frequencyText" title="频率"></vxe-column>
+					<vxe-column field="fullAddress" title="预警地点"></vxe-column>
+					<vxe-column field="isEnable" title="关联工单">
+						<template #default="{ row }">
+							<el-button type="primary" link  @click="onDetail(row)">{{ row.earlyWarningOrderDetails.length }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column field="lastEarlyTime" title="最新预警时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.lastEarlyTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="90" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onDetail(row)" title="查看详情"> 详情 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!--  详情  -->
+		<manage-detail ref="manageDetailRef" />
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="earlyManage">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteEarlySetting, getEarlySettingBaseData, getEarlySettingList } from '@/api/early/setting';
+import { getEarlyManageList } from '@/api/early/manage';
+// 引入组件
+const ManageDetail = defineAsyncComponent(() => import('@/views/early/manage/components/Detail.vue')); // 详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
-</style>
+// 定义变量内容
+const state = reactive({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		EarlyWarningName: null, // 预警名称
+		EarlyWarningLevelValue: null, // 预警级别
+		SortField: null,
+		SortRule: null,
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<any>(null); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const queryList = () => {
+	state.loading = true;
+	getEarlyManageList(state.queryParams)
+		.then((res) => {
+			state.loading = false;
+			state.tableData = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 查看详情
+const manageDetailRef = ref<RefType>();
+const onDetail = (row: any) => {
+	manageDetailRef.value.openDialog(row.id);
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+// 获取基础信息
+const earlyWarningLevel = ref<EmptyArrayType>([]); // 预警级别
+const queryBaseInfo = () => {
+	getEarlySettingBaseData().then((res) => {
+		earlyWarningLevel.value = res.result.earlyWarningLevel ?? [];
+	});
+};
+// 页面加载时
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	queryBaseInfo();
+});
+</script>

+ 113 - 0
src/views/early/push/components/Detail.vue

@@ -0,0 +1,113 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增预警设置" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef" :disabled="loading">
+			<p class="border-title mb10">基本信息</p>
+			<el-form-item label="推送报告名称"> </el-form-item>
+			<el-form-item label="推送部门"> </el-form-item>
+			<p class="border-title mb10 mt20">推送工单</p>
+			<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true, keyField: 'id' }"
+				ref="tableRef"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 100 }"
+				showHeaderOverflow
+				max-height="500"
+			>
+				<vxe-column field="no" title="工单编码"></vxe-column>
+				<vxe-column field="title" title="工单标题" min-width="200">
+					<template #default="{ row }">
+						<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="order.creationTime" title="受理时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="hotspotName" title="热点分类"></vxe-column>
+				<vxe-column field="hotspotName" title="事发地址"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+				<vxe-column field="statusText" title="推送状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+			</vxe-table>
+			<p class="border-title mb10 mt20">报告文件</p>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { addEarlySetting, getEarlySettingBaseData } from '@/api/early/setting';
+import { getEarlyManageDetail } from '@/api/early/manage';
+import { formatDate } from '@/utils/formatTime';
+
+
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {},
+	tableData: [],
+});
+// 获取详情
+let loading = ref<boolean>(false); // 加载状态
+const getDetail = (id: string) => {
+	loading.value = true;
+	getEarlyManageDetail(id)
+		.then((res: any) => {
+			console.log(res);
+			loading.value = false;
+		})
+		.catch((err) => {
+			console.log(err);
+			loading.value = false;
+		});
+};
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (id: string) => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+		getDetail(id);
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 212 - 0
src/views/early/push/components/Push-add.vue

@@ -0,0 +1,212 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增推送" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" :disabled="loading">
+			<p class="border-title mb10">基本信息</p>
+			<el-form-item label="推送报告名称" prop="earlyWarningPushName" :rules="[{ required: true, message: '请填预推送报告名称', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.earlyWarningPushName" placeholder="请填写推送报告名称" clearable></el-input>
+			</el-form-item>
+			<el-form-item label="推送部门" prop="pushOrgs" :rules="[{ required: true, message: '请选择推送部门', trigger: 'change' }]">
+				<div class="w100">
+					<VTreeDrop
+						:data="orgsOptions"
+						checkable
+						keyField="id"
+						titleField="name"
+						v-model="state.ruleForm.pushOrgs"
+						:dropHeight="250"
+						dropPlaceholder="推送部门"
+						dropdownWidthFixed
+						clearable
+						searchPlaceholder="推送部门名称"
+						checkedButtonText="查看已选"
+						:show-footer="false"
+						:cascade="false"
+					>
+					</VTreeDrop>
+				</div>
+			</el-form-item>
+			<p class="border-title mb10 mt20">推送工单</p>
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent>
+				<el-form-item label="关键词" prop="Keyword">
+					<el-input v-model="state.queryParams.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true, keyField: 'id' }"
+				ref="tableRef"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 100 }"
+				showHeaderOverflow
+				@checkbox-all="selectAllChangeEvent"
+				@checkbox-change="selectChangeEvent"
+				max-height="500"
+			>
+				<vxe-column type="checkbox" width="60" align="center"></vxe-column>
+				<vxe-column field="title" title="工单标题" min-width="200">
+					<template #default="{ row }">
+						<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="no" title="工单编码"></vxe-column>
+				<vxe-column field="hotspotName" title="热点分类"></vxe-column>
+				<vxe-column field="currentStepName" title="当前节点"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+			</vxe-table>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="warning" @click="onSubmit(ruleFormRef, 1)" :loading="loading">暂存</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef, 3)" :loading="loading">生成报告并推送</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef, 2)" :loading="loading">推 送</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { computed, defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { addEarlySetting, getEarlySettingBaseData } from '@/api/early/setting';
+import { VTreeDrop } from '@wsfe/vue-tree';
+import { getCanUseOrg } from '@/api/system/user';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		earlyWarningName: null, // 预警名称
+		earlyWarningLevelName: null, // 预警级别
+		earlyWarningLevelValue: null, // 预警级别
+		earlyWarningTypeName: null, // 预警类型
+		earlyWarningTypeValue: null, // 预警类型
+		frequency: null, // 频率
+		isEnable: true, // 是否启用
+		earlyWarningRemark: null, // 预警原因
+	},
+	queryParams: {
+		PageIndex: 1, // 当前页
+		PageSize: 10, // 每页条数
+		Keyword: null, // 关键字
+	},
+	tableData: [], // 表格数据
+	total: 0, // 总条数
+});
+let loading = ref<boolean>(false); // 加载状态
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async () => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+		queryBaseInfo();
+	} catch (error) {
+		console.log(error);
+	}
+};
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	handleQuery();
+};
+const queryList = () => {};
+// 获取基础信息
+const orgsOptions = ref<EmptyArrayType>([]); // 来源单位
+const queryBaseInfo = () => {
+	getCanUseOrg().then((res: any) => {
+		orgsOptions.value = res.result ?? [];
+	});
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+const tableRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+// 新增
+// operateModel 操作方式 1:暂存 2:推送 3:推送并生成报告
+const onSubmit = throttle(async (formEl: FormInstance | undefined, operateModel: number) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		loading.value = true;
+		const request = {
+			...state.ruleForm,
+		};
+		addEarlySetting(request)
+			.then(() => {
+				ElMessage({
+					message: '新增成功',
+					type: 'success',
+				});
+				emit('updateList');
+			})
+			.catch((error) => {})
+			.finally(() => {
+				loading.value = false;
+				closeDialog();
+			});
+	});
+}, 300);
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 173 - 7
src/views/early/push/index.vue

@@ -1,11 +1,177 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-
+	<div class="early-push-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading">
+				<el-form-item label="推送报告名称" prop="EarlyWarningPushName">
+					<el-input
+						v-model="state.queryParams.EarlyWarningPushName"
+						placeholder="请填写推送报告名称"
+						clearable
+						@keyup.enter="handleQuery"
+						class="keyword-input"
+					/>
+				</el-form-item>
+				<el-form-item label="推送状态" prop="EarlyPushStatus">
+					<el-select v-model="state.queryParams.EarlyPushStatus" placeholder="请选择推送状态" @change="handleQuery">
+						<el-option v-for="item in earlyWarningLevel" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+				<template #buttons>
+					<el-button type="primary" @click="onAdd" v-auth="'early:push:add'"> <SvgIcon name="ele-Plus" class="mr5" />新增推送 </el-button>
+				</template>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true, useKey: true }"
+					:row-config="{ isCurrent: true, isHover: true, useKey: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="earlyPush"
+					:custom-config="{ storage: true }"
+					:sort-config="{ remote: true }"
+					@sort-change="sortChange"
+				>
+					<vxe-column field="earlyWarningSetting.earlyWarningName" title="预警名称"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningLevelName" title="预警级别"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="时间/时间段"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="预警类型"></vxe-column>
+					<vxe-column field="earlyWarningSetting.frequencyText" title="频率"></vxe-column>
+					<vxe-column field="fullAddress" title="预警地点"></vxe-column>
+					<vxe-column field="isEnable" title="关联工单">
+						<template #default="{ row }">
+							<el-button type="primary" link  @click="onDetail(row)">{{ row.earlyWarningOrderDetails.length }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column field="lastEarlyTime" title="最新预警时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.lastEarlyTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="90" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onDetail(row)" title="查看详情"> 详情 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!--  新增  -->
+		<push-add ref="pushAddRef"  @updateList="queryList"/>
+		<!--  详情  -->
+		<push-detail ref="pushDetailRef" />
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="earlyPush">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteEarlySetting, getEarlySettingBaseData, getEarlySettingList } from '@/api/early/setting';
+import { getEarlyManageList } from '@/api/early/manage';
+import { getEarlyPushList } from '@/api/early/push';
+// 引入组件
+const PushDetail = defineAsyncComponent(() => import('@/views/early/push/components/Detail.vue')); // 详情
+const PushAdd = defineAsyncComponent(() => import('@/views/early/push/components/Push-add.vue')); // 新增
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
-</style>
+// 定义变量内容
+const state = reactive({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		EarlyWarningPushName: null, // 推送报告名称
+		EarlyPushStatus: null, // 推送状态
+		SortField: null,
+		SortRule: null,
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<any>(null); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const queryList = () => {
+	state.loading = true;
+	getEarlyPushList(state.queryParams)
+		.then((res) => {
+			state.loading = false;
+			state.tableData = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 新增
+const pushAddRef = ref<RefType>();
+const onAdd = () => {
+	pushAddRef.value.openDialog();
+};
+// 查看详情
+const pushDetailRef = ref<RefType>();
+const onDetail = (row: any) => {
+	pushDetailRef.value.openDialog(row.id);
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+// 获取基础信息
+const earlyWarningLevel = ref<EmptyArrayType>([]); // 预警级别
+const queryBaseInfo = () => {
+	getEarlySettingBaseData().then((res) => {
+		earlyWarningLevel.value = res.result.earlyWarningLevel ?? [];
+	});
+};
+// 页面加载时
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	queryBaseInfo();
+});
+</script>

+ 104 - 0
src/views/early/receive/components/Detail.vue

@@ -0,0 +1,104 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增预警设置" @close="close" append-to-body destroy-on-close>
+		<el-form :model="state.ruleForm" label-width="100px" ref="ruleFormRef" :disabled="loading">
+			<p class="border-title mb10 mt20">推送工单</p>
+			<vxe-table
+				border
+				:loading="state.loading"
+				:data="state.tableData"
+				:column-config="{ resizable: true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true, keyField: 'id' }"
+				ref="tableRef"
+				show-overflow
+				:scrollY="{ enabled: true, gt: 100 }"
+				showHeaderOverflow
+				max-height="500"
+			>
+				<vxe-column field="no" title="工单编码"></vxe-column>
+				<vxe-column field="title" title="工单标题" min-width="200">
+					<template #default="{ row }">
+						<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					</template>
+				</vxe-column>
+				<vxe-column field="order.creationTime" title="受理时间" width="160">
+					<template #default="{ row }">
+						{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+					</template>
+				</vxe-column>
+				<vxe-column field="hotspotName" title="热点分类"></vxe-column>
+				<vxe-column field="hotspotName" title="事发地址"></vxe-column>
+				<vxe-column field="statusText" title="工单状态" width="160">
+					<template #default="{ row }">
+						<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+						<span v-else>{{ row.statusText }}</span>
+					</template>
+				</vxe-column>
+			</vxe-table>
+			<p class="border-title mb10 mt20">报告文件</p>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { throttle } from '@/utils/tools';
+import { addEarlySetting, getEarlySettingBaseData } from '@/api/early/setting';
+import { getEarlyManageDetail } from '@/api/early/manage';
+import { formatDate } from '@/utils/formatTime';
+
+
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {},
+	tableData: [],
+});
+// 获取详情
+let loading = ref<boolean>(false); // 加载状态
+const getDetail = (id: string) => {
+	loading.value = true;
+	getEarlyManageDetail(id)
+		.then((res: any) => {
+			console.log(res);
+			loading.value = false;
+		})
+		.catch((err) => {
+			console.log(err);
+			loading.value = false;
+		});
+};
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = async (id: string) => {
+	ruleFormRef.value?.resetFields();
+	try {
+		state.dialogVisible = true;
+		getDetail(id);
+	} catch (error) {
+		console.log(error);
+	}
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 152 - 7
src/views/early/receive/index.vue

@@ -1,11 +1,156 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-
+	<div class="early-receive-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading">
+				<el-form-item label="报告名称" prop="EarlyWarningPushName">
+					<el-input
+						v-model="state.queryParams.EarlyWarningPushName"
+						placeholder="请填写报告名称"
+						clearable
+						@keyup.enter="handleQuery"
+						class="keyword-input"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true, useKey: true }"
+					:row-config="{ isCurrent: true, isHover: true, useKey: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="earlyReceive"
+					:custom-config="{ storage: true }"
+					:sort-config="{ remote: true }"
+					@sort-change="sortChange"
+				>
+					<vxe-column field="earlyWarningSetting.earlyWarningName" title="报告名称"></vxe-column>
+					<vxe-column field="isEnable" title="关联工单">
+						<template #default="{ row }">
+							<el-button type="primary" link  @click="onDetail(row)">{{ row.earlyWarningOrderDetails.length }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column field="lastEarlyTime" title="推送时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.lastEarlyTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="90" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onDetail(row)" title="查看详情"> 详情 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!--  详情  -->
+		<recevie-detail ref="recevieDetailRef" />
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="earlyReceive">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteEarlySetting, getEarlySettingBaseData, getEarlySettingList } from '@/api/early/setting';
+import { getEarlyManageList } from '@/api/early/manage';
+import { getEarlyReceiveList } from '@/api/early/receive';
+// 引入组件
+const RecevieDetail = defineAsyncComponent(() => import('@/views/early/receive/components/Detail.vue')); // 详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
-</style>
+// 定义变量内容
+const state = reactive({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		EarlyWarningPushName: null, // 报告名称
+		EarlyWarningLevelValue: null, // 预警级别
+		SortField: null,
+		SortRule: null,
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<any>(null); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const queryList = () => {
+	state.loading = true;
+	getEarlyReceiveList(state.queryParams)
+		.then((res) => {
+			state.loading = false;
+			state.tableData = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 查看详情
+const recevieDetailRef = ref<RefType>();
+const onDetail = (row: any) => {
+	recevieDetailRef.value.openDialog(row.id);
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+// 获取基础信息
+const earlyWarningLevel = ref<EmptyArrayType>([]); // 预警级别
+const queryBaseInfo = () => {
+	getEarlySettingBaseData().then((res) => {
+		earlyWarningLevel.value = res.result.earlyWarningLevel ?? [];
+	});
+};
+// 页面加载时
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	queryBaseInfo();
+});
+</script>

+ 173 - 7
src/views/early/statistics/index.vue

@@ -1,11 +1,177 @@
-<script setup lang="ts">
-
-</script>
-
 <template>
-
+	<div class="early-statistics-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.loading">
+				<el-form-item label="推送报告名称" prop="EarlyWarningPushName">
+					<el-input
+						v-model="state.queryParams.EarlyWarningPushName"
+						placeholder="请填写推送报告名称"
+						clearable
+						@keyup.enter="handleQuery"
+						class="keyword-input"
+					/>
+				</el-form-item>
+				<el-form-item label="推送状态" prop="EarlyPushStatus">
+					<el-select v-model="state.queryParams.EarlyPushStatus" placeholder="请选择推送状态" @change="handleQuery">
+						<el-option v-for="item in earlyWarningLevel" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+			>
+				<template #buttons>
+					<el-button type="primary" @click="onAdd" v-auth="'early:push:add'"> <SvgIcon name="ele-Plus" class="mr5" />新增推送 </el-button>
+				</template>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true, useKey: true }"
+					:row-config="{ isCurrent: true, isHover: true, useKey: true, height: 30 }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="earlyStatistics"
+					:custom-config="{ storage: true }"
+					:sort-config="{ remote: true }"
+					@sort-change="sortChange"
+				>
+					<vxe-column field="earlyWarningSetting.earlyWarningName" title="预警名称"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningLevelName" title="预警级别"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="时间/时间段"></vxe-column>
+					<vxe-column field="earlyWarningSetting.earlyWarningTypeName" title="预警类型"></vxe-column>
+					<vxe-column field="earlyWarningSetting.frequencyText" title="频率"></vxe-column>
+					<vxe-column field="fullAddress" title="预警地点"></vxe-column>
+					<vxe-column field="isEnable" title="关联工单">
+						<template #default="{ row }">
+							<el-button type="primary" link  @click="onDetail(row)">{{ row.earlyWarningOrderDetails.length }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column field="lastEarlyTime" title="最新预警时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.lastEarlyTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column title="操作" fixed="right" width="90" align="center">
+						<template #default="{ row }">
+							<el-button link type="primary" @click="onDetail(row)" title="查看详情"> 详情 </el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+		<!--  新增  -->
+		<push-add ref="pushAddRef"  @updateList="queryList"/>
+		<!--  详情  -->
+		<push-detail ref="pushDetailRef" />
+	</div>
 </template>
 
-<style scoped lang="scss">
+<script lang="tsx" setup name="earlyStatistics">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { deleteEarlySetting, getEarlySettingBaseData, getEarlySettingList } from '@/api/early/setting';
+import { getEarlyManageList } from '@/api/early/manage';
+import { getEarlyPushList } from '@/api/early/push';
+// 引入组件
+const PushDetail = defineAsyncComponent(() => import('@/views/early/push/components/Detail.vue')); // 详情
+const PushAdd = defineAsyncComponent(() => import('@/views/early/push/components/Push-add.vue')); // 新增
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
-</style>
+// 定义变量内容
+const state = reactive({
+	loading: false, // 加载状态
+	queryParams: {
+		// 查询参数
+		PageIndex: 1,
+		PageSize: 20,
+		EarlyWarningPushName: null, // 推送报告名称
+		EarlyPushStatus: null, // 推送状态
+		SortField: null,
+		SortRule: null,
+	},
+	total: 0, // 总条数
+	tableData: [], // 表格数据
+});
+const ruleFormRef = ref<any>(null); // 表单ref
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+// 获取列表
+const queryList = () => {
+	state.loading = true;
+	getEarlyPushList(state.queryParams)
+		.then((res) => {
+			state.loading = false;
+			state.tableData = res.result.items ?? [];
+			state.total = res.result.total ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 排序
+const sortChange = (val: any) => {
+	state.queryParams.SortField = val.order ? val.field : null;
+	// 0 升序 1 降序
+	state.queryParams.SortRule = val.order ? (val.order == 'desc' ? 1 : 0) : null;
+	queryList();
+};
+// 重置表单
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 新增
+const pushAddRef = ref<RefType>();
+const onAdd = () => {
+	pushAddRef.value.openDialog();
+};
+// 查看详情
+const pushDetailRef = ref<RefType>();
+const onDetail = (row: any) => {
+	pushDetailRef.value.openDialog(row.id);
+};
+const tableRef = ref<RefType>();
+const toolbarRef = ref<RefType>();
+// 获取基础信息
+const earlyWarningLevel = ref<EmptyArrayType>([]); // 预警级别
+const queryBaseInfo = () => {
+	getEarlySettingBaseData().then((res) => {
+		earlyWarningLevel.value = res.result.earlyWarningLevel ?? [];
+	});
+};
+// 页面加载时
+onMounted(() => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+	queryBaseInfo();
+});
+</script>