Commit f0889f06 by 汪志阳

fix:睡眠定时任务代码优化

parent 614a22a4
......@@ -2,6 +2,8 @@ package com.makeit.module.iot.vo.analysis;
import lombok.Data;
import java.util.TreeMap;
/**
* @author wangzy
* @description
......@@ -13,4 +15,9 @@ public class SleepCountDTO {
private Integer totalActionCount;
private Integer totalTurnedCount;
private TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap;
private TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap;
}
......@@ -14,7 +14,7 @@ public class SleepTimeDTO {
/**
* 入睡
* 睡眠:入睡时间>3小时
*/
private List<SleepTimeAnalysisVO> sleepList;
......@@ -47,7 +47,7 @@ public class SleepTimeDTO {
/**
* 睡眠:深度睡眠和浅度睡眠>3小时
* 入睡
*/
private List<SleepTimeAnalysisVO> daySleepList;
}
......@@ -52,16 +52,6 @@ public class PlatElderSleepController {
private HuiNengService huiNengService;
@ApiOperation("测试")
@PostMapping("test1")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> test1() {
platElderSleepService.test1();
return ApiResponseUtils.success();
}
@ApiOperation("测试")
@PostMapping("test2")
@AuthIgnore
......
......@@ -8,7 +8,7 @@ import lombok.Getter;
public enum SleepTypeEnum {
/**
* 睡眠类型 1 睡眠 2 小憩,3:深度睡眠,4:中度睡眠,5:浅度睡眠, 6:清醒,7:离床
* 睡眠类型 1 睡眠 (入睡时间大于3小时)2 小憩,3:深度睡眠,4:中度睡眠,5:浅度睡眠, 6:清醒,7:起床 8:入睡
*/
SLEEP_DEEP("sleepDeep", "深度睡眠", 3),
SLEEP_MODERATE("sleepModerate", "中度睡眠", 4),
......@@ -16,7 +16,8 @@ public enum SleepTypeEnum {
SOBER("sober", "清醒", 6),
GETUP("getup", "起床", 7),
SLEEP("sleep", "睡觉", 1),
RESTING("resting", "小憩", 2);
RESTING("resting", "小憩", 2),
DAY_SLEEP("day_sleep","睡眠",8);
private final String code;
private final String value;
......
......@@ -19,10 +19,7 @@ public interface PlatElderSleepService extends IService<PlatElderSleep> {
List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day);
void test1();
String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport);
List<PlatElderSleep> mergeWakeUpList(List<PlatElderSleep> elderSleepList, int riseRepeatThreshold);
}
......@@ -12,11 +12,13 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.entity.platform.elder.ElderSleepAnalysisVO;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.report.ElderSleepType;
import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.elder.PlatElderSleepMapper;
......@@ -32,16 +34,17 @@ import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
......@@ -86,7 +89,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired
private PlatElderReportMonthService platElderReportMonthService;
private TreeMap<String, AnalysisVO> getPerMinuteData(Map<String, List<DeviceInfoContentBreathe>> minuteMap,SaasSleepAnalysisModel analysisModel) {
private TreeMap<String, AnalysisVO> getPerMinuteData(Map<String, List<DeviceInfoContentBreathe>> minuteMap, SaasSleepAnalysisModel analysisModel) {
int turnedThreshold = Integer.parseInt(analysisModel.getTurnedThreshold());
int sleepTimeActionThreshold = Integer.parseInt(analysisModel.getSleepTimeActionThreshold());
......@@ -214,6 +217,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
/**
* 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
*
* @param totalMap
* @param sleepTimeActionDuration 体动值持续时间 0.5h
* @param sleepTimeAnalysisVOList
......@@ -241,7 +245,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVO.setType(SleepTypeEnum.DAY_SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startSleepTime = null;
......@@ -274,18 +278,24 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
/**
* 获取起床数据(离床大于0.5小时,或者每分钟大于30秒体动值大于50持续10min,且在两小时内无再次入睡
*
* @param totalMap
* @param riseLeaveThreshold
* @param riseActionDuration
* @param sleepTimeAnalysisVOList
*/
private void getUp(TreeMap<String, AnalysisVO> totalMap, double riseLeaveThreshold, int riseActionDuration,
double repeatSleepThreshold, List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
double repeatSleepThreshold, List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList,
SleepCountDTO sleepCountDTO) {
Integer actionCount = 0;
Integer turnedCount = 0;
// 起床时间
String startGetupTime = null;
int getupMinute = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
actionCount += analysisVO.getActionCount();
turnedCount += analysisVO.getTurnedCount();
if (analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startGetupTime)) {
startGetupTime = entry.getKey();
......@@ -306,11 +316,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
startGetupTime = null;
getupMinute = 0;
}
sleepCountDTO.setTotalActionCount(actionCount);
sleepCountDTO.setTotalTurnedCount(turnedCount);
List<SleepTimeAnalysisVO> sleepList = sleepTimeAnalysisVOList.stream().
filter(f -> SleepTypeEnum.SLEEP.getCode().equals(f.getType())).collect(Collectors.toList());
// 起床时间
String startGetupTime2 = null;
int getupMinute2 = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
......@@ -346,34 +356,28 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
/**
* 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private SleepCountDTO deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
private void deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepDeepMinute = 0;
int totalActionCount = 0;
int totalTurnedCount = 0;
// 入睡时间开始
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()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue();
boolean actionFlag = analysisVO.getActionCount() == sleepDeepActionThreshold;
boolean turnedFlag = analysisVO.getTurnedCount() == sleepDeepActionThreshold;
if (!actionFlag) {
totalActionCount += analysisVO.getActionCount() == 0 ? 1 : analysisVO.getActionCount();
}
if (!turnedFlag) {
totalTurnedCount += analysisVO.getTurnedCount() == 0 ? 1 : analysisVO.getTurnedCount();
}
if (actionFlag && turnedFlag
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) {
......@@ -397,14 +401,57 @@ 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.setTotalTurnedCount(totalTurnedCount);
sleepCountDTO.setTotalActionCount(totalActionCount);
sleepCountDTO.setDaySleepMap(daySleepMap);
sleepCountDTO.setRestSleepMap(restSleepMap);
return sleepCountDTO;
}
/**
* 中度睡眠(体动和翻身次数10分钟内小于3次)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
......@@ -413,9 +460,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
// 中度睡眠
int sleepMidMinute = 0;
String startSleepMidTime = null; // 入睡时间开始
String startSleepMidTime = null;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
......@@ -445,14 +491,14 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
/**
* 清醒(每分钟体动值大于60或无人)
*
* @param sleepTypeMap
* @param sleepTimeAnalysisVOList
*/
private void sober(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
// 清醒
int awakeMinute = 0;
String startAwakeTime = null; // 入睡时间开始
String startAwakeTime = null;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
......@@ -478,147 +524,44 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
}
}
private List<SleepTimeAnalysisVO> getFinalSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType);
List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode());
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList();
if (CollectionUtils.isEmpty(sleepList)) {
return finalSleepTimeAnalysisList;
}
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型
for (int i = 0; i < sleepList.size(); i++) {
SleepTimeAnalysisVO sleepTimeAnalysis = new SleepTimeAnalysisVO();
List<SleepTimeAnalysisVO> deepList = Lists.newArrayList();
List<SleepTimeAnalysisVO> midList = Lists.newArrayList();
List<SleepTimeAnalysisVO> lightList = Lists.newArrayList();
List<SleepTimeAnalysisVO> soberList = Lists.newArrayList();
SleepTimeAnalysisVO timeAnalysisVO = sleepList.get(i);
BeanUtils.copyProperties(timeAnalysisVO, sleepTimeAnalysis);
String startTime = timeAnalysisVO.getStartTime();
String endTime = timeAnalysisVO.getEndTime();
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
timeAnalysisVO.setInterval(durationRange);
LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
boolean lightSleepFlag = true;
// 如果不满足下面条件,就默认都是浅睡
for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) ||
otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) {
continue;
}
String deepStartTime = otherSleepTime.getStartTime();
String deepEndTime = otherSleepTime.getEndTime();
LocalDateTime startDeepDateTime = LocalDateTime.parse(deepStartTime, DEFAULT_FORMATTER);
LocalDateTime endDeepDateTime = LocalDateTime.parse(deepEndTime, DEFAULT_FORMATTER);
if ((startDateTime.isBefore(startDeepDateTime) || startDateTime.equals(startDeepDateTime)) &&
(endDateTime.isAfter(endDeepDateTime) || endDateTime.equals(endDeepDateTime))) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) {
deepList.add(otherSleepTime);
} else if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_MODERATE.getCode())) {
midList.add(otherSleepTime);
} else if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) {
soberList.add(otherSleepTime);
} else {
otherSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightList.add(otherSleepTime);
}
lightSleepFlag = false;
}
}
if (lightSleepFlag) {
SleepTimeAnalysisVO lightSleepTime = new SleepTimeAnalysisVO();
lightSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightSleepTime.setStartTime(startTime);
lightSleepTime.setEndTime(endTime);
lightList.add(lightSleepTime);
}
sleepTimeAnalysis.setDeepList(deepList);
sleepTimeAnalysis.setInterval(durationRange);
sleepTimeAnalysis.setMidList(midList);
sleepTimeAnalysis.setLightList(lightList);
sleepTimeAnalysis.setSoberList(soberList);
finalSleepTimeAnalysisList.add(sleepTimeAnalysis);
}
return finalSleepTimeAnalysisList;
}
private SleepTimeDTO groupSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList, double repeatSleepThreshold,
double sleepThreshold) {
private SleepTimeDTO groupSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
sleepTimeAnalysisVOList.forEach(s -> {
Long durationRange = getDurationRange(s.getStartTime(), s.getEndTime());
s.setInterval(durationRange);
});
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType);
List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode());
List<SleepTimeAnalysisVO> allSleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode());
List<SleepTimeAnalysisVO> daySleepList = sleepMap.containsKey(SleepTypeEnum.DAY_SLEEP.getCode()) ? sleepMap.get(SleepTypeEnum.DAY_SLEEP.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> sleepList = sleepMap.containsKey(SleepTypeEnum.SLEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> deepList = sleepMap.containsKey(SleepTypeEnum.SLEEP_DEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP_DEEP.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> moderateList = sleepMap.containsKey(SleepTypeEnum.SLEEP_MODERATE.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP_MODERATE.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> getUpList = sleepMap.containsKey(SleepTypeEnum.GETUP.getCode()) ? sleepMap.get(SleepTypeEnum.GETUP.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> soberList = sleepMap.containsKey(SleepTypeEnum.SOBER.getCode()) ? sleepMap.get(SleepTypeEnum.SOBER.getCode()) : new ArrayList<>();
SleepTimeDTO sleepTimeDTO = new SleepTimeDTO();
if (CollectionUtils.isEmpty(sleepList)) {
return sleepTimeDTO;
}
List<SleepTimeAnalysisVO> deepList = sleepMap.get(SleepTypeEnum.SLEEP_DEEP.getCode());
List<SleepTimeAnalysisVO> moderateList = sleepMap.get(SleepTypeEnum.SLEEP_MODERATE.getCode());
List<SleepTimeAnalysisVO> getUpList = sleepMap.get(SleepTypeEnum.GETUP.getCode());
List<SleepTimeAnalysisVO> soberList = sleepMap.get(SleepTypeEnum.SOBER.getCode());
sleepTimeDTO.setDeepList(deepList);
sleepTimeDTO.setMidList(moderateList);
sleepTimeDTO.setSoberList(soberList);
sleepTimeDTO.setSleepList(allSleepList);
sleepTimeDTO.setSleepList(sleepList);
sleepTimeDTO.setGetUpList(getUpList);
if(CollUtil.isNotEmpty(deepList)){
sleepList.removeAll(deepList);
}
if(CollUtil.isNotEmpty(moderateList)){
sleepList.removeAll(moderateList);
}
if(CollUtil.isNotEmpty(getUpList)){
sleepList.removeAll(getUpList);
}
if(CollUtil.isNotEmpty(soberList)){
sleepList.removeAll(soberList);
}
sleepTimeDTO.setLightList(sleepList);
List<SleepTimeAnalysisVO> deepAndLightList = Lists.newArrayList();
CollUtil.addAll(deepAndLightList, deepList);
CollUtil.addAll(deepAndLightList, sleepTimeDTO.getLightList());
if (CollUtil.isNotEmpty(deepAndLightList)) {
List<SleepTimeAnalysisVO> restList = Lists.newArrayList();
List<SleepTimeAnalysisVO> sleepOverTimeList = Lists.newArrayList();
deepList.forEach(d -> {
boolean isOverTime = d.getInterval() > sleepThreshold * 60;
if (isOverTime) {
sleepOverTimeList.add(d);
} else {
// 两小时内不再入睡
LocalDateTime startDateTime = LocalDateTime.parse(d.getStartTime(), DEFAULT_FORMATTER);
SleepTimeAnalysisVO repeatSleep = allSleepList.stream().filter(f -> Duration.between(startDateTime,
LocalDateTime.parse(f.getStartTime(), DEFAULT_FORMATTER)).toMinutes() < repeatSleepThreshold * 60)
.findFirst().orElse(null);
// 深度睡眠和浅度睡眠小于等于3小时,且两小时内不再入睡,则为小憩
if (repeatSleep == null) {
restList.add(d);
}
}
});
sleepTimeDTO.setRestList(restList);
sleepTimeDTO.setDaySleepList(sleepOverTimeList);
sleepTimeDTO.setDaySleepList(daySleepList);
List<SleepTimeAnalysisVO> lightSleepList = new ArrayList<>();
if (CollUtil.isNotEmpty(sleepList)) {
lightSleepList = sleepList;
if (CollUtil.isNotEmpty(deepList)) {
lightSleepList.removeAll(deepList);
}
if (CollUtil.isNotEmpty(moderateList)) {
lightSleepList.removeAll(moderateList);
}
}
sleepTimeDTO.setLightList(lightSleepList);
return sleepTimeDTO;
}
private PlatElderSleepAnalysis savePlatElderSleepAnalysis(SleepTimeDTO sleepTimeDTO,
SaasSleepEvaluateStandardReport evaluateStandardReport,
String elderId, String currentDate, SleepCountDTO sleepCountDTO,
String tenantId,
String oriDeviceId) {
SaasSleepEvaluateStandardReport evaluateStandardReport,
String elderId, String currentDate, SleepCountDTO sleepCountDTO,
String tenantId,
String oriDeviceId) {
SleepTimeMinuteDTO sleepTimeMinute = getSleepTimeMinute(sleepTimeDTO);
long daySleepTime = sleepTimeMinute.getDaySleepTime() != null ? sleepTimeMinute.getDaySleepTime() : 0L;
......@@ -626,10 +569,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
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);
......@@ -653,10 +594,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
List<SleepTimeAnalysisVO> moderateList = sleepTimeDTO.getMidList();
List<SleepTimeAnalysisVO> lightList = sleepTimeDTO.getLightList();
List<SleepTimeAnalysisVO> soberList = sleepTimeDTO.getSoberList();
List<SleepTimeAnalysisVO> daySleepList = sleepTimeDTO.getDaySleepList();
List<SleepTimeAnalysisVO> sleepList = sleepTimeDTO.getSleepList();
List<SleepTimeAnalysisVO> restList = sleepTimeDTO.getRestList();
if (CollUtil.isNotEmpty(daySleepList)) {
for (SleepTimeAnalysisVO analysisVO : daySleepList) {
if (CollUtil.isNotEmpty(sleepList)) {
for (SleepTimeAnalysisVO analysisVO : sleepList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
......@@ -788,38 +729,34 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
private SleepTimeMinuteDTO getSleepTimeMinute(SleepTimeDTO sleepTimeDTO) {
SleepTimeMinuteDTO result = new SleepTimeMinuteDTO();
result.setDaySleepTime(sleepTimeDTO.getDaySleepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum));
result.setDeepTime(sleepTimeDTO.getDeepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum));
result.setLightTime(sleepTimeDTO.getLightList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum));
result.setSoberTime(sleepTimeDTO.getSoberList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum));
result.setDaySleepTime(CollUtil.isNotEmpty(sleepTimeDTO.getSleepList()) ? sleepTimeDTO.getSleepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setDeepTime(CollUtil.isNotEmpty(sleepTimeDTO.getDeepList()) ? sleepTimeDTO.getDeepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setLightTime(CollUtil.isNotEmpty(sleepTimeDTO.getLightList()) ? sleepTimeDTO.getLightList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setSoberTime(CollUtil.isNotEmpty(sleepTimeDTO.getSoberList()) ? sleepTimeDTO.getSoberList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month,Integer day) {
public List<ElderSleepAnalysisVO> 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));
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 sleepThreshold = Double.parseDouble(analysisModel.getSleepThreshold());
double repeatSleepThreshold = Double.parseDouble(analysisModel.getRiseRepeatThreshold());
List<ElderSleepAnalysisVO> result = new ArrayList<>();
......@@ -837,7 +774,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
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]);
......@@ -863,96 +799,35 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (CollUtil.isEmpty(totalMap)) {
continue;
}
int totalActionCount = 0;
int totalTurnedCount = 0;
// 记录长者不同类型的睡眠时间
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
// 入睡时间
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap =
getFallAsleepData(totalMap, sleepTimeActionDuration, sleepTimeAnalysisVOList);
// 获取睡眠和小憩
SleepCountDTO sleepCountDTO = deepSleepAndRestData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
// 满足睡眠条件的map
TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = sleepCountDTO.getDaySleepMap();
// 深度睡眠
SleepCountDTO sleepCountDTO = deepSleepData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
deepSleepData(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
// 中度睡眠
middleSleep(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
middleSleep(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
// 清醒
sober(sleepTypeMap, sleepTimeAnalysisVOList);
// 起床
getUp(totalMap, riseLeaveThreshold, riseActionDuration, repeatSleepThreshold, sleepTimeAnalysisVOList);
// 小憩、睡眠
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList, repeatSleepThreshold, sleepThreshold);
if (CollUtil.isEmpty(sleepTimeDTO.getSleepList())) {
continue;
}
getUp(totalMap, riseLeaveThreshold, riseActionDuration, repeatSleepThreshold, sleepTimeAnalysisVOList, sleepCountDTO);
//浅睡
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList);
List<PlatElderSleep> platElderSleeps = saveElderSleep(sleepTimeDTO, elder.getId(), currentDate);
PlatElderSleepAnalysis platElderSleepAnalysis = savePlatElderSleepAnalysis(sleepTimeDTO, evaluateStandardReport, elder.getId(), currentDate,
sleepCountDTO, tenantId, platDevice.getOriDeviceId());
ElderSleepAnalysisVO analysisVO = BeanUtil.copyProperties(platElderSleepAnalysis, ElderSleepAnalysisVO.class);
analysisVO.setPlatElderSleeps(platElderSleeps);
result.add(analysisVO);
}
return result;
}
private List<PlatElderSleep> recursion(List<PlatElderSleep> elderSleepList, int count, int riseRepeatThreshold) {
List<PlatElderSleep> platElderSleeps = platElderSleepService.mergeWakeUpList(elderSleepList, riseRepeatThreshold);
if (count == 0) {
return platElderSleeps;
} else {
count--;
return recursion(platElderSleeps, count, riseRepeatThreshold);
}
}
/**
* @param elderSleepList
* @param riseRepeatThreshold 且在 (2) 小时内无再次入睡
* @return
*/
@Override
public List<PlatElderSleep> mergeWakeUpList(List<PlatElderSleep> elderSleepList, int riseRepeatThreshold) {
List<PlatElderSleep> result = new ArrayList<>();
if (CollUtil.isEmpty(elderSleepList)) {
return elderSleepList;
}
elderSleepList = elderSleepList.stream().sorted(Comparator.comparing(PlatElderSleep::getStartSleep))
.collect(Collectors.toList());
List<PlatElderSleep> finalElderSleepList = elderSleepList;
List<PlatElderSleep> mergeSleepList = new ArrayList<>();
finalElderSleepList.forEach(e -> {
if (mergeSleepList.contains(e)) {
return;
}
// 2小时内再次入睡的数据,合并
List<PlatElderSleep> riseSleepList = finalElderSleepList.stream().filter(f -> Duration.between(e.getEndSleep(),
f.getStartSleep()).toMinutes() < riseRepeatThreshold * 60L).collect(Collectors.toList());
if (CollUtil.isEmpty(riseSleepList)) {
result.add(e);
return;
}
mergeSleepList.addAll(riseSleepList);
PlatElderSleep maxSleepTime = finalElderSleepList.stream().max(Comparator.comparing(f -> Duration.between(f.getStartSleep(),
f.getEndSleep()).toMinutes() > Duration.between(e.getStartSleep(),
e.getEndSleep()).toMinutes())).orElse(e);
PlatElderSleep last = riseSleepList.get(riseSleepList.size() - 1);
e.setElderSleepType(maxSleepTime.getElderSleepType());
e.setEndSleep(last.getEndSleep());
List<PlatSleepRangeVO> sleepRecord = e.getSleepRecord();
Set<PlatSleepRangeVO> platSleepRangeVOS = new LinkedHashSet<>(sleepRecord);
riseSleepList.forEach(r -> platSleepRangeVOS.addAll(r.getSleepRecord()));
e.setSleepRecord(new ArrayList<>(platSleepRangeVOS));
result.add(e);
});
return result;
}
@Override
public String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport) {
......@@ -1008,7 +883,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
}
public List<String> getLastDayHourRange(Integer month,Integer day) {
public List<String> getLastDayHourRange(Integer month, Integer day) {
int count = 24;
LocalDateTime localDateTime = LocalDateTime.now();
if (month != null && day != null) {
......@@ -1025,298 +900,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return list;
}
public static LocalDateTime getDayStart(LocalDate time) {
return time.atTime(0, 0, 0);
}
@Override
public void test1() {
int days = 30;
LocalDateTime localDateTime = LocalDateTime.now().minusDays(28);
List<String> timeRangeList = Lists.newArrayList();
PlatElder elder = platElderService.getById("1704706233484742658");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int sleepNumber = 6;
SleepTypeEnum[] values = SleepTypeEnum.values();
for (int i = 0; i < days; i++) {
String lastDate = localDateTime.format(timeFormatter);
localDateTime = localDateTime.plusDays(1);
String currentDate = localDateTime.format(timeFormatter);
PlatElderSleep platElderSleep = new PlatElderSleep();
String sleepStartTime = lastDate + " 22:00";
String sleepEndTime = currentDate + " 08:00";
LocalDateTime startTime = LocalDateTime.parse(sleepStartTime, DEFAULT_FORMATTER);
LocalDateTime endTime = LocalDateTime.parse(sleepEndTime, DEFAULT_FORMATTER);
platElderSleep.setStartSleep(startTime);
platElderSleep.setEndSleep(endTime);
platElderSleep.setElderSleepType(1);
platElderSleep.setElderId(elder.getId());
platElderSleep.setHappenDate(currentDate);
platElderSleep.setTenantId(elder.getTenantId());
List<PlatSleepRangeVO> rangeVOList = Lists.newArrayList();
String start = "";
String end = "";
for (int i1 = 0; i1 < sleepNumber; i1++) {
PlatSleepRangeVO rangeVO = new PlatSleepRangeVO();
int random = RandomUtils.nextInt(0, 4);
long randomLong = RandomUtils.nextLong(1, 3);
SleepTypeEnum sleepTypeEnum = values[random];
rangeVO.setSleepType(sleepTypeEnum.getCode());
start = startTime.format(DEFAULT_FORMATTER);
LocalDateTime dateTime = startTime.plusHours(randomLong);
end = dateTime.format(DEFAULT_FORMATTER);
rangeVO.setStartTime(start);
rangeVO.setEndTime(end);
startTime = LocalDateTime.parse(end, DEFAULT_FORMATTER);
rangeVOList.add(rangeVO);
}
platElderSleep.setSleepRecord(rangeVOList);
//platElderSleepService.save(platElderSleep);
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elder.getId());
elderSleepAnalysis.setActionCount(700);
elderSleepAnalysis.setTurnedCount(500);
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore("80");
elderSleepAnalysis.setSleepTime("600");
elderSleepAnalysis.setRestTime("840");
elderSleepAnalysis.setSleepResult("良好");
elderSleepAnalysis.setTenantId(elder.getTenantId());
elderSleepAnalysis.setSleepEvaluate("不错");
//platElderSleepAnalysisService.save(elderSleepAnalysis);
PlatElderBreatheDayStat elderBreatheDayStat = new PlatElderBreatheDayStat();
elderBreatheDayStat.setElderId(elder.getId());
elderBreatheDayStat.setDeviceId("1704705639248334849");
elderBreatheDayStat.setOriDeviceId("218A00XE26691FC");
elderBreatheDayStat.setDay(localDateTime.toLocalDate());
elderBreatheDayStat.setHeartRateMax(72);
elderBreatheDayStat.setHeartRateMax(60);
elderBreatheDayStat.setHeartRateMax(65);
elderBreatheDayStat.setRespiratoryRateAvg(14);
elderBreatheDayStat.setRespiratoryRateMax(18);
elderBreatheDayStat.setRespiratoryRateMin(12);
elderBreatheDayStat.setTenantId(elder.getTenantId());
//platElderBreatheDayStatService.save(elderBreatheDayStat);
PlatElderReportMonth platElderReportMonth = new PlatElderReportMonth();
platElderReportMonth.setElderId(elder.getId());
platElderReportMonth.setDay(localDateTime.toLocalDate());
platElderReportMonth.setTenantId(elder.getTenantId());
platElderReportMonth.setSleepResult("良好");
platElderReportMonth.setRespiratoryExceptionCount(0);
platElderReportMonth.setHeartExceptionCount(0);
platElderReportMonth.setBehaviorExceptionCount(0);
platElderReportMonth.setOffBedExceptionCount(0);
platElderReportMonth.setHeartRate(80);
platElderReportMonth.setRespiratoryRate(20);
platElderReportMonth.setFailCount(0);
platElderReportMonthService.save(platElderReportMonth);
PlatElderBreatheAnalysis platElderBreatheAnalysis = new PlatElderBreatheAnalysis();
platElderBreatheAnalysis.setElderId(elder.getId());
platElderBreatheAnalysis.setAvgBreatheRate("65");
platElderBreatheAnalysis.setAvgHeartRate("14");
platElderBreatheAnalysis.setBreatheScore("60");
platElderBreatheAnalysis.setBreatheResult("良好");
platElderBreatheAnalysis.setHappenDate(currentDate);
platElderBreatheAnalysis.setTenantId(elder.getTenantId());
platElderBreatheAnalysis.setBreatheEvaluate("还不错");
//platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
}
}
private void oldMethod(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList,
SaasSleepEvaluateStandardReport evaluateStandardReport, PlatElder elder,
String currentDate, String tenantId, SaasSleepAnalysisModel analysisModel,
PlatDevice platDevice) {
int totalActionCount = 0;
int totalTurnedCount = 0;
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = getFinalSleepData(sleepTimeAnalysisVOList);
if (CollUtil.isEmpty(finalSleepTimeAnalysisList)) {
return;
}
// 算出每一段睡觉的不同睡眠类型的时间段
SaasSleepEvaluateStandardReportVO saasSleepEvaluateStandardReportVO = new SaasSleepEvaluateStandardReportVO();
List<PlatElderSleep> elderSleepList = Lists.newArrayList();
PlatSleepRangeVO sleepRangeVO;
for (SleepTimeAnalysisVO timeAnalysisVO : finalSleepTimeAnalysisList) {
List<PlatSleepRangeVO> sleepRangeVOList = Lists.newArrayList();
PlatElderSleep elderSleep = new PlatElderSleep();
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getDeepList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getMidList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getLightList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getSoberList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
elderSleep.setStartSleep(LocalDateTime.parse(timeAnalysisVO.getStartTime(), DEFAULT_FORMATTER));
elderSleep.setEndSleep(LocalDateTime.parse(timeAnalysisVO.getEndTime(), DEFAULT_FORMATTER));
if (timeAnalysisVO.getInterval() / 60 > 3) {
elderSleep.setElderSleepType(ElderSleepType.SLEEP.getCode());
} else {
elderSleep.setElderSleepType(ElderSleepType.REST.getCode());
}
elderSleep.setInterval(timeAnalysisVO.getInterval());
elderSleep.setSleepRecord(sleepRangeVOList);
elderSleepList.add(elderSleep);
}
// 获取睡眠评估标准配置
String sleepDeepConfig = evaluateStandardReport.getSleepDeepConfig();
String soberConfig = evaluateStandardReport.getSoberConfig();
String sleepTimeConfig = evaluateStandardReport.getSleepTime();
String lightnessConfig = evaluateStandardReport.getSleepLightnessConfig();
List<SleepConfigVO> sleepDeepConfigList = JSON.parseArray(sleepDeepConfig, SleepConfigVO.class);
List<SleepConfigVO> soberConfigList = JSON.parseArray(soberConfig, SleepConfigVO.class);
List<SleepConfigVO> sleepTimeConfigList = JSON.parseArray(sleepTimeConfig, SleepConfigVO.class);
SleepConfigVO lightnessConfigVO = JSON.parseObject(lightnessConfig, SleepConfigVO.class);
long deepTime = 0;
long soberTime = 0;
long soberCount = 0;
long sleepTime = 0;
long lightTime = 0;
// 算出不同睡眠类型的总时长
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
timeAnalysisVO.setInterval(durationRange);
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) {
deepTime += durationRange;
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) {
soberTime += durationRange;
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_LIGHTNESS.getCode())) {
lightTime += durationRange;
soberCount++;
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP.getCode())) {
sleepTime += durationRange;
}
}
long deepScore = 0;
for (int i = 0; i < sleepDeepConfigList.size(); i++) {
long hour = deepTime / 60;
SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && Objects.equals(hour, configHour)) {
deepScore = Long.parseLong(sleepConfigVO.getScore());
}
if (i > 0 && hour > configHour) {
deepScore += Long.parseLong(sleepConfigVO.getScore());
}
}
saasSleepEvaluateStandardReportVO.setDeepScore(deepScore);
long soberScore = 0;
for (int i = 0; i < soberConfigList.size(); i++) {
SleepConfigVO sleepConfigVO = soberConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && soberCount != 0) {
soberScore = Long.parseLong(sleepConfigVO.getScore()) * soberCount;
}
if (i > 0 && soberTime > configHour) {
soberScore += Long.parseLong(sleepConfigVO.getScore());
}
}
saasSleepEvaluateStandardReportVO.setSoberScore(soberScore);
long lightScore = 0;
long lightHour = lightTime / 60;
long lightnessConfigHour = Long.parseLong(lightnessConfigVO.getHour());
if (Objects.equals(lightHour, lightnessConfigHour)) {
lightScore = Long.parseLong(lightnessConfigVO.getScore());
}
saasSleepEvaluateStandardReportVO.setLightScore(lightScore);
long sleepScore = 0;
for (int i = 0; i < sleepTimeConfigList.size(); i++) {
long hour = sleepTime / 60;
SleepConfigVO sleepConfigVO = sleepTimeConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && Objects.equals(hour, configHour)) {
sleepScore = Long.parseLong(sleepConfigVO.getScore());
}
if (i > 0 && hour > configHour) {
sleepScore += Long.parseLong(sleepConfigVO.getScore());
}
}
saasSleepEvaluateStandardReportVO.setSleepScore(sleepScore);
long totalScore = sleepScore + deepScore + lightScore - soberScore;
saasSleepEvaluateStandardReportVO.setTotalScore(totalScore);
// 记录长者一天睡眠的记录
long daySleepTime = 0;
long dayRestTime = 0;
for (PlatElderSleep elderSleep : elderSleepList) {
elderSleep.setElderId(elder.getId());
elderSleep.setHappenDate(currentDate);
elderSleep.setTenantId(tenantId);
if (ElderSleepType.SLEEP.getCode() == elderSleep.getElderSleepType()) {
daySleepTime += elderSleep.getInterval();
}
if (ElderSleepType.REST.getCode() == elderSleep.getElderSleepType()) {
dayRestTime += elderSleep.getInterval();
}
}
int riseRepeatThreshold = Integer.parseInt(analysisModel.getRiseRepeatThreshold());
List<PlatElderSleep> mergeElderSleepList = recursion(elderSleepList, elderSleepList.size() / 2, riseRepeatThreshold);
// platElderSleepService.saveBatch(mergeElderSleepList);
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score));
// 长者一天的睡眠分析
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elder.getId());
elderSleepAnalysis.setActionCount(totalActionCount);
elderSleepAnalysis.setTurnedCount(totalTurnedCount);
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore(score);
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
elderSleepAnalysis.setSleepResult(sleepReport.getResult());
elderSleepAnalysis.setTenantId(tenantId);
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId());
// platElderSleepAnalysisService.save(elderSleepAnalysis);
}
}
package com.makeit.iotapi;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.global.annotation.AuthIgnore;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.module.admin.vo.plat.PlatTenantVO;
import com.makeit.module.iot.service.IotOrgService;
import com.makeit.module.iot.service.IotProductDeviceService;
......@@ -127,27 +122,4 @@ public class IotDeviceInfoContentFall {
System.out.println(list);
}
@Test
@TenantIdIgnore
@AuthIgnore
void mergeElderSleepList() {
List<PlatElderSleep> sleepList = platElderSleepService.list(Wrappers.<PlatElderSleep>lambdaQuery()
.eq(PlatElderSleep::getHappenDate, "2024-01-01").eq(PlatElderSleep::getElderId, "1712648603580764161"));
logger.info("ori sleep data :{}", JSONUtil.toJsonStr(sleepList));
List<PlatElderSleep> platElderSleeps = recursion(sleepList, sleepList.size() / 2, 3);
logger.info("end sleep data :{}", JSONUtil.toJsonStr(platElderSleeps));
List<PlatElderSleep> list = platElderSleepService.mergeWakeUpList(sleepList, 3);
System.out.println(list);
}
private List<PlatElderSleep> recursion(List<PlatElderSleep> elderSleepList, int count, int riseRepeatThreshold) {
List<PlatElderSleep> platElderSleeps = platElderSleepService.mergeWakeUpList(elderSleepList, riseRepeatThreshold);
if (count == 0) {
return platElderSleeps;
} else {
count--;
return recursion(platElderSleeps, count, riseRepeatThreshold);
}
}
}
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