Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
黄嘉阳
/
iot-platform-server
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
844213b9
authored
Sep 15, 2023
by
李小龙
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
fixbug:心率告警 呼吸告警
parent
5682ce89
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
496 additions
and
98 deletions
server-common/src/main/java/com/makeit/enums/redis/RedisConst.java
server-common/src/main/java/com/makeit/utils/msg/dto/MsgSendDTO.java
server-common/src/main/java/com/makeit/utils/msg/sender/MailMsgSender.java
server-common/src/main/java/com/makeit/utils/msg/sender/SmsMsgSender.java
server-common/src/main/java/com/makeit/utils/msg/sender/SmsVoiceSender.java
server-common/src/main/java/com/makeit/utils/time/LocalDateTimeUtils.java
server-service/src/main/java/com/makeit/dto/platform/alarm/PlatAlarmCheckDTO.java
server-service/src/main/java/com/makeit/dto/platform/alarm/PlatDayDurationRecordDTO.java
server-service/src/main/java/com/makeit/entity/platform/alarm/PlatAlarmRecord.java
server-service/src/main/java/com/makeit/entity/platform/alarm/PlatDayDurationRecord.java
server-service/src/main/java/com/makeit/mapper/platform/alarm/PlatDayDurationRecordMapper.java
server-service/src/main/java/com/makeit/service/platform/alarm/PlatDayDurationRecordService.java
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/BehaviorAlarm.java
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/BreathAlarm.java
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/FallAlarm.java
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/HeartAlarm.java
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatAlarmRecordServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatDayDurationRecordServiceImpl.java
server-service/src/main/java/com/makeit/task/DayDurationTask.java
server-service/src/main/java/com/makeit/utils/AlarmRedisDTO.java
server-service/src/main/java/com/makeit/utils/DayDurationUtil.java
server-service/src/main/resources/mappers/PlatDayDurationRecordMapper.xml
server-web/src/main/java/com/makeit/mqtt/PushCallback.java
server-common/src/main/java/com/makeit/enums/redis/RedisConst.java
View file @
844213b9
...
...
@@ -92,11 +92,16 @@ public class RedisConst {
public
static
final
String
TENANT_PREFIX
=
"tenant:"
;
public
static
final
String
ALARM_DEVICE_ID
=
"alarm:device:id:"
;
public
static
final
String
ALARM_DEVICE_BR_ID
=
"alarm:device:br:id:"
;
public
static
final
String
ALARM_DEVICE_HR_ID
=
"alarm:device:hr:id:"
;
public
static
final
String
ALARM_DEVICE_FALL_ID
=
"alarm:device:fall:id:"
;
public
static
final
String
ALARM_DEVICE_BEHAVIOR_ID
=
"alarm:device:behavior:id:"
;
public
static
final
String
ALARM_CONFIG_ORG_ID
=
"alarm:config:org:id:"
;
public
static
final
String
PLAT_IOT_DEVICE_PREFIX
=
"plat:iot:device:"
;
public
static
final
String
ELDER_DAY_DURATION_PREFIX
=
"plat:day:duration:device:"
;
...
...
server-common/src/main/java/com/makeit/utils/msg/dto/MsgSendDTO.java
View file @
844213b9
...
...
@@ -20,6 +20,8 @@ public class MsgSendDTO {
private
Collection
<
String
>
receiverList
;
private
Collection
<
String
>
emailSet
;
private
String
oriContent
;
/**
...
...
server-common/src/main/java/com/makeit/utils/msg/sender/MailMsgSender.java
View file @
844213b9
package
com
.
makeit
.
utils
.
msg
.
sender
;
import
com.makeit.exception.BusinessException
;
import
com.makeit.utils.msg.SendTypeEnum
;
import
com.makeit.utils.msg.dto.MsgSendDTO
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -36,12 +35,12 @@ public class MailMsgSender implements IMsgSender {
MimeMessage
message
=
mailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
message
,
true
);
helper
.
setFrom
(
from
);
helper
.
setTo
(
msgDTO
.
get
ReceiverLis
t
().
toArray
(
new
String
[
msgDTO
.
getReceiverList
().
size
()]));
helper
.
setTo
(
msgDTO
.
get
EmailSe
t
().
toArray
(
new
String
[
msgDTO
.
getReceiverList
().
size
()]));
helper
.
setSubject
(
msgDTO
.
getSubject
());
helper
.
setText
(
msgDTO
.
getOriContent
(),
false
);
mailSender
.
send
(
message
);
}
catch
(
Exception
e
)
{
throw
new
BusinessException
(
e
.
getMessage
()
);
log
.
error
(
"发送邮箱异常:"
,
e
);
}
}
...
...
server-common/src/main/java/com/makeit/utils/msg/sender/SmsMsgSender.java
View file @
844213b9
...
...
@@ -8,6 +8,8 @@ import com.makeit.utils.msg.config.SmsConfig;
import
com.makeit.utils.msg.dto.MsgSendDTO
;
import
com.makeit.utils.old.encode.CryptoUtil
;
import
com.makeit.utils.third.HttpClient
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpHeaders
;
...
...
@@ -20,6 +22,7 @@ import java.util.HashMap;
import
java.util.stream.Collectors
;
@Component
@Slf4j
public
class
SmsMsgSender
implements
IMsgSender
{
@Autowired
...
...
@@ -40,6 +43,9 @@ public class SmsMsgSender implements IMsgSender{
@Override
public
void
send
(
MsgSendDTO
msgDTO
)
{
try
{
if
(
CollectionUtils
.
isEmpty
(
msgDTO
.
getReceiverList
())){
log
.
info
(
"发送短信时,没有接收人,短信内容:"
+
msgDTO
.
getOriContent
());
}
Date
now
=
new
Date
();
String
time
=
String
.
valueOf
(
now
.
getTime
());
Collection
<
String
>
receiverList
=
msgDTO
.
getReceiverList
();
...
...
@@ -57,10 +63,13 @@ public class SmsMsgSender implements IMsgSender{
JSONObject
jsonObject
=
JSON
.
parseObject
(
resStr
);
String
status
=
String
.
valueOf
(
jsonObject
.
get
(
"status"
));
if
(!
StringUtils
.
equals
(
status
,
"0"
))
{
log
.
error
(
"发送短信失败:"
+
jsonObject
.
get
(
"status_code"
));
throw
new
BusinessException
((
String
)
jsonObject
.
get
(
"status_code"
));
}
else
{
log
.
info
(
"发送短信成功"
);
}
}
catch
(
Exception
e
){
throw
new
BusinessException
(
e
.
getMessage
()
);
log
.
error
(
"发送短信异常:"
,
e
);
}
}
...
...
server-common/src/main/java/com/makeit/utils/msg/sender/SmsVoiceSender.java
View file @
844213b9
...
...
@@ -8,6 +8,8 @@ import com.makeit.utils.msg.config.SmsVoiceConfig;
import
com.makeit.utils.msg.dto.MsgSendDTO
;
import
com.makeit.utils.old.encode.CryptoUtil
;
import
com.makeit.utils.third.HttpClient
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpHeaders
;
...
...
@@ -22,6 +24,7 @@ import java.util.function.BiConsumer;
import
java.util.stream.Collectors
;
@Component
@Slf4j
public
class
SmsVoiceSender
implements
IMsgSender
{
@Autowired
...
...
@@ -42,6 +45,9 @@ public class SmsVoiceSender implements IMsgSender{
@Override
public
void
send
(
MsgSendDTO
msgDTO
)
{
try
{
if
(
CollectionUtils
.
isEmpty
(
msgDTO
.
getReceiverList
())){
log
.
info
(
"发送语音短信时,没有接收人,短信内容:"
+
msgDTO
.
getOriContent
());
}
Date
now
=
new
Date
();
String
time
=
String
.
valueOf
(
now
.
getTime
());
Collection
<
String
>
receiverList
=
msgDTO
.
getReceiverList
();
...
...
@@ -67,10 +73,11 @@ public class SmsVoiceSender implements IMsgSender{
JSONObject
jsonObject
=
JSON
.
parseObject
(
resStr
);
String
status
=
String
.
valueOf
(
jsonObject
.
get
(
"status"
));
if
(!
StringUtils
.
equals
(
status
,
"0"
))
{
log
.
error
(
"发送语音短信失败:"
+
jsonObject
.
get
(
"status_code"
));
throw
new
BusinessException
((
String
)
jsonObject
.
get
(
"status_code"
));
}
}
catch
(
Exception
e
){
throw
new
BusinessException
(
e
.
getMessage
().
toString
()
);
log
.
error
(
"发送语音异常:"
,
e
);
}
}
}
server-common/src/main/java/com/makeit/utils/time/LocalDateTimeUtils.java
View file @
844213b9
...
...
@@ -160,4 +160,22 @@ public class LocalDateTimeUtils {
Long
until
=
start
.
until
(
end
,
ChronoUnit
.
HOURS
);
return
until
.
intValue
();
}
public
static
Integer
getDaySub
(
LocalDateTime
start
,
LocalDateTime
end
)
{
if
(
start
==
null
||
end
==
null
){
return
0
;
}
Long
until
=
start
.
until
(
end
,
ChronoUnit
.
DAYS
);
return
until
.
intValue
();
}
/**
* 修改为一天的开始时间,例如:2020-02-02 00:00:00,000
*
* @param time 日期时间
* @return 一天的开始时间
*/
public
static
LocalDateTime
beginOfDay
(
LocalDateTime
time
)
{
return
time
.
with
(
LocalTime
.
MIN
);
}
}
server-service/src/main/java/com/makeit/dto/platform/alarm/PlatAlarmCheckDTO.java
View file @
844213b9
...
...
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import
com.makeit.entity.platform.alarm.PlatAlarmConfig
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.space.PlatRegionSetting
;
import
com.makeit.entity.platform.space.PlatRoom
;
import
lombok.Data
;
...
...
@@ -27,4 +28,6 @@ public class PlatAlarmCheckDTO {
//PlatAlarmRecord.remark
private
String
remark
;
private
PlatRegionSetting
platRegionSetting
;
}
server-service/src/main/java/com/makeit/dto/platform/alarm/PlatDayDurationRecordDTO.java
0 → 100644
View file @
844213b9
package
com
.
makeit
.
dto
.
platform
.
alarm
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
import
java.util.List
;
@Data
public
class
PlatDayDurationRecordDTO
{
private
LocalDateTime
start
;
private
LocalDateTime
end
;
private
List
<
String
>
dayStrList
;
}
server-service/src/main/java/com/makeit/entity/platform/alarm/PlatAlarmRecord.java
View file @
844213b9
package
com
.
makeit
.
entity
.
platform
.
alarm
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.makeit.common.entity.BaseBusEntity
;
import
io.swagger.annotations.ApiModelProperty
;
...
...
@@ -70,12 +71,15 @@ public class PlatAlarmRecord extends BaseBusEntity {
private
String
deviceId
;
/**
* 老人id,
逗号拼接
* 老人id,
一个老人一条记录
*/
private
String
elderIds
;
private
String
remark
;
@TableField
(
exist
=
false
)
private
String
elderName
;
}
...
...
server-service/src/main/java/com/makeit/entity/platform/alarm/PlatDayDurationRecord.java
View file @
844213b9
...
...
@@ -2,6 +2,7 @@ package com.makeit.entity.platform.alarm;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.makeit.common.entity.BaseBusEntity
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.Date
;
...
...
@@ -42,4 +43,14 @@ public class PlatDayDurationRecord extends BaseBusEntity {
* 本次离开时间
*/
private
Date
endDate
;
@ApiModelProperty
(
"区域名称"
)
private
String
regionName
;
@ApiModelProperty
(
"设备ID"
)
private
String
deviceId
;
@ApiModelProperty
(
"房间ID"
)
private
String
roomId
;
}
\ No newline at end of file
server-service/src/main/java/com/makeit/mapper/platform/alarm/PlatDayDurationRecordMapper.java
View file @
844213b9
...
...
@@ -2,7 +2,11 @@ package com.makeit.mapper.platform.alarm;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.makeit.dto.platform.alarm.PlatDayDurationRecordDTO
;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
* @author lixl
...
...
@@ -13,4 +17,5 @@ import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
public
interface
PlatDayDurationRecordMapper
extends
BaseMapper
<
PlatDayDurationRecord
>
{
List
<
PlatDayDurationRecord
>
getDayMaxDurationList
(
@Param
(
"param"
)
PlatDayDurationRecordDTO
param
);
}
server-service/src/main/java/com/makeit/service/platform/alarm/PlatDayDurationRecordService.java
View file @
844213b9
...
...
@@ -2,8 +2,11 @@ package com.makeit.service.platform.alarm;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.makeit.dto.platform.alarm.PlatDayDurationRecordDTO
;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
java.util.List
;
/**
* @author lixl
* @description 针对表【plat_day_duration_record(每天停留时长记录)】的数据库操作Service
...
...
@@ -11,4 +14,5 @@ import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
*/
public
interface
PlatDayDurationRecordService
extends
IService
<
PlatDayDurationRecord
>
{
List
<
PlatDayDurationRecord
>
getDayMaxDurationList
(
PlatDayDurationRecordDTO
param
);
}
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/BehaviorAlarm.java
View file @
844213b9
...
...
@@ -10,6 +10,7 @@ import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.space.PlatRegionSetting
;
import
com.makeit.entity.platform.space.PlatRoom
;
import
com.makeit.enums.CommonEnum
;
import
com.makeit.enums.platform.alarm.PlatAlarmConfigEnum
;
...
...
@@ -17,12 +18,14 @@ import com.makeit.enums.redis.RedisConst;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
import
com.makeit.service.platform.alarm.PlatDayDurationRecordService
;
import
com.makeit.utils.AlarmRedisDTO
;
import
com.makeit.utils.DayDurationUtil
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
com.makeit.utils.redis.RedisUtil
;
import
com.makeit.utils.time.LocalDateTimeUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
java.time.LocalDateTime
;
...
...
@@ -35,17 +38,20 @@ import java.util.List;
import
java.util.stream.Collectors
;
@Component
public
class
BehaviorAlarm
implements
IAlarm
{
@Slf4j
public
class
BehaviorAlarm
implements
IAlarm
{
@Autowired
private
PlatAlarmRecordService
platAlarmRecordService
;
@Autowired
private
PlatDayDurationRecordService
platDayDurationRecordService
;
@Autowired
private
DayDurationUtil
dayDurationUtil
;
private
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
BEHAVIOR
;
private
final
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
BEHAVIOR
;
@Override
public
boolean
support
(
String
alarmType
)
{
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
}
/**
...
...
@@ -53,6 +59,7 @@ public class BehaviorAlarm implements IAlarm{
* 取前七天的日最长时间,然后取中位数
* 前七天:没有满足七条记录则跳过,如果七条没都包含长者则跳过
* 记录的保存和缓存读取
*
* @param platAlarmCheckDTO
*/
@Override
...
...
@@ -63,91 +70,131 @@ public class BehaviorAlarm implements IAlarm{
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
String
deviceId
=
platDevice
.
getOriDeviceId
();
if
(
StringUtils
.
isBlank
(
ruleConfigStr
))
{
log
.
info
(
"行为告警配置未配置,告警配置id:"
+
config
.
getId
());
return
;
}
String
personState
=
Convert
.
toStr
(
properties
.
get
(
"personState"
));
PlatAlarmConfigBehaviorDTOVO
ruleConfig
=
JsonUtil
.
toObj
(
ruleConfigStr
,
PlatAlarmConfigBehaviorDTOVO
.
class
);
Integer
duration
=
ruleConfig
.
getDuration
();
//分钟
duration
=
duration
*
60
;
//todo duration+平均停留时长
PlatDayDurationRecord
platDayDurationRecord
=
dayDurationUtil
.
get
(
platDevice
.
getOriDeviceId
());
if
(
platDayDurationRecord
==
null
)
{
log
.
info
(
"行为告警未找到行为异常平均时长,设备id:"
+
platDevice
.
getId
());
return
;
}
Long
duration1
=
platDayDurationRecord
.
getDuration
();
duration
=
duration
*
60
+
(
int
)
(
duration1
/
1000
);
//duration+平均停留时长
List
<
String
>
personStateList
=
Arrays
.
asList
(
"1"
,
"2"
,
"3"
);
//有人
//计数
Date
now
=
new
Date
();
long
endLong
=
now
.
getTime
();
AlarmRedisDTO
alarmRedisDTO
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
);
if
(
alarmRedisDTO
==
null
)
{
alarmRedisDTO
=
new
AlarmRedisDTO
();
AlarmRedisDTO
alarmRedisDTO
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_
BEHAVIOR_
ID
+
deviceId
);
if
(
alarmRedisDTO
==
null
)
{
alarmRedisDTO
=
new
AlarmRedisDTO
();
}
//有人
if
(
personStateList
.
contains
(
personState
))
{
//第一次进入空间
Long
startLong
=
alarmRedisDTO
.
getStartLong
();
if
(
startLong
==
null
)
{
if
(
startLong
==
null
)
{
alarmRedisDTO
.
setStartLong
(
endLong
);
alarmRedisDTO
.
setStart
(
now
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
alarmRedisDTO
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_BEHAVIOR_ID
+
deviceId
,
alarmRedisDTO
);
log
.
info
(
"空间雷达上报进入房间,设备id:"
+
platDevice
.
getId
());
return
;
}
long
count
=
endLong
-
startLong
;
//进入空间时间满足告警时长,判断是否已经告警过了
if
(
count
/
1000
>=
duration
&&
StringUtils
.
equals
(
alarmRedisDTO
.
getAlarm
(),
CommonEnum
.
NO
.
getValue
()))
{
if
(
count
/
1000
>=
duration
&&
StringUtils
.
equals
(
alarmRedisDTO
.
getAlarm
(),
CommonEnum
.
NO
.
getValue
()))
{
log
.
info
(
"空间雷达发出告警,设备id:"
+
platDevice
.
getId
());
notice
(
platAlarmCheckDTO
);
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
YES
.
getValue
());
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
alarmRedisDTO
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_BEHAVIOR_ID
+
deviceId
,
alarmRedisDTO
);
}
}
else
{
//没人
}
else
{
//没人
// 是否有第一次进入记录,有则保存db
Long
startLong
=
alarmRedisDTO
.
getStartLong
();
if
(
startLong
==
null
)
{
if
(
startLong
==
null
)
{
return
;
}
//保存每次进入空间时长
saveDayDurationRecord
(
platAlarmCheckDTO
,
alarmRedisDTO
);
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
);
saveDayDurationRecord
(
platAlarmCheckDTO
,
alarmRedisDTO
);
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_
BEHAVIOR_
ID
+
deviceId
);
}
}
/**
* 保存停留时长记录
* 进入雷达开始
* 走出雷达结束
*
* @param platAlarmCheckDTO
* @param alarmRedisDTO
*/
private
void
saveDayDurationRecord
(
PlatAlarmCheckDTO
platAlarmCheckDTO
,
AlarmRedisDTO
alarmRedisDTO
)
{
PlatAlarmConfig
config
=
platAlarmCheckDTO
.
getPlatAlarmConfig
();
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
PlatRoom
platRoom
=
platAlarmCheckDTO
.
getPlatRoom
();
PlatRegionSetting
platRegionSetting
=
platAlarmCheckDTO
.
getPlatRegionSetting
();
Date
now
=
new
Date
();
long
endLong
=
now
.
getTime
();
Long
startLong
=
alarmRedisDTO
.
getStartLong
();
long
count
=
endLong
-
alarmRedisDTO
.
getStartLong
();
//save db
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
if
(
CollectionUtils
.
isEmpty
(
platAlarmCheckDTO
.
getPlatElderList
())){
log
.
info
(
"未关联长者,设备id:"
+
platDevice
.
getId
());
return
;
}
List
<
PlatElder
>
platElderList
=
platAlarmCheckDTO
.
getPlatElderList
();
PlatDayDurationRecord
durationRecord
=
new
PlatDayDurationRecord
();
durationRecord
.
setElderIds
(
platElderList
.
stream
().
map
(
BaseEntity:
:
getId
).
collect
(
Collectors
.
joining
(
","
)));
durationRecord
.
setDuration
(
count
);
durationRecord
.
setOriDeviceId
(
platDevice
.
getOriDeviceId
());
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyyMMdd"
);
durationRecord
.
setDay
(
dateTimeFormatter
.
format
(
LocalDateTime
.
ofEpochSecond
(
startLong
/
1000
,
0
,
ZoneOffset
.
ofHours
(
8
))));
durationRecord
.
setDay
(
dateTimeFormatter
.
format
(
LocalDateTime
.
ofEpochSecond
(
startLong
/
1000
,
0
,
ZoneOffset
.
ofHours
(
8
))));
durationRecord
.
setStartDate
(
alarmRedisDTO
.
getStart
());
durationRecord
.
setEndDate
(
now
);
durationRecord
.
setTenantId
(
config
.
getTenantId
());
durationRecord
.
setRoomId
(
platRoom
.
getId
());
durationRecord
.
setDeviceId
(
platDevice
.
getId
());
if
(
platRegionSetting
!=
null
)
{
durationRecord
.
setRegionName
(
platRegionSetting
.
getRegionName
());
}
platDayDurationRecordService
.
saveOrUpdate
(
durationRecord
);
}
@Override
@Async
public
void
notice
(
PlatAlarmCheckDTO
platAlarmCheckDTO
)
{
//获取长者 空间信息
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
List
<
PlatElder
>
platElderList
=
platAlarmCheckDTO
.
getPlatElderList
();
if
(
CollectionUtils
.
isEmpty
(
platElderList
)){
if
(
CollectionUtils
.
isEmpty
(
platElderList
))
{
log
.
info
(
"未关联长者,设备id:"
+
platAlarmCheckDTO
.
getPlatDevice
().
getId
());
return
;
}
PlatRoom
platRoom
=
platAlarmCheckDTO
.
getPlatRoom
();
for
(
PlatElder
platElder
:
platElderList
)
{
//判断是否已入住七天
LocalDateTime
checkInTime
=
platElder
.
getCheckInTime
();
if
(
checkInTime
==
null
)
{
continue
;
}
Integer
daySub
=
LocalDateTimeUtils
.
getDaySub
(
checkInTime
,
LocalDateTime
.
now
());
if
(
daySub
<
7
)
{
continue
;
}
List
<
String
>
param
=
new
ArrayList
<>();
param
.
add
(
platElder
.
getName
());
param
.
add
(
platRoom
.
getName
());
platAlarmCheckDTO
.
setParam
(
param
);
PlatAlarmRecord
platAlarmRecord
=
platAlarmRecordService
.
convertToPlatAlarmRecord
(
platAlarmCheckDTO
);
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
platAlarmRecord
.
setElderIds
(
platElder
.
getId
());
platAlarmRecord
.
setElderName
(
platElder
.
getName
());
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
}
}
}
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/BreathAlarm.java
View file @
844213b9
...
...
@@ -8,16 +8,17 @@ import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import
com.makeit.entity.platform.alarm.PlatAlarmRecord
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.en
tity.platform.space.PlatRoo
m
;
import
com.makeit.en
ums.CommonEnu
m
;
import
com.makeit.enums.platform.alarm.PlatAlarmConfigEnum
;
import
com.makeit.enums.redis.RedisConst
;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
import
com.makeit.utils.AlarmRedisDTO
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
com.makeit.utils.redis.RedisUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
java.util.ArrayList
;
...
...
@@ -25,23 +26,25 @@ import java.util.Date;
import
java.util.List
;
@Component
public
class
BreathAlarm
implements
IAlarm
{
@Slf4j
public
class
BreathAlarm
implements
IAlarm
{
@Autowired
private
PlatAlarmRecordService
platAlarmRecordService
;
private
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
BREATHE
;
private
final
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
BREATHE
;
@Override
public
boolean
support
(
String
alarmType
)
{
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
}
/**
* 2.呼吸异常/心率异常:长者关联的呼吸心率雷达上报的呼吸和心率不在配置的阈值范围内,且满足持续时间进行告警,
* 若该长者在长者管理处有配置阈值,则以长者个人的阈值为准,若无,则以此处配置的通用规则为准
*
*
<p>
* 心率呼吸率低于阈值且满足持续时间,则对应状态为呼吸过缓/心率过缓,高于阈值且满足持续时间,
* 对应状态为呼吸过速/心率过速,呼吸心率为0且满足持续时间为呼吸暂停
*
* @param platAlarmCheckDTO
*/
@Override
...
...
@@ -52,6 +55,7 @@ public class BreathAlarm implements IAlarm{
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
String
deviceId
=
platDevice
.
getOriDeviceId
();
if
(
StringUtils
.
isBlank
(
ruleConfigStr
))
{
log
.
info
(
"呼吸告警配置未配置,告警配置id:"
+
config
.
getId
());
return
;
}
String
personState
=
Convert
.
toStr
(
properties
.
get
(
"personState"
));
...
...
@@ -62,52 +66,80 @@ public class BreathAlarm implements IAlarm{
Integer
start
=
ruleConfig
.
getRespiratoryRateStart
();
Integer
end
=
ruleConfig
.
getRespiratoryRateEnd
();
Integer
duration
=
ruleConfig
.
getDuration
();
long
endLong
=
new
Date
().
getTime
();
Date
now
=
new
Date
();
long
endLong
=
now
.
getTime
();
//计数
Long
startLong
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
);
if
(
StringUtils
.
equals
(
personState
,
"0"
)||
startLong
==
null
)
{
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
AlarmRedisDTO
alarmRedisDTO
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_BR_ID
+
deviceId
);
if
(
StringUtils
.
equals
(
personState
,
CommonEnum
.
NO
.
getValue
()))
{
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_BR_ID
+
deviceId
);
return
;
}
long
count
=
endLong
-
startLong
;
if
(
br
>
end
||
br
<
start
)
{
if
(
count
>=
duration
)
{
if
(
br
>
end
){
platAlarmCheckDTO
.
setRemark
(
"呼吸过速"
);
if
((
br
>
end
||
br
<
start
))
{
if
(
alarmRedisDTO
==
null
){
alarmRedisDTO
=
new
AlarmRedisDTO
();
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
NO
.
getValue
());
alarmRedisDTO
.
setStart
(
now
);
alarmRedisDTO
.
setStartLong
(
endLong
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_BR_ID
+
deviceId
,
alarmRedisDTO
);
log
.
info
(
"发现长者呼吸异常,设备id:"
+
deviceId
);
return
;
}
if
(
br
<
start
){
platAlarmCheckDTO
.
setRemark
(
"呼吸过缓"
);
Long
startLong
=
alarmRedisDTO
.
getStartLong
();
long
count
=
endLong
-
startLong
;
if
(
count
/
1000
>=
duration
)
{
if
(
StringUtils
.
equals
(
alarmRedisDTO
.
getAlarm
(),
CommonEnum
.
YES
.
getValue
()))
{
log
.
info
(
"呼吸已告警,设备id:"
+
platDevice
.
getId
());
return
;
}
fillRemark
(
platAlarmCheckDTO
,
br
,
start
,
end
);
notice
(
platAlarmCheckDTO
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
alarmRedisDTO
.
setStartLong
(
endLong
);
alarmRedisDTO
.
setStart
(
now
);
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
YES
.
getValue
());
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_BR_ID
+
deviceId
,
alarmRedisDTO
);
}
}
else
{
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_BR_ID
+
deviceId
);
}
}
private
void
fillRemark
(
PlatAlarmCheckDTO
platAlarmCheckDTO
,
int
br
,
Integer
start
,
Integer
end
)
{
if
(
br
>
end
)
{
platAlarmCheckDTO
.
setRemark
(
"呼吸过速"
);
}
if
(
br
<
start
)
{
platAlarmCheckDTO
.
setRemark
(
"呼吸过缓"
);
}
if
(
br
==
0
)
{
platAlarmCheckDTO
.
setRemark
(
"呼吸暂停"
);
}
return
;
}
/**
* [#长者姓名][#呼吸状态],请及时处理!
*
* @param platAlarmCheckDTO
*/
@Override
@Async
public
void
notice
(
PlatAlarmCheckDTO
platAlarmCheckDTO
)
{
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
List
<
PlatElder
>
platElderList
=
platAlarmCheckDTO
.
getPlatElderList
();
if
(
CollectionUtils
.
isEmpty
(
platElderList
)){
if
(
CollectionUtils
.
isEmpty
(
platElderList
))
{
log
.
info
(
"未关联长者,设备id:"
+
platAlarmCheckDTO
.
getPlatDevice
().
getId
());
return
;
}
PlatRoom
platRoom
=
platAlarmCheckDTO
.
getPlatRoom
();
for
(
PlatElder
platElder
:
platElderList
)
{
List
<
String
>
param
=
new
ArrayList
<>();
param
.
add
(
platElder
.
getName
());
param
.
add
(
platAlarmCheckDTO
.
getRemark
());
platAlarmCheckDTO
.
setParam
(
param
);
PlatAlarmRecord
platAlarmRecord
=
platAlarmRecordService
.
convertToPlatAlarmRecord
(
platAlarmCheckDTO
);
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
platAlarmRecord
.
setElderIds
(
platElder
.
getId
());
platAlarmRecord
.
setElderName
(
platElder
.
getName
());
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
}
}
}
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/FallAlarm.java
View file @
844213b9
...
...
@@ -4,10 +4,16 @@ import cn.hutool.core.convert.Convert;
import
com.alibaba.fastjson.JSONObject
;
import
com.makeit.dto.platform.alarm.PlatAlarmCheckDTO
;
import
com.makeit.entity.platform.alarm.PlatAlarmRecord
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.space.PlatRoom
;
import
com.makeit.enums.CommonEnum
;
import
com.makeit.enums.platform.alarm.PlatAlarmConfigEnum
;
import
com.makeit.enums.redis.RedisConst
;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
import
com.makeit.utils.AlarmRedisDTO
;
import
com.makeit.utils.redis.RedisUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -17,35 +23,47 @@ import java.util.ArrayList;
import
java.util.List
;
@Component
public
class
FallAlarm
implements
IAlarm
{
@Slf4j
public
class
FallAlarm
implements
IAlarm
{
@Autowired
private
PlatAlarmRecordService
platAlarmRecordService
;
private
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
FALL
;
private
final
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
FALL
;
@Override
public
boolean
support
(
String
alarmType
)
{
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
}
/**
* 1.长者跌倒:长者所在空间的跌倒监测雷达上报跌倒,若一个空间内有多为长者,则同时告警多条
*
* @param platAlarmCheckDTO
*/
@Override
public
void
checkConfig
(
PlatAlarmCheckDTO
platAlarmCheckDTO
)
{
JSONObject
properties
=
platAlarmCheckDTO
.
getProperties
();
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
String
deviceId
=
platDevice
.
getOriDeviceId
();
String
personState
=
Convert
.
toStr
(
properties
.
get
(
"personState"
));
if
(
StringUtils
.
equals
(
personState
,
"1"
))
{
AlarmRedisDTO
alarmRedisDTO
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_FALL_ID
+
deviceId
);
if
(
StringUtils
.
equals
(
personState
,
CommonEnum
.
YES
.
getValue
()))
{
notice
(
platAlarmCheckDTO
);
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
YES
.
getValue
());
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_FALL_ID
,
alarmRedisDTO
);
}
else
{
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
NO
.
getValue
());
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_FALL_ID
,
alarmRedisDTO
);
}
}
@Override
public
void
notice
(
PlatAlarmCheckDTO
platAlarmCheckDTO
)
{
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
List
<
PlatElder
>
platElderList
=
platAlarmCheckDTO
.
getPlatElderList
();
if
(
CollectionUtils
.
isEmpty
(
platElderList
)){
if
(
CollectionUtils
.
isEmpty
(
platElderList
))
{
log
.
info
(
"跌倒设备未关联长者,设备id:"
+
platDevice
.
getId
());
return
;
}
PlatRoom
platRoom
=
platAlarmCheckDTO
.
getPlatRoom
();
...
...
@@ -55,7 +73,9 @@ public class FallAlarm implements IAlarm{
param
.
add
(
platRoom
.
getName
());
platAlarmCheckDTO
.
setParam
(
param
);
PlatAlarmRecord
platAlarmRecord
=
platAlarmRecordService
.
convertToPlatAlarmRecord
(
platAlarmCheckDTO
);
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
platAlarmRecord
.
setElderIds
(
platElder
.
getId
());
platAlarmRecord
.
setElderName
(
platElder
.
getName
());
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
}
}
}
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/HeartAlarm.java
View file @
844213b9
...
...
@@ -8,16 +8,17 @@ import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import
com.makeit.entity.platform.alarm.PlatAlarmRecord
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.en
tity.platform.space.PlatRoo
m
;
import
com.makeit.en
ums.CommonEnu
m
;
import
com.makeit.enums.platform.alarm.PlatAlarmConfigEnum
;
import
com.makeit.enums.redis.RedisConst
;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
import
com.makeit.utils.AlarmRedisDTO
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
com.makeit.utils.redis.RedisUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
java.util.ArrayList
;
...
...
@@ -25,15 +26,16 @@ import java.util.Date;
import
java.util.List
;
@Component
@Slf4j
public
class
HeartAlarm
implements
IAlarm
{
@Autowired
private
PlatAlarmRecordService
platAlarmRecordService
;
private
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
HEART
;
private
final
PlatAlarmConfigEnum
.
AlarmTypeEnum
alarmTypeEnum
=
PlatAlarmConfigEnum
.
AlarmTypeEnum
.
HEART
;
@Override
public
boolean
support
(
String
alarmType
)
{
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
return
StringUtils
.
equals
(
alarmType
,
alarmTypeEnum
.
getValue
());
}
@Override
...
...
@@ -44,6 +46,7 @@ public class HeartAlarm implements IAlarm {
PlatDevice
platDevice
=
platAlarmCheckDTO
.
getPlatDevice
();
String
deviceId
=
platDevice
.
getOriDeviceId
();
if
(
StringUtils
.
isBlank
(
ruleConfigStr
))
{
log
.
info
(
"心率告警配置未配置,告警配置id:"
+
config
.
getId
());
return
;
}
String
personState
=
Convert
.
toStr
(
properties
.
get
(
"personState"
));
...
...
@@ -53,47 +56,73 @@ public class HeartAlarm implements IAlarm {
Integer
start
=
ruleConfig
.
getHeartRateStart
();
Integer
end
=
ruleConfig
.
getHeartRateEnd
();
Integer
duration
=
ruleConfig
.
getDuration
();
long
endLong
=
new
Date
().
getTime
();
Date
now
=
new
Date
();
long
endLong
=
now
.
getTime
();
//计数
Long
startLong
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
);
if
(
StringUtils
.
equals
(
personState
,
"0"
)||
startLong
==
null
)
{
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
AlarmRedisDTO
alarmRedisDTO
=
RedisUtil
.
get
(
RedisConst
.
ALARM_DEVICE_HR_ID
+
deviceId
);
if
(
StringUtils
.
equals
(
personState
,
CommonEnum
.
NO
.
getValue
()))
{
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_HR_ID
+
deviceId
);
return
;
}
long
count
=
endLong
-
startLong
;
if
(
hr
>
end
||
hr
<
start
)
{
if
(
count
>=
duration
)
{
if
(
hr
>
end
){
platAlarmCheckDTO
.
setRemark
(
"心率过速"
);
if
((
hr
>
end
||
hr
<
start
))
{
if
(
alarmRedisDTO
==
null
){
alarmRedisDTO
=
new
AlarmRedisDTO
();
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
NO
.
getValue
());
alarmRedisDTO
.
setStart
(
now
);
alarmRedisDTO
.
setStartLong
(
endLong
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_HR_ID
+
deviceId
,
alarmRedisDTO
);
log
.
info
(
"发现长者心率异常,设备id:"
+
deviceId
);
return
;
}
if
(
hr
<
start
){
platAlarmCheckDTO
.
setRemark
(
"心率过缓"
);
Long
startLong
=
alarmRedisDTO
.
getStartLong
();
long
count
=
endLong
-
startLong
;
if
(
count
/
1000
>=
duration
)
{
if
(
StringUtils
.
equals
(
alarmRedisDTO
.
getAlarm
(),
CommonEnum
.
YES
.
getValue
()))
{
log
.
info
(
"心率已告警,设备id:"
+
platDevice
.
getId
());
return
;
}
fillRemark
(
platAlarmCheckDTO
,
hr
,
start
,
end
);
notice
(
platAlarmCheckDTO
);
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
alarmRedisDTO
.
setStartLong
(
endLong
);
alarmRedisDTO
.
setStart
(
now
);
alarmRedisDTO
.
setAlarm
(
CommonEnum
.
YES
.
getValue
());
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_HR_ID
+
deviceId
,
alarmRedisDTO
);
}
}
else
{
RedisUtil
.
set
(
RedisConst
.
ALARM_DEVICE_ID
+
deviceId
,
endLong
/
1000
);
RedisUtil
.
delete
(
RedisConst
.
ALARM_DEVICE_HR_ID
+
deviceId
);
}
}
private
void
fillRemark
(
PlatAlarmCheckDTO
platAlarmCheckDTO
,
int
hr
,
Integer
start
,
Integer
end
)
{
if
(
hr
>
end
)
{
platAlarmCheckDTO
.
setRemark
(
"心率过快"
);
}
if
(
hr
<
start
)
{
platAlarmCheckDTO
.
setRemark
(
"心率过缓"
);
}
}
@Override
@Async
public
void
notice
(
PlatAlarmCheckDTO
platAlarmCheckDTO
)
{
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
platAlarmRecordService
.
getElderListByDeviceId
(
platAlarmCheckDTO
);
List
<
PlatElder
>
platElderList
=
platAlarmCheckDTO
.
getPlatElderList
();
if
(
CollectionUtils
.
isEmpty
(
platElderList
)){
if
(
CollectionUtils
.
isEmpty
(
platElderList
))
{
log
.
info
(
"跌倒设备未关联长者,设备id:"
+
platAlarmCheckDTO
.
getPlatDevice
().
getId
());
return
;
}
PlatRoom
platRoom
=
platAlarmCheckDTO
.
getPlatRoom
();
for
(
PlatElder
platElder
:
platElderList
)
{
List
<
String
>
param
=
new
ArrayList
<>();
param
.
add
(
platElder
.
getName
());
param
.
add
(
platAlarmCheckDTO
.
getRemark
());
platAlarmCheckDTO
.
setParam
(
param
);
PlatAlarmRecord
platAlarmRecord
=
platAlarmRecordService
.
convertToPlatAlarmRecord
(
platAlarmCheckDTO
);
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
platAlarmRecord
.
setElderIds
(
platElder
.
getId
());
platAlarmRecord
.
setElderName
(
platElder
.
getName
());
platAlarmRecordService
.
noticeDeviceAlarm
(
platAlarmCheckDTO
.
getPlatAlarmConfig
(),
platAlarmRecord
);
}
}
}
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatAlarmRecordServiceImpl.java
View file @
844213b9
...
...
@@ -15,9 +15,11 @@ import com.makeit.entity.platform.auth.PlatUser;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderChildrenInfo
;
import
com.makeit.entity.platform.space.PlatRegionSetting
;
import
com.makeit.entity.platform.space.PlatRoom
;
import
com.makeit.entity.platform.space.PlatRoomBedDevice
;
import
com.makeit.enums.CommonEnum
;
import
com.makeit.enums.platform.device.PlatDeviceEnum
;
import
com.makeit.exception.BusinessException
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper
;
...
...
@@ -26,6 +28,7 @@ import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import
com.makeit.service.platform.auth.PlatUserService
;
import
com.makeit.service.platform.elder.PlatElderChildrenInfoService
;
import
com.makeit.service.platform.elder.PlatElderService
;
import
com.makeit.service.platform.space.PlatRegionSettingService
;
import
com.makeit.service.platform.space.PlatRoomBedDeviceService
;
import
com.makeit.service.platform.space.PlatRoomService
;
import
com.makeit.utils.data.convert.BeanDtoVoUtils
;
...
...
@@ -39,6 +42,7 @@ import com.makeit.utils.user.common.CommonUserVO;
import
com.makeit.utils.user.wechat.WechatUserInfo
;
import
com.makeit.utils.user.wechat.WechatUserUtil
;
import
com.makeit.vo.platform.alarm.PlatAlarmRecordVO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -62,6 +66,7 @@ import java.util.stream.Collectors;
* @createDate 2023-09-06 14:26:05
*/
@Service
@Slf4j
public
class
PlatAlarmRecordServiceImpl
extends
ServiceImpl
<
PlatAlarmRecordMapper
,
PlatAlarmRecord
>
implements
PlatAlarmRecordService
{
@Autowired
...
...
@@ -82,6 +87,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
private
PlatElderService
platElderService
;
@Autowired
private
PlatRoomService
platRoomService
;
@Autowired
private
PlatRegionSettingService
platRegionSettingService
;
@Override
...
...
@@ -182,9 +189,13 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
@TenantIdIgnore
public
void
noticeDeviceAlarm
(
PlatAlarmConfig
alarmConfig
,
PlatAlarmRecord
alarmRecord
)
{
//判断是否需要同时通知家属
try
{
if
(
StringUtils
.
equals
(
alarmConfig
.
getNotifyRelation
(),
"1"
))
{
noticeChildren
(
alarmConfig
,
alarmRecord
);
}
}
catch
(
Exception
e
){
log
.
error
(
"通知家属异常"
,
e
);
}
//通知内部人员
noticeUser
(
alarmConfig
,
alarmRecord
);
...
...
@@ -205,16 +216,13 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
String
elderIds
=
alarmRecord
.
getElderIds
();
List
<
PlatElderChildrenInfo
>
allChildInfoList
=
new
ArrayList
<>();
String
[]
elderIdSplit
=
elderIds
.
split
(
","
);
//通知每个长者的子女
for
(
String
elderId
:
elderIdSplit
)
{
LambdaQueryWrapper
<
PlatElderChildrenInfo
>
childrenInfoLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
childrenInfoLambdaQueryWrapper
.
eq
(
BaseBusEntity:
:
getTenantId
,
alarmConfig
.
getTenantId
());
childrenInfoLambdaQueryWrapper
.
and
(
qw
->
qw
.
apply
(
"find_in_set('"
+
elderId
+
"',elder_id)"
));
childrenInfoLambdaQueryWrapper
.
and
(
qw
->
qw
.
apply
(
"find_in_set('"
+
elderId
s
+
"',elder_id)"
));
List
<
PlatElderChildrenInfo
>
childrenInfoList
=
platElderChildrenInfoService
.
list
(
childrenInfoLambdaQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
childrenInfoList
))
{
log
.
debug
(
"子女端账号未绑定长者"
);
continue
;
throw
new
BusinessException
(
"子女端账号未绑定长者,长者id:"
+
elderIds
);
}
allChildInfoList
.
addAll
(
childrenInfoList
);
Set
<
String
>
phoneSet
=
childrenInfoList
.
stream
().
map
(
PlatElderChildrenInfo:
:
getPhone
).
collect
(
Collectors
.
toSet
());
...
...
@@ -222,14 +230,15 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
List
<
SendTypeEnum
>
notifyChannelList
=
Arrays
.
asList
(
SendTypeEnum
.
SMS
,
SendTypeEnum
.
VOICE_SMS
,
SendTypeEnum
.
CHILD_WECHAT
);
//发送消息
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
notifyChannelList
);
}
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
null
,
notifyChannelList
);
String
childIdJoin
=
allChildInfoList
.
stream
().
map
(
BaseEntity:
:
getId
).
collect
(
Collectors
.
joining
(
","
));
//通知的子女
alarmConfig
.
setNotifyRelation
(
childIdJoin
);
alarmRecord
.
setNoticeStatus
(
CommonEnum
.
YES
.
getValue
());
alarmRecord
.
setTenantId
(
alarmConfig
.
getTenantId
());
saveOrUpdate
(
alarmRecord
);
}
/**
...
...
@@ -264,13 +273,13 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
}
platUserList
.
removeIf
(
Objects:
:
isNull
);
if
(
CollectionUtils
.
isEmpty
(
platUserList
))
{
log
.
debug
(
"通知工作人员时,找不到人员数据;"
+
"orgId:"
+
alarmConfig
.
getOrgId
()
+
",tenantId:"
+
alarmConfig
.
getTenantId
()
+
"alarmConfigId:"
+
alarmConfig
.
getId
());
return
;
throw
new
BusinessException
(
"通知工作人员时,找不到人员数据;"
+
"orgId:"
+
alarmConfig
.
getOrgId
()
+
",tenantId:"
+
alarmConfig
.
getTenantId
()
+
"alarmConfigId:"
+
alarmConfig
.
getId
());
}
List
<
SendTypeEnum
>
notifyChannelList
=
Arrays
.
asList
(
SendTypeEnum
.
SMS
,
SendTypeEnum
.
VOICE_SMS
,
SendTypeEnum
.
MAIL
);
Set
<
String
>
phoneSet
=
platUserList
.
stream
().
map
(
PlatUser:
:
getMobile
).
collect
(
Collectors
.
toSet
());
Set
<
String
>
emailSet
=
platUserList
.
stream
().
map
(
PlatUser:
:
getEmail
).
collect
(
Collectors
.
toSet
());
//发送消息
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
notifyChannelList
);
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
emailSet
,
notifyChannelList
);
String
userIdJoin
=
platUserList
.
stream
().
map
(
PlatUser:
:
getId
).
collect
(
Collectors
.
joining
(
","
));
alarmRecord
.
setNotifyUser
(
userIdJoin
);
...
...
@@ -287,7 +296,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
* @param phoneSet 工作人员手机号
* @param notifyChannelList 通知渠道
*/
private
void
noticeByChannel
(
PlatAlarmConfig
alarmConfig
,
PlatAlarmRecord
alarmRecord
,
Set
<
String
>
phoneSet
,
List
<
SendTypeEnum
>
notifyChannelList
)
{
private
void
noticeByChannel
(
PlatAlarmConfig
alarmConfig
,
PlatAlarmRecord
alarmRecord
,
Set
<
String
>
phoneSet
,
Set
<
String
>
emailSet
,
List
<
SendTypeEnum
>
notifyChannelList
)
{
String
notifyChannel
=
alarmConfig
.
getNotifyChannel
();
String
[]
split
=
notifyChannel
.
split
(
","
);
for
(
String
sendType
:
split
)
{
...
...
@@ -297,7 +306,10 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
MsgSendDTO
msgSendDTO
=
new
MsgSendDTO
();
msgSendDTO
.
setSendTypeEnum
(
sendTypeEnum
);
msgSendDTO
.
setReceiverList
(
phoneSet
);
msgSendDTO
.
setEmailSet
(
emailSet
);
msgSendDTO
.
setOriContent
(
alarmRecord
.
getContent
());
msgSendDTO
.
setSubject
(
alarmRecord
.
getContent
());
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
());
//todo 小程序消息
msgUtil
.
send
(
msgSendDTO
);
}
...
...
@@ -339,17 +351,24 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
if
(
platRoomBedDevice
==
null
){
throw
new
BusinessException
(
"设备没绑定房间:"
+
platDevice
.
getId
());
}
if
(
StringUtils
.
equals
(
platDevice
.
getCategory
(),
PlatDeviceEnum
.
CategoryEnum
.
SPACE
.
getValue
()))
{
PlatRoom
platRoom
=
platRoomService
.
getById
(
platRoomBedDevice
.
getRoomId
());
platAlarmCheckDTO
.
setPlatRoom
(
platRoom
);
LambdaQueryWrapper
<
PlatRegionSetting
>
platRegionSettingLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
platRegionSettingLambdaQueryWrapper
.
eq
(
PlatRegionSetting:
:
getRoomId
,
platRoom
.
getId
())
.
eq
(
PlatRegionSetting:
:
getDeviceId
,
platDevice
.
getId
());
//区域设置
PlatRegionSetting
platRegionSetting
=
platRegionSettingService
.
getOne
(
platRegionSettingLambdaQueryWrapper
,
false
);
platAlarmCheckDTO
.
setPlatRegionSetting
(
platRegionSetting
);
}
String
bedId
=
platRoomBedDevice
.
getBedId
();
if
(
StringUtils
.
isNotBlank
(
bedId
))
{
LambdaQueryWrapper
<
PlatElder
>
elderLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
elderLambdaQueryWrapper
.
eq
(
PlatElder:
:
getBedId
,
bedId
);
List
<
PlatElder
>
list
=
platElderService
.
list
(
elderLambdaQueryWrapper
);
platAlarmCheckDTO
.
setPlatElderList
(
list
);
if
(
CollectionUtils
.
isEmpty
(
list
)){
throw
new
BusinessException
(
"床位没人"
);
}
}
String
roomId
=
platRoomBedDevice
.
getRoomId
();
...
...
@@ -358,9 +377,6 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
elderLambdaQueryWrapper
.
eq
(
PlatElder:
:
getRoomId
,
roomId
);
List
<
PlatElder
>
list
=
platElderService
.
list
(
elderLambdaQueryWrapper
);
platAlarmCheckDTO
.
setPlatElderList
(
list
);
if
(
CollectionUtils
.
isEmpty
(
list
))
{
throw
new
BusinessException
(
"房间没人"
);
}
}
}
...
...
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatDayDurationRecordServiceImpl.java
View file @
844213b9
...
...
@@ -2,11 +2,14 @@ package com.makeit.service.platform.alarm.impl;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.makeit.dto.platform.alarm.PlatDayDurationRecordDTO
;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
com.makeit.mapper.platform.alarm.PlatDayDurationRecordMapper
;
import
com.makeit.service.platform.alarm.PlatDayDurationRecordService
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
/**
* @author lixl
* @description 针对表【plat_day_duration_record(每天停留时长记录)】的数据库操作Service实现
...
...
@@ -16,4 +19,8 @@ import org.springframework.stereotype.Service;
public
class
PlatDayDurationRecordServiceImpl
extends
ServiceImpl
<
PlatDayDurationRecordMapper
,
PlatDayDurationRecord
>
implements
PlatDayDurationRecordService
{
@Override
public
List
<
PlatDayDurationRecord
>
getDayMaxDurationList
(
PlatDayDurationRecordDTO
param
){
return
baseMapper
.
getDayMaxDurationList
(
param
);
}
}
server-service/src/main/java/com/makeit/task/DayDurationTask.java
0 → 100644
View file @
844213b9
package
com
.
makeit
.
task
;
import
com.makeit.utils.DayDurationUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
@Component
@Slf4j
public
class
DayDurationTask
{
@Autowired
private
DayDurationUtil
dayDurationUtil
;
@Scheduled
(
cron
=
"0 */1 * * * ?"
)
public
void
updateDayDuration
()
{
dayDurationUtil
.
getAll
();
}
}
server-service/src/main/java/com/makeit/utils/AlarmRedisDTO.java
View file @
844213b9
...
...
@@ -20,5 +20,8 @@ public class AlarmRedisDTO implements Serializable {
*/
private
String
alarm
=
"0"
;
/**
* 雷达开始上报
*/
private
Date
start
;
}
server-service/src/main/java/com/makeit/utils/DayDurationUtil.java
0 → 100644
View file @
844213b9
package
com
.
makeit
.
utils
;
import
com.makeit.dto.platform.alarm.PlatDayDurationRecordDTO
;
import
com.makeit.entity.platform.alarm.PlatDayDurationRecord
;
import
com.makeit.enums.redis.RedisConst
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.service.platform.alarm.PlatDayDurationRecordService
;
import
com.makeit.utils.redis.RedisUtil
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.stereotype.Component
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@Component
public
class
DayDurationUtil
implements
ApplicationRunner
{
@Autowired
private
PlatDayDurationRecordService
platDayDurationRecordService
;
public
void
getAll
()
{
DateTimeFormatter
yyyyMMdd
=
DateTimeFormatter
.
ofPattern
(
"yyyyMMdd"
);
LocalDateTime
now
=
LocalDateTime
.
now
();
List
<
String
>
dateStrList
=
new
ArrayList
<>();
for
(
int
i
=
1
;
i
<=
7
;
i
++)
{
LocalDateTime
dateTime
=
now
.
plusDays
(-
i
);
dateStrList
.
add
(
yyyyMMdd
.
format
(
dateTime
));
}
PlatDayDurationRecordDTO
platDayDurationRecordDTO
=
new
PlatDayDurationRecordDTO
();
platDayDurationRecordDTO
.
setDayStrList
(
dateStrList
);
List
<
PlatDayDurationRecord
>
platDayDurationRecords
=
platDayDurationRecordService
.
getDayMaxDurationList
(
platDayDurationRecordDTO
);
if
(
CollectionUtils
.
isEmpty
(
platDayDurationRecords
)){
return
;
}
Map
<
String
,
List
<
PlatDayDurationRecord
>>
deviceIdMap
=
platDayDurationRecords
.
stream
().
collect
(
Collectors
.
groupingBy
(
PlatDayDurationRecord:
:
getOriDeviceId
));
deviceIdMap
.
entrySet
().
stream
().
map
(
vo
->
{
List
<
PlatDayDurationRecord
>
value
=
vo
.
getValue
();
int
size
=
value
.
size
();
int
mid
=
size
/
2
;
return
value
.
get
(
mid
);
}).
forEach
(
vo
->{
put
(
vo
);
});
return
;
}
public
void
put
(
PlatDayDurationRecord
platDayDurationRecord
)
{
RedisUtil
.
set
(
RedisConst
.
ELDER_DAY_DURATION_PREFIX
+
platDayDurationRecord
.
getOriDeviceId
(),
platDayDurationRecord
);
}
public
PlatDayDurationRecord
get
(
String
oriDeviceId
)
{
PlatDayDurationRecord
platDayDurationRecord
=
RedisUtil
.
get
(
RedisConst
.
ELDER_DAY_DURATION_PREFIX
+
oriDeviceId
);
if
(
platDayDurationRecord
==
null
){
getAll
();
}
return
RedisUtil
.
get
(
RedisConst
.
ELDER_DAY_DURATION_PREFIX
+
oriDeviceId
);
}
/**
* Callback used to run the bean.
*
* @param args incoming application arguments
* @throws Exception on error
*/
@Override
@TenantIdIgnore
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
getAll
();
}
}
server-service/src/main/resources/mappers/PlatDayDurationRecordMapper.xml
0 → 100644
View file @
844213b9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.makeit.mapper.platform.alarm.PlatDayDurationRecordMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"com.makeit.entity.platform.alarm.PlatDayDurationRecord"
>
<id
property=
"id"
column=
"id"
jdbcType=
"VARCHAR"
/>
<result
property=
"elderIds"
column=
"elder_ids"
jdbcType=
"VARCHAR"
/>
<result
property=
"duration"
column=
"duration"
jdbcType=
"VARCHAR"
/>
<result
property=
"oriDeviceId"
column=
"ori_device_id"
jdbcType=
"VARCHAR"
/>
<result
property=
"day"
column=
"day"
jdbcType=
"VARCHAR"
/>
<result
property=
"startDate"
column=
"start_date"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"endDate"
column=
"end_date"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"createBy"
column=
"create_by"
jdbcType=
"VARCHAR"
/>
<result
property=
"createDate"
column=
"create_date"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"updateBy"
column=
"update_by"
jdbcType=
"VARCHAR"
/>
<result
property=
"updateDate"
column=
"update_date"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"delFlag"
column=
"del_flag"
jdbcType=
"INTEGER"
/>
<result
property=
"tenantId"
column=
"tenant_id"
jdbcType=
"VARCHAR"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
id,elder_ids,duration,
ori_device_id,day,start_date,
end_date,create_by,create_date,
update_by,update_date,del_flag,
tenant_id
</sql>
<select
id=
"getDayMaxDurationList"
resultType=
"com.makeit.entity.platform.alarm.PlatDayDurationRecord"
>
select
pddr.ori_device_id,
pddr.day,
max(pddr.duration) as duration
from plat_day_duration_record pddr
<where>
<if
test=
"param.start != null "
>
and pddr.create_date >= #{param.start}
</if>
<if
test=
"param.end != null "
>
and pddr.create_date
<![CDATA[<= #{param.end}]]>
</if>
<if
test=
"param.dayStrList != null and param.dayStrList.size()>0"
>
AND pddr.day IN
<foreach
collection=
"param.dayStrList"
item=
"item"
separator=
","
open=
"("
close=
")"
index=
""
>
#{item}
</foreach>
</if>
</where>
group by pddr.ori_device_id, pddr.day
order by duration
</select>
</mapper>
server-web/src/main/java/com/makeit/mqtt/PushCallback.java
View file @
844213b9
...
...
@@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
import
java.util.Objects
;
@Component
...
...
@@ -81,7 +82,12 @@ public class PushCallback implements MqttCallback {
//iot设备id
PlatDevice
platDevice
=
deviceCacheUtil
.
get
(
deviceId
);
if
(
platDevice
==
null
){
logger
.
info
(
"设备信息异常,设备iot-id:"
+
deviceId
);
return
;
}
List
<
PlatAlarmConfig
>
deviceAlarmConfigList
=
alarmConfigCacheUtil
.
getDeviceAlarmConfigMap
(
platDevice
);
deviceAlarmConfigList
.
removeIf
(
Objects:
:
isNull
);
if
(
CollectionUtils
.
isEmpty
(
deviceAlarmConfigList
))
{
logger
.
info
(
"该设备没有告警配置:"
+
deviceId
);
return
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment