Commit bacc1801 by 汪志阳

Merge branch 'dev'

parents d6fa5969 41429564
...@@ -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>
......
...@@ -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>
......
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
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
...@@ -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;
......
...@@ -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));
} }
......
...@@ -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));
} }
......
...@@ -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>
......
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;
}
...@@ -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;
......
...@@ -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);
} }
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);
......
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));
List<PlatRegionSettingFix> settingFixList = Lists.newArrayList();
for (PlatRegionSetting platRegionSetting : platRegionSettingList) {
List<PlatElder> platElders = roomElderMap.get(platRegionSetting.getRoomId());
if (CollectionUtils.isEmpty(platElders)) {
continue;
}
for (PlatElder platElder : platElders) {
PlatRegionSettingFix settingFix = new PlatRegionSettingFix(); PlatRegionSettingFix settingFix = new PlatRegionSettingFix();
BeanUtils.copyProperties(setting, settingFix,"id"); BeanUtils.copyProperties(platRegionSetting, settingFix,"id");
settingFix.setHappenDate(yesDate.toString()); settingFix.setHappenDate(yesDate.toString());
return settingFix; 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);
}
}
} }
...@@ -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(platDeviceListSpace) && CollectionUtils.isEmpty(platDeviceListFall)) { 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) {
DeviceInfoContentFall.Properties properties = deviceInfoContentFall.getProperties();
if (properties == null || CollectionUtils.isEmpty(properties.getTrack())) {
continue;
}
String key = deviceInfoContentFall.getDeviceId() + "_" + JSONObject.toJSONString(properties.getTrack());
if (!existMap.containsKey(key)) {
existMap.put(key, true);
PlatElderCoordinateVO vo = new PlatElderCoordinateVO(); PlatElderCoordinateVO vo = new PlatElderCoordinateVO();
vo.setTimestamp(i.getTimestamp()); vo.setTimestamp(deviceInfoContentFall.getTimestamp());
vo.setTrack(i.getProperties().getTrack()); vo.setTrack(properties.getTrack());
vo.setDeviceId(e.getId()); vo.setDeviceId(e.getId());
vo.setType(2); vo.setType(2);
vo.setPersonState(i.getProperties().getPersonState()); vo.setPersonState(properties.getPersonState());
vo.setMount(i.getProperties().getMount()); vo.setMount(properties.getMount());
vo.setOriDeviceId(e.getOriDeviceId()); vo.setOriDeviceId(e.getOriDeviceId());
voList.add(vo);
return vo; }
}
})
);
}); });
return voList; return voList;
......
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,19 +84,89 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -89,19 +84,89 @@ 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();
int sleepDeepActionThreshold = Integer.parseInt(analysisModel.getSleepDeepActionThreshold());
int sleepDeepActionTimeBegin = Integer.parseInt(analysisModel.getSleepDeepActionTimeBegin());
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin());
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax());
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
List<PlatElderSleepAnalysis> result = new ArrayList<>();
for (PlatRoomBedDevice platRoomBedDevice : platRoomBedDeviceList) {
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>();
String bedId = platRoomBedDevice.getBedId();
PlatElder elder = platElderService.getOne(new QueryWrapper<PlatElder>().lambda()
.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()
.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()) { for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
List<DeviceInfoContentBreathe> deviceInfoContentBreathes = entry.getValue(); deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties; DeviceInfoContentBreathe.Properties breatheProperties;
Integer bodymove;
int reportSize = deviceInfoContentBreathes.size(); int reportSize = deviceInfoContentBreathes.size();
// 记录总呼吸率和总心率 // 记录总呼吸率和总心率
...@@ -120,14 +185,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -120,14 +185,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
AnalysisVO analysisVO = new AnalysisVO(); AnalysisVO analysisVO = new AnalysisVO();
int getUpBodymoveCount = 0; int getUpBodymoveCount = 0;
boolean isMoveBed = false; boolean isMoveBed = false;
// 清醒每分钟体动是否满足要求 (每分钟体动值大于60或无人) boolean awakeMinuteActionFlag = false; // 清醒每分钟体动是否满足要求
boolean awakeMinuteActionFlag = false;
int noPersonCount = 0; // 无人跳过计数 int noPersonCount = 0; // 无人跳过计数
int sleepDeepMinuteCount = 0; // 深睡每分钟体动和翻身次数
int sleepModerateAMinuteCount = 0; // 中度睡每分钟体动和翻身次数
for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) { for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
// 体动指数 // 体动指数
breatheProperties = infoContentBreathe.getProperties(); breatheProperties = infoContentBreathe.getProperties();
Integer bodyMove = breatheProperties.getBodymove(); bodymove = breatheProperties.getBodymove();
int br = breatheProperties.getBr(); int br = breatheProperties.getBr();
int hr = breatheProperties.getHr(); int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人 Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
...@@ -135,11 +201,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -135,11 +201,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (hasPerson == 0) { if (hasPerson == 0) {
noPersonCount++; noPersonCount++;
isMoveBed = true; isMoveBed = true;
awakeMinuteActionFlag = true;
continue; continue;
} }
// 0和255直接跳过 // 0和255直接跳过
if (breatheProperties.getHr() == 255 || breatheProperties.getHr() == 0) { if (breatheProperties.getHr() == 255 || breatheProperties.getHr() == 0 ) {
noPersonCount++; noPersonCount++;
continue; continue;
} }
...@@ -148,44 +213,38 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -148,44 +213,38 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (bodyMove > actionThreshold) { if (bodymove > actionThreshold) {
bodymoveCount++; bodymoveCount++;
} }
if (bodyMove > turnedThreshold) { if (bodymove > turnedThreshold) {
turnoverCount++; turnoverCount++;
} }
// 判断入睡时间的体动阈值 // 判断入睡时间的体动阈值
if (bodyMove >= sleepTimeActionThreshold) { if (bodymove >= sleepTimeActionThreshold) {
isAction = true; isAction = true;
} }
// 起床每分钟体动次数 // 起床每分钟体动次数
if (bodyMove > riseActionThreshold) { if (getUpBodymoveCount > riseActionThreshold) {
getUpBodymoveCount++; getUpBodymoveCount++;
} }
// 清醒 // 清醒
if (bodyMove > awakeThreshold) { if (bodymove > awakeThreshold) {
awakeMinuteActionFlag = true; awakeMinuteActionFlag = true;
} }
if (br > maxBr) { if (br > maxBr) {
maxBr = br; maxBr = br;
} }
if (minBr == 0) { if (br < minBr) {
minBr = br;
} else if (br < minBr) {
minBr = br; minBr = br;
} }
if (hr > maxHr) { if (hr > maxHr) {
maxHr = hr; maxHr = hr;
} }
if (hr < minHr) {
if (minHr == 0) {
minHr = hr;
} else if (hr < minHr) {
minHr = hr; minHr = hr;
} }
if (hasPerson == 1) { if (hasPerson == 1) {
totalBr += br; totalBr += br;
totalHr += hr; totalHr += hr;
...@@ -195,15 +254,18 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -195,15 +254,18 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (reportSize == noPersonCount) { if (reportSize == noPersonCount) {
continue; continue;
} }
// 每分钟的数据
analysisVO.setTotalBr(totalBr); analysisVO.setTotalBr(totalBr);
analysisVO.setAvgBr(totalBr / reportSize); analysisVO.setAvgBr(totalBr / reportSize);
analysisVO.setTotalHr(totalHr); analysisVO.setTotalHr(totalHr);
analysisVO.setAvgHr(totalHr / reportSize); analysisVO.setAvgHr(totalHr / reportSize);
analysisVO.setMaxBr(maxBr); analysisVO.setMaxBr(maxBr);
analysisVO.setMinBr(minBr); analysisVO.setMinBr(minBr);
analysisVO.setMaxHr(maxHr); analysisVO.setMaxHr(maxHr);
analysisVO.setMinHr(minHr); analysisVO.setMinHr(minHr);
analysisVO.setActionCount(bodymoveCount); analysisVO.setActionCount(bodymoveCount);
analysisVO.setTurnedCount(turnoverCount); analysisVO.setTurnedCount(turnoverCount);
analysisVO.setIsAction(isAction); analysisVO.setIsAction(isAction);
...@@ -212,27 +274,31 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -212,27 +274,31 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag); analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag);
statisticsMap.put(entry.getKey(), analysisVO); statisticsMap.put(entry.getKey(), analysisVO);
} }
return statisticsMap; TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap);
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
} }
/** if (totalMap.isEmpty()) {
* 获取满足入睡时间条件数据(体动值小于20且连续0.5小时) continue;
* }
* @param totalMap
* @param sleepTimeActionDuration 体动值持续时间 0.5h
* @param sleepTimeAnalysisVOList int totalActionCount = 0;
* @return key:开始入睡时间,value:睡眠时间段内的数据 int totalTurnedCount = 0;
*/ // 记录长者不同类型的睡眠时间
private TreeMap<String, TreeMap<String, AnalysisVO>> getFallAsleepData(TreeMap<String, AnalysisVO> totalMap, double sleepTimeActionDuration, List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) { SleepTimeAnalysisVO sleepTimeAnalysisVO;
// 入睡时间开始
String startSleepTime = null; // 判断睡觉时间
String startSleepTime = null; // 入睡时间开始
int sleepMinute = 0; int sleepMinute = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue(); AnalysisVO analysisVO = entry.getValue();
if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) { if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startSleepTime)) { if (StringUtils.isEmpty(startSleepTime)) {
startSleepTime = entry.getKey(); startSleepTime = entry.getKey();
} }
sleepMinute++; sleepMinute++;
...@@ -242,19 +308,17 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -242,19 +308,17 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepMinute > sleepTimeActionDuration * 60) { if (sleepMinute > sleepTimeActionDuration * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepTime); sleepTimeAnalysisVO.setStartTime(startSleepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.DAY_SLEEP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
startSleepTime = null; startSleepTime = null;
sleepMinute = 0; sleepMinute = 0;
} }
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>(); TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>();
if (CollUtil.isEmpty(sleepTimeAnalysisVOList)) {
return sleepTypeMap;
}
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) { for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
boolean startTimeFlag = false; boolean startTimeFlag = false;
TreeMap<String, AnalysisVO> sleepTotalMap = new TreeMap<>(); TreeMap<String, AnalysisVO> sleepTotalMap = new TreeMap<>();
...@@ -270,34 +334,17 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -270,34 +334,17 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (startTimeFlag) { if (startTimeFlag) {
sleepTotalMap.put(entry.getKey(), entry.getValue()); sleepTotalMap.put(entry.getKey(), entry.getValue());
} }
sleepTypeMap.put(timeAnalysisVO.getStartTime(), sleepTotalMap); sleepTypeMap.put(timeAnalysisVO.getType(), sleepTotalMap);
}
} }
return sleepTypeMap;
} }
/** // 判断起床时间
* 获取起床数据(离床大于0.5小时,或者每分钟大于30秒体动值大于50持续10min,且在两小时内无再次入睡 String startGetupTime = null; // 起床时间开始
*
* @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; int getupMinute = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue(); AnalysisVO analysisVO = entry.getValue();
actionCount += analysisVO.getActionCount();
turnedCount += analysisVO.getTurnedCount();
if (analysisVO.getIsMoveBed()) { if (analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startGetupTime)) { if (StringUtils.isEmpty(startGetupTime)) {
startGetupTime = entry.getKey(); startGetupTime = entry.getKey();
} }
getupMinute++; getupMinute++;
...@@ -307,7 +354,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -307,7 +354,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (getupMinute > riseLeaveThreshold * 60) { if (getupMinute > riseLeaveThreshold * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime); sleepTimeAnalysisVO.setStartTime(startGetupTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
...@@ -316,17 +363,14 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -316,17 +363,14 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
startGetupTime = null; startGetupTime = null;
getupMinute = 0; 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; // 判断起床时间
String startGetupTime2 = null; // 起床时间开始
int getupMinute2 = 0; int getupMinute2 = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue(); AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getIsMinuteActionFlag()) { if (analysisVO.getIsMinuteActionFlag()) {
if (StrUtil.isBlank(startGetupTime)) { if (StringUtils.isEmpty(startGetupTime2)) {
startGetupTime2 = entry.getKey(); startGetupTime2 = entry.getKey();
} }
getupMinute2++; getupMinute2++;
...@@ -335,50 +379,27 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -335,50 +379,27 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) { if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) {
continue; continue;
} }
if (getupMinute2 > riseActionDuration && startGetupTime2 != null) { if (getupMinute2 > riseActionDuration) {
LocalDateTime startDateTime = LocalDateTime.parse(startGetupTime2, DEFAULT_FORMATTER); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
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.setStartTime(startGetupTime2);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
}
startGetupTime2 = null; startGetupTime2 = null;
getupMinute2 = 0; getupMinute2 = 0;
} }
}
/**
* 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private void deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepDeepMinute = 0; int sleepDeepMinute = 0;
String startSleepDeepTime = null; String startSleepDeepTime = null; // 入睡时间开始
int sleepDeepActionThreshold = Integer.parseInt(analysisModel.getSleepDeepActionThreshold()); // 判断深度睡眠时间
int sleepDeepActionTimeBegin = Integer.parseInt(analysisModel.getSleepDeepActionTimeBegin());
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin());
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax());
if (CollUtil.isEmpty(sleepTypeMap)) {
return;
}
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue(); AnalysisVO analysisVO = voEntry.getValue();
boolean actionFlag = analysisVO.getActionCount() == sleepDeepActionThreshold; totalActionCount += analysisVO.getActionCount();
boolean turnedFlag = analysisVO.getTurnedCount() == sleepDeepActionThreshold; totalTurnedCount += analysisVO.getTurnedCount();
if (actionFlag && turnedFlag if (analysisVO.getActionCount() == sleepDeepActionThreshold && analysisVO.getTurnedCount() == sleepDeepActionThreshold
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) { && sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) { if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = voEntry.getKey(); startSleepDeepTime = voEntry.getKey();
...@@ -390,7 +411,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -390,7 +411,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepDeepMinute > sleepDeepActionTimeBegin) { if (sleepDeepMinute > sleepDeepActionTimeBegin) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime); sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode());
...@@ -401,67 +422,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -401,67 +422,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
} }
} }
}
private SleepCountDTO deepSleepAndRestData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
String startSleepDeepTime;
int napThreshold = Integer.parseInt(analysisModel.getNapThreshold());
int napDuration = Integer.parseInt(analysisModel.getNapDuration());
List<String> startTimeList = new ArrayList<>(sleepTypeMap.keySet());
List<LocalDateTime> timeList = new ArrayList<>();
startTimeList.forEach(t -> timeList.add(LocalDateTime.parse(t, DEFAULT_FORMATTER)));
TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = new TreeMap<>();
TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap = new TreeMap<>();
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
// 每分钟的数据
int sleepMinute = sleepMap.size();
Map.Entry<String, AnalysisVO> lastEntry = sleepMap.lastEntry();
startSleepDeepTime = entry.getKey();
// 睡眠:深度睡眠和浅度睡眠>3小时
if (sleepMinute > napThreshold * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(lastEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
daySleepMap.put(startSleepDeepTime, sleepMap);
}
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次)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private void middleSleep(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
int sleepMidMinute = 0; int sleepMidMinute = 0;
String startSleepMidTime = null; String startSleepMidTime = null; // 入睡时间开始
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
...@@ -477,7 +442,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -477,7 +442,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepMidMinute > sleepModerateActionTimeBegin) { if (sleepMidMinute > sleepModerateActionTimeBegin) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepMidTime); sleepTimeAnalysisVO.setStartTime(startSleepMidTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode());
...@@ -487,18 +452,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -487,18 +452,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
sleepMidMinute = 0; sleepMidMinute = 0;
} }
} }
}
/** // 清醒
* 清醒(每分钟体动值大于60或无人)
*
* @param sleepTypeMap
* @param sleepTimeAnalysisVOList
*/
private void sober(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int awakeMinute = 0; int awakeMinute = 0;
String startAwakeTime = null; String startAwakeTime = null; // 入睡时间开始
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
...@@ -513,7 +470,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -513,7 +470,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) { if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) {
continue; continue;
} }
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startAwakeTime); sleepTimeAnalysisVO.setStartTime(startAwakeTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode());
...@@ -522,308 +479,245 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -522,308 +479,245 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
awakeMinute = 0; awakeMinute = 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); 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.get(SleepTypeEnum.SLEEP.getCode());
List<SleepTimeAnalysisVO> sleepList = sleepMap.containsKey(SleepTypeEnum.SLEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP.getCode()) : new ArrayList<>(); if (CollectionUtils.isEmpty(sleepList)) {
List<SleepTimeAnalysisVO> deepList = sleepMap.containsKey(SleepTypeEnum.SLEEP_DEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP_DEEP.getCode()) : new ArrayList<>(); continue;
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<>(); List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList(); // 记录多端睡眠记录
SleepTimeDTO sleepTimeDTO = new SleepTimeDTO(); SleepTimeAnalysisVO sleepTimeAnalysis;
sleepTimeDTO.setDeepList(deepList);
sleepTimeDTO.setMidList(moderateList);
sleepTimeDTO.setSoberList(soberList); for (int i = 0; i < sleepList.size(); i++) {
sleepTimeDTO.setSleepList(sleepList); sleepTimeAnalysis = new SleepTimeAnalysisVO();
sleepTimeDTO.setGetUpList(getUpList); List<SleepTimeAnalysisVO> deepList = Lists.newArrayList();
sleepTimeDTO.setDaySleepList(daySleepList); List<SleepTimeAnalysisVO> midList = Lists.newArrayList();
List<SleepTimeAnalysisVO> lightSleepList = new ArrayList<>(); List<SleepTimeAnalysisVO> lightList = Lists.newArrayList();
if (CollUtil.isNotEmpty(sleepList)) { List<SleepTimeAnalysisVO> soberList = Lists.newArrayList();
lightSleepList = sleepList; SleepTimeAnalysisVO timeAnalysisVO = sleepList.get(i);
if (CollUtil.isNotEmpty(deepList)) {
lightSleepList.removeAll(deepList); BeanUtils.copyProperties(timeAnalysisVO, sleepTimeAnalysis);
} String startTime = timeAnalysisVO.getStartTime();
if (CollUtil.isNotEmpty(moderateList)) { String endTime = timeAnalysisVO.getEndTime();
lightSleepList.removeAll(moderateList); Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
} timeAnalysisVO.setInterval(durationRange);
} LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
sleepTimeDTO.setLightList(lightSleepList); LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
return sleepTimeDTO; boolean lightSleepFlag = true; // 如果不满足下面条件,就默认都是浅睡
} for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) || otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) {
private PlatElderSleepAnalysis savePlatElderSleepAnalysis(SleepTimeDTO sleepTimeDTO, continue;
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<>();
List<SleepTimeAnalysisVO> deepList = sleepTimeDTO.getDeepList();
List<SleepTimeAnalysisVO> moderateList = sleepTimeDTO.getMidList();
List<SleepTimeAnalysisVO> lightList = sleepTimeDTO.getLightList();
List<SleepTimeAnalysisVO> soberList = sleepTimeDTO.getSoberList();
List<SleepTimeAnalysisVO> sleepList = sleepTimeDTO.getSleepList();
List<SleepTimeAnalysisVO> restList = sleepTimeDTO.getRestList();
if (CollUtil.isNotEmpty(sleepList)) {
for (SleepTimeAnalysisVO analysisVO : sleepList) {
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.SLEEP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
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);
} }
if (CollUtil.isNotEmpty(restList)) {
for (SleepTimeAnalysisVO analysisVO : restList) { SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO(); .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.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime()); sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType()); sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep(); sleepRangeVOList.add(sleepRangeVO);
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 : timeAnalysisVO.getMidList()) {
for (SleepTimeAnalysisVO analysisVO : deepList) { sleepRangeVO = new PlatSleepRangeVO();
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime()); sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime()); sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType()); sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep(); sleepRangeVOList.add(sleepRangeVO);
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP_DEEP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
} }
if (CollUtil.isNotEmpty(moderateList)) { for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getLightList()) {
for (SleepTimeAnalysisVO analysisVO : sleepTimeDTO.getMidList()) { sleepRangeVO = new PlatSleepRangeVO();
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime()); sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime()); sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType()); sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
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)) { for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getSoberList()) {
for (SleepTimeAnalysisVO analysisVO : lightList) { sleepRangeVO = new PlatSleepRangeVO();
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime()); sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime()); sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType()); sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
PlatElderSleep platElderSleep = new PlatElderSleep(); }
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER)); elderSleep.setStartSleep(LocalDateTime.parse(timeAnalysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER)); elderSleep.setEndSleep(LocalDateTime.parse(timeAnalysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId); if (timeAnalysisVO.getInterval() / 60 > 3) {
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP_LIGHTNESS.getType()); elderSleep.setElderSleepType(ElderSleepType.SLEEP.getCode());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO)); } else {
platElderSleep.setInterval(analysisVO.getInterval()); elderSleep.setElderSleepType(ElderSleepType.REST.getCode());
platElderSleep.setHappenDate(currentDate); }
elderSleepList.add(platElderSleep); 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 (CollUtil.isNotEmpty(soberList)) { if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_LIGHTNESS.getCode())) {
for (SleepTimeAnalysisVO analysisVO : soberList) { lightTime += durationRange;
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO(); soberCount++;
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.SOBER.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
List<SleepTimeAnalysisVO> getUpList = sleepTimeDTO.getGetUpList();
if (CollUtil.isNotEmpty(getUpList)) {
for (SleepTimeAnalysisVO analysisVO : getUpList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(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.GETUP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP.getCode())) {
sleepTime += durationRange;
} }
platElderSleepService.saveBatch(elderSleepList);
return elderSleepList;
} }
private SleepTimeMinuteDTO getSleepTimeMinute(SleepTimeDTO sleepTimeDTO) { long deepScore = 0;
SleepTimeMinuteDTO result = new SleepTimeMinuteDTO(); for (int i = 0; i < sleepDeepConfigList.size(); i++) {
result.setDaySleepTime(CollUtil.isNotEmpty(sleepTimeDTO.getSleepList()) ? sleepTimeDTO.getSleepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0); long hour = deepTime / 60;
result.setDeepTime(CollUtil.isNotEmpty(sleepTimeDTO.getDeepList()) ? sleepTimeDTO.getDeepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0); SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i);
result.setLightTime(CollUtil.isNotEmpty(sleepTimeDTO.getLightList()) ? sleepTimeDTO.getLightList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0); long configHour = Long.parseLong(sleepConfigVO.getHour());
result.setSoberTime(CollUtil.isNotEmpty(sleepTimeDTO.getSoberList()) ? sleepTimeDTO.getSoberList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0); if (i == 0 && Objects.equals(hour, configHour)) {
return result; deepScore = Long.parseLong(sleepConfigVO.getScore());
}
if (i > 0 && hour > configHour) {
deepScore += Long.parseLong(sleepConfigVO.getScore());
}
}
saasSleepEvaluateStandardReportVO.setDeepScore(deepScore);
long soberScore = 0;
for (int i = 0; i < soberConfigList.size(); i++) {
SleepConfigVO sleepConfigVO = soberConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && soberCount != 0) {
soberScore = Long.parseLong(sleepConfigVO.getScore()) * soberCount;
} }
if (i > 0 && soberTime > configHour) {
soberScore += Long.parseLong(sleepConfigVO.getScore());
}
}
saasSleepEvaluateStandardReportVO.setSoberScore(soberScore);
@Override long lightScore = 0;
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day) {
List<String> dayHourRangeList = getLastDayHourRange(month, day); long lightHour = lightTime / 60;
String currentDate = LocalDate.now().minusDays(1).toString(); long lightnessConfigHour = Long.parseLong(lightnessConfigVO.getHour());
if (month != null && day != null) { if ( Objects.equals(lightHour,lightnessConfigHour)) {
currentDate = LocalDate.of(2024, month, day).minusDays(1).toString(); lightScore = Long.parseLong(lightnessConfigVO.getScore());
} }
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda() saasSleepEvaluateStandardReportVO.setLightScore(lightScore);
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
List<PlatRoomBedDevice> platRoomBedDeviceList = roomBedDeviceService.list(new QueryWrapper<PlatRoomBedDevice>()
.lambda().isNotNull(PlatRoomBedDevice::getBedId));
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
.orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
double sleepTimeActionDuration = Double.parseDouble(analysisModel.getSleepTimeActionDuration());
int riseActionDuration = Integer.parseInt(analysisModel.getRiseActionDuration());
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<>();
String bedId = platRoomBedDevice.getBedId(); long sleepScore = 0;
PlatElder elder = platElderService.getOne(new QueryWrapper<PlatElder>().lambda() for (int i = 0; i < sleepTimeConfigList.size(); i++) {
.eq(PlatElder::getBedId, bedId)); long hour = sleepTime / 60;
if (elder == null) { SleepConfigVO sleepConfigVO = sleepTimeConfigList.get(i);
continue; long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && Objects.equals(hour, configHour)) {
sleepScore = Long.parseLong(sleepConfigVO.getScore());
} }
PlatDevice platDevice = platDeviceService.getById(platRoomBedDevice.getDeviceId()); if (i > 0 && hour > configHour) {
if (platDevice == null) { sleepScore += Long.parseLong(sleepConfigVO.getScore());
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() saasSleepEvaluateStandardReportVO.setSleepScore(sleepScore);
.filter(deviceOperationLogEntity -> deviceOperationLogEntity.getType().contains("reportProperty")) long totalScore = sleepScore + deepScore + lightScore - soberScore;
.map(deviceOperationLogEntity -> { saasSleepEvaluateStandardReportVO.setTotalScore(totalScore);
DeviceInfoContentBreathe deviceInfoContentBreathe = JsonUtil.toObj((String) deviceOperationLogEntity.getContent(), DeviceInfoContentBreathe.class);
assert deviceInfoContentBreathe != null; // 记录长者一天睡眠的记录
deviceInfoContentBreathe.setReportTime(formatLongTime(deviceInfoContentBreathe.getTimestamp())); long daySleepTime = 0;
return deviceInfoContentBreathe; long dayRestTime = 0;
}) for (PlatElderSleep elderSleep : elderSleepList) {
.collect(Collectors.toList()); elderSleep.setElderId(elder.getId());
Map<String, List<DeviceInfoContentBreathe>> minuteMap = StreamUtil.groupBy(deviceInfoContentBreatheList, DeviceInfoContentBreathe::getReportTime); elderSleep.setHappenDate(currentDate);
deviceOperationLogEntities.clear(); elderSleep.setTenantId(tenantId);
TreeMap<String, AnalysisVO> statisticsMap = getPerMinuteData(minuteMap, analysisModel);
if (CollUtil.isNotEmpty(statisticsMap)) { if (ElderSleepType.SLEEP.getCode() == elderSleep.getElderSleepType()) {
totalMap.putAll(statisticsMap); daySleepTime += elderSleep.getInterval();
} }
if (ElderSleepType.REST.getCode() == elderSleep.getElderSleepType()) {
dayRestTime += elderSleep.getInterval();
} }
if (CollUtil.isEmpty(totalMap)) {
continue;
} }
// 记录长者不同类型的睡眠时间 int riseRepeatThreshold = Integer.parseInt(analysisModel.getRiseRepeatThreshold());
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList(); platElderSleepService.saveBatch(elderSleepList);
// 入睡时间 String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score));
getFallAsleepData(totalMap, sleepTimeActionDuration, sleepTimeAnalysisVOList);
// 获取睡眠和小憩 // 长者一天的睡眠分析
SleepCountDTO sleepCountDTO = deepSleepAndRestData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList); PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
// 满足睡眠条件的map elderSleepAnalysis.setElderId(elder.getId());
TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = sleepCountDTO.getDaySleepMap(); elderSleepAnalysis.setActionCount(totalActionCount);
// 深度睡眠 elderSleepAnalysis.setTurnedCount(totalTurnedCount);
deepSleepData(daySleepMap, analysisModel, sleepTimeAnalysisVOList); elderSleepAnalysis.setHappenDate(currentDate);
// 中度睡眠 elderSleepAnalysis.setSleepScore(score);
middleSleep(daySleepMap, analysisModel, sleepTimeAnalysisVOList); elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
// 清醒 elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
sober(sleepTypeMap, sleepTimeAnalysisVOList); elderSleepAnalysis.setSleepResult(sleepReport.getResult());
// 起床 elderSleepAnalysis.setTenantId(tenantId);
getUp(totalMap, riseLeaveThreshold, riseActionDuration, repeatSleepThreshold, sleepTimeAnalysisVOList, sleepCountDTO); elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
//浅睡 elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId());
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList); result.add(elderSleepAnalysis);
List<PlatElderSleep> platElderSleeps = saveElderSleep(sleepTimeDTO, elder.getId(), currentDate); platElderSleepAnalysisService.save(elderSleepAnalysis);
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);
}
} }
...@@ -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.getRoomId())) { if (StringUtils.isAnyBlank(dto.getReportType(), dto.getElderId())) {
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::getRoomId, dto.getRoomId()); queryWrapper.eq(PlatRegionSettingFix::getElderId, dto.getElderId());
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;
}
} }
...@@ -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
......
...@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment