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
ce1e9c90
authored
Feb 02, 2024
by
罗志长
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge branch 'dev'
parents
8e1d0ca8
3eb46154
Hide whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
1376 additions
and
695 deletions
db/init/init.sql
db/上线后sql/insert.sql
server-common/src/main/java/com/makeit/module/iot/vo/analysis/AnalysisVO.java
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepCountDTO.java
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepTimeAnalysisVO.java
server-common/src/main/java/com/makeit/utils/msg/sender/WxSpSender.java
server-common/src/main/java/com/makeit/utils/third/wechat/WechatBindDTO.java
server-common/src/main/java/com/makeit/utils/third/wechat/WechatCodeDTO.java
server-common/src/main/java/com/makeit/utils/user/wechat/WechatUserInfo.java
server-module/src/main/java/com/makeit/module/controller/children/elder/PlatElderChildrenInfoUserLoginChildrenController.java
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderSleepController.java
server-service/src/main/java/com/makeit/dto/SaveLogDTO.java
server-service/src/main/java/com/makeit/entity/saas/PlatTenant.java
server-service/src/main/java/com/makeit/mapper/platform/auth/PlatOrgMapper.java
server-service/src/main/java/com/makeit/mapper/platform/elder/PlatElderChildrenInfoMapper.java
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/OffBedAlarm.java
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatAlarmRecordServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/DeviceLogService.java
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderSleepService.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/DeviceLogServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportDayServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportWeekServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderSleepServiceImpl.java
server-service/src/main/java/com/makeit/service/wechat/PlatElderChildrenInfoUserLoginWechatService.java
server-service/src/main/java/com/makeit/service/wechat/impl/PlatElderChildrenInfoUserLoginWechatServiceImpl.java
server-service/src/main/java/com/makeit/vo/platform/elder/report/day/PlatSleepRangeVO.java
server-service/src/main/resources/mappers/PlatElderChildrenInfoMapper.xml
server-service/src/main/resources/mappers/PlatOrgMapper.xml
server-web/src/main/resources/application-dev.yml
server-web/src/main/resources/application-test.yml
server-web/src/main/resources/logback-spring-prod.xml
db/init/init.sql
View file @
ce1e9c90
...
...
@@ -46205,6 +46205,9 @@ INSERT INTO `saas_menu` VALUES ('1699779383360856066', '0', '数据分析', NULL
INSERT
INTO
`saas_menu`
VALUES
(
'1701192156686856193'
,
'0'
,
'空间管理'
,
NULL
,
'QuestionFilled'
,
500
,
'1'
,
'1'
,
NULL
,
NULL
,
NULL
,
NULL
,
'1'
,
'2023-09-11 19:13:11'
,
'2023-09-11 19:13:11'
,
'0'
,
NULL
,
'root'
,
'root'
,
NULL
,
NULL
);
INSERT
INTO
`saas_menu`
VALUES
(
'1702153993116991489'
,
'1699779383360856066'
,
'模型管理'
,
'saasAnalysisModelList'
,
NULL
,
500
,
'1'
,
'2'
,
'/saas/analysis/model-list'
,
NULL
,
NULL
,
NULL
,
'1'
,
'2023-09-14 10:55:11'
,
'2023-09-14 10:55:11'
,
'0'
,
NULL
,
'root'
,
'root'
,
'list'
,
NULL
);
INSERT
INTO
`saas_menu`
VALUES
(
'1702227189241573378'
,
'1699779383360856066'
,
'报告管理'
,
'saasAnalysisReportList'
,
NULL
,
500
,
'1'
,
'2'
,
'/saas/analysis/report-list'
,
NULL
,
NULL
,
NULL
,
'1'
,
'2023-09-14 15:46:02'
,
'2023-09-14 15:46:02'
,
'0'
,
NULL
,
'root'
,
'root'
,
'list'
,
NULL
);
INSERT
INTO
`saas_menu`
VALUES
(
'1731523714760503298'
,
'1699699374096998402'
,
'租户设备日志'
,
'saasTenantDeviceLogList'
,
NULL
,
500
,
'1'
,
'2'
,
'/saas/tenant/device-log-list'
,
NULL
,
NULL
,
NULL
,
'1'
,
'2023-12-04 11:59:58'
,
'2023-12-04 11:59:58'
,
'0'
,
NULL
,
'root'
,
'root'
,
'list'
,
NULL
);
INSERT
INTO
`saas_menu`
VALUES
(
'1735846783046008833'
,
'1699699374096998402'
,
'声网PID管理'
,
'saasTenantSwPidList'
,
NULL
,
500
,
'1'
,
'2'
,
'/saas/tenant/sw-pid-list'
,
NULL
,
NULL
,
NULL
,
'1'
,
'2023-12-16 10:18:18'
,
'2023-12-16 10:18:18'
,
'0'
,
NULL
,
'root'
,
'root'
,
'list'
,
NULL
);
INSERT
INTO
`saas_menu`
VALUES
(
'1751073621548666882'
,
'1699699374096998402'
,
'OpenAPI管理'
,
'saasTenantOpenApiList'
,
NULL
,
500
,
'1'
,
'2'
,
'/saas/tenant/open-api-list'
,
NULL
,
NULL
,
NULL
,
'1'
,
'2024-01-27 10:44:19'
,
'2024-01-27 10:44:19'
,
'0'
,
NULL
,
'root'
,
'root'
,
'list'
,
NULL
);
-- ----------------------------
-- Table structure for saas_model_manage
db/上线后sql/insert.sql
0 → 100644
View file @
ce1e9c90
INSERT
INTO
sys_dictionary
(
id
,
code
,
name
,
value
,
sort
,
description
,
category_id
,
create_date
,
INSERT
INTO
sys_dictionary
(
id
,
code
,
name
,
value
,
sort
,
description
,
category_id
,
create_date
,
update_date
,
del_flag
,
create_by
,
update_by
,
eng_name
)
VALUES
(
'213'
,
'alarm.sendType.childWechat'
,
'子女端小程序'
,
'6'
,
4
,
''
,
'201'
,
'2022-05-16 17:13:23'
,
'2022-05-16 17:13:27'
,
'0'
,
null
,
null
,
null
);
\ No newline at end of file
server-common/src/main/java/com/makeit/module/iot/vo/analysis/AnalysisVO.java
View file @
ce1e9c90
...
...
@@ -20,7 +20,10 @@ public class AnalysisVO {
private
Boolean
isAction
;
// 每分钟是否动过
private
Boolean
isMoveBed
;
// 是否离开床
/**
* 是否离开床或无人
*/
private
Boolean
isMoveBed
;
private
Boolean
isMinuteActionFlag
;
// 每分钟体动值是否大于阈值
...
...
@@ -49,6 +52,10 @@ public class AnalysisVO {
private
int
hrSlow
;
// 当前心率
private
String
hrSlowTime
;
// 发生时间
private
String
createdTime
;
private
String
deviceId
;
// private Integer sleepDeepMinuteCount; // 深睡每分钟体动和翻身次数
...
...
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepCountDTO.java
View file @
ce1e9c90
...
...
@@ -20,4 +20,6 @@ public class SleepCountDTO {
private
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
restSleepMap
;
private
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
allSleepMap
;
}
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepTimeAnalysisVO.java
View file @
ce1e9c90
...
...
@@ -17,10 +17,9 @@ public class SleepTimeAnalysisVO {
*/
private
String
endTime
;
/**
* 起床时间
*/
private
String
newEndTime
;
private
String
getUpTime
;
private
String
remark
;
/**
* 间隔时间(分钟)
...
...
@@ -32,6 +31,20 @@ public class SleepTimeAnalysisVO {
*/
private
String
type
;
/**
* 体动次数
*/
private
Integer
actionCount
;
/**
* 翻身次数
*/
private
Integer
turnedCount
;
/**
* 所属睡眠区间开始时间
*/
private
String
belongToSleepTime
;
private
List
<
SleepTimeAnalysisVO
>
deepList
;
private
List
<
SleepTimeAnalysisVO
>
midList
;
/**
...
...
server-common/src/main/java/com/makeit/utils/msg/sender/WxSpSender.java
View file @
ce1e9c90
...
...
@@ -44,7 +44,7 @@ public class WxSpSender implements IMsgSender{
public
void
send
(
MsgSendDTO
msgDTO
)
{
List
<
MsgSendDTO
.
ReceiverInfo
>
receiverInfos
=
msgDTO
.
getReceiverInfos
();
if
(
CollUtil
.
is
Not
Empty
(
receiverInfos
))
{
if
(
CollUtil
.
isEmpty
(
receiverInfos
))
{
return
;
}
String
content
=
msgDTO
.
getOriContent
();
...
...
server-common/src/main/java/com/makeit/utils/third/wechat/WechatBindDTO.java
0 → 100644
View file @
ce1e9c90
package
com
.
makeit
.
utils
.
third
.
wechat
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @author wangzy
* @description
* @createDate 2024-01-26-14:09
*/
@Data
public
class
WechatBindDTO
{
@ApiModelProperty
(
value
=
"用户id"
)
private
String
id
;
@ApiModelProperty
(
value
=
"微信公众号openid"
)
private
String
weChatOpenid
;
private
String
appid
;
private
String
secret
;
private
String
code
;
private
String
grantType
;
}
server-common/src/main/java/com/makeit/utils/third/wechat/WechatCodeDTO.java
0 → 100644
View file @
ce1e9c90
package
com
.
makeit
.
utils
.
third
.
wechat
;
import
lombok.Data
;
/**
* @author wangzy
* @description
* @createDate 2024-01-30-16:57
*/
@Data
public
class
WechatCodeDTO
{
// {"access_token":"77_hfkGpaiIT8xPltYrmRmrHj_svTcoLKIvR-w_lkR_wWqGHyF1NnZiIvIg0LxnI2rO55U2NqSGpXStYFmwxPE2mO0gNyfUrGvHUMcckrNNM9I",
// "expires_in":7200,
// "refresh_token":"77_MFeHId8uo1EgV6NFlhDiaQMrK6FXGmKcDMfa-BqGOaWr20u-6aM4lkBx1fnsSMrgL5m_Q3Csdw8D4Z3_qmpDj0kZKMXLmTzxosLz2BEqJHs",
// "openid":"o1es866cj4fp2Np9S5rmnbIdSg4U",
// "scope":"snsapi_base"}
private
String
accessToken
;
private
String
openid
;
private
String
scope
;
}
server-common/src/main/java/com/makeit/utils/user/wechat/WechatUserInfo.java
View file @
ce1e9c90
...
...
@@ -56,5 +56,7 @@ public class WechatUserInfo implements Serializable {
private
String
isTenant
;
private
String
weChatOpenid
;
}
server-module/src/main/java/com/makeit/module/controller/children/elder/PlatElderChildrenInfoUserLoginChildrenController.java
View file @
ce1e9c90
...
...
@@ -4,6 +4,7 @@ import com.makeit.common.response.ApiResponseEntity;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.service.wechat.PlatElderChildrenInfoUserLoginWechatService
;
import
com.makeit.utils.third.wechat.WechatBindDTO
;
import
com.makeit.utils.third.wechat.WechatLoginPhoneDTO
;
import
com.makeit.utils.user.wechat.WechatUserInfo
;
import
io.swagger.annotations.Api
;
...
...
@@ -37,4 +38,12 @@ public class PlatElderChildrenInfoUserLoginChildrenController {
return
ApiResponseUtils
.
success
();
}
@ApiOperation
(
value
=
"绑定公众号"
)
@PostMapping
(
value
=
"/bind"
)
@TenantIdIgnore
public
ApiResponseEntity
<
Void
>
bind
(
@RequestBody
WechatBindDTO
dto
)
{
platElderChildrenInfoUserLoginWechatService
.
bind
(
dto
);
return
ApiResponseUtils
.
success
();
}
}
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderSleepController.java
View file @
ce1e9c90
...
...
@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import
com.makeit.common.response.ApiResponseEntity
;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO
;
import
com.makeit.entity.platform.elder.ElderSleepAnalysisVO
;
import
com.makeit.entity.platform.elder.PlatElderBreatheAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.external.huineng.HuiNengService
;
...
...
@@ -73,7 +74,7 @@ public class PlatElderSleepController {
@GetMapping
(
"test4"
)
@AuthIgnore
@TenantIdIgnore
public
ApiResponseEntity
<
List
<
PlatElderSleepAnalysis
>>
elderSleepSleepAnalysisTask
(
@RequestParam
Integer
month
,
public
ApiResponseEntity
<
List
<
ElderSleepAnalysisVO
>>
elderSleepSleepAnalysisTask
(
@RequestParam
Integer
month
,
@RequestParam
Integer
day
)
{
return
ApiResponseUtils
.
success
(
platElderSleepService
.
elderSleepSleepAnalysisTask
(
month
,
day
));
}
...
...
server-service/src/main/java/com/makeit/dto/SaveLogDTO.java
0 → 100644
View file @
ce1e9c90
package
com
.
makeit
.
dto
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:42
*/
@Data
public
class
SaveLogDTO
{
@JsonProperty
(
"messageType"
)
private
String
messageType
;
@JsonProperty
(
"deviceId"
)
private
String
deviceId
;
@JsonProperty
(
"reportTime"
)
private
LocalDateTime
reportTime
;
@JsonProperty
(
"createdTime"
)
private
LocalDateTime
createdTime
;
@JsonProperty
(
"br"
)
private
Integer
br
;
@JsonProperty
(
"bodyMove"
)
private
Integer
bodyMove
;
@JsonProperty
(
"personState"
)
private
Integer
personState
;
@JsonProperty
(
"person"
)
private
Integer
person
;
@JsonProperty
(
"hr"
)
private
Integer
hr
;
}
server-service/src/main/java/com/makeit/entity/saas/PlatTenant.java
View file @
ce1e9c90
...
...
@@ -45,7 +45,7 @@ public class PlatTenant extends BaseEntity {
private
String
menuList
;
/**
* 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单
* 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单
6-微信公众号
*/
private
String
alertChannel
;
...
...
server-service/src/main/java/com/makeit/mapper/platform/auth/PlatOrgMapper.java
View file @
ce1e9c90
...
...
@@ -2,7 +2,10 @@ package com.makeit.mapper.platform.auth;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.makeit.dto.SaveLogDTO
;
import
com.makeit.entity.platform.auth.PlatOrg
;
import
com.makeit.module.iot.vo.analysis.AnalysisVO
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
...
...
@@ -15,4 +18,10 @@ import java.util.List;
public
interface
PlatOrgMapper
extends
BaseMapper
<
PlatOrg
>
{
List
<
PlatOrg
>
getSelfAndParents
(
String
id
);
void
insertBatch
(
@Param
(
"list"
)
List
<
SaveLogDTO
>
saveList
);
void
saveBatch
(
@Param
(
"list"
)
List
<
AnalysisVO
>
list
);
List
<
AnalysisVO
>
getData
();
}
server-service/src/main/java/com/makeit/mapper/platform/elder/PlatElderChildrenInfoMapper.java
View file @
ce1e9c90
...
...
@@ -2,6 +2,9 @@ package com.makeit.mapper.platform.elder;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.makeit.entity.platform.elder.PlatElderChildrenInfo
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
* <p>
...
...
@@ -13,4 +16,5 @@ import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
*/
public
interface
PlatElderChildrenInfoMapper
extends
BaseMapper
<
PlatElderChildrenInfo
>
{
List
<
PlatElderChildrenInfo
>
list
(
@Param
(
"tenantId"
)
String
tenantId
,
@Param
(
"elderIds"
)
String
elderIds
);
}
server-service/src/main/java/com/makeit/service/platform/alarm/alarmStrategy/OffBedAlarm.java
View file @
ce1e9c90
package
com
.
makeit
.
service
.
platform
.
alarm
.
alarmStrategy
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.json.JSONUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.makeit.dto.platform.alarm.PlatAlarmCheckDTO
;
import
com.makeit.dto.platform.alarm.PlatAlarmConfigOffBedDTOVO
;
...
...
@@ -27,6 +28,7 @@ import java.time.*;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@Component
@Slf4j
...
...
@@ -315,6 +317,9 @@ public class OffBedAlarm implements IAlarm {
return
;
}
// PlatRoom platRoom = platAlarmCheckDTO.getPlatRoom();
log
.
info
(
"离床告警配置,发出告警,设备id:{},长者名称:{},config_id:{},configL{}"
,
platDevice
.
getId
(),
JSONUtil
.
toJsonStr
(
platElderList
),
config
.
getId
(),
config
.
getRuleConfig
());
platElderList
=
platElderList
.
stream
().
distinct
().
collect
(
Collectors
.
toList
());
for
(
PlatElder
platElder
:
platElderList
)
{
List
<
String
>
param
=
new
ArrayList
<>();
// param.add(platRoom.getName());
...
...
server-service/src/main/java/com/makeit/service/platform/alarm/impl/PlatAlarmRecordServiceImpl.java
View file @
ce1e9c90
...
...
@@ -33,6 +33,7 @@ import com.makeit.enums.report.PlatformTypeEnum;
import
com.makeit.exception.BusinessException
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper
;
import
com.makeit.mapper.platform.elder.PlatElderChildrenInfoMapper
;
import
com.makeit.module.iot.service.IotDevicePropertiesOperateService
;
import
com.makeit.service.platform.alarm.PlatAlarmConfigService
;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
...
...
@@ -67,6 +68,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.regex.Matcher
;
...
...
@@ -113,6 +115,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
private
ShengwangService
shengwangService
;
@Autowired
private
IotDevicePropertiesOperateService
iotDevicePropertiesOperateService
;
@Resource
private
PlatElderChildrenInfoMapper
platElderChildrenInfoMapper
;
@Override
...
...
@@ -316,27 +320,27 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
List
<
PlatElderChildrenInfo
>
allChildInfoList
=
new
ArrayList
<>();
//通知每个长者的子女
LambdaQueryWrapper
<
PlatElderChildrenInfo
>
childrenInfoLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
childrenInfoLambdaQueryWrapper
.
eq
(
BaseBusEntity:
:
getTenantId
,
alarmConfig
.
getTenantId
());
childrenInfoLambdaQueryWrapper
.
and
(
qw
->
qw
.
apply
(
"find_in_set('"
+
elderIds
+
"',elder_id)"
));
List
<
PlatElderChildrenInfo
>
childrenInfoList
=
platElderChildrenInfoService
.
list
(
childrenInfoLambdaQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
childrenInfoList
))
{
throw
new
BusinessException
(
"子女端账号未绑定长者,长者id:"
+
elderIds
);
}
allChildInfoList
.
addAll
(
childrenInfoList
);
Set
<
String
>
phoneSet
=
childrenInfoList
.
stream
().
map
(
PlatElderChildrenInfo:
:
getPhone
).
collect
(
Collectors
.
toSet
());
//告警配置和租户告警 字典一致
List
<
SendTypeEnum
>
notifyChannelList
=
Arrays
.
asList
(
SendTypeEnum
.
SMS
,
SendTypeEnum
.
VOICE_SMS
,
SendTypeEnum
.
CHILD_WECHAT
);
List
<
MsgSendDTO
.
ReceiverInfo
>
receiverInfos
=
buildReceiverInfo
(
allChildInfoList
,
alarmRecord
);
//发送消息
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
null
,
notifyChannelList
,
receiverInfos
);
String
childIdJoin
=
allChildInfoList
.
stream
().
map
(
BaseEntity:
:
getId
).
collect
(
Collectors
.
joining
(
","
));
//通知的子女
alarmConfig
.
setNotifyRelation
(
childIdJoin
);
alarmRecord
.
setNoticeStatus
(
CommonEnum
.
YES
.
getValue
());
alarmRecord
.
setTenantId
(
alarmConfig
.
getTenantId
());
saveOrUpdate
(
alarmRecord
);
LambdaQueryWrapper
<
PlatElderChildrenInfo
>
childrenInfoLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
childrenInfoLambdaQueryWrapper
.
eq
(
BaseBusEntity:
:
getTenantId
,
alarmConfig
.
getTenantId
());
childrenInfoLambdaQueryWrapper
.
and
(
qw
->
qw
.
apply
(
"find_in_set('"
+
elderIds
+
"',elder_id)"
));
List
<
PlatElderChildrenInfo
>
childrenInfoList
=
platElderChildrenInfoService
.
list
(
childrenInfoLambdaQueryWrapper
);
if
(
CollectionUtils
.
isEmpty
(
childrenInfoList
))
{
throw
new
BusinessException
(
"子女端账号未绑定长者,长者id:"
+
elderIds
);
}
allChildInfoList
.
addAll
(
childrenInfoList
);
Set
<
String
>
phoneSet
=
childrenInfoList
.
stream
().
map
(
PlatElderChildrenInfo:
:
getPhone
).
collect
(
Collectors
.
toSet
());
//告警配置和租户告警 字典一致 todo SendTypeEnum.CHILD_WECHAT 公众号模板未好
List
<
SendTypeEnum
>
notifyChannelList
=
Arrays
.
asList
(
SendTypeEnum
.
SMS
,
SendTypeEnum
.
VOICE_SMS
);
List
<
MsgSendDTO
.
ReceiverInfo
>
receiverInfos
=
buildReceiverInfo
(
allChildInfoList
,
alarmRecord
);
//发送消息
noticeByChannel
(
alarmConfig
,
alarmRecord
,
phoneSet
,
null
,
notifyChannelList
,
receiverInfos
);
String
childIdJoin
=
allChildInfoList
.
stream
().
map
(
BaseEntity:
:
getId
).
collect
(
Collectors
.
joining
(
","
));
//通知的子女
alarmConfig
.
setNotifyRelation
(
childIdJoin
);
alarmRecord
.
setNoticeStatus
(
CommonEnum
.
YES
.
getValue
());
alarmRecord
.
setTenantId
(
alarmConfig
.
getTenantId
());
saveOrUpdate
(
alarmRecord
);
}
...
...
@@ -347,10 +351,14 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
return
list
;
}
childInfoList
.
forEach
(
c
->
{
if
(
StrUtil
.
isBlank
(
c
.
getWeChatOpenid
()))
{
return
;
}
MsgSendDTO
.
ReceiverInfo
receiverInfo
=
new
MsgSendDTO
.
ReceiverInfo
();
receiverInfo
.
setRegionName
(
alarmRecord
.
getRegionName
());
receiverInfo
.
setName
(
c
.
getName
());
receiverInfo
.
setWeChatOpenid
(
c
.
getWeChatOpenid
());
list
.
add
(
receiverInfo
);
});
return
list
;
}
...
...
@@ -414,21 +422,33 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
*/
private
void
noticeByChannel
(
PlatAlarmConfig
alarmConfig
,
PlatAlarmRecord
alarmRecord
,
Set
<
String
>
phoneSet
,
Set
<
String
>
emailSet
,
List
<
SendTypeEnum
>
notifyChannelList
,
List
<
MsgSendDTO
.
ReceiverInfo
>
receiverInfos
)
{
log
.
info
(
"开始短信通知:{}"
,
JSON
.
toJSONString
(
alarmConfig
));
String
elderName
=
alarmRecord
.
getElderName
();
log
.
info
(
"开始短信通知:{},老人:{}"
,
JSON
.
toJSONString
(
alarmConfig
),
elderName
);
if
(
StrUtil
.
isNotBlank
(
alarmRecord
.
getElderIds
())
&&
StrUtil
.
isBlank
(
elderName
))
{
List
<
PlatElder
>
platElders
=
platElderService
.
listByIds
(
Arrays
.
asList
(
alarmRecord
.
getElderIds
().
split
(
","
)));
elderName
=
platElders
.
stream
().
map
(
PlatElder:
:
getName
).
collect
(
Collectors
.
joining
(
","
));
log
.
info
(
"开始短信通知--通知老人:{}"
,
elderName
);
}
String
notifyChannel
=
alarmConfig
.
getNotifyChannel
();
if
(
StringUtils
.
isEmpty
(
notifyChannel
)){
return
;
if
(
StringUtils
.
isEmpty
(
notifyChannel
))
{
// 微信公众号
notifyChannel
=
"6"
;
}
else
{
notifyChannel
=
notifyChannel
+
",6"
;
}
PlatTenant
platTenant
=
platTenantService
.
getById
(
alarmConfig
.
getTenantId
());
if
(
platTenant
==
null
)
{
if
(
platTenant
==
null
||
!
"1"
.
equals
(
platTenant
.
getStatus
()))
{
return
;
}
String
alertChannel
=
platTenant
.
getAlertChannel
();
if
(
StringUtils
.
isBlank
(
alertChannel
)){
return
;
if
(
StringUtils
.
isBlank
(
alertChannel
))
{
// 微信公众号
alertChannel
=
"6"
;
}
else
{
alertChannel
=
alertChannel
+
",6"
;
}
String
[]
tenantChannels
=
alertChannel
.
split
(
","
);
List
<
String
>
tenantChannelList
=
Arrays
.
asList
(
tenantChannels
);
List
<
String
>
tenantChannelList
=
Lists
.
newArrayList
(
Arrays
.
asList
(
tenantChannels
)
);
String
[]
split
=
notifyChannel
.
split
(
","
);
for
(
String
sendType
:
split
)
{
//租户告警渠道 没配置的 就不发送
...
...
@@ -444,24 +464,24 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
msgSendDTO
.
setEmailSet
(
emailSet
);
msgSendDTO
.
setOriContent
(
alarmRecord
.
getContent
());
msgSendDTO
.
setSubject
(
alarmRecord
.
getContent
());
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
);
msgSendDTO
.
setParam
(
elderName
);
msgSendDTO
.
setReceiverInfos
(
receiverInfos
);
String
alarmType
=
alarmConfig
.
getAlarmType
();
//告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常 5 离床异常
if
(
StringUtils
.
equals
(
alarmType
,
"1"
))
{
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
,
alarmRecord
.
getRegionName
());
msgSendDTO
.
setParam
(
elderName
,
alarmRecord
.
getRegionName
());
}
if
(
StringUtils
.
equals
(
alarmType
,
"2"
))
{
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
,
alarmRecord
.
getRemark
());
msgSendDTO
.
setParam
(
elderName
,
alarmRecord
.
getRemark
());
}
if
(
StringUtils
.
equals
(
alarmType
,
"3"
))
{
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
,
alarmRecord
.
getRemark
());
msgSendDTO
.
setParam
(
elderName
,
alarmRecord
.
getRemark
());
}
if
(
StringUtils
.
equals
(
alarmType
,
"4"
))
{
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
,
alarmRecord
.
getRegionName
());
msgSendDTO
.
setParam
(
elderName
,
alarmRecord
.
getRegionName
());
}
if
(
StringUtils
.
equals
(
alarmType
,
"5"
))
{
msgSendDTO
.
setParam
(
alarmRecord
.
getElderName
()
,
""
);
msgSendDTO
.
setParam
(
elderName
,
""
);
}
msgSendDTO
.
setAlarmType
(
alarmConfig
.
getAlarmType
());
//todo 小程序消息
...
...
server-service/src/main/java/com/makeit/service/platform/elder/DeviceLogService.java
0 → 100644
View file @
ce1e9c90
package
com
.
makeit
.
service
.
platform
.
elder
;
import
com.makeit.module.iot.vo.DeviceOperationLogEntity
;
import
com.makeit.module.iot.vo.analysis.AnalysisVO
;
import
java.util.List
;
import
java.util.TreeMap
;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
public
interface
DeviceLogService
{
void
save
(
List
<
DeviceOperationLogEntity
>
list
);
void
saveEntity
(
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
,
String
id
);
TreeMap
<
String
,
AnalysisVO
>
getData
();
void
fillDefaultData
(
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
,
Integer
month
,
Integer
day
);
}
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderSleepService.java
View file @
ce1e9c90
package
com
.
makeit
.
service
.
platform
.
elder
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.makeit.entity.platform.elder.ElderSleepAnalysisVO
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
java.util.List
;
...
...
@@ -17,7 +17,7 @@ import java.util.List;
*/
public
interface
PlatElderSleepService
extends
IService
<
PlatElderSleep
>
{
List
<
PlatElderSleepAnalysis
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
);
List
<
ElderSleepAnalysisVO
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
);
String
calculateScores
(
long
daySleepTime
,
long
dayRestTime
,
long
deepTime
,
long
soberTime
,
long
lightTime
,
SaasSleepEvaluateStandardReport
evaluateStandardReport
);
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/DeviceLogServiceImpl.java
0 → 100644
View file @
ce1e9c90
package
com
.
makeit
.
service
.
platform
.
elder
.
impl
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DateUtil
;
import
com.google.common.collect.Lists
;
import
com.makeit.dto.SaveLogDTO
;
import
com.makeit.exception.BusinessException
;
import
com.makeit.mapper.platform.auth.PlatOrgMapper
;
import
com.makeit.module.iot.vo.DeviceOperationLogEntity
;
import
com.makeit.module.iot.vo.analysis.AnalysisVO
;
import
com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe
;
import
com.makeit.service.platform.elder.DeviceLogService
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
import
java.time.Instant
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.time.ZoneOffset
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.TreeMap
;
import
java.util.stream.Collectors
;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
@Service
public
class
DeviceLogServiceImpl
implements
DeviceLogService
{
@Resource
private
PlatOrgMapper
platOrgMapper
;
@Override
public
void
save
(
List
<
DeviceOperationLogEntity
>
list
)
{
if
(
CollUtil
.
isEmpty
(
list
))
{
return
;
}
DateTimeFormatter
fmt
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm"
);
List
<
SaveLogDTO
>
saveList
=
new
ArrayList
<>();
list
.
forEach
(
l
->
{
SaveLogDTO
saveLogDTO
=
new
SaveLogDTO
();
long
timestamp
=
l
.
getTimestamp
();
String
time
=
formatLongTime
(
timestamp
);
saveLogDTO
.
setReportTime
(
LocalDateTime
.
parse
(
time
,
fmt
));
saveLogDTO
.
setCreatedTime
(
longToTime
(
timestamp
));
DeviceInfoContentBreathe
deviceInfoContentBreathe
=
JsonUtil
.
toObj
((
String
)
l
.
getContent
(),
DeviceInfoContentBreathe
.
class
);
DeviceInfoContentBreathe
.
Properties
properties
=
deviceInfoContentBreathe
.
getProperties
();
saveLogDTO
.
setBodyMove
(
properties
.
getBodymove
());
saveLogDTO
.
setBr
(
properties
.
getBr
());
saveLogDTO
.
setDeviceId
(
deviceInfoContentBreathe
.
getDeviceId
());
saveLogDTO
.
setHr
(
properties
.
getHr
());
saveLogDTO
.
setPerson
(
properties
.
getPerson
());
saveLogDTO
.
setMessageType
(
deviceInfoContentBreathe
.
getMessageType
());
saveLogDTO
.
setPersonState
(
properties
.
getPersonState
());
saveList
.
add
(
saveLogDTO
);
});
platOrgMapper
.
insertBatch
(
saveList
);
}
private
static
final
DateTimeFormatter
DEFAULT_FORMATTER
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm"
);
public
static
String
formatLongTime
(
long
time
)
{
return
DEFAULT_FORMATTER
.
format
(
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
time
),
ZoneId
.
systemDefault
()));
}
private
LocalDateTime
longToTime
(
Long
longTime
)
{
return
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
longTime
),
ZoneOffset
.
of
(
"+8"
));
}
@Override
public
void
saveEntity
(
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
,
String
id
)
{
List
<
AnalysisVO
>
list
=
new
ArrayList
<>();
statisticsMap
.
forEach
((
k
,
v
)
->
{
v
.
setCreatedTime
(
k
);
v
.
setDeviceId
(
id
);
list
.
add
(
v
);
});
platOrgMapper
.
saveBatch
(
list
);
}
@Override
public
TreeMap
<
String
,
AnalysisVO
>
getData
()
{
List
<
AnalysisVO
>
data
=
platOrgMapper
.
getData
();
LinkedHashMap
<
String
,
AnalysisVO
>
collect1
=
data
.
stream
().
collect
(
Collectors
.
toMap
(
AnalysisVO:
:
getCreatedTime
,
a
->
a
,
(
u
,
v
)
->
{
throw
new
BusinessException
(
String
.
format
(
"Duplicate key %s"
,
u
));
},
LinkedHashMap:
:
new
));
TreeMap
<
String
,
AnalysisVO
>
result
=
new
TreeMap
<>();
collect1
.
forEach
(
result:
:
put
);
getDayMinute
(
1
,
10
).
forEach
(
minute
->
{
boolean
key
=
result
.
containsKey
(
minute
);
if
(!
key
)
{
AnalysisVO
analysisVO
=
buildDefaultData
(
minute
);
result
.
put
(
minute
,
analysisVO
);
}
});
return
result
;
}
public
static
List
<
String
>
getDayMinute
(
Integer
month
,
Integer
day
)
{
List
<
String
>
list
=
Lists
.
newArrayList
();
LocalDateTime
of1
=
LocalDateTime
.
of
(
2024
,
month
,
day
,
8
,
0
);
LocalDateTime
now
=
of1
.
plusDays
(-
1
);
for
(
int
i
=
0
;
i
<
24
;
i
++)
{
int
hour
=
now
.
getHour
();
for
(
int
j
=
0
;
j
<
60
;
j
++)
{
LocalDateTime
of
=
LocalDateTime
.
of
(
2024
,
1
,
now
.
getDayOfMonth
(),
hour
,
j
);
list
.
add
(
DateUtil
.
format
(
of
,
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
));
}
now
=
now
.
plusHours
(
1
);
}
list
.
add
(
DateUtil
.
format
(
of1
,
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
));
return
list
;
}
@Override
public
void
fillDefaultData
(
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
,
Integer
month
,
Integer
day
)
{
List
<
String
>
dayMinute
=
getDayMinute
(
month
,
day
);
dayMinute
.
forEach
(
minute
->
{
boolean
key
=
statisticsMap
.
containsKey
(
minute
);
if
(!
key
)
{
AnalysisVO
analysisVO
=
buildDefaultData
(
minute
);
statisticsMap
.
put
(
minute
,
analysisVO
);
}
});
}
private
AnalysisVO
buildDefaultData
(
String
minute
)
{
AnalysisVO
analysisVO
=
new
AnalysisVO
();
analysisVO
.
setTotalHr
(
0
);
analysisVO
.
setAvgHr
(
0
);
analysisVO
.
setMaxHr
(
0
);
analysisVO
.
setMinHr
(
0
);
analysisVO
.
setTotalBr
(
0
);
analysisVO
.
setAvgBr
(
0
);
analysisVO
.
setMaxBr
(
0
);
analysisVO
.
setMinBr
(
0
);
analysisVO
.
setHrBrCount
(
0
);
analysisVO
.
setActionCount
(
0
);
analysisVO
.
setTurnedCount
(
0
);
analysisVO
.
setIsAction
(
false
);
analysisVO
.
setIsMoveBed
(
true
);
analysisVO
.
setIsMinuteActionFlag
(
false
);
analysisVO
.
setAwakeMinuteActionFlag
(
false
);
analysisVO
.
setCreatedTime
(
minute
);
return
analysisVO
;
}
}
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportDayServiceImpl.java
View file @
ce1e9c90
...
...
@@ -11,13 +11,15 @@ import com.makeit.dto.platform.elder.PlatElderReportDTO;
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.*
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderBreatheAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
com.makeit.enums.CommonEnum
;
import
com.makeit.enums.platform.alarm.PlatAlarmConfigEnum
;
import
com.makeit.enums.report.SleepTypeEnum
;
import
com.makeit.module.iot.service.IotProductDeviceService
;
import
com.makeit.module.iot.vo.analysis.EvaluateReportVO
;
import
com.makeit.module.iot.vo.fall.DeviceInfoContentFall
;
import
com.makeit.module.iot.vo.space.DeviceInfoContentSpace
;
import
com.makeit.service.platform.alarm.PlatAlarmRecordService
;
...
...
@@ -134,14 +136,12 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
}
// String sleepScore = platElderSleepAnalysis.getSleepScore();
Long
sleepScore
=
getSleepScore
(
platElderSleepAnalysis
);
// Long sleepScore = getSleepScore(platElderSleepAnalysis);
// EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
EvaluateReportVO
evaluateReport
=
sleepEvaluateReportService
.
getByScore
(
sleepScore
);
platElderSleepEvaluationVO
.
setScore
(
Integer
.
valueOf
(
sleepScore
+
""
));
platElderSleepEvaluationVO
.
setScore
(
Integer
.
parseInt
(
platElderSleepAnalysis
.
getSleepScore
()));
platElderSleepEvaluationVO
.
setResult
(
platElderSleepAnalysis
.
getSleepResult
());
platElderSleepEvaluationVO
.
setEvaluation
(
evaluateReport
.
get
Evaluate
());
platElderSleepEvaluationVO
.
setEvaluation
(
platElderSleepAnalysis
.
getSleep
Evaluate
());
platElderSleepEvaluationVO
.
setSleepDuration
(
Integer
.
valueOf
(
platElderSleepAnalysis
.
getSleepTime
()
+
""
));
platElderSleepEvaluationVO
.
setRestDuration
(
Integer
.
valueOf
(
platElderSleepAnalysis
.
getRestTime
()
+
""
));
...
...
@@ -218,7 +218,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
.
orderByAsc
(
PlatElderSleep:
:
getStartSleep
)
);
setWakeUp
(
sleepList
);
//
setWakeUp(sleepList);
voList
=
StreamUtil
.
map
(
sleepList
,
e
->
{
PlatElderSleepDiagramVO
vo
=
new
PlatElderSleepDiagramVO
();
...
...
@@ -235,6 +235,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
return
contentVO
;
});
contentList
=
contentList
.
stream
().
filter
(
f
->
!
"resting"
.
equals
(
f
.
getSleepType
())).
collect
(
Collectors
.
toList
());
vo
.
setContentList
(
contentList
);
return
vo
;
});
...
...
@@ -242,29 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
return
voList
;
}
private
void
setWakeUp
(
List
<
PlatElderSleep
>
sleepList
)
{
if
(
CollUtil
.
isEmpty
(
sleepList
))
{
return
;
}
List
<
PlatElderSleep
>
sleeps
=
sleepList
.
stream
().
filter
(
f
->
f
.
getElderSleepType
().
equals
(
SleepTypeEnum
.
SLEEP
.
getType
())).
collect
(
Collectors
.
toList
());
if
(
CollUtil
.
isEmpty
(
sleeps
))
{
return
;
}
List
<
PlatElderSleep
>
wakeUpList
=
sleepList
.
stream
().
filter
(
f
->
f
.
getElderSleepType
().
equals
(
SleepTypeEnum
.
GETUP
.
getType
())).
collect
(
Collectors
.
toList
());
sleeps
.
forEach
(
s
->
{
List
<
PlatElderSleep
>
wakeList
=
wakeUpList
.
stream
().
filter
(
f
->
f
.
getStartSleep
().
isAfter
(
s
.
getEndSleep
())).
collect
(
Collectors
.
toList
());
if
(
CollUtil
.
isNotEmpty
(
wakeList
))
{
final
long
[]
minute
=
{
24
*
60
};
wakeList
.
forEach
(
w
->
{
long
between
=
Duration
.
between
(
s
.
getEndSleep
(),
w
.
getStartSleep
()).
toMinutes
();
if
(
between
<
minute
[
0
])
{
minute
[
0
]
=
between
;
s
.
setWakeUpTime
(
w
.
getStartSleep
());
}
});
}
});
}
@Override
public
PlatElderHeartRespiratoryEvaluationVO
heartRespiratoryEvaluation
(
PlatElderReportDTO
platElderIdDTO
)
{
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportWeekServiceImpl.java
View file @
ce1e9c90
...
...
@@ -33,11 +33,7 @@ import java.math.BigDecimal;
import
java.time.*
;
import
java.time.format.DateTimeFormatter
;
import
java.time.temporal.TemporalAdjusters
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.function.Function
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Service
...
...
@@ -267,9 +263,7 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
Map
<
Integer
,
Map
<
String
,
List
<
PlatElderSleep
>>>
sleepMap
=
sleepList
.
stream
().
collect
(
Collectors
.
groupingBy
(
PlatElderSleep:
:
getElderSleepType
,
Collectors
.
groupingBy
(
PlatElderSleep:
:
getHappenDate
)));
Map
<
String
,
PlatElderSleepAnalysis
>
sleepAnalysisMap
=
sleepAnalysisList
.
stream
().
collect
(
Collectors
.
toMap
(
PlatElderSleepAnalysis:
:
getHappenDate
,
Function
.
identity
(),(
v1
,
v2
)->
v1
));
// Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMap(sleepAnalysisList, PlatElderSleepAnalysis::getHappenDate);
Map
<
String
,
PlatElderSleepAnalysis
>
sleepAnalysisMap
=
StreamUtil
.
toMapDep
(
sleepAnalysisList
,
PlatElderSleepAnalysis:
:
getHappenDate
);
List
<
LocalDate
>
dateList
=
LocalDateTimeUtils
.
getDateSeries
(
weekStartDate
,
weekEndDate
);
DateTimeFormatter
timeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm"
);
...
...
@@ -277,8 +271,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List
<
PlatElderSleepDiagramWeekContentVO
>
sleep
=
StreamUtil
.
map
(
dateList
,
e
->
{
PlatElderSleepDiagramWeekContentVO
vo
=
new
PlatElderSleepDiagramWeekContentVO
();
vo
.
setDay
(
e
);
List
<
PlatElderSleep
>
list
=
Optional
.
ofNullable
(
sleep
Map
.
get
(
1
)).
map
(
i
->
i
.
get
(
dateTimeFormatter
.
format
(
e
))).
orElse
(
new
ArrayList
<>(
10
));
Map
<
String
,
List
<
PlatElderSleep
>>
sleepListMap
=
Optional
.
ofNullable
(
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP
.
getType
())).
orElse
(
new
HashMap
<>());
List
<
PlatElderSleep
>
list
=
Optional
.
ofNullable
(
sleep
ListMap
.
get
(
dateTimeFormatter
.
format
(
e
))).
orElse
(
new
ArrayList
<>(
));
List
<
PlatSleepRangeVO
>
sleepRecord
=
list
.
stream
().
flatMap
(
i
->
i
.
getSleepRecord
().
stream
()).
collect
(
Collectors
.
toList
());
...
...
@@ -289,8 +283,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List
<
PlatElderSleepDiagramWeekContentVO
>
rest
=
StreamUtil
.
map
(
dateList
,
e
->
{
PlatElderSleepDiagramWeekContentVO
vo
=
new
PlatElderSleepDiagramWeekContentVO
();
vo
.
setDay
(
e
);
List
<
PlatElderSleep
>
list
=
Optional
.
ofNullable
(
sleepMap
.
get
(
2
)).
map
(
i
->
i
.
get
(
dateTimeFormatter
.
format
(
e
))).
orElse
(
new
ArrayList
<>(
10
));
Map
<
String
,
List
<
PlatElderSleep
>>
restListMap
=
Optional
.
ofNullable
(
sleepMap
.
get
(
SleepTypeEnum
.
RESTING
.
getType
())).
orElse
(
new
HashMap
<>());
List
<
PlatElderSleep
>
list
=
Optional
.
ofNullable
(
restListMap
.
get
(
dateTimeFormatter
.
format
(
e
))).
orElse
(
new
ArrayList
<>(
10
));
List
<
PlatSleepRangeVO
>
sleepRecord
=
list
.
stream
().
flatMap
(
i
->
Optional
.
ofNullable
(
i
.
getSleepRecord
()).
orElse
(
new
ArrayList
<>(
10
)).
stream
()).
collect
(
Collectors
.
toList
());
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderSleepServiceImpl.java
View file @
ce1e9c90
package
com
.
makeit
.
service
.
platform
.
elder
.
impl
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.makeit.common.entity.BaseEntity
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.ElderSleepAnalysisVO
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.platform.space.PlatRoomBedDevice
;
import
com.makeit.entity.saas.analysis.SaasSleepAnalysisModel
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
com.makeit.enums.report.ElderSleepType
;
import
com.makeit.enums.report.SleepTypeEnum
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.mapper.platform.elder.PlatElderSleepMapper
;
...
...
@@ -24,22 +28,29 @@ import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import
com.makeit.module.iot.vo.analysis.*
;
import
com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe
;
import
com.makeit.service.platform.device.PlatDeviceService
;
import
com.makeit.service.platform.elder.*
;
import
com.makeit.service.platform.elder.DeviceLogService
;
import
com.makeit.service.platform.elder.PlatElderService
;
import
com.makeit.service.platform.elder.PlatElderSleepAnalysisService
;
import
com.makeit.service.platform.elder.PlatElderSleepService
;
import
com.makeit.service.platform.space.PlatRoomBedDeviceService
;
import
com.makeit.service.saas.*
;
import
com.makeit.service.saas.SaasSleepAnalysisModelService
;
import
com.makeit.service.saas.SaasSleepEvaluateReportService
;
import
com.makeit.service.saas.SaasSleepEvaluateStandardReportService
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
com.makeit.utils.data.convert.StreamUtil
;
import
com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
java.time.*
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
...
...
@@ -61,12 +72,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired
private
SaasSleepEvaluateReportService
saasSleepEvaluateReportService
;
@Autowired
private
SaasElderReportConfigService
saasElderReportConfigService
;
@Autowired
private
SaasSleepEvaluateStandardReportService
saasSleepEvaluateStandardReportService
;
@Autowired
private
SaasDiseaseModelService
saasDiseaseModelService
;
@Autowired
private
IotProductDeviceService
productDeviceService
;
@Autowired
private
PlatRoomBedDeviceService
roomBedDeviceService
;
...
...
@@ -77,647 +84,884 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired
private
PlatElderSleepAnalysisService
platElderSleepAnalysisService
;
@Autowired
private
PlatElderBreatheDayStatService
platElderBreatheDayStatService
;
@Autowired
private
PlatElderSleepService
platElderSleepService
;
@Resource
private
DeviceLogService
deviceLogService
;
@Autowired
private
PlatElderReportMonthService
platElderReportMonthService
;
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
@TenantIdIgnore
public
List
<
PlatElderSleepAnalysis
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
)
{
List
<
String
>
dayHourRangeList
=
getLastDayHourRange
(
month
,
day
);
String
currentDate
=
LocalDate
.
now
().
minusDays
(
1
).
toString
();
if
(
month
!=
null
&&
day
!=
null
){
currentDate
=
LocalDate
.
of
(
2024
,
month
,
day
).
minusDays
(
1
).
toString
();
}
SaasSleepAnalysisModel
analysisModel
=
saasSleepAnalysisModelService
.
getOne
(
new
QueryWrapper
<
SaasSleepAnalysisModel
>().
lambda
()
.
orderByDesc
(
BaseEntity:
:
getCreateBy
)
.
last
(
"limit 1"
));
List
<
PlatRoomBedDevice
>
platRoomBedDeviceList
=
roomBedDeviceService
.
list
(
new
QueryWrapper
<
PlatRoomBedDevice
>()
.
lambda
().
isNotNull
(
PlatRoomBedDevice:
:
getBedId
));
private
TreeMap
<
String
,
AnalysisVO
>
getPerMinuteData
(
Map
<
String
,
List
<
DeviceInfoContentBreathe
>>
minuteMap
,
SaasSleepAnalysisModel
analysisModel
)
{
Integer
actionThreshold
=
Integer
.
valueOf
(
analysisModel
.
getActionThreshold
());
int
turnedThreshold
=
Integer
.
parseInt
(
analysisModel
.
getTurnedThreshold
());
int
sleepTimeActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepTimeActionThreshold
());
double
sleepTimeActionDuration
=
Double
.
parseDouble
(
analysisModel
.
getSleepTimeActionDuration
());
Integer
actionThreshold
=
Integer
.
valueOf
(
analysisModel
.
getActionThreshold
());
// 每分钟大于30秒体动值 大于(50)
int
riseActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionThreshold
());
int
riseActionDuration
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionDuration
());
double
riseLeaveThreshold
=
Double
.
parseDouble
(
analysisModel
.
getRiseLeaveThreshold
());
int
awakeThreshold
=
Integer
.
parseInt
(
analysisModel
.
getAwakeThreshold
());
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
=
Maps
.
newTreeMap
();
for
(
Map
.
Entry
<
String
,
List
<
DeviceInfoContentBreathe
>>
entry
:
minuteMap
.
entrySet
())
{
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreathes
=
entry
.
getValue
();
DeviceInfoContentBreathe
.
Properties
breatheProperties
;
int
reportSize
=
deviceInfoContentBreathes
.
size
();
// 记录总呼吸率和总心率
int
maxBr
=
0
;
int
minBr
=
0
;
int
maxHr
=
0
;
int
minHr
=
0
;
int
hrBrCount
=
0
;
// 呼吸率心率统计次数
int
totalBr
=
0
;
int
totalHr
=
0
;
Integer
bodymoveCount
=
0
;
// 体动次数
Integer
turnoverCount
=
0
;
// 翻身次数
boolean
isAction
=
false
;
// 每分钟是否动过
AnalysisVO
analysisVO
=
new
AnalysisVO
();
int
getUpBodymoveCount
=
0
;
boolean
isMoveBed
=
false
;
// 清醒每分钟体动是否满足要求 (每分钟体动值大于60或无人)
boolean
awakeMinuteActionFlag
=
false
;
int
noPersonCount
=
0
;
// 无人跳过计数
boolean
isLive
=
false
;
for
(
DeviceInfoContentBreathe
infoContentBreathe
:
deviceInfoContentBreathes
)
{
// 体动指数
breatheProperties
=
infoContentBreathe
.
getProperties
();
Integer
bodyMove
=
breatheProperties
.
getBodymove
();
int
br
=
breatheProperties
.
getBr
();
int
hr
=
breatheProperties
.
getHr
();
Integer
hasPerson
=
breatheProperties
.
getPerson
();
// 0无人,1有人
if
(
hasPerson
==
0
&&
!
isLive
)
{
noPersonCount
++;
isMoveBed
=
true
;
awakeMinuteActionFlag
=
true
;
// continue;
}
if
(
hasPerson
==
1
)
{
totalBr
+=
br
;
totalHr
+=
hr
;
hrBrCount
++;
isMoveBed
=
false
;
isLive
=
true
;
}
// 0和255直接跳过
if
(
breatheProperties
.
getHr
()
==
255
||
breatheProperties
.
getHr
()
==
0
)
{
noPersonCount
++;
// continue;
}
if
(
breatheProperties
.
getBr
()
==
255
||
breatheProperties
.
getBr
()
==
0
)
{
noPersonCount
++;
// continue;
}
if
(
bodyMove
>
actionThreshold
)
{
bodymoveCount
++;
}
if
(
bodyMove
>
turnedThreshold
)
{
turnoverCount
++;
}
// 判断入睡时间的体动阈值
if
(
bodyMove
>=
sleepTimeActionThreshold
)
{
isAction
=
true
;
}
// 起床每分钟体动次数
if
(
bodyMove
>
riseActionThreshold
)
{
getUpBodymoveCount
++;
}
// 清醒
if
(
bodyMove
>
awakeThreshold
)
{
awakeMinuteActionFlag
=
true
;
}
if
(
br
>
maxBr
)
{
maxBr
=
br
;
}
if
(
minBr
==
0
)
{
minBr
=
br
;
}
else
if
(
br
<
minBr
)
{
minBr
=
br
;
}
if
(
hr
>
maxHr
)
{
maxHr
=
hr
;
}
if
(
minHr
==
0
)
{
minHr
=
hr
;
}
else
if
(
hr
<
minHr
)
{
minHr
=
hr
;
}
int
sleepDeepActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionThreshold
());
int
sleepDeepActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionTimeBegin
());
int
sleepDeepBreatheMin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMin
());
int
sleepDeepBreatheMax
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMax
());
int
sleepModerateActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionThreshold
());
int
sleepModerateActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionTimeBegin
());
List
<
PlatElderSleepAnalysis
>
result
=
new
ArrayList
<>();
for
(
PlatRoomBedDevice
platRoomBedDevice
:
platRoomBedDeviceList
)
{
TreeMap
<
String
,
AnalysisVO
>
totalMap
=
new
TreeMap
<>();
}
// if (reportSize == noPersonCount) {
// // continue;
// }
// 每分钟的数据
analysisVO
.
setTotalBr
(
totalBr
);
analysisVO
.
setAvgBr
(
totalBr
/
reportSize
);
analysisVO
.
setTotalHr
(
totalHr
);
analysisVO
.
setAvgHr
(
totalHr
/
reportSize
);
analysisVO
.
setMaxBr
(
maxBr
);
analysisVO
.
setMinBr
(
minBr
);
analysisVO
.
setMaxHr
(
maxHr
);
analysisVO
.
setMinHr
(
minHr
);
analysisVO
.
setActionCount
(
bodymoveCount
);
analysisVO
.
setTurnedCount
(
turnoverCount
);
analysisVO
.
setIsAction
(
isAction
);
analysisVO
.
setIsMoveBed
(
isMoveBed
);
analysisVO
.
setIsMinuteActionFlag
(
getUpBodymoveCount
>
30
);
analysisVO
.
setAwakeMinuteActionFlag
(
awakeMinuteActionFlag
);
statisticsMap
.
put
(
entry
.
getKey
(),
analysisVO
);
}
return
statisticsMap
;
}
String
bedId
=
platRoomBedDevice
.
getBedId
();
PlatElder
elder
=
platElderService
.
getOne
(
new
QueryWrapper
<
PlatElder
>().
lambda
()
.
eq
(
PlatElder:
:
getBedId
,
bedId
));
if
(
elder
==
null
)
{
/**
* 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
*
* @param totalMap
* @param sleepTimeActionDuration 体动值持续时间 0.5h
* @param sleepTimeAnalysisVOList
* @return key:开始入睡时间,value:睡眠时间段内的数据
*/
private
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
getFallAsleepData
(
TreeMap
<
String
,
AnalysisVO
>
totalMap
,
double
sleepTimeActionDuration
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
,
SaasSleepAnalysisModel
analysisModel
)
{
String
startSleepTime
=
null
;
String
getUpTime1
=
null
;
String
getUpTime2
=
null
;
String
getUpTime
;
boolean
isSleep
=
false
;
int
moveMinute
=
0
;
int
minuteActionCount
=
0
;
int
sleepMinute
=
0
;
int
riseActionDuration
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionDuration
());
double
riseLeaveThreshold
=
Double
.
parseDouble
(
analysisModel
.
getRiseLeaveThreshold
());
Integer
totalActionCount
=
0
;
Integer
totalTurnedCount
=
0
;
String
lastKey
=
totalMap
.
lastKey
();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
// 非离床且体动值<20
if
(!
analysisVO
.
getIsAction
()
&&
!
analysisVO
.
getIsMoveBed
())
{
if
(
StrUtil
.
isBlank
(
startSleepTime
))
{
startSleepTime
=
entry
.
getKey
();
}
sleepMinute
++;
totalActionCount
+=
analysisVO
.
getActionCount
();
totalTurnedCount
+=
analysisVO
.
getTurnedCount
();
continue
;
}
PlatDevice
platDevice
=
platDeviceService
.
getById
(
platRoomBedDevice
.
getDeviceId
());
if
(
platDevice
==
null
)
{
if
(
StringUtils
.
isEmpty
(
startSleepTime
)
&&
sleepMinute
==
0
)
{
continue
;
}
String
tenantId
=
elder
.
getTenantId
();
for
(
String
hourRange
:
dayHourRangeList
)
{
String
[]
hourRangeArray
=
hourRange
.
split
(
"~"
);
List
<
DeviceOperationLogEntity
>
deviceOperationLogEntities
=
productDeviceService
.
getDeviceLogByTimeRange
(
platDevice
.
getOriDeviceId
(),
"reportProperty"
,
5000
,
hourRangeArray
[
0
],
hourRangeArray
[
1
]);
if
(
CollectionUtils
.
isEmpty
(
deviceOperationLogEntities
))
{
continue
;
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
if
(
sleepMinute
>
sleepTimeActionDuration
*
60
)
{
sleepTimeAnalysisVO
.
setStartTime
(
startSleepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
());
sleepTimeAnalysisVO
.
setActionCount
(
totalActionCount
);
sleepTimeAnalysisVO
.
setTurnedCount
(
totalTurnedCount
);
isSleep
=
true
;
}
getUpTime
=
sleepTimeAnalysisVO
.
getGetUpTime
();
if
(
StrUtil
.
isBlank
(
getUpTime
)
&&
lastKey
.
equals
(
entry
.
getKey
()))
{
getUpTime
=
entry
.
getKey
();
sleepTimeAnalysisVO
.
setGetUpTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setEndTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setRemark
(
"最后一条数据算起床时间"
);
}
// 离床数据计算起床时间
if
(
isSleep
&&
analysisVO
.
getIsMoveBed
())
{
if
(
StrUtil
.
isBlank
(
getUpTime1
))
{
getUpTime1
=
entry
.
getKey
();
}
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreatheList
=
deviceOperationLogEntities
.
stream
()
.
filter
(
deviceOperationLogEntity
->
deviceOperationLogEntity
.
getType
().
contains
(
"reportProperty"
))
.
map
(
deviceOperationLogEntity
->
{
DeviceInfoContentBreathe
deviceInfoContentBreathe
=
JsonUtil
.
toObj
((
String
)
deviceOperationLogEntity
.
getContent
(),
DeviceInfoContentBreathe
.
class
);
assert
deviceInfoContentBreathe
!=
null
;
deviceInfoContentBreathe
.
setReportTime
(
formatLongTime
(
deviceInfoContentBreathe
.
getTimestamp
()));
return
deviceInfoContentBreathe
;
})
.
collect
(
Collectors
.
toList
());
Map
<
String
,
List
<
DeviceInfoContentBreathe
>>
minuteMap
=
StreamUtil
.
groupBy
(
deviceInfoContentBreatheList
,
DeviceInfoContentBreathe:
:
getReportTime
);
deviceOperationLogEntities
.
clear
();
// 统计每小时的体动和翻身
Map
<
String
,
AnalysisVO
>
statisticsMap
=
Maps
.
newHashMap
();
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreathes
;
for
(
Map
.
Entry
<
String
,
List
<
DeviceInfoContentBreathe
>>
entry
:
minuteMap
.
entrySet
())
{
deviceInfoContentBreathes
=
entry
.
getValue
();
DeviceInfoContentBreathe
.
Properties
breatheProperties
;
Integer
bodymove
;
int
reportSize
=
deviceInfoContentBreathes
.
size
();
// 记录总呼吸率和总心率
int
maxBr
=
0
;
int
minBr
=
0
;
int
maxHr
=
0
;
int
minHr
=
0
;
int
hrBrCount
=
0
;
// 呼吸率心率统计次数
int
totalBr
=
0
;
int
totalHr
=
0
;
Integer
bodymoveCount
=
0
;
// 体动次数
Integer
turnoverCount
=
0
;
// 翻身次数
boolean
isAction
=
false
;
// 每分钟是否动过
AnalysisVO
analysisVO
=
new
AnalysisVO
();
int
getUpBodymoveCount
=
0
;
boolean
isMoveBed
=
false
;
boolean
awakeMinuteActionFlag
=
false
;
// 清醒每分钟体动是否满足要求
int
noPersonCount
=
0
;
// 无人跳过计数
int
sleepDeepMinuteCount
=
0
;
// 深睡每分钟体动和翻身次数
int
sleepModerateAMinuteCount
=
0
;
// 中度睡每分钟体动和翻身次数
for
(
DeviceInfoContentBreathe
infoContentBreathe
:
deviceInfoContentBreathes
)
{
// 体动指数
breatheProperties
=
infoContentBreathe
.
getProperties
();
bodymove
=
breatheProperties
.
getBodymove
();
int
br
=
breatheProperties
.
getBr
();
int
hr
=
breatheProperties
.
getHr
();
Integer
hasPerson
=
breatheProperties
.
getPerson
();
// 0无人,1有人
if
(
hasPerson
==
0
)
{
noPersonCount
++;
isMoveBed
=
true
;
continue
;
}
// 0和255直接跳过
if
(
breatheProperties
.
getHr
()
==
255
||
breatheProperties
.
getHr
()
==
0
)
{
noPersonCount
++;
continue
;
}
if
(
breatheProperties
.
getBr
()
==
255
||
breatheProperties
.
getBr
()
==
0
)
{
noPersonCount
++;
continue
;
}
if
(
bodymove
>
actionThreshold
)
{
bodymoveCount
++;
}
if
(
bodymove
>
turnedThreshold
)
{
turnoverCount
++;
}
// 判断入睡时间的体动阈值
if
(
bodymove
>=
sleepTimeActionThreshold
)
{
isAction
=
true
;
}
// 起床每分钟体动次数
if
(
getUpBodymoveCount
>
riseActionThreshold
)
{
getUpBodymoveCount
++;
}
// 清醒
if
(
bodymove
>
awakeThreshold
)
{
awakeMinuteActionFlag
=
true
;
}
if
(
br
>
maxBr
)
{
maxBr
=
br
;
}
if
(
br
<
minBr
)
{
minBr
=
br
;
}
if
(
hr
>
maxHr
)
{
maxHr
=
hr
;
}
if
(
hr
<
minHr
)
{
minHr
=
hr
;
}
if
(
hasPerson
==
1
)
{
totalBr
+=
br
;
totalHr
+=
hr
;
hrBrCount
++;
}
}
if
(
reportSize
==
noPersonCount
)
{
continue
;
}
analysisVO
.
setTotalBr
(
totalBr
);
analysisVO
.
setAvgBr
(
totalBr
/
reportSize
);
analysisVO
.
setTotalHr
(
totalHr
);
analysisVO
.
setAvgHr
(
totalHr
/
reportSize
);
analysisVO
.
setMaxBr
(
maxBr
);
analysisVO
.
setMinBr
(
minBr
);
analysisVO
.
setMaxHr
(
maxHr
);
analysisVO
.
setMinHr
(
minHr
);
analysisVO
.
setActionCount
(
bodymoveCount
);
analysisVO
.
setTurnedCount
(
turnoverCount
);
analysisVO
.
setIsAction
(
isAction
);
analysisVO
.
setIsMoveBed
(
isMoveBed
);
analysisVO
.
setIsMinuteActionFlag
(
getUpBodymoveCount
>
30
);
analysisVO
.
setAwakeMinuteActionFlag
(
awakeMinuteActionFlag
);
statisticsMap
.
put
(
entry
.
getKey
(),
analysisVO
);
LocalDateTime
nowTime
=
LocalDateTime
.
parse
(
entry
.
getKey
(),
DEFAULT_FORMATTER
);
long
between
=
Duration
.
between
(
LocalDateTime
.
parse
(
getUpTime1
,
DEFAULT_FORMATTER
),
nowTime
).
toMinutes
();
// 数据需要连续
if
(
between
==
moveMinute
)
{
moveMinute
++;
}
else
{
moveMinute
=
0
;
getUpTime1
=
null
;
}
TreeMap
<
String
,
AnalysisVO
>
treeMap
=
new
TreeMap
<>(
statisticsMap
);
totalMap
.
putAll
(
treeMap
);
statisticsMap
.
clear
();
treeMap
.
clear
();
}
if
(
totalMap
.
isEmpty
())
{
continue
;
if
(
moveMinute
>
riseLeaveThreshold
*
60
&&
StrUtil
.
isBlank
(
getUpTime
))
{
getUpTime
=
entry
.
getKey
();
sleepTimeAnalysisVO
.
setGetUpTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setEndTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setRemark
(
"离床数据计算起床时间"
);
}
int
totalActionCount
=
0
;
int
totalTurnedCount
=
0
;
// 记录长者不同类型的睡眠时间
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
=
Lists
.
newArrayList
();
SleepTimeAnalysisVO
sleepTimeAnalysisVO
;
// 判断睡觉时间
String
startSleepTime
=
null
;
// 入睡时间开始
int
sleepMinute
=
0
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
if
(!
analysisVO
.
getIsAction
()
&&
!
analysisVO
.
getIsMoveBed
())
{
if
(
StringUtils
.
isEmpty
(
startSleepTime
))
{
startSleepTime
=
entry
.
getKey
();
}
sleepMinute
++;
continue
;
// 体动值计算起床时间
if
(
isSleep
&&
analysisVO
.
getIsMinuteActionFlag
())
{
if
(
StrUtil
.
isBlank
(
getUpTime2
))
{
getUpTime2
=
entry
.
getKey
();
}
if
(
StringUtils
.
isEmpty
(
startSleepTime
)
&&
sleepMinute
==
0
)
{
continue
;
}
if
(
sleepMinute
>
sleepTimeActionDuration
*
60
)
{
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
long
between
=
Duration
.
between
(
LocalDateTime
.
parse
(
getUpTime2
,
DEFAULT_FORMATTER
),
LocalDateTime
.
parse
(
entry
.
getKey
(),
DEFAULT_FORMATTER
)).
toMinutes
();
if
(
between
==
minuteActionCount
)
{
minuteActionCount
++;
}
else
{
minuteActionCount
=
0
;
getUpTime2
=
null
;
}
}
if
(
minuteActionCount
>
riseActionDuration
&&
StrUtil
.
isBlank
(
getUpTime
))
{
getUpTime
=
entry
.
getKey
();
sleepTimeAnalysisVO
.
setGetUpTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setEndTime
(
getUpTime
);
sleepTimeAnalysisVO
.
setRemark
(
"体动值计算起床时间"
);
}
if
(!
isSleep
)
{
startSleepTime
=
null
;
sleepMinute
=
0
;
totalActionCount
=
0
;
totalTurnedCount
=
0
;
}
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
new
TreeMap
<>();
for
(
SleepTimeAnalysisVO
timeAnalysisVO
:
sleepTimeAnalysisVOList
)
{
boolean
startTimeFlag
=
false
;
TreeMap
<
String
,
AnalysisVO
>
sleepTotalMap
=
new
TreeMap
<>();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
if
(
entry
.
getKey
().
equals
(
timeAnalysisVO
.
getStartTime
()))
{
startTimeFlag
=
true
;
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
}
if
(
entry
.
getKey
().
equals
(
timeAnalysisVO
.
getEndTime
()))
{
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
startTimeFlag
=
false
;
}
if
(
startTimeFlag
)
{
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
}
sleepTypeMap
.
put
(
timeAnalysisVO
.
getType
(),
sleepTotalMap
);
}
if
(
isSleep
&&
StrUtil
.
isNotBlank
(
getUpTime
))
{
startSleepTime
=
null
;
sleepMinute
=
0
;
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
getUpTime2
=
null
;
getUpTime1
=
null
;
moveMinute
=
0
;
minuteActionCount
=
0
;
getUpTime
=
null
;
isSleep
=
false
;
totalActionCount
=
0
;
totalTurnedCount
=
0
;
}
// 判断起床时间
String
startGetupTime
=
null
;
// 起床时间开始
int
getupMinute
=
0
;
}
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
new
TreeMap
<>();
if
(
CollUtil
.
isEmpty
(
sleepTimeAnalysisVOList
))
{
return
sleepTypeMap
;
}
for
(
SleepTimeAnalysisVO
timeAnalysisVO
:
sleepTimeAnalysisVOList
)
{
if
(!
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
()))
{
continue
;
}
boolean
startTimeFlag
=
false
;
TreeMap
<
String
,
AnalysisVO
>
sleepTotalMap
=
new
TreeMap
<>();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
String
reportTime
=
entry
.
getKey
();
AnalysisVO
analysisVO
=
entry
.
getValue
();
if
(
analysisVO
.
getIsMoveBed
())
{
if
(
StringUtils
.
isEmpty
(
startGetupTime
))
{
startGetupTime
=
entry
.
getKey
();
}
getupMinute
++;
continue
;
if
(
reportTime
.
equals
(
timeAnalysisVO
.
getStartTime
()))
{
startTimeFlag
=
true
;
sleepTotalMap
.
put
(
reportTime
,
analysisVO
);
}
if
(
StringUtils
.
isEmpty
(
startGetupTime
)
&&
getupMinute
==
0
)
{
continue
;
if
(
reportTime
.
equals
(
timeAnalysisVO
.
getEndTime
()))
{
sleepTotalMap
.
put
(
reportTime
,
analysisVO
);
startTimeFlag
=
false
;
}
if
(
getupMinute
>
riseLeaveThreshold
*
60
)
{
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startGetupTime
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
if
(
startTimeFlag
)
{
sleepTotalMap
.
put
(
reportTime
,
analysisVO
);
}
startGetupTime
=
null
;
getupMinute
=
0
;
sleepTypeMap
.
put
(
timeAnalysisVO
.
getStartTime
(),
sleepTotalMap
);
}
}
return
sleepTypeMap
;
}
// 判断起床时间
String
startGetupTime2
=
null
;
// 起床时间开始
int
getupMinute2
=
0
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
if
(
analysisVO
.
getIsMinuteActionFlag
())
{
if
(
StringUtils
.
isEmpty
(
startGetupTime2
))
{
startGetupTime2
=
entry
.
getKey
();
/**
*
* @param totalMap
*/
private
void
countTotal
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
totalMap
,
SleepCountDTO
sleepCountDTO
)
{
AtomicReference
<
Integer
>
actionCount
=
new
AtomicReference
<>(
0
);
AtomicReference
<
Integer
>
turnedCount
=
new
AtomicReference
<>(
0
);
totalMap
.
forEach
((
k
,
v
)
->
v
.
forEach
((
k2
,
v2
)
->
{
actionCount
.
updateAndGet
(
v1
->
v1
+
v2
.
getActionCount
());
turnedCount
.
updateAndGet
(
v1
->
v1
+
v2
.
getTurnedCount
());
}));
sleepCountDTO
.
setTotalActionCount
(
actionCount
.
get
());
sleepCountDTO
.
setTotalTurnedCount
(
turnedCount
.
get
());
}
/**
* 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private
void
deepSleepData
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
int
sleepDeepActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionThreshold
());
int
sleepDeepActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionTimeBegin
());
int
sleepDeepBreatheMin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMin
());
int
sleepDeepBreatheMax
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMax
());
if
(
CollUtil
.
isEmpty
(
sleepTypeMap
))
{
return
;
}
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
int
sleepDeepMinute
=
0
;
String
startSleepDeepTime
=
null
;
boolean
isDeepSleep
=
false
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
boolean
actionFlag
=
analysisVO
.
getActionCount
()
==
sleepDeepActionThreshold
;
boolean
turnedFlag
=
analysisVO
.
getTurnedCount
()
==
sleepDeepActionThreshold
;
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
boolean
condition
=
actionFlag
&&
turnedFlag
&&
sleepDeepBreatheMin
<=
analysisVO
.
getAvgBr
()
&&
sleepDeepBreatheMax
>=
analysisVO
.
getAvgBr
();
if
(
condition
)
{
if
(
StringUtils
.
isEmpty
(
startSleepDeepTime
))
{
startSleepDeepTime
=
voEntry
.
getKey
();
}
long
between
=
Duration
.
between
(
LocalDateTime
.
parse
(
startSleepDeepTime
,
DEFAULT_FORMATTER
),
LocalDateTime
.
parse
(
voEntry
.
getKey
(),
DEFAULT_FORMATTER
)).
toMinutes
();
// 数据连续
if
(
between
==
sleepDeepMinute
)
{
sleepDeepMinute
++;
}
else
{
if
(
isDeepSleep
)
{
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
}
sleepDeepMinute
=
0
;
startSleepDeepTime
=
null
;
}
getupMinute2
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
start
GetupTime2
)
&&
getupMinute2
==
0
)
{
if
(
StringUtils
.
isEmpty
(
start
SleepDeepTime
)
&&
sleepDeepMinute
==
0
)
{
continue
;
}
if
(
getupMinute2
>
riseActionDuration
)
{
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startGetupTime2
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
startGetupTime2
=
null
;
getupMinute2
=
0
;
}
int
sleepDeepMinute
=
0
;
String
startSleepDeepTime
=
null
;
// 入睡时间开始
// 判断深度睡眠时间
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
totalActionCount
+=
analysisVO
.
getActionCount
();
totalTurnedCount
+=
analysisVO
.
getTurnedCount
();
if
(
analysisVO
.
getActionCount
()
==
sleepDeepActionThreshold
&&
analysisVO
.
getTurnedCount
()
==
sleepDeepActionThreshold
&&
sleepDeepBreatheMin
<=
analysisVO
.
getAvgBr
()
&&
sleepDeepBreatheMax
>=
analysisVO
.
getAvgBr
())
{
if
(
StringUtils
.
isEmpty
(
startSleepDeepTime
))
{
startSleepDeepTime
=
voEntry
.
getKey
();
}
sleepDeepMinute
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startSleepDeepTime
)
&&
sleepDeepMinute
==
0
)
{
continue
;
}
if
(
sleepDeepMinute
>
sleepDeepActionTimeBegin
)
{
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepDeepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
if
(
sleepDeepMinute
>
sleepDeepActionTimeBegin
&&
!
isDeepSleep
)
{
sleepTimeAnalysisVO
.
setStartTime
(
startSleepDeepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
getLastMinute
(
voEntry
.
getKey
()));
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
());
sleepTimeAnalysisVO
.
setBelongToSleepTime
(
key
);
isDeepSleep
=
true
;
}
String
endTime
=
sleepTimeAnalysisVO
.
getEndTime
();
if
(
isDeepSleep
&&
StrUtil
.
isNotBlank
(
endTime
))
{
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
startSleepDeepTime
=
null
;
sleepDeepMinute
=
0
;
isDeepSleep
=
false
;
}
}
}
}
private
String
getLastMinute
(
String
minute
)
{
LocalDateTime
parse
=
LocalDateTime
.
parse
(
minute
,
DEFAULT_FORMATTER
);
return
DateUtil
.
format
(
parse
.
plusMinutes
(-
1
),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
);
}
private
SleepCountDTO
deepSleepAndRestData
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
String
startSleepDeepTime
;
int
napThreshold
=
Integer
.
parseInt
(
analysisModel
.
getNapThreshold
());
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
daySleepMap
=
new
TreeMap
<>();
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
restSleepMap
=
new
TreeMap
<>();
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
// 每分钟的数据
int
sleepMinute
=
sleepMap
.
size
();
Map
.
Entry
<
String
,
AnalysisVO
>
lastEntry
=
sleepMap
.
lastEntry
();
startSleepDeepTime
=
entry
.
getKey
();
// 睡眠:深度睡眠和浅度睡眠>3小时
if
(
sleepMinute
>
napThreshold
*
60
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepDeepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
lastEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
daySleepMap
.
put
(
startSleepDeepTime
,
sleepMap
);
}
// 小憩:深度睡眠和浅度睡眠<=3小时,且2小时内无再次入睡
if
(
sleepMinute
<=
napThreshold
*
60
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepDeepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
lastEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
RESTING
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
restSleepMap
.
put
(
startSleepDeepTime
,
sleepMap
);
}
}
SleepCountDTO
sleepCountDTO
=
new
SleepCountDTO
();
sleepCountDTO
.
setDaySleepMap
(
daySleepMap
);
sleepCountDTO
.
setRestSleepMap
(
restSleepMap
);
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
allSleepMap
=
new
TreeMap
<>();
if
(
CollUtil
.
isNotEmpty
(
daySleepMap
))
{
allSleepMap
.
putAll
(
daySleepMap
);
}
if
(
CollUtil
.
isNotEmpty
(
restSleepMap
))
{
allSleepMap
.
putAll
(
restSleepMap
);
}
sleepCountDTO
.
setAllSleepMap
(
allSleepMap
);
return
sleepCountDTO
;
}
// 中度睡眠
/**
* 中度睡眠(体动和翻身次数10分钟内小于3次)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private
void
middleSleep
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
//3次
int
sleepModerateActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionThreshold
());
// 10minute
int
sleepModerateActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionTimeBegin
());
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
int
sleepMidMinute
=
0
;
String
startSleepMidTime
=
null
;
// 入睡时间开始
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
if
(
analysisVO
.
getActionCount
()
<
sleepModerateActionThreshold
&&
analysisVO
.
getTurnedCount
()
<
sleepModerateActionThreshold
)
{
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
))
{
startSleepMidTime
=
voEntry
.
getKey
();
}
sleepMidMinute
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
)
&&
sleepMidMinute
==
0
)
{
continue
;
}
if
(
sleepMidMinute
>
sleepModerateActionTimeBegin
)
{
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepMidTime
);
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
int
size
=
0
;
String
startSleepMidTime
=
null
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
String
key1
=
voEntry
.
getKey
();
Integer
actionCount
=
analysisVO
.
getActionCount
();
Integer
turnedCount
=
analysisVO
.
getTurnedCount
();
boolean
isAction
=
actionCount
>
sleepModerateActionThreshold
;
boolean
isTurned
=
turnedCount
>
sleepModerateActionThreshold
;
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
size
++;
long
between
=
0
;
if
(
startSleepMidTime
!=
null
)
{
between
=
Duration
.
between
(
LocalDateTime
.
parse
(
startSleepMidTime
,
DEFAULT_FORMATTER
),
LocalDateTime
.
parse
(
key1
,
DEFAULT_FORMATTER
)).
toMinutes
();
}
if
(!
isAction
&&
!
isTurned
)
{
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
))
{
startSleepMidTime
=
key1
;
}
sleepMidMinute
+=
actionCount
;
sleepMidMinute
+=
turnedCount
;
}
else
{
sleepMidMinute
=
0
;
startSleepMidTime
=
null
;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
)
&&
sleepMidMinute
==
0
)
{
continue
;
}
boolean
condition
=
sleepMidMinute
>=
sleepModerateActionThreshold
&&
between
>
sleepModerateActionTimeBegin
;
if
(
condition
||
size
==
sleepMap
.
size
()
-
1
)
{
sleepTimeAnalysisVO
.
setStartTime
(
startSleepMidTime
);
sleepTimeAnalysisVO
.
setEndTime
(
key1
);
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
());
sleepTimeAnalysisVO
.
setBelongToSleepTime
(
key
);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
startSleepMidTime
=
null
;
sleepMidMinute
=
0
;
}
}
}
}
// 清醒
/**
* 清醒(每分钟体动值大于60或无人)
*
* @param sleepTypeMap
* @param sleepTimeAnalysisVOList
*/
private
void
sober
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
String
key
=
entry
.
getKey
();
int
awakeMinute
=
0
;
String
startAwakeTime
=
null
;
// 入睡时间开始
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
if
(
analysisVO
.
getAwakeMinuteActionFlag
()
||
analysisVO
.
getIsMoveBed
())
{
if
(
StringUtils
.
isEmpty
(
startAwakeTime
))
{
startAwakeTime
=
voEntry
.
getKey
();
}
awakeMinute
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startAwakeTime
)
&&
awakeMinute
==
0
)
{
continue
;
String
startAwakeTime
=
null
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
if
(
analysisVO
.
getAwakeMinuteActionFlag
()
||
analysisVO
.
getIsMoveBed
())
{
if
(
StringUtils
.
isEmpty
(
startAwakeTime
))
{
startAwakeTime
=
voEntry
.
getKey
();
}
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
awakeMinute
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startAwakeTime
)
&&
awakeMinute
==
0
)
{
continue
;
}
if
(
StrUtil
.
isNotBlank
(
startAwakeTime
)
&&
awakeMinute
>
0
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startAwakeTime
);
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SOBER
.
getCode
());
sleepTimeAnalysisVO
.
setBelongToSleepTime
(
key
);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
startAwakeTime
=
null
;
awakeMinute
=
0
;
}
startAwakeTime
=
null
;
awakeMinute
=
0
;
}
}
}
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
sleepMap
=
StreamUtil
.
groupBy
(
sleepTimeAnalysisVOList
,
SleepTimeAnalysisVO:
:
getType
);
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP
.
getCode
());
if
(
CollectionUtils
.
isEmpty
(
sleepList
))
{
continue
;
private
SleepTimeDTO
groupSleepData
(
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
sleepTimeAnalysisVOList
.
forEach
(
s
->
{
Long
durationRange
=
getDurationRange
(
s
.
getStartTime
(),
s
.
getEndTime
());
s
.
setInterval
(
durationRange
);
});
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
sleepMap
=
StreamUtil
.
groupBy
(
sleepTimeAnalysisVOList
,
SleepTimeAnalysisVO:
:
getType
);
List
<
SleepTimeAnalysisVO
>
daySleepList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
SLEEP
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
deepList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
moderateList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
getUpList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
GETUP
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
soberList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
SOBER
.
getCode
(),
new
ArrayList
<>());
List
<
SleepTimeAnalysisVO
>
restList
=
sleepMap
.
getOrDefault
(
SleepTypeEnum
.
RESTING
.
getCode
(),
new
ArrayList
<>());
SleepTimeDTO
sleepTimeDTO
=
new
SleepTimeDTO
();
sleepTimeDTO
.
setDeepList
(
deepList
);
sleepTimeDTO
.
setMidList
(
moderateList
);
sleepTimeDTO
.
setSoberList
(
soberList
);
sleepTimeDTO
.
setSleepList
(
sleepList
);
sleepTimeDTO
.
setGetUpList
(
getUpList
);
sleepTimeDTO
.
setDaySleepList
(
daySleepList
);
sleepTimeDTO
.
setRestList
(
restList
);
sleepTimeDTO
.
setLightList
(
setLightSleepList
(
deepList
,
moderateList
,
restList
,
sleepList
));
return
sleepTimeDTO
;
}
/**
* 获取浅度睡眠
* @param deepList
* @param moderateList
* @param restList
* @param sleepList
* @return
*/
private
List
<
SleepTimeAnalysisVO
>
setLightSleepList
(
List
<
SleepTimeAnalysisVO
>
deepList
,
List
<
SleepTimeAnalysisVO
>
moderateList
,
List
<
SleepTimeAnalysisVO
>
restList
,
List
<
SleepTimeAnalysisVO
>
sleepList
)
{
List
<
SleepTimeAnalysisVO
>
result
=
new
ArrayList
<>();
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
deepMap
=
deepList
.
stream
().
collect
(
Collectors
.
groupingBy
(
SleepTimeAnalysisVO:
:
getBelongToSleepTime
));
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
moderMap
=
moderateList
.
stream
().
collect
(
Collectors
.
groupingBy
(
SleepTimeAnalysisVO:
:
getBelongToSleepTime
));
if
(
CollUtil
.
isNotEmpty
(
sleepList
))
{
buildLightList
(
sleepList
,
result
,
deepMap
,
moderMap
);
}
if
(
CollUtil
.
isNotEmpty
(
restList
))
{
buildLightList
(
restList
,
result
,
deepMap
,
moderMap
);
}
return
result
;
}
private
void
buildLightList
(
List
<
SleepTimeAnalysisVO
>
list
,
List
<
SleepTimeAnalysisVO
>
result
,
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
deepMap
,
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
moderMap
)
{
list
.
forEach
(
s
->
{
LocalDateTime
startTime
=
LocalDateTime
.
parse
(
s
.
getStartTime
(),
DEFAULT_FORMATTER
);
LocalDateTime
endTime
=
LocalDateTime
.
parse
(
s
.
getEndTime
(),
DEFAULT_FORMATTER
);
List
<
LocalDateTime
>
rangeTimes
=
getRangeTime
(
startTime
,
endTime
);
List
<
SleepTimeAnalysisVO
>
deeps
=
deepMap
.
get
(
s
.
getStartTime
());
List
<
LocalDateTime
>
removeList
=
new
ArrayList
<>();
if
(
CollUtil
.
isNotEmpty
(
deeps
))
{
deeps
.
forEach
(
d
->
CollUtil
.
addAll
(
removeList
,
getRangeTime
(
startTime
,
endTime
)));
}
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型
List
<
SleepTimeAnalysisVO
>
finalSleepTimeAnalysisList
=
Lists
.
newArrayList
();
// 记录多端睡眠记录
SleepTimeAnalysisVO
sleepTimeAnalysis
;
for
(
int
i
=
0
;
i
<
sleepList
.
size
();
i
++)
{
sleepTimeAnalysis
=
new
SleepTimeAnalysisVO
();
List
<
SleepTimeAnalysisVO
>
deepList
=
Lists
.
newArrayList
();
List
<
SleepTimeAnalysisVO
>
midList
=
Lists
.
newArrayList
();
List
<
SleepTimeAnalysisVO
>
lightList
=
Lists
.
newArrayList
();
List
<
SleepTimeAnalysisVO
>
soberList
=
Lists
.
newArrayList
();
SleepTimeAnalysisVO
timeAnalysisVO
=
sleepList
.
get
(
i
);
BeanUtils
.
copyProperties
(
timeAnalysisVO
,
sleepTimeAnalysis
);
String
startTime
=
timeAnalysisVO
.
getStartTime
();
String
endTime
=
timeAnalysisVO
.
getEndTime
();
Long
durationRange
=
getDurationRange
(
timeAnalysisVO
.
getStartTime
(),
timeAnalysisVO
.
getEndTime
());
timeAnalysisVO
.
setInterval
(
durationRange
);
LocalDateTime
startDateTime
=
LocalDateTime
.
parse
(
startTime
,
DEFAULT_FORMATTER
);
LocalDateTime
endDateTime
=
LocalDateTime
.
parse
(
endTime
,
DEFAULT_FORMATTER
);
boolean
lightSleepFlag
=
true
;
// 如果不满足下面条件,就默认都是浅睡
for
(
SleepTimeAnalysisVO
otherSleepTime
:
sleepTimeAnalysisVOList
)
{
if
(
otherSleepTime
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP
.
getCode
())
||
otherSleepTime
.
getType
().
equals
(
SleepTypeEnum
.
GETUP
.
getCode
()))
{
continue
;
}
String
deepStartTime
=
otherSleepTime
.
getStartTime
();
String
deepEndTime
=
otherSleepTime
.
getEndTime
();
LocalDateTime
startDeepDateTime
=
LocalDateTime
.
parse
(
deepStartTime
,
DEFAULT_FORMATTER
);
LocalDateTime
endDeepDateTime
=
LocalDateTime
.
parse
(
deepEndTime
,
DEFAULT_FORMATTER
);
if
((
startDateTime
.
isBefore
(
startDeepDateTime
)
||
startDateTime
.
equals
(
startDeepDateTime
))
&&
(
endDateTime
.
isAfter
(
endDeepDateTime
)
||
endDateTime
.
equals
(
endDeepDateTime
)))
{
if
(
otherSleepTime
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
()))
{
deepList
.
add
(
otherSleepTime
);
}
else
if
(
otherSleepTime
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
()))
{
midList
.
add
(
otherSleepTime
);
}
else
if
(
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
SOBER
.
getCode
()))
{
soberList
.
add
(
otherSleepTime
);
}
else
{
otherSleepTime
.
setType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
());
lightList
.
add
(
otherSleepTime
);
}
lightSleepFlag
=
false
;
}
}
if
(
lightSleepFlag
)
{
SleepTimeAnalysisVO
lightSleepTime
=
new
SleepTimeAnalysisVO
();
lightSleepTime
.
setType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
());
lightSleepTime
.
setStartTime
(
startTime
);
lightSleepTime
.
setEndTime
(
endTime
);
lightList
.
add
(
lightSleepTime
);
}
sleepTimeAnalysis
.
setDeepList
(
deepList
);
sleepTimeAnalysis
.
setInterval
(
durationRange
);
sleepTimeAnalysis
.
setMidList
(
midList
);
sleepTimeAnalysis
.
setLightList
(
lightList
);
sleepTimeAnalysis
.
setSoberList
(
soberList
);
finalSleepTimeAnalysisList
.
add
(
sleepTimeAnalysis
);
}
SaasSleepEvaluateStandardReport
evaluateStandardReport
=
saasSleepEvaluateStandardReportService
.
getOne
(
new
QueryWrapper
<
SaasSleepEvaluateStandardReport
>().
lambda
()
.
orderByDesc
(
BaseEntity:
:
getCreateDate
)
.
last
(
"limit 1"
));
// 算出每一段睡觉的不同睡眠类型的时间段
SaasSleepEvaluateStandardReportVO
saasSleepEvaluateStandardReportVO
=
new
SaasSleepEvaluateStandardReportVO
();
List
<
PlatElderSleep
>
elderSleepList
=
Lists
.
newArrayList
();
PlatSleepRangeVO
sleepRangeVO
;
for
(
SleepTimeAnalysisVO
timeAnalysisVO
:
finalSleepTimeAnalysisList
)
{
List
<
PlatSleepRangeVO
>
sleepRangeVOList
=
Lists
.
newArrayList
();
PlatElderSleep
elderSleep
=
new
PlatElderSleep
();
for
(
SleepTimeAnalysisVO
analysisVO
:
timeAnalysisVO
.
getDeepList
())
{
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
sleepRangeVOList
.
add
(
sleepRangeVO
);
}
for
(
SleepTimeAnalysisVO
analysisVO
:
timeAnalysisVO
.
getMidList
())
{
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
sleepRangeVOList
.
add
(
sleepRangeVO
);
}
for
(
SleepTimeAnalysisVO
analysisVO
:
timeAnalysisVO
.
getLightList
())
{
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
sleepRangeVOList
.
add
(
sleepRangeVO
);
}
for
(
SleepTimeAnalysisVO
analysisVO
:
timeAnalysisVO
.
getSoberList
())
{
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
sleepRangeVOList
.
add
(
sleepRangeVO
);
}
elderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
timeAnalysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
elderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
timeAnalysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
if
(
timeAnalysisVO
.
getInterval
()
/
60
>
3
)
{
elderSleep
.
setElderSleepType
(
ElderSleepType
.
SLEEP
.
getCode
());
}
else
{
elderSleep
.
setElderSleepType
(
ElderSleepType
.
REST
.
getCode
());
}
elderSleep
.
setInterval
(
timeAnalysisVO
.
getInterval
());
elderSleep
.
setSleepRecord
(
sleepRangeVOList
);
elderSleepList
.
add
(
elderSleep
);
List
<
SleepTimeAnalysisVO
>
moder
=
moderMap
.
get
(
s
.
getStartTime
());
if
(
CollUtil
.
isNotEmpty
(
moder
))
{
moder
.
forEach
(
d
->
CollUtil
.
addAll
(
removeList
,
getRangeTime
(
startTime
,
endTime
)));
}
if
(
CollUtil
.
isNotEmpty
(
removeList
))
{
rangeTimes
.
removeAll
(
removeList
);
}
result
.
addAll
(
getLightList
(
rangeTimes
));
});
}
private
List
<
SleepTimeAnalysisVO
>
getLightList
(
List
<
LocalDateTime
>
rangeTimes
)
{
List
<
SleepTimeAnalysisVO
>
result
=
new
ArrayList
<>();
LocalDateTime
startTime
=
null
;
long
count
=
0
;
for
(
int
i
=
0
;
i
<
rangeTimes
.
size
();
i
++)
{
LocalDateTime
time
=
rangeTimes
.
get
(
i
);
if
(
startTime
==
null
)
{
startTime
=
time
;
}
long
minutes
=
Duration
.
between
(
startTime
,
time
).
toMinutes
();
if
(
minutes
!=
count
)
{
SleepTimeAnalysisVO
analysisVO
=
new
SleepTimeAnalysisVO
();
analysisVO
.
setBelongToSleepTime
(
DateUtil
.
format
(
startTime
,
DatePattern
.
NORM_DATETIME_PATTERN
));
analysisVO
.
setStartTime
(
DateUtil
.
format
(
startTime
,
DatePattern
.
NORM_DATETIME_PATTERN
));
analysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
());
analysisVO
.
setEndTime
(
DateUtil
.
format
(
rangeTimes
.
get
(
i
-
1
),
DatePattern
.
NORM_DATETIME_PATTERN
));
analysisVO
.
setInterval
(
count
-
1
);
result
.
add
(
analysisVO
);
startTime
=
time
;
count
=
1
;
}
else
{
count
++;
}
if
(
i
==
rangeTimes
.
size
()
-
1
&&
startTime
!=
null
)
{
SleepTimeAnalysisVO
analysisVO
=
new
SleepTimeAnalysisVO
();
analysisVO
.
setBelongToSleepTime
(
DateUtil
.
format
(
startTime
,
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
));
analysisVO
.
setStartTime
(
DateUtil
.
format
(
startTime
,
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
));
analysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
());
analysisVO
.
setEndTime
(
DateUtil
.
format
(
rangeTimes
.
get
(
i
),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
));
analysisVO
.
setInterval
(
count
-
1
);
result
.
add
(
analysisVO
);
}
}
return
result
;
}
// 获取睡眠评估标准配置
String
sleepDeepConfig
=
evaluateStandardReport
.
getSleepDeepConfig
();
String
soberConfig
=
evaluateStandardReport
.
getSoberConfig
();
String
sleepTimeConfig
=
evaluateStandardReport
.
getSleepTime
();
String
lightnessConfig
=
evaluateStandardReport
.
getSleepLightnessConfig
();
List
<
SleepConfigVO
>
sleepDeepConfigList
=
JSON
.
parseArray
(
sleepDeepConfig
,
SleepConfigVO
.
class
);
List
<
SleepConfigVO
>
soberConfigList
=
JSON
.
parseArray
(
soberConfig
,
SleepConfigVO
.
class
);
List
<
SleepConfigVO
>
sleepTimeConfigList
=
JSON
.
parseArray
(
sleepTimeConfig
,
SleepConfigVO
.
class
);
SleepConfigVO
lightnessConfigVO
=
JSON
.
parseObject
(
lightnessConfig
,
SleepConfigVO
.
class
);
long
deepTime
=
0
;
long
soberTime
=
0
;
long
soberCount
=
0
;
long
sleepTime
=
0
;
long
lightTime
=
0
;
// 算出不同睡眠类型的总时长
for
(
SleepTimeAnalysisVO
timeAnalysisVO
:
sleepTimeAnalysisVOList
)
{
Long
durationRange
=
getDurationRange
(
timeAnalysisVO
.
getStartTime
(),
timeAnalysisVO
.
getEndTime
());
timeAnalysisVO
.
setInterval
(
durationRange
);
if
(
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
()))
{
deepTime
+=
durationRange
;
}
if
(
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
SOBER
.
getCode
()))
{
soberTime
+=
durationRange
;
}
if
(
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
()))
{
lightTime
+=
durationRange
;
soberCount
++;
}
if
(
timeAnalysisVO
.
getType
().
equals
(
SleepTypeEnum
.
SLEEP
.
getCode
()))
{
sleepTime
+=
durationRange
;
}
}
long
deepScore
=
0
;
for
(
int
i
=
0
;
i
<
sleepDeepConfigList
.
size
();
i
++)
{
long
hour
=
deepTime
/
60
;
SleepConfigVO
sleepConfigVO
=
sleepDeepConfigList
.
get
(
i
);
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
if
(
i
==
0
&&
Objects
.
equals
(
hour
,
configHour
))
{
deepScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
}
if
(
i
>
0
&&
hour
>
configHour
)
{
deepScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
}
}
saasSleepEvaluateStandardReportVO
.
setDeepScore
(
deepScore
);
long
soberScore
=
0
;
for
(
int
i
=
0
;
i
<
soberConfigList
.
size
();
i
++)
{
SleepConfigVO
sleepConfigVO
=
soberConfigList
.
get
(
i
);
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
if
(
i
==
0
&&
soberCount
!=
0
)
{
soberScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
())
*
soberCount
;
}
if
(
i
>
0
&&
soberTime
>
configHour
)
{
soberScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
}
}
saasSleepEvaluateStandardReportVO
.
setSoberScore
(
soberScore
);
long
lightScore
=
0
;
long
lightHour
=
lightTime
/
60
;
long
lightnessConfigHour
=
Long
.
parseLong
(
lightnessConfigVO
.
getHour
());
if
(
Objects
.
equals
(
lightHour
,
lightnessConfigHour
))
{
lightScore
=
Long
.
parseLong
(
lightnessConfigVO
.
getScore
());
}
saasSleepEvaluateStandardReportVO
.
setLightScore
(
lightScore
);
long
sleepScore
=
0
;
for
(
int
i
=
0
;
i
<
sleepTimeConfigList
.
size
();
i
++)
{
long
hour
=
sleepTime
/
60
;
SleepConfigVO
sleepConfigVO
=
sleepTimeConfigList
.
get
(
i
);
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
if
(
i
==
0
&&
Objects
.
equals
(
hour
,
configHour
))
{
sleepScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
}
if
(
i
>
0
&&
hour
>
configHour
)
{
sleepScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
}
}
saasSleepEvaluateStandardReportVO
.
setSleepScore
(
sleepScore
);
long
totalScore
=
sleepScore
+
deepScore
+
lightScore
-
soberScore
;
saasSleepEvaluateStandardReportVO
.
setTotalScore
(
totalScore
);
// 记录长者一天睡眠的记录
long
daySleepTime
=
0
;
long
dayRestTime
=
0
;
for
(
PlatElderSleep
elderSleep
:
elderSleepList
)
{
elderSleep
.
setElderId
(
elder
.
getId
());
elderSleep
.
setHappenDate
(
currentDate
);
elderSleep
.
setTenantId
(
tenantId
);
if
(
ElderSleepType
.
SLEEP
.
getCode
()
==
elderSleep
.
getElderSleepType
())
{
daySleepTime
+=
elderSleep
.
getInterval
();
}
if
(
ElderSleepType
.
REST
.
getCode
()
==
elderSleep
.
getElderSleepType
())
{
dayRestTime
+=
elderSleep
.
getInterval
();
}
}
int
riseRepeatThreshold
=
Integer
.
parseInt
(
analysisModel
.
getRiseRepeatThreshold
());
platElderSleepService
.
saveBatch
(
elderSleepList
);
String
score
=
calculateScores
(
daySleepTime
,
dayRestTime
,
deepTime
,
soberTime
,
lightTime
,
evaluateStandardReport
);
EvaluateReportVO
sleepReport
=
saasSleepEvaluateReportService
.
getByScore
(
Long
.
parseLong
(
score
));
// 长者一天的睡眠分析
PlatElderSleepAnalysis
elderSleepAnalysis
=
new
PlatElderSleepAnalysis
();
elderSleepAnalysis
.
setElderId
(
elder
.
getId
());
elderSleepAnalysis
.
setActionCount
(
totalActionCount
);
elderSleepAnalysis
.
setTurnedCount
(
totalTurnedCount
);
elderSleepAnalysis
.
setHappenDate
(
currentDate
);
elderSleepAnalysis
.
setSleepScore
(
score
);
elderSleepAnalysis
.
setSleepTime
(
String
.
valueOf
(
daySleepTime
));
elderSleepAnalysis
.
setRestTime
(
String
.
valueOf
(
dayRestTime
));
elderSleepAnalysis
.
setSleepResult
(
sleepReport
.
getResult
());
elderSleepAnalysis
.
setTenantId
(
tenantId
);
elderSleepAnalysis
.
setSleepEvaluate
(
sleepReport
.
getEvaluate
());
elderSleepAnalysis
.
setOriDeviceId
(
platDevice
.
getOriDeviceId
());
result
.
add
(
elderSleepAnalysis
);
platElderSleepAnalysisService
.
save
(
elderSleepAnalysis
);
private
List
<
LocalDateTime
>
getRangeTime
(
LocalDateTime
startTime
,
LocalDateTime
endTime
)
{
List
<
LocalDateTime
>
result
=
new
ArrayList
<>();
long
minutes
=
Duration
.
between
(
startTime
,
endTime
).
toMinutes
();
for
(
int
i
=
0
;
i
<
minutes
+
1
;
i
++)
{
result
.
add
(
startTime
.
plusMinutes
(
i
));
}
return
result
;
}
private
PlatElderSleepAnalysis
savePlatElderSleepAnalysis
(
SleepTimeDTO
sleepTimeDTO
,
SaasSleepEvaluateStandardReport
evaluateStandardReport
,
String
elderId
,
String
currentDate
,
SleepCountDTO
sleepCountDTO
,
String
tenantId
,
String
oriDeviceId
)
{
SleepTimeMinuteDTO
sleepTimeMinute
=
getSleepTimeMinute
(
sleepTimeDTO
);
long
daySleepTime
=
sleepTimeMinute
.
getDaySleepTime
()
!=
null
?
sleepTimeMinute
.
getDaySleepTime
()
:
0L
;
long
deepTime
=
sleepTimeMinute
.
getDeepTime
()
!=
null
?
sleepTimeMinute
.
getDeepTime
()
:
0L
;
long
dayRestTime
=
sleepTimeMinute
.
getDayRestTime
()
!=
null
?
sleepTimeMinute
.
getDayRestTime
()
:
0L
;
long
soberTime
=
sleepTimeMinute
.
getSoberTime
()
!=
null
?
sleepTimeMinute
.
getSoberTime
()
:
0L
;
long
lightTime
=
sleepTimeMinute
.
getLightTime
()
!=
null
?
sleepTimeMinute
.
getLightTime
()
:
0L
;
String
score
=
calculateScores
(
daySleepTime
,
dayRestTime
,
deepTime
,
soberTime
,
lightTime
,
evaluateStandardReport
);
long
scoreLong
=
Long
.
parseLong
(
score
);
if
(
scoreLong
>
100
)
{
scoreLong
=
100
;
}
if
(
scoreLong
<
0
)
{
scoreLong
=
0
;
}
EvaluateReportVO
sleepReport
=
saasSleepEvaluateReportService
.
getByScore
(
scoreLong
);
// 长者一天的睡眠分析
PlatElderSleepAnalysis
elderSleepAnalysis
=
new
PlatElderSleepAnalysis
();
elderSleepAnalysis
.
setElderId
(
elderId
);
elderSleepAnalysis
.
setActionCount
(
sleepCountDTO
.
getTotalActionCount
());
elderSleepAnalysis
.
setTurnedCount
(
sleepCountDTO
.
getTotalTurnedCount
());
elderSleepAnalysis
.
setHappenDate
(
currentDate
);
elderSleepAnalysis
.
setSleepScore
(
String
.
valueOf
(
scoreLong
));
elderSleepAnalysis
.
setSleepTime
(
String
.
valueOf
(
daySleepTime
));
elderSleepAnalysis
.
setRestTime
(
String
.
valueOf
(
dayRestTime
));
elderSleepAnalysis
.
setSleepResult
(
sleepReport
.
getResult
());
elderSleepAnalysis
.
setTenantId
(
tenantId
);
elderSleepAnalysis
.
setSleepEvaluate
(
sleepReport
.
getEvaluate
());
elderSleepAnalysis
.
setOriDeviceId
(
oriDeviceId
);
platElderSleepAnalysisService
.
remove
(
Wrappers
.<
PlatElderSleepAnalysis
>
lambdaQuery
()
.
eq
(
PlatElderSleepAnalysis:
:
getHappenDate
,
currentDate
).
eq
(
PlatElderSleepAnalysis:
:
getElderId
,
elderId
));
platElderSleepAnalysisService
.
save
(
elderSleepAnalysis
);
return
elderSleepAnalysis
;
}
private
List
<
PlatElderSleep
>
saveElderSleep
(
SleepTimeDTO
sleepTimeDTO
,
String
platElderId
,
String
tenantId
,
String
currentDate
)
{
List
<
PlatElderSleep
>
elderSleepList
=
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
deepList
=
sleepTimeDTO
.
getDeepList
();
List
<
SleepTimeAnalysisVO
>
moderateList
=
sleepTimeDTO
.
getMidList
();
List
<
SleepTimeAnalysisVO
>
lightList
=
sleepTimeDTO
.
getLightList
();
List
<
SleepTimeAnalysisVO
>
soberList
=
sleepTimeDTO
.
getSoberList
();
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepTimeDTO
.
getSleepList
();
List
<
SleepTimeAnalysisVO
>
restList
=
sleepTimeDTO
.
getRestList
();
List
<
PlatSleepRangeVO
>
sleepRangeList
=
new
ArrayList
<>();
if
(
CollUtil
.
isNotEmpty
(
deepList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
deepList
)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
());
sleepRangeVO
.
setBelongToSleepTime
(
analysisVO
.
getBelongToSleepTime
());
sleepRangeList
.
add
(
sleepRangeVO
);
}
}
if
(
CollUtil
.
isNotEmpty
(
moderateList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
sleepTimeDTO
.
getMidList
())
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
());
sleepRangeVO
.
setBelongToSleepTime
(
analysisVO
.
getBelongToSleepTime
());
sleepRangeList
.
add
(
sleepRangeVO
);
}
}
if
(
CollUtil
.
isNotEmpty
(
lightList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
lightList
)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getCode
());
sleepRangeVO
.
setBelongToSleepTime
(
analysisVO
.
getBelongToSleepTime
());
sleepRangeList
.
add
(
sleepRangeVO
);
}
}
if
(
CollUtil
.
isNotEmpty
(
soberList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
soberList
)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
SleepTypeEnum
.
SOBER
.
getCode
());
sleepRangeVO
.
setBelongToSleepTime
(
analysisVO
.
getBelongToSleepTime
());
sleepRangeList
.
add
(
sleepRangeVO
);
}
}
List
<
SleepTimeAnalysisVO
>
getUpList
=
sleepTimeDTO
.
getGetUpList
();
if
(
CollUtil
.
isNotEmpty
(
getUpList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
getUpList
)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepRangeVO
.
setBelongToSleepTime
(
analysisVO
.
getBelongToSleepTime
());
sleepRangeList
.
add
(
sleepRangeVO
);
}
}
Map
<
String
,
List
<
PlatSleepRangeVO
>>
rangeMap
=
sleepRangeList
.
stream
().
collect
(
Collectors
.
groupingBy
(
PlatSleepRangeVO:
:
getBelongToSleepTime
));
if
(
CollUtil
.
isNotEmpty
(
sleepList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
sleepList
)
{
List
<
PlatSleepRangeVO
>
rangeList
=
rangeMap
.
get
(
analysisVO
.
getStartTime
());
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setElderId
(
platElderId
);
platElderSleep
.
setTenantId
(
tenantId
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SLEEP
.
getType
());
platElderSleep
.
setSleepRecord
(
rangeList
);
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
if
(
CollUtil
.
isNotEmpty
(
restList
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
restList
)
{
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
List
<
PlatSleepRangeVO
>
rangeList
=
rangeMap
.
get
(
analysisVO
.
getStartTime
());
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setElderId
(
platElderId
);
platElderSleep
.
setTenantId
(
tenantId
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
RESTING
.
getType
());
platElderSleep
.
setSleepRecord
(
rangeList
);
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
if
(
CollUtil
.
isNotEmpty
(
elderSleepList
))
{
platElderSleepService
.
remove
(
Wrappers
.<
PlatElderSleep
>
lambdaQuery
()
.
eq
(
PlatElderSleep:
:
getHappenDate
,
currentDate
).
eq
(
PlatElderSleep:
:
getElderId
,
platElderId
));
elderSleepList
.
forEach
(
e
->
platElderSleepService
.
save
(
e
));
}
return
elderSleepList
;
}
private
SleepTimeMinuteDTO
getSleepTimeMinute
(
SleepTimeDTO
sleepTimeDTO
)
{
SleepTimeMinuteDTO
result
=
new
SleepTimeMinuteDTO
();
result
.
setDaySleepTime
(
CollUtil
.
isNotEmpty
(
sleepTimeDTO
.
getSleepList
())
?
sleepTimeDTO
.
getSleepList
().
stream
().
mapToLong
(
SleepTimeAnalysisVO:
:
getInterval
).
reduce
(
0L
,
Long:
:
sum
)
:
0
);
result
.
setDeepTime
(
CollUtil
.
isNotEmpty
(
sleepTimeDTO
.
getDeepList
())
?
sleepTimeDTO
.
getDeepList
().
stream
().
mapToLong
(
SleepTimeAnalysisVO:
:
getInterval
).
reduce
(
0L
,
Long:
:
sum
)
:
0
);
result
.
setLightTime
(
CollUtil
.
isNotEmpty
(
sleepTimeDTO
.
getLightList
())
?
sleepTimeDTO
.
getLightList
().
stream
().
mapToLong
(
SleepTimeAnalysisVO:
:
getInterval
).
reduce
(
0L
,
Long:
:
sum
)
:
0
);
result
.
setSoberTime
(
CollUtil
.
isNotEmpty
(
sleepTimeDTO
.
getSoberList
())
?
sleepTimeDTO
.
getSoberList
().
stream
().
mapToLong
(
SleepTimeAnalysisVO:
:
getInterval
).
reduce
(
0L
,
Long:
:
sum
)
:
0
);
return
result
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
@TenantIdIgnore
public
List
<
ElderSleepAnalysisVO
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
)
{
List
<
String
>
dayHourRangeList
=
getLastDayHourRange
(
month
,
day
);
LocalDate
now
=
LocalDate
.
now
();
String
currentDate
=
now
.
minusDays
(
1
).
toString
();
if
(
month
!=
null
&&
day
!=
null
)
{
currentDate
=
LocalDate
.
of
(
2024
,
month
,
day
).
minusDays
(
1
).
toString
();
}
else
{
month
=
now
.
getMonth
().
getValue
();
day
=
now
.
getDayOfMonth
();
}
SaasSleepAnalysisModel
analysisModel
=
saasSleepAnalysisModelService
.
getOne
(
new
QueryWrapper
<
SaasSleepAnalysisModel
>().
lambda
()
.
orderByDesc
(
BaseEntity:
:
getCreateBy
)
.
last
(
"limit 1"
));
List
<
PlatRoomBedDevice
>
platRoomBedDeviceList
=
roomBedDeviceService
.
list
(
new
QueryWrapper
<
PlatRoomBedDevice
>()
.
lambda
().
isNotNull
(
PlatRoomBedDevice:
:
getBedId
));
SaasSleepEvaluateStandardReport
evaluateStandardReport
=
saasSleepEvaluateStandardReportService
.
getOne
(
new
QueryWrapper
<
SaasSleepEvaluateStandardReport
>().
lambda
()
.
orderByDesc
(
BaseEntity:
:
getCreateDate
)
.
last
(
"limit 1"
));
double
sleepTimeActionDuration
=
Double
.
parseDouble
(
analysisModel
.
getSleepTimeActionDuration
());
List
<
ElderSleepAnalysisVO
>
result
=
new
ArrayList
<>();
for
(
PlatRoomBedDevice
platRoomBedDevice
:
platRoomBedDeviceList
)
{
TreeMap
<
String
,
AnalysisVO
>
totalMap
=
new
TreeMap
<>();
String
bedId
=
platRoomBedDevice
.
getBedId
();
PlatElder
elder
=
platElderService
.
getOne
(
new
QueryWrapper
<
PlatElder
>().
lambda
()
.
eq
(
PlatElder:
:
getBedId
,
bedId
));
// || !"1712648603580764161".equals(elder.getId())
if
(
elder
==
null
)
{
continue
;
}
PlatDevice
platDevice
=
platDeviceService
.
getById
(
platRoomBedDevice
.
getDeviceId
());
// || !"218A00XE2669104".equals(platDevice.getOriDeviceId())
if
(
platDevice
==
null
)
{
continue
;
}
String
tenantId
=
elder
.
getTenantId
();
// dayHourRangeList = Lists.newArrayList("2024-01-30 23:00:00~2024-01-31 00:32:00","2024-01-31 00:32:00~2024-01-31 01:32:00","2024-01-31 01:32:00~2024-01-31 02:40:00");
for
(
String
hourRange
:
dayHourRangeList
)
{
String
[]
hourRangeArray
=
hourRange
.
split
(
"~"
);
List
<
DeviceOperationLogEntity
>
deviceOperationLogEntities
=
productDeviceService
.
getDeviceLogByTimeRange
(
platDevice
.
getOriDeviceId
(),
"reportProperty"
,
10000
,
hourRangeArray
[
0
],
hourRangeArray
[
1
]);
if
(
CollUtil
.
isEmpty
(
deviceOperationLogEntities
))
{
continue
;
}
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreatheList
=
deviceOperationLogEntities
.
stream
()
.
filter
(
deviceOperationLogEntity
->
deviceOperationLogEntity
.
getType
().
contains
(
"reportProperty"
))
.
map
(
deviceOperationLogEntity
->
{
DeviceInfoContentBreathe
deviceInfoContentBreathe
=
JsonUtil
.
toObj
((
String
)
deviceOperationLogEntity
.
getContent
(),
DeviceInfoContentBreathe
.
class
);
assert
deviceInfoContentBreathe
!=
null
;
deviceInfoContentBreathe
.
setReportTime
(
formatLongTime
(
deviceInfoContentBreathe
.
getTimestamp
()));
return
deviceInfoContentBreathe
;
}).
collect
(
Collectors
.
toList
());
Map
<
String
,
List
<
DeviceInfoContentBreathe
>>
minuteMap
=
StreamUtil
.
groupBy
(
deviceInfoContentBreatheList
,
DeviceInfoContentBreathe:
:
getReportTime
);
// deviceLogService.save(deviceOperationLogEntities);
deviceOperationLogEntities
.
clear
();
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
=
getPerMinuteData
(
minuteMap
,
analysisModel
);
if
(
CollUtil
.
isNotEmpty
(
statisticsMap
))
{
//测试环境数据 device_minute_info
// deviceLogService.saveEntity(statisticsMap, platRoomBedDevice.getId());
totalMap
.
putAll
(
statisticsMap
);
}
}
if
(
CollUtil
.
isEmpty
(
totalMap
))
{
continue
;
}
// 没有上报数据的时间,填默认值
deviceLogService
.
fillDefaultData
(
totalMap
,
month
,
day
);
// 记录长者不同类型的睡眠时间
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
=
Lists
.
newArrayList
();
// 入睡时间
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
getFallAsleepData
(
totalMap
,
sleepTimeActionDuration
,
sleepTimeAnalysisVOList
,
analysisModel
);
// 获取睡眠和小憩
SleepCountDTO
sleepCountDTO
=
deepSleepAndRestData
(
sleepTypeMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
// 满足睡眠条件的map
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
daySleepMap
=
sleepCountDTO
.
getAllSleepMap
();
// 深度睡眠
deepSleepData
(
daySleepMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
// 中度睡眠
middleSleep
(
daySleepMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
// 清醒
sober
(
daySleepMap
,
sleepTimeAnalysisVOList
);
countTotal
(
sleepTypeMap
,
sleepCountDTO
);
//浅睡
SleepTimeDTO
sleepTimeDTO
=
groupSleepData
(
sleepTimeAnalysisVOList
);
List
<
PlatElderSleep
>
platElderSleeps
=
saveElderSleep
(
sleepTimeDTO
,
elder
.
getId
(),
elder
.
getTenantId
(),
currentDate
);
PlatElderSleepAnalysis
platElderSleepAnalysis
=
savePlatElderSleepAnalysis
(
sleepTimeDTO
,
evaluateStandardReport
,
elder
.
getId
(),
currentDate
,
sleepCountDTO
,
tenantId
,
platDevice
.
getOriDeviceId
());
ElderSleepAnalysisVO
analysisVO
=
BeanUtil
.
copyProperties
(
platElderSleepAnalysis
,
ElderSleepAnalysisVO
.
class
);
analysisVO
.
setPlatElderSleeps
(
platElderSleeps
);
result
.
add
(
analysisVO
);
}
return
result
;
}
...
...
@@ -760,14 +1004,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
lightScore
=
Integer
.
parseInt
(
lightnessConfig
.
getScore
())
*
multiplier
;
}
Integer
totalScore
=
sleepScore
.
get
()
+
deepScore
.
get
()
+
lightScore
-
soberScore
.
get
();
if
(
totalScore
<
0
)
{
totalScore
=
0
;
}
return
String
.
valueOf
(
totalScore
);
}
public
Long
getDurationRange
(
String
startTime
,
String
endTime
)
{
LocalDateTime
target
=
LocalDateTime
.
parse
(
startTime
,
DEFAULT_FORMATTER
);
// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期
// LocalDate today = LocalDate.now();
LocalDateTime
source
=
LocalDateTime
.
parse
(
endTime
,
DEFAULT_FORMATTER
);
return
Duration
.
between
(
target
,
source
).
toMinutes
();
}
...
...
@@ -777,11 +1022,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return
DEFAULT_FORMATTER
.
format
(
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
time
),
ZoneId
.
systemDefault
()));
}
public
List
<
String
>
getLastDayHourRange
(
Integer
month
,
Integer
day
)
{
public
static
List
<
String
>
getLastDayHourRange
(
Integer
month
,
Integer
day
)
{
int
count
=
24
;
LocalDateTime
localDateTime
=
LocalDateTime
.
now
();
if
(
month
!=
null
&&
day
!=
null
)
{
localDateTime
=
LocalDateTime
.
of
(
LocalDate
.
of
(
2024
,
month
,
day
),
LocalTime
.
now
(
));
localDateTime
=
LocalDateTime
.
of
(
LocalDate
.
of
(
2024
,
month
,
day
),
LocalTime
.
of
(
8
,
0
));
}
List
<
String
>
list
=
Lists
.
newArrayList
();
String
startTime
;
...
...
@@ -794,8 +1039,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return
list
;
}
public
static
LocalDateTime
getDayStart
(
LocalDate
time
)
{
return
time
.
atTime
(
0
,
0
,
0
);
}
}
server-service/src/main/java/com/makeit/service/wechat/PlatElderChildrenInfoUserLoginWechatService.java
View file @
ce1e9c90
package
com
.
makeit
.
service
.
wechat
;
import
com.makeit.utils.third.wechat.WechatBindDTO
;
import
com.makeit.utils.third.wechat.WechatLoginPhoneDTO
;
import
com.makeit.utils.user.wechat.WechatUserInfo
;
...
...
@@ -9,4 +10,5 @@ public interface PlatElderChildrenInfoUserLoginWechatService {
void
logout
();
void
bind
(
WechatBindDTO
dto
);
}
server-service/src/main/java/com/makeit/service/wechat/impl/PlatElderChildrenInfoUserLoginWechatServiceImpl.java
View file @
ce1e9c90
package
com
.
makeit
.
service
.
wechat
.
impl
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.http.HttpUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.makeit.entity.platform.elder.PlatElderChildrenInfo
;
import
com.makeit.entity.saas.PlatTenant
;
import
com.makeit.global.aspect.misc.nofill.NoFillUtil
;
...
...
@@ -12,9 +16,7 @@ import com.makeit.utils.data.id.IdGen;
import
com.makeit.utils.msg.config.WxConfig
;
import
com.makeit.utils.old.StringUtils
;
import
com.makeit.utils.sys.FileUtil
;
import
com.makeit.utils.third.wechat.WechatLoginPhoneDTO
;
import
com.makeit.utils.third.wechat.WechatUtil
;
import
com.makeit.utils.third.wechat.WxUserInfo
;
import
com.makeit.utils.third.wechat.*
;
import
com.makeit.utils.user.TokenUtil
;
import
com.makeit.utils.user.wechat.WechatUserInfo
;
import
org.apache.commons.collections4.CollectionUtils
;
...
...
@@ -25,7 +27,9 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@Service
public
class
PlatElderChildrenInfoUserLoginWechatServiceImpl
implements
PlatElderChildrenInfoUserLoginWechatService
{
...
...
@@ -121,6 +125,49 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde
}
@Override
public
void
bind
(
WechatBindDTO
dto
)
{
WechatCodeDTO
codeDTO
=
getAppid
(
dto
);
if
(
StrUtil
.
isBlank
(
dto
.
getId
())
||
codeDTO
==
null
||
StrUtil
.
isBlank
(
codeDTO
.
getOpenid
()))
{
return
;
}
bindToChildrenInfo
(
dto
.
getId
(),
codeDTO
.
getOpenid
());
}
private
WechatCodeDTO
getAppid
(
WechatBindDTO
dto
)
{
String
url
=
"https://api.weixin.qq.com/sns/oauth2/access_token"
;
Map
<
String
,
Object
>
params
=
new
HashMap
<>(
12
);
params
.
put
(
"appid"
,
dto
.
getAppid
());
params
.
put
(
"secret"
,
dto
.
getSecret
());
params
.
put
(
"code"
,
dto
.
getCode
());
params
.
put
(
"grant_type"
,
dto
.
getGrantType
());
String
post
=
""
;
try
{
post
=
HttpUtil
.
post
(
url
,
params
);
logger
.
info
(
"获取微信公众号appid:response:{},params:{}"
,
post
,
dto
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"获取微信公众号appid失败:response:{}"
,
post
);
}
return
JSONUtil
.
toBean
(
post
,
WechatCodeDTO
.
class
);
}
private
void
bindToChildrenInfo
(
String
id
,
String
weChatOpenid
)
{
PlatElderChildrenInfo
childrenInfo
=
platElderChildrenInfoService
.
getById
(
id
);
if
(
childrenInfo
==
null
)
{
return
;
}
if
(
StrUtil
.
isNotBlank
(
childrenInfo
.
getOpenid
()))
{
List
<
PlatElderChildrenInfo
>
infoList
=
platElderChildrenInfoService
.
list
(
Wrappers
.<
PlatElderChildrenInfo
>
lambdaQuery
()
.
in
(
PlatElderChildrenInfo:
:
getOpenid
,
childrenInfo
.
getOpenid
()));
infoList
.
forEach
(
i
->
i
.
setWeChatOpenid
(
weChatOpenid
));
platElderChildrenInfoService
.
updateBatchById
(
infoList
);
}
else
{
childrenInfo
.
setWeChatOpenid
(
weChatOpenid
);
platElderChildrenInfoService
.
updateById
(
childrenInfo
);
}
}
@Override
public
void
logout
()
{
TokenUtil
.
wechatLogout
();
}
...
...
server-service/src/main/java/com/makeit/vo/platform/elder/report/day/PlatSleepRangeVO.java
View file @
ce1e9c90
...
...
@@ -8,4 +8,9 @@ public class PlatSleepRangeVO {
private
String
sleepType
;
private
String
startTime
;
private
String
endTime
;
/**
* 所属睡眠区间开始时间
*/
private
String
belongToSleepTime
;
}
server-service/src/main/resources/mappers/PlatElderChildrenInfoMapper.xml
0 → 100644
View file @
ce1e9c90
<?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.elder.PlatElderChildrenInfoMapper"
>
<select
id=
"list"
parameterType=
"String"
resultType=
"com.makeit.entity.platform.elder.PlatElderChildrenInfo"
>
select *
from plat_elder_children_info
where tenant_id = #{tenantId}
and find_in_set(#{elderIds},elder_id)
and del_flag = '0'
</select>
</mapper>
server-service/src/main/resources/mappers/PlatOrgMapper.xml
View file @
ce1e9c90
...
...
@@ -19,4 +19,46 @@
ON T1._id COLLATE utf8mb4_general_ci = T2.id COLLATE utf8mb4_general_ci
</select>
<!-- 批量插入数据 查询主键ID注入到是实体中-->
<insert
id=
"insertBatch"
parameterType=
"java.util.List"
useGeneratedKeys=
"true"
>
<selectKey
resultType=
"long"
keyProperty=
"id"
order=
"AFTER"
>
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_info_log
(message_type,device_id,report_time,br,body_move,person_state,person,hr,created_time)
values
<foreach
collection=
"list"
item=
"item"
index=
"index"
separator=
","
>
(#{item.messageType},#{item.deviceId},#{item.reportTime},#{item.br},#{item.bodyMove},
#{item.personState},#{item.person},#{item.hr},#{item.createdTime})
</foreach>
</insert>
<insert
id=
"saveBatch"
parameterType=
"java.util.List"
useGeneratedKeys=
"true"
>
<selectKey
resultType=
"long"
keyProperty=
"id"
order=
"AFTER"
>
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_minute_info(total_hr, avg_hr, max_hr, min_hr, total_br, avg_br, max_br, min_br, hr_br_count,
action_count, turned_count, is_action, is_move_bed, is_minute_action_flag,
awake_minute_action_flag, br_stop_threshold, br_stop, br_stop_time, br_fast_threshold,
br_fast, br_fast_time, br_slow_threshold, br_slow, br_slow_time, hr_fast_threshold,
hr_fast, hr_fast_time, hr_slow_threshold, hr_slow, hr_slow_time, created_time,device_id)
values
<foreach
collection=
"list"
item=
"item"
index=
"index"
separator=
","
>
(#{item.totalHr},#{item.avgHr},#{item.maxHr},#{item.minHr},#{item.totalBr},#{item.avgBr},#{item.maxBr},#{item.minBr},#{item.hrBrCount},
#{item.actionCount},#{item.turnedCount},#{item.isAction},#{item.isMoveBed},#{item.isMinuteActionFlag},
#{item.awakeMinuteActionFlag},#{item.brStopThreshold},#{item.brStop},#{item.brStopTime},#{item.brFastThreshold},
#{item.brFast},#{item.brFastTime},#{item.brSlowThreshold},#{item.brSlow},#{item.brSlowTime},#{item.hrFastThreshold},
#{item.hrFast},#{item.hrFastTime},#{item.hrSlowThreshold},#{item.hrSlow},#{item.hrSlowTime},#{item.createdTime},#{item.deviceId})
</foreach>
</insert>
<select
id=
"getData"
resultType=
"com.makeit.module.iot.vo.analysis.AnalysisVO"
>
select * from device_minute_info where device_id = '1732647368962203650' order by created_time
</select>
</mapper>
server-web/src/main/resources/application-dev.yml
View file @
ce1e9c90
...
...
@@ -115,7 +115,7 @@ iot:
clientId
:
fyxmb5h52iKwE2Hi
secureKey
:
22fZbnH36wdHn7ZTyKKHraFw233npcez
sync
:
enable
:
fals
e
enable
:
tru
e
mqtt
:
username
:
admin|1693982115969
...
...
@@ -141,8 +141,10 @@ wx:
msgDataFormat
:
JSON
mp
:
config
:
appid
:
wx5c73cad7aeb788c6
secret
:
7c3a0665bf2adbe67a58a4d6c8017243
appid
:
wxa5ddf4b1355ce62a
secret
:
92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms
:
send
:
url
:
http://www.aozoneyun.com/message/message/send
...
...
server-web/src/main/resources/application-test.yml
View file @
ce1e9c90
...
...
@@ -12,7 +12,7 @@ spring:
name
:
iot-server
datasource
:
url
:
jdbc:mysql://1
24.71.100.177
:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
url
:
jdbc:mysql://1
92.168.0.29
:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
username
:
jenlinks-iot
password
:
jenlinks-iot@123Frrd
driver-class-name
:
com.mysql.cj.jdbc.Driver
...
...
@@ -139,8 +139,10 @@ wx:
msgDataFormat
:
JSON
mp
:
config
:
appid
:
wx5c73cad7aeb788c6
secret
:
7c3a0665bf2adbe67a58a4d6c8017243
appid
:
wxa5ddf4b1355ce62a
secret
:
92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms
:
send
:
...
...
server-web/src/main/resources/logback-spring-prod.xml
View file @
ce1e9c90
...
...
@@ -26,7 +26,7 @@
</encoder>
</appender>
<!--
info
-->
<!--
logging
-->
<appender
name=
"FILELOGGING"
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<filter
class=
"ch.qos.logback.classic.filter.ThresholdFilter"
>
<level>
INFO
</level>
...
...
@@ -61,7 +61,7 @@
<FileNamePattern>
${logback.logdir}/${logback.appname}/info/log_info.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<maxHistory>
10
</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"
>
<maxFileSize>
20MB
</maxFileSize>
<maxFileSize>
20
48
MB
</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
...
...
@@ -84,7 +84,7 @@
</FileNamePattern>
<maxHistory>
10
</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"
>
<maxFileSize>
20MB
</maxFileSize>
<maxFileSize>
20
48
MB
</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
...
...
@@ -106,7 +106,7 @@
<FileNamePattern>
${logback.logdir}/${logback.appname}/warn/log_warn.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<maxHistory>
10
</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"
>
<maxFileSize>
20MB
</maxFileSize>
<maxFileSize>
20
48
MB
</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
...
...
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