Przeglądaj źródła

Merge branch 'master' of http://192.168.110.30:3000/nahida/yuanling-app

丁烨烨 1 rok temu
rodzic
commit
6d951c6026

+ 120 - 69
pages/eventDetail/index.vue

@@ -1,40 +1,40 @@
 <template>
 	<view class="container">
 		<!-- 顶部导航 -->
-		<view class="header">
+		<!-- <view class="header">
 			<view class="nav-bar">
 				<text class="title">事件处理中心</text>
 			</view>
-		</view>
+		</view> -->
 		<!-- 滚动区域 -->
 		<scroll-view scroll-y class="content">
 			<!-- 事件信息 -->
 			<view class="event-info">
 				<view class="event-header">
-					<text class="event-id">事件编号: EV20240101001</text>
-					<text class="event-status">处理中</text>
+					<!-- <text class="event-id">报警编号: {{eventDetail.id}}</text> -->
+					<text class="event-status">{{eventDetail.statusText}}</text>
 				</view>
 				<view class="event-detail">
 					<view class="detail-item">
 						<text class="label">发生时间:</text>
-						<text class="value">2024-01-01 10:30</text>
+						<text class="value">{{eventDetail.time}}</text>
 					</view>
 					<view class="detail-item">
 						<text class="label">事件地点:</text>
-						<text class="value">A区域-1号楼-101室</text>
+						<text class="value">{{eventDetail.location}}</text>
 					</view>
 					<view class="detail-item">
 						<text class="label">事件类型:</text>
-						<text class="value">安全隐患</text>
+						<text class="value">{{eventDetail.type}}</text>
 					</view>
 					<view class="detail-item">
 						<text class="label">严重程度:</text>
-						<text class="value danger">高危</text>
+						<text class="value danger">{{eventDetail.level}}</text>
 					</view>
 				</view>
 				<view class="event-desc">
 					<text class="desc-title">事件描述</text>
-					<text class="desc-content">发现可疑人员在A区域徘徊,疑似携带危险物品,需要立即处理。</text>
+					<text class="desc-content">{{eventDetail.description}}</text>
 				</view>
 			</view>
 			<!-- 紧急联动 -->
@@ -49,47 +49,51 @@
 			</view>
 			<!-- 告警信息 -->
 			<view class="alert-section">
-				<text class="section-title">告警信息下发</text>
-				<textarea class="alert-input" placeholder="请输入告警信息内容" v-model="alertMessage" />
-				<view class="alert-actions">
+				<text class="section-title">处理信息</text>
+				<textarea class="alert-input" placeholder="请输入处理信息内容" v-model="alertMessage" />
+				<!-- <view class="alert-actions">
 					<uni-button class="select-btn" @click="selectReceivers">选择接收人</uni-button>
 					<uni-button type="primary" @click="sendAlert">发送告警</uni-button>
-				</view>
+				</view> -->
 			</view>
 		</scroll-view>
 		<!-- 底部操作栏 -->
 		<view class="footer">
-			<uni-button type="default" @click="markComplete">标记处理完成</uni-button>
-			<uni-button type="warn" @click="escalateEvent">事件升级</uni-button>
+			<view class="footer-container">
+				<text class="mark-text">标记为</text>
+				<picker :range="alarmArr" :value="index" @change="handleChange">
+					<button type="primary" size="mini" class="mark-stats">{{alarmArr[index]}}</button>
+				</picker>
+			</view>
+		</view>
+		<view class="commit">
+			<uni-button type="default" @click="markComplete">完成</uni-button>
 		</view>
 	</view>
 </template>
 <script lang="ts" setup>
-	import { ref } from 'vue';
-	const alertMessage = ref('');
-	const securityList = ref([
-		{
-			name: '张警官',
-			avatar: 'https://ai-public.mastergo.com/ai/img_res/40599d84c3ff6f1f857d0d5b1209e880.jpg',
-			location: 'A区域-2号楼',
-			distance: '50',
-			online: true
-		},
-		{
-			name: '李警官',
-			avatar: 'https://ai-public.mastergo.com/ai/img_res/ab6b488f45c3634c6f8a5b2b8c0df36e.jpg',
-			location: 'B区域-1号楼',
-			distance: '150',
-			online: true
-		},
-		{
-			name: '王警官',
-			avatar: 'https://ai-public.mastergo.com/ai/img_res/9334d63f8a4889e90da6858a94fd5306.jpg',
-			location: 'C区域-3号楼',
-			distance: '200',
-			online: false
-		}
-	]);
+	interface EventItem {
+		id : number;
+		status : "ignore" | "mistake" | "completed" | "processing" | "pending";
+		statusText : string;
+		time : string;
+		location : string;
+		level : string;
+		levelClass : string;
+		type : string;
+		description : string;
+		person : string;
+  }
+
+  import {onMounted, ref} from 'vue';
+  import {clientPostWithQueryParams} from '../../utils/request';
+
+  const alertMessage = ref('');
+	const alarmArr = ref(["处理中", "已处理", "误报", "忽略"]);
+	const index = ref(1);
+	const handleChange = (q) => {
+		index.value = q.detail.value;
+	}
 	const emergencyList = ref([
 		{ text: '110警察', icon: 'phone-filled', color: '#2979ff' },
 		{ text: '119消防', icon: 'fire-filled', color: '#f56c6c' },
@@ -113,43 +117,75 @@
 		uni.showToast({ title: '选择接收人功能开发中', icon: 'none' });
 	};
 	const sendAlert = () => {
-		if (!alertMessage.value) {
-			uni.showToast({ title: '请输入告警信息', icon: 'none' });
-			return;
-		}
-		uni.showToast({ title: '告警信息已发送', icon: 'success' });
 		alertMessage.value = '';
 	};
+	
+	const markEvent = async () => {
+		const res = await clientPostWithQueryParams("/visualization/fireFighting/getAlarmEventProcessing",{
+			alarmCode:eventDetail.value.id,
+			alarmDate:eventDetail.value.time,
+			handleStat:index.value + 1,
+			handleMessage:alertMessage.value
+		})
+		console.log(res);
+		if(res.code !== 200){
+			uni.showToast({
+				title:"请求失败",
+				duration:2000
+			})
+		}else{
+			uni.showToast({
+				title:"操作成功",
+				duration:2000
+			})
+			uni.navigateBack();
+		}
+	}
+	
 	const markComplete = () => {
 		uni.showModal({
 			title: '确认完成',
-			content: '是否确认将该事件标记为已处理完成?',
-			success: (res) => {
-				if (res.confirm) {
-					uni.showToast({ title: '事件已标记完成', icon: 'success' });
-				}
-			}
-		});
-	};
-	const escalateEvent = () => {
-		uni.showModal({
-			title: '事件升级',
-			content: '是否确认将该事件升级处理?',
+			content: '是否确认将该事件标记为'+alarmArr.value[index.value]+"?",
 			success: (res) => {
 				if (res.confirm) {
-					uni.showToast({ title: '事件已升级', icon: 'success' });
+					markEvent();
 				}
 			}
 		});
 	};
+	// const escalateEvent = () => {
+	// 	uni.showModal({
+	// 		title: '事件升级',
+	// 		content: '是否确认将该事件升级处理?',
+	// 		success: (res) => {
+	// 			if (res.confirm) {
+	// 				uni.showToast({ title: '事件已升级', icon: 'success' });
+	// 			}
+	// 		}
+	// 	});
+	// };
+	const eventDetail = ref<EventItem>({
+		id: 0,
+		status: 'ignore',
+		statusText: '',
+		time: '',
+		location: '',
+		level: '',
+		levelClass: '',
+		type: '',
+		description: '',
+		person: ''
+	});
+	onMounted(() => {
+		eventDetail.value = uni.getStorageSync("eventDetail");
+	})
 </script>
-<style>
+<style scoped>
 	page {
 		height: 100%;
 	}
 
 	.container {
-		height: 100%;
 		display: flex;
 		flex-direction: column;
 		background-color: #f5f5f5;
@@ -195,6 +231,7 @@
 	.event-id {
 		font-size: 14px;
 		color: #666666;
+		width: 70vw;
 	}
 
 	.event-status {
@@ -378,7 +415,7 @@
 	.alert-section {
 		background-color: #ffffff;
 		padding: 30rpx;
-		margin-bottom: 120rpx;
+		/* margin-bottom: 120rpx; */
 	}
 
 	.alert-input {
@@ -404,14 +441,28 @@
 	}
 
 	.footer {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		right: 0;
 		display: flex;
-		justify-content: space-between;
-		padding: 20rpx 30rpx;
-		background-color: #ffffff;
-		box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
+		margin: 20rpx 0rpx;
+		background: #fff;
+		font-size: 16px;
+	}
+	
+	.footer-container{
+		display: flex;
+		gap: 20rpx;
+		margin: 30rpx;
+	}
+	
+	.mark-text{
+		line-height: 50rpx;
+	}
+/* 
+	.mark-stats {
+		color: #2979ff;
+		border: 1px solid #ccc;
+		box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+	} */
+	.commit{
+		
 	}
 </style>

+ 758 - 0
pages/eventList/eventMap.js

@@ -0,0 +1,758 @@
+export const eventMap = new Map();
+
+export const alarmGradeMap = new Map();
+alarmGradeMap.set(1,"严重");
+alarmGradeMap.set(2,"一般");
+alarmGradeMap.set(3,"轻微");
+
+export const alarmGradeClassMap = new Map();
+alarmGradeClassMap.set(1,"important");
+alarmGradeClassMap.set(2,"normal");
+alarmGradeClassMap.set(3,"urgent");
+
+export const alarmTypeMap = new Map();
+alarmTypeMap.set(1, "视频丢失");
+alarmTypeMap.set(2, "外部报警");
+alarmTypeMap.set(3, "移动侦测");
+alarmTypeMap.set(4, "视频遮挡");
+alarmTypeMap.set(5, "硬盘满");
+alarmTypeMap.set(6, "硬盘故障");
+alarmTypeMap.set(13, "通道断线");
+alarmTypeMap.set(16, "设备断线");
+alarmTypeMap.set(19, "红外探测报警");
+alarmTypeMap.set(28, "远程外部报警");
+alarmTypeMap.set(41, "胁迫报警");
+alarmTypeMap.set(42, "合法密码开门");
+alarmTypeMap.set(43, "非法密码开门");
+alarmTypeMap.set(44, "胁迫密码开门");
+alarmTypeMap.set(45, "合法指纹开门");
+alarmTypeMap.set(46, "非法指纹开门");
+alarmTypeMap.set(48, "远程开门");
+alarmTypeMap.set(49, "出门按钮");
+alarmTypeMap.set(51, "合法刷卡");
+alarmTypeMap.set(52, "非法刷卡");
+alarmTypeMap.set(53, "门磁报警");
+alarmTypeMap.set(54, "异常开门");
+alarmTypeMap.set(55, "异常关门");
+alarmTypeMap.set(56, "正常关门");
+alarmTypeMap.set(57, "正常开门");
+alarmTypeMap.set(61, "人脸合法开门");
+alarmTypeMap.set(62, "人脸非法开门");
+alarmTypeMap.set(81, "防区触发");
+alarmTypeMap.set(215, "低速");
+alarmTypeMap.set(216, "超速");
+alarmTypeMap.set(221, "侧翻");
+alarmTypeMap.set(222, "碰撞");
+alarmTypeMap.set(225, "低电压");
+alarmTypeMap.set(274, "紧急转弯");
+alarmTypeMap.set(275, "急加速");
+alarmTypeMap.set(276, "急减速");
+alarmTypeMap.set(302, "绊线入侵");
+alarmTypeMap.set(303, "区域入侵");
+alarmTypeMap.set(305, "物品遗留");
+alarmTypeMap.set(306, "人员滞留检测");
+alarmTypeMap.set(307, "徘徊检测");
+alarmTypeMap.set(309, "快速移动");
+alarmTypeMap.set(310, "尾随报警");
+alarmTypeMap.set(311, "人群聚集");
+alarmTypeMap.set(312, "火焰检测");
+alarmTypeMap.set(313, "烟雾报警");
+alarmTypeMap.set(314, "剧烈运动检测");
+alarmTypeMap.set(316, "客流人数报警");
+alarmTypeMap.set(319, "视频诊断检测");
+alarmTypeMap.set(326, "人脸检测事件");
+alarmTypeMap.set(466, "工程车检测报警");
+alarmTypeMap.set(500, "未成年人报警");
+alarmTypeMap.set(501, "未戴口罩报警");
+alarmTypeMap.set(564, "非法停车");
+alarmTypeMap.set(574, "异常奔跑");
+alarmTypeMap.set(575, "逆行检测");
+alarmTypeMap.set(577, "物品搬移");
+alarmTypeMap.set(578, "停车检测");
+alarmTypeMap.set(586, "起身检测");
+alarmTypeMap.set(587, "翻越围栏");
+alarmTypeMap.set(594, "声音异常检测");
+alarmTypeMap.set(596, "攀高检测");
+alarmTypeMap.set(597, "离岗检测");
+alarmTypeMap.set(613, "驾驶员抽烟报警");
+alarmTypeMap.set(614, "驾驶员接打电话报警");
+alarmTypeMap.set(639, "驾驶员视频遮盖事件");
+alarmTypeMap.set(665, "场景变更");
+alarmTypeMap.set(672, "人员靠近检测");
+alarmTypeMap.set(675, "跌倒检测");
+alarmTypeMap.set(819, "驾驶员疲劳驾驶报警");
+alarmTypeMap.set(822, "驾驶员低头");
+alarmTypeMap.set(823, "左顾右盼");
+alarmTypeMap.set(824, "离岗检测");
+alarmTypeMap.set(826, "区域内人数报警");
+alarmTypeMap.set(828, "打哈欠");
+alarmTypeMap.set(861, "车牌对比事件");
+alarmTypeMap.set(873, "扶梯异常");
+alarmTypeMap.set(881, "火情事件");
+alarmTypeMap.set(882, "出店经营");
+alarmTypeMap.set(888, "非机动车未戴安全帽事件");
+alarmTypeMap.set(962, "人穿越警戒线");
+alarmTypeMap.set(963, "机动车穿越警戒线");
+alarmTypeMap.set(964, "人穿越区域");
+alarmTypeMap.set(965, "机动车穿越区域");
+alarmTypeMap.set(972, "无人作业");
+alarmTypeMap.set(973, "单人作业");
+alarmTypeMap.set(974, "没穿红马甲");
+alarmTypeMap.set(980, "快速移动(人)");
+alarmTypeMap.set(981, "快速移动(车)");
+alarmTypeMap.set(989, "电力检测安全带检测事件");
+alarmTypeMap.set(1420, "超时门未关");
+alarmTypeMap.set(1425, "闸机机箱防拆报警");
+alarmTypeMap.set(1430, "非法闯入");
+alarmTypeMap.set(1433, "黑名单报警");
+alarmTypeMap.set(1434, "合法二维码开门");
+alarmTypeMap.set(1435, "非法二维码开门");
+alarmTypeMap.set(1436, "人证合法开门");
+alarmTypeMap.set(1437, "人证非法开门");
+alarmTypeMap.set(1438, "人证和身份证非法开门");
+alarmTypeMap.set(1439, "人证和身份证合法开门");
+alarmTypeMap.set(1441, "蓝牙合法开门");
+alarmTypeMap.set(1442, "蓝牙非法开门");
+alarmTypeMap.set(1443, "外部报警");
+alarmTypeMap.set(1448, "RFID感应报警");
+alarmTypeMap.set(1449, "RFID非法感应报警");
+alarmTypeMap.set(1450, "RFID外部报警");
+alarmTypeMap.set(1455, "先刷卡后密码合法开门");
+alarmTypeMap.set(1456, "先刷卡后密码非法开门");
+alarmTypeMap.set(1461, "刷卡+指纹组合合法开门");
+alarmTypeMap.set(1462, "刷卡+指纹组合非法开门");
+alarmTypeMap.set(1463, "多人合法开门");
+alarmTypeMap.set(1464, "多人非法开门");
+alarmTypeMap.set(1467, "人员编号+密码合法开门");
+alarmTypeMap.set(1468, "人员编号+密码非法开门");
+alarmTypeMap.set(1469, "人脸+密码合法开门");
+alarmTypeMap.set(1470, "人脸+密码非法开门");
+alarmTypeMap.set(1471, "指纹+密码合法开门");
+alarmTypeMap.set(1472, "指纹+密码非法开门");
+alarmTypeMap.set(1473, "指纹+人脸合法开门");
+alarmTypeMap.set(1474, "指纹+人脸非法开门");
+alarmTypeMap.set(1475, "刷卡+人脸合法开门");
+alarmTypeMap.set(1476, "刷卡+人脸非法开门");
+alarmTypeMap.set(1487, "指纹+人脸+密码合法开门");
+alarmTypeMap.set(1488, "指纹+人脸+密码非法开门");
+alarmTypeMap.set(1489, "刷卡+人脸+密码合法开门");
+alarmTypeMap.set(1490, "刷卡+人脸+密码非法开门");
+alarmTypeMap.set(1491, "刷卡+指纹+密码合法开门");
+alarmTypeMap.set(1492, "刷卡+指纹+密码非法开门");
+alarmTypeMap.set(1493, "卡+指纹+人脸合法开门");
+alarmTypeMap.set(1494, "卡+指纹+人脸非法开门");
+alarmTypeMap.set(1667, "反潜回报警");
+alarmTypeMap.set(1907, "对讲事件报警");
+alarmTypeMap.set(1909, "输入异常");
+alarmTypeMap.set(1912, "WIFI终端发现报警");
+alarmTypeMap.set(1916, "无硬盘");
+alarmTypeMap.set(1917, "双控版本异常");
+alarmTypeMap.set(1918, "集群切换");
+alarmTypeMap.set(1924, "存储池异常");
+alarmTypeMap.set(1925, "RAID报警");
+alarmTypeMap.set(1926, "共享服务异常");
+alarmTypeMap.set(1998, "声强突变");
+alarmTypeMap.set(2201, "被动红外");
+alarmTypeMap.set(2604, "防区失效");
+alarmTypeMap.set(4300, "传感器门磁");
+alarmTypeMap.set(4301, "被动红外(对讲设备类)");
+alarmTypeMap.set(4302, "气感");
+alarmTypeMap.set(4303, "烟感");
+alarmTypeMap.set(4304, "水感");
+alarmTypeMap.set(4305, "主动红外");
+alarmTypeMap.set(4306, "玻璃破碎");
+alarmTypeMap.set(4307, "紧急开关");
+alarmTypeMap.set(4308, "震动");
+alarmTypeMap.set(4309, "双鉴(红外+微波)");
+alarmTypeMap.set(4310, "三技术");
+alarmTypeMap.set(4311, "温度");
+alarmTypeMap.set(4312, "湿度");
+alarmTypeMap.set(4313, "风速");
+alarmTypeMap.set(4314, "呼叫按钮");
+alarmTypeMap.set(4315, "气体压力");
+alarmTypeMap.set(4316, "燃气浓度");
+alarmTypeMap.set(4317, "气体流量");
+alarmTypeMap.set(4319, "油量检测,汽油、柴油等车辆用油检测");
+alarmTypeMap.set(4320, "里程数检测");
+alarmTypeMap.set(4321, "紧急按钮");
+alarmTypeMap.set(4322, "盗窃");
+alarmTypeMap.set(4323, "周界");
+alarmTypeMap.set(4324, "防拆");
+alarmTypeMap.set(4326, "门锁钥匙报警");
+alarmTypeMap.set(4327, "门锁低电压报警");
+alarmTypeMap.set(4328, "本机设备防拆报警");
+alarmTypeMap.set(4329, "对讲胁迫报警");
+alarmTypeMap.set(4330, "门锁离线报警");
+alarmTypeMap.set(4339, "幕帘报警");
+alarmTypeMap.set(4396, "医疗上报报警");
+alarmTypeMap.set(4402, "磁盘检测");
+alarmTypeMap.set(4511, "对讲事件报警");
+alarmTypeMap.set(4512, "车辆抓拍黑名单");
+alarmTypeMap.set(4513, "车辆超速黑名单(已弃用)");
+alarmTypeMap.set(1000000, "过车事件上报");
+alarmTypeMap.set(1000001, "超速报警事件(已弃用)");
+alarmTypeMap.set(1000002, "设备掉线报警");
+alarmTypeMap.set(1000003, "专有车位占用报警");
+alarmTypeMap.set(4603, "卡+指纹+人脸+密码组合合法开门");
+alarmTypeMap.set(4604, "卡+指纹+人脸+密码组合非法开门");
+alarmTypeMap.set(4626, "人脸安全帽合法开门报警");
+alarmTypeMap.set(4627, "人脸安全帽非法开门报警");
+alarmTypeMap.set(4632, "门禁非法卡超次恶意开门");
+alarmTypeMap.set(4633, "门禁非法密码超次恶意开门");
+alarmTypeMap.set(5120, "测温规则报警");
+alarmTypeMap.set(5121, "热成像着火点报警");
+alarmTypeMap.set(5122, "火情报警");
+alarmTypeMap.set(5123, "热点异常报警");
+alarmTypeMap.set(5124, "冷点异常报警");
+alarmTypeMap.set(5125, "测温温差报警");
+alarmTypeMap.set(5800, "区域无人报警");
+alarmTypeMap.set(5801, "人数下限报警");
+alarmTypeMap.set(5802, "人数上限报警");
+alarmTypeMap.set(5803, "计划人数不符");
+alarmTypeMap.set(7002, "雷达报警");
+alarmTypeMap.set(11600, "常规容量不足");
+alarmTypeMap.set(11601, "存储节点下线");
+alarmTypeMap.set(11602, "磁盘下线");
+alarmTypeMap.set(11603, "磁盘变慢");
+alarmTypeMap.set(11604, "磁盘损坏");
+alarmTypeMap.set(11605, "磁盘未知错误");
+alarmTypeMap.set(11606, "元数据服务器异常");
+alarmTypeMap.set(11607, "目录服务器异常");
+alarmTypeMap.set(12710, "未戴工牌报警");
+alarmTypeMap.set(15590, "移动摊贩");
+alarmTypeMap.set(15591, "机动车违停");
+alarmTypeMap.set(15592, "非机动车违停");
+alarmTypeMap.set(15593, "车道偏离");
+alarmTypeMap.set(15599, "漂浮物检测事件");
+alarmTypeMap.set(15602, "打电话检测报警");
+alarmTypeMap.set(15603, "吸烟检测报警");
+alarmTypeMap.set(15607, "垃圾暴露检测事件");
+alarmTypeMap.set(15608, "垃圾桶满溢检测事件");
+alarmTypeMap.set(15616, "热点报警");
+alarmTypeMap.set(15619, "车距过近");
+alarmTypeMap.set(15620, "驾驶员异常");
+alarmTypeMap.set(15621, "驾驶员变更");
+alarmTypeMap.set(15622, "员工着装事件");
+alarmTypeMap.set(15624, "单人独处检测");
+alarmTypeMap.set(15629, "佩戴红外阻断眼镜");
+alarmTypeMap.set(15646, "动物检测事件");
+alarmTypeMap.set(15653, "高空抛物检测事件");
+alarmTypeMap.set(15665, "渣土车未遮盖载货检测");
+alarmTypeMap.set(15670, "睡觉检测事件");
+alarmTypeMap.set(15768, "玩手机事件");
+alarmTypeMap.set(15780, "非机动车进入电梯");
+alarmTypeMap.set(15783, "违章建筑检测事件");
+alarmTypeMap.set(15804, "消防占道检测事件");
+alarmTypeMap.set(15824, "交通车辆清洁度检测");
+alarmTypeMap.set(15830, "传送带阻塞检测事件");
+alarmTypeMap.set(15849, "传送带大块异物检测事件");
+alarmTypeMap.set(15850, "传送带空载检测事件");
+alarmTypeMap.set(15851, "传送带跑偏检测事件");
+alarmTypeMap.set(15853, "包裹破损");
+alarmTypeMap.set(15854, "包裹着地");
+alarmTypeMap.set(15855, "包裹开箱验示");
+alarmTypeMap.set(15858, "紧急按钮");
+alarmTypeMap.set(15867, "水体颜色异常");
+alarmTypeMap.set(15876, "灭火器检测");
+alarmTypeMap.set(15892, "水流速高报警");
+alarmTypeMap.set(15893, "水流速低报警");
+alarmTypeMap.set(15896, "地表裸土覆盖");
+alarmTypeMap.set(16031, "排水检测");
+alarmTypeMap.set(16994, "水位过低报警");
+alarmTypeMap.set(16995, "水位过高报警");
+alarmTypeMap.set(16998, "人群密集(区域)");
+alarmTypeMap.set(16999, "人群密集(全局)");
+alarmTypeMap.set(17019, "未戴安全帽");
+alarmTypeMap.set(17020, "未穿戴工作服");
+alarmTypeMap.set(17028, "万物检测报警");
+alarmTypeMap.set(17030, "防火门检测");
+alarmTypeMap.set(17053, "泡沫检测");
+alarmTypeMap.set(19017, "报警盒子");
+alarmTypeMap.set(19019, "离岗火情报警");
+alarmTypeMap.set(19022, "车辆密度监测");
+alarmTypeMap.set(19024, "硬盘健康异常");
+alarmTypeMap.set(19064, "市电断电报警");
+alarmTypeMap.set(19065, "蓄电池欠压报警");
+alarmTypeMap.set(19085, "湿度报警");
+alarmTypeMap.set(202101, "人工上报报警");
+alarmTypeMap.set(202104, "无人机报警");
+alarmTypeMap.set(202105, "双塔定位报警");
+alarmTypeMap.set(701021, "滞留报警");
+alarmTypeMap.set(701022, "翻越报警");
+alarmTypeMap.set(701023, "尾随报警");
+alarmTypeMap.set(701024, "反向闯入报警");
+alarmTypeMap.set(701026, "读卡器防拆");
+alarmTypeMap.set(1000066, "demo报警类型");
+alarmTypeMap.set(1001000, "陌生人报警");
+alarmTypeMap.set(1001001, "白名单库报警");
+alarmTypeMap.set(1001002, "黑名单库报警");
+alarmTypeMap.set(1001003, "内部人员报警");
+alarmTypeMap.set(1001004, "访客报警");
+alarmTypeMap.set(1001005, "人脸检测");
+alarmTypeMap.set(1001006, "人体识别");
+alarmTypeMap.set(1001007, "机动车体识别");
+alarmTypeMap.set(1001008, "非机动车体识别");
+alarmTypeMap.set(1004000, "特殊人群未出入报警");
+alarmTypeMap.set(1004001, "特殊人群异常出入报警");
+alarmTypeMap.set(1004002, "电动车进出单元门报警");
+alarmTypeMap.set(1004003, "电动车区域禁停报警");
+alarmTypeMap.set(1006005, "表计读数");
+alarmTypeMap.set(1006302, "绊线入侵(船只)");
+alarmTypeMap.set(1006303, "区域入侵(船只)");
+alarmTypeMap.set(1006578, "停留检测(船只)");
+alarmTypeMap.set(1006579, "渔船检测");
+alarmTypeMap.set(1008000, "服务器CPU使用率-一般");
+alarmTypeMap.set(1008001, "服务器CPU使用率-严重");
+alarmTypeMap.set(1008002, "服务器CPU使用率-致命");
+alarmTypeMap.set(1008003, "CPU温度-一般");
+alarmTypeMap.set(1008004, "CPU温度-严重");
+alarmTypeMap.set(1008005, "CPU温度-致命");
+alarmTypeMap.set(1008006, "内存-一般");
+alarmTypeMap.set(1008007, "内存-严重");
+alarmTypeMap.set(1008008, "内存-致命");
+alarmTypeMap.set(1008009, "磁盘IO-一般");
+alarmTypeMap.set(1008010, "磁盘IO-严重");
+alarmTypeMap.set(1008011, "磁盘IO-致命");
+alarmTypeMap.set(1008012, "日志空间-一般");
+alarmTypeMap.set(1008013, "日志空间-严重");
+alarmTypeMap.set(1008014, "日志空间-致命");
+alarmTypeMap.set(1008015, "备份空间-一般");
+alarmTypeMap.set(1008016, "备份空间-严重");
+alarmTypeMap.set(1008017, "备份空间-致命");
+alarmTypeMap.set(1008018, "服务器离线");
+alarmTypeMap.set(1008019, "双机热备");
+alarmTypeMap.set(1008020, "服务CPU使用率-一般");
+alarmTypeMap.set(1008021, "服务CPU使用率-严重");
+alarmTypeMap.set(1008022, "服务CPU使用率-致命");
+alarmTypeMap.set(1008023, "消息处理-一般");
+alarmTypeMap.set(1008024, "消息处理-严重");
+alarmTypeMap.set(1008025, "消息处理-致命");
+alarmTypeMap.set(1008026, "数据库连接数-一般");
+alarmTypeMap.set(1008027, "数据库连接数-严重");
+alarmTypeMap.set(1008028, "数据库连接数-致命");
+alarmTypeMap.set(1008029, "市电断开");
+alarmTypeMap.set(1008030, "市电恢复");
+alarmTypeMap.set(1018001, "溶解氧阀值预警");
+alarmTypeMap.set(1018002, "溶解氧连续超标");
+alarmTypeMap.set(1018003, "溶解氧恒值不变");
+alarmTypeMap.set(1018004, "溶解氧数据突变");
+alarmTypeMap.set(1018005, "PH阀值预警");
+alarmTypeMap.set(1018006, "PH连续超标");
+alarmTypeMap.set(1018007, "PH恒值不变");
+alarmTypeMap.set(1018008, "PH数据突变");
+alarmTypeMap.set(1018009, "电导率阀值预警");
+alarmTypeMap.set(1018010, "电导率连续超标");
+alarmTypeMap.set(1018011, "电导率恒指不变");
+alarmTypeMap.set(1018012, "电导率数据突变");
+alarmTypeMap.set(1018013, "浊度阀值预警");
+alarmTypeMap.set(1018014, "浊度连续超标");
+alarmTypeMap.set(1018015, "浊度恒值不变");
+alarmTypeMap.set(1018016, "浊度数据突变");
+alarmTypeMap.set(1018017, "高锰酸盐阀值预警");
+alarmTypeMap.set(1018018, "高锰酸盐连续超标");
+alarmTypeMap.set(1018019, "高锰酸盐恒值不变");
+alarmTypeMap.set(1018020, "高锰酸盐数据突变");
+alarmTypeMap.set(1018021, "氨氮阀值预警");
+alarmTypeMap.set(1018022, "氨氮连续超标");
+alarmTypeMap.set(1018023, "氨氮恒值不变");
+alarmTypeMap.set(1018024, "氨氮数据突变");
+alarmTypeMap.set(1018025, "总磷阀值预警");
+alarmTypeMap.set(1018026, "总磷连续超标");
+alarmTypeMap.set(1018027, "总磷恒值不变");
+alarmTypeMap.set(1018028, "总氮阀值预警");
+alarmTypeMap.set(1018029, "总氮阀值预警");
+alarmTypeMap.set(1018030, "总氮连续超标");
+alarmTypeMap.set(1018031, "总氮恒值不变");
+alarmTypeMap.set(1018032, "总氮数据突变");
+alarmTypeMap.set(1018033, "PM10阀值预警");
+alarmTypeMap.set(1018034, "PM10连续超标");
+alarmTypeMap.set(1018035, "PM10恒值不变");
+alarmTypeMap.set(1018036, "PM10数据突变");
+alarmTypeMap.set(1018037, "PM2.5阀值预警");
+alarmTypeMap.set(1018038, "PM2.5连续超标");
+alarmTypeMap.set(1018039, "PM2.5恒值不变");
+alarmTypeMap.set(1018040, "PM2.5数据突变");
+alarmTypeMap.set(1018041, "SO2阀值预警");
+alarmTypeMap.set(1018042, "SO2连续超标");
+alarmTypeMap.set(1018043, "SO2恒值不变");
+alarmTypeMap.set(1018044, "SO2数据突变");
+alarmTypeMap.set(1018045, "CO阀值预警");
+alarmTypeMap.set(1018046, "CO连续超标");
+alarmTypeMap.set(1018047, "CO恒值不变");
+alarmTypeMap.set(1018048, "CO数据突变");
+alarmTypeMap.set(1018049, "NO2阀值预警");
+alarmTypeMap.set(1018050, "NO2连续超标");
+alarmTypeMap.set(1018051, "NO2恒值不变");
+alarmTypeMap.set(1018052, "NO2数据突变");
+alarmTypeMap.set(1410, "空开网关设备离线报警");
+alarmTypeMap.set(1411, "空调网关设备离线报警");
+alarmTypeMap.set(1805, "过载报警");
+alarmTypeMap.set(12406, "打火报警");
+alarmTypeMap.set(12411, "过温报警");
+alarmTypeMap.set(12413, "过压报警");
+alarmTypeMap.set(12414, "欠压报警");
+alarmTypeMap.set(12437, "缺相报警");
+alarmTypeMap.set(12438, "三相不平衡");
+alarmTypeMap.set(12440, "过流报警");
+alarmTypeMap.set(12442, "漏电报警");
+alarmTypeMap.set(12443, "过温预警");
+alarmTypeMap.set(12444, "漏电预警");
+alarmTypeMap.set(12445, "过流预警");
+alarmTypeMap.set(12446, "过压预警");
+alarmTypeMap.set(12447, "欠压预警");
+alarmTypeMap.set(12448, "异常温度上升预警");
+alarmTypeMap.set(12449, "过载预警");
+alarmTypeMap.set(12450, "空开通道离线报警");
+alarmTypeMap.set(12451, "空调通道离线报警");
+alarmTypeMap.set(12452, "分闸报警");
+alarmTypeMap.set(12453, "掉电报警");
+alarmTypeMap.set(12454, "智能电表通道离线报警");
+alarmTypeMap.set(12455, "塑壳空开通道离线报警");
+alarmTypeMap.set(1007101, "火线电压过低报警");
+alarmTypeMap.set(1007102, "火线电压过高报警");
+alarmTypeMap.set(1007103, "火线电流过高报警");
+alarmTypeMap.set(1007104, "火线温度过高报警");
+alarmTypeMap.set(1007105, "剩余电流过高报警");
+alarmTypeMap.set(1007106, "零线电流过高报警");
+alarmTypeMap.set(1007107, "零线温度过高报警");
+alarmTypeMap.set(1007108, "A相电压过高报警");
+alarmTypeMap.set(1007109, "A相电压过低报警");
+alarmTypeMap.set(1007110, "B相电压过高报警");
+alarmTypeMap.set(1007111, "B相电压过低报警");
+alarmTypeMap.set(1007112, "C相电压过高报警");
+alarmTypeMap.set(1007113, "C相电压过低报警");
+alarmTypeMap.set(1007114, "A相电流过高报警");
+alarmTypeMap.set(1007115, "B相电流过高报警");
+alarmTypeMap.set(1007116, "C相电流过高报警");
+alarmTypeMap.set(1007117, "A相温度过高报警");
+alarmTypeMap.set(1007118, "B相温度过高报警");
+alarmTypeMap.set(1007119, "C相温度过高报警");
+alarmTypeMap.set(1007120, "A相断相报警");
+alarmTypeMap.set(1007121, "B相断相报警");
+alarmTypeMap.set(1007122, "C相断相报警");
+alarmTypeMap.set(1007123, "电流过高报警");
+alarmTypeMap.set(1007124, "温度过高报警");
+alarmTypeMap.set(1007125, "湿度过高报警");
+alarmTypeMap.set(1007126, "传感器故障");
+alarmTypeMap.set(1007127, "连接故障");
+alarmTypeMap.set(1007128, "照明网关离线报警");
+alarmTypeMap.set(1007129, "监测网关离线报警");
+alarmTypeMap.set(1007130, "用电主机网关离线报警");
+alarmTypeMap.set(73000000, "告警确认");
+alarmTypeMap.set(73000001, "火警确认");
+alarmTypeMap.set(73000005, "燃气报警确认");
+alarmTypeMap.set(73010000, "火警");
+alarmTypeMap.set(73010001, "拆除报警");
+alarmTypeMap.set(73010018, "液位液压报警");
+alarmTypeMap.set(73010019, "液位液压过高预警");
+alarmTypeMap.set(73010020, "液位液压过高报警");
+alarmTypeMap.set(73010021, "液位液压过低预警");
+alarmTypeMap.set(73010022, "液位液压过低报警");
+alarmTypeMap.set(73010023, "液位液压超波动范围预警");
+alarmTypeMap.set(73010024, "液位液压超波动范围报警");
+alarmTypeMap.set(73010025, "液压报警");
+alarmTypeMap.set(73010026, "液压过高预警");
+alarmTypeMap.set(73010027, "液压过低预警");
+alarmTypeMap.set(73010028, "液压超波动范围预警");
+alarmTypeMap.set(73010029, "液压超波动范围报警");
+alarmTypeMap.set(73010030, "液位报警");
+alarmTypeMap.set(73010031, "液位过高预警");
+alarmTypeMap.set(73010032, "液位过低预警");
+alarmTypeMap.set(73010033, "液位超波动范围预警");
+alarmTypeMap.set(73010034, "液位超波动范围报警");
+alarmTypeMap.set(73010038, "液位过高报警");
+alarmTypeMap.set(73010039, "液位过低报警");
+alarmTypeMap.set(73010040, "液压过高报警");
+alarmTypeMap.set(73010041, "液压过低报警");
+alarmTypeMap.set(73010037, "欠压报警");
+alarmTypeMap.set(73010042, "倾斜报警");
+alarmTypeMap.set(73010043, "碰撞报警");
+alarmTypeMap.set(73010044, "电流过高预警");
+alarmTypeMap.set(73010045, "温度过高预警");
+alarmTypeMap.set(73010046, "电压过高预警");
+alarmTypeMap.set(73010047, "电压过低预警");
+alarmTypeMap.set(73010048, "功率过载预警");
+alarmTypeMap.set(73010049, "功率过载报警");
+alarmTypeMap.set(73010050, "电压过高报警");
+alarmTypeMap.set(73010051, "电压过低报警");
+alarmTypeMap.set(73010052, "温度过高报警");
+alarmTypeMap.set(73010053, "短路报警");
+alarmTypeMap.set(73010054, "漏电预警");
+alarmTypeMap.set(73010055, "漏电报警");
+alarmTypeMap.set(73010056, "电流过高报警");
+alarmTypeMap.set(73010057, "市电断电报警");
+alarmTypeMap.set(73010058, "故障电弧报警");
+alarmTypeMap.set(73010059, "缺相报警");
+alarmTypeMap.set(73010060, "输入缺相报警");
+alarmTypeMap.set(73010061, "浪涌报警");
+alarmTypeMap.set(73010062, "温度报警");
+alarmTypeMap.set(73010063, "总温度报警");
+alarmTypeMap.set(73010064, "A相温度报警");
+alarmTypeMap.set(73010065, "B相温度报警");
+alarmTypeMap.set(73010066, "C相温度报警");
+alarmTypeMap.set(73010067, "零线温度报警");
+alarmTypeMap.set(73010068, "总温度过高预警");
+alarmTypeMap.set(73010069, "A相温度过高预警");
+alarmTypeMap.set(73010070, "B相温度过高预警");
+alarmTypeMap.set(73010071, "C相温度过高预警");
+alarmTypeMap.set(73010072, "零线温度过高预警");
+alarmTypeMap.set(73010073, "总温度过高报警");
+alarmTypeMap.set(73010074, "A相温度过高报警");
+alarmTypeMap.set(73010075, "B相温度过高报警");
+alarmTypeMap.set(73010076, "C相温度过高报警");
+alarmTypeMap.set(73010077, "零线温度过高报警");
+alarmTypeMap.set(73010078, "电流报警");
+alarmTypeMap.set(73010079, "A相电流报警");
+alarmTypeMap.set(73010080, "A相电流过高预警");
+alarmTypeMap.set(73010081, "A相电流过高报警");
+alarmTypeMap.set(73010082, "B相电流报警");
+alarmTypeMap.set(73010083, "B相电流过高预警");
+alarmTypeMap.set(73010084, "B相电流过高报警");
+alarmTypeMap.set(73010085, "C相电流报警");
+alarmTypeMap.set(73010086, "C相电流过高预警");
+alarmTypeMap.set(73010087, "C相电流过高报警");
+alarmTypeMap.set(73010088, "零线电流报警");
+alarmTypeMap.set(73010089, "零线电流过高预警");
+alarmTypeMap.set(73010090, "零线电流过高报警");
+alarmTypeMap.set(73010091, "剩余电流报警");
+alarmTypeMap.set(73010092, "剩余电流过高预警");
+alarmTypeMap.set(73010093, "剩余电流过高报警");
+alarmTypeMap.set(73010094, "电压报警");
+alarmTypeMap.set(73010095, "A相电压报警");
+alarmTypeMap.set(73010096, "A相电压过高预警");
+alarmTypeMap.set(73010097, "A相电压过高报警");
+alarmTypeMap.set(73010098, "A相电压过低预警");
+alarmTypeMap.set(73010099, "A相电压过低报警");
+alarmTypeMap.set(73010100, "A相电压缺相报警");
+alarmTypeMap.set(73010101, "B相电压报警");
+alarmTypeMap.set(73010102, "B相电压过高预警");
+alarmTypeMap.set(73010103, "B相电压过高报警");
+alarmTypeMap.set(73010104, "B相电压过低预警");
+alarmTypeMap.set(73010105, "B相电压过低报警");
+alarmTypeMap.set(73010106, "B相电压缺相报警");
+alarmTypeMap.set(73010107, "C相电压报警");
+alarmTypeMap.set(73010108, "C相电压过高预警");
+alarmTypeMap.set(73010109, "C相电压过高报警");
+alarmTypeMap.set(73010110, "C相电压过低预警");
+alarmTypeMap.set(73010111, "C相电压过低报警");
+alarmTypeMap.set(73010112, "C相电压缺相报警");
+alarmTypeMap.set(73010113, "功率报警");
+alarmTypeMap.set(73010114, "总视在功率报警");
+alarmTypeMap.set(73010115, "总视在功率过载预警");
+alarmTypeMap.set(73010116, "总视在功率过载报警");
+alarmTypeMap.set(73010117, "A相视在功率报警");
+alarmTypeMap.set(73010118, "A相视在功率过载预警");
+alarmTypeMap.set(73010119, "A相视在功率过载报警");
+alarmTypeMap.set(73010120, "B相视在功率报警");
+alarmTypeMap.set(73010121, "B相视在功率过载预警");
+alarmTypeMap.set(73010122, "B相视在功率过载报警");
+alarmTypeMap.set(73010123, "C相视在功率报警");
+alarmTypeMap.set(73010124, "C相视在功率过载预警");
+alarmTypeMap.set(73010125, "C相视在功率过载报警");
+alarmTypeMap.set(73010126, "A相有功功率报警");
+alarmTypeMap.set(73010127, "A相有功功率过载预警");
+alarmTypeMap.set(73010128, "A相有功功率过载报警");
+alarmTypeMap.set(73010129, "A相无功功率报警");
+alarmTypeMap.set(73010130, "A相无功功率过载预警");
+alarmTypeMap.set(73010131, "B相有功功率报警");
+alarmTypeMap.set(73010132, "A相无功功率过载报警");
+alarmTypeMap.set(73010133, "三相不平衡报警");
+alarmTypeMap.set(73010134, "三相电压不平衡报警");
+alarmTypeMap.set(73010135, "三相电流不平衡报警");
+alarmTypeMap.set(73010136, "三相有功功率不平衡报警");
+alarmTypeMap.set(73010137, "总有功功率报警");
+alarmTypeMap.set(73010138, "总有功功率过载预警");
+alarmTypeMap.set(73010139, "总有功功率过载报警");
+alarmTypeMap.set(73010140, "总无功功率报警");
+alarmTypeMap.set(73010141, "总无功功率过载预警");
+alarmTypeMap.set(73010142, "总无功功率过载报警");
+alarmTypeMap.set(73010143, "湿度报警");
+alarmTypeMap.set(73010144, "湿度过高预警");
+alarmTypeMap.set(73010145, "湿度过高报警");
+alarmTypeMap.set(73010146, "湿度过低预警");
+alarmTypeMap.set(73010147, "湿度过低报警");
+alarmTypeMap.set(73010148, "谐波报警");
+alarmTypeMap.set(73010149, "B相有功功率过载预警");
+alarmTypeMap.set(73010150, "B相有功功率过载报警");
+alarmTypeMap.set(73010151, "C相有功功率报警");
+alarmTypeMap.set(73010152, "C相有功功率过载预警");
+alarmTypeMap.set(73010153, "C相有功功率过载报警");
+alarmTypeMap.set(73010154, "B相无功功率报警");
+alarmTypeMap.set(73010155, "B相无功功率过载预警");
+alarmTypeMap.set(73010156, "B相无功功率过载报警");
+alarmTypeMap.set(73010157, "C相无功功率报警");
+alarmTypeMap.set(73010158, "C相无功功率过载预警");
+alarmTypeMap.set(73010159, "C相无功功率过载报警");
+alarmTypeMap.set(73010160, "A相剩余电流过高报警");
+alarmTypeMap.set(73010161, "B相剩余电流过高报警");
+alarmTypeMap.set(73010162, "C相剩余电流过高报警");
+alarmTypeMap.set(73010163, "A相剩余电流过高预警");
+alarmTypeMap.set(73010164, "B相剩余电流过高预警");
+alarmTypeMap.set(73010165, "C相剩余电流过高预警");
+alarmTypeMap.set(73010166, "A相短路报警");
+alarmTypeMap.set(73010167, "B相短路报警");
+alarmTypeMap.set(73010168, "C相短路报警");
+alarmTypeMap.set(73010169, "远程合闸禁止报警");
+alarmTypeMap.set(73010170, "逆相序报警");
+alarmTypeMap.set(73010171, "火线短路报警");
+alarmTypeMap.set(73010172, "火线电流报警");
+alarmTypeMap.set(73010173, "火线电流过高预警");
+alarmTypeMap.set(73010174, "火线电流过高报警");
+alarmTypeMap.set(73010175, "电流骤变报警");
+alarmTypeMap.set(73010176, "A相电流骤变报警");
+alarmTypeMap.set(73010177, "B相电流骤变报警");
+alarmTypeMap.set(73010178, "C相电流骤变报警");
+alarmTypeMap.set(73010179, "零线电流骤变报警");
+alarmTypeMap.set(73010180, "剩余电流骤变报警");
+alarmTypeMap.set(73010181, "火线电流骤变报警");
+alarmTypeMap.set(73010182, "火线电压报警");
+alarmTypeMap.set(73010183, "火线电压过高预警");
+alarmTypeMap.set(73010184, "火线电压过高报警");
+alarmTypeMap.set(73010185, "火线电压过低预警");
+alarmTypeMap.set(73010186, "火线电压过低报警");
+alarmTypeMap.set(73010187, "火线电压缺相报警");
+alarmTypeMap.set(73010188, "电压骤变报警");
+alarmTypeMap.set(73010189, "A相电压骤变报警");
+alarmTypeMap.set(73010190, "B相电压骤变报警");
+alarmTypeMap.set(73010191, "C相电压骤变报警");
+alarmTypeMap.set(73010192, "火线电压骤变报警");
+alarmTypeMap.set(73010193, "火线有功功率过高预警");
+alarmTypeMap.set(73010194, "火线有功功率过高报警");
+alarmTypeMap.set(73010195, "A相故障电弧报警");
+alarmTypeMap.set(73010196, "B相故障电弧报警");
+alarmTypeMap.set(73010197, "C相故障电弧报警");
+alarmTypeMap.set(73010198, "温度骤变报警");
+alarmTypeMap.set(73010199, "总温度骤变报警");
+alarmTypeMap.set(73010200, "A相温度骤变报警");
+alarmTypeMap.set(73010201, "B相温度骤变报警");
+alarmTypeMap.set(73010202, "C相温度骤变报警");
+alarmTypeMap.set(73010203, "零线温度骤变报警");
+alarmTypeMap.set(73010204, "火线温度报警");
+alarmTypeMap.set(73010205, "火线温度过高预警");
+alarmTypeMap.set(73010206, "火线温度过高报警");
+alarmTypeMap.set(73010207, "火线温度骤变报警");
+alarmTypeMap.set(73010236, "设备振动报警");
+alarmTypeMap.set(73010057, "市电断电报警");
+alarmTypeMap.set(73010223, "气体浓度报警");
+alarmTypeMap.set(73010224, "气体浓度过高预警");
+alarmTypeMap.set(73010225, "气体浓度过高报警");
+alarmTypeMap.set(73010226, "CH4气体浓度报警");
+alarmTypeMap.set(73010227, "CH4气体浓度过高预警");
+alarmTypeMap.set(73010228, "CH4气体浓度过高报警");
+alarmTypeMap.set(73010229, "CO气体浓度报警");
+alarmTypeMap.set(73010230, "CO气体浓度过高预警");
+alarmTypeMap.set(73010231, "CO气体浓度过高报警");
+alarmTypeMap.set(73010232, "可燃气体报警");
+alarmTypeMap.set(73010233, "燃气报警");
+alarmTypeMap.set(73010235, "开关量输入报警");
+alarmTypeMap.set(73010208, "机动车违停");
+alarmTypeMap.set(73010209, "消防通道检测");
+alarmTypeMap.set(73010210, "火焰报警");
+alarmTypeMap.set(73010211, "烟雾报警");
+alarmTypeMap.set(73010212, "温度报警");
+alarmTypeMap.set(73010213, "火点报警");
+alarmTypeMap.set(73010214, "温差报警");
+alarmTypeMap.set(73010215, "电瓶车入梯");
+alarmTypeMap.set(73010216, "灭火器缺失");
+alarmTypeMap.set(73010217, "防火门异常");
+alarmTypeMap.set(73010218, "离岗报警");
+alarmTypeMap.set(73010219, "睡岗报警");
+alarmTypeMap.set(73010220, "玩手机");
+alarmTypeMap.set(73010221, "未戴安全帽");
+alarmTypeMap.set(73010222, "未穿工作服");
+alarmTypeMap.set(73010245, "电源故障");
+alarmTypeMap.set(73010246, "故障");
+alarmTypeMap.set(73010247, "升级故障");
+alarmTypeMap.set(73010248, "寿命故障");
+alarmTypeMap.set(73010249, "传感器故障");
+alarmTypeMap.set(73010250, "烟感失联");
+alarmTypeMap.set(73010251, "离线");
+alarmTypeMap.set(73010252, "开关量故障");
+alarmTypeMap.set(73010253, "漏电保护功能故障");
+alarmTypeMap.set(73010254, "传感器失效故障");
+alarmTypeMap.set(73010237, "主电故障");
+alarmTypeMap.set(73010238, "备电故障");
+alarmTypeMap.set(73010239, "总线故障");
+alarmTypeMap.set(73010240, "与监控中心通讯故障");
+alarmTypeMap.set(73010241, "与消防设备通讯故障");
+alarmTypeMap.set(18002001, "烟雾告警");
+alarmTypeMap.set(18004001, "温度过高告警");
+alarmTypeMap.set(18005001, "温度超高告警");
+alarmTypeMap.set(18006001, "温度过低告警");
+alarmTypeMap.set(18007001, "湿度过高告警");
+alarmTypeMap.set(18008001, "湿度过低告警");
+alarmTypeMap.set(18011001, "玻璃破碎告警");
+alarmTypeMap.set(18020001, "风速过快告警");
+alarmTypeMap.set(18025001, "液体溶度过高告警");
+alarmTypeMap.set(18026001, "液体溶度过低告警");
+alarmTypeMap.set(18099004, "风向离线告警");
+alarmTypeMap.set(18099003, "风速离线告警");
+alarmTypeMap.set(18099012, "粉尘探测器离线告警");
+alarmTypeMap.set(99099001, "LED显示屏离线告警");
+alarmTypeMap.set(18099001, "温湿度探测器离线告警");
+alarmTypeMap.set(11099003, "设备离线告警");
+alarmTypeMap.set(18099011, "噪音探测器离线告警");
+alarmTypeMap.set(11021001, "工作异常告警");
+alarmTypeMap.set(18034001, "噪音过大告警");
+alarmTypeMap.set(18035001, "PM2.5过高告警");
+alarmTypeMap.set(18036001, "PM10过高告警");
+alarmTypeMap.set(18051001, "PM100过高告警");
+alarmTypeMap.set(18001002, "水浸防拆告警");
+alarmTypeMap.set(18001003, "水浸防短告警");
+alarmTypeMap.set(18002002, "烟感防拆告警");
+alarmTypeMap.set(18002003, "烟感防短告警");
+alarmTypeMap.set(18009002, "震动防拆告警");
+alarmTypeMap.set(18009003, "震动防短告警");
+alarmTypeMap.set(18010002, "门磁防拆告警");
+alarmTypeMap.set(18010003, "门磁防短告警");
+alarmTypeMap.set(18011002, "玻璃破碎探测器防拆告警");
+alarmTypeMap.set(18011003, "玻璃破碎探测器防短告警");
+alarmTypeMap.set(18012002, "紧急按钮防拆告警");
+alarmTypeMap.set(18012003, "紧急按钮防短告警");
+alarmTypeMap.set(18014002, "人体探测防拆告警");
+alarmTypeMap.set(18014003, "人体探测防短告警");
+alarmTypeMap.set(18015002, "周界防拆告警");
+alarmTypeMap.set(18015003, "周界防短告警");
+alarmTypeMap.set(18017002, "停电监测器防拆告警");
+alarmTypeMap.set(18017003, "停电监测器防短告警");
+alarmTypeMap.set(18099010, "湿度离线告警");
+alarmTypeMap.set(16098001, "智能电表(直流)离线告警");
+alarmTypeMap.set(18099017, "定位式泄露监测离线告警");
+alarmTypeMap.set(18099009, "温度离线告警");
+alarmTypeMap.set(18003001, "红外告警");
+alarmTypeMap.set(18015001, "周界告警");
+alarmTypeMap.set(18001001, "水浸告警");
+alarmTypeMap.set(18040001, "噪音过高告警");
+alarmTypeMap.set(18055001, "PM2.5超高告警");
+alarmTypeMap.set(18056001, "PM10超高告警");
+alarmTypeMap.set(18057001, "噪音超高告警");
+alarmTypeMap.set(300108, "套牌车");
+alarmTypeMap.set(300107, "占用公交车道");
+alarmTypeMap.set(300106, "违章变道");
+alarmTypeMap.set(300105, "违章停车");
+alarmTypeMap.set(300104, "逆行");
+alarmTypeMap.set(300103, "压线");
+alarmTypeMap.set(300102, "闯红灯");
+alarmTypeMap.set(300101, "超速");
+alarmTypeMap.set(300008, "高危车辆");
+alarmTypeMap.set(300007, "观察跟踪");
+alarmTypeMap.set(300006, "检查盘查");
+alarmTypeMap.set(300005, "拦截车辆");
+alarmTypeMap.set(300004, "嫌疑车辆");
+alarmTypeMap.set(300003, "肇事车辆");
+alarmTypeMap.set(300002, "盗抢车辆");
+alarmTypeMap.set(300001, "超速车辆");
+alarmTypeMap.set(1024000, "电量低");
+alarmTypeMap.set(1024001, "防拆报警");
+alarmTypeMap.set(1024002, "门铃呼叫");
+alarmTypeMap.set(1024003, "强制锁定");
+alarmTypeMap.set(1024011, "密码开门");
+alarmTypeMap.set(1024012, "刷卡开门");
+alarmTypeMap.set(1024013, "指纹开门");
+alarmTypeMap.set(1024014, "人脸开门");
+alarmTypeMap.set(1024015, "临时密码");
+alarmTypeMap.set(1024016, "离线密码");
+alarmTypeMap.set(1024017, "门内开门");
+
+
+

+ 400 - 364
pages/eventList/index.vue

@@ -1,373 +1,409 @@
 <template>
-  <view class="page">
-    <view class="header" style="height: 70rpx;">
-      <picker mode="selector" :range="timeTypes" :value="selectedTimeType" @change="onTimeTypeChange">
-        <view class="time-type-picker" :class="processTimeTypes(timeTypes[selectedTimeType])">
-          <text>{{ timeTypes[selectedTimeType] }}</text>
-          <uni-icons type="arrowdown" size="20" color="#333" />
-        </view>
-      </picker>
-    </view>
-
-    <scroll-view 
-      scroll-y 
-      class="event-list" 
-      @refresherrefresh="onRefresh" 
-      :refresher-triggered="isRefreshing"
-      refresher-enabled
-    >
-      <view v-for="(item, index) in filteredEventList" :key="index" class="event-card">
-        <view class="event-header">
-          <view :class="['status-tag', item.status]">{{ item.statusText }}</view>
-          <text class="time">{{ item.time }}</text>
-        </view>
-
-        <view class="event-info">
-          <view class="location">
-            <uni-icons type="location" size="16" color="#666"/>
-            <text class="location-text">{{ item.location }}</text>
-          </view>
-          <view class="type-level">
-            <text :class="['level-tag', item.levelClass]">{{ item.level }}</text>
-            <text class="type">{{ item.type }}</text>
-          </view>
-          <view class="description">{{ item.description }}</view>
-          <view class="person-info">
-            <text class="label">涉事人员:</text>
-            <text>{{ item.person }}</text>
-          </view>
-        </view>
-
-        <view class="action-buttons">
-          <uni-button size="mini" type="warn" @click="handleEmergency(item)">
-            <view class="button-content">
-              <uni-icons type="phone-filled" size="16" color="#fff"/>
-              <text>一键报警</text>
-            </view>
-          </uni-button>
-          <uni-button size="mini" type="default" @click="viewDetail(item)">
-            <view class="button-content">
-              <uni-icons type="more-filled" size="16" color="#666"/>
-              <text>查看详情</text>
-            </view>
-          </uni-button>
-        </view>
-      </view>
-    </scroll-view>
-  </view>
+	<view class="page">
+		<view class="header" style="height: 70rpx;">
+			<picker mode="selector" :range="timeTypes" :value="selectedTimeType" @change="onTimeTypeChange">
+				<view class="time-type-picker" :class="processTimeTypes(timeTypes[selectedTimeType])">
+					<text>{{ selectedTimeType === -1? '全部' : timeTypes[selectedTimeType] }}</text>
+					<uni-icons type="arrowdown" size="20" color="#333" />
+				</view>
+			</picker>
+		</view>
+
+		<scroll-view scroll-y class="event-list" @refresherrefresh="onRefresh" :refresher-triggered="isRefreshing"
+			refresher-enabled>
+			<view v-if="filteredEventList.length > 0">
+				<view v-for="(item, index) in filteredEventList" :key="index" class="event-card">
+					<view class="event-header">
+						<view :class="['status-tag', item.status]">{{ item.statusText }}</view>
+						<text class="time">{{ item.time }}</text>
+					</view>
+
+					<view class="event-info">
+						<view class="location">
+							<uni-icons type="location" size="16" color="#666" />
+							<text class="location-text">{{ item.location }}</text>
+						</view>
+						<view class="type-level">
+							<text :class="['level-tag', item.levelClass]">{{ item.level }}</text>
+							<text class="type">{{ item.type }}</text>
+						</view>
+						<view class="description">{{ item.description }}</view>
+						<view :class="['message-box', item.status]" v-if="item.status !== 'pending'">{{ item.message }}</view>
+					</view>
+
+					<view class="action-buttons">
+						<uni-button size="mini" type="warn" @click="handleEmergency(item)">
+							<view class="button-content">
+								<uni-icons type="phone-filled" size="16" color="#fff" />
+								<text>一键报警</text>
+							</view>
+						</uni-button>
+						<uni-button size="mini" type="default" @click="viewDetail(item)">
+							<view class="button-content">
+								<uni-icons type="more-filled" size="16" color="#666" />
+								<text>查看详情</text>
+							</view>
+						</uni-button>
+					</view>
+				</view>
+				<view class="pagination-container">
+					<uni-pagination :show-icon="true" :total="total" v-model="currentPage" :pageSize="pageSize" title="标题文字"
+						@change="getEventList" />
+				</view>
+			</view>
+			<view v-else class="no-data">无数据</view>
+		</scroll-view>
+	</view>
 </template>
 
 <script lang="ts" setup>
-import { ref, computed } from 'vue';
+import {computed, ref} from 'vue';
+import {clientPostWithQueryParams} from '../../utils/request';
+import {alarmGradeClassMap, alarmGradeMap, alarmTypeMap} from './eventMap';
+import {onShow} from '@dcloudio/uni-app';
 
 interface EventItem {
-  id: number;
-  status: string;
-  statusText: string;
-  time: string;
-  location: string;
-  level: string;
-  levelClass: string;
-  type: string;
-  description: string;
-  person: string;
-}
-
-const eventList = ref<EventItem[]>([
-  {
-    id: 1,
-    status: 'pending',
-    statusText: '未处理',
-    time: '2024-01-20 14:30',
-    location: '东区停车场B2层',
-    level: '紧急',
-    levelClass: 'urgent',
-    type: '安全隐患',
-    description: '发现可疑人员在车辆周围徘徊,疑似有盗窃嫌疑',
-    person: '刘昊林'
-  },
-  {
-    id: 2,
-    status: 'processing',
-    statusText: '处理中',
-    time: '2024-01-20 13:15',
-    location: '西区3号楼电梯',
-    level: '重要',
-    levelClass: 'important',
-    type: '设备故障',
-    description: '电梯突发故障,内有人员被困',
-    person: '郭连法'
-  },
-  {
-    id: 3,
-    status: 'completed',
-    statusText: '已完成',
-    time: '2024-01-20 10:20',
-    location: '北区游泳池',
-    level: '普通',
-    levelClass: 'normal',
-    type: '设施维护',
-    description: '泳池水质异常,需要及时处理',
-    person: '刘昊林'
-  },
-  {
-    id: 4,
-    status: 'processing',
-    statusText: '处理中',
-    time: '2024-01-20 13:15',
-    location: '西区3号楼电梯',
-    level: '重要',
-    levelClass: 'important',
-    type: '设备故障',
-    description: '电梯突发故障,内有人员被困',
-    person: '郭连法'
-  },
-  {
-    id: 5,
-    status: 'processing',
-    statusText: '处理中',
-    time: '2024-01-20 13:15',
-    location: '西区3号楼电梯',
-    level: '重要',
-    levelClass: 'important',
-    type: '设备故障',
-    description: '电梯突发故障,内有人员被困',
-    person: '郭连法'
-  },
-]);
-
-const timeTypes = ['紧急', '重要', '普通'] as const;
-const selectedTimeType = ref(0);
-
-const processTimeTypes = (type:typeof timeTypes[number]) => {
-	if(type === '紧急'){
-		return "urgent"
-	}else if(type === '普通'){
-		return "normal"
-	}else if(type === '重要'){
-		return "important"
-	}else {
-		return "";
-	}
-}
-
-const filteredEventList = computed(() => {
-  const selectedType = timeTypes[selectedTimeType.value];
-  return eventList.value.filter(item => item.level === selectedType);
-});
-
-const handleEmergency = (item: EventItem) => {
-  uni.showActionSheet({
-    itemList: ['拨打110', '拨打119', '拨打120'],
-    success: function (res) {
-      const phoneNumbers = ['110', '119', '120'];
-      uni.makePhoneCall({
-        phoneNumber: phoneNumbers[res.tapIndex]
-      });
-    }
-  });
-};
-
-const notifySecurity = (item: EventItem) => {
-  uni.showToast({
-    title: '已通知保安',
-    icon: 'success'
-  });
-};
-
-const notifyVisitor = (item: EventItem) => {
-  uni.showToast({
-    title: '已发送通知',
-    icon: 'success'
-  });
-};
-
-const viewDetail = (item: EventItem) => {
-  uni.navigateTo({
-  	url:"/pages/eventDetail/index"
-  })
-};
-
-const isRefreshing = ref(false);
-
-const onRefresh = () => {
-  isRefreshing.value = true;
-  setTimeout(() => {
-    isRefreshing.value = false;
-    uni.showToast({
-      title: '刷新成功',
-      icon: 'success'
-    });
-  }, 1000);
-};
-
-const onTimeTypeChange = (e: any) => {
-  selectedTimeType.value = e.detail.value;
-};
+		id : number;
+		status : "ignore" | "mistake" | "completed" | "processing" | "pending";
+		statusText : string;
+		time : string;
+		location : string;
+		level : string;
+		levelClass : string;
+		type : string;
+		description : string;
+		person : string;
+		message : string;
+	}
+
+	const eventList = ref<EventItem[]>([]);
+
+	const timeTypes = ['严重', '一般', '轻微'] as const;
+	const selectedTimeType = ref(-1);
+
+	const processTimeTypes = (type : typeof timeTypes[number]) => {
+		if (type === '严重') {
+			return "urgent"
+		} else if (type === '轻微') {
+			return "normal"
+		} else if (type === '一般') {
+			return "important"
+		} else {
+			return "";
+		}
+	}
+
+	const filteredEventList = computed(() => {
+		if (selectedTimeType.value === -1) {
+			return eventList.value;
+		}
+		const selectedType = timeTypes[selectedTimeType.value];
+		return eventList.value.filter(item => item.level === selectedType);
+	});
+
+	const handleEmergency = (item : EventItem) => {
+		uni.showActionSheet({
+			itemList: ['拨打110', '拨打119', '拨打120'],
+			success: function (res) {
+				const phoneNumbers = ['110', '119', '120'];
+				uni.makePhoneCall({
+					phoneNumber: phoneNumbers[res.tapIndex]
+				});
+			}
+		});
+	};
+
+	const notifySecurity = (item : EventItem) => {
+		uni.showToast({
+			title: '已通知保安',
+			icon: 'success'
+		});
+	};
+
+	const notifyVisitor = (item : EventItem) => {
+		uni.showToast({
+			title: '已发送通知',
+			icon: 'success'
+		});
+	};
+
+	const viewDetail = (item : EventItem) => {
+		uni.setStorageSync("eventDetail", item);
+		uni.navigateTo({
+			url: "/pages/eventDetail/index"
+		})
+	};
+
+	const isRefreshing = ref(false);
+
+	const onRefresh = async () => {
+		isRefreshing.value = true;
+		await getEventList();
+		isRefreshing.value = false;
+		uni.showToast({
+			title: '刷新成功',
+			icon: 'success'
+		});
+	};
+
+	const onTimeTypeChange = (e : any) => {
+		selectedTimeType.value = e.detail.value;
+	};
+
+	const currentPage = ref(1);
+	const pageSize = ref(10);
+	const total = ref(0);
+
+	const getEventList = async () => {
+		const res = await clientPostWithQueryParams("/visualization/fireFighting/queryEventStatisticsPage", {
+			pageNum: currentPage.value,
+			pageSize: pageSize.value,
+			sortType: 'DESC'
+		})
+		if (res.code !== 200) {
+			uni.showToast({
+				title: "请求数据失败",
+				duration: 2000
+			})
+		}
+		const res2 = await clientPostWithQueryParams('/visualization/fireFighting/queryEventStatistics')
+		if (res2.code !== 200) {
+			uni.showToast({
+				title: "请求数据失败",
+				duration: 2000
+			})
+		}
+		total.value = res2.data.value;
+		console.log(res);
+		const processEventList : EventItem[] = res.data.pageData.map(q => {
+			const statusArr : EventItem['status'][] = ["pending", "processing", "completed", "mistake", "ignore"]
+			const statusArrText : string[] = ["未处理", "处理中", "处理完成", "误报", "忽略"]
+			const r : EventItem = {
+				id: q.alarmCode,
+				location: q.alarmPosition,
+				status: statusArr[q.handleStat],
+				statusText: statusArrText[q.handleStat],
+				time: q.alarmDate,
+				level: alarmGradeMap.get(q.alarmGrade),
+				levelClass: alarmGradeClassMap.get(q.alarmGrade),
+				type: q.orgName,
+				description: alarmTypeMap.get(q.alarmType),
+				person: 'string',
+				message:q.handleMessage
+			}
+			return r;
+		})
+		eventList.value = processEventList
+		console.log(processEventList);
+	}
+	
+	onShow(() => {
+		getEventList();
+	})
+	
 </script>
 
 <style>
-page {
-  height: 100%;
-}
-
-.page {
-  display: flex;
-  flex-direction: column;
-  height: 100%;
-  background-color: #f5f5f5;
-}
-
-.header {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  padding: 20rpx 30rpx;
-  background-color: #fff;
-  border-bottom: 1px solid #eee;
-}
-
-.time-type-picker {
-  display: flex;
-  align-items: center;
-  gap: 10rpx;
-  background-color: #F8F9FB;
-  padding: 10rpx 20rpx;
-  border-radius: 10rpx;
-  font-size: 28rpx;
-  color: #666;
-}
-
-.event-list {
-  flex: 1;
-  overflow: auto;
-  padding: 20rpx;
-}
-
-.event-card {
-  width: 650rpx;
-  background-color: #fff;
-  border-radius: 12px;
-  padding: 30rpx;
-  margin-bottom: 20rpx;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-}
-
-.event-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 20rpx;
-}
-
-.status-tag {
-  padding: 4rpx 16rpx;
-  border-radius: 4px;
-  font-size: 12px;
-}
-
-.pending {
-  background-color: #ff4d4f;
-  color: #fff;
-}
-
-.processing {
-  background-color: #faad14;
-  color: #fff;
-}
-
-.completed {
-  background-color: #52c41a;
-  color: #fff;
-}
-
-.time {
-  font-size: 14px;
-  color: #999;
-}
-
-.event-info {
-  margin-bottom: 30rpx;
-}
-
-.location {
-  display: flex;
-  align-items: center;
-  margin-bottom: 16rpx;
-}
-
-.location-text {
-  margin-left: 8rpx;
-  font-size: 14px;
-  color: #666;
-}
-
-.type-level {
-  display: flex;
-  align-items: center;
-  margin-bottom: 16rpx;
-}
-
-.level-tag {
-  padding: 4rpx 16rpx;
-  border-radius: 4px;
-  font-size: 12px;
-  margin-right: 16rpx;
-}
-
-.urgent {
-  background-color: #ff4d4f;
-  color: #fff;
-}
-
-.important {
-  background-color: #faad14;
-  color: #fff;
-}
-
-.normal {
-  background-color: #1890ff;
-  color: #fff;
-}
-
-.type {
-  font-size: 14px;
-  color: #666;
-}
-
-.description {
-  font-size: 14px;
-  color: #333;
-  margin-bottom: 16rpx;
-  line-height: 1.5;
-}
-
-.person-info {
-  font-size: 14px;
-  color: #666;
-}
-
-.label {
-  color: #999;
-}
-
-.action-buttons {
-  display: flex;
-  justify-content: space-between;
-}
-
-.button-content text {
-  margin-left: 8rpx;
-  font-size: 12px;
-}
-
-.uni-button {
-  margin: 0;
-  flex: 1;
-  margin-right: 16rpx;
-}
-
-.uni-button:last-child {
-  margin-right: 0;
-}
-</style>    
+	page {
+		height: 100%;
+	}
+
+	.page {
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+		background-color: #f5f5f5;
+	}
+
+	.header {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding: 20rpx 30rpx;
+		background-color: #fff;
+		border-bottom: 1px solid #eee;
+	}
+
+	.time-type-picker {
+		display: flex;
+		align-items: center;
+		gap: 10rpx;
+		background-color: #F8F9FB;
+		padding: 10rpx 20rpx;
+		border-radius: 10rpx;
+		font-size: 28rpx;
+		color: #666;
+	}
+
+	.event-list {
+		flex: 1;
+		overflow: auto;
+		padding: 20rpx;
+	}
+
+	.event-card {
+		width: 650rpx;
+		background-color: #fff;
+		border-radius: 12px;
+		padding: 30rpx;
+		margin-bottom: 20rpx;
+		box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+	}
+
+	.event-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		margin-bottom: 20rpx;
+	}
+
+	.status-tag {
+		padding: 4rpx 16rpx;
+		border-radius: 4px;
+		font-size: 12px;
+	}
+
+	.pending {
+		background-color: #ff4d4f;
+		color: #fff;
+	}
+
+	.processing {
+		background-color: #faad14;
+		color: #fff;
+	}
+
+	.completed {
+		background-color: #52c41a;
+		color: #fff;
+	}
+
+	.mistake {
+		background-color: #55aa7f;
+		color: #fff;
+	}
+
+	.ignore {
+		background-color: #55ffff;
+		color: #fff;
+	}
+
+	.time {
+		font-size: 14px;
+		color: #999;
+	}
+
+	.event-info {
+		margin-bottom: 30rpx;
+	}
+
+	.location {
+		display: flex;
+		align-items: center;
+		margin-bottom: 16rpx;
+	}
+
+	.location-text {
+		margin-left: 8rpx;
+		font-size: 14px;
+		color: #666;
+	}
+
+	.type-level {
+		display: flex;
+		align-items: center;
+		margin-bottom: 16rpx;
+	}
+
+	.level-tag {
+		padding: 4rpx 16rpx;
+		border-radius: 4px;
+		font-size: 12px;
+		margin-right: 16rpx;
+	}
+
+	.urgent {
+		background-color: #ff4d4f;
+		color: #fff;
+	}
+
+	.important {
+		background-color: #faad14;
+		color: #fff;
+	}
+
+	.normal {
+		background-color: #1890ff;
+		color: #fff;
+	}
+
+	.type {
+		font-size: 14px;
+		color: #666;
+	}
+
+	.description {
+		font-size: 14px;
+		color: #333;
+		margin-bottom: 16rpx;
+		line-height: 1.5;
+	}
+
+	.person-info {
+		font-size: 14px;
+		color: #666;
+	}
+
+	.label {
+		color: #999;
+	}
+
+	.action-buttons {
+		display: flex;
+		justify-content: space-between;
+	}
+
+	.button-content text {
+		margin-left: 8rpx;
+		font-size: 12px;
+	}
+
+	.uni-button {
+		margin: 0;
+		flex: 1;
+		margin-right: 16rpx;
+	}
+
+	.uni-button:last-child {
+		margin-right: 0;
+	}
+
+	.pagination-container {
+		width: 80vw;
+		margin: auto;
+	}
+
+	.no-data {
+		text-align: center;
+		color: #999;
+		font-size: 14px;
+		padding: 20rpx;
+	}
+	
+	.message-box {
+	  padding: 16rpx 24rpx;
+	  background-color: #f8f9fb;
+	  border-radius: 8rpx;
+	  font-size: 24rpx;
+	  color: #666;
+	  line-height: 1.6;
+	  margin-top: 20rpx;
+	  border: 1px solid #eee;
+	}
+	
+	/* 扩展不同状态的消息样式(可选) */
+.message-box.processing { background-color: #fff3d6; border-color: #ffe5b4; }
+.message-box.completed { background-color: #e8f9eb; border-color: #c8e6c9; }
+.message-box.mistake { background-color: #e0f2f1; border-color: #b2dfdb; }
+.message-box.ignore { background-color: #fff3b0; border-color: #fff9c4; }
+</style>

+ 3 - 3
pages/index/index.vue

@@ -2,7 +2,7 @@
 <template>
   <view class="container">
     <!-- 顶部导航 -->
-    <view class="header">
+<!--    <view class="header">
       <view class="header-left">
         <text class="app-title">沅陵系统管理</text>
       </view>
@@ -10,7 +10,7 @@
         <uni-icons type="notification" size="24" color="#333" class="notification-icon"/>
         <view class="avatar"></view>
       </view>
-    </view>
+    </view> -->
 
     <!-- 主要功能区域 -->
     <scroll-view class="content" scroll-y>
@@ -74,7 +74,7 @@
 </template>
 
 <script lang="ts" setup>
-import { ref } from 'vue';
+import {ref} from 'vue';
 
 const toEventList = () => {
 	uni.navigateTo({

+ 471 - 378
pages/poleDetail/index.vue

@@ -1,388 +1,481 @@
 <template>
-    <view class="container" :id="poleNumber">
-        <!-- 顶部状态区 -->
-        <view class="header">
-            <view class="header-left">
-                <text class="title">路灯编号: LD-001</text>
-                <view class="status-tag">
-                    <view class="status-dot"></view>
-                    <text class="status-text">在线运行中</text>
-                </view>
-            </view>
-            <uni-icons type="refresh" size="24" color="#666" @click="refreshData" />
-        </view>
-        <!-- 核心数据展示区 -->
-        <view class="data-cards">
-            <view class="data-card">
-                <view class="card-header">
-                    <uni-icons type="lightning" size="24" color="#4080FF" />
-                    <text class="card-title">电压</text>
-                </view>
-                <view class="card-value">
-                    <text class="value">220</text>
-                    <text class="unit">V</text>
-                </view>
-            </view>
-            <view class="data-card">
-                <view class="card-header">
-                    <uni-icons type="settings" size="24" color="#4080FF" />
-                    <text class="card-title">电流</text>
-                </view>
-                <view class="card-value">
-                    <text class="value">2.5</text>
-                    <text class="unit">A</text>
-                </view>
-            </view>
-            <view class="data-card">
-                <view class="card-header">
-                    <uni-icons type="star" size="24" color="#4080FF" />
-                    <text class="card-title">功率</text>
-                </view>
-                <view class="card-value">
-                    <text class="value">550</text>
-                    <text class="unit">W</text>
-                </view>
-            </view>
-        </view>
-        <!-- 历史数据表格 -->
-        <view class="table-section">
-            <view class="table-header">
-                <text class="table-title">历史数据记录</text>
-                <view class="filter-section">
-                    <picker mode="selector" :range="timeRanges" :value="selectedTimeRange" @change="onTimeRangeChange">
-                        <view class="date-picker">
-                            <text>{{ timeRanges[selectedTimeRange] }}</text>
-                            <uni-icons type="calendar" size="20" color="#666" />
-                        </view>
-                    </picker>
-                </view>
-            </view>
-            <view class="table">
-                <view class="table-head">
-                    <view class="th">时间</view>
-                    <view class="th">电压(V)</view>
-                    <view class="th">电流(A)</view>
-                    <view class="th">功率(W)</view>
-                </view>
-                <view class="table-body">
-                    <view class="tr" v-for="(item, index) in displayData" :key="index">
-                        <view class="td">{{item.time}}</view>
-                        <view class="td">{{item.voltage}}</view>
-                        <view class="td">{{item.current}}</view>
-                        <view class="td">{{item.power}}</view>
-                    </view>
-                </view>
-                <view class="pagination">
-                    <uni-button size="mini" :disabled="currentPage <= 1" @click="prevPage">上一页</uni-button>
-                    <text class="page-info">{{ currentPage }}/{{ totalPages }}</text>
-                    <uni-button size="mini" :disabled="currentPage >= totalPages" @click="nextPage">下一页</uni-button>
-                </view>
-            </view>
-        </view>
-        <!-- 控制区域 -->
-        <view class="control-section">
-            <view class="control-title">
-                <text>灯杆控制</text>
-            </view>
-            <view class="control-panel">
-                <view :class="['control-button', isOn ? 'button-on' : 'button-off']" @click="toggleLight">
-                    <uni-icons :type="isOn ? 'checkbox-filled' : 'circle'" size="32" :color="isOn ? '#4CD964' : '#999'" />
-                    <text class="button-text">{{ isOn ? '已开启' : '已关闭' }}</text>
-                </view>
-            </view>
-        </view>
-    </view>
+	<view class="container" :id="poleNumber">
+		<!-- 顶部状态区 -->
+		<view class="header">
+			<view class="header-left">
+				<text class="title">路灯编号: {{poleInfo.light_num}}</text>
+				<view class="status-tag">
+					<view class="status-dot"></view>
+					<text class="status-text">在线运行中</text>
+				</view>
+			</view>
+			<uni-icons type="refresh" size="24" color="#666" @click="refreshData" />
+		</view>
+		<!-- 核心数据展示区 -->
+		<view class="data-cards">
+			<view class="data-card">
+				<view class="card-header">
+					<uni-icons type="lightning" size="24" color="#4080FF" />
+					<text class="card-title">电压</text>
+				</view>
+				<view class="card-value">
+					<text class="value">{{poleInfo.voltage.toFixed(2)}}</text>
+					<text class="unit">V</text>
+				</view>
+			</view>
+			<view class="data-card">
+				<view class="card-header">
+					<uni-icons type="settings" size="24" color="#4080FF" />
+					<text class="card-title">电流</text>
+				</view>
+				<view class="card-value">
+					<text class="value">{{poleInfo.current.toFixed(2)}}</text>
+					<text class="unit">A</text>
+				</view>
+			</view>
+			<view class="data-card">
+				<view class="card-header">
+					<uni-icons type="star" size="24" color="#4080FF" />
+					<text class="card-title">功率</text>
+				</view>
+				<view class="card-value">
+					<text class="value">{{poleInfo.power.toFixed(2)}}</text>
+					<text class="unit">kW</text>
+				</view>
+			</view>
+		</view>
+		<!-- 历史数据表格 -->
+		<!-- <view class="table-section">
+			<view class="table-header">
+				<text class="table-title">历史数据记录</text>
+				<view class="filter-section">
+					<picker mode="selector" :range="timeRanges" :value="selectedTimeRange" @change="onTimeRangeChange">
+						<view class="date-picker">
+							<text>{{ timeRanges[selectedTimeRange] }}</text>
+							<uni-icons type="calendar" size="20" color="#666" />
+						</view>
+					</picker>
+				</view>
+			</view>
+			<view class="table">
+				<view class="table-head">
+					<view class="th">时间</view>
+					<view class="th">电压(V)</view>
+					<view class="th">电流(A)</view>
+					<view class="th">功率(W)</view>
+				</view>
+				<view class="table-body">
+					<view class="tr" v-for="(item, index) in displayData" :key="index">
+						<view class="td">{{item.time}}</view>
+						<view class="td">{{item.voltage}}</view>
+						<view class="td">{{item.current}}</view>
+						<view class="td">{{item.power}}</view>
+					</view>
+				</view>
+				<view class="pagination">
+					<uni-button size="mini" :disabled="currentPage <= 1" @click="prevPage">上一页</uni-button>
+					<text class="page-info">{{ currentPage }}/{{ totalPages }}</text>
+					<uni-button size="mini" :disabled="currentPage >= totalPages" @click="nextPage">下一页</uni-button>
+				</view>
+			</view>
+		</view> -->
+		<!-- 控制区域 -->
+		<view class="control-section">
+			<view class="control-title">
+				<text>灯杆控制</text>
+			</view>
+			<view class="control-panel">
+				<view :class="['control-button', isOn ? 'button-on' : 'button-off']" @click="toggleLight">
+					<uni-icons :type="isOn ? 'checkbox-filled' : 'circle'" size="32" :color="isOn ? '#4CD964' : '#999'" />
+					<text class="button-text">{{ isOn ? '已开启' : '已关闭' }}</text>
+				</view>
+			</view>
+		</view>
+	</view>
 </template>
 <script lang="ts" setup>
 import {computed, onMounted, ref} from 'vue';
+import {clientGet} from '../../utils/request';
 
 const poleNumber = ref();
-const isOn = ref(false);
-const currentPage = ref(1);
-const pageSize = ref(5);
-const timeRanges = ['最近1小时', '最近6小时', '最近12小时', '最近24小时'];
-const selectedTimeRange = ref(0);
-const historyData = ref([
-    { time: '10:00', voltage: 220, current: 2.5, power: 550 },
-    { time: '09:00', voltage: 218, current: 2.4, power: 523 },
-    { time: '08:00', voltage: 222, current: 2.6, power: 577 },
-    { time: '07:00', voltage: 221, current: 2.5, power: 553 },
-    { time: '06:00', voltage: 219, current: 2.3, power: 504 },
-    { time: '05:00', voltage: 220, current: 2.4, power: 528 },
-    { time: '04:00', voltage: 221, current: 2.5, power: 553 },
-    { time: '03:00', voltage: 219, current: 2.3, power: 504 },
-    { time: '02:00', voltage: 218, current: 2.4, power: 523 },
-    { time: '01:00', voltage: 220, current: 2.5, power: 550 }
-]);
-const filteredData = computed(() => {
-    const hours = [1, 6, 12, 24][selectedTimeRange.value];
-    return historyData.value.slice(0, hours);
-});
-const totalPages = computed(() => Math.ceil(filteredData.value.length / pageSize.value));
-const displayData = computed(() => {
-    const start = (currentPage.value - 1) * pageSize.value;
-    const end = start + pageSize.value;
-    return filteredData.value.slice(start, end);
-});
-const prevPage = () => {
-    if (currentPage.value > 1) {
-        currentPage.value--;
-    }
-};
-const nextPage = () => {
-    if (currentPage.value < totalPages.value) {
-        currentPage.value++;
-    }
-};
-const onTimeRangeChange = (e: any) => {
-    selectedTimeRange.value = e.detail.value;
-    currentPage.value = 1; // 重置页码
-};
-const toggleLight = () => {
-    isOn.value = !isOn.value;
-};
-const refreshData = () => {
-    // 刷新数据逻辑
-};
-onMounted(()=>{
-	const r = uni.getStorageSync("poleNumber");
-	if(!r){
-		uni.showToast({
-			title:"当前查询失败",
-			duration:2000
+	const isOn = ref(false);
+	const currentPage = ref(1);
+	const pageSize = ref(5);
+	const poleInfo = ref({
+		light_num: '',
+		brightness: 0,
+		voltage: 0,
+		current: 0,
+		power: 0,
+		onlineStatus: 0,
+		light_total_time: 0,
+		power_quantity: 0
+	});
+	const timeRanges = ['最近1小时', '最近6小时', '最近12小时', '最近24小时'];
+	const selectedTimeRange = ref(0);
+	const historyData = ref([
+		{ time: '10:00', voltage: 220, current: 2.5, power: 550 },
+		{ time: '09:00', voltage: 218, current: 2.4, power: 523 },
+		{ time: '08:00', voltage: 222, current: 2.6, power: 577 },
+		{ time: '07:00', voltage: 221, current: 2.5, power: 553 },
+		{ time: '06:00', voltage: 219, current: 2.3, power: 504 },
+		{ time: '05:00', voltage: 220, current: 2.4, power: 528 },
+		{ time: '04:00', voltage: 221, current: 2.5, power: 553 },
+		{ time: '03:00', voltage: 219, current: 2.3, power: 504 },
+		{ time: '02:00', voltage: 218, current: 2.4, power: 523 },
+		{ time: '01:00', voltage: 220, current: 2.5, power: 550 }
+	]);
+	const filteredData = computed(() => {
+		const hours = [1, 6, 12, 24][selectedTimeRange.value];
+		return historyData.value.slice(0, hours);
+	});
+	const totalPages = computed(() => Math.ceil(filteredData.value.length / pageSize.value));
+	const displayData = computed(() => {
+		const start = (currentPage.value - 1) * pageSize.value;
+		const end = start + pageSize.value;
+		return filteredData.value.slice(start, end);
+	});
+	const prevPage = () => {
+		if (currentPage.value > 1) {
+			currentPage.value--;
+		}
+	};
+	const nextPage = () => {
+		if (currentPage.value < totalPages.value) {
+			currentPage.value++;
+		}
+	};
+	const onTimeRangeChange = (e : any) => {
+		selectedTimeRange.value = e.detail.value;
+		currentPage.value = 1; // 重置页码
+	};
+	const toggleLight = async () => {
+		let op;
+		if(isOn.value){
+			op = false;
+		}else{
+			op = true;
+		}
+		const res = await turnLightOrTurnOff(poleNumber.value,op);
+		if(res){
+			isOn.value = !isOn.value;
+		}
+	};
+	const refreshData = () => {
+		// 刷新数据逻辑
+	};
+
+	// const getPoleStatusHistory = async () => {
+	// 	const arr = [];
+	// 	arr.push({
+	// 		column: 'create_time',
+	// 		type: 'orderByDesc'
+	// 	})
+
+	// 	const res = await clientGet("/pole/DgEquipmentStatus/findByPage", {
+	// 		conditionJson: encodeURIComponent(JSON.stringify(arr)),
+	// 		pageNum: 1,
+	// 		pageSize: 5
+	// 	})
+	// 	if(res.code !== 200){
+	// 		uni.showToast({
+	// 			title:'请求数据失败',
+	// 			duration:2000
+	// 		})
+	// 	}
+	// }
+	
+	const turnLightOrTurnOff = async (poleNumber : string, isTurn : boolean) => {
+		uni.showLoading({
+			title:"正在操作..."
 		})
+		const res = await clientGet('/pole/instruct/issued/reportEnvironmentalData',{
+				cmd: '6011',
+				lightNums: poleNumber,
+				packageId: '1050',
+				brightness: (isTurn ? 100 : 0).toString()
+			})
+		uni.hideLoading();
+		if ((res as any).code === 200) {
+			uni.showToast({
+				title: "操作成功",
+				duration: 1000
+			})
+			return true;
+		}
+		return false;
 	}
-	poleNumber.value = r;
-	console.log(poleNumber.value);
-})
+
+	const getPoleStatus = async (poleNumber : string) => {
+		const res = await clientGet("/pole/instruct/issued/equipmentStatus", {
+			cmd: '6012',
+			lightNums: poleNumber,
+			packageId: '1050'
+		});
+		return res;
+	};
+
+	const getCurrentPoleInfo = async () => {
+		const res = await getPoleStatus(poleNumber.value);
+		if (res.code !== 200) {
+			uni.showToast({
+				title: "请求数据失败",
+				duration: 2000
+			})
+		}
+		const data = JSON.parse(JSON.parse(res.data).params)
+		if (data.length < 1) {
+			uni.showToast({
+				title: "请求数据失败",
+				duration: 2000
+			})
+		}
+		const p = data[0];
+		poleInfo.value = p;
+		isOn.value = poleInfo.value.brightness !== 0;
+	}
+
+
+	onMounted(() => {
+		const r = uni.getStorageSync("poleNumber");
+		if (!r) {
+			uni.showToast({
+				title: "当前查询失败",
+				duration: 2000
+			})
+		}
+		poleNumber.value = r;
+		getCurrentPoleInfo();
+		// getPoleStatusHistory();
+	})
 </script>
 <style scoped>
-page {
-    height: 100%;
-}
-
-.container {
-    min-height: 100%;
-    padding: 30rpx;
-    background-color: #F5F7FA;
-    display: flex;
-    flex-direction: column;
-    gap: 30rpx;
-}
-
-.header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    padding: 20rpx 0;
-}
-
-.header-left {
-    display: flex;
-    flex-direction: column;
-    gap: 10rpx;
-}
-
-.title {
-    font-size: 32rpx;
-    font-weight: 600;
-    color: #333;
-}
-
-.status-tag {
-    display: flex;
-    align-items: center;
-    gap: 10rpx;
-}
-
-.status-dot {
-    width: 16rpx;
-    height: 16rpx;
-    border-radius: 50%;
-    background-color: #4CD964;
-}
-
-.status-text {
-    font-size: 24rpx;
-    color: #666;
-}
-
-.data-cards {
-    display: flex;
-    justify-content: space-between;
-    gap: 20rpx;
-}
-
-.data-card {
-    flex: 1;
-    background-color: #FFFFFF;
-    border-radius: 20rpx;
-    padding: 30rpx;
-    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
-}
-
-.card-header {
-    display: flex;
-    align-items: center;
-    gap: 10rpx;
-    margin-bottom: 20rpx;
-}
-
-.card-title {
-    font-size: 28rpx;
-    color: #666;
-}
-
-.card-value {
-    display: flex;
-    align-items: baseline;
-}
-
-.value {
-    font-size: 40rpx;
-    font-weight: 600;
-    color: #333;
-}
-
-.unit {
-    font-size: 24rpx;
-    color: #999;
-    margin-left: 8rpx;
-}
-
-.table-section {
-    background-color: #FFFFFF;
-    border-radius: 20rpx;
-    padding: 30rpx;
-    flex: 1;
-}
-
-.table-header {
-    margin-bottom: 30rpx;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-}
-
-.table-title {
-    font-size: 32rpx;
-    font-weight: 600;
-    color: #333;
-}
-
-.filter-section {
-    display: flex;
-    align-items: center;
-    gap: 20rpx;
-}
-
-.date-picker {
-    display: flex;
-    align-items: center;
-    gap: 10rpx;
-    background-color: #F8F9FB;
-    padding: 10rpx 20rpx;
-    border-radius: 10rpx;
-    font-size: 28rpx;
-    color: #666;
-}
-
-.pagination {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    gap: 20rpx;
-    padding: 30rpx 0;
-    background-color: #FFFFFF;
-}
-
-.page-info {
-    font-size: 28rpx;
-    color: #666;
-}
-
-.table {
-    width: 100%;
-}
-
-.table-head {
-    display: flex;
-    background-color: #F8F9FB;
-    padding: 20rpx 0;
-    border-radius: 12rpx 12rpx 0 0;
-}
-
-.table-body {
-    border: 2rpx solid #F0F0F0;
-    border-top: none;
-    border-radius: 0 0 12rpx 12rpx;
-}
-
-.tr {
-    display: flex;
-    padding: 20rpx 0;
-    border-bottom: 2rpx solid #F0F0F0;
-}
-
-.tr:last-child {
-    border-bottom: none;
-}
-
-.th,
-.td {
-    flex: 1;
-    text-align: center;
-    font-size: 28rpx;
-}
-
-.th {
-    color: #666;
-    font-weight: 500;
-}
-
-.td {
-    color: #333;
-}
-
-.control-section {
-    background-color: #FFFFFF;
-    border-radius: 20rpx;
-    padding: 30rpx;
-}
-
-.control-title {
-    font-size: 32rpx;
-    font-weight: 600;
-    color: #333;
-    margin-bottom: 30rpx;
-}
-
-.control-panel {
-    display: flex;
-    justify-content: center;
-}
-
-.control-button {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 20rpx;
-    padding: 40rpx;
-    border-radius: 20rpx;
-    background-color: #F8F9FB;
-    transition: all 0.3s ease;
-}
-
-.button-on {
-    background-color: rgba(76, 217, 100, 0.1);
-}
-
-.button-off {
-    background-color: #F8F9FB;
-}
-
-.button-text {
-    font-size: 28rpx;
-    color: #666;
-}
-</style>    
+	page {
+		height: 100%;
+	}
+
+	.container {
+		min-height: 100%;
+		padding: 30rpx;
+		background-color: #F5F7FA;
+		display: flex;
+		flex-direction: column;
+		gap: 30rpx;
+	}
+
+	.header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 20rpx 0;
+	}
+
+	.header-left {
+		display: flex;
+		flex-direction: column;
+		gap: 10rpx;
+	}
+
+	.title {
+		font-size: 32rpx;
+		font-weight: 600;
+		color: #333;
+	}
+
+	.status-tag {
+		display: flex;
+		align-items: center;
+		gap: 10rpx;
+	}
+
+	.status-dot {
+		width: 16rpx;
+		height: 16rpx;
+		border-radius: 50%;
+		background-color: #4CD964;
+	}
+
+	.status-text {
+		font-size: 24rpx;
+		color: #666;
+	}
+
+	.data-cards {
+		display: flex;
+		justify-content: space-between;
+		gap: 20rpx;
+	}
+
+	.data-card {
+		flex: 1;
+		background-color: #FFFFFF;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+	}
+
+	.card-header {
+		display: flex;
+		align-items: center;
+		gap: 10rpx;
+		margin-bottom: 20rpx;
+	}
+
+	.card-title {
+		font-size: 28rpx;
+		color: #666;
+	}
+
+	.card-value {
+		display: flex;
+		align-items: baseline;
+	}
+
+	.value {
+		font-size: 40rpx;
+		font-weight: 600;
+		color: #333;
+	}
+
+	.unit {
+		font-size: 24rpx;
+		color: #999;
+		margin-left: 8rpx;
+	}
+
+	.table-section {
+		background-color: #FFFFFF;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		flex: 1;
+	}
+
+	.table-header {
+		margin-bottom: 30rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.table-title {
+		font-size: 32rpx;
+		font-weight: 600;
+		color: #333;
+	}
+
+	.filter-section {
+		display: flex;
+		align-items: center;
+		gap: 20rpx;
+	}
+
+	.date-picker {
+		display: flex;
+		align-items: center;
+		gap: 10rpx;
+		background-color: #F8F9FB;
+		padding: 10rpx 20rpx;
+		border-radius: 10rpx;
+		font-size: 28rpx;
+		color: #666;
+	}
+
+	.pagination {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		gap: 20rpx;
+		padding: 30rpx 0;
+		background-color: #FFFFFF;
+	}
+
+	.page-info {
+		font-size: 28rpx;
+		color: #666;
+	}
+
+	.table {
+		width: 100%;
+	}
+
+	.table-head {
+		display: flex;
+		background-color: #F8F9FB;
+		padding: 20rpx 0;
+		border-radius: 12rpx 12rpx 0 0;
+	}
+
+	.table-body {
+		border: 2rpx solid #F0F0F0;
+		border-top: none;
+		border-radius: 0 0 12rpx 12rpx;
+	}
+
+	.tr {
+		display: flex;
+		padding: 20rpx 0;
+		border-bottom: 2rpx solid #F0F0F0;
+	}
+
+	.tr:last-child {
+		border-bottom: none;
+	}
+
+	.th,
+	.td {
+		flex: 1;
+		text-align: center;
+		font-size: 28rpx;
+	}
+
+	.th {
+		color: #666;
+		font-weight: 500;
+	}
+
+	.td {
+		color: #333;
+	}
+
+	.control-section {
+		background-color: #FFFFFF;
+		border-radius: 20rpx;
+		padding: 30rpx;
+	}
+
+	.control-title {
+		font-size: 32rpx;
+		font-weight: 600;
+		color: #333;
+		margin-bottom: 30rpx;
+	}
+
+	.control-panel {
+		display: flex;
+		justify-content: center;
+	}
+
+	.control-button {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		gap: 20rpx;
+		padding: 40rpx;
+		border-radius: 20rpx;
+		background-color: #F8F9FB;
+		transition: all 0.3s ease;
+	}
+
+	.button-on {
+		background-color: rgba(76, 217, 100, 0.1);
+	}
+
+	.button-off {
+		background-color: #F8F9FB;
+	}
+
+	.button-text {
+		font-size: 28rpx;
+		color: #666;
+	}
+</style>

+ 24 - 1
utils/request.js

@@ -7,6 +7,13 @@ const defaultConfig = {
     baseURL: BASE_URL // 基础 URL
 };
 
+// 辅助函数:将对象转换为查询字符串
+function objectToQueryString(obj) {
+    return Object.keys(obj)
+      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`)
+      .join('&');
+}
+
 // 封装请求函数
 function request(options) {
     const config = {
@@ -84,4 +91,20 @@ export const clientDelete = async (url, data = {}) => {
     } catch (error) {
         throw error;
     }
-};    
+};    
+
+// 封装带查询参数的 POST 请求
+export const clientPostWithQueryParams = async (url, queryParams = {}, data = {}) => {
+    try {
+        const queryString = objectToQueryString(queryParams);
+        const fullUrl = url + (queryString ? `?${queryString}` : '');
+        const response = await request({
+            url: fullUrl,
+            method: 'POST',
+            data
+        });
+        return response;
+    } catch (error) {
+        throw error;
+    }
+};