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
bacc1801
authored
Jan 08, 2024
by
汪志阳
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge branch 'dev'
parents
d6fa5969
41429564
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
942 additions
and
777 deletions
pom.xml
server-common/pom.xml
server-common/src/main/java/com/makeit/config/es/ESConfig.java
server-common/src/main/java/com/makeit/config/es/ElasticSearchClientConfig.java
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepTimeAnalysisVO.java
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderReportDayController.java
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderSleepController.java
server-service/pom.xml
server-service/src/main/java/com/makeit/dto/platform/elder/es/PlatElderCoordinateDTO.java
server-service/src/main/java/com/makeit/dto/platform/space/PlatRegionSettingFixQueryDTO.java
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderCoordinateRecordService.java
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderSleepService.java
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderCoordinateRecordServiceImpl.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/PlatElderSleepServiceImpl.java
server-service/src/main/java/com/makeit/service/platform/space/impl/PlatRegionSettingFixServiceImpl.java
server-web/src/main/resources/application-dev.yml
server-web/src/main/resources/application-test.yml
pom.xml
View file @
bacc1801
...
@@ -75,6 +75,8 @@
...
@@ -75,6 +75,8 @@
<weixin-java.version>
4.5.0
</weixin-java.version>
<weixin-java.version>
4.5.0
</weixin-java.version>
<elasticsearch.version>
6.8.11
</elasticsearch.version>
</properties>
</properties>
...
@@ -288,7 +290,17 @@
...
@@ -288,7 +290,17 @@
<classifier>
jdk15
</classifier>
<classifier>
jdk15
</classifier>
</dependency>
</dependency>
<!--工作流模块使用-->
<dependency>
<groupId>
org.elasticsearch
</groupId>
<artifactId>
elasticsearch
</artifactId>
<version>
${elasticsearch.version}
</version>
</dependency>
<dependency>
<groupId>
org.elasticsearch.client
</groupId>
<artifactId>
elasticsearch-rest-high-level-client
</artifactId>
<version>
${elasticsearch.version}
</version>
</dependency>
</dependencies>
</dependencies>
...
...
server-common/pom.xml
View file @
bacc1801
...
@@ -179,6 +179,16 @@
...
@@ -179,6 +179,16 @@
<artifactId>
weixin-java-mp
</artifactId>
<artifactId>
weixin-java-mp
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.elasticsearch
</groupId>
<artifactId>
elasticsearch
</artifactId>
</dependency>
<dependency>
<groupId>
org.elasticsearch.client
</groupId>
<artifactId>
elasticsearch-rest-high-level-client
</artifactId>
</dependency>
</dependencies>
</dependencies>
<profiles>
<profiles>
...
...
server-common/src/main/java/com/makeit/config/es/ESConfig.java
0 → 100644
View file @
bacc1801
package
com
.
makeit
.
config
.
es
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Configuration
;
@Data
@Configuration
@ConfigurationProperties
(
prefix
=
"elasticsearch"
)
public
class
ESConfig
{
private
String
host
;
private
int
port
;
private
String
scheme
;
private
String
user
;
private
String
password
;
@Override
public
String
toString
()
{
return
String
.
format
(
"elasticsearch{host=%s, port=%d, user=%s, password=%s}"
,
host
,
port
,
user
,
password
);
}
}
\ No newline at end of file
server-common/src/main/java/com/makeit/config/es/ElasticSearchClientConfig.java
0 → 100644
View file @
bacc1801
package
com
.
makeit
.
config
.
es
;
import
org.apache.http.HttpHost
;
import
org.elasticsearch.client.RestClient
;
import
org.elasticsearch.client.RestHighLevelClient
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
public
class
ElasticSearchClientConfig
{
@Autowired
private
ESConfig
es
;
@Bean
(
name
=
"restHighLevelClient"
)
public
RestHighLevelClient
restHighLevelClient
()
{
return
new
RestHighLevelClient
(
RestClient
.
builder
(
new
HttpHost
(
es
.
getHost
(),
es
.
getPort
(),
es
.
getScheme
())
)
);
}
}
\ No newline at end of file
server-common/src/main/java/com/makeit/module/iot/vo/analysis/SleepTimeAnalysisVO.java
View file @
bacc1801
...
@@ -7,11 +7,22 @@ import java.util.List;
...
@@ -7,11 +7,22 @@ import java.util.List;
@Data
@Data
public
class
SleepTimeAnalysisVO
{
public
class
SleepTimeAnalysisVO
{
/**
* 满足入睡条件开始时间
*/
private
String
startTime
;
private
String
startTime
;
/**
* 不满足入睡条件的时间
*/
private
String
endTime
;
private
String
endTime
;
/**
/**
* 起床时间
*/
private
String
newEndTime
;
/**
* 间隔时间(分钟)
* 间隔时间(分钟)
*/
*/
private
Long
interval
;
private
Long
interval
;
...
...
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderReportDayController.java
View file @
bacc1801
...
@@ -4,6 +4,8 @@ package com.makeit.module.controller.elder;
...
@@ -4,6 +4,8 @@ package com.makeit.module.controller.elder;
import
com.makeit.common.response.ApiResponseEntity
;
import
com.makeit.common.response.ApiResponseEntity
;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.dto.platform.elder.PlatElderReportDTO
;
import
com.makeit.dto.platform.elder.PlatElderReportDTO
;
import
com.makeit.global.annotation.AuthIgnore
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.service.platform.elder.PlatElderDayReportDayService
;
import
com.makeit.service.platform.elder.PlatElderDayReportDayService
;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
com.makeit.vo.platform.elder.realtime.PlatElderRealTimeHeartRespiratoryVO
;
import
com.makeit.vo.platform.elder.realtime.PlatElderRealTimeHeartRespiratoryVO
;
...
@@ -42,6 +44,8 @@ public class PlatElderReportDayController {
...
@@ -42,6 +44,8 @@ public class PlatElderReportDayController {
@ApiOperation
(
"睡眠图表"
)
@ApiOperation
(
"睡眠图表"
)
@PostMapping
(
"sleepDiagram"
)
@PostMapping
(
"sleepDiagram"
)
@AuthIgnore
@TenantIdIgnore
public
ApiResponseEntity
<
List
<
PlatElderSleepDiagramVO
>>
sleepDiagram
(
@RequestBody
PlatElderReportDTO
platElderIdDTO
)
{
public
ApiResponseEntity
<
List
<
PlatElderSleepDiagramVO
>>
sleepDiagram
(
@RequestBody
PlatElderReportDTO
platElderIdDTO
)
{
return
ApiResponseUtils
.
success
(
platElderDayReportDayService
.
sleepDiagram
(
platElderIdDTO
));
return
ApiResponseUtils
.
success
(
platElderDayReportDayService
.
sleepDiagram
(
platElderIdDTO
));
}
}
...
...
server-module/src/main/java/com/makeit/module/controller/elder/PlatElderSleepController.java
View file @
bacc1801
...
@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
...
@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
import
com.makeit.common.response.ApiResponseEntity
;
import
com.makeit.common.response.ApiResponseEntity
;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.common.response.ApiResponseUtils
;
import
com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO
;
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.PlatElderBreatheAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.external.huineng.HuiNengService
;
import
com.makeit.external.huineng.HuiNengService
;
...
@@ -74,7 +73,7 @@ public class PlatElderSleepController {
...
@@ -74,7 +73,7 @@ public class PlatElderSleepController {
@GetMapping
(
"test4"
)
@GetMapping
(
"test4"
)
@AuthIgnore
@AuthIgnore
@TenantIdIgnore
@TenantIdIgnore
public
ApiResponseEntity
<
List
<
ElderSleepAnalysisVO
>>
elderSleepSleepAnalysisTask
(
@RequestParam
Integer
month
,
public
ApiResponseEntity
<
List
<
PlatElderSleepAnalysis
>>
elderSleepSleepAnalysisTask
(
@RequestParam
Integer
month
,
@RequestParam
Integer
day
)
{
@RequestParam
Integer
day
)
{
return
ApiResponseUtils
.
success
(
platElderSleepService
.
elderSleepSleepAnalysisTask
(
month
,
day
));
return
ApiResponseUtils
.
success
(
platElderSleepService
.
elderSleepSleepAnalysisTask
(
month
,
day
));
}
}
...
...
server-service/pom.xml
View file @
bacc1801
...
@@ -27,6 +27,15 @@
...
@@ -27,6 +27,15 @@
<artifactId>
lombok
</artifactId>
<artifactId>
lombok
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.elasticsearch
</groupId>
<artifactId>
elasticsearch
</artifactId>
</dependency>
<dependency>
<groupId>
org.elasticsearch.client
</groupId>
<artifactId>
elasticsearch-rest-high-level-client
</artifactId>
</dependency>
</dependencies>
</dependencies>
...
...
server-service/src/main/java/com/makeit/dto/platform/elder/es/PlatElderCoordinateDTO.java
0 → 100644
View file @
bacc1801
package
com
.
makeit
.
dto
.
platform
.
elder
.
es
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
/**
* 长者坐标轨迹
*/
@Data
public
class
PlatElderCoordinateDTO
{
/**
* 主键ID
*/
private
String
id
;
/**
* 租户ID
*/
private
String
tenantId
;
/**
* 创建时间
*/
private
LocalDateTime
createDate
;
/**
* 1 表示空间, 2 表示跌倒
*/
private
Integer
type
;
/**
* 空间人感:0表示无人,1表示活动, 2表示微动 ,3表示静止 ,跌倒设备:0无人,1跌倒
*/
private
Integer
personState
;
/**
* 设备Id
*/
private
String
deviceId
;
/**
* iot设备Id
*/
private
String
iotDeviceId
;
/**
* 长者id
*/
private
String
elderId
;
/**
* 跌倒设备轨迹
*/
private
String
track
;
/**
* 上报时间
*/
private
Long
reportTime
;
}
server-service/src/main/java/com/makeit/dto/platform/space/PlatRegionSettingFixQueryDTO.java
View file @
bacc1801
...
@@ -18,6 +18,9 @@ public class PlatRegionSettingFixQueryDTO {
...
@@ -18,6 +18,9 @@ public class PlatRegionSettingFixQueryDTO {
@ApiModelProperty
(
"房间ID"
)
@ApiModelProperty
(
"房间ID"
)
private
String
roomId
;
private
String
roomId
;
@ApiModelProperty
(
"长者ID"
)
private
String
elderId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@ApiModelProperty
(
"日期 yyyy-MM-dd"
)
@ApiModelProperty
(
"日期 yyyy-MM-dd"
)
private
LocalDate
now
;
private
LocalDate
now
;
...
...
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderCoordinateRecordService.java
View file @
bacc1801
...
@@ -2,6 +2,9 @@ package com.makeit.service.platform.elder;
...
@@ -2,6 +2,9 @@ package com.makeit.service.platform.elder;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.makeit.entity.platform.elder.PlatElderCoordinateRecord
;
import
com.makeit.entity.platform.elder.PlatElderCoordinateRecord
;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
java.util.List
;
/**
/**
* <p>
* <p>
...
@@ -15,4 +18,6 @@ public interface PlatElderCoordinateRecordService extends IService<PlatElderCoor
...
@@ -15,4 +18,6 @@ public interface PlatElderCoordinateRecordService extends IService<PlatElderCoor
void
coordinateRecordTask
();
void
coordinateRecordTask
();
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
long
start
,
long
end
);
}
}
server-service/src/main/java/com/makeit/service/platform/elder/PlatElderSleepService.java
View file @
bacc1801
package
com
.
makeit
.
service
.
platform
.
elder
;
package
com
.
makeit
.
service
.
platform
.
elder
;
import
com.baomidou.mybatisplus.extension.service.IService
;
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.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
java.util.List
;
import
java.util.List
;
...
@@ -17,7 +17,7 @@ import java.util.List;
...
@@ -17,7 +17,7 @@ import java.util.List;
*/
*/
public
interface
PlatElderSleepService
extends
IService
<
PlatElderSleep
>
{
public
interface
PlatElderSleepService
extends
IService
<
PlatElderSleep
>
{
List
<
ElderSleepAnalysisVO
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
);
List
<
PlatElderSleepAnalysis
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
);
String
calculateScores
(
long
daySleepTime
,
long
dayRestTime
,
long
deepTime
,
long
soberTime
,
long
lightTime
,
String
calculateScores
(
long
daySleepTime
,
long
dayRestTime
,
long
deepTime
,
long
soberTime
,
long
lightTime
,
SaasSleepEvaluateStandardReport
evaluateStandardReport
);
SaasSleepEvaluateStandardReport
evaluateStandardReport
);
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderCoordinateRecordServiceImpl.java
View file @
bacc1801
package
com
.
makeit
.
service
.
platform
.
elder
.
impl
;
package
com
.
makeit
.
service
.
platform
.
elder
.
impl
;
import
cn.hutool.core.util.IdUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.
google.common.collect.Sets
;
import
com.
makeit.dto.platform.elder.es.PlatElderCoordinateDTO
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.device.PlatDevice
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderCoordinateRecord
;
import
com.makeit.entity.platform.elder.PlatElderCoordinateRecord
;
...
@@ -14,24 +16,39 @@ import com.makeit.mapper.platform.elder.PlatElderCoordinateRecordMapper;
...
@@ -14,24 +16,39 @@ import com.makeit.mapper.platform.elder.PlatElderCoordinateRecordMapper;
import
com.makeit.service.platform.device.PlatDeviceService
;
import
com.makeit.service.platform.device.PlatDeviceService
;
import
com.makeit.service.platform.elder.PlatElderCoordinateRecordService
;
import
com.makeit.service.platform.elder.PlatElderCoordinateRecordService
;
import
com.makeit.service.platform.elder.PlatElderDayReportDayService
;
import
com.makeit.service.platform.elder.PlatElderDayReportDayService
;
import
com.makeit.service.platform.elder.PlatElderRealTimeService
;
import
com.makeit.service.platform.elder.PlatElderService
;
import
com.makeit.service.platform.elder.PlatElderService
;
import
com.makeit.service.platform.space.PlatRegionSettingFixService
;
import
com.makeit.service.platform.space.PlatRegionSettingFixService
;
import
com.makeit.service.platform.space.PlatRegionSettingService
;
import
com.makeit.service.platform.space.PlatRegionSettingService
;
import
com.makeit.utils.data.convert.JsonUtil
;
import
com.makeit.utils.data.convert.StreamUtil
;
import
com.makeit.utils.data.convert.StreamUtil
;
import
com.makeit.utils.time.LocalDateTimeUtils
;
import
com.makeit.utils.time.LocalDateTimeUtils
;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.elasticsearch.action.bulk.BulkRequest
;
import
org.elasticsearch.action.bulk.BulkResponse
;
import
org.elasticsearch.action.index.IndexRequest
;
import
org.elasticsearch.action.search.*
;
import
org.elasticsearch.client.RequestOptions
;
import
org.elasticsearch.client.RestHighLevelClient
;
import
org.elasticsearch.common.unit.TimeValue
;
import
org.elasticsearch.common.xcontent.XContentType
;
import
org.elasticsearch.index.query.BoolQueryBuilder
;
import
org.elasticsearch.index.query.QueryBuilders
;
import
org.elasticsearch.search.SearchHit
;
import
org.elasticsearch.search.builder.SearchSourceBuilder
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
java.io.IOException
;
import
java.time.LocalDate
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
java.util.function.Function
;
/**
/**
* <p>
* <p>
...
@@ -41,6 +58,7 @@ import java.util.function.Function;
...
@@ -41,6 +58,7 @@ import java.util.function.Function;
* @author eugene young
* @author eugene young
* @since 2023-11-15
* @since 2023-11-15
*/
*/
@Slf4j
@Service
@Service
public
class
PlatElderCoordinateRecordServiceImpl
extends
ServiceImpl
<
PlatElderCoordinateRecordMapper
,
PlatElderCoordinateRecord
>
implements
PlatElderCoordinateRecordService
{
public
class
PlatElderCoordinateRecordServiceImpl
extends
ServiceImpl
<
PlatElderCoordinateRecordMapper
,
PlatElderCoordinateRecord
>
implements
PlatElderCoordinateRecordService
{
...
@@ -55,6 +73,8 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
...
@@ -55,6 +73,8 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
private
PlatRegionSettingService
platRegionSettingService
;
private
PlatRegionSettingService
platRegionSettingService
;
@Autowired
@Autowired
private
PlatDeviceService
platDeviceService
;
private
PlatDeviceService
platDeviceService
;
@Autowired
private
RestHighLevelClient
restHighLevelClient
;
@Override
@Override
public
void
coordinateRecordTask
()
{
public
void
coordinateRecordTask
()
{
...
@@ -68,40 +88,107 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
...
@@ -68,40 +88,107 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
if
(
CollectionUtils
.
isEmpty
(
elderList
))
{
if
(
CollectionUtils
.
isEmpty
(
elderList
))
{
return
;
return
;
}
}
PlatElderCoordinateRecord
platElderCoordinateRecord
;
List
<
PlatRegionSetting
>
platRegionSettingList
=
platRegionSettingService
.
list
(
new
QueryWrapper
<>());
List
<
PlatRegionSetting
>
platRegionSettingList
=
platRegionSettingService
.
list
(
new
QueryWrapper
<>());
for
(
PlatElder
platElder
:
elderList
)
{
for
(
PlatElder
platElder
:
elderList
)
{
BulkRequest
request
=
new
BulkRequest
();
request
.
timeout
(
"600s"
);
List
<
PlatElderCoordinateVO
>
elderCoordinateVOList
=
platElderDayReportDayService
.
coordinateList
(
platElder
.
getId
(),
null
,
datStart
,
dayEnd
);
List
<
PlatElderCoordinateVO
>
elderCoordinateVOList
=
platElderDayReportDayService
.
coordinateList
(
platElder
.
getId
(),
null
,
datStart
,
dayEnd
);
List
<
PlatElderCoordinateRecord
>
list
=
Lists
.
newArrayList
();
for
(
PlatElderCoordinateVO
vo
:
elderCoordinateVOList
)
{
for
(
PlatElderCoordinateVO
vo
:
elderCoordinateVOList
)
{
platElderCoordinateRecord
=
new
PlatElderCoordinateRecord
();
PlatElderCoordinateDTO
platElderCoordinateDTO
=
new
PlatElderCoordinateDTO
();
BeanUtils
.
copyProperties
(
vo
,
platElderCoordinateRecord
);
BeanUtils
.
copyProperties
(
vo
,
platElderCoordinateDTO
);
if
(
CollectionUtils
.
isNotEmpty
(
vo
.
getTrack
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
vo
.
getTrack
()))
{
platElderCoordinateRecord
.
setTrack
(
JSON
.
toJSONString
(
vo
.
getTrack
()));
platElderCoordinateDTO
.
setTrack
(
JSON
.
toJSONString
(
vo
.
getTrack
()));
}
platElderCoordinateDTO
.
setReportTime
(
vo
.
getTimestamp
());
platElderCoordinateDTO
.
setIotDeviceId
(
vo
.
getOriDeviceId
());
platElderCoordinateDTO
.
setDeviceId
(
vo
.
getDeviceId
());
platElderCoordinateDTO
.
setElderId
(
platElder
.
getId
());
platElderCoordinateDTO
.
setTenantId
(
platElder
.
getTenantId
());
platElderCoordinateDTO
.
setCreateDate
(
LocalDateTime
.
now
());
request
.
add
(
new
IndexRequest
(
"plat_elder_coordinate"
).
id
(
IdUtil
.
fastUUID
()).
type
(
"_doc"
).
source
(
JSONObject
.
toJSONString
(
platElderCoordinateDTO
),
XContentType
.
JSON
));
}
if
(
CollectionUtils
.
isNotEmpty
(
elderCoordinateVOList
))
{
try
{
BulkResponse
response
=
restHighLevelClient
.
bulk
(
request
,
RequestOptions
.
DEFAULT
);
if
(
response
.
hasFailures
())
{
log
.
error
(
"es保存数据失败"
);
}
}
catch
(
IOException
e
)
{
log
.
error
(
"es保存数据失败:{}"
,
e
);
}
}
platElderCoordinateRecord
.
setReportTime
(
vo
.
getTimestamp
());
platElderCoordinateRecord
.
setIotDeviceId
(
vo
.
getOriDeviceId
());
platElderCoordinateRecord
.
setDeviceId
(
vo
.
getDeviceId
());
platElderCoordinateRecord
.
setPersonState
(
vo
.
getPersonState
());
platElderCoordinateRecord
.
setElderId
(
platElder
.
getId
());
platElderCoordinateRecord
.
setTenantId
(
platElder
.
getTenantId
());
list
.
add
(
platElderCoordinateRecord
);
}
}
saveBatch
(
list
);
}
}
List
<
String
>
deviceIds
=
StreamUtil
.
map
(
platRegionSettingList
,
setting
->
setting
.
getDeviceId
());
List
<
String
>
deviceIds
=
StreamUtil
.
map
(
platRegionSettingList
,
setting
->
setting
.
getDeviceId
());
List
<
PlatDevice
>
platDevices
=
platDeviceService
.
listByIds
(
deviceIds
);
List
<
PlatDevice
>
platDevices
=
platDeviceService
.
listByIds
(
deviceIds
);
Map
<
String
,
String
>
deviceMap
=
StreamUtil
.
toMap
(
platDevices
,
PlatDevice:
:
getId
,
PlatDevice:
:
getId
);
Map
<
String
,
String
>
deviceMap
=
StreamUtil
.
toMap
(
platDevices
,
PlatDevice:
:
getId
,
PlatDevice:
:
getId
);
platRegionSettingList
=
StreamUtil
.
filter
(
platRegionSettingList
,
setting
->
deviceMap
.
containsKey
(
setting
.
getDeviceId
()));
platRegionSettingList
=
StreamUtil
.
filter
(
platRegionSettingList
,
setting
->
deviceMap
.
containsKey
(
setting
.
getDeviceId
()));
List
<
PlatRegionSettingFix
>
settingFixList
=
StreamUtil
.
map
(
platRegionSettingList
,
setting
->
{
Map
<
String
,
List
<
PlatElder
>>
roomElderMap
=
elderList
.
stream
().
filter
(
e
->
StringUtils
.
isNotBlank
(
e
.
getRoomId
())).
collect
(
Collectors
.
groupingBy
(
PlatElder:
:
getRoomId
));
PlatRegionSettingFix
settingFix
=
new
PlatRegionSettingFix
();
List
<
PlatRegionSettingFix
>
settingFixList
=
Lists
.
newArrayList
();
BeanUtils
.
copyProperties
(
setting
,
settingFix
,
"id"
);
for
(
PlatRegionSetting
platRegionSetting
:
platRegionSettingList
)
{
settingFix
.
setHappenDate
(
yesDate
.
toString
());
List
<
PlatElder
>
platElders
=
roomElderMap
.
get
(
platRegionSetting
.
getRoomId
());
return
settingFix
;
if
(
CollectionUtils
.
isEmpty
(
platElders
))
{
});
continue
;
}
for
(
PlatElder
platElder
:
platElders
)
{
PlatRegionSettingFix
settingFix
=
new
PlatRegionSettingFix
();
BeanUtils
.
copyProperties
(
platRegionSetting
,
settingFix
,
"id"
);
settingFix
.
setHappenDate
(
yesDate
.
toString
());
settingFix
.
setElderId
(
platElder
.
getId
());
settingFixList
.
add
(
settingFix
);
}
}
platRegionSettingFixService
.
saveBatch
(
settingFixList
);
platRegionSettingFixService
.
saveBatch
(
settingFixList
);
}
}
@Override
public
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
long
start
,
long
end
)
{
int
size
=
1000
;
long
scrollTime
=
1L
;
SearchRequest
request
=
new
SearchRequest
();
request
.
indices
(
"plat_elder_coordinate"
);
request
.
types
(
"_doc"
);
SearchSourceBuilder
builder
=
new
SearchSourceBuilder
();
builder
.
size
(
size
);
BoolQueryBuilder
boolQueryBuilder
=
QueryBuilders
.
boolQuery
();
boolQueryBuilder
.
must
(
QueryBuilders
.
matchQuery
(
"elderId"
,
elderId
));
boolQueryBuilder
.
must
(
QueryBuilders
.
rangeQuery
(
"reportTime"
).
gte
(
start
).
lte
(
end
));
builder
.
query
(
boolQueryBuilder
);
request
.
scroll
(
TimeValue
.
timeValueMinutes
(
scrollTime
));
request
.
source
(
builder
);
SearchResponse
response
;
List
<
PlatElderCoordinateVO
>
list
=
Lists
.
newArrayList
();
try
{
response
=
restHighLevelClient
.
search
(
request
,
RequestOptions
.
DEFAULT
);
SearchHit
[]
results
=
response
.
getHits
().
getHits
();
String
scrollId
=
response
.
getScrollId
();
add
(
list
,
results
);
while
(
results
!=
null
&&
results
.
length
>
0
)
{
SearchScrollRequest
scrollRequest
=
new
SearchScrollRequest
(
scrollId
);
scrollRequest
.
scroll
(
TimeValue
.
timeValueMinutes
(
scrollTime
));
response
=
restHighLevelClient
.
scroll
(
scrollRequest
,
RequestOptions
.
DEFAULT
);
scrollId
=
response
.
getScrollId
();
results
=
response
.
getHits
().
getHits
();
add
(
list
,
results
);
}
ClearScrollRequest
clearScrollRequest
=
new
ClearScrollRequest
();
clearScrollRequest
.
addScrollId
(
scrollId
);
restHighLevelClient
.
clearScroll
(
clearScrollRequest
,
RequestOptions
.
DEFAULT
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
list
;
}
private
void
add
(
List
<
PlatElderCoordinateVO
>
list
,
SearchHit
[]
results
)
{
for
(
SearchHit
result
:
results
)
{
Map
<
String
,
Object
>
sourceAsMap
=
result
.
getSourceAsMap
();
sourceAsMap
.
put
(
"track"
,
JSON
.
parseArray
(
MapUtils
.
getString
(
sourceAsMap
,
"track"
),
Integer
.
class
));
PlatElderCoordinateVO
platElderCoordinateVO
=
JsonUtil
.
mapToBean
(
sourceAsMap
,
PlatElderCoordinateVO
.
class
);
list
.
add
(
platElderCoordinateVO
);
}
}
}
}
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderDayReportDayServiceImpl.java
View file @
bacc1801
...
@@ -3,6 +3,7 @@ package com.makeit.service.platform.elder.impl;
...
@@ -3,6 +3,7 @@ package com.makeit.service.platform.elder.impl;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
...
@@ -46,7 +47,10 @@ import java.time.LocalDateTime;
...
@@ -46,7 +47,10 @@ import java.time.LocalDateTime;
import
java.time.ZoneOffset
;
import
java.time.ZoneOffset
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.function.Function
;
import
java.util.function.Predicate
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
@Service
@Service
...
@@ -239,7 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
...
@@ -239,7 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
}
}
List
<
PlatElderSleep
>
wakeUpList
=
sleepList
.
stream
().
filter
(
f
->
f
.
getElderSleepType
().
equals
(
SleepTypeEnum
.
GETUP
.
getType
())).
collect
(
Collectors
.
toList
());
List
<
PlatElderSleep
>
wakeUpList
=
sleepList
.
stream
().
filter
(
f
->
f
.
getElderSleepType
().
equals
(
SleepTypeEnum
.
GETUP
.
getType
())).
collect
(
Collectors
.
toList
());
sleeps
.
forEach
(
s
->
{
sleeps
.
forEach
(
s
->
{
List
<
PlatElderSleep
>
wakeList
=
wakeUpList
.
stream
().
filter
(
f
->
s
.
getStartSleep
().
isAfter
(
s
.
getEndSleep
())).
collect
(
Collectors
.
toList
());
List
<
PlatElderSleep
>
wakeList
=
wakeUpList
.
stream
().
filter
(
f
->
f
.
getStartSleep
().
isAfter
(
s
.
getEndSleep
())).
collect
(
Collectors
.
toList
());
if
(
CollUtil
.
isNotEmpty
(
wakeList
))
{
if
(
CollUtil
.
isNotEmpty
(
wakeList
))
{
final
long
[]
minute
=
{
24
*
60
};
final
long
[]
minute
=
{
24
*
60
};
wakeList
.
forEach
(
w
->
{
wakeList
.
forEach
(
w
->
{
...
@@ -460,74 +464,66 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
...
@@ -460,74 +464,66 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
@Override
public
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
long
start
,
long
end
)
{
public
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
long
start
,
long
end
)
{
LambdaQueryWrapper
<
PlatElderCoordinateRecord
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
return
platElderCoordinateRecordService
.
coordinateList
(
elderId
,
start
,
end
);
queryWrapper
.
eq
(
PlatElderCoordinateRecord:
:
getElderId
,
elderId
);
queryWrapper
.
ge
(
PlatElderCoordinateRecord:
:
getReportTime
,
start
);
queryWrapper
.
le
(
PlatElderCoordinateRecord:
:
getReportTime
,
end
);
List
<
PlatElderCoordinateRecord
>
list
=
platElderCoordinateRecordService
.
list
(
queryWrapper
);
return
list
.
stream
().
map
(
r
->
{
PlatElderCoordinateVO
platElderCoordinateVO
=
new
PlatElderCoordinateVO
();
BeanUtils
.
copyProperties
(
r
,
platElderCoordinateVO
);
platElderCoordinateVO
.
setTimestamp
(
r
.
getReportTime
());
platElderCoordinateVO
.
setOriDeviceId
(
r
.
getIotDeviceId
());
if
(
StringUtils
.
isNotBlank
(
r
.
getTrack
()))
{
platElderCoordinateVO
.
setTrack
(
JSON
.
parseArray
(
r
.
getTrack
(),
Integer
.
class
));
}
return
platElderCoordinateVO
;
}).
collect
(
Collectors
.
toList
());
}
}
@Override
@Override
public
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
String
deviceId
,
LocalDateTime
start
,
LocalDateTime
end
)
{
public
List
<
PlatElderCoordinateVO
>
coordinateList
(
String
elderId
,
String
deviceId
,
LocalDateTime
start
,
LocalDateTime
end
)
{
// 主要为了获取track,空间设备没有该字段,所以去除
List
<
PlatDevice
>
platDeviceListSpace
=
platElderRealTimeService
.
getSpaceDevice
(
elderId
,
deviceId
);
//
List<PlatDevice> platDeviceListSpace = platElderRealTimeService.getSpaceDevice(elderId, deviceId);
List
<
PlatDevice
>
platDeviceListFall
=
platElderRealTimeService
.
getFallDevice
(
elderId
,
deviceId
);
List
<
PlatDevice
>
platDeviceListFall
=
platElderRealTimeService
.
getFallDevice
(
elderId
,
deviceId
);
if
(
CollectionUtils
.
isEmpty
(
platDeviceList
Space
)
&&
CollectionUtils
.
isEmpty
(
platDeviceList
Fall
))
{
if
(
CollectionUtils
.
isEmpty
(
platDeviceListFall
))
{
return
new
ArrayList
<>(
10
);
return
new
ArrayList
<>(
10
);
}
}
List
<
PlatElderCoordinateVO
>
voList
=
new
ArrayList
<>(
10
);
List
<
PlatElderCoordinateVO
>
voList
=
new
ArrayList
<>(
10
);
platDeviceListSpace
.
forEach
(
e
->
{
//
platDeviceListSpace.forEach(e -> {
List
<
DeviceInfoContentSpace
>
spaceList
=
iotProductDeviceService
.
getDeviceLogByTimeRangeSpace
(
e
.
getOriDeviceId
(),
24
*
3600
,
start
,
end
);
//
List<DeviceInfoContentSpace> spaceList = iotProductDeviceService.getDeviceLogByTimeRangeSpace(e.getOriDeviceId(), 24 * 3600, start, end);
voList
.
addAll
(
StreamUtil
.
map
(
spaceList
,
i
->
{
//
voList.addAll(StreamUtil.map(spaceList, i -> {
//
PlatElderCoordinateVO
vo
=
new
PlatElderCoordinateVO
();
//
PlatElderCoordinateVO vo = new PlatElderCoordinateVO();
vo
.
setTimestamp
(
i
.
getTimestamp
());
//
vo.setTimestamp(i.getTimestamp());
vo
.
setDistance
(
i
.
getProperties
().
getDistance
());
//
vo.setDistance(i.getProperties().getDistance());
vo
.
setAngle
(
i
.
getProperties
().
getAngle
());
//
vo.setAngle(i.getProperties().getAngle());
vo
.
setType
(
1
);
//
vo.setType(1);
vo
.
setPersonState
(
i
.
getProperties
().
getPersonState
());
//
vo.setPersonState(i.getProperties().getPersonState());
vo
.
setMount
(
i
.
getProperties
().
getMount
());
//
vo.setMount(i.getProperties().getMount());
vo
.
setDeviceId
(
e
.
getId
());
//
vo.setDeviceId(e.getId());
vo
.
setOriDeviceId
(
e
.
getOriDeviceId
());
//
vo.setOriDeviceId(e.getOriDeviceId());
//
return
vo
;
//
return vo;
//
})
//
})
);
//
);
//
});
//
});
platDeviceListFall
.
forEach
(
e
->
{
platDeviceListFall
.
forEach
(
e
->
{
List
<
DeviceInfoContentFall
>
fallList
=
iotProductDeviceService
.
getDeviceLogByTimeRangeFall
(
e
.
getOriDeviceId
(),
2
*
24
*
3600
,
start
,
end
);
List
<
DeviceInfoContentFall
>
fallList
=
iotProductDeviceService
.
getDeviceLogByTimeRangeFall
(
e
.
getOriDeviceId
(),
2
*
24
*
3600
,
start
,
end
);
voList
.
addAll
(
StreamUtil
.
map
(
fallList
,
i
->
{
Map
<
String
,
Boolean
>
existMap
=
new
HashMap
<>();
for
(
DeviceInfoContentFall
deviceInfoContentFall
:
fallList
)
{
PlatElderCoordinateVO
vo
=
new
PlatElderCoordinateVO
();
DeviceInfoContentFall
.
Properties
properties
=
deviceInfoContentFall
.
getProperties
();
vo
.
setTimestamp
(
i
.
getTimestamp
());
if
(
properties
==
null
||
CollectionUtils
.
isEmpty
(
properties
.
getTrack
()))
{
vo
.
setTrack
(
i
.
getProperties
().
getTrack
());
continue
;
vo
.
setDeviceId
(
e
.
getId
());
}
vo
.
setType
(
2
);
String
key
=
deviceInfoContentFall
.
getDeviceId
()
+
"_"
+
JSONObject
.
toJSONString
(
properties
.
getTrack
());
vo
.
setPersonState
(
i
.
getProperties
().
getPersonState
());
if
(!
existMap
.
containsKey
(
key
))
{
vo
.
setMount
(
i
.
getProperties
().
getMount
());
existMap
.
put
(
key
,
true
);
vo
.
setOriDeviceId
(
e
.
getOriDeviceId
());
PlatElderCoordinateVO
vo
=
new
PlatElderCoordinateVO
();
return
vo
;
vo
.
setTimestamp
(
deviceInfoContentFall
.
getTimestamp
());
vo
.
setTrack
(
properties
.
getTrack
());
})
vo
.
setDeviceId
(
e
.
getId
());
);
vo
.
setType
(
2
);
vo
.
setPersonState
(
properties
.
getPersonState
());
vo
.
setMount
(
properties
.
getMount
());
vo
.
setOriDeviceId
(
e
.
getOriDeviceId
());
voList
.
add
(
vo
);
}
}
});
});
return
voList
;
return
voList
;
...
...
server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderSleepServiceImpl.java
View file @
bacc1801
package
com
.
makeit
.
service
.
platform
.
elder
.
impl
;
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.DatePattern
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
...
@@ -12,13 +9,13 @@ import com.google.common.collect.Lists;
...
@@ -12,13 +9,13 @@ import com.google.common.collect.Lists;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Maps
;
import
com.makeit.common.entity.BaseEntity
;
import
com.makeit.common.entity.BaseEntity
;
import
com.makeit.entity.platform.device.PlatDevice
;
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.PlatElder
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleep
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.platform.elder.PlatElderSleepAnalysis
;
import
com.makeit.entity.platform.space.PlatRoomBedDevice
;
import
com.makeit.entity.platform.space.PlatRoomBedDevice
;
import
com.makeit.entity.saas.analysis.SaasSleepAnalysisModel
;
import
com.makeit.entity.saas.analysis.SaasSleepAnalysisModel
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport
;
import
com.makeit.enums.report.ElderSleepType
;
import
com.makeit.enums.report.SleepTypeEnum
;
import
com.makeit.enums.report.SleepTypeEnum
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.global.aspect.tenant.TenantIdIgnore
;
import
com.makeit.mapper.platform.elder.PlatElderSleepMapper
;
import
com.makeit.mapper.platform.elder.PlatElderSleepMapper
;
...
@@ -35,16 +32,14 @@ import com.makeit.utils.data.convert.StreamUtil;
...
@@ -35,16 +32,14 @@ import com.makeit.utils.data.convert.StreamUtil;
import
com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO
;
import
com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.time.*
;
import
java.time.*
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.*
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
...
@@ -89,741 +84,640 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
...
@@ -89,741 +84,640 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired
@Autowired
private
PlatElderReportMonthService
platElderReportMonthService
;
private
PlatElderReportMonthService
platElderReportMonthService
;
private
TreeMap
<
String
,
AnalysisVO
>
getPerMinuteData
(
Map
<
String
,
List
<
DeviceInfoContentBreathe
>>
minuteMap
,
SaasSleepAnalysisModel
analysisModel
)
{
@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
));
Integer
actionThreshold
=
Integer
.
valueOf
(
analysisModel
.
getActionThreshold
());
int
turnedThreshold
=
Integer
.
parseInt
(
analysisModel
.
getTurnedThreshold
());
int
turnedThreshold
=
Integer
.
parseInt
(
analysisModel
.
getTurnedThreshold
());
int
sleepTimeActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepTimeActionThreshold
());
int
sleepTimeActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepTimeActionThreshold
());
Integer
actionThreshold
=
Integer
.
valueOf
(
analysisModel
.
getActionThreshold
());
// 每分钟大于30秒体动值 大于(50)
double
sleepTimeActionDuration
=
Double
.
parseDouble
(
analysisModel
.
getSleepTimeActionDuration
());
int
riseActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionThreshold
());
int
riseActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionThreshold
());
int
riseActionDuration
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionDuration
());
double
riseLeaveThreshold
=
Double
.
parseDouble
(
analysisModel
.
getRiseLeaveThreshold
());
int
awakeThreshold
=
Integer
.
parseInt
(
analysisModel
.
getAwakeThreshold
());
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
;
// 无人跳过计数
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
)
{
noPersonCount
++;
isMoveBed
=
true
;
awakeMinuteActionFlag
=
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
)
{
int
sleepDeepActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionThreshold
());
bodymoveCount
++;
int
sleepDeepActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionTimeBegin
());
}
if
(
bodyMove
>
turnedThreshold
)
{
turnoverCount
++;
}
// 判断入睡时间的体动阈值
if
(
bodyMove
>=
sleepTimeActionThreshold
)
{
isAction
=
true
;
}
// 起床每分钟体动次数
if
(
bodyMove
>
riseActionThreshold
)
{
getUpBodymoveCount
++;
}
// 清醒
if
(
bodyMove
>
awakeThreshold
)
{
awakeMinuteActionFlag
=
true
;
}
if
(
br
>
maxBr
)
{
int
sleepDeepBreatheMin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMin
());
maxBr
=
br
;
int
sleepDeepBreatheMax
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMax
());
}
if
(
minBr
==
0
)
{
minBr
=
br
;
}
else
if
(
br
<
minBr
)
{
minBr
=
br
;
}
if
(
hr
>
maxHr
)
{
maxHr
=
hr
;
}
if
(
minHr
==
0
)
{
int
sleepModerateActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionThreshold
());
minHr
=
hr
;
int
sleepModerateActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionTimeBegin
());
}
else
if
(
hr
<
minHr
)
{
List
<
PlatElderSleepAnalysis
>
result
=
new
ArrayList
<>();
minHr
=
hr
;
}
if
(
hasPerson
==
1
)
{
for
(
PlatRoomBedDevice
platRoomBedDevice
:
platRoomBedDeviceList
)
{
totalBr
+=
br
;
TreeMap
<
String
,
AnalysisVO
>
totalMap
=
new
TreeMap
<>();
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
);
}
return
statisticsMap
;
}
/**
String
bedId
=
platRoomBedDevice
.
getBedId
();
* 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
PlatElder
elder
=
platElderService
.
getOne
(
new
QueryWrapper
<
PlatElder
>().
lambda
()
*
.
eq
(
PlatElder:
:
getBedId
,
bedId
));
* @param totalMap
if
(
elder
==
null
)
{
* @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
)
{
// 入睡时间开始
String
startSleepTime
=
null
;
int
sleepMinute
=
0
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
if
(!
analysisVO
.
getIsAction
()
&&
!
analysisVO
.
getIsMoveBed
())
{
if
(
StrUtil
.
isBlank
(
startSleepTime
))
{
startSleepTime
=
entry
.
getKey
();
}
sleepMinute
++;
continue
;
continue
;
}
}
if
(
StringUtils
.
isEmpty
(
startSleepTime
)
&&
sleepMinute
==
0
)
{
PlatDevice
platDevice
=
platDeviceService
.
getById
(
platRoomBedDevice
.
getDeviceId
());
if
(
platDevice
==
null
)
{
continue
;
continue
;
}
}
if
(
sleepMinute
>
sleepTimeActionDuration
*
60
)
{
String
tenantId
=
elder
.
getTenantId
();
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepTime
);
for
(
String
hourRange
:
dayHourRangeList
)
{
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
String
[]
hourRangeArray
=
hourRange
.
split
(
"~"
);
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
());
List
<
DeviceOperationLogEntity
>
deviceOperationLogEntities
=
productDeviceService
.
getDeviceLogByTimeRange
(
platDevice
.
getOriDeviceId
(),
"reportProperty"
,
5000
,
hourRangeArray
[
0
],
hourRangeArray
[
1
]);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
if
(
CollectionUtils
.
isEmpty
(
deviceOperationLogEntities
))
{
}
continue
;
startSleepTime
=
null
;
sleepMinute
=
0
;
}
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
new
TreeMap
<>();
if
(
CollUtil
.
isEmpty
(
sleepTimeAnalysisVOList
))
{
return
sleepTypeMap
;
}
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
)
{
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreatheList
=
deviceOperationLogEntities
.
stream
()
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
.
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
);
}
}
sleepTypeMap
.
put
(
timeAnalysisVO
.
getStartTime
(),
sleepTotalMap
);
TreeMap
<
String
,
AnalysisVO
>
treeMap
=
new
TreeMap
<>(
statisticsMap
);
totalMap
.
putAll
(
treeMap
);
statisticsMap
.
clear
();
treeMap
.
clear
();
}
}
}
return
sleepTypeMap
;
}
/**
if
(
totalMap
.
isEmpty
())
{
* 获取起床数据(离床大于0.5小时,或者每分钟大于30秒体动值大于50持续10min,且在两小时内无再次入睡
*
* @param totalMap
* @param riseLeaveThreshold
* @param riseActionDuration
* @param sleepTimeAnalysisVOList
*/
private
void
getUp
(
TreeMap
<
String
,
AnalysisVO
>
totalMap
,
double
riseLeaveThreshold
,
int
riseActionDuration
,
double
repeatSleepThreshold
,
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
,
SleepCountDTO
sleepCountDTO
)
{
Integer
actionCount
=
0
;
Integer
turnedCount
=
0
;
// 起床时间
String
startGetupTime
=
null
;
int
getupMinute
=
0
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
actionCount
+=
analysisVO
.
getActionCount
();
turnedCount
+=
analysisVO
.
getTurnedCount
();
if
(
analysisVO
.
getIsMoveBed
())
{
if
(
StrUtil
.
isBlank
(
startGetupTime
))
{
startGetupTime
=
entry
.
getKey
();
}
getupMinute
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startGetupTime
)
&&
getupMinute
==
0
)
{
continue
;
}
if
(
getupMinute
>
riseLeaveThreshold
*
60
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startGetupTime
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
startGetupTime
=
null
;
getupMinute
=
0
;
}
sleepCountDTO
.
setTotalActionCount
(
actionCount
);
sleepCountDTO
.
setTotalTurnedCount
(
turnedCount
);
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepTimeAnalysisVOList
.
stream
().
filter
(
f
->
SleepTypeEnum
.
SLEEP
.
getCode
().
equals
(
f
.
getType
())).
collect
(
Collectors
.
toList
());
String
startGetupTime2
=
null
;
int
getupMinute2
=
0
;
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
AnalysisVO
analysisVO
=
entry
.
getValue
();
if
(
analysisVO
.
getIsMinuteActionFlag
())
{
if
(
StrUtil
.
isBlank
(
startGetupTime
))
{
startGetupTime2
=
entry
.
getKey
();
}
getupMinute2
++;
continue
;
}
if
(
StringUtils
.
isEmpty
(
startGetupTime2
)
&&
getupMinute2
==
0
)
{
continue
;
continue
;
}
}
if
(
getupMinute2
>
riseActionDuration
&&
startGetupTime2
!=
null
)
{
LocalDateTime
startDateTime
=
LocalDateTime
.
parse
(
startGetupTime2
,
DEFAULT_FORMATTER
);
SleepTimeAnalysisVO
repeatSleep
=
sleepList
.
stream
().
filter
(
f
->
Duration
.
between
(
startDateTime
,
LocalDateTime
.
parse
(
f
.
getStartTime
(),
DEFAULT_FORMATTER
)).
toMinutes
()
<
repeatSleepThreshold
*
60
)
.
findFirst
().
orElse
(
null
);
// 两小时内不在有入睡
if
(
repeatSleep
==
null
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startGetupTime2
);
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
}
startGetupTime2
=
null
;
getupMinute2
=
0
;
}
}
/**
* 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
int
totalActionCount
=
0
;
*
int
totalTurnedCount
=
0
;
* @param sleepTypeMap
// 记录长者不同类型的睡眠时间
* @param analysisModel
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
=
Lists
.
newArrayList
();
* @param sleepTimeAnalysisVOList
SleepTimeAnalysisVO
sleepTimeAnalysisVO
;
*/
private
void
deepSleepData
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
// 判断睡觉时间
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
String
startSleepTime
=
null
;
// 入睡时间开始
int
sleepDeepMinute
=
0
;
int
sleepMinute
=
0
;
String
startSleepDeepTime
=
null
;
int
sleepDeepActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionThreshold
());
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
int
sleepDeepActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepActionTimeBegin
());
AnalysisVO
analysisVO
=
entry
.
getValue
();
int
sleepDeepBreatheMin
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMin
());
if
(!
analysisVO
.
getIsAction
()
&&
!
analysisVO
.
getIsMoveBed
())
{
int
sleepDeepBreatheMax
=
Integer
.
parseInt
(
analysisModel
.
getSleepDeepBreatheMax
());
if
(
StringUtils
.
isEmpty
(
startSleepTime
))
{
if
(
CollUtil
.
isEmpty
(
sleepTypeMap
))
{
startSleepTime
=
entry
.
getKey
();
return
;
}
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
();
boolean
actionFlag
=
analysisVO
.
getActionCount
()
==
sleepDeepActionThreshold
;
boolean
turnedFlag
=
analysisVO
.
getTurnedCount
()
==
sleepDeepActionThreshold
;
if
(
actionFlag
&&
turnedFlag
&&
sleepDeepBreatheMin
<=
analysisVO
.
getAvgBr
()
&&
sleepDeepBreatheMax
>=
analysisVO
.
getAvgBr
())
{
if
(
StringUtils
.
isEmpty
(
startSleepDeepTime
))
{
startSleepDeepTime
=
voEntry
.
getKey
();
}
}
sleep
Deep
Minute
++;
sleepMinute
++;
continue
;
continue
;
}
}
if
(
StringUtils
.
isEmpty
(
startSleep
DeepTime
)
&&
sleepD
eepMinute
==
0
)
{
if
(
StringUtils
.
isEmpty
(
startSleep
Time
)
&&
sl
eepMinute
==
0
)
{
continue
;
continue
;
}
}
if
(
sleep
DeepMinute
>
sleepDeepActionTimeBegin
)
{
if
(
sleep
Minute
>
sleepTimeActionDuration
*
60
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleep
Deep
Time
);
sleepTimeAnalysisVO
.
setStartTime
(
startSleepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
voE
ntry
.
getKey
());
sleepTimeAnalysisVO
.
setEndTime
(
e
ntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP
_DEEP
.
getCode
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
}
startSleepDeepTime
=
null
;
startSleepTime
=
null
;
sleepDeepMinute
=
0
;
sleepMinute
=
0
;
}
}
}
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
new
TreeMap
<>();
}
for
(
SleepTimeAnalysisVO
timeAnalysisVO
:
sleepTimeAnalysisVOList
)
{
boolean
startTimeFlag
=
false
;
private
SleepCountDTO
deepSleepAndRestData
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
TreeMap
<
String
,
AnalysisVO
>
sleepTotalMap
=
new
TreeMap
<>();
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
String
startSleepDeepTime
;
if
(
entry
.
getKey
().
equals
(
timeAnalysisVO
.
getStartTime
()))
{
int
napThreshold
=
Integer
.
parseInt
(
analysisModel
.
getNapThreshold
());
startTimeFlag
=
true
;
int
napDuration
=
Integer
.
parseInt
(
analysisModel
.
getNapDuration
());
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
}
List
<
String
>
startTimeList
=
new
ArrayList
<>(
sleepTypeMap
.
keySet
());
if
(
entry
.
getKey
().
equals
(
timeAnalysisVO
.
getEndTime
()))
{
List
<
LocalDateTime
>
timeList
=
new
ArrayList
<>();
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
startTimeList
.
forEach
(
t
->
timeList
.
add
(
LocalDateTime
.
parse
(
t
,
DEFAULT_FORMATTER
)));
startTimeFlag
=
false
;
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
daySleepMap
=
new
TreeMap
<>();
}
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
restSleepMap
=
new
TreeMap
<>();
if
(
startTimeFlag
)
{
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
sleepTotalMap
.
put
(
entry
.
getKey
(),
entry
.
getValue
());
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
}
// 每分钟的数据
sleepTypeMap
.
put
(
timeAnalysisVO
.
getType
(),
sleepTotalMap
);
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
);
}
LocalDateTime
startTime
=
LocalDateTime
.
parse
(
startSleepDeepTime
,
DEFAULT_FORMATTER
);
LocalDateTime
repeatSleepTime
=
timeList
.
stream
().
filter
(
f
->
Duration
.
between
(
startTime
,
f
).
toMinutes
()
<=
napDuration
*
60L
).
findFirst
().
orElse
(
null
);
// 小憩:深度睡眠和浅度睡眠<=3小时,且2小时内无再次入睡
if
(
sleepMinute
<=
napThreshold
*
60
&&
repeatSleepTime
==
null
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startSleepDeepTime
);
sleepTimeAnalysisVO
.
setEndTime
(
lastEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
RESTING
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
daySleepMap
.
put
(
startSleepDeepTime
,
sleepMap
);
}
}
}
SleepCountDTO
sleepCountDTO
=
new
SleepCountDTO
();
sleepCountDTO
.
setDaySleepMap
(
daySleepMap
);
sleepCountDTO
.
setRestSleepMap
(
restSleepMap
);
return
sleepCountDTO
;
}
/**
// 判断起床时间
* 中度睡眠(体动和翻身次数10分钟内小于3次)
String
startGetupTime
=
null
;
// 起床时间开始
*
int
getupMinute
=
0
;
* @param sleepTypeMap
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
* @param analysisModel
AnalysisVO
analysisVO
=
entry
.
getValue
();
* @param sleepTimeAnalysisVOList
if
(
analysisVO
.
getIsMoveBed
())
{
*/
if
(
StringUtils
.
isEmpty
(
startGetupTime
))
{
private
void
middleSleep
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
SaasSleepAnalysisModel
analysisModel
,
startGetupTime
=
entry
.
getKey
();
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
int
sleepModerateActionThreshold
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionThreshold
());
int
sleepModerateActionTimeBegin
=
Integer
.
parseInt
(
analysisModel
.
getSleepModerateActionTimeBegin
());
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
();
}
}
sleepMid
Minute
++;
getup
Minute
++;
continue
;
continue
;
}
}
if
(
StringUtils
.
isEmpty
(
start
SleepMidTime
)
&&
sleepMid
Minute
==
0
)
{
if
(
StringUtils
.
isEmpty
(
start
GetupTime
)
&&
getup
Minute
==
0
)
{
continue
;
continue
;
}
}
if
(
sleepMidMinute
>
sleepModerateActionTimeBegin
)
{
if
(
getupMinute
>
riseLeaveThreshold
*
60
)
{
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
start
SleepMid
Time
);
sleepTimeAnalysisVO
.
setStartTime
(
start
Getup
Time
);
sleepTimeAnalysisVO
.
setEndTime
(
voE
ntry
.
getKey
());
sleepTimeAnalysisVO
.
setEndTime
(
e
ntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
}
}
start
SleepMid
Time
=
null
;
start
Getup
Time
=
null
;
sleepMid
Minute
=
0
;
getup
Minute
=
0
;
}
}
}
}
/**
// 判断起床时间
* 清醒(每分钟体动值大于60或无人)
String
startGetupTime2
=
null
;
// 起床时间开始
*
int
getupMinute2
=
0
;
* @param sleepTypeMap
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
entry
:
totalMap
.
entrySet
())
{
* @param sleepTimeAnalysisVOList
AnalysisVO
analysisVO
=
entry
.
getValue
();
*/
if
(
analysisVO
.
getIsMinuteActionFlag
())
{
private
void
sober
(
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
,
if
(
StringUtils
.
isEmpty
(
startGetupTime2
))
{
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
)
{
startGetupTime2
=
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
++;
getupMinute2
++;
continue
;
continue
;
}
}
if
(
StringUtils
.
isEmpty
(
start
AwakeTime
)
&&
awakeMinute
==
0
)
{
if
(
StringUtils
.
isEmpty
(
start
GetupTime2
)
&&
getupMinute2
==
0
)
{
continue
;
continue
;
}
}
SleepTimeAnalysisVO
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
if
(
getupMinute2
>
riseActionDuration
)
{
sleepTimeAnalysisVO
.
setStartTime
(
startAwakeTime
);
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
sleepTimeAnalysisVO
.
setStartTime
(
startGetupTime2
);
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SOBER
.
getCode
());
sleepTimeAnalysisVO
.
setEndTime
(
entry
.
getKey
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
GETUP
.
getCode
());
startAwakeTime
=
null
;
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
awakeMinute
=
0
;
}
}
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
);
}
startSleepDeepTime
=
null
;
sleepDeepMinute
=
0
;
}
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
.
containsKey
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
DAY_SLEEP
.
getCode
())
:
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepMap
.
containsKey
(
SleepTypeEnum
.
SLEEP
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP
.
getCode
())
:
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
deepList
=
sleepMap
.
containsKey
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP_DEEP
.
getCode
())
:
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
moderateList
=
sleepMap
.
containsKey
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
())
:
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
getUpList
=
sleepMap
.
containsKey
(
SleepTypeEnum
.
GETUP
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
GETUP
.
getCode
())
:
new
ArrayList
<>();
List
<
SleepTimeAnalysisVO
>
soberList
=
sleepMap
.
containsKey
(
SleepTypeEnum
.
SOBER
.
getCode
())
?
sleepMap
.
get
(
SleepTypeEnum
.
SOBER
.
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
);
List
<
SleepTimeAnalysisVO
>
lightSleepList
=
new
ArrayList
<>();
if
(
CollUtil
.
isNotEmpty
(
sleepList
))
{
lightSleepList
=
sleepList
;
if
(
CollUtil
.
isNotEmpty
(
deepList
))
{
lightSleepList
.
removeAll
(
deepList
);
}
}
if
(
CollUtil
.
isNotEmpty
(
moderateList
))
{
lightSleepList
.
removeAll
(
moderateList
);
}
}
sleepTimeDTO
.
setLightList
(
lightSleepList
);
return
sleepTimeDTO
;
}
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
);
EvaluateReportVO
sleepReport
=
saasSleepEvaluateReportService
.
getByScore
(
Long
.
parseLong
(
score
));
// 长者一天的睡眠分析
PlatElderSleepAnalysis
elderSleepAnalysis
=
new
PlatElderSleepAnalysis
();
elderSleepAnalysis
.
setElderId
(
elderId
);
elderSleepAnalysis
.
setActionCount
(
sleepCountDTO
.
getTotalActionCount
());
elderSleepAnalysis
.
setTurnedCount
(
sleepCountDTO
.
getTotalTurnedCount
());
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
(
oriDeviceId
);
platElderSleepAnalysisService
.
save
(
elderSleepAnalysis
);
return
elderSleepAnalysis
;
}
private
List
<
PlatElderSleep
>
saveElderSleep
(
SleepTimeDTO
sleepTimeDTO
,
String
platElderId
,
String
currentDate
)
{
// 中度睡眠
List
<
PlatElderSleep
>
elderSleepList
=
new
ArrayList
<>();
int
sleepMidMinute
=
0
;
List
<
SleepTimeAnalysisVO
>
deepList
=
sleepTimeDTO
.
getDeepList
();
String
startSleepMidTime
=
null
;
// 入睡时间开始
List
<
SleepTimeAnalysisVO
>
moderateList
=
sleepTimeDTO
.
getMidList
();
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
List
<
SleepTimeAnalysisVO
>
lightList
=
sleepTimeDTO
.
getLightList
();
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
List
<
SleepTimeAnalysisVO
>
soberList
=
sleepTimeDTO
.
getSoberList
();
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepTimeDTO
.
getSleepList
();
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
List
<
SleepTimeAnalysisVO
>
restList
=
sleepTimeDTO
.
getRestList
();
if
(
analysisVO
.
getActionCount
()
<
sleepModerateActionThreshold
&&
analysisVO
.
getTurnedCount
()
<
sleepModerateActionThreshold
)
{
if
(
CollUtil
.
isNotEmpty
(
sleepList
))
{
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
))
{
for
(
SleepTimeAnalysisVO
analysisVO
:
sleepList
)
{
startSleepMidTime
=
voEntry
.
getKey
();
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
}
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepMidMinute
++;
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
continue
;
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
}
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
if
(
StringUtils
.
isEmpty
(
startSleepMidTime
)
&&
sleepMidMinute
==
0
)
{
continue
;
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
}
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
if
(
sleepMidMinute
>
sleepModerateActionTimeBegin
)
{
platElderSleep
.
setElderId
(
platElderId
);
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SLEEP
.
getType
());
sleepTimeAnalysisVO
.
setStartTime
(
startSleepMidTime
);
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getCode
());
platElderSleep
.
setHappenDate
(
currentDate
);
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
elderSleepList
.
add
(
platElderSleep
);
}
}
startSleepMidTime
=
null
;
}
sleepMidMinute
=
0
;
if
(
CollUtil
.
isNotEmpty
(
restList
))
{
}
for
(
SleepTimeAnalysisVO
analysisVO
:
restList
)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setElderId
(
platElderId
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
RESTING
.
getType
());
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
}
if
(
CollUtil
.
isNotEmpty
(
deepList
))
{
// 清醒
for
(
SleepTimeAnalysisVO
analysisVO
:
deepList
)
{
int
awakeMinute
=
0
;
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
String
startAwakeTime
=
null
;
// 入睡时间开始
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
for
(
Map
.
Entry
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
entry
:
sleepTypeMap
.
entrySet
())
{
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
TreeMap
<
String
,
AnalysisVO
>
sleepMap
=
entry
.
getValue
();
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
for
(
Map
.
Entry
<
String
,
AnalysisVO
>
voEntry
:
sleepMap
.
entrySet
())
{
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
AnalysisVO
analysisVO
=
voEntry
.
getValue
();
if
(
analysisVO
.
getAwakeMinuteActionFlag
()
||
analysisVO
.
getIsMoveBed
())
{
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
if
(
StringUtils
.
isEmpty
(
startAwakeTime
))
{
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
startAwakeTime
=
voEntry
.
getKey
();
platElderSleep
.
setElderId
(
platElderId
);
}
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SLEEP_DEEP
.
getType
());
awakeMinute
++;
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
continue
;
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
}
platElderSleep
.
setHappenDate
(
currentDate
);
if
(
StringUtils
.
isEmpty
(
startAwakeTime
)
&&
awakeMinute
==
0
)
{
elderSleepList
.
add
(
platElderSleep
);
continue
;
}
sleepTimeAnalysisVO
=
new
SleepTimeAnalysisVO
();
sleepTimeAnalysisVO
.
setStartTime
(
startAwakeTime
);
sleepTimeAnalysisVO
.
setEndTime
(
voEntry
.
getKey
());
sleepTimeAnalysisVO
.
setType
(
SleepTypeEnum
.
SOBER
.
getCode
());
sleepTimeAnalysisVOList
.
add
(
sleepTimeAnalysisVO
);
startAwakeTime
=
null
;
awakeMinute
=
0
;
}
}
}
}
if
(
CollUtil
.
isNotEmpty
(
moderateList
))
{
Map
<
String
,
List
<
SleepTimeAnalysisVO
>>
sleepMap
=
StreamUtil
.
groupBy
(
sleepTimeAnalysisVOList
,
SleepTimeAnalysisVO:
:
getType
);
for
(
SleepTimeAnalysisVO
analysisVO
:
sleepTimeDTO
.
getMidList
())
{
List
<
SleepTimeAnalysisVO
>
sleepList
=
sleepMap
.
get
(
SleepTypeEnum
.
SLEEP
.
getCode
());
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
if
(
CollectionUtils
.
isEmpty
(
sleepList
))
{
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
continue
;
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setElderId
(
platElderId
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SLEEP_MODERATE
.
getType
());
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
}
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型
if
(
CollUtil
.
isNotEmpty
(
lightList
))
{
List
<
SleepTimeAnalysisVO
>
finalSleepTimeAnalysisList
=
Lists
.
newArrayList
();
// 记录多端睡眠记录
for
(
SleepTimeAnalysisVO
analysisVO
:
lightList
)
{
SleepTimeAnalysisVO
sleepTimeAnalysis
;
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
for
(
int
i
=
0
;
i
<
sleepList
.
size
();
i
++)
{
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
sleepTimeAnalysis
=
new
SleepTimeAnalysisVO
();
List
<
SleepTimeAnalysisVO
>
deepList
=
Lists
.
newArrayList
();
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
List
<
SleepTimeAnalysisVO
>
midList
=
Lists
.
newArrayList
();
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
List
<
SleepTimeAnalysisVO
>
lightList
=
Lists
.
newArrayList
();
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
List
<
SleepTimeAnalysisVO
>
soberList
=
Lists
.
newArrayList
();
platElderSleep
.
setElderId
(
platElderId
);
SleepTimeAnalysisVO
timeAnalysisVO
=
sleepList
.
get
(
i
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SLEEP_LIGHTNESS
.
getType
());
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
BeanUtils
.
copyProperties
(
timeAnalysisVO
,
sleepTimeAnalysis
);
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
String
startTime
=
timeAnalysisVO
.
getStartTime
();
platElderSleep
.
setHappenDate
(
currentDate
);
String
endTime
=
timeAnalysisVO
.
getEndTime
();
elderSleepList
.
add
(
platElderSleep
);
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
);
}
// 获取睡眠评估标准配置
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
;
}
}
}
}
if
(
CollUtil
.
isNotEmpty
(
soberList
))
{
long
deepScore
=
0
;
for
(
SleepTimeAnalysisVO
analysisVO
:
soberList
)
{
for
(
int
i
=
0
;
i
<
sleepDeepConfigList
.
size
();
i
++)
{
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
long
hour
=
deepTime
/
60
;
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
SleepConfigVO
sleepConfigVO
=
sleepDeepConfigList
.
get
(
i
);
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
if
(
i
==
0
&&
Objects
.
equals
(
hour
,
configHour
))
{
deepScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
}
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
if
(
i
>
0
&&
hour
>
configHour
)
{
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
deepScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
platElderSleep
.
setElderId
(
platElderId
);
}
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
SOBER
.
getType
());
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
}
saasSleepEvaluateStandardReportVO
.
setDeepScore
(
deepScore
);
List
<
SleepTimeAnalysisVO
>
getUpList
=
sleepTimeDTO
.
getGetUpList
();
long
soberScore
=
0
;
if
(
CollUtil
.
isNotEmpty
(
getUpList
))
{
for
(
int
i
=
0
;
i
<
soberConfigList
.
size
();
i
++)
{
for
(
SleepTimeAnalysisVO
analysisVO
:
getUpList
)
{
SleepConfigVO
sleepConfigVO
=
soberConfigList
.
get
(
i
);
PlatSleepRangeVO
sleepRangeVO
=
new
PlatSleepRangeVO
();
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
sleepRangeVO
.
setStartTime
(
analysisVO
.
getStartTime
());
if
(
i
==
0
&&
soberCount
!=
0
)
{
sleepRangeVO
.
setEndTime
(
analysisVO
.
getEndTime
());
soberScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
())
*
soberCount
;
sleepRangeVO
.
setSleepType
(
analysisVO
.
getType
());
}
if
(
i
>
0
&&
soberTime
>
configHour
)
{
PlatElderSleep
platElderSleep
=
new
PlatElderSleep
();
soberScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
platElderSleep
.
setStartSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getStartTime
(),
DEFAULT_FORMATTER
));
}
platElderSleep
.
setEndSleep
(
LocalDateTime
.
parse
(
analysisVO
.
getEndTime
(),
DEFAULT_FORMATTER
));
platElderSleep
.
setElderId
(
platElderId
);
platElderSleep
.
setElderSleepType
(
SleepTypeEnum
.
GETUP
.
getType
());
platElderSleep
.
setSleepRecord
(
Lists
.
newArrayList
(
sleepRangeVO
));
platElderSleep
.
setInterval
(
analysisVO
.
getInterval
());
platElderSleep
.
setHappenDate
(
currentDate
);
elderSleepList
.
add
(
platElderSleep
);
}
}
}
saasSleepEvaluateStandardReportVO
.
setSoberScore
(
soberScore
);
platElderSleepService
.
saveBatch
(
elderSleepList
);
return
elderSleepList
;
}
private
SleepTimeMinuteDTO
getSleepTimeMinute
(
SleepTimeDTO
sleepTimeDTO
)
{
long
lightScore
=
0
;
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
long
lightHour
=
lightTime
/
60
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
long
lightnessConfigHour
=
Long
.
parseLong
(
lightnessConfigVO
.
getHour
());
@TenantIdIgnore
if
(
Objects
.
equals
(
lightHour
,
lightnessConfigHour
))
{
public
List
<
ElderSleepAnalysisVO
>
elderSleepSleepAnalysisTask
(
Integer
month
,
Integer
day
)
{
lightScore
=
Long
.
parseLong
(
lightnessConfigVO
.
getScore
());
}
saasSleepEvaluateStandardReportVO
.
setLightScore
(
lightScore
);
List
<
String
>
dayHourRangeList
=
getLastDayHourRange
(
month
,
day
);
long
sleepScore
=
0
;
String
currentDate
=
LocalDate
.
now
().
minusDays
(
1
).
toString
();
for
(
int
i
=
0
;
i
<
sleepTimeConfigList
.
size
();
i
++)
{
if
(
month
!=
null
&&
day
!=
null
)
{
long
hour
=
sleepTime
/
60
;
currentDate
=
LocalDate
.
of
(
2024
,
month
,
day
).
minusDays
(
1
).
toString
();
SleepConfigVO
sleepConfigVO
=
sleepTimeConfigList
.
get
(
i
);
}
long
configHour
=
Long
.
parseLong
(
sleepConfigVO
.
getHour
());
SaasSleepAnalysisModel
analysisModel
=
saasSleepAnalysisModelService
.
getOne
(
new
QueryWrapper
<
SaasSleepAnalysisModel
>().
lambda
()
if
(
i
==
0
&&
Objects
.
equals
(
hour
,
configHour
))
{
.
orderByDesc
(
BaseEntity:
:
getCreateBy
)
sleepScore
=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
.
last
(
"limit 1"
));
}
List
<
PlatRoomBedDevice
>
platRoomBedDeviceList
=
roomBedDeviceService
.
list
(
new
QueryWrapper
<
PlatRoomBedDevice
>()
if
(
i
>
0
&&
hour
>
configHour
)
{
.
lambda
().
isNotNull
(
PlatRoomBedDevice:
:
getBedId
));
sleepScore
+=
Long
.
parseLong
(
sleepConfigVO
.
getScore
());
SaasSleepEvaluateStandardReport
evaluateStandardReport
=
saasSleepEvaluateStandardReportService
.
getOne
(
new
QueryWrapper
<
SaasSleepEvaluateStandardReport
>().
lambda
()
}
.
orderByDesc
(
BaseEntity:
:
getCreateDate
)
}
.
last
(
"limit 1"
));
saasSleepEvaluateStandardReportVO
.
setSleepScore
(
sleepScore
);
double
sleepTimeActionDuration
=
Double
.
parseDouble
(
analysisModel
.
getSleepTimeActionDuration
());
long
totalScore
=
sleepScore
+
deepScore
+
lightScore
-
soberScore
;
int
riseActionDuration
=
Integer
.
parseInt
(
analysisModel
.
getRiseActionDuration
());
saasSleepEvaluateStandardReportVO
.
setTotalScore
(
totalScore
);
double
riseLeaveThreshold
=
Double
.
parseDouble
(
analysisModel
.
getRiseLeaveThreshold
());
double
repeatSleepThreshold
=
Double
.
parseDouble
(
analysisModel
.
getRiseRepeatThreshold
());
List
<
ElderSleepAnalysisVO
>
result
=
new
ArrayList
<>();
for
(
PlatRoomBedDevice
platRoomBedDevice
:
platRoomBedDeviceList
)
{
// 记录长者一天睡眠的记录
TreeMap
<
String
,
AnalysisVO
>
totalMap
=
new
TreeMap
<>();
long
daySleepTime
=
0
;
long
dayRestTime
=
0
;
for
(
PlatElderSleep
elderSleep
:
elderSleepList
)
{
elderSleep
.
setElderId
(
elder
.
getId
());
elderSleep
.
setHappenDate
(
currentDate
);
elderSleep
.
setTenantId
(
tenantId
);
String
bedId
=
platRoomBedDevice
.
getBedId
();
if
(
ElderSleepType
.
SLEEP
.
getCode
()
==
elderSleep
.
getElderSleepType
())
{
PlatElder
elder
=
platElderService
.
getOne
(
new
QueryWrapper
<
PlatElder
>().
lambda
()
daySleepTime
+=
elderSleep
.
getInterval
();
.
eq
(
PlatElder:
:
getBedId
,
bedId
));
if
(
elder
==
null
)
{
continue
;
}
PlatDevice
platDevice
=
platDeviceService
.
getById
(
platRoomBedDevice
.
getDeviceId
());
if
(
platDevice
==
null
)
{
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
;
}
}
List
<
DeviceInfoContentBreathe
>
deviceInfoContentBreatheList
=
deviceOperationLogEntities
.
stream
()
if
(
ElderSleepType
.
REST
.
getCode
()
==
elderSleep
.
getElderSleepType
())
{
.
filter
(
deviceOperationLogEntity
->
deviceOperationLogEntity
.
getType
().
contains
(
"reportProperty"
))
dayRestTime
+=
elderSleep
.
getInterval
();
.
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
();
TreeMap
<
String
,
AnalysisVO
>
statisticsMap
=
getPerMinuteData
(
minuteMap
,
analysisModel
);
if
(
CollUtil
.
isNotEmpty
(
statisticsMap
))
{
totalMap
.
putAll
(
statisticsMap
);
}
}
}
}
if
(
CollUtil
.
isEmpty
(
totalMap
))
{
int
riseRepeatThreshold
=
Integer
.
parseInt
(
analysisModel
.
getRiseRepeatThreshold
());
continue
;
platElderSleepService
.
saveBatch
(
elderSleepList
);
}
String
score
=
calculateScores
(
daySleepTime
,
dayRestTime
,
deepTime
,
soberTime
,
lightTime
,
evaluateStandardReport
);
// 记录长者不同类型的睡眠时间
EvaluateReportVO
sleepReport
=
saasSleepEvaluateReportService
.
getByScore
(
Long
.
parseLong
(
score
));
List
<
SleepTimeAnalysisVO
>
sleepTimeAnalysisVOList
=
Lists
.
newArrayList
();
// 入睡时间
// 长者一天的睡眠分析
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
sleepTypeMap
=
PlatElderSleepAnalysis
elderSleepAnalysis
=
new
PlatElderSleepAnalysis
();
getFallAsleepData
(
totalMap
,
sleepTimeActionDuration
,
sleepTimeAnalysisVOList
);
elderSleepAnalysis
.
setElderId
(
elder
.
getId
());
// 获取睡眠和小憩
elderSleepAnalysis
.
setActionCount
(
totalActionCount
);
SleepCountDTO
sleepCountDTO
=
deepSleepAndRestData
(
sleepTypeMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
elderSleepAnalysis
.
setTurnedCount
(
totalTurnedCount
);
// 满足睡眠条件的map
elderSleepAnalysis
.
setHappenDate
(
currentDate
);
TreeMap
<
String
,
TreeMap
<
String
,
AnalysisVO
>>
daySleepMap
=
sleepCountDTO
.
getDaySleepMap
();
elderSleepAnalysis
.
setSleepScore
(
score
);
// 深度睡眠
elderSleepAnalysis
.
setSleepTime
(
String
.
valueOf
(
daySleepTime
));
deepSleepData
(
daySleepMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
elderSleepAnalysis
.
setRestTime
(
String
.
valueOf
(
dayRestTime
));
// 中度睡眠
elderSleepAnalysis
.
setSleepResult
(
sleepReport
.
getResult
());
middleSleep
(
daySleepMap
,
analysisModel
,
sleepTimeAnalysisVOList
);
elderSleepAnalysis
.
setTenantId
(
tenantId
);
// 清醒
elderSleepAnalysis
.
setSleepEvaluate
(
sleepReport
.
getEvaluate
());
sober
(
sleepTypeMap
,
sleepTimeAnalysisVOList
);
elderSleepAnalysis
.
setOriDeviceId
(
platDevice
.
getOriDeviceId
());
// 起床
result
.
add
(
elderSleepAnalysis
);
getUp
(
totalMap
,
riseLeaveThreshold
,
riseActionDuration
,
repeatSleepThreshold
,
sleepTimeAnalysisVOList
,
sleepCountDTO
);
platElderSleepAnalysisService
.
save
(
elderSleepAnalysis
);
//浅睡
SleepTimeDTO
sleepTimeDTO
=
groupSleepData
(
sleepTimeAnalysisVOList
);
List
<
PlatElderSleep
>
platElderSleeps
=
saveElderSleep
(
sleepTimeDTO
,
elder
.
getId
(),
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
;
return
result
;
}
}
...
@@ -883,7 +777,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
...
@@ -883,7 +777,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return
DEFAULT_FORMATTER
.
format
(
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
time
),
ZoneId
.
systemDefault
()));
return
DEFAULT_FORMATTER
.
format
(
LocalDateTime
.
ofInstant
(
Instant
.
ofEpochMilli
(
time
),
ZoneId
.
systemDefault
()));
}
}
public
List
<
String
>
getLastDayHourRange
(
Integer
month
,
Integer
day
)
{
public
List
<
String
>
getLastDayHourRange
(
Integer
month
,
Integer
day
)
{
int
count
=
24
;
int
count
=
24
;
LocalDateTime
localDateTime
=
LocalDateTime
.
now
();
LocalDateTime
localDateTime
=
LocalDateTime
.
now
();
if
(
month
!=
null
&&
day
!=
null
)
{
if
(
month
!=
null
&&
day
!=
null
)
{
...
@@ -900,4 +794,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
...
@@ -900,4 +794,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return
list
;
return
list
;
}
}
public
static
LocalDateTime
getDayStart
(
LocalDate
time
)
{
return
time
.
atTime
(
0
,
0
,
0
);
}
}
}
server-service/src/main/java/com/makeit/service/platform/space/impl/PlatRegionSettingFixServiceImpl.java
View file @
bacc1801
...
@@ -10,6 +10,7 @@ import com.makeit.entity.platform.space.PlatRegionSettingFix;
...
@@ -10,6 +10,7 @@ import com.makeit.entity.platform.space.PlatRegionSettingFix;
import
com.makeit.mapper.platform.space.PlatRegionSettingFixMapper
;
import
com.makeit.mapper.platform.space.PlatRegionSettingFixMapper
;
import
com.makeit.service.platform.device.PlatDeviceService
;
import
com.makeit.service.platform.device.PlatDeviceService
;
import
com.makeit.service.platform.space.PlatRegionSettingFixService
;
import
com.makeit.service.platform.space.PlatRegionSettingFixService
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -18,9 +19,7 @@ import org.springframework.stereotype.Service;
...
@@ -18,9 +19,7 @@ import org.springframework.stereotype.Service;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.function.Function
;
import
java.util.function.Function
;
import
java.util.function.Predicate
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
/**
/**
...
@@ -39,21 +38,29 @@ public class PlatRegionSettingFixServiceImpl extends ServiceImpl<PlatRegionSetti
...
@@ -39,21 +38,29 @@ public class PlatRegionSettingFixServiceImpl extends ServiceImpl<PlatRegionSetti
@Override
@Override
public
List
<
PlatRegionSettingDTO
>
list
(
PlatRegionSettingFixQueryDTO
dto
)
{
public
List
<
PlatRegionSettingDTO
>
list
(
PlatRegionSettingFixQueryDTO
dto
)
{
if
(
StringUtils
.
isAnyBlank
(
dto
.
getReportType
(),
dto
.
get
Room
Id
()))
{
if
(
StringUtils
.
isAnyBlank
(
dto
.
getReportType
(),
dto
.
get
Elder
Id
()))
{
return
Lists
.
newArrayList
();
return
Lists
.
newArrayList
();
}
}
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd"
);
LambdaQueryWrapper
<
PlatRegionSettingFix
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
LambdaQueryWrapper
<
PlatRegionSettingFix
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
PlatRegionSettingFix:
:
get
RoomId
,
dto
.
getRoom
Id
());
queryWrapper
.
eq
(
PlatRegionSettingFix:
:
get
ElderId
,
dto
.
getElder
Id
());
if
(
"0"
.
equals
(
dto
.
getReportType
()))
{
if
(
"0"
.
equals
(
dto
.
getReportType
()))
{
queryWrapper
.
eq
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getNow
()));
queryWrapper
.
eq
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getNow
()));
}
else
{
}
else
{
queryWrapper
.
ge
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getStartTime
()));
queryWrapper
.
eq
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getEndTime
()));
queryWrapper
.
le
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getEndTime
()));
}
}
queryWrapper
.
orderByDesc
(
PlatRegionSettingFix:
:
getCreateDate
);
List
<
PlatRegionSettingFix
>
list
=
this
.
list
(
queryWrapper
);
List
<
PlatRegionSettingFix
>
list
=
this
.
list
(
queryWrapper
);
list
=
list
.
stream
().
filter
(
distinctByKey
(
PlatRegionSettingFix:
:
getDeviceId
)).
collect
(
Collectors
.
toList
());
// 兼容部分没有关联长者的数据
if
(
CollectionUtils
.
isEmpty
(
list
))
{
LambdaQueryWrapper
<
PlatRegionSettingFix
>
queryWrapper1
=
new
LambdaQueryWrapper
<>();
queryWrapper1
.
eq
(
PlatRegionSettingFix:
:
getRoomId
,
dto
.
getRoomId
());
if
(
"0"
.
equals
(
dto
.
getReportType
()))
{
queryWrapper1
.
eq
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getNow
()));
}
else
{
queryWrapper1
.
eq
(
PlatRegionSettingFix:
:
getHappenDate
,
dateTimeFormatter
.
format
(
dto
.
getEndTime
()));
}
list
=
this
.
list
(
queryWrapper1
);
}
List
<
String
>
deviceIds
=
list
.
stream
().
map
(
PlatRegionSettingFix:
:
getDeviceId
).
collect
(
Collectors
.
toList
());
List
<
String
>
deviceIds
=
list
.
stream
().
map
(
PlatRegionSettingFix:
:
getDeviceId
).
collect
(
Collectors
.
toList
());
Map
<
String
,
PlatDevice
>
deviceMap
=
platDeviceService
.
listByIds
(
deviceIds
).
stream
().
collect
(
Collectors
.
toMap
(
PlatDevice:
:
getId
,
Function
.
identity
()));
Map
<
String
,
PlatDevice
>
deviceMap
=
platDeviceService
.
listByIds
(
deviceIds
).
stream
().
collect
(
Collectors
.
toMap
(
PlatDevice:
:
getId
,
Function
.
identity
()));
return
list
.
stream
().
map
(
p
->
{
return
list
.
stream
().
map
(
p
->
{
...
@@ -67,9 +74,4 @@ public class PlatRegionSettingFixServiceImpl extends ServiceImpl<PlatRegionSetti
...
@@ -67,9 +74,4 @@ public class PlatRegionSettingFixServiceImpl extends ServiceImpl<PlatRegionSetti
}).
collect
(
Collectors
.
toList
());
}).
collect
(
Collectors
.
toList
());
}
}
private
static
<
T
>
Predicate
<
T
>
distinctByKey
(
Function
<?
super
T
,
Object
>
keyExtractor
)
{
Map
<
Object
,
Boolean
>
seen
=
new
ConcurrentHashMap
<>();
return
t
->
seen
.
putIfAbsent
(
keyExtractor
.
apply
(
t
),
Boolean
.
TRUE
)
==
null
;
}
}
}
server-web/src/main/resources/application-dev.yml
View file @
bacc1801
...
@@ -173,6 +173,13 @@ aliyun:
...
@@ -173,6 +173,13 @@ aliyun:
bucket
:
kangyang-oss
bucket
:
kangyang-oss
baseDir
:
kangyang
baseDir
:
kangyang
elasticsearch
:
host
:
124.71.33.17
port
:
9200
user
:
password
:
scheme
:
http
...
...
server-web/src/main/resources/application-test.yml
View file @
bacc1801
...
@@ -171,4 +171,10 @@ aliyun:
...
@@ -171,4 +171,10 @@ aliyun:
bucket
:
kangyang-oss
bucket
:
kangyang-oss
baseDir
:
kangyang
baseDir
:
kangyang
elasticsearch
:
host
:
124.71.33.17
port
:
9200
user
:
password
:
scheme
:
http
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