Commit 2aff66f8 by 汪志阳

fix:睡眠时间计算代码优化

parent ad4abbee
package com.makeit.module.iot.vo.analysis;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-04-16:18
*/
@Data
public class SleepCountDTO {
private Integer totalActionCount;
private Integer totalTurnedCount;
}
...@@ -11,19 +11,25 @@ public class SleepTimeAnalysisVO { ...@@ -11,19 +11,25 @@ public class SleepTimeAnalysisVO {
private String endTime; private String endTime;
// 间隔时间 /**
* 间隔时间(分钟)
*/
private Long interval; private Long interval;
// SleepTypeEnum /**
* SleepTypeEnum
*/
private String type; private String type;
private List<SleepTimeAnalysisVO> deepList; private List<SleepTimeAnalysisVO> deepList;
private List<SleepTimeAnalysisVO> midList; private List<SleepTimeAnalysisVO> midList;
/**
* 浅睡
*/
private List<SleepTimeAnalysisVO> lightList; private List<SleepTimeAnalysisVO> lightList;
/**
* 清醒
*/
private List<SleepTimeAnalysisVO> soberList; private List<SleepTimeAnalysisVO> soberList;
} }
package com.makeit.module.iot.vo.analysis;
import lombok.Data;
import java.util.List;
/**
* @author wangzy
* @description
* @createDate 2024-01-04-11:13
*/
@Data
public class SleepTimeDTO {
/**
* 入睡
*/
private List<SleepTimeAnalysisVO> sleepList;
/**
* 深度
*/
private List<SleepTimeAnalysisVO> deepList;
/**
* 中度睡眠
*/
private List<SleepTimeAnalysisVO> midList;
/**
* 浅睡
*/
private List<SleepTimeAnalysisVO> lightList;
/**
* 清醒
*/
private List<SleepTimeAnalysisVO> soberList;
/**
* 起床
*/
private List<SleepTimeAnalysisVO> getUpList;
/**
* 小憩
*/
private List<SleepTimeAnalysisVO> restList;
/**
* 睡眠:深度睡眠和浅度睡眠>3小时
*/
private List<SleepTimeAnalysisVO> daySleepList;
}
package com.makeit.module.iot.vo.analysis;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-04-14:28
*/
@Data
public class SleepTimeMinuteDTO {
private Long daySleepTime;
private Long dayRestTime;
private Long deepTime;
private Long soberTime;
private Long lightTime;
}
...@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; ...@@ -5,6 +5,7 @@ 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;
...@@ -83,7 +84,7 @@ public class PlatElderSleepController { ...@@ -83,7 +84,7 @@ public class PlatElderSleepController {
@GetMapping("test4") @GetMapping("test4")
@AuthIgnore @AuthIgnore
@TenantIdIgnore @TenantIdIgnore
public ApiResponseEntity<List<PlatElderSleepAnalysis>> elderSleepSleepAnalysisTask(@RequestParam Integer month, public ApiResponseEntity<List<ElderSleepAnalysisVO>> elderSleepSleepAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) { @RequestParam Integer day) {
return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day)); return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day));
} }
......
package com.makeit.entity.platform.elder;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.util.List;
/**
* @author wangzy
* @description
* @createDate 2024-01-04-15:49
*/
@Data
public class ElderSleepAnalysisVO extends PlatElderSleepAnalysis {
@TableField(exist = false)
List<PlatElderSleep> platElderSleeps;
}
...@@ -38,7 +38,7 @@ public class PlatElderSleep extends BaseBusEntity { ...@@ -38,7 +38,7 @@ public class PlatElderSleep extends BaseBusEntity {
@ApiModelProperty(value = "起床时间") @ApiModelProperty(value = "起床时间")
private LocalDateTime endSleep; private LocalDateTime endSleep;
@ApiModelProperty(value = "睡眠类型 1 睡眠 2 小憩") @ApiModelProperty(value = "睡眠类型 1 睡眠 2 小憩,3:深度睡眠,4:中度睡眠,5:浅度睡眠, 6:清醒,7:离床")
private Integer elderSleepType; private Integer elderSleepType;
@ApiModelProperty(value = "当前日期 yyyy-mm-dd") @ApiModelProperty(value = "当前日期 yyyy-mm-dd")
private String happenDate; private String happenDate;
......
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<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month, Integer day); List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day);
void test1(); void test1();
......
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.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;
...@@ -84,89 +86,19 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -84,89 +86,19 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired @Autowired
private PlatElderReportMonthService platElderReportMonthService; private PlatElderReportMonthService platElderReportMonthService;
@Override private TreeMap<String, AnalysisVO> getPerMinuteData(Map<String, List<DeviceInfoContentBreathe>> minuteMap,SaasSleepAnalysisModel analysisModel) {
@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());
double sleepTimeActionDuration = Double.parseDouble(analysisModel.getSleepTimeActionDuration()); // 每分钟大于30秒体动值 大于(50)
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()) {
deviceInfoContentBreathes = entry.getValue(); List<DeviceInfoContentBreathe> deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties; DeviceInfoContentBreathe.Properties breatheProperties;
Integer bodymove;
int reportSize = deviceInfoContentBreathes.size(); int reportSize = deviceInfoContentBreathes.size();
// 记录总呼吸率和总心率 // 记录总呼吸率和总心率
...@@ -185,15 +117,14 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -185,15 +117,14 @@ 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;
boolean awakeMinuteActionFlag = false; // 清醒每分钟体动是否满足要求 // 清醒每分钟体动是否满足要求 (每分钟体动值大于60或无人)
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();
bodymove = breatheProperties.getBodymove(); Integer 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有人
...@@ -201,10 +132,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -201,10 +132,11 @@ 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;
} }
...@@ -213,38 +145,44 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -213,38 +145,44 @@ 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 (getUpBodymoveCount > riseActionThreshold) { if (bodyMove > riseActionThreshold) {
getUpBodymoveCount++; getUpBodymoveCount++;
} }
// 清醒 // 清醒
if (bodymove > awakeThreshold) { if (bodyMove > awakeThreshold) {
awakeMinuteActionFlag = true; awakeMinuteActionFlag = true;
} }
if (br > maxBr) { if (br > maxBr) {
maxBr = br; maxBr = br;
} }
if (br < minBr) { if (minBr == 0) {
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;
...@@ -254,18 +192,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -254,18 +192,15 @@ 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);
...@@ -274,31 +209,26 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -274,31 +209,26 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag); analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag);
statisticsMap.put(entry.getKey(), analysisVO); statisticsMap.put(entry.getKey(), analysisVO);
} }
TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap); return statisticsMap;
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
} }
if (totalMap.isEmpty()) { /**
continue; * 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
} * @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 (StringUtils.isEmpty(startSleepTime)) { if (StrUtil.isBlank(startSleepTime)) {
startSleepTime = entry.getKey(); startSleepTime = entry.getKey();
} }
sleepMinute++; sleepMinute++;
...@@ -308,7 +238,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -308,7 +238,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepMinute > sleepTimeActionDuration * 60) { if (sleepMinute > sleepTimeActionDuration * 60) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepTime); sleepTimeAnalysisVO.setStartTime(startSleepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
...@@ -317,8 +247,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -317,8 +247,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
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<>();
...@@ -334,17 +266,28 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -334,17 +266,28 @@ 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.getType(), sleepTotalMap); sleepTypeMap.put(timeAnalysisVO.getStartTime(), sleepTotalMap);
}
} }
return sleepTypeMap;
} }
// 判断起床时间 /**
String startGetupTime = null; // 起床时间开始 * 获取起床数据(离床大于0.5小时,或者每分钟大于30秒体动值大于50持续10min,且在两小时内无再次入睡
* @param totalMap
* @param riseLeaveThreshold
* @param riseActionDuration
* @param sleepTimeAnalysisVOList
*/
private void getWakeUpDate(TreeMap<String, AnalysisVO> totalMap, double riseLeaveThreshold, int riseActionDuration,
double repeatSleepThreshold, List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
// 起床时间
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();
if (analysisVO.getIsMoveBed()) { if (analysisVO.getIsMoveBed()) {
if (StringUtils.isEmpty(startGetupTime)) { if (StrUtil.isBlank(startGetupTime)) {
startGetupTime = entry.getKey(); startGetupTime = entry.getKey();
} }
getupMinute++; getupMinute++;
...@@ -354,7 +297,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -354,7 +297,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (getupMinute > riseLeaveThreshold * 60) { if (getupMinute > riseLeaveThreshold * 60) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); 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());
...@@ -364,13 +307,16 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -364,13 +307,16 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
getupMinute = 0; getupMinute = 0;
} }
// 判断起床时间 List<SleepTimeAnalysisVO> sleepList = sleepTimeAnalysisVOList.stream().
String startGetupTime2 = null; // 起床时间开始 filter(f -> SleepTypeEnum.SLEEP.getCode().equals(f.getType())).collect(Collectors.toList());
// 起床时间
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 (StringUtils.isEmpty(startGetupTime2)) { if (StrUtil.isBlank(startGetupTime)) {
startGetupTime2 = entry.getKey(); startGetupTime2 = entry.getKey();
} }
getupMinute2++; getupMinute2++;
...@@ -379,27 +325,56 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -379,27 +325,56 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) { if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) {
continue; continue;
} }
if (getupMinute2 > riseActionDuration) { if (getupMinute2 > riseActionDuration && startGetupTime2 != null) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); LocalDateTime startDateTime = LocalDateTime.parse(startGetupTime2, DEFAULT_FORMATTER);
SleepTimeAnalysisVO repeatSleep = sleepList.stream().filter(f -> Duration.between(startDateTime,
LocalDateTime.parse(f.getStartTime(), DEFAULT_FORMATTER)).toMinutes() < repeatSleepThreshold * 60)
.findFirst().orElse(null);
// 两小时内不在有入睡
if (repeatSleep == null) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime2); sleepTimeAnalysisVO.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 SleepCountDTO deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepDeepMinute = 0; int sleepDeepMinute = 0;
String startSleepDeepTime = null; // 入睡时间开始 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());
// 判断深度睡眠时间 // 判断深度睡眠时间
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();
totalActionCount += analysisVO.getActionCount(); boolean actionFlag = analysisVO.getActionCount() == sleepDeepActionThreshold;
totalTurnedCount += analysisVO.getTurnedCount(); boolean turnedFlag = analysisVO.getTurnedCount() == sleepDeepActionThreshold;
if (analysisVO.getActionCount() == sleepDeepActionThreshold && 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()) { && sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) { if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = voEntry.getKey(); startSleepDeepTime = voEntry.getKey();
...@@ -411,7 +386,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -411,7 +386,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepDeepMinute > sleepDeepActionTimeBegin) { if (sleepDeepMinute > sleepDeepActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); 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());
...@@ -422,8 +397,22 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -422,8 +397,22 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
} }
} }
SleepCountDTO sleepCountDTO = new SleepCountDTO();
sleepCountDTO.setTotalTurnedCount(totalTurnedCount);
sleepCountDTO.setTotalActionCount(totalActionCount);
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; // 入睡时间开始
...@@ -442,7 +431,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -442,7 +431,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue; continue;
} }
if (sleepMidMinute > sleepModerateActionTimeBegin) { if (sleepMidMinute > sleepModerateActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); 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());
...@@ -452,7 +441,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -452,7 +441,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
sleepMidMinute = 0; sleepMidMinute = 0;
} }
} }
}
/**
* 清醒(每分钟体动值大于60或无人)
* @param sleepTypeMap
* @param sleepTimeAnalysisVOList
*/
private void wakeUp(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
// 清醒 // 清醒
int awakeMinute = 0; int awakeMinute = 0;
String startAwakeTime = null; // 入睡时间开始 String startAwakeTime = null; // 入睡时间开始
...@@ -470,7 +467,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -470,7 +467,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) { if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) {
continue; continue;
} }
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); 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());
...@@ -479,19 +476,19 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -479,19 +476,19 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
awakeMinute = 0; awakeMinute = 0;
} }
} }
}
private List<SleepTimeAnalysisVO> getFinalSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType); Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType);
List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode()); List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode());
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList();
if (CollectionUtils.isEmpty(sleepList)) { if (CollectionUtils.isEmpty(sleepList)) {
continue; return finalSleepTimeAnalysisList;
} }
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList(); // 记录多端睡眠记录
SleepTimeAnalysisVO sleepTimeAnalysis;
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型
for (int i = 0; i < sleepList.size(); i++) { for (int i = 0; i < sleepList.size(); i++) {
sleepTimeAnalysis = new SleepTimeAnalysisVO(); SleepTimeAnalysisVO sleepTimeAnalysis = new SleepTimeAnalysisVO();
List<SleepTimeAnalysisVO> deepList = Lists.newArrayList(); List<SleepTimeAnalysisVO> deepList = Lists.newArrayList();
List<SleepTimeAnalysisVO> midList = Lists.newArrayList(); List<SleepTimeAnalysisVO> midList = Lists.newArrayList();
List<SleepTimeAnalysisVO> lightList = Lists.newArrayList(); List<SleepTimeAnalysisVO> lightList = Lists.newArrayList();
...@@ -505,9 +502,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -505,9 +502,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
timeAnalysisVO.setInterval(durationRange); timeAnalysisVO.setInterval(durationRange);
LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER); LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER); LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
boolean lightSleepFlag = true; // 如果不满足下面条件,就默认都是浅睡 boolean lightSleepFlag = true;
// 如果不满足下面条件,就默认都是浅睡
for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) { for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) || otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) { if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) ||
otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) {
continue; continue;
} }
String deepStartTime = otherSleepTime.getStartTime(); String deepStartTime = otherSleepTime.getStartTime();
...@@ -544,181 +543,317 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -544,181 +543,317 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
finalSleepTimeAnalysisList.add(sleepTimeAnalysis); finalSleepTimeAnalysisList.add(sleepTimeAnalysis);
} }
return finalSleepTimeAnalysisList;
}
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
.orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
// 算出每一段睡觉的不同睡眠类型的时间段 private SleepTimeDTO groupSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList, double repeatSleepThreshold,
SaasSleepEvaluateStandardReportVO saasSleepEvaluateStandardReportVO = new SaasSleepEvaluateStandardReportVO(); double sleepThreshold) {
List<PlatElderSleep> elderSleepList = Lists.newArrayList(); sleepTimeAnalysisVOList.forEach(s -> {
PlatSleepRangeVO sleepRangeVO; 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());
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.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);
}
}
for (SleepTimeAnalysisVO timeAnalysisVO : finalSleepTimeAnalysisList) { });
List<PlatSleepRangeVO> sleepRangeVOList = Lists.newArrayList(); sleepTimeDTO.setRestList(restList);
PlatElderSleep elderSleep = new PlatElderSleep(); sleepTimeDTO.setDaySleepList(sleepOverTimeList);
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getDeepList()) { }
sleepRangeVO = new PlatSleepRangeVO(); return sleepTimeDTO;
}
private PlatElderSleepAnalysis savePlatElderSleepAnalysis(SleepTimeDTO sleepTimeDTO,
SaasSleepEvaluateStandardReport evaluateStandardReport,
String elderId, String currentDate, SleepCountDTO sleepCountDTO,
String tenantId,
String oriDeviceId) {
SleepTimeMinuteDTO sleepTimeMinute = getSleepTimeMinute(sleepTimeDTO);
long daySleepTime = sleepTimeMinute.getDaySleepTime() != null ? sleepTimeMinute.getDaySleepTime() : 0L;
long deepTime = sleepTimeMinute.getDeepTime() != null ? sleepTimeMinute.getDeepTime() : 0L;
long dayRestTime = sleepTimeMinute.getDayRestTime() != null ? sleepTimeMinute.getDayRestTime() : 0L;
long soberTime = sleepTimeMinute.getSoberTime() != null ? sleepTimeMinute.getSoberTime() : 0L;
long lightTime = sleepTimeMinute.getLightTime() != null ? sleepTimeMinute.getLightTime() : 0L;
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score));
// 长者一天的睡眠分析
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elderId);
elderSleepAnalysis.setActionCount(sleepCountDTO.getTotalActionCount());
elderSleepAnalysis.setTurnedCount(sleepCountDTO.getTotalTurnedCount());
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore(score);
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
elderSleepAnalysis.setSleepResult(sleepReport.getResult());
elderSleepAnalysis.setTenantId(tenantId);
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
elderSleepAnalysis.setOriDeviceId(oriDeviceId);
platElderSleepAnalysisService.save(elderSleepAnalysis);
return elderSleepAnalysis;
}
private List<PlatElderSleep> saveElderSleep (SleepTimeDTO sleepTimeDTO,String platElderId,String currentDate) {
List<PlatElderSleep> elderSleepList = new ArrayList<>();
List<SleepTimeAnalysisVO> deepList = sleepTimeDTO.getDeepList();
List<SleepTimeAnalysisVO> moderateList = sleepTimeDTO.getMidList();
List<SleepTimeAnalysisVO> lightList = sleepTimeDTO.getLightList();
List<SleepTimeAnalysisVO> soberList = sleepTimeDTO.getSoberList();
if (CollUtil.isNotEmpty(deepList)) {
for (SleepTimeAnalysisVO analysisVO : deepList) {
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(3);
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getMidList()) { }
sleepRangeVO = new PlatSleepRangeVO(); if (CollUtil.isNotEmpty(moderateList)) {
for (SleepTimeAnalysisVO analysisVO : sleepTimeDTO.getMidList()) {
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(4);
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getLightList()) { }
sleepRangeVO = new PlatSleepRangeVO(); if (CollUtil.isNotEmpty(lightList)) {
for (SleepTimeAnalysisVO analysisVO : lightList) {
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(5);
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getSoberList()) { }
sleepRangeVO = new PlatSleepRangeVO(); if (CollUtil.isNotEmpty(soberList)) {
for (SleepTimeAnalysisVO analysisVO : soberList) {
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);
}
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);
}
PlatElderSleep platElderSleep = new PlatElderSleep();
// 获取睡眠评估标准配置 platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
String sleepDeepConfig = evaluateStandardReport.getSleepDeepConfig(); platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
String soberConfig = evaluateStandardReport.getSoberConfig(); platElderSleep.setElderId(platElderId);
String sleepTimeConfig = evaluateStandardReport.getSleepTime(); platElderSleep.setElderSleepType(6);
String lightnessConfig = evaluateStandardReport.getSleepLightnessConfig(); platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
List<SleepConfigVO> sleepDeepConfigList = JSON.parseArray(sleepDeepConfig, SleepConfigVO.class); platElderSleep.setInterval(analysisVO.getInterval());
List<SleepConfigVO> soberConfigList = JSON.parseArray(soberConfig, SleepConfigVO.class); platElderSleep.setHappenDate(currentDate);
List<SleepConfigVO> sleepTimeConfigList = JSON.parseArray(sleepTimeConfig, SleepConfigVO.class); elderSleepList.add(platElderSleep);
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;
} }
} }
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());
long deepScore = 0; PlatElderSleep platElderSleep = new PlatElderSleep();
for (int i = 0; i < sleepDeepConfigList.size(); i++) { platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
long hour = deepTime / 60; platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i); platElderSleep.setElderId(platElderId);
long configHour = Long.parseLong(sleepConfigVO.getHour()); platElderSleep.setElderSleepType(7);
if (i == 0 && Objects.equals(hour, configHour)) { platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
deepScore = Long.parseLong(sleepConfigVO.getScore()); platElderSleep.setInterval(analysisVO.getInterval());
} platElderSleep.setHappenDate(currentDate);
if (i > 0 && hour > configHour) { elderSleepList.add(platElderSleep);
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) { platElderSleepService.saveBatch(elderSleepList);
soberScore += Long.parseLong(sleepConfigVO.getScore()); return elderSleepList;
} }
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));
return result;
} }
saasSleepEvaluateStandardReportVO.setSoberScore(soberScore);
long lightScore = 0; @Override
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month,Integer day) {
long lightHour = lightTime / 60; List<String> dayHourRangeList = getLastDayHourRange(month, day);
long lightnessConfigHour = Long.parseLong(lightnessConfigVO.getHour()); String currentDate = LocalDate.now().minusDays(1).toString();
if ( Objects.equals(lightHour,lightnessConfigHour)) { if (month != null && day != null) {
lightScore = Long.parseLong(lightnessConfigVO.getScore()); currentDate = LocalDate.of(2024, month, day).minusDays(1).toString();
} }
saasSleepEvaluateStandardReportVO.setLightScore(lightScore);
long sleepScore = 0; SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
for (int i = 0; i < sleepTimeConfigList.size(); i++) { .orderByDesc(BaseEntity::getCreateBy)
long hour = sleepTime / 60; .last("limit 1"));
SleepConfigVO sleepConfigVO = sleepTimeConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour()); List<PlatRoomBedDevice> platRoomBedDeviceList = roomBedDeviceService.list(new QueryWrapper<PlatRoomBedDevice>()
if (i == 0 && Objects.equals(hour, configHour)) { .lambda().isNotNull(PlatRoomBedDevice::getBedId));
sleepScore = Long.parseLong(sleepConfigVO.getScore()); SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
} .orderByDesc(BaseEntity::getCreateDate)
if (i > 0 && hour > configHour) { .last("limit 1"));
sleepScore += Long.parseLong(sleepConfigVO.getScore());
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<>();
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;
} }
saasSleepEvaluateStandardReportVO.setSleepScore(sleepScore); String tenantId = elder.getTenantId();
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()) { for (String hourRange : dayHourRangeList) {
daySleepTime += elderSleep.getInterval(); String[] hourRangeArray = hourRange.split("~");
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]);
if (CollectionUtils.isEmpty(deviceOperationLogEntities)) {
continue;
} }
if (ElderSleepType.REST.getCode() == elderSleep.getElderSleepType()) { List<DeviceInfoContentBreathe> deviceInfoContentBreatheList = deviceOperationLogEntities.stream()
dayRestTime += elderSleep.getInterval(); .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();
TreeMap<String, AnalysisVO> statisticsMap = getPerMinuteData(minuteMap, analysisModel);
if (CollUtil.isNotEmpty(statisticsMap)) {
totalMap.putAll(statisticsMap);
} }
} }
int riseRepeatThreshold = Integer.parseInt(analysisModel.getRiseRepeatThreshold()); if (CollUtil.isEmpty(totalMap)) {
List<PlatElderSleep> mergeElderSleepList = recursion(elderSleepList, elderSleepList.size() / 2, riseRepeatThreshold); continue;
platElderSleepService.saveBatch(mergeElderSleepList); }
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score)); int totalActionCount = 0;
int totalTurnedCount = 0;
// 记录长者不同类型的睡眠时间
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
// 入睡时间
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap =
getFallAsleepData(totalMap, sleepTimeActionDuration, sleepTimeAnalysisVOList);
// 深度睡眠
SleepCountDTO sleepCountDTO = deepSleepData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
// 中度睡眠
middleSleep(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
// 清醒
wakeUp(sleepTypeMap, sleepTimeAnalysisVOList);
// 起床时间
getWakeUpDate(totalMap, riseLeaveThreshold, riseActionDuration, repeatSleepThreshold, sleepTimeAnalysisVOList);
// 获取各种睡眠类型的数据
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList, repeatSleepThreshold, sleepThreshold);
if (CollUtil.isEmpty(sleepTimeDTO.getSleepList())) {
continue;
}
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);
// 长者一天的睡眠分析
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elder.getId());
elderSleepAnalysis.setActionCount(totalActionCount);
elderSleepAnalysis.setTurnedCount(totalTurnedCount);
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore(score);
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
elderSleepAnalysis.setSleepResult(sleepReport.getResult());
elderSleepAnalysis.setTenantId(tenantId);
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId());
result.add(elderSleepAnalysis);
platElderSleepAnalysisService.save(elderSleepAnalysis);
} }
return result; return result;
} }
...@@ -961,4 +1096,189 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -961,4 +1096,189 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
} }
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);
}
} }
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