whx 5 ماه پیش
والد
کامیت
0471ab45c8

+ 1 - 1
virgo.wzfrontend/console/src/components/work/common/testAlarm.vue

@@ -83,7 +83,7 @@
 		methods: {
 			init(option) {
 				let postData = {
-					type: this.type, //1-周界报警设备 2-周界报警 3.电子巡查设备
+					type: this.type, //1-周界报警设备 2-周界报警 3.电子巡查设备 4.消防设备 5.消防设备报警 6.消防通道 7.易燃易爆品设备 8.易燃易爆品报警9.化学用品设备 10.化学用品报警11.废气污染物设备 12.废气污染物报警 13.环境设备
 					projectId: this.$store.getters.project.id
 				}
 				if (option) postData = Object.assign(postData, option);

+ 134 - 0
virgo.wzfrontend/console/src/components/work/iot/firefighting/setSystem.vue

@@ -0,0 +1,134 @@
+<template>
+	<div class="device-level hui-flex">
+		<div class="hui-chart-title">
+			消防管理体系 <i class="iconfont huifont-xinzeng" @click="insert(-1)"></i>
+		</div>
+		<div class="hui-flex-box">
+			<el-tree :data="list" :props="defaultProps" default-expand-all>
+				<div class="tree-node" slot-scope="{ node, data }">
+					<span class="tree-node-label">
+						{{data.name}}-{{data.title}}
+					</span>
+					<div class="tree-node-operation">
+						<i class="iconfont huifont-xinzeng" @click.stop="insert(data.id)"></i>
+						<i class="iconfont huifont-bianji" @click.stop="update(data)"></i>
+						<i class="iconfont huifont-shanchu" @click.stop="deleteModel(data.id)"></i>
+					</div>
+				</div>
+			</el-tree>
+			<el-dialog :close-on-click-modal="false" :title="form.id?'编辑':'新增'" :visible.sync="dialogVisible"
+				width="900px" :append-to-body="true">
+				<div class="hui-flex hui-dialog">
+					<div class="hui-flex-box hui-dialog-content">
+						<el-form ref="form" :model="form" label-position="top">
+							<el-form-item label="姓名">
+								<el-input v-model="form.name"></el-input>
+							</el-form-item>
+							<el-form-item label="职位">
+								<el-input v-model="form.title"></el-input>
+							</el-form-item>
+							<el-form-item label="描述">
+								<el-input v-model="form.content"></el-input>
+							</el-form-item>
+						</el-form>
+					</div>
+					<div class="hui-dialog-submit">
+						<el-button size="medium" @click="dialogVisible = false">取 消</el-button>
+						<el-button size="medium" type="primary" @click="submit">保 存</el-button>
+					</div>
+				</div>
+			</el-dialog>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getFireDeviceModel,
+		insertFireDeviceModel,
+		updateFireDeviceModel,
+		deleteFireDeviceModel
+	} from '@/httpApi/test'
+	export default {
+		data() {
+			return {
+				list: [],
+				defaultProps: {
+					label: 'name'
+				},
+				dialogVisible: false,
+				form: {
+					parentId: '',
+					name: '',
+					title: '',
+					content: ''
+				}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getFireDeviceModel(this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						this.list = res.data;
+					}
+				})
+			},
+			insert(id) {
+				this.form = {
+					name: '',
+					sign: '',
+					remark: '',
+					parentId: id,
+					isp: 1
+				}
+				this.dialogVisible = true;
+			},
+			update(data) {
+				this.form = JSON.parse(JSON.stringify(data));
+				this.dialogVisible = true;
+			},
+			submit() {
+				this.form['projectId'] = this.$store.getters.project.id;
+				this.form.id ? updateFireDeviceModel(this.form).then(this.successFunc) : insertFireDeviceModel(this.form)
+					.then(this
+						.successFunc);
+			},
+			successFunc(res) {
+				if (res.state) {
+					this.$message.success('操作成功');
+					this.init();
+					this.dialogVisible = false;
+				}
+			},
+			deleteModel(id) {
+				this.$confirm('确定要删除该层级?', () => {
+					deleteFireDeviceModel(id).then(res => {
+						if (res.state) {
+							this.init();
+							this.$message.success('操作成功');
+						}
+					})
+				});
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+	.device-level {
+		padding: 10px;
+		background: rgba(0, 4, 10, 0.3);
+
+		.tree-node-operation {
+			display: flex;
+			align-items: center;
+		}
+
+		.huifont-xinzeng {
+			font-size: 14px;
+		}
+	}
+</style>

+ 58 - 99
virgo.wzfrontend/console/src/components/work/iot/security/electronicPatrolDetail.vue

@@ -4,113 +4,48 @@
 		<div class="hui-detail-content">
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">单位工程</div>
-				<div class="hui-detail-value">一号楼</div>
+				<div class="hui-detail-value">{{detail.projectItemName}}</div>
 			</div>
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">具体位置</div>
-				<div class="hui-detail-value">一层</div>
+				<div class="hui-detail-value">{{detail.projectItemTargetName}}</div>
 			</div>
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">路径名称</div>
-				<div class="hui-detail-value">路径1</div>
+				<div class="hui-detail-value">{{detail.name}}</div>
 			</div>
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">点位数量</div>
-				<div class="hui-detail-value">6</div>
+				<div class="hui-detail-value">{{detail.pointNumber}}</div>
 			</div>
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">今日打卡</div>
-				<div class="hui-detail-value">4</div>
+				<div class="hui-detail-value">{{detail.checkTodayNumber}}</div>
 			</div>
 			<div class="hui-detail-item">
 				<div class="hui-detail-label">累计打卡</div>
-				<div class="hui-detail-value">193</div>
+				<div class="hui-detail-value">{{detail.accumulateNumber}}</div>
 			</div>
 		</div>
-		<div class="hui-detail-title">今日打卡记录</div>
-		<el-collapse>
-			<el-collapse-item title="打卡点位1">
-				<div class="clock-now">今天</div>
-				<div class="clock-list">
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-							<div class="content">
-								<div class="remark">
-									公司要举办关于对方的计算机反对司法解释放2023年年会的活动
-								</div>
-								<div class="remark-file">
-									<upload :list="list"></upload>
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-							<div class="content">
-								<div class="remark">
-									公司要举办关于对方的计算机反对司法解释放2023年年会的活动
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-						</div>
-					</div>
-				</div>
-			</el-collapse-item>
-			<el-collapse-item title="打卡点位2">
-				<div class="clock-now">今天</div>
-				<div class="clock-list">
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-							<div class="content">
-								<div class="remark">
-									公司要举办关于对方的计算机反对司法解释放2023年年会的活动
-								</div>
-								<div class="remark-file">
-									<upload :list="list"></upload>
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-							<div class="content">
-								<div class="remark">
-									公司要举办关于对方的计算机反对司法解释放2023年年会的活动
+		<div class="hui-detail-title">打卡记录</div>
+		<el-collapse v-if="detail.points">
+			<el-collapse-item :title="item.name" v-for="(item,index) in pointTypeList" :key="index">
+				<div v-for="(value,key,index) in returnDateList(item)">
+					<div class="clock-now">{{key}}</div>
+					<div class="clock-list">
+						<div class="clock-item" v-for="node in value" :key="node.id">
+							<div class="clock-date">{{$dayjs(node.date).format('HH:mm:ss')}}</div>
+							<div class="clock-content">
+								<div class="name">{{node.userName}}</div>
+								<div class="content">
+									<div class="remark">{{node.content.remark}}</div>
+									<div class="remark-file">
+										<upload :list="node.content.file"></upload>
+									</div>
 								</div>
 							</div>
 						</div>
 					</div>
-					<div class="clock-item">
-						<div class="clock-date">
-							14:12:36
-						</div>
-						<div class="clock-content">
-							<div class="name">周星星</div>
-						</div>
-					</div>
 				</div>
 			</el-collapse-item>
 		</el-collapse>
@@ -119,22 +54,46 @@
 
 <script>
 	import upload from '@/components/common/upload'
+	import {
+		getClockInList
+	} from '@/httpApi/test'
 	export default {
+		props: ['detail'],
 		data() {
 			return {
-				list: [{
-						"id": 13700,
-						"name": "photo4.png",
-						"url": "https://file-node.oss-cn-shanghai.aliyuncs.com/youji/31025fc5b8b44183bf1cdf39f821ca5d",
-						"type": "png"
-					},
-					{
-						"id": 13701,
-						"name": "photo11.jpeg",
-						"url": "https://file-node.oss-cn-shanghai.aliyuncs.com/youji/bc203e8392044054aaf090ea9a34b009",
-						"type": "jpeg"
+				pointList: [],
+				pointTypeList: []
+			}
+		},
+		created() {
+			this.pointTypeList = this.detail.points.reverse();
+			this.init();
+		},
+		methods: {
+			init() {
+				getClockInList({
+					testGId: this.detail.id
+				}).then(res => {
+					if (res.state) {
+						this.pointList = res.data.map(node => {
+							node['content'] = node.content ? JSON.parse(node.content) : {
+								remark: '',
+								file: []
+							}
+							return node;
+						});
 					}
-				]
+				})
+			},
+			returnDateList(item) {
+				let data = this.pointList.filter(node => node.pointId === item.id);
+				let obj = {}
+				for (let i = 0; i < data.length; i++) {
+					let date = this.$dayjs(data[i].date).format('YYYY-MM-DD');
+					if (!obj[date]) obj[date] = [];
+					obj[date].push(data[i])
+				}
+				return obj;
 			}
 		},
 		components: {
@@ -164,7 +123,7 @@
 		}
 
 		.clock-now {
-			width: 62px;
+			width: 90px;
 			text-align: center;
 			font-size: 15px;
 			font-weight: 600;

+ 96 - 2
virgo.wzfrontend/console/src/httpApi/test.js

@@ -213,15 +213,109 @@ export function getElectronicPatrolRoutesList(data) {
 		method: 'post',
 		data: data
 	})
-}
+}
 /* 
  * 获取打卡事件统计
  * 
  * 
  */
-export function getElectronicPatrolEventtList(projectId) {
+export function getElectronicPatrolEventTest(projectId) {
 	return request({
 		url: `/api/test/routes/${projectId}`,
 		method: 'get',
 	})
+}
+/* 
+ * 获取路径详情
+ * 
+ * 
+ */
+export function getElectronicPatrolEventList(data) {
+	return request({
+		url: `/api/test/routes/get`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取打卡列表
+ * 
+ * 
+ */
+export function getClockInList(data) {
+	return request({
+		url: `/api/test/clockIn/get`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取环境列表
+ * 
+ * 
+ */
+export function getAirList(data) {
+	return request({
+		url: `/api/test/air/1/100`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 获取设备层级
+ * 
+ * 
+ */
+export function getFireDeviceModel(projectId) {
+	return request({
+		url: `/api/test/fireFightingLevel/${projectId}`,
+		method: 'get'
+	})
+}
+/* 
+ * 新增设备层级
+ * 
+ * 
+ */
+export function insertFireDeviceModel(data) {
+	return request({
+		url: `/api/test/fireFightingLevel`,
+		method: 'post',
+		data: data
+	})
+}
+/* 
+ * 编辑设备层级
+ * 
+ * 
+ */
+export function updateFireDeviceModel(data) {
+	return request({
+		url: `/api/test/fireFightingLevel`,
+		method: 'put',
+		data: data
+	})
+}
+/* 
+ * 删除设备层级
+ * 
+ * 
+ */
+export function deleteFireDeviceModel(id) {
+	return request({
+		url: `/api/test/fireFightingLevel//${id}`,
+		method: 'delete'
+	})
+}
+/* 
+ * 获取消防记录列表
+ * 
+ * 
+ */
+export function getFireList(data) {
+	return request({
+		url: `/api/test/fireFighting/get`,
+		method: 'post',
+		data: data
+	})
 }

+ 11 - 6
virgo.wzfrontend/console/src/views/system/level.vue

@@ -2,16 +2,20 @@
 	<div class="level-system">
 		<div class="level-item">
 			<device-level></device-level>
-		</div>
-		<div class="level-item">
-			<device-levels></device-levels>
+		</div>
+		<div class="level-item">
+			<device-levels></device-levels>
+		</div>
+		<div class="level-item">
+			<set-system></set-system>
 		</div>
 	</div>
 </template>
 
 <script>
-	import deviceLevel from '@/components/system/level/deviceLevel'
+	import deviceLevel from '@/components/system/level/deviceLevel'
 	import deviceLevels from '@/components/system/level/deviceLevels'
+	import setSystem from '@/components/work/iot/firefighting/setSystem'
 	export default {
 		data() {
 			return {}
@@ -19,8 +23,9 @@
 		created() {},
 		methods: {},
 		components: {
-			deviceLevel,
-			deviceLevels
+			deviceLevel,
+			deviceLevels,
+			setSystem
 		},
 	}
 </script>

+ 77 - 63
virgo.wzfrontend/console/src/views/work/iot/dangerous/chemistry.vue

@@ -1,23 +1,23 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
-			<div class="chemistry box-background">
-				<div class="chemistry-box">
-					<div class="chemistry-center">
-						<test-alarm></test-alarm>
-						<div class="bim-box">
-							<model type="chemistry" fileId="10000815010702"></model>
+			<div class="flammability box-background">
+				<div class="flammability-box">
+					<div class="flammability-center">
+						<test-alarm ref="testAlarm" :type="9"></test-alarm>
+						<div class="bim-box">
+							<model type="chemistry" fileId="10000815010702"></model>
 						</div>
 					</div>
-					<div class="chemistry-right">
-						<div class="chemistry-chart hui-flex">
+					<div class="flammability-right">
+						<div class="flammability-chart hui-flex">
 							<div class="hui-chart-title">
 								统计分析
 							</div>
 							<div ref="chart1" class="hui-flex-box"></div>
 						</div>
-						<div class="chemistry-list">
+						<div class="flammability-list">
 							<div class="alarm-table-box hui-flex">
 								<div class="alarm-title">
 									<div class="hui-chart-title">
@@ -29,46 +29,18 @@
 										<span class="tr-50">状态</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备1</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备2</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备3</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备4</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
+								<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+									<empty width="100" description="暂无报警记录"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in list" :key="index">
+										<span class="tr-100 hui-ellipsis">{{item.deviceName}}</span>
+										<span class="tr-130">{{item.date}}</span>
+										<span class="tr-50 tr-center">
+											<span class="color-red" v-if="!item.state">报警中</span>
+											<span class="color-blue" v-else-if="item.state === 1">处理中</span>
+											<span class="color-green" v-else-if="item.state === 2">已处理</span>
+										</span>
 									</div>
 								</div>
 							</div>
@@ -81,25 +53,67 @@
 </template>
 
 <script>
-	import selectSpace from '@/components/work/common/selectSpace'
-	import testAlarm from '@/components/work/common/testAlarm'
+	import projectItemTree from '@/components/common/projectItemTree'
+	import testAlarm from '@/components/work/common/testAlarm'
 	import model from '@/components/work/common/model'
+	import {
+		getDeviceAlarmList
+	} from '@/httpApi/test'
 	export default {
 		data() {
-			return {}
+			return {
+				type: 10,
+				list: []
+			}
 		},
 		created() {
 			this.$nextTick(() => {
-				this.chart(this.$refs.chart1, [1, 3, 2, 6, 1])
+				this.init();
 			})
 		},
 		components: {
 			testAlarm,
-			selectSpace,
+			projectItemTree,
 			model
 		},
 		methods: {
-			chart(elem, data) {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getDeviceAlarmList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data;
+						let obj = {},
+							list = [];
+						for (let i = 0; i < this.list.length; i++) {
+							if (!obj[this.list[i].deviceId]) {
+								obj[this.list[i].deviceId] = 1;
+								list.push({
+									id: this.list[i].deviceId,
+									name: this.list[i].deviceName,
+									value: 0,
+								})
+							}
+							list.find(node => node.id == this.list[i].deviceId).value++;
+						}
+						this.$nextTick(() => {
+							this.chart(this.$refs.chart1, list.map(node => node.value), list.map(node =>
+								node.name))
+						})
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {}
+				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
+				this.init(obj);
+			},
+			chart(elem, data, x) {
 				let chart = echarts.init(elem);
 				let option = {
 					tooltip: {
@@ -128,7 +142,7 @@
 					color: ['#1978E5'],
 					xAxis: {
 						type: 'category',
-						data: ['安装', '保养', '维修', '巡检', '拆除'],
+						data: x,
 						axisLabel: {
 							margin: 4,
 							color: '#D0DEEE',
@@ -204,13 +218,13 @@
 </script>
 
 <style lang="scss">
-	.chemistry {
+	.flammability {
 		width: 100%;
 		height: 100%;
 		padding: 20px;
 		overflow: auto;
 
-		.chemistry-box {
+		.flammability-box {
 			width: 100%;
 			height: 100%;
 			min-width: 1100px;
@@ -218,7 +232,7 @@
 			display: flex;
 		}
 
-		.chemistry-center {
+		.flammability-center {
 			flex: 1;
 			width: 0;
 			height: 100%;
@@ -226,7 +240,7 @@
 			flex-direction: column;
 		}
 
-		.chemistry-right {
+		.flammability-right {
 			height: 100%;
 			width: 350px;
 			margin-left: 12px;
@@ -234,13 +248,13 @@
 			flex-direction: column;
 		}
 
-		.chemistry-chart {
+		.flammability-chart {
 			height: 306px;
 			background: rgba(0, 4, 10, 0.3);
 			padding: 20px;
 		}
 
-		.chemistry-list {
+		.flammability-list {
 			margin-top: 12px;
 			background: rgba(0, 4, 10, 0.3);
 			flex: 1;

+ 62 - 48
virgo.wzfrontend/console/src/views/work/iot/dangerous/flammability.vue

@@ -1,11 +1,11 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
 			<div class="flammability box-background">
 				<div class="flammability-box">
 					<div class="flammability-center">
-						<test-alarm></test-alarm>
+						<test-alarm ref="testAlarm" :type="7"></test-alarm>
 						<div class="bim-box">
 							<model type="flammability" fileId="10000815010702"></model>
 						</div>
@@ -29,46 +29,18 @@
 										<span class="tr-50">状态</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备1</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备2</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备3</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备4</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
+								<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+									<empty width="100" description="暂无报警记录"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in list" :key="index">
+										<span class="tr-100 hui-ellipsis">{{item.deviceName}}</span>
+										<span class="tr-130">{{item.date}}</span>
+										<span class="tr-50 tr-center">
+											<span class="color-red" v-if="!item.state">报警中</span>
+											<span class="color-blue" v-else-if="item.state === 1">处理中</span>
+											<span class="color-green" v-else-if="item.state === 2">已处理</span>
+										</span>
 									</div>
 								</div>
 							</div>
@@ -81,25 +53,67 @@
 </template>
 
 <script>
-	import selectSpace from '@/components/work/common/selectSpace'
+	import projectItemTree from '@/components/common/projectItemTree'
 	import testAlarm from '@/components/work/common/testAlarm'
 	import model from '@/components/work/common/model'
+	import {
+		getDeviceAlarmList
+	} from '@/httpApi/test'
 	export default {
 		data() {
-			return {}
+			return {
+				type: 8,
+				list: []
+			}
 		},
 		created() {
 			this.$nextTick(() => {
-				this.chart(this.$refs.chart1, [1, 3, 2, 6, 1])
+				this.init();
 			})
 		},
 		components: {
 			testAlarm,
-			selectSpace,
+			projectItemTree,
 			model
 		},
 		methods: {
-			chart(elem, data) {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getDeviceAlarmList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data;
+						let obj = {},
+							list = [];
+						for (let i = 0; i < this.list.length; i++) {
+							if (!obj[this.list[i].deviceId]) {
+								obj[this.list[i].deviceId] = 1;
+								list.push({
+									id: this.list[i].deviceId,
+									name: this.list[i].deviceName,
+									value: 0,
+								})
+							}
+							list.find(node => node.id == this.list[i].deviceId).value++;
+						}
+						this.$nextTick(() => {
+							this.chart(this.$refs.chart1, list.map(node => node.value), list.map(node =>
+								node.name))
+						})
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {}
+				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
+				this.init(obj);
+			},
+			chart(elem, data, x) {
 				let chart = echarts.init(elem);
 				let option = {
 					tooltip: {
@@ -128,7 +142,7 @@
 					color: ['#1978E5'],
 					xAxis: {
 						type: 'category',
-						data: ['安装', '保养', '维修', '巡检', '拆除'],
+						data: x,
 						axisLabel: {
 							margin: 4,
 							color: '#D0DEEE',

+ 75 - 61
virgo.wzfrontend/console/src/views/work/iot/dangerous/pollute.vue

@@ -1,27 +1,27 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
-			<div class="pollute box-background">
-				<div class="pollute-box">
-					<div class="pollute-center">
-						<test-alarm></test-alarm>
+			<div class="flammability box-background">
+				<div class="flammability-box">
+					<div class="flammability-center">
+						<test-alarm ref="testAlarm" :type="9"></test-alarm>
 						<div class="bim-box">
 							<model type="pollute" fileId="10000815010702"></model>
 						</div>
 					</div>
-					<div class="pollute-right">
-						<div class="pollute-chart hui-flex">
+					<div class="flammability-right">
+						<div class="flammability-chart hui-flex">
 							<div class="hui-chart-title">
 								统计分析
 							</div>
 							<div ref="chart1" class="hui-flex-box"></div>
 						</div>
-						<div class="pollute-list">
+						<div class="flammability-list">
 							<div class="alarm-table-box hui-flex">
 								<div class="alarm-title">
 									<div class="hui-chart-title">
-										污染废弃物报警
+										废气污染物报警
 									</div>
 									<div class="alarm-tr">
 										<span class="tr-100">设备名称</span>
@@ -29,46 +29,18 @@
 										<span class="tr-50">状态</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备1</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备2</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备3</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-green">已处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备4</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-100 hui-ellipsis">设备5</span>
-										<span class="tr-130">2024-01-12 12:14:10</span>
-										<span class="tr-50 color-red">未处理</span>
+								<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+									<empty width="100" description="暂无报警记录"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in list" :key="index">
+										<span class="tr-100 hui-ellipsis">{{item.deviceName}}</span>
+										<span class="tr-130">{{item.date}}</span>
+										<span class="tr-50 tr-center">
+											<span class="color-red" v-if="!item.state">报警中</span>
+											<span class="color-blue" v-else-if="item.state === 1">处理中</span>
+											<span class="color-green" v-else-if="item.state === 2">已处理</span>
+										</span>
 									</div>
 								</div>
 							</div>
@@ -81,25 +53,67 @@
 </template>
 
 <script>
-	import selectSpace from '@/components/work/common/selectSpace'
+	import projectItemTree from '@/components/common/projectItemTree'
 	import testAlarm from '@/components/work/common/testAlarm'
 	import model from '@/components/work/common/model'
+	import {
+		getDeviceAlarmList
+	} from '@/httpApi/test'
 	export default {
 		data() {
-			return {}
+			return {
+				type: 12,
+				list: []
+			}
 		},
 		created() {
 			this.$nextTick(() => {
-				this.chart(this.$refs.chart1, [1, 3, 2, 6, 1])
+				this.init();
 			})
 		},
 		components: {
 			testAlarm,
-			selectSpace,
+			projectItemTree,
 			model
 		},
 		methods: {
-			chart(elem, data) {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getDeviceAlarmList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data;
+						let obj = {},
+							list = [];
+						for (let i = 0; i < this.list.length; i++) {
+							if (!obj[this.list[i].deviceId]) {
+								obj[this.list[i].deviceId] = 1;
+								list.push({
+									id: this.list[i].deviceId,
+									name: this.list[i].deviceName,
+									value: 0,
+								})
+							}
+							list.find(node => node.id == this.list[i].deviceId).value++;
+						}
+						this.$nextTick(() => {
+							this.chart(this.$refs.chart1, list.map(node => node.value), list.map(node =>
+								node.name))
+						})
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {}
+				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
+				this.init(obj);
+			},
+			chart(elem, data, x) {
 				let chart = echarts.init(elem);
 				let option = {
 					tooltip: {
@@ -128,7 +142,7 @@
 					color: ['#1978E5'],
 					xAxis: {
 						type: 'category',
-						data: ['安装', '保养', '维修', '巡检', '拆除'],
+						data: x,
 						axisLabel: {
 							margin: 4,
 							color: '#D0DEEE',
@@ -204,13 +218,13 @@
 </script>
 
 <style lang="scss">
-	.pollute {
+	.flammability {
 		width: 100%;
 		height: 100%;
 		padding: 20px;
 		overflow: auto;
 
-		.pollute-box {
+		.flammability-box {
 			width: 100%;
 			height: 100%;
 			min-width: 1100px;
@@ -218,7 +232,7 @@
 			display: flex;
 		}
 
-		.pollute-center {
+		.flammability-center {
 			flex: 1;
 			width: 0;
 			height: 100%;
@@ -226,7 +240,7 @@
 			flex-direction: column;
 		}
 
-		.pollute-right {
+		.flammability-right {
 			height: 100%;
 			width: 350px;
 			margin-left: 12px;
@@ -234,13 +248,13 @@
 			flex-direction: column;
 		}
 
-		.pollute-chart {
+		.flammability-chart {
 			height: 306px;
 			background: rgba(0, 4, 10, 0.3);
 			padding: 20px;
 		}
 
-		.pollute-list {
+		.flammability-list {
 			margin-top: 12px;
 			background: rgba(0, 4, 10, 0.3);
 			flex: 1;

+ 48 - 128
virgo.wzfrontend/console/src/views/work/iot/environment/air.vue

@@ -1,159 +1,48 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
-		<div class="hui-tree-content" style="padding: 0;">
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
+		<div class="hui-tree-content">
 			<div class="hui-flex hui-content box-background">
 				<div class="hui-content-title">
 					<div class="hui-title-item active">空气检测</div>
+				</div>
+				<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+					<empty description="暂无空气检测设备"></empty>
 				</div>
-				<div class="hui-flex-box smell-list">
-					<div class="smell-item">
+				<div class="hui-flex-box smell-list" v-else>
+					<div class="smell-item" v-for="(item,index) in list" :key="index">
 						<div class="smell-item-title">
 							<i class="iconfont huifont-shouye"></i>
-							<span>区域1</span>
+							<span>{{item.name}}</span>
 						</div>
 						<div class="smell-item-box">
 							<div class="smell-item-row">
 								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">-12</div>
+									<div class="smell-item-value alibaba color-green">{{item.temperature}}</div>
 									<div class="smell-item-name">温度(°C)</div>
 								</div>
 								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">0.5</div>
+									<div class="smell-item-value alibaba color-green">{{item.tVoc}}</div>
 									<div class="smell-item-name">Tvoc(ppm)</div>
 								</div>
 							</div>
 							<div class="smell-item-row">
 								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">55.3</div>
+									<div class="smell-item-value alibaba color-green">{{item.humidity}}</div>
 									<div class="smell-item-name">湿度(%)</div>
 								</div>
 								<div class="smell-item-label">
-									<div class="smell-item-value color-green">32</div>
+									<div class="smell-item-value color-green">{{item.pm25}}</div>
 									<div class="smell-item-name">PM2.5(ug/m3)</div>
 								</div>
 							</div>
 							<div class="smell-item-row">
 								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">589</div>
+									<div class="smell-item-value alibaba color-green">{{item.co2}}</div>
 									<div class="smell-item-name">CO2(ppm)</div>
 								</div>
 								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">69</div>
-									<div class="smell-item-name">PM10(ug/m3)</div>
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="smell-item">
-						<div class="smell-item-title">
-							<i class="iconfont huifont-shouye"></i>
-							<span>区域2</span>
-						</div>
-						<div class="smell-item-box">
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">-12</div>
-									<div class="smell-item-name">温度(°C)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">0.5</div>
-									<div class="smell-item-name">Tvoc(ppm)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">55.3</div>
-									<div class="smell-item-name">湿度(%)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value color-green">32</div>
-									<div class="smell-item-name">PM2.5(ug/m3)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">589</div>
-									<div class="smell-item-name">CO2(ppm)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">69</div>
-									<div class="smell-item-name">PM10(ug/m3)</div>
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="smell-item">
-						<div class="smell-item-title">
-							<i class="iconfont huifont-shouye"></i>
-							<span>区域3</span>
-						</div>
-						<div class="smell-item-box">
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">-12</div>
-									<div class="smell-item-name">温度(°C)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">0.5</div>
-									<div class="smell-item-name">Tvoc(ppm)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">55.3</div>
-									<div class="smell-item-name">湿度(%)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value color-green">32</div>
-									<div class="smell-item-name">PM2.5(ug/m3)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">589</div>
-									<div class="smell-item-name">CO2(ppm)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">69</div>
-									<div class="smell-item-name">PM10(ug/m3)</div>
-								</div>
-							</div>
-						</div>
-					</div>
-					<div class="smell-item">
-						<div class="smell-item-title">
-							<i class="iconfont huifont-shouye"></i>
-							<span>区域4</span>
-						</div>
-						<div class="smell-item-box">
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">-12</div>
-									<div class="smell-item-name">温度(°C)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">0.5</div>
-									<div class="smell-item-name">Tvoc(ppm)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">55.3</div>
-									<div class="smell-item-name">湿度(%)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value color-green">32</div>
-									<div class="smell-item-name">PM2.5(ug/m3)</div>
-								</div>
-							</div>
-							<div class="smell-item-row">
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">589</div>
-									<div class="smell-item-name">CO2(ppm)</div>
-								</div>
-								<div class="smell-item-label">
-									<div class="smell-item-value alibaba color-green">69</div>
+									<div class="smell-item-value alibaba color-green">{{item.pm10}}</div>
 									<div class="smell-item-name">PM10(ug/m3)</div>
 								</div>
 							</div>
@@ -166,11 +55,42 @@
 </template>
 
 <script>
-	import selectSpace from '@/components/work/common/selectSpace'
+	import projectItemTree from '@/components/common/projectItemTree'
+	import {
+		getAirList
+	} from '@/httpApi/test'
 	export default {
 		components: {
-			selectSpace
-		}
+			projectItemTree
+		},
+		data() {
+			return {
+				list: []
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getAirList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data.dataList;
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {};
+				this.init(obj);
+			},
+		},
 	}
 </script>
 

+ 136 - 147
virgo.wzfrontend/console/src/views/work/iot/environment/monitor.vue

@@ -1,163 +1,55 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
 			<div class="monitor box-background">
 				<div class="monitor-box">
 					<div class="monitor-center">
-						<test-alarm></test-alarm>
+						<test-alarm ref="testAlarm" :type="13"></test-alarm>
 						<div class="bim-box">
 							<model type="enviroment-monitor" fileId="10000786668573"></model>
 						</div>
 					</div>
-					<div class="monitor-right">
+					<div class="monitor-right hui-flex">
 						<div class="hui-chart-title">
 							环境设备列表
 						</div>
-						<div class="environment-list">
-							<div class="smell-item">
-								<div class="smell-item-title color-font">
-									<span>财务室</span>
-								</div>
-								<div class="smell-item-box">
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">-12</div>
-											<div class="smell-item-name">温度(°C)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">0.5</div>
-											<div class="smell-item-name">Tvoc(ppm)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">55.3</div>
-											<div class="smell-item-name">湿度(%)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">32</div>
-											<div class="smell-item-name">PM2.5(ug/m3)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">589</div>
-											<div class="smell-item-name">CO2(ppm)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">69</div>
-											<div class="smell-item-name">PM10(ug/m3)</div>
-										</div>
-									</div>
-								</div>
-							</div>
-							<div class="smell-item">
-								<div class="smell-item-title color-font">
-									<span>财务室</span>
-								</div>
-								<div class="smell-item-box">
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">-12</div>
-											<div class="smell-item-name">温度(°C)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">0.5</div>
-											<div class="smell-item-name">Tvoc(ppm)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">55.3</div>
-											<div class="smell-item-name">湿度(%)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">32</div>
-											<div class="smell-item-name">PM2.5(ug/m3)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">589</div>
-											<div class="smell-item-name">CO2(ppm)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">69</div>
-											<div class="smell-item-name">PM10(ug/m3)</div>
-										</div>
-									</div>
-								</div>
-							</div>
-							<div class="smell-item">
-								<div class="smell-item-title color-font">
-									<span>财务室</span>
-								</div>
-								<div class="smell-item-box">
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">-12</div>
-											<div class="smell-item-name">温度(°C)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">0.5</div>
-											<div class="smell-item-name">Tvoc(ppm)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">55.3</div>
-											<div class="smell-item-name">湿度(%)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">32</div>
-											<div class="smell-item-name">PM2.5(ug/m3)</div>
-										</div>
-									</div>
-									<div class="smell-item-row">
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">589</div>
-											<div class="smell-item-name">CO2(ppm)</div>
-										</div>
-										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">69</div>
-											<div class="smell-item-name">PM10(ug/m3)</div>
-										</div>
-									</div>
-								</div>
-							</div>
-							<div class="smell-item">
+						<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+							<empty width="100" description="暂无空气检测设备"></empty>
+						</div>
+						<div class="environment-list hui-flex-box" v-else>
+							<div class="smell-item" v-for="(item,index) in list" :key="index">
 								<div class="smell-item-title color-font">
-									<span>财务室</span>
+									<span>{{item.name}}</span>
 								</div>
 								<div class="smell-item-box">
 									<div class="smell-item-row">
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">-12</div>
+											<div class="smell-item-value alibaba color-green">{{item.temperature}}</div>
 											<div class="smell-item-name">温度(°C)</div>
 										</div>
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">0.5</div>
+											<div class="smell-item-value alibaba color-green">{{item.tVoc}}</div>
 											<div class="smell-item-name">Tvoc(ppm)</div>
 										</div>
 									</div>
 									<div class="smell-item-row">
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">55.3</div>
+											<div class="smell-item-value alibaba color-green">{{item.humidity}}</div>
 											<div class="smell-item-name">湿度(%)</div>
 										</div>
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">32</div>
+											<div class="smell-item-value color-green">{{item.pm25}}</div>
 											<div class="smell-item-name">PM2.5(ug/m3)</div>
 										</div>
 									</div>
 									<div class="smell-item-row">
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">589</div>
+											<div class="smell-item-value alibaba color-green">{{item.co2}}</div>
 											<div class="smell-item-name">CO2(ppm)</div>
 										</div>
 										<div class="smell-item-label">
-											<div class="smell-item-value alibaba color-green">69</div>
+											<div class="smell-item-value alibaba color-green">{{item.pm10}}</div>
 											<div class="smell-item-name">PM10(ug/m3)</div>
 										</div>
 									</div>
@@ -172,34 +64,34 @@
 					</div>
 					<div class="pass-rate-box">
 						<div class="pass-rate-item">
-							<progress-bar title="温度合格率" :percent="70"></progress-bar>
+							<progress-bar title="温度合格率" :percent="returnQualified('temperature')*100"></progress-bar>
 						</div>
 						<div class="pass-rate-item">
-							<progress-bar title="湿度合格率" :percent="49"></progress-bar>
+							<progress-bar title="湿度合格率" :percent="returnQualified('humidity')*100"></progress-bar>
 						</div>
 						<div class="pass-rate-item">
-							<progress-bar title="CO2合格率" :percent="81.12"></progress-bar>
+							<progress-bar title="CO2合格率" :percent="returnQualified('co2')*100"></progress-bar>
 						</div>
 						<div class="pass-rate-item">
-							<progress-bar title="甲醛合格率" :percent="12.6"></progress-bar>
+							<progress-bar title="PM10合格率" :percent="returnQualified('pm10')*100"></progress-bar>
 						</div>
 						<div class="pass-rate-item">
-							<progress-bar title="TVOC合格率" :percent="32"></progress-bar>
+							<progress-bar title="TVOC合格率" :percent="returnQualified('tVoc')*100"></progress-bar>
 						</div>
 						<div class="pass-rate-item">
-							<progress-bar title="PM2.5合格率" :percent="81.12"></progress-bar>
+							<progress-bar title="PM2.5合格率" :percent="returnQualified('pm25')*100"></progress-bar>
 						</div>
 					</div>
 				</div>
 				<div class="statistics-box">
 					<div class="hui-chart-title">
-						近24小时统计
+						环境统计
 					</div>
 					<div class="statistics-chart">
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时温度
+									温度
 								</div>
 								<div ref="chart1" class="chart-dom"></div>
 							</div>
@@ -207,7 +99,7 @@
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时湿度
+									湿度
 								</div>
 								<div ref="chart2" class="chart-dom"></div>
 							</div>
@@ -215,7 +107,7 @@
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时CO2
+									CO2
 								</div>
 								<div ref="chart3" class="chart-dom"></div>
 							</div>
@@ -223,7 +115,7 @@
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时甲醛
+									甲醛
 								</div>
 								<div ref="chart4" class="chart-dom"></div>
 							</div>
@@ -231,7 +123,7 @@
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时TVOC
+									TVOC
 								</div>
 								<div ref="chart5" class="chart-dom"></div>
 							</div>
@@ -239,7 +131,7 @@
 						<div class="statistics-chart-item">
 							<div class="chart-box">
 								<div class="chart-title">
-									近24小时PM2.5
+									PM2.5
 								</div>
 								<div ref="chart6" class="chart-dom"></div>
 							</div>
@@ -253,31 +145,128 @@
 
 <script>
 	import testAlarm from '@/components/work/common/testAlarm'
-	import selectSpace from '@/components/work/common/selectSpace'
+	import projectItemTree from '@/components/common/projectItemTree'
 	import progressBar from '@/components/common/progressBar'
 	import model from '@/components/work/common/model'
+	import {
+		getAirList
+	} from '@/httpApi/test'
 	export default {
 		data() {
-			return {}
+			return {
+				list: [],
+				qualified: {
+					temperature: [0, 30],
+					humidity: [40, 100],
+					co2: [0, 1500],
+					pm25: [0, 35],
+					pm10: [0, 100],
+					tVoc: [0, 0.6]
+				},
+				qualifiedCount: {
+					temperature: 0,
+					humidity: 0,
+					co2: 0,
+					pm25: 0,
+					pm10: 0,
+					tVoc: 0
+				}
+			}
 		},
 		created() {
 			this.$nextTick(() => {
-				this.chart(this.$refs.chart1, [1, 2, 2, 3, 2, 3], '#DE4749');
-				this.chart(this.$refs.chart2, [1, 2, 2, 3, 2, 3], '#00D5FF');
-				this.chart(this.$refs.chart3, [1, 2, 2, 3, 2, 3], '#A4B0D0');
-				this.chart(this.$refs.chart4, [1, 2, 2, 3, 2, 3], '#8441C2');
-				this.chart(this.$refs.chart5, [1, 2, 2, 3, 2, 3], '#FFC073');
-				this.chart(this.$refs.chart6, [1, 2, 2, 3, 2, 3], '#49B788');
+				this.init();
 			})
 		},
 		components: {
 			testAlarm,
-			selectSpace,
+			projectItemTree,
 			progressBar,
 			model
 		},
 		methods: {
-			chart(elem, data, color) {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getAirList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data.dataList;
+						this.qualifiedFunc();
+						this.testChart();
+					}
+				})
+			},
+			qualifiedFunc() {
+				let qualifiedCount = {
+					temperature: 0,
+					humidity: 0,
+					co2: 0,
+					pm25: 0,
+					pm10: 0,
+					tVoc: 0
+				}
+				for (let i = 0; i < this.list.length; i++) {
+					for (let key in qualifiedCount) {
+						if (this.testQualifiedFunc(key, this.list[i][key])) qualifiedCount[key]++
+					}
+				}
+				this.qualifiedCount = qualifiedCount;
+			},
+			returnQualified(type) {
+				if (this.list.length === 0) return 0;
+				return Math.round((this.qualifiedCount[type] / this.list.length) * 100) / 100
+			},
+			testQualifiedFunc(type, value) {
+				return value > this.qualified[type][0] && value < this.qualified[type][1]
+			},
+			testChart() {
+				let nowList = this.list;
+				let qualifiedCount = [{
+					id: 1,
+					name: 'temperature',
+					color: '#DE4749'
+				}, {
+					id: 2,
+					name: 'humidity',
+					color: '#00D5FF'
+				}, {
+					id: 3,
+					name: 'co2',
+					color: '#A4B0D0'
+				}, {
+					id: 4,
+					name: 'pm25',
+					color: '#8441C2'
+				}, {
+					id: 5,
+					name: 'pm10',
+					color: '#FFC073'
+				}, {
+					id: 6,
+					name: 'tVoc',
+					color: '#49B788'
+				}];
+				for (let i = 0; i < qualifiedCount.length; i++) {
+					let x = [],
+						data = [];
+					for (let j = 0; j < nowList.length; j++) {
+						x.push(nowList[j].name)
+						data.push(nowList[j][qualifiedCount[i].name])
+					}
+					this.chart(this.$refs['chart' + qualifiedCount[i].id], data, qualifiedCount[i].color, x);
+				}
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {};
+				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
+				this.init(obj);
+			},
+			chart(elem, data, color, x) {
 				let chart = echarts.init(elem);
 				let option = {
 					tooltip: {
@@ -306,7 +295,7 @@
 					color: [color],
 					xAxis: {
 						type: 'category',
-						data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'],
+						data: x,
 						axisLabel: {
 							margin: 4,
 							color: '#D0DEEE',

+ 61 - 58
virgo.wzfrontend/console/src/views/work/iot/firefighting/facilities.vue

@@ -1,11 +1,11 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
 			<div class="electronic-patrol box-background">
 				<div class="electronic-patrol-box">
 					<div class="electronic-patrol-center">
-						<test-alarm></test-alarm>
+						<test-alarm ref="testAlarm" :type="4"></test-alarm>
 						<div class="bim-box">
 							<model type="facilities" fileId="10000786667614"></model>
 						</div>
@@ -22,18 +22,13 @@
 										<span class="tr-130">报警时间</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-flex">这个设备有问题</span>
-										<span class="tr-130">2020-02-02 10:01:11</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">这个设备有问题</span>
-										<span class="tr-130">2020-02-02 10:01:11</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">这个设备有问题</span>
-										<span class="tr-130">2020-02-02 10:01:11</span>
+								<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
+									<empty width="100" description="暂无报警记录"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in list" :key="index">
+										<span class="tr-flex">{{item.info}}</span>
+										<span class="tr-130">{{item.date}}</span>
 									</div>
 								</div>
 							</div>
@@ -47,49 +42,17 @@
 									<div class="alarm-tr">
 										<span class="tr-flex">设备类型</span>
 										<span class="tr-80 tr-center alibaba">设备数量</span>
-										<span class="tr-80 tr-center alibaba">故障设备</span>
+										<span class="tr-80 tr-center alibaba">在线设备</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">消防栓</span>
-										<span class="tr-80 tr-center alibaba color-blue">10</span>
-										<span class="tr-80 tr-center alibaba color-red">2</span>
+								<div class="hui-flex-box hui-no-tips" v-if="deviceList.length === 0">
+									<empty width="100" description="暂无消防设备"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in deviceList" :key="index">
+										<span class="tr-flex">{{item.column1}}</span>
+										<span class="tr-80 tr-center alibaba color-blue">{{item.totalNumber}}</span>
+										<span class="tr-80 tr-center alibaba color-green">{{item.online}}</span>
 									</div>
 								</div>
 							</div>
@@ -103,14 +66,54 @@
 
 <script>
 	import testAlarm from '@/components/work/common/testAlarm'
-	import selectSpace from '@/components/work/common/selectSpace'
+	import projectItemTree from '@/components/common/projectItemTree'
 	import model from '@/components/work/common/model'
+	import {
+		getDeviceAlarmList,
+		getDeviceCountList
+	} from '@/httpApi/test'
 	export default {
 		components: {
 			testAlarm,
-			selectSpace,
+			projectItemTree,
 			model
-		}
+		},
+		data() {
+			return {
+				type: 5,
+				list: [],
+				deviceList: []
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getDeviceAlarmList(postData).then(res => {
+					if (res.state) {
+						this.list = res.data;
+					}
+				})
+				getDeviceCountList(postData).then(res => {
+					if (res.state) {
+						this.deviceList = res.data;
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {}
+				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
+				this.init(obj);
+			}
+		},
 	}
 </script>
 

+ 79 - 244
virgo.wzfrontend/console/src/views/work/iot/firefighting/system.vue

@@ -5,74 +5,27 @@
 				<div class="firefighting-system-table-box hui-flex">
 					<div class="hui-chart-title">
 						<span>管理体系</span>
-						<el-button type="primary" size="mini">新增</el-button>
 					</div>
-					<div class="firefighting-system-table hui-flex-box">
-						<div class="firefighting-system-tr">
-							<div class="name">林夕三</div>
-							<div class="content">
-								<div class="label">组长</div>
-								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
-							</div>
-						</div>
-						<div class="firefighting-system-tr">
-							<div class="name">林夕三</div>
-							<div class="content">
-								<div class="label">副组长</div>
-								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
-							</div>
-						</div>
-						<div class="firefighting-system-tr">
-							<div class="name">鹿功良</div>
-							<div class="content">
-								<div class="label">副组长</div>
-								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
-							</div>
-						</div>
-						<div class="firefighting-system-tr">
-							<div class="name">林夕三</div>
-							<div class="content">
-								<div class="label">组员</div>
-								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
-							</div>
-						</div>
-						<div class="firefighting-system-tr">
-							<div class="name">林夕三</div>
-							<div class="content">
-								<div class="label">组员</div>
-								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
-							</div>
-						</div>
-						<div class="firefighting-system-tr">
-							<div class="name">林夕三</div>
+					<div class="hui-no-tips hui-flex-box" v-if="userList.length === 0">
+						<empty width="100" description="暂未设置管理体系"></empty>
+					</div>
+					<div class="firefighting-system-table hui-flex-box" v-else>
+						<div class="firefighting-system-tr" v-for="(item,index) in userList" :key="index">
+							<div class="name">{{item.name}}</div>
 							<div class="content">
-								<div class="label">组员</div>
+								<div class="label">{{item.title}}</div>
 								<div class="line"></div>
-								<div class="value hui-ellipsis">
-									应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感应当展现对工作的认真态度和对工作的责任感
-								</div>
+								<div class="value hui-ellipsis">{{item.content}}</div>
 							</div>
 						</div>
 					</div>
 				</div>
 			</div>
 			<div class="firefighting-system-item">
-				<organization-chart :datasource="ds">
+				<div class="hui-no-tips" v-if="!ds.id" style="width: 100%;height: 100%;">
+					<empty width="100" description="暂未设置管理体系" style="margin-top: 30px;"></empty>
+				</div>
+				<organization-chart :datasource="ds" v-else>
 					<template slot-scope="{ nodeData }">
 						<div>
 							<div class="organization-content">
@@ -106,88 +59,24 @@
 					<div class="alarm-title">
 						<div class="hui-chart-title">
 							<span>教育培训</span>
-							<el-button type="primary" size="mini">新增</el-button>
 						</div>
 						<div class="alarm-tr">
 							<span class="tr-flex">教育培训名称</span>
-							<span class="tr-130">培训时间</span>
 							<span class="tr-flex">教育培训内容</span>
+							<span class="tr-130">培训时间</span>
 							<span class="tr-flex">备注</span>
-							<span class="tr-50">操作</span>
+
 						</div>
 					</div>
-					<div class="alarm-table hui-flex-box">
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">教育培训内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
+					<div class="hui-flex-box hui-no-tips" v-if="learnList.length === 0">
+						<empty width="100" description="暂无教育培训记录"></empty>
+					</div>
+					<div class="alarm-table hui-flex-box" v-else>
+						<div class="alarm-tr" v-for="(item,index) in learnList" :key="index">
+							<span class="tr-flex">{{item.name}}</span>
+							<span class="tr-flex">{{item.content}}</span>
+							<span class="tr-130">{{item.date}}</span>
+							<span class="tr-flex">{{item.remark}}</span>
 						</div>
 					</div>
 				</div>
@@ -197,88 +86,24 @@
 					<div class="alarm-title">
 						<div class="hui-chart-title">
 							<span>消防演练</span>
-							<el-button type="primary" size="mini">新增</el-button>
 						</div>
 						<div class="alarm-tr">
 							<span class="tr-flex">消防演练名称</span>
 							<span class="tr-130">培训时间</span>
 							<span class="tr-flex">消防演练内容</span>
 							<span class="tr-flex">备注</span>
-							<span class="tr-50">操作</span>
+
 						</div>
 					</div>
-					<div class="alarm-table hui-flex-box">
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
-						</div>
-						<div class="alarm-tr">
-							<span class="tr-flex">演练培训名称</span>
-							<span class="tr-130">2020-02-02</span>
-							<span class="tr-flex">消防演练内容</span>
-							<span class="tr-flex">演练培训备注</span>
-							<span class="tr-50">
-								<span class="color-primary">查看</span>
-							</span>
+					<div class="hui-flex-box hui-no-tips" v-if="trainList.length === 0">
+						<empty width="100" description="暂无教育培训记录"></empty>
+					</div>
+					<div class="alarm-table hui-flex-box" v-else>
+						<div class="alarm-tr" v-for="(item,index) in trainList" :key="index">
+							<span class="tr-flex">{{item.name}}</span>
+							<span class="tr-flex">{{item.content}}</span>
+							<span class="tr-130">{{item.date}}</span>
+							<span class="tr-flex">{{item.remark}}</span>
 						</div>
 					</div>
 				</div>
@@ -290,49 +115,59 @@
 <script>
 	import OrganizationChart from 'vue-organization-chart'
 	import 'vue-organization-chart/dist/orgchart.css'
+	import {
+		getFireDeviceModel,
+		getFireList
+	} from '@/httpApi/test'
 	export default {
 		components: {
 			OrganizationChart
 		},
 		data() {
 			return {
-				ds: {
-					id: 1,
-					name: '林夕三',
-					title: '组长',
-					childrens: [{
-						id: 2,
-						name: '林夕三',
-						title: '副组长'
-					}, {
-						id: 4,
-						name: '林夕三',
-						title: '副组长'
-					}],
-					children: [{
-							id: 5,
-							name: '林夕三',
-							title: '组员'
-						},
-						{
-							id: 6,
-							name: '林夕三',
-							title: '组员'
-						}, {
-
-							id: 7,
-							name: '林夕三',
-							title: '组员'
-						}, {
-
-							id: 8,
-							name: '林夕三',
-							title: '组员'
-						},
-					]
-				}
+				visible: false,
+				ds: {},
+				userList: [],
+				learnList: [],
+				trainList: []
 			}
-		}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getFireDeviceModel(this.$store.getters.project.id).then(res => {
+					if (res.state) {
+						let data = res.data[0] || {};
+						if (data.id) {
+							this.userList.push(data);
+							data['childrens'] = data.children.filter(node => node.title === '副组长');
+							data['children'] = data.children.filter(node => node.title === '组员');
+							this.userList = this.userList.concat(data.childrens);
+							this.userList = this.userList.concat(data.children);
+						}
+						this.ds = data;
+					}
+				})
+				getFireList({
+					type: 3,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.learnList = res.data;
+					}
+				})
+				getFireList({
+					type: 4,
+					projectId: this.$store.getters.project.id
+				}).then(res => {
+					if (res.state) {
+						this.trainList = res.data;
+					}
+				})
+			}
+		},
 	}
 </script>
 

+ 124 - 92
virgo.wzfrontend/console/src/views/work/iot/firefighting/thoroughfare.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="yui-tree-box">
-		<select-space></select-space>
+		<project-item-tree @treeclick="treeclick" iconfontClass="el-icon-place"></project-item-tree>
 		<div class="hui-tree-content">
 			<div class="access-control box-background">
 				<div class="access-control-box">
@@ -12,8 +12,8 @@
 										<i class="iconfont huifont-zaichangrenshu"></i>
 									</div>
 									<div class="test-label">
-										<div class="test-name">当前在场人数</div>
-										<div class="test-value alibaba">100</div>
+										<div class="test-name">场人数</div>
+										<div class="test-value alibaba">{{allCount.totalNumber}}</div>
 									</div>
 								</div>
 								<div class="test-item">
@@ -22,7 +22,7 @@
 									</div>
 									<div class="test-label">
 										<div class="test-name">进场人数</div>
-										<div class="test-value alibaba">86</div>
+										<div class="test-value alibaba">{{allCount.online}}</div>
 									</div>
 								</div>
 								<div class="test-item">
@@ -31,7 +31,7 @@
 									</div>
 									<div class="test-label">
 										<div class="test-name">出场人数</div>
-										<div class="test-value alibaba">14</div>
+										<div class="test-value alibaba">{{allCount.offline}}</div>
 									</div>
 								</div>
 							</div>
@@ -47,42 +47,17 @@
 										<span class="tr-80 tr-center">现场人数</span>
 									</div>
 								</div>
-								<div class="alarm-table hui-flex-box">
-									<div class="alarm-tr">
-										<span class="tr-flex">一层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">二层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">三层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">四层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">三层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
-									</div>
-									<div class="alarm-tr">
-										<span class="tr-flex">四层</span>
-										<span class="tr-80 tr-center color-green alibaba">12</span>
-										<span class="tr-80 tr-center color-red alibaba">11</span>
-										<span class="tr-80 tr-center color-blue alibaba">0</span>
+								<div class="hui-flex-box hui-no-tips" v-if="personList.length === 0">
+									<empty width="100" description="暂无人数记录"></empty>
+								</div>
+								<div class="alarm-table hui-flex-box" v-else>
+									<div class="alarm-tr" v-for="(item,index) in personList" :key="index">
+										<span class="tr-flex">
+											{{projectItemTargetList.find(node=>node.id == item.projectItemTargetId).name}}
+										</span>
+										<span class="tr-80 tr-center color-green alibaba">{{item.online}}</span>
+										<span class="tr-80 tr-center color-red alibaba">{{item.offline}}</span>
+										<span class="tr-80 tr-center color-blue alibaba">{{item.totalNumber}}</span>
 									</div>
 								</div>
 							</div>
@@ -102,30 +77,13 @@
 									<span class="tr-130">巡查时间</span>
 								</div>
 							</div>
-							<div class="alarm-table hui-flex-box">
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
+							<div class="hui-flex-box hui-no-tips" v-if="thoroughList.length === 0">
+								<empty width="100" description="暂无巡查记录"></empty>
+							</div>
+							<div class="alarm-table hui-flex-box" v-else>
+								<div class="alarm-tr" v-for="(item,index) in thoroughList" :key="index">
+									<span class="tr-flex">{{item.content}}</span>
+									<span class="tr-130">{{item.date}}</span>
 								</div>
 							</div>
 						</div>
@@ -139,30 +97,13 @@
 									<span class="tr-130">巡查时间</span>
 								</div>
 							</div>
-							<div class="alarm-table hui-flex-box">
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
-								</div>
-								<div class="alarm-tr">
-									<span class="tr-flex">巡查内容巡查内容巡查内容</span>
-									<span class="tr-130">2020-01-01 20:00:06</span>
+							<div class="hui-flex-box hui-no-tips" v-if="doorList.length === 0">
+								<empty width="100" description="暂无巡查记录"></empty>
+							</div>
+							<div class="alarm-table hui-flex-box" v-else>
+								<div class="alarm-tr" v-for="(item,index) in doorList" :key="index">
+									<span class="tr-flex">{{item.content}}</span>
+									<span class="tr-130">{{item.date}}</span>
 								</div>
 							</div>
 						</div>
@@ -174,13 +115,104 @@
 </template>
 
 <script>
-	import selectSpace from '@/components/work/common/selectSpace'
 	import model from '@/components/work/common/model'
+	import projectItemTree from '@/components/common/projectItemTree'
+	import {
+		getDeviceCountList,
+		getFireList
+	} from '@/httpApi/test'
+	import {
+		getProjectDetailById,
+	} from '@/httpApi/space'
 	export default {
 		components: {
-			selectSpace,
+			projectItemTree,
 			model
-		}
+		},
+		data() {
+			return {
+				type: 6,
+				personList: [],
+				projectItemTargetList: [],
+				allCount: {
+					totalNumber: 0,
+					online: 0,
+					offline: 0
+				},
+				thoroughList: [],
+				doorList: []
+			}
+		},
+		created() {
+			getProjectDetailById(this.$store.getters.project.id).then(res => {
+				if (res.state) {
+					let data = res.data.projectItemList.map(node => {
+						node.projectItemTargetList = node.projectItemTargetList.map(target => {
+							target['projectItemName'] = node.name
+							return target;
+						})
+						return node;
+					});
+					for (let i = 0; i < data.length; i++) {
+						this.projectItemTargetList = this.projectItemTargetList.concat(data[i]
+							.projectItemTargetList);
+					}
+					this.init();
+				}
+			})
+
+		},
+		methods: {
+			init(option) {
+				let postData = {
+					type: this.type,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) postData = Object.assign(postData, option);
+				getDeviceCountList(postData).then(res => {
+					if (res.state) {
+						this.personList = res.data;
+						let allCount = {
+							totalNumber: 0,
+							online: 0,
+							offline: 0
+						}
+						for (var i = 0; i < this.personList.length; i++) {
+							allCount.totalNumber += this.personList[i].totalNumber
+							allCount.online += this.personList[i].online
+							allCount.offline += this.personList[i].offline
+						}
+						this.allCount = allCount;
+					}
+				})
+				let fireData = {
+					type: 1,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) fireData = Object.assign(fireData, option);
+				getFireList(fireData).then(res => {
+					if (res.state) {
+						this.thoroughList = res.data;
+					}
+				})
+				let fireDatas = {
+					type: 2,
+					projectId: this.$store.getters.project.id
+				}
+				if (option) fireDatas = Object.assign(fireDatas, option);
+				getFireList(fireDatas).then(res => {
+					if (res.state) {
+						this.doorList = res.data;
+					}
+				})
+			},
+			treeclick(item) {
+				let obj = item.id ? {
+					projectItemTargetId: item.id
+				} : {}
+				this.init(obj);
+			}
+		},
 	}
 </script>
 

+ 26 - 14
virgo.wzfrontend/console/src/views/work/iot/security/electronicPatrol.vue

@@ -7,7 +7,7 @@
 					<div class="electronic-patrol-center">
 						<test-alarm ref="testAlarm" :type="3"></test-alarm>
 						<div class="bim-box">
-							<!-- <model type="electronicPatrol" fileId="10000786668235"></model> -->
+							<model type="electronicPatrol" fileId="10000786668235"></model>
 						</div>
 					</div>
 					<div class="electronic-patrol-right">
@@ -27,7 +27,8 @@
 								<empty width="100" description="暂无巡更记录"></empty>
 							</div>
 							<div class="alarm-table hui-flex-box" v-else>
-								<div class="alarm-tr" v-for="(item,index) in routeEventList" :key="index">
+								<div class="alarm-tr" v-for="(item,index) in routeEventList" :key="index"
+									@click="look(item)">
 									<span class="tr-flex">{{item.routeName}}</span>
 									<span class="tr-flex tr-center color-purple alibaba">{{item.pointNumber}}</span>
 									<span class="tr-flex tr-center color-green alibaba">{{item.checkTodayNumber}}</span>
@@ -62,7 +63,7 @@
 			</div>
 		</div>
 		<el-drawer title="打卡详情" :visible.sync="drawer" :size="400" :append-to-body="true">
-			<electronic-patrol-detail v-if="drawer"></electronic-patrol-detail>
+			<electronic-patrol-detail v-if="drawer" :detail="detail"></electronic-patrol-detail>
 		</el-drawer>
 	</div>
 </template>
@@ -75,18 +76,26 @@
 	import {
 		getElectronicPatrolList,
 		getElectronicPatrolRoutesList,
-		getElectronicPatrolEventtList
+		getElectronicPatrolEventList,
+		getElectronicPatrolEventTest
 	} from '@/httpApi/test'
 	export default {
 		data() {
 			return {
 				drawer: false,
 				electronicPatrolList: [],
-				routeEventList: []
+				routeEventProjectList: [],
+				routeEventList: [],
+				detail: {}
 			}
 		},
 		created() {
-			this.init();
+			getElectronicPatrolEventTest(this.$store.getters.project.id).then(res => {
+				if (res.state) {
+					this.routeEventProjectList = res.data;
+					this.init();
+				}
+			})
 		},
 		methods: {
 			init(option) {
@@ -99,14 +108,13 @@
 						this.electronicPatrolList = res.data;
 					}
 				})
-				getElectronicPatrolRoutesList(postData).then(res => {
+				getElectronicPatrolEventList(postData).then(res => {
 					if (res.state) {
-						console.log(res);
-					}
-				})
-				getElectronicPatrolEventtList(this.$store.getters.project.id).then(res => {
-					if (res.state) {
-						this.routeEventList = res.data;
+						this.routeEventList = this.routeEventProjectList.filter(node => res.data.filter(item =>
+							item.routeName === node.name).length > 0).map(node => {
+							let data = res.data.filter(item => item.routeName === node.name)[0];
+							return Object.assign(node, data);
+						});
 					}
 				})
 			},
@@ -115,8 +123,12 @@
 					projectItemTargetId: item.id
 				} : {}
 				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
-				this.init(option);
+				this.init(obj);
 			},
+			look(item) {
+				this.detail = item;
+				this.drawer = true;
+			}
 		},
 		components: {
 			electronicPatrolDetail,

+ 2 - 2
virgo.wzfrontend/console/src/views/work/iot/security/infrared.vue

@@ -30,7 +30,7 @@
 									</div>
 								</div>
 								<div class="hui-flex-box hui-no-tips" v-if="list.length === 0">
-									<empty width="100" description="暂无进出记录"></empty>
+									<empty width="100" description="暂无报警记录"></empty>
 								</div>
 								<div class="alarm-table hui-flex-box" v-else>
 									<div class="alarm-tr" v-for="(item,index) in list" :key="index">
@@ -109,7 +109,7 @@
 					projectItemTargetId: item.id
 				} : {}
 				if (this.$refs.testAlarm) this.$refs.testAlarm.init(obj);
-				this.init(option);
+				this.init(obj);
 			},
 			chart(elem, data, x) {
 				let chart = echarts.init(elem);