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
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
509 additions
and
111 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
This diff is collapsed.
Click to expand it.
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
<
start
){
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
;
}
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"
))
{
notice
(
platAlarmCheckDTO
);
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
<
start
){
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
;
}
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
This diff is collapsed.
Click to expand it.
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