Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

黄渊昊 5 mesiacov pred
rodič
commit
251a884a44

+ 1 - 1
snowy-admin-web/.env.development

@@ -1,5 +1,5 @@
 # 接口地址
-VITE_API_BASEURL = http://39o63230o1.qicp.vip
+VITE_API_BASEURL = http://xiaozun.nat300.top
 
 # 本地端口
 VITE_PORT = 81

+ 49 - 48
snowy-admin-web/src/components/HomeCard/SysCountCard/index.vue

@@ -1,56 +1,61 @@
 <template>
 	<div class="home_count">
-		<div class="ant-card-body">
-			<div class="card-left">
-				<img src="/src/assets/images/home/02.png" class="left-img" />
-				<div class="row">
-					<div class="label">超低温冰箱</div>
-					<div class="value">{{ data.deviceCount || 0 }}</div>
-				</div>
-			</div>
-			<div class="card-right">
-				<div class="row row1">
-					<div class="row-img">
-						<img src="/src/assets/images/home/normal.png" />
+		<a-row :gutter="20">
+			<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
+				<div class="ant-card-body">
+					<div class="card-left">
+						<img src="/src/assets/images/home/02.png" class="left-img" />
+						<div class="row">
+							<div class="label">超低温冰箱</div>
+							<div class="value">{{ data.deviceCount || 0 }}</div>
+						</div>
 					</div>
+					<div class="card-right">
+						<div class="row row1">
+							<div class="row-img">
+								<img src="/src/assets/images/home/normal.png" />
+							</div>
 
-					<div class="label">正常</div>
-					<div class="value">{{ data.onlineDeviceCount || 0 }}</div>
-				</div>
-				<div class="row row2">
-					<div class="row-img">
-						<img src="/src/assets/images/home/offline.png" />
+							<div class="label">正常</div>
+							<div class="value">{{ data.onlineDeviceCount || 0 }}</div>
+						</div>
+						<div class="row row2">
+							<div class="row-img">
+								<img src="/src/assets/images/home/offline.png" />
+							</div>
+							<div class="label">离线</div>
+							<div class="value">{{ data.offlineDeviceCount || 0 }}</div>
+						</div>
 					</div>
-					<div class="label">离线</div>
-					<div class="value">{{ data.offlineDeviceCount || 0 }}</div>
-				</div>
-			</div>
-		</div>
-
-		<div class="ant-card-body">
-			<div class="card-left">
-				<img src="/src/assets/images/home/03.png" class="left-img" />
-				<div class="row">
-					<div class="label">监测点位</div>
-					<div class="value">{{ data.sensorCount || 0 }}</div>
 				</div>
-			</div>
-			<div class="card-right">
-				<div class="row row1">
-					<div class="row-img">
-						<img src="/src/assets/images/home/use.png" />
+			</a-col>
+			<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
+				<div class="ant-card-body">
+					<div class="card-left">
+						<img src="/src/assets/images/home/03.png" class="left-img" />
+						<div class="row">
+							<div class="label">监测点位</div>
+							<div class="value">{{ data.sensorCount || 0 }}</div>
+						</div>
 					</div>
+					<div class="card-right">
+						<div class="row row1">
+							<div class="row-img">
+								<img src="/src/assets/images/home/use.png" />
+							</div>
 
-					<div class="label">已使用</div>
-					<div class="value">{{ data.usedSensorCount || 0 }}</div>
-				</div>
-				<div class="row row2">
-					<img src="/src/assets/images/home/not1.png" class="row-img2" />
-					<div class="label">未使用</div>
-					<div class="value">{{ data.unusedSensorCount || 0 }}</div>
+							<div class="label">已使用</div>
+							<div class="value">{{ data.usedSensorCount || 0 }}</div>
+						</div>
+						<div class="row row2">
+							<img src="/src/assets/images/home/not1.png" class="row-img2" />
+							<div class="label">未使用</div>
+							<div class="value">{{ data.unusedSensorCount || 0 }}</div>
+						</div>
+					</div>
 				</div>
-			</div>
-		</div>
+			</a-col>
+		</a-row>
 	</div>
 </template>
 
@@ -72,12 +77,8 @@
 <style lang="less" scoped>
 	.home_count {
 		width: 100%;
-		display: flex;
-		flex-wrap: wrap;
-		justify-content: space-between;
 
 		.ant-card-body {
-			width: calc(50% - 10px);
 			height: 150px;
 			margin-bottom: 10px;
 			box-sizing: border-box;

+ 74 - 74
snowy-admin-web/src/components/HomeCard/SysTrendCard/index.vue

@@ -1,35 +1,40 @@
 <template>
 	<div class="trend-card">近三天报警趋势</div>
-
-	<div class="home_count">
-		<div class="ant-card-body">
-			<div class="card-left">
-				<img src="/src/assets/images/home/07.png" class="right-img" />
-				<div class="left-title">前天</div>
-			</div>
-			<div class="card-right">
-				<div class="echart" id="echart1"></div>
-			</div>
-		</div>
-		<div class="ant-card-body">
-			<div class="card-left">
-				<img src="/src/assets/images/home/08.png" class="right-img" />
-				<div class="left-title">昨天</div>
+	<a-row>
+		<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+			<div class="ant-card-body">
+				<div class="card-left">
+					<img src="/src/assets/images/home/07.png" class="right-img" />
+					<div class="left-title">前天</div>
+				</div>
+				<div class="card-right">
+					<div class="echart" id="echart1"></div>
+				</div>
 			</div>
-			<div class="card-right">
-				<div class="echart" id="echart2"></div>
+		</a-col>
+		<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+			<div class="ant-card-body">
+				<div class="card-left">
+					<img src="/src/assets/images/home/08.png" class="right-img" />
+					<div class="left-title">昨天</div>
+				</div>
+				<div class="card-right">
+					<div class="echart" id="echart2"></div>
+				</div>
 			</div>
-		</div>
-		<div class="ant-card-body">
-			<div class="card-left">
-				<img src="/src/assets/images/home/09.png" class="right-img" />
-				<div class="left-title">今天</div>
+		</a-col>
+		<a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
+			<div class="ant-card-body">
+				<div class="card-left">
+					<img src="/src/assets/images/home/09.png" class="right-img" />
+					<div class="left-title">今天</div>
+				</div>
+				<div class="card-right">
+					<div class="echart" id="echart3"></div>
+				</div>
 			</div>
-			<div class="card-right">
-				<div class="echart" id="echart3"></div>
-			</div>
-		</div>
-	</div>
+		</a-col>
+	</a-row>
 </template>
 
 <script setup name="SysTrendCard">
@@ -40,8 +45,6 @@
 		init()
 	})
 
-	const data = ref([])
-
 	const init = () => {
 		alarmTrendApi.threeDays().then((res) => {
 			if (res && res.length > 0) {
@@ -59,7 +62,7 @@
 	}
 
 	const getEcharts1 = (val) => {
-		let Echarts = echarts.init(document.getElementById('echart1'))
+		let Echarts1 = echarts.init(document.getElementById('echart1'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -141,15 +144,16 @@
 			]
 		}
 		// 绘制图表
-		Echarts.setOption(option)
+		Echarts1.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		Echarts1.resize()
+		window.addEventListener('resize', () => {
+			Echarts1.resize()
+		})
 	}
 
 	const getEcharts2 = (val) => {
-		let Echarts = echarts.init(document.getElementById('echart2'))
+		let Echarts2 = echarts.init(document.getElementById('echart2'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -230,14 +234,15 @@
 			]
 		}
 		// 绘制图表
-		Echarts.setOption(option)
+		Echarts2.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		Echarts2.resize()
+		window.addEventListener('resize', () => {
+			Echarts2.resize()
+		})
 	}
 	const getEcharts3 = (val) => {
-		let Echarts = echarts.init(document.getElementById('echart3'))
+		let Echarts3 = echarts.init(document.getElementById('echart3'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -318,11 +323,12 @@
 			]
 		}
 		// 绘制图表
-		Echarts.setOption(option)
+		Echarts3.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		Echarts3.resize()
+		window.addEventListener('resize', () => {
+			Echarts3.resize()
+		})
 	}
 </script>
 
@@ -333,43 +339,37 @@
 		background: #ffffff;
 	}
 
-	.home_count {
+	.ant-card-body {
 		width: 100%;
+		height: 250px;
+		padding: 0 20px;
+		margin-bottom: 10px;
+		box-sizing: border-box;
+		background-color: #ffffff;
+		border-radius: 5px;
 		display: flex;
-		flex-wrap: wrap;
-		justify-content: space-between;
+		justify-content: center;
+		align-items: center;
 
-		.ant-card-body {
-			flex: 1;
-			width: 100%;
-			height: 250px;
-			padding: 0 20px;
-			margin-bottom: 10px;
-			box-sizing: border-box;
-			background-color: #ffffff;
-			border-radius: 5px;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-
-			.card-left {
-				width: 10%;
-				text-align: center;
-				.left-title {
-					padding-top: 5px;
-				}
+		.card-left {
+			width: 10%;
+			text-align: center;
+			.left-title {
+				padding-top: 5px;
 			}
+		}
 
-			.card-right {
-				width: 90%;
+		.card-right {
+			width: 90%;
+			height: 100%;
+			.echart {
+				width: 100%;
 				height: 100%;
-				.echart {
-					height: 100%;
-				}
+				overflow: hidden;
 			}
 		}
-		.ant-card-body:nth-child(5n) {
-			margin-right: 0;
-		}
+	}
+	.ant-card-body:nth-child(5n) {
+		margin-right: 0;
 	}
 </style>

+ 3 - 3
snowy-admin-web/src/router/systemRouter.js

@@ -17,7 +17,7 @@ import Login from '@/views/auth/login/login.vue'
 import Findpwd from '@/views/auth/findPwd/index.vue'
 import Callback from '@/views/auth/login/callback.vue'
 
-import authorizeWx from '@/views/wx/index.vue'
+import check from '@/views/wx/index.vue'
 import Success from '@/views/success/index.vue'
 
 // 系统路由
@@ -51,8 +51,8 @@ const routes = [
 		}
 	},
 	{
-		path: '/authorizeWx',
-		component: authorizeWx,
+		path: '/check',
+		component: check,
 		meta: {
 			title: '授权'
 		}

+ 2 - 2
snowy-admin-web/src/router/whiteList.js

@@ -16,8 +16,8 @@ const constRouters = [
 		path: '/callback'
 	},
 	{
-		path: '/authorizeWx',
-		name: 'authorizeWx',
+		path: '/check',
+		name: 'check',
 		component: () => import('@/views/wx/index.vue'),
 		meta: {
 			title: '授权'

+ 4 - 0
snowy-admin-web/src/views/biz/alarmuser/index.vue

@@ -60,6 +60,10 @@
 			<template #bodyCell="{ column, record, index }">
 				<template v-if="column.dataIndex === 'index'">{{ index + 1 }} </template>
 
+				<template v-if="column.dataIndex === 'avatar'">
+					<a-avatar v-if="record.avatar" :src="record.avatar" class="xn-wh25" />
+				</template>
+
 				<template v-if="column.dataIndex === 'action'">
 					<a-space>
 						<!-- <a @click="formRef.onOpen(record)" v-if="hasPerm('alarmUserEdit')">编辑</a>

+ 6 - 2
snowy-admin-web/src/views/biz/alarmuser/perfectForm.vue

@@ -14,7 +14,7 @@
 				<a-input v-model:value="formData.nickName" disabled allow-clear />
 			</a-form-item>
 
-			<a-form-item label="选择组织" name="name">
+			<a-form-item label="选择组织" name="createOrg">
 				<a-select
 					ref="select"
 					v-model:value="formData.createOrg"
@@ -55,6 +55,9 @@
 		if (record) {
 			let recordData = cloneDeep(record)
 			formData.value = Object.assign({}, recordData)
+			if (formData.value.createOrg == -1) {
+				formData.value.createOrg = null
+			}
 		}
 	}
 
@@ -73,7 +76,8 @@
 	}
 	// 默认要校验的
 	const formRules = {
-		name: [required('请输入真实姓名')]
+		name: [required('请输入真实姓名')],
+		createOrg: [required('请选择组织')]
 	}
 	// 验证并提交数据
 	const onSubmit = () => {

+ 27 - 21
snowy-admin-web/src/views/biz/monitor/trendchart/index.vue

@@ -37,7 +37,7 @@
 				</div>
 				<div class="value">
 					<div>二氧化碳</div>
-					<div class="num" v-if="data.sensorData && data.sensorData.co2">{{ data.sensorData.co2 + '%' }}</div>
+					<div class="num" v-if="data.sensorData && data.sensorData.co2">{{ data.sensorData.co2 + 'ppm' }}</div>
 				</div>
 			</div>
 
@@ -249,7 +249,7 @@
 
 	// 温度
 	const getEcharts1 = (val) => {
-		let Echarts = echarts.init(document.getElementById('temperature'))
+		let EchartsA = echarts.init(document.getElementById('temperature'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -421,15 +421,16 @@
 		}
 
 		// 绘制图表
-		Echarts.setOption(option)
+		EchartsA.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		EchartsA.resize()
+		window.addEventListener('resize', () => {
+			EchartsA.resize()
+		})
 	}
 	// 湿度
 	const getEcharts2 = (val) => {
-		let Echarts = echarts.init(document.getElementById('humidity'))
+		let EchartsB = echarts.init(document.getElementById('humidity'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -602,15 +603,16 @@
 			]
 		}
 		// 绘制图表
-		Echarts.setOption(option)
+		EchartsB.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		EchartsB.resize()
+		window.addEventListener('resize', () => {
+			EchartsB.resize()
+		})
 	}
 	// CO2
 	const getEcharts3 = (val) => {
-		let Echarts = echarts.init(document.getElementById('CO2'))
+		let EchartsC = echarts.init(document.getElementById('CO2'))
 		const option = {
 			tooltip: {
 				trigger: 'axis',
@@ -626,7 +628,7 @@
 				formatter: function (params) {
 					let date = params[0].axisValueLabel
 					let value = params[0].value
-					return `${date}<br/>二氧化碳 :${value} %`
+					return `${date}<br/>二氧化碳 :${value} ppm`
 				}
 			},
 			grid: {
@@ -667,7 +669,7 @@
 				scale: true,
 				minInterval: 1,
 				axisLabel: {
-					formatter: '{value} %'
+					formatter: '{value} ppm'
 				},
 				splitLine: {
 					show: true
@@ -758,7 +760,7 @@
 									shadowBlur: 5
 								},
 								label: {
-									formatter: '二氧化碳上限: {c}%',
+									formatter: '二氧化碳上限: {c}ppm',
 									color: '#f3956e'
 								}
 							},
@@ -773,7 +775,7 @@
 									shadowBlur: 5
 								},
 								label: {
-									formatter: '二氧化碳下限: {c}%',
+									formatter: '二氧化碳下限: {c}ppm',
 									color: '#41b982'
 								}
 							}
@@ -783,11 +785,12 @@
 			]
 		}
 		// 绘制图表
-		Echarts.setOption(option)
+		EchartsC.setOption(option)
 		// 自适应大小
-		window.onresize = () => {
-			Echarts.resize()
-		}
+		EchartsC.resize()
+		window.addEventListener('resize', () => {
+			EchartsC.resize()
+		})
 	}
 
 	// 返回上一页
@@ -815,6 +818,9 @@
 			.head_time {
 				flex: 2;
 				text-align: center;
+				white-space: nowrap;
+				overflow: hidden;
+				text-overflow: ellipsis;
 			}
 			.head_name {
 				font-size: 20px;
@@ -843,7 +849,7 @@
 						font-weight: bold;
 						font-size: 26px;
 						padding: 0 20px;
-						width: 150px;
+						width: 180px;
 						white-space: nowrap;
 						overflow: hidden;
 						text-overflow: ellipsis;

+ 26 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/alarmuser/service/impl/AlarmUserServiceImpl.java

@@ -14,6 +14,8 @@ package vip.xiaonuo.coldchain.modular.alarmuser.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -28,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.modular.alarmuser.dto.ExtendUserDTO;
 import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
 import vip.xiaonuo.coldchain.modular.alarmuser.mapper.AlarmUserMapper;
@@ -36,6 +39,8 @@ import vip.xiaonuo.coldchain.modular.alarmuser.param.AlarmUserEditParam;
 import vip.xiaonuo.coldchain.modular.alarmuser.param.AlarmUserIdParam;
 import vip.xiaonuo.coldchain.modular.alarmuser.param.AlarmUserPageParam;
 import vip.xiaonuo.coldchain.modular.alarmuser.service.AlarmUserService;
+import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+import vip.xiaonuo.coldchain.modular.monitortarget.mapper.MonitorTargetMapper;
 import vip.xiaonuo.coldchain.modular.push.entity.WeChatUser;
 import vip.xiaonuo.coldchain.modular.push.utils.PushUtil;
 import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
@@ -72,6 +77,8 @@ public class AlarmUserServiceImpl extends ServiceImpl<AlarmUserMapper, AlarmUser
     private SysUserService sysUserService;
     @Resource
     private DevConfigApi devConfigApi;
+    @Resource
+    private MonitorTargetMapper monitorTargetMapper;
 
     @Override
     public Page<ExtendUserDTO> page(AlarmUserPageParam alarmUserPageParam) {
@@ -152,8 +159,26 @@ public class AlarmUserServiceImpl extends ServiceImpl<AlarmUserMapper, AlarmUser
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(List<AlarmUserIdParam> alarmUserIdParamList) {
+        List<String> userIds = CollStreamUtil.toList(alarmUserIdParamList, AlarmUserIdParam::getId);
+
+        //检查报警接收人是否在使用
+        List<MonitorTarget> monitorTargets = monitorTargetMapper.selectList(new LambdaQueryWrapper<>(MonitorTarget.class)
+                .select(MonitorTarget::getAlarmUsers)
+                .eq(MonitorTarget::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE));
+        if (CollUtil.isNotEmpty(monitorTargets)) {
+            List<String> sensorAlarmUserOpenIdList = monitorTargets.stream()
+                    .flatMap(x -> x.getAlarmUsers().stream())
+                    .map(SensorAlarmUser::getOpenId)
+                    .filter(StrUtil::isNotBlank)
+                    .distinct().toList();
+            long usedUser = count(new LambdaQueryWrapper<>(AlarmUser.class).eq(AlarmUser::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
+                    .in(AlarmUser::getOpenId, sensorAlarmUserOpenIdList)
+                    .in(AlarmUser::getId, userIds));
+            Assert.isTrue(usedUser == 0, "报警接收人正在使用中,无法删除");
+        }
+
         // 执行删除
-        this.removeByIds(CollStreamUtil.toList(alarmUserIdParamList, AlarmUserIdParam::getId));
+        this.removeByIds(userIds);
     }
 
     @Override