Commit d44d7a1f by huangjy

fix:长者报告定时器

parent 93f00def
Showing with 695 additions and 659 deletions
......@@ -265,27 +265,6 @@ public class IotProductDeviceService extends IotCommonService {
return tempList;
}
return Lists.newArrayList();
/* long minute = 1440;
List<DeviceInfoContentBreathe> breatheList = Lists.newArrayList();
DeviceInfoContentBreathe deviceInfoContentBreathe;
for (long i = 1; i <= minute; i++) {
int brRandomLong = RandomUtils.nextInt(11,28);
int hrRandomLong = RandomUtils.nextInt(55,125);
int movebodyRandomLong = RandomUtils.nextInt(40,90);
deviceInfoContentBreathe = new DeviceInfoContentBreathe();
LocalDateTime localDateTime = startTime.plusMinutes(i);
long timeStamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
deviceInfoContentBreathe.setTimestamp(timeStamp);
DeviceInfoContentBreathe.Properties properties = new DeviceInfoContentBreathe.Properties();
properties.setBr(brRandomLong);
properties.setHr(hrRandomLong);
properties.setBodymove(movebodyRandomLong);
deviceInfoContentBreathe.setProperties(properties);
breatheList.add(deviceInfoContentBreathe);
}
return breatheList;*/
}
public static String formatLongTime(long time) {
......
......@@ -74,5 +74,12 @@ public class DeviceInfoContentBreathe {
@JsonProperty("point")
// 呼吸波形
private List<Integer> point;
private int brStopThreshold; // 发生次数阈值
private int brFastThreshold; // 发生次数阈值
private int brSlowThreshold; // 发生次数阈值
private int hrFastThreshold; // 发生次数阈值
private int hrSlowThreshold; // 发生次数阈值
}
}
......@@ -4,7 +4,6 @@ package com.makeit.module.controller.children.elder;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.global.annotation.AuthIgnore;
import com.makeit.service.platform.elder.PlatElderDayReportWeekService;
import com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO;
import com.makeit.vo.platform.elder.report.day.*;
......@@ -104,13 +103,5 @@ public class PlatElderReportWeekChildrenController {
}
@ApiOperation("定时任务")
@PostMapping("heartRespiratoryJob")
@AuthIgnore
public ApiResponseEntity<String> heartRespiratoryJob() {
platElderDayReportWeekService.heartRespiratoryJob();
return ApiResponseUtils.success();
}
}
......@@ -9,7 +9,7 @@ import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderReportMonthService;
import com.makeit.service.platform.elder.PlatElderSleepService;
import com.makeit.task.IotSyncTask;
import com.makeit.task.PlatElderReportTask;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -32,7 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
public class PlatElderSleepController {
@Autowired
private IotSyncTask iotSyncTask;
private PlatElderReportTask platElderReportTask;
@Autowired
private PlatElderSleepService platElderSleepService;
@Autowired
......@@ -40,14 +40,7 @@ public class PlatElderSleepController {
@Autowired
private PlatElderReportMonthService platElderReportMonthService;
@ApiOperation("测试")
@PostMapping("test")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> test() {
iotSyncTask.elderSleepSleepAnalysisTask();
return ApiResponseUtils.success();
}
@ApiOperation("测试")
@PostMapping("test1")
......@@ -61,8 +54,24 @@ public class PlatElderSleepController {
@ApiOperation("测试")
@PostMapping("test2")
@AuthIgnore
public ApiResponseEntity<Void> reportMonthJob() {
platElderReportMonthService.reportMonthJob();
public ApiResponseEntity<Void> heartRespiratoryTask() {
platElderReportTask.heartRespiratoryTask();
return ApiResponseUtils.success();
}
@ApiOperation("测试")
@PostMapping("test3")
@AuthIgnore
public ApiResponseEntity<Void> elderHeartRespiratoryAnalysisTask() {
platElderReportTask.elderHeartRespiratoryAnalysisTask();
return ApiResponseUtils.success();
}
@ApiOperation("测试")
@PostMapping("test4")
@AuthIgnore
public ApiResponseEntity<Void> elderSleepSleepAnalysisTask() {
platElderReportTask.elderSleepSleepAnalysisTask();
return ApiResponseUtils.success();
}
......
......@@ -13,4 +13,5 @@ import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
*/
public interface PlatElderBreatheAnalysisService extends IService<PlatElderBreatheAnalysis> {
void elderHeartRespiratoryAnalysisTask();
}
......@@ -13,4 +13,5 @@ import com.makeit.entity.platform.elder.PlatElderBreatheDayStat;
*/
public interface PlatElderBreatheDayStatService extends IService<PlatElderBreatheDayStat> {
void heartRespiratoryTask();
}
......@@ -48,6 +48,4 @@ public interface PlatElderDayReportWeekService {
List<PlatElderBehaviorDistributionVO> behaviorDistribution(PlatElderReportDTO platElderIdDTO);
void heartRespiratoryJob();
}
......@@ -28,7 +28,6 @@ public interface PlatElderReportMonthService extends IService<PlatElderReportMon
List<PlatElderReportMonthVO> reportMonth(PlatElderReportDTO platElderIdDTO);
void reportMonthJob();
}
package com.makeit.service.platform.elder.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.entity.platform.elder.PlatElderBreatheDayStat;
import com.makeit.entity.saas.analysis.SaasDiseaseEvaluateReport;
import com.makeit.entity.saas.analysis.SaasDiseaseModel;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.enums.report.BreatheTypeEnum;
import com.makeit.enums.report.HeartRateTypeEnum;
import com.makeit.mapper.platform.elder.PlatElderBreatheAnalysisMapper;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import com.makeit.module.iot.vo.analysis.BreatheAbnormalVO;
import com.makeit.module.iot.vo.analysis.DiseaseReportVO;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.elder.PlatElderBreatheAnalysisService;
import com.makeit.service.platform.elder.PlatElderBreatheDayStatService;
import com.makeit.service.platform.elder.PlatElderRealTimeService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.service.saas.SaasDiseaseEvaluateReportService;
import com.makeit.service.saas.SaasDiseaseModelService;
import com.makeit.service.saas.SaasDiseaseReportService;
import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.time.LocalDateTimeUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
/**
* <p>
......@@ -17,4 +62,406 @@ import org.springframework.stereotype.Service;
@Service
public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBreatheAnalysisMapper, PlatElderBreatheAnalysis> implements PlatElderBreatheAnalysisService {
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatElderBreatheDayStatService platElderBreatheDayStatService;
@Autowired
private SaasSleepAnalysisModelService saasSleepAnalysisModelService;
@Autowired
private SaasDiseaseModelService saasDiseaseModelService;
@Autowired
private SaasDiseaseEvaluateReportService saasDiseaseEvaluateReportService;
@Autowired
private SaasDiseaseReportService saasDiseaseReportService;
@Autowired
private IotProductDeviceService productDeviceService;
@Autowired
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Autowired
private PlatElderRealTimeService platElderRealTimeService;
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
@Transactional(rollbackFor = Exception.class)
public void elderHeartRespiratoryAnalysisTask() {
LocalDate nowDate = LocalDate.now();
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
if (CollectionUtils.isEmpty(elderList)) {
return;
}
List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId);
List<PlatElderBreatheDayStat> elderBreatheDayStatList = platElderBreatheDayStatService.list(new QueryWrapper<PlatElderBreatheDayStat>().lambda()
.in(PlatElderBreatheDayStat::getElderId, elderIdList)
.eq(PlatElderBreatheDayStat::getDay, yesDate));
Map<String, PlatElderBreatheDayStat> breatheDayStatMap = StreamUtil.toMap(elderBreatheDayStatList, PlatElderBreatheDayStat::getElderId);
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
SaasDiseaseModel saasDiseaseModel = saasDiseaseModelService.getOne(new QueryWrapper<SaasDiseaseModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
// 呼吸率
int breatheThresholdMin = Integer.parseInt(analysisModel.getBreatheThresholdMin());
int breatheThresholdMax = Integer.parseInt(analysisModel.getBreatheThresholdMax());
int breatheDuration = Integer.parseInt(analysisModel.getBreatheDuration());
// 心率
int heartThresholdMin = Integer.parseInt(analysisModel.getHeartThresholdMin());
int heartThresholdMax = Integer.parseInt(analysisModel.getHeartThresholdMax());
int heartDuration = Integer.parseInt(analysisModel.getHeartDuration());
for (PlatElder platElder : elderList) {
PlatElderBreatheDayStat elderBreatheDayStat = breatheDayStatMap.get(platElder.getId());
if (elderBreatheDayStat == null) {
continue;
}
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElder.getId(), null);
if (platDevice == null) {
continue;
}
List<String> dayHourRange = getLastDayHourRange(yesStart);
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>();
String reportStartTime = "";
String reportEndTime = "";
for (String hourRange : dayHourRange) {
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);
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()) {
if (StringUtils.isEmpty(reportStartTime)) {
reportStartTime = entry.getKey();
}
reportEndTime = entry.getKey();
deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties;
// 呼吸暂停
int brStopCount = 0;
int brStopSecond = 0;
// 呼吸过速
int brFastCount = 0;
int brFastSecond = 0;
int brFast = 0;
// 呼吸过缓
int brSlowCount = 0;
int brSlowSecond = 0;
int brSlow = 0;
// 心率过速
int hrFastCount = 0;
int hrFast = 0;
int hrFastSecond = 0;
// 心率过缓
int hrSlowCount = 0;
int hrSlowSecond = 0;
int hrSlow = 0;
AnalysisVO analysisVO = new AnalysisVO();
for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
// 体动指数
breatheProperties = infoContentBreathe.getProperties();
int br = breatheProperties.getBr();
int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
if (hasPerson == 0) {
continue;
}
// 判断呼吸暂停
if (br == 0) {
brStopSecond++;
if (brStopSecond == breatheDuration) {
brStopCount++;
brStopSecond = 0;
}
} else {
brStopSecond = 0;
}
// 判断呼吸率阈值,记录发生时间和当前呼吸率
if (breatheThresholdMax < br) {
if (brFast == 0) {
brFast = br;
}
brFastSecond++;
if (brFastSecond == breatheDuration) {
brFastCount++;
brFastSecond = 0;
}
} else {
brFastSecond = 0;
}
if (br < breatheThresholdMin) {
if (brSlow == 0) {
brSlow = br;
}
brSlowSecond++;
if (brSlowSecond == breatheDuration) {
brSlowCount++;
brSlowSecond = 0;
}
} else {
brSlowSecond = 0;
}
if (heartThresholdMax < hr) {
if (hrFast == 0) {
hrFast = br;
}
hrFastSecond++;
if (hrFastSecond == heartDuration) {
hrFastCount++;
hrFastSecond = 0;
}
} else {
hrFastSecond = 0;
}
if (heartThresholdMin > hr) {
if (hrSlow == 0) {
hrSlow = br;
}
hrSlowSecond++;
if (hrSlowSecond == heartDuration) {
hrSlowCount++;
hrSlowSecond = 0;
}
} else {
hrSlowSecond = 0;
}
}
analysisVO.setBrStopThreshold(brStopCount);
analysisVO.setBrFastThreshold(brFastCount);
analysisVO.setBrSlowThreshold(brSlowCount);
analysisVO.setHrFastThreshold(hrFastCount);
analysisVO.setHrSlowThreshold(hrSlowCount);
statisticsMap.put(entry.getKey(), analysisVO);
}
TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap);
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
}
if (totalMap.isEmpty()) {
continue;
}
// 呼吸暂停
int apneaTime = Integer.parseInt(saasDiseaseModel.getApneaTime());
int apneaThreshold = Integer.parseInt(saasDiseaseModel.getApneaThreshold());
BigDecimal apneaRate = new BigDecimal(apneaTime).divide(new BigDecimal(apneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过速
int tachypneaTime = Integer.parseInt(saasDiseaseModel.getTachypneaTime());
int tachypneaThreshold = Integer.parseInt(saasDiseaseModel.getTachypneaThreshold());
BigDecimal tachypneaRate = new BigDecimal(tachypneaTime).divide(new BigDecimal(tachypneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过缓
int bradypneaTime = Integer.parseInt(saasDiseaseModel.getBradypneaTime());
int bradypneaThreshold = Integer.parseInt(saasDiseaseModel.getBradypneaThreshold());
BigDecimal bradypneaRate = new BigDecimal(bradypneaTime).divide(new BigDecimal(bradypneaThreshold), 2, RoundingMode.HALF_UP);
// 心率过缓
int bradycardiaTime = Integer.parseInt(saasDiseaseModel.getBradycardiaTime());
int bradycardiaThreshold = Integer.parseInt(saasDiseaseModel.getBradycardiaThreshold());
BigDecimal bradycardiaRate = new BigDecimal(bradycardiaTime).divide(new BigDecimal(bradycardiaThreshold), 2, RoundingMode.HALF_UP);
// 心率过速
int tachycardiaTime = Integer.parseInt(saasDiseaseModel.getTachycardiaTime());
int tachycardiaComparison = Integer.parseInt(saasDiseaseModel.getTachycardiaThreshold());
BigDecimal tachycardiaRate = new BigDecimal(tachycardiaTime).divide(new BigDecimal(tachycardiaComparison), 2, RoundingMode.HALF_UP);
// 呼吸疾病报告
int brStopCount = 0;
int brFastCount = 0;
int brSlowCount = 0;
int hrFastCount = 0;
int hrSlowCount = 0;
// 计算异常的信息,并且统计异常的次数
List<BreatheAbnormalVO> breatheAbnormalVOList = Lists.newArrayList();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getBrStopThreshold() > 0) {
brStopCount += analysisVO.getBrStopThreshold();
}
if (analysisVO.getBrSlowThreshold() > 0) {
brSlowCount += analysisVO.getBrSlowThreshold();
}
if (analysisVO.getBrFastThreshold() > 0) {
brFastCount += analysisVO.getBrFastThreshold();
}
if (analysisVO.getHrFastThreshold() > 0) {
hrFastCount += analysisVO.getHrFastThreshold();
}
if (analysisVO.getHrSlowThreshold() > 0) {
hrSlowCount += analysisVO.getHrSlowThreshold();
}
}
int timeHourRange = 24;
if (StringUtils.isNotEmpty(reportStartTime) && StringUtils.isNotEmpty(reportEndTime)) {
Long durationRange = getDurationRange(reportStartTime, reportEndTime);
timeHourRange = (int) (durationRange / 60);
}
// 判断是否满足配置的呼吸心率异常类型
BigDecimal dayBrStopRate = brStopCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brStopCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrSlowRate = brSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brSlowCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrFastRate = brFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrFastRate = hrFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrSlowRate = hrSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrSlowCount), 2, RoundingMode.HALF_UP);
boolean brStopFlag = false;
boolean brFastFlag = false;
boolean brSlowFlag = false;
boolean hrFastFlag = false;
boolean hrSlowFlag = false;
boolean normalFlag;
if (apneaRate.compareTo(dayBrStopRate) > 0) {
brStopFlag = true;
}
if (tachypneaRate.compareTo(dayBrFastRate) > 0) {
brFastFlag = true;
}
if (bradypneaRate.compareTo(dayBrSlowRate) > 0) {
brSlowFlag = true;
}
if (tachycardiaRate.compareTo(dayHrFastRate) > 0) {
hrFastFlag = true;
}
if (bradycardiaRate.compareTo(dayHrSlowRate) > 0) {
hrSlowFlag = true;
}
normalFlag = !(hrFastFlag || brStopFlag || brFastFlag || brSlowFlag || hrSlowFlag);
SaasDiseaseEvaluateReport saasDiseaseEvaluateReport = saasDiseaseEvaluateReportService.getOne(new QueryWrapper<SaasDiseaseEvaluateReport>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
String resultContent = saasDiseaseEvaluateReport.getResultContent();
List<DiseaseReportVO> evaluateReportList = JSON.parseArray(resultContent, DiseaseReportVO.class);
DiseaseReportVO finalReport = new DiseaseReportVO();
// 根据疾病标准配置的规则判断满足哪个区间范围
for (DiseaseReportVO diseaseReportVO : evaluateReportList) {
List<DiseaseReportVO.Condition> conditionList = diseaseReportVO.getCondition();
boolean conditionFlag = true;
for (DiseaseReportVO.Condition condition : conditionList) {
String resultRelational = condition.getResultRelational();
String resultCondition = condition.getResultCondition();
if ("or".equals(resultCondition)) {
if (conditionFlag) {
break;
}
} else {
if (resultRelational.equals("normal")) {
conditionFlag = normalFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.APNEA.getCode())) {
conditionFlag = brStopFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.TACHYPNEA.getCode())) {
conditionFlag = brFastFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.BRADYPNEA.getCode())) {
conditionFlag = brSlowFlag && conditionFlag;
}
if (resultRelational.equals(HeartRateTypeEnum.TACHYCARDIA.getCode())) {
conditionFlag = hrFastFlag && conditionFlag;
}
if (resultRelational.equals(HeartRateTypeEnum.BRADYCARDIA.getCode())) {
conditionFlag = hrSlowFlag && conditionFlag;
}
}
}
if (conditionFlag) {
finalReport = diseaseReportVO;
}
}
EvaluateReportVO diseaseReport = saasDiseaseReportService.getByScore(Long.parseLong(finalReport.getScore()));
PlatElderBreatheAnalysis platElderBreatheAnalysis = new PlatElderBreatheAnalysis();
platElderBreatheAnalysis.setElderId(platElder.getId());
platElderBreatheAnalysis.setAvgBreatheRate(String.valueOf(elderBreatheDayStat.getRespiratoryRateAvg()));
platElderBreatheAnalysis.setAvgHeartRate(String.valueOf(elderBreatheDayStat.getHeartRateAvg()));
platElderBreatheAnalysis.setBreatheScore(finalReport.getScore());
platElderBreatheAnalysis.setHappenDate(String.valueOf(yesDate));
platElderBreatheAnalysis.setTenantId(platElder.getTenantId());
platElderBreatheAnalysis.setBreatheEvaluate(diseaseReport == null ? "" : diseaseReport.getEvaluate());
platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
}
}
public Long getDurationRange(String startTime, String endTime) {
LocalDateTime target = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期
// LocalDate today = LocalDate.now();
LocalDateTime source = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
return Duration.between(target, source).toMinutes();
}
public static String formatLongTime(long time) {
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
}
public List<String> getLastDayHourRange(LocalDateTime startDateTime) {
List<String> list = Lists.newArrayList();
String startTime;
String endTime;
for (int i = 1; i <= 24; i++) {
startTime = DateUtil.format(startDateTime.plusHours(i - 1), DatePattern.NORM_DATETIME_PATTERN);
endTime = DateUtil.format(startDateTime.plusHours(i), DatePattern.NORM_DATETIME_PATTERN);
list.add(startTime + "~" + endTime);
}
return list;
}
}
package com.makeit.service.platform.elder.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.entity.platform.elder.PlatElderBreatheDayStat;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.BreatheTypeEnum;
import com.makeit.enums.report.HeartRateTypeEnum;
import com.makeit.mapper.platform.elder.PlatElderBreatheDayStatMapper;
import com.makeit.service.platform.elder.PlatElderBreatheDayStatService;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.analysis.DiseaseReportVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.elder.*;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.data.validate.CollectionUtils;
import com.makeit.utils.data.validate.MapUtil;
import com.makeit.utils.time.LocalDateTimeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* <p>
......@@ -17,4 +41,108 @@ import org.springframework.stereotype.Service;
@Service
public class PlatElderBreatheDayStatServiceImpl extends ServiceImpl<PlatElderBreatheDayStatMapper, PlatElderBreatheDayStat> implements PlatElderBreatheDayStatService {
@Autowired
private PlatAlarmRecordService platAlarmRecordService;
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatElderSleepAnalysisService platElderSleepAnalysisService;
@Autowired
private IotProductDeviceService iotProductDeviceService;
@Autowired
private PlatElderRealTimeService platElderRealTimeService;
@Autowired
private PlatElderReportMonthService platElderReportMonthService;
@Transactional(rollbackFor = Exception.class)
@Override
public void heartRespiratoryTask() {
LocalDate nowDate = LocalDate.now();
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElderBreatheDayStat> breatheDayStatList = new ArrayList<>(10);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
List<PlatElderReportMonth> reportMonthList = new ArrayList<>(10);
List<PlatElderSleepAnalysis> sleepAnalysesList = platElderSleepAnalysisService.list(new QueryWrapper<PlatElderSleepAnalysis>().lambda()
.in(PlatElderSleepAnalysis::getElderId, StreamUtil.mapId(elderList, PlatElder::getId))
.eq(PlatElderSleepAnalysis::getHappenDate, dateTimeFormatter.format(yesDate))
);
Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMap(sleepAnalysesList, PlatElderSleepAnalysis::getElderId);
List<PlatAlarmRecord> recordList = platAlarmRecordService.list(new QueryWrapper<PlatAlarmRecord>().lambda()
.ge(PlatAlarmRecord::getAlarmDate, yesStart)
.le(PlatAlarmRecord::getAlarmDate, yesEnd)
.eq(PlatAlarmRecord::getMisinformationFlag,0)
.in(PlatAlarmRecord::getElderIds, StreamUtil.mapId(elderList, PlatElder::getId)));
Map<String, List<PlatAlarmRecord>> recordMap = StreamUtil.groupBy(recordList, PlatAlarmRecord::getElderIds);
for (PlatElder e : elderList) {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(e.getId(), null);
if (platDevice != null) {
PlatElderBreatheDayStat platElderBreatheDayStat = new PlatElderBreatheDayStat();
platElderBreatheDayStat.setElderId(e.getId());
platElderBreatheDayStat.setDeviceId(platDevice.getId());
platElderBreatheDayStat.setOriDeviceId(platDevice.getOriDeviceId());
platElderBreatheDayStat.setDay(yesDate);
List<DeviceInfoContentBreathe> breatheList = iotProductDeviceService.getDeviceLogByTimeRangeBreathe(platDevice.getOriDeviceId(), 2 * 24 * 3600, yesStart, yesEnd);
if (CollectionUtils.isEmpty(breatheList)) {
continue;
}
long hrAvg = StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getHr(), 0L, Long::sum) / breatheList.size();
long brAvg = StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getBr(), 0L, Long::sum) / breatheList.size();
platElderBreatheDayStat.setHeartRateMax(breatheList.stream().map(i -> i.getProperties().getHr()).max(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setHeartRateMin(breatheList.stream().map(i -> i.getProperties().getHr()).min(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setHeartRateAvg((int) (hrAvg));
platElderBreatheDayStat.setRespiratoryRateMax(breatheList.stream().map(i -> i.getProperties().getBr()).max(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setRespiratoryRateMin(breatheList.stream().map(i -> i.getProperties().getBr()).min(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setRespiratoryRateAvg((int) (brAvg));
platElderBreatheDayStat.setTenantId(e.getTenantId());
breatheDayStatList.add(platElderBreatheDayStat);
PlatElderReportMonth reportMonth = new PlatElderReportMonth();
reportMonth.setElderId(e.getId());
reportMonth.setDay(yesDate);
MapUtil.setIfPresent(sleepAnalysisMap, e.getId(), sa -> {
reportMonth.setSleepResult(sa.getSleepResult());
});
reportMonth.setBreatheDeviceId(platDevice.getId());
reportMonth.setBreatheOriDeviceId(platDevice.getOriDeviceId());
reportMonth.setHeartRate((int) (hrAvg));
reportMonth.setRespiratoryRate((int) (brAvg));
List<PlatAlarmRecord> rList = Optional.ofNullable(recordMap.get(e.getId())).orElse(new ArrayList<>(10));
reportMonth.setFailCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.FALL.getValue().equals(i.getAlarmType())));
reportMonth.setHeartExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.HEART.getValue().equals(i.getAlarmType())));
reportMonth.setRespiratoryExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.BREATHE.getValue().equals(i.getAlarmType())));
reportMonth.setBehaviorExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.BEHAVIOR.getValue().equals(i.getAlarmType())));
reportMonth.setTenantId(e.getTenantId());
reportMonthList.add(reportMonth);
}
}
platElderReportMonthService.saveBatch(reportMonthList);
saveBatch(breatheDayStatList);
}
}
......@@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.elder.*;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.service.saas.SaasDiseaseReportService;
......@@ -19,6 +22,7 @@ import com.makeit.service.saas.SaasSleepEvaluateReportService;
import com.makeit.utils.data.convert.BeanDtoVoUtils;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.data.validate.CollectionUtils;
import com.makeit.utils.data.validate.MapUtil;
import com.makeit.utils.old.StringUtils;
import com.makeit.utils.time.LocalDateTimeUtils;
import com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO;
......@@ -47,20 +51,10 @@ import java.util.stream.Collectors;
public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeekService {
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatTenantService platTenantService;
@Autowired
private PlatElderRealTimeService platElderRealTimeService;
@Autowired
private PlatElderDayReportDayService platElderDayReportDayService;
@Autowired
private PlatElderSleepAnalysisService platElderSleepAnalysisService;
@Autowired
private PlatElderSleepService platElderSleepService;
......@@ -80,7 +74,7 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
private PlatElderBreatheDayStatService platElderBreatheDayStatService;
@Autowired
private IotProductDeviceService iotProductDeviceService;
private PlatElderSleepAnalysisService platElderSleepAnalysisService;
private LocalDateTime weekStartDateTime(LocalDateTime defaultTime) {
return weekStartDateTime(LocalDate.now().minusDays(1), defaultTime);
......@@ -471,58 +465,4 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
return platElderDayReportDayService.behaviorDistributionInternal(platElderIdDTO, dateList);
}
@Override
public void heartRespiratoryJob() {
LocalDate nowDate = LocalDate.now();
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElderBreatheDayStat> breatheDayStatList = new ArrayList<>(10);
platTenantService.executeTenantList(() -> {
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
elderList.forEach(e -> {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(e.getId(), null);
if (platDevice != null) {
PlatElderBreatheDayStat platElderBreatheDayStat = new PlatElderBreatheDayStat();
platElderBreatheDayStat.setElderId(e.getId());
platElderBreatheDayStat.setDeviceId(platDevice.getId());
platElderBreatheDayStat.setOriDeviceId(platDevice.getOriDeviceId());
platElderBreatheDayStat.setDay(yesDate);
List<DeviceInfoContentBreathe> breatheList = iotProductDeviceService.getDeviceLogByTimeRangeBreathe(platDevice.getOriDeviceId(), 2 * 24 * 3600, yesStart, yesEnd);
platElderBreatheDayStat.setHeartRateMax(breatheList.stream().map(i -> i.getProperties().getHr()).max(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setHeartRateMin(breatheList.stream().map(i -> i.getProperties().getHr()).min(Integer::compareTo).orElse(null));
if (CollectionUtils.isNotEmpty(breatheList)) {
platElderBreatheDayStat.setHeartRateAvg((int) (StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getHr(), 0L, Long::sum) / breatheList.size()));
}
platElderBreatheDayStat.setRespiratoryRateMax(breatheList.stream().map(i -> i.getProperties().getBr()).max(Integer::compareTo).orElse(null));
platElderBreatheDayStat.setRespiratoryRateMin(breatheList.stream().map(i -> i.getProperties().getBr()).min(Integer::compareTo).orElse(null));
if (CollectionUtils.isNotEmpty(breatheList)) {
platElderBreatheDayStat.setRespiratoryRateAvg((int) (StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getBr(), 0L, Long::sum) / breatheList.size()));
}
breatheDayStatList.add(platElderBreatheDayStat);
}
});
});
platElderBreatheDayStatService.saveBatch(breatheDayStatList);
}
}
......@@ -3,23 +3,13 @@ package com.makeit.service.platform.elder.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderReportMonth;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.elder.PlatElderReportMonthMapper;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.elder.*;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.utils.data.convert.BeanDtoVoUtils;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.data.validate.CollectionUtils;
import com.makeit.utils.data.validate.MapUtil;
import com.makeit.utils.old.StringUtils;
import com.makeit.utils.time.LocalDateTimeUtils;
import com.makeit.vo.platform.elder.report.day.PlatElderHeartRespiratoryEvaluationVO;
......@@ -30,12 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* <p>
......@@ -140,72 +125,4 @@ public class PlatElderReportMonthServiceImpl extends ServiceImpl<PlatElderReport
return voList;
}
@Override
@TenantIdIgnore
public void reportMonthJob() {
LocalDate nowDate = LocalDate.now();
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
List<PlatElderReportMonth> reportMonthList = new ArrayList<>(10);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
List<PlatElderSleepAnalysis> sleepAnalysesList = platElderSleepAnalysisService.list(new QueryWrapper<PlatElderSleepAnalysis>().lambda()
.in(PlatElderSleepAnalysis::getElderId, StreamUtil.mapId(elderList, PlatElder::getId))
.eq(PlatElderSleepAnalysis::getHappenDate, dateTimeFormatter.format(yesDate))
);
Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMap(sleepAnalysesList, PlatElderSleepAnalysis::getElderId);
List<PlatAlarmRecord> recordList = platAlarmRecordService.list(new QueryWrapper<PlatAlarmRecord>().lambda()
.ge(PlatAlarmRecord::getAlarmDate, yesStart)
.le(PlatAlarmRecord::getAlarmDate, yesEnd)
.eq(PlatAlarmRecord::getMisinformationFlag,0)
.in(PlatAlarmRecord::getElderIds, StreamUtil.mapId(elderList, PlatElder::getId)));
Map<String, List<PlatAlarmRecord>> recordMap = StreamUtil.groupBy(recordList, PlatAlarmRecord::getElderIds);
for (PlatElder e : elderList) {
PlatElderReportMonth reportMonth = new PlatElderReportMonth();
reportMonth.setElderId(e.getId());
reportMonth.setDay(yesDate);
MapUtil.setIfPresent(sleepAnalysisMap, e.getId(), sa -> {
reportMonth.setSleepResult(sa.getSleepResult());
});
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(e.getId(), null);
if (platDevice == null) {
continue;
}
List<DeviceInfoContentBreathe> breatheList = iotProductDeviceService.getDeviceLogByTimeRangeBreathe(platDevice.getOriDeviceId(), 2 * 24 * 3600, yesStart, yesEnd);
if (CollectionUtils.isNotEmpty(breatheList)) {
reportMonth.setBreatheDeviceId(platDevice.getId());
reportMonth.setBreatheOriDeviceId(platDevice.getOriDeviceId());
reportMonth.setHeartRate((int) (StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getHr(), 0L, Long::sum) / breatheList.size()));
reportMonth.setRespiratoryRate((int) (StreamUtil.reduce(breatheList, i -> (long) i.getProperties().getBr(), 0L, Long::sum) / breatheList.size()));
}
List<PlatAlarmRecord> rList = Optional.ofNullable(recordMap.get(e.getId())).orElse(new ArrayList<>(10));
reportMonth.setFailCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.FALL.getValue().equals(i.getAlarmType())));
reportMonth.setHeartExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.HEART.getValue().equals(i.getAlarmType())));
reportMonth.setRespiratoryExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.BREATHE.getValue().equals(i.getAlarmType())));
reportMonth.setBehaviorExceptionCount((int) StreamUtil.count(rList, i -> PlatAlarmConfigEnum.AlarmTypeEnum.BEHAVIOR.getValue().equals(i.getAlarmType())));
reportMonth.setTenantId(e.getTenantId());
reportMonthList.add(reportMonth);
}
saveBatch(reportMonthList);
}
}
......@@ -11,10 +11,9 @@ import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.saas.analysis.*;
import com.makeit.enums.report.BreatheTypeEnum;
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.HeartRateTypeEnum;
import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.mapper.platform.elder.PlatElderSleepMapper;
import com.makeit.module.iot.service.IotProductDeviceService;
......@@ -36,8 +35,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
......@@ -56,7 +53,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public static final String DATE_FORMATTER = "yyyy-MM-dd HH:mm";
@Autowired
private SaasSleepAnalysisModelService saasSleepAnalysisModelService;
@Autowired
......@@ -68,10 +64,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired
private SaasDiseaseModelService saasDiseaseModelService;
@Autowired
private SaasDiseaseEvaluateReportService saasDiseaseEvaluateReportService;
@Autowired
private SaasDiseaseReportService saasDiseaseReportService;
@Autowired
private IotProductDeviceService productDeviceService;
@Autowired
private PlatRoomBedDeviceService roomBedDeviceService;
......@@ -87,10 +79,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
private PlatElderSleepService platElderSleepService;
@Autowired
private PlatElderBreatheAbnormalService platElderBreatheAbnormalService;
@Autowired
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Autowired
private PlatElderReportMonthService platElderReportMonthService;
@Override
......@@ -111,9 +99,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
List<PlatRoomBedDevice> platRoomBedDeviceList = roomBedDeviceService.list(new QueryWrapper<PlatRoomBedDevice>()
.lambda().isNotNull(PlatRoomBedDevice::getBedId));
SaasDiseaseModel saasDiseaseModel = saasDiseaseModelService.getOne(new QueryWrapper<SaasDiseaseModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
Integer actionThreshold = Integer.valueOf(analysisModel.getActionThreshold());
int turnedThreshold = Integer.parseInt(analysisModel.getTurnedThreshold());
......@@ -133,15 +118,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin());
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax());
// 呼吸率
int breatheThresholdMin = Integer.parseInt(analysisModel.getBreatheThresholdMin());
int breatheThresholdMax = Integer.parseInt(analysisModel.getBreatheThresholdMax());
int breatheDuration = Integer.parseInt(analysisModel.getBreatheDuration());
// 心率
int heartThresholdMin = Integer.parseInt(analysisModel.getHeartThresholdMin());
int heartThresholdMax = Integer.parseInt(analysisModel.getHeartThresholdMax());
int heartDuration = Integer.parseInt(analysisModel.getHeartDuration());
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
......@@ -161,8 +137,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue;
}
String tenantId = elder.getTenantId();
String reportStartTime = "";
String reportEndTime = "";
for (String hourRange : dayHourRangeList) {
String[] hourRangeArray = hourRange.split("~");
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]);
......@@ -184,54 +159,20 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
Map<String, AnalysisVO> statisticsMap = Maps.newHashMap();
List<DeviceInfoContentBreathe> deviceInfoContentBreathes;
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
if (StringUtils.isEmpty(reportStartTime)) {
reportStartTime = entry.getKey();
}
reportEndTime = entry.getKey();
deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties;
Integer bodymove;
// 记录总呼吸率和总心率
int totalBr = 0;
int maxBr = 0;
int minBr = 0;
int maxHr = 0;
int minHr = 0;
int totalHr = 0;
int hrBrCount = 0; // 呼吸率心率统计次数
// 呼吸暂停
int brStopCount = 0;
int brStopSecond = 0;
String brStopTime = "";
// 呼吸过速
int brFastCount = 0;
int brFastSecond = 0;
int brFast = 0;
String brFastTime = "";
// 呼吸过缓
int brSlowCount = 0;
int brSlowSecond = 0;
int brSlow = 0;
String brSlowTime = "";
// 心率过速
int hrFastCount = 0;
int hrFast = 0;
int hrFastSecond = 0;
String hrFastTime = "";
// 心率过缓
int hrSlowCount = 0;
int hrSlowSecond = 0;
int hrSlow = 0;
String hrSlowTime = "";
int totalBr = 0;
int totalHr = 0;
Integer bodymoveCount = 0; // 体动次数
Integer turnoverCount = 0; // 翻身次数
......@@ -273,83 +214,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
isMoveBed = false;
}
// 判断呼吸暂停
if (br == 0) {
brStopSecond++;
brStopTime = entry.getKey();
if (brStopSecond == breatheDuration) {
brStopCount++;
brStopSecond = 0;
}
} else {
brStopSecond = 0;
}
// 判断呼吸率阈值,记录发生时间和当前呼吸率
if (breatheThresholdMax < br) {
if (StringUtils.isEmpty(brFastTime)) {
brFastTime = entry.getKey();
}
if (brFast == 0) {
brFast = br;
}
brFastSecond++;
if (brFastSecond == breatheDuration) {
brFastCount++;
brFastSecond = 0;
}
} else {
brFastSecond = 0;
}
if (br < breatheThresholdMin) {
if (StringUtils.isEmpty(brSlowTime)) {
brSlowTime = entry.getKey();
}
if (brSlow == 0) {
brSlow = br;
}
brSlowSecond++;
if (brSlowSecond == breatheDuration) {
brSlowCount++;
brSlowSecond = 0;
}
} else {
brSlowSecond = 0;
}
if (heartThresholdMax < hr) {
if (StringUtils.isEmpty(hrFastTime)) {
hrFastTime = entry.getKey();
}
if (hrFast == 0) {
hrFast = br;
}
hrFastSecond++;
if(hrFastSecond == heartDuration) {
hrFastCount++;
hrFastSecond = 0;
}
} else {
hrFastSecond = 0;
}
if (heartThresholdMin > hr) {
if (StringUtils.isEmpty(hrSlowTime)) {
hrSlowTime = entry.getKey();
}
if (hrSlow == 0) {
hrSlow = br;
}
hrSlowSecond++;
if (hrSlowSecond == heartDuration) {
hrSlowCount++;
hrSlowSecond = 0;
}
} else {
hrSlowSecond = 0;
}
if (br > maxBr) {
maxBr = br;
......@@ -364,48 +228,23 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (hr < minHr) {
minHr = hr;
}
if (breatheProperties.getPerson() == 1) {
totalBr += br;
totalHr += hr;
hrBrCount++;
}
}
/* int brStopThreshold = brStopCount / breatheDuration;
int brFastThreshold = brFastCount / breatheDuration;
int brSlowThreshold = brSlowCount / breatheDuration;
int hrFastThreshold = hrFastCount / heartDuration;
int hrSlowThreshold = hrSlowCount / heartDuration;
*/
analysisVO.setBrStopThreshold(brStopCount);
analysisVO.setBrFastThreshold(brFastCount);
analysisVO.setBrSlowThreshold(brSlowCount);
analysisVO.setHrFastThreshold(hrFastCount);
analysisVO.setHrSlowThreshold(hrSlowCount);
analysisVO.setBrStopTime(brStopTime);
analysisVO.setBrFastTime(brFastTime);
analysisVO.setBrSlowTime(brSlowTime);
analysisVO.setHrFastTime(hrFastTime);
analysisVO.setHrSlowTime(hrSlowTime);
analysisVO.setBrSlow(brSlow);
analysisVO.setBrFast(brFast);
analysisVO.setHrFast(hrFast);
analysisVO.setHrSlow(hrSlow);
analysisVO.setTotalBr(totalBr);
analysisVO.setAvgBr(totalBr / 60);
analysisVO.setMaxBr(maxBr);
analysisVO.setMinBr(minBr);
analysisVO.setTotalHr(totalHr);
analysisVO.setAvgHr(totalHr / 60);
analysisVO.setMaxBr(maxBr);
analysisVO.setMinBr(minBr);
analysisVO.setMaxHr(maxHr);
analysisVO.setMinHr(minHr);
analysisVO.setHrBrCount(hrBrCount);
analysisVO.setActionCount(bodymoveCount);
analysisVO.setTurnedCount(turnoverCount);
......@@ -425,203 +264,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
continue;
}
// 呼吸暂停
int apneaTime = Integer.parseInt(saasDiseaseModel.getApneaTime());
int apneaThreshold = Integer.parseInt(saasDiseaseModel.getApneaThreshold());
BigDecimal apneaRate = new BigDecimal(apneaTime).divide(new BigDecimal(apneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过速
int tachypneaTime = Integer.parseInt(saasDiseaseModel.getTachypneaTime());
int tachypneaThreshold = Integer.parseInt(saasDiseaseModel.getTachypneaThreshold());
BigDecimal tachypneaRate = new BigDecimal(tachypneaTime).divide(new BigDecimal(tachypneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过缓
int bradypneaTime = Integer.parseInt(saasDiseaseModel.getBradypneaTime());
int bradypneaThreshold = Integer.parseInt(saasDiseaseModel.getBradypneaThreshold());
BigDecimal bradypneaRate = new BigDecimal(bradypneaTime).divide(new BigDecimal(bradypneaThreshold), 2, RoundingMode.HALF_UP);
// 心率过缓
int bradycardiaTime = Integer.parseInt(saasDiseaseModel.getBradycardiaTime());
int bradycardiaThreshold = Integer.parseInt(saasDiseaseModel.getBradycardiaThreshold());
BigDecimal bradycardiaRate = new BigDecimal(bradycardiaTime).divide(new BigDecimal(bradycardiaThreshold), 2, RoundingMode.HALF_UP);
// 心率过速
int tachycardiaTime = Integer.parseInt(saasDiseaseModel.getTachycardiaTime());
int tachycardiaComparison = Integer.parseInt(saasDiseaseModel.getTachycardiaThreshold());
BigDecimal tachycardiaRate = new BigDecimal(tachycardiaTime).divide(new BigDecimal(tachycardiaComparison), 2, RoundingMode.HALF_UP);
// 呼吸疾病报告
int brStopCount = 0;
int brFastCount = 0;
int brSlowCount = 0;
int hrFastCount = 0;
int hrSlowCount = 0;
int dayTotalHr = 0;
int dayTotalBr = 0;
int dayBrHrCount = 0;
// 计算异常的信息,并且统计异常的次数
List<BreatheAbnormalVO> breatheAbnormalVOList = Lists.newArrayList();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
BreatheAbnormalVO breatheAbnormalVO = new BreatheAbnormalVO();
AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getBrStopThreshold() > 0) {
brStopCount += analysisVO.getBrStopThreshold();
breatheAbnormalVO.setType(BreatheTypeEnum.APNEA.getCode());
breatheAbnormalVO.setHappenTime(LocalDateTime.parse(analysisVO.getBrStopTime(), DEFAULT_FORMATTER));
breatheAbnormalVO.setValue("0");
breatheAbnormalVOList.add(breatheAbnormalVO);
}
if (analysisVO.getBrSlowThreshold() > 0) {
brSlowCount += analysisVO.getBrSlowThreshold();
breatheAbnormalVO.setType(BreatheTypeEnum.BRADYPNEA.getCode());
breatheAbnormalVO.setHappenTime(LocalDateTime.parse(analysisVO.getBrSlowTime(), DEFAULT_FORMATTER));
breatheAbnormalVO.setValue(String.valueOf(analysisVO.getBrSlow()));
breatheAbnormalVOList.add(breatheAbnormalVO);
}
if (analysisVO.getBrFastThreshold() > 0) {
brFastCount += analysisVO.getBrFastThreshold();
breatheAbnormalVO.setType(BreatheTypeEnum.TACHYPNEA.getCode());
breatheAbnormalVO.setHappenTime(LocalDateTime.parse(analysisVO.getBrFastTime(), DEFAULT_FORMATTER));
breatheAbnormalVO.setValue(String.valueOf(analysisVO.getBrFast()));
breatheAbnormalVOList.add(breatheAbnormalVO);
}
if (analysisVO.getHrFastThreshold() > 0) {
hrFastCount += analysisVO.getHrFastThreshold();
breatheAbnormalVO.setType(HeartRateTypeEnum.TACHYCARDIA.getCode());
breatheAbnormalVO.setHappenTime(LocalDateTime.parse(analysisVO.getHrFastTime(), DEFAULT_FORMATTER));
breatheAbnormalVO.setValue(String.valueOf(analysisVO.getHrFast()));
breatheAbnormalVOList.add(breatheAbnormalVO);
}
if (analysisVO.getHrSlowThreshold() > 0) {
hrSlowCount += analysisVO.getHrSlowThreshold();
breatheAbnormalVO.setType(HeartRateTypeEnum.BRADYCARDIA.getCode());
breatheAbnormalVO.setHappenTime(LocalDateTime.parse(analysisVO.getHrSlowTime(), DEFAULT_FORMATTER));
breatheAbnormalVO.setValue(String.valueOf(analysisVO.getHrSlow()));
breatheAbnormalVOList.add(breatheAbnormalVO);
}
dayTotalHr += analysisVO.getTotalHr();
dayTotalBr += analysisVO.getTotalBr();
dayBrHrCount += analysisVO.getHrBrCount();
}
int timeHourRange = 24;
if (StringUtils.isNotEmpty(reportStartTime) && StringUtils.isNotEmpty(reportEndTime)) {
Long durationRange = getDurationRange(reportStartTime, reportEndTime);
timeHourRange = (int) (durationRange / 60);
}
// 判断是否满足配置的呼吸心率异常类型
BigDecimal dayBrStopRate = brStopCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brStopCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrSlowRate = brSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brSlowCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrFastRate = brFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrFastRate = hrFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrSlowRate = hrSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrSlowCount), 2, RoundingMode.HALF_UP);
boolean brStopFlag = false;
boolean brFastFlag = false;
boolean brSlowFlag = false;
boolean hrFastFlag = false;
boolean hrSlowFlag = false;
boolean normalFlag;
if (apneaRate.compareTo(dayBrStopRate) > 0) {
brStopFlag = true;
}
if (tachypneaRate.compareTo(dayBrFastRate) > 0) {
brFastFlag = true;
}
if (bradypneaRate.compareTo(dayBrSlowRate) > 0) {
brSlowFlag = true;
}
if (tachycardiaRate.compareTo(dayHrFastRate) > 0) {
hrFastFlag = true;
}
if (bradycardiaRate.compareTo(dayHrSlowRate) > 0) {
hrSlowFlag = true;
}
normalFlag = !(hrFastFlag || brStopFlag || brFastFlag || brSlowFlag || hrSlowFlag);
SaasDiseaseEvaluateReport saasDiseaseEvaluateReport = saasDiseaseEvaluateReportService.getOne(new QueryWrapper<SaasDiseaseEvaluateReport>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
String resultContent = saasDiseaseEvaluateReport.getResultContent();
List<DiseaseReportVO> evaluateReportList = JSON.parseArray(resultContent, DiseaseReportVO.class);
DiseaseReportVO finalReport = new DiseaseReportVO();
// 根据疾病标准配置的规则判断满足哪个区间范围
for (DiseaseReportVO diseaseReportVO : evaluateReportList) {
List<DiseaseReportVO.Condition> conditionList = diseaseReportVO.getCondition();
boolean conditionFlag = true;
for (DiseaseReportVO.Condition condition : conditionList) {
String resultRelational = condition.getResultRelational();
String resultCondition = condition.getResultCondition();
if ("or".equals(resultCondition)) {
if (conditionFlag) {
break;
}
} else {
if (resultRelational.equals("normal")) {
conditionFlag = normalFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.APNEA.getCode())) {
conditionFlag = brStopFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.TACHYPNEA.getCode())) {
conditionFlag = brFastFlag && conditionFlag;
}
if (resultRelational.equals(BreatheTypeEnum.BRADYPNEA.getCode())) {
conditionFlag = brSlowFlag && conditionFlag;
}
if (resultRelational.equals(HeartRateTypeEnum.TACHYCARDIA.getCode())) {
conditionFlag = hrFastFlag && conditionFlag;
}
if (resultRelational.equals(HeartRateTypeEnum.BRADYCARDIA.getCode())) {
conditionFlag = hrSlowFlag && conditionFlag;
}
}
}
if (conditionFlag) {
finalReport = diseaseReportVO;
}
}
EvaluateReportVO diseaseReport = saasDiseaseReportService.getByScore(Long.parseLong(finalReport.getScore()));
// 插入呼吸分析表
PlatElderBreatheAnalysis platElderBreatheAnalysis = new PlatElderBreatheAnalysis();
platElderBreatheAnalysis.setElderId(elder.getId());
platElderBreatheAnalysis.setAvgBreatheRate(String.valueOf(dayTotalBr / (timeHourRange * dayBrHrCount)));
platElderBreatheAnalysis.setAvgHeartRate(String.valueOf(dayTotalHr / (timeHourRange * dayBrHrCount)));
platElderBreatheAnalysis.setBreatheScore(finalReport.getScore());
platElderBreatheAnalysis.setHappenDate(currentDate);
platElderBreatheAnalysis.setTenantId(tenantId);
platElderBreatheAnalysis.setBreatheEvaluate(diseaseReport == null ? "" : diseaseReport.getEvaluate());
platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
// 记录长者呼吸心率的异常事件
List<PlatElderBreatheAbnormal> platElderBreatheAbnormalList = Lists.newArrayList();
PlatElderBreatheAbnormal platElderBreatheAbnormal;
for (BreatheAbnormalVO breatheAbnormalVO : breatheAbnormalVOList) {
platElderBreatheAbnormal = new PlatElderBreatheAbnormal();
platElderBreatheAbnormal.setElderId(elder.getId());
platElderBreatheAbnormal.setBreatheAnalysisId(platElderBreatheAnalysis.getId());
platElderBreatheAbnormal.setType(breatheAbnormalVO.getType());
platElderBreatheAbnormal.setHappenTime(breatheAbnormalVO.getHappenTime());
platElderBreatheAbnormal.setValue(breatheAbnormalVO.getValue());
platElderBreatheAbnormal.setTenantId(tenantId);
platElderBreatheAbnormalList.add(platElderBreatheAbnormal);
}
platElderBreatheAbnormalService.saveBatch(platElderBreatheAbnormalList);
int totalActionCount = 0;
int totalTurnedCount = 0;
......@@ -663,16 +305,16 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
if (entry.getKey().equals(timeAnalysisVO.getStartTime())) {
startTimeFlag = true;
sleepTotalMap.put(entry.getKey(),entry.getValue());
sleepTotalMap.put(entry.getKey(), entry.getValue());
}
if (entry.getKey().equals(timeAnalysisVO.getEndTime())) {
sleepTotalMap.put(entry.getKey(),entry.getValue());
sleepTotalMap.put(entry.getKey(), entry.getValue());
startTimeFlag = false;
}
if (startTimeFlag) {
sleepTotalMap.put(entry.getKey(),entry.getValue());
sleepTotalMap.put(entry.getKey(), entry.getValue());
}
sleepTypeMap.put(timeAnalysisVO.getType(),sleepTotalMap);
sleepTypeMap.put(timeAnalysisVO.getType(), sleepTotalMap);
}
}
......@@ -740,7 +382,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (analysisVO.getActionCount() == sleepDeepActionThreshold && analysisVO.getTurnedCount() == sleepDeepActionThreshold
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = entry.getKey();
startSleepDeepTime = voEntry.getKey();
}
sleepDeepMinute++;
continue;
......@@ -751,7 +393,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (sleepDeepMinute > sleepDeepActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
......@@ -771,7 +413,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
AnalysisVO analysisVO = voEntry.getValue();
if (analysisVO.getActionCount() < sleepModerateActionThreshold && analysisVO.getTurnedCount() < sleepModerateActionThreshold) {
if (StringUtils.isEmpty(startSleepMidTime)) {
startSleepMidTime = entry.getKey();
startSleepMidTime = voEntry.getKey();
}
sleepMidMinute++;
continue;
......@@ -782,7 +424,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
if (sleepMidMinute > sleepModerateActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepMidTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
......@@ -800,7 +442,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
AnalysisVO analysisVO = voEntry.getValue();
if (analysisVO.getAwakeMinuteActionFlag()) {
if (StringUtils.isEmpty(startAwakeTime)) {
startAwakeTime = entry.getKey();
startAwakeTime = voEntry.getKey();
}
awakeMinute++;
continue;
......@@ -810,7 +452,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
}
sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startAwakeTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startAwakeTime = null;
......@@ -827,8 +469,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList(); // 记录多端睡眠记录
SleepTimeAnalysisVO sleepTimeAnalysis;
String elderSleepTime = ""; // 长者睡觉时间
String elderGetupTime = ""; // 长者起床时间
for (int i = 0; i < sleepList.size(); i++) {
sleepTimeAnalysis = new SleepTimeAnalysisVO();
List<SleepTimeAnalysisVO> deepList = Lists.newArrayList();
......@@ -836,18 +477,13 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
List<SleepTimeAnalysisVO> lightList = Lists.newArrayList();
List<SleepTimeAnalysisVO> soberList = Lists.newArrayList();
SleepTimeAnalysisVO timeAnalysisVO = sleepList.get(i);
if (i == 0) {
elderSleepTime = timeAnalysisVO.getStartTime();
}
if (i == sleepList.size() - 1) {
elderGetupTime = timeAnalysisVO.getEndTime();
}
BeanUtils.copyProperties(timeAnalysisVO,sleepTimeAnalysis);
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 startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
boolean lightSleepFlag = true; // 如果不满足下面条件,就默认都是浅睡
for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
......@@ -983,7 +619,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
long hour = deepTime / 60;
SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && Objects.equals(hour,configHour)) {
if (i == 0 && Objects.equals(hour, configHour)) {
deepScore = Long.parseLong(sleepConfigVO.getScore());
}
if (i > 0 && hour > configHour) {
......@@ -1018,7 +654,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
long hour = sleepTime / 60;
SleepConfigVO sleepConfigVO = sleepTimeConfigList.get(i);
long configHour = Long.parseLong(sleepConfigVO.getHour());
if (i == 0 && Objects.equals(hour,configHour)) {
if (i == 0 && Objects.equals(hour, configHour)) {
sleepScore = Long.parseLong(sleepConfigVO.getScore());
}
if (i > 0 && hour > configHour) {
......@@ -1071,10 +707,10 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
public Long getDurationRange(String startTime, String endTime) {
LocalDateTime target = LocalDateTime.parse(startTime,DEFAULT_FORMATTER);
LocalDateTime target = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期
// LocalDate today = LocalDate.now();
LocalDateTime source = LocalDateTime.parse(endTime,DEFAULT_FORMATTER);
LocalDateTime source = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
return Duration.between(target, source).toMinutes();
}
......@@ -1141,8 +777,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
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);
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);
......@@ -1209,12 +845,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
//platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
}
}
}
package com.makeit.task;
import com.makeit.service.platform.elder.PlatElderDayReportWeekService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class HeartRespiratoryTask {
@Autowired
private PlatElderDayReportWeekService platElderDayReportWeekService;
@Scheduled(cron = "0 0 2 * * ? ")
public void job(){
platElderDayReportWeekService.heartRespiratoryJob();
}
}
package com.makeit.task;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderSleepService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
......@@ -15,9 +13,6 @@ public class IotSyncTask {
@Autowired
private PlatDeviceService platDeviceService;
@Autowired
private PlatElderSleepService platElderSleepService;
/**
* 一小时同步一次
......@@ -30,30 +25,4 @@ public class IotSyncTask {
}
/**
* 床位id 绑定的所有设备
* 房间id 绑定的所有设备
*
*/
/**
* 长者睡眠分析
*/
@Scheduled(cron = "0 0 1 * * ?")
@TenantIdIgnore
public void elderSleepSleepAnalysisTask() {
log.info("开始定时分析长者睡眠质量");
platElderSleepService.elderSleepSleepAnalysisTask();
log.info("定时分析长者睡眠质量结束");
}
/* @Scheduled(cron = "0 0 1 * * ?")
@TenantIdIgnore
public void elderCoordinateListAnalysisTask() {
log.info("开始定时分析24小时热力图");
platElderDayReportDayService.elderCoordinateListAnalysisTask();
log.info("定时分析长者24小时热力图");
}*/
}
package com.makeit.task;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.elder.PlatElderBreatheAnalysisService;
import com.makeit.service.platform.elder.PlatElderBreatheDayStatService;
import com.makeit.service.platform.elder.PlatElderSleepService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class PlatElderReportTask {
@Autowired
private PlatElderSleepService platElderSleepService;
@Autowired
private PlatElderBreatheDayStatService platElderBreatheDayStatService;
@Autowired
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Scheduled(cron = "0 0 1 * * ?")
@TenantIdIgnore
public void heartRespiratoryTask() {
log.info("开始生成长者每日呼吸,异常情况");
platElderBreatheDayStatService.heartRespiratoryTask();
log.info("生成长者每日呼吸,异常情况结束");
}
/**
* 长者呼吸心率分析
*/
@Scheduled(cron = "0 0 2 * * ?")
@TenantIdIgnore
public void elderHeartRespiratoryAnalysisTask() {
log.info("开始定时分析长者呼吸心率");
platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask();
log.info("定时分析长者呼吸心率结束");
}
/**
* 长者睡眠分析
*/
@Scheduled(cron = "0 0 3 * * ?")
@TenantIdIgnore
public void elderSleepSleepAnalysisTask() {
log.info("开始定时分析长者睡眠质量");
platElderSleepService.elderSleepSleepAnalysisTask();
log.info("定时分析长者睡眠质量结束");
}
}
package com.makeit.task;
import com.makeit.service.platform.elder.PlatElderReportMonthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ReportMonthTask {
@Autowired
private PlatElderReportMonthService platElderReportMonthService;
@Scheduled(cron = "0 0 2 * * ? ")
public void job(){
platElderReportMonthService.reportMonthJob();
}
}
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