Commit d6fa5969 by 罗志长

Merge branch 'dev'

# Conflicts:
#	server-service/src/main/java/com/makeit/service/platform/elder/impl/PlatElderSleepServiceImpl.java
parents 16949764 95e46f36
Showing with 1355 additions and 834 deletions
ALTER TABLE `plat_device_other` ALTER TABLE `plat_device_other`
...@@ -121,4 +121,8 @@ ALTER TABLE `plat_alarm_record` ...@@ -121,4 +121,8 @@ ALTER TABLE `plat_alarm_record`
alter table plat_elder_sleep_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id'; alter table plat_elder_sleep_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id';
alter table plat_elder_breathe_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id'; alter table plat_elder_breathe_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id';
\ No newline at end of file
alter table plat_elder_children_info add column weChat_openid varchar(64) default null comment '公众号openid';
alter table plat_tenant add column report_org_ids varchar(255) default null comment '主动上报机构ids';
\ No newline at end of file
package com.makeit.global.inteceptor; package com.makeit.global.inteceptor;
import cn.hutool.core.util.StrUtil;
import com.makeit.enums.Const;
import com.makeit.enums.order.InterceptorOrderConst; import com.makeit.enums.order.InterceptorOrderConst;
import com.makeit.global.annotation.AuthIgnore; import com.makeit.global.annotation.AuthIgnore;
import com.makeit.utils.user.TokenUtil; import com.makeit.utils.user.TokenUtil;
...@@ -31,6 +33,11 @@ public class WechatAuthenticationInterceptor implements HandlerInterceptor { ...@@ -31,6 +33,11 @@ public class WechatAuthenticationInterceptor implements HandlerInterceptor {
return true; return true;
} }
// 子女端小程序存在无需要登录状态
if (StrUtil.isBlank(request.getHeader("Token")) && StrUtil.isBlank(request.getHeader(Const.TENANT_ID))) {
return true;
}
TokenUtil.wechatGetToken(); TokenUtil.wechatGetToken();
TokenUtil.wechatRefreshToken(); TokenUtil.wechatRefreshToken();
return true; return true;
......
package com.makeit.module.iot.vo.analysis;
import lombok.Data;
import java.util.TreeMap;
/**
* @author wangzy
* @description
* @createDate 2024-01-04-16:18
*/
@Data
public class SleepCountDTO {
private Integer totalActionCount;
private Integer totalTurnedCount;
private TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap;
private TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap;
}
...@@ -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 {
/**
* 睡眠:入睡时间>3小时
*/
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;
/**
* 入睡
*/
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;
}
...@@ -21,6 +21,7 @@ public enum SendTypeEnum implements BaseEnum { ...@@ -21,6 +21,7 @@ public enum SendTypeEnum implements BaseEnum {
private String code; private String code;
@Override
public String getValue() { public String getValue() {
return SysDictUtil.getValue(code); return SysDictUtil.getValue(code);
} }
......
package com.makeit.utils.msg.dto; package com.makeit.utils.msg.dto;
import com.makeit.utils.msg.SendTypeEnum; import com.makeit.utils.msg.SendTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.Collection; import java.util.Collection;
import java.util.List;
@Data @Data
@Builder @Builder
...@@ -18,6 +20,9 @@ public class MsgSendDTO { ...@@ -18,6 +20,9 @@ public class MsgSendDTO {
private String subject; private String subject;
/**
* 手机号
*/
private Collection<String> receiverList; private Collection<String> receiverList;
private Collection<String> emailSet; private Collection<String> emailSet;
...@@ -35,5 +40,21 @@ public class MsgSendDTO { ...@@ -35,5 +40,21 @@ public class MsgSendDTO {
private String alarmType; private String alarmType;
private List<ReceiverInfo> receiverInfos;
@Data
public static class ReceiverInfo {
@ApiModelProperty("通知者openId")
private String weChatOpenid;
@ApiModelProperty("长者名称")
private String name;
@ApiModelProperty("区域名称")
private String regionName;
}
} }
package com.makeit.utils.msg.sender; package com.makeit.utils.msg.sender;
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.makeit.utils.msg.SendTypeEnum; import com.makeit.utils.msg.SendTypeEnum;
import com.makeit.utils.msg.dto.MsgSendDTO; import com.makeit.utils.msg.dto.MsgSendDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -24,6 +26,8 @@ public class WxSpSender implements IMsgSender{ ...@@ -24,6 +26,8 @@ public class WxSpSender implements IMsgSender{
@Autowired @Autowired
private WxMpService wxMpService; private WxMpService wxMpService;
private final SendTypeEnum sendTypeEnum = SendTypeEnum.CHILD_WECHAT;
/** /**
* 小程序公众号消息 * 小程序公众号消息
* zn5fBS9cqjnN5UB78tAbm53M3dXufR2b5K1a8mkhXCY * zn5fBS9cqjnN5UB78tAbm53M3dXufR2b5K1a8mkhXCY
...@@ -39,33 +43,49 @@ public class WxSpSender implements IMsgSender{ ...@@ -39,33 +43,49 @@ public class WxSpSender implements IMsgSender{
@Override @Override
public void send(MsgSendDTO msgDTO) { public void send(MsgSendDTO msgDTO) {
List<MsgSendDTO.ReceiverInfo> receiverInfos = msgDTO.getReceiverInfos();
if (CollUtil.isNotEmpty(receiverInfos)) {
return;
}
String content = msgDTO.getOriContent();
receiverInfos.forEach(r -> {
if(StrUtil.isBlank(r.getWeChatOpenid())){
return;
}
sentMsg(content,r.getRegionName(),r.getName(),r.getWeChatOpenid());
});
}
/**
*
* @param content 报警内容
* @param place 地点
* @param name 长者姓名
* @param openId 接收人openId
*/
private void sentMsg(String content, String place, String name, String openId) {
List<WxMpTemplateData> mpData = Arrays.asList( List<WxMpTemplateData> mpData = Arrays.asList(
new WxMpTemplateData("thing8", "报警内容"), new WxMpTemplateData("thing8", content),
new WxMpTemplateData("thing4", "固定值"), new WxMpTemplateData("thing4", place),
new WxMpTemplateData("thing2", "老人姓名"), new WxMpTemplateData("thing2", name),
new WxMpTemplateData("time3", DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")) new WxMpTemplateData("time3", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))
); );
try { try {
//oBmPb5o9T3q-EMsxfhPg_9OjO5k4 lixl公众号openid // String testOpenId = "oM2OI67H11zTZL88X99PxL6rAS3Y";
//oM2OI67H11zTZL88X99PxL6rAS3Y WxMpTemplateMessage wxMpTemplateMessage = WxMpTemplateMessage.builder().toUser(openId)
//WxMpUser wxMpUser = wxMpService.getUserService().userInfo("oM2OI6zZQBB-kL6_0kaMM6adVb1E");
//oM2OI6zZQBB-kL6_0kaMM6adVb1E 小程序openId
// WxMpUserList wxMpUserList = wxMpService.getUserService().userList();
//WxMpUser wxMpUser = wxMpService.getUserService().userInfo("oM2OI67H11zTZL88X99PxL6rAS3Y");
WxMpTemplateMessage wxMpTemplateMessage = WxMpTemplateMessage.builder().toUser("oM2OI67H11zTZL88X99PxL6rAS3Y")
.templateId("zn5fBS9cqjnN5UB78tAbm53M3dXufR2b5K1a8mkhXCY") .templateId("zn5fBS9cqjnN5UB78tAbm53M3dXufR2b5K1a8mkhXCY")
.data(mpData) .data(mpData)
.build(); .build();
wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage); wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);
log.info("发送小程序消息成功"); log.info("发送小程序消息成功");
} catch (WxErrorException e) { } catch (WxErrorException e) {
log.error("发送小程序消息失败:",e); log.error("发送小程序消息失败:", e);
} }
} }
@Override @Override
public boolean support(SendTypeEnum sendTypeEnum) { public boolean support(SendTypeEnum param) {
return false; return sendTypeEnum == param;
} }
......
...@@ -40,5 +40,8 @@ public class WechatLoginPhoneDTO { ...@@ -40,5 +40,8 @@ public class WechatLoginPhoneDTO {
@ApiModelProperty(value = "微信secret") @ApiModelProperty(value = "微信secret")
private String secret; private String secret;
@ApiModelProperty(value = "微信公众号openid")
private String weChatOpenid;
} }
...@@ -3,7 +3,6 @@ package com.makeit.utils.third.wechat; ...@@ -3,7 +3,6 @@ package com.makeit.utils.third.wechat;
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.makeit.config.WxMaConfiguration; import com.makeit.config.WxMaConfiguration;
import com.makeit.enums.CodeMessageEnum; import com.makeit.enums.CodeMessageEnum;
......
...@@ -2,10 +2,10 @@ package com.makeit.utils.user.wechat; ...@@ -2,10 +2,10 @@ package com.makeit.utils.user.wechat;
import com.makeit.enums.redis.RedisConst; import com.makeit.enums.redis.RedisConst;
import com.makeit.exception.BusinessException;
import com.makeit.utils.data.convert.BeanDtoVoUtils; import com.makeit.utils.data.convert.BeanDtoVoUtils;
import com.makeit.utils.user.ThreadLocalUserUtil; import com.makeit.utils.user.ThreadLocalUserUtil;
import com.makeit.utils.user.TokenUtil; import com.makeit.utils.user.TokenUtil;
import org.apache.poi.ss.formula.functions.T;
public class WechatUserUtil { public class WechatUserUtil {
...@@ -25,6 +25,12 @@ public class WechatUserUtil { ...@@ -25,6 +25,12 @@ public class WechatUserUtil {
} }
public static String getUserId() { public static String getUserId() {
return getUserVO().getId(); String userId = "";
try {
userId = getUserVO().getId();
} catch (BusinessException e) {
e.printStackTrace();
}
return userId;
} }
} }
...@@ -4,12 +4,10 @@ package com.makeit.module.controller.children.elder; ...@@ -4,12 +4,10 @@ package com.makeit.module.controller.children.elder;
import com.makeit.common.response.ApiResponseEntity; import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils; import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.elder.PlatElderIdDTO; import com.makeit.dto.platform.elder.PlatElderIdDTO;
import com.makeit.dto.platform.elder.PlatElderQueryDTO;
import com.makeit.dto.platform.elder.children.PlatElderChildrenInfoWechatDTOVO; import com.makeit.dto.platform.elder.children.PlatElderChildrenInfoWechatDTOVO;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo; import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.elder.PlatElderChildrenInfoService; import com.makeit.service.platform.elder.PlatElderChildrenInfoService;
import com.makeit.vo.platform.elder.PlatElderListVO;
import com.makeit.vo.wechat.elder.PlatElderChildrenInfoWechatVO; import com.makeit.vo.wechat.elder.PlatElderChildrenInfoWechatVO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
......
...@@ -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;
...@@ -12,6 +13,7 @@ import com.makeit.global.annotation.AuthIgnore; ...@@ -12,6 +13,7 @@ import com.makeit.global.annotation.AuthIgnore;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService; import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.*; import com.makeit.service.platform.elder.*;
import com.makeit.vo.platform.elder.wakeUpAnalysisVO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -50,16 +52,6 @@ public class PlatElderSleepController { ...@@ -50,16 +52,6 @@ public class PlatElderSleepController {
private HuiNengService huiNengService; private HuiNengService huiNengService;
@ApiOperation("测试")
@PostMapping("test1")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> test1() {
platElderSleepService.test1();
return ApiResponseUtils.success();
}
@ApiOperation("测试") @ApiOperation("测试")
@PostMapping("test2") @PostMapping("test2")
@AuthIgnore @AuthIgnore
...@@ -82,14 +74,15 @@ public class PlatElderSleepController { ...@@ -82,14 +74,15 @@ 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));
} }
@ApiOperation("测试") @ApiOperation("测试")
@PostMapping("test5") @PostMapping("test5")
@AuthIgnore @AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> coordinateRecordTask() { public ApiResponseEntity<Void> coordinateRecordTask() {
platElderCoordinateRecordService.coordinateRecordTask(); platElderCoordinateRecordService.coordinateRecordTask();
return ApiResponseUtils.success(); return ApiResponseUtils.success();
...@@ -150,5 +143,14 @@ public class PlatElderSleepController { ...@@ -150,5 +143,14 @@ public class PlatElderSleepController {
huiNengService.bodyAlarm("1712384736845950978","219A04X1856F6D8",jsonObject); huiNengService.bodyAlarm("1712384736845950978","219A04X1856F6D8",jsonObject);
return ApiResponseUtils.success(); return ApiResponseUtils.success();
} }
@ApiOperation("起床测试")
@GetMapping("getup")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<List<wakeUpAnalysisVO>> elderGetUpAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) {
return ApiResponseUtils.success(platElderBreatheAnalysisService.elderGetUpAnalysisTask(month, day));
}
} }
...@@ -2,6 +2,7 @@ package com.makeit.module.controller.wechat.alarm; ...@@ -2,6 +2,7 @@ package com.makeit.module.controller.wechat.alarm;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.makeit.common.dto.BaseIdDTO; import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.page.PageReqDTO; import com.makeit.common.page.PageReqDTO;
...@@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Api(tags = "平台端小程序-告警记录") @Api(tags = "平台端小程序-告警记录")
...@@ -36,6 +38,9 @@ public class PlatAlarmRecordWechatController { ...@@ -36,6 +38,9 @@ public class PlatAlarmRecordWechatController {
public ApiResponseEntity<Map<String,Object>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) { public ApiResponseEntity<Map<String,Object>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
//小程序告警记录只看到发给自己的告警 //小程序告警记录只看到发给自己的告警
String userId = CommonUserUtil.getUserId(); String userId = CommonUserUtil.getUserId();
if(StrUtil.isBlank(userId)){
return ApiResponseUtils.success(new HashMap<>(12));
}
PlatAlarmRecordQueryDTO data = dto.getData(); PlatAlarmRecordQueryDTO data = dto.getData();
data.setNotifyUser(userId); data.setNotifyUser(userId);
......
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;
}
...@@ -54,6 +54,9 @@ public class PlatElderChildrenInfo extends BaseBusEntity { ...@@ -54,6 +54,9 @@ public class PlatElderChildrenInfo extends BaseBusEntity {
@ApiModelProperty(value = "微信头像路径") @ApiModelProperty(value = "微信头像路径")
private String avatar; private String avatar;
@ApiModelProperty(value = "微信公众号openid")
@TableField(value = "weChat_openid")
private String weChatOpenid;
......
...@@ -35,10 +35,13 @@ public class PlatElderSleep extends BaseBusEntity { ...@@ -35,10 +35,13 @@ public class PlatElderSleep extends BaseBusEntity {
@ApiModelProperty(value = "入睡时间") @ApiModelProperty(value = "入睡时间")
private LocalDateTime startSleep; private LocalDateTime startSleep;
/**
* 入睡结束时间
*/
@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;
...@@ -50,5 +53,9 @@ public class PlatElderSleep extends BaseBusEntity { ...@@ -50,5 +53,9 @@ public class PlatElderSleep extends BaseBusEntity {
@TableField(typeHandler = ElderListStringJsonTypeHandler.class) @TableField(typeHandler = ElderListStringJsonTypeHandler.class)
private List<PlatSleepRangeVO> sleepRecord; private List<PlatSleepRangeVO> sleepRecord;
@ApiModelProperty(value = "起床时间")
@TableField(exist = false)
private LocalDateTime wakeUpTime;
} }
...@@ -67,6 +67,11 @@ public class PlatTenant extends BaseEntity { ...@@ -67,6 +67,11 @@ public class PlatTenant extends BaseEntity {
private String secret; private String secret;
private String openApiUrl; private String openApiUrl;
/**
* 主动上报组织ids
*/
private String reportOrgIds;
} }
\ No newline at end of file
...@@ -7,16 +7,21 @@ import lombok.Getter; ...@@ -7,16 +7,21 @@ import lombok.Getter;
@Getter @Getter
public enum SleepTypeEnum { public enum SleepTypeEnum {
/**
SLEEP_DEEP("sleepDeep","深度睡眠"), * 睡眠类型 1 睡眠 (入睡时间大于3小时)2 小憩,3:深度睡眠,4:中度睡眠,5:浅度睡眠, 6:清醒,7:起床 8:入睡
SLEEP_MODERATE("sleepModerate","中度睡眠"), */
SLEEP_LIGHTNESS("sleepLightness","浅度睡眠"), SLEEP_DEEP("sleepDeep", "深度睡眠", 3),
SOBER("sober","清醒"), SLEEP_MODERATE("sleepModerate", "中度睡眠", 4),
GETUP("getup","起床"), SLEEP_LIGHTNESS("sleepLightness", "浅度睡眠", 5),
SLEEP("sleep","睡觉"); SOBER("sober", "清醒", 6),
GETUP("getup", "起床", 7),
private String code; SLEEP("sleep", "睡觉", 1),
private String value; RESTING("resting", "小憩", 2),
DAY_SLEEP("day_sleep","睡眠",8);
private final String code;
private final String value;
private final Integer type;
public static SleepTypeEnum getSleepType(String code) { public static SleepTypeEnum getSleepType(String code) {
......
...@@ -99,7 +99,7 @@ public class BreathAlarm implements IAlarm { ...@@ -99,7 +99,7 @@ public class BreathAlarm implements IAlarm {
//呼吸率 //呼吸率
int br = (int) properties.get("br"); int br = (int) properties.get("br");
if (br == 255) { if (br == 255) {
log.info("当前上报呼吸数据255,无上报数据"); // log.info("当前上报呼吸数据255,无上报数据");
RedisUtil.delete(RedisConst.ALARM_DEVICE_BR_ID + deviceId); RedisUtil.delete(RedisConst.ALARM_DEVICE_BR_ID + deviceId);
return; return;
} }
......
...@@ -102,12 +102,14 @@ public class FallAlarm implements IAlarm { ...@@ -102,12 +102,14 @@ public class FallAlarm implements IAlarm {
// 跌倒了设备需要发送告警到第三方平台 // 跌倒了设备需要发送告警到第三方平台
PlatTenant platTenant = platTenantService.getById(platDevice.getTenantId()); PlatTenant platTenant = platTenantService.getById(platDevice.getTenantId());
if (platTenant != null) { if (platTenant != null) {
OpenApiBaseStrategy strategyFactoryHandler = openApiBaseStrategyFactory.getHandler(platTenant.getCode()); if (isSupportAlarm(platTenant, platDevice)) {
if (strategyFactoryHandler != null) { OpenApiBaseStrategy strategyFactoryHandler = openApiBaseStrategyFactory.getHandler(platTenant.getCode());
try { if (strategyFactoryHandler != null) {
strategyFactoryHandler.alarm(platTenant, platDevice.getOriDeviceId(), properties); try {
} catch (Exception e) { strategyFactoryHandler.alarm(platTenant, platDevice.getOriDeviceId(), properties);
log.error("调用openapi告警接口失败:{}", e.getMessage(), e); } catch (Exception e) {
log.error("调用openapi告警接口失败:{}", e.getMessage(), e);
}
} }
} }
} }
...@@ -120,6 +122,15 @@ public class FallAlarm implements IAlarm { ...@@ -120,6 +122,15 @@ public class FallAlarm implements IAlarm {
} }
} }
private boolean isSupportAlarm(PlatTenant platTenant, PlatDevice platDevice) {
String reportOrgIds = platTenant.getReportOrgIds();
if (StringUtils.isBlank(reportOrgIds)) {
return false;
}
List<String> orgIds = Arrays.asList(StringUtils.split(reportOrgIds, ","));
return orgIds.contains(platDevice.getOrgId());
}
private void recordDuration(PlatAlarmCheckDTO platAlarmCheckDTO) { private void recordDuration(PlatAlarmCheckDTO platAlarmCheckDTO) {
PlatDevice platDevice = platAlarmCheckDTO.getPlatDevice(); PlatDevice platDevice = platAlarmCheckDTO.getPlatDevice();
PlatAlarmConfig config = alarmConfigCacheUtil.get(platDevice.getOrgId(), PlatAlarmConfigEnum.AlarmTypeEnum.BEHAVIOR.getValue()); PlatAlarmConfig config = alarmConfigCacheUtil.get(platDevice.getOrgId(), PlatAlarmConfigEnum.AlarmTypeEnum.BEHAVIOR.getValue());
...@@ -177,8 +188,8 @@ public class FallAlarm implements IAlarm { ...@@ -177,8 +188,8 @@ public class FallAlarm implements IAlarm {
long count = endLong - startLong; long count = endLong - startLong;
//进入空间时间满足告警时长,判断是否已经告警过了 //进入空间时间满足告警时长,判断是否已经告警过了
if (duration!= 0 && count / 1000 >= duration && StringUtils.equals(alarmRedisDTO.getAlarm(), CommonEnum.NO.getValue())) { if (duration!= 0 && count / 1000 >= duration && StringUtils.equals(alarmRedisDTO.getAlarm(), CommonEnum.NO.getValue())) {
log.error("空间雷达发出告警,设备plat_id:" + platDevice.getId());
if(duration1 != 0) { if(duration1 != 0) {
log.error("空间雷达发出告警,设备plat_id:" + platDevice.getId());
alarmRedisDTO.setAlarm(CommonEnum.YES.getValue()); alarmRedisDTO.setAlarm(CommonEnum.YES.getValue());
RedisUtil.set(RedisConst.ALARM_DEVICE_BEHAVIOR_ID + deviceId, alarmRedisDTO); RedisUtil.set(RedisConst.ALARM_DEVICE_BEHAVIOR_ID + deviceId, alarmRedisDTO);
PlatAlarmCheckDTO platAlarmCheckDTO_behavior = BeanDtoVoUtils.convert(platAlarmCheckDTO, PlatAlarmCheckDTO.class); PlatAlarmCheckDTO platAlarmCheckDTO_behavior = BeanDtoVoUtils.convert(platAlarmCheckDTO, PlatAlarmCheckDTO.class);
......
...@@ -87,7 +87,7 @@ public class HeartAlarm implements IAlarm { ...@@ -87,7 +87,7 @@ public class HeartAlarm implements IAlarm {
//心率 //心率
int hr = (int) properties.get("hr"); int hr = (int) properties.get("hr");
if (hr == 255) { if (hr == 255) {
log.info("当前上报心率255,无上报数据"); // log.info("当前上报心率255,无上报数据");
RedisUtil.delete(RedisConst.ALARM_DEVICE_HR_ID + deviceId); RedisUtil.delete(RedisConst.ALARM_DEVICE_HR_ID + deviceId);
return; return;
} }
......
package com.makeit.service.platform.alarm.impl; package com.makeit.service.platform.alarm.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
...@@ -167,7 +168,11 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -167,7 +168,11 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
*/ */
@Override @Override
public PageVO<PlatAlarmRecordVO> childrenPage(PageReqDTO<PlatAlarmRecordQueryDTO> dto) { public PageVO<PlatAlarmRecordVO> childrenPage(PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
PlatElderChildrenInfo platElderChildrenInfo = platElderChildrenInfoService.getById(WechatUserUtil.getUserId()); String userId = WechatUserUtil.getUserId();
if (StrUtil.isBlank(userId)) {
return PageVO.emptyPage();
}
PlatElderChildrenInfo platElderChildrenInfo = platElderChildrenInfoService.getById(userId);
List<PlatElderChildrenInfo> platElderChildrenInfoList = getPlatElderChildrenInfosByOpenid(platElderChildrenInfo.getOpenid()); List<PlatElderChildrenInfo> platElderChildrenInfoList = getPlatElderChildrenInfosByOpenid(platElderChildrenInfo.getOpenid());
log.info("子女端账号:{}",JSON.toJSONString(platElderChildrenInfo)); log.info("子女端账号:{}",JSON.toJSONString(platElderChildrenInfo));
if(CollectionUtils.isEmpty(platElderChildrenInfoList)){ if(CollectionUtils.isEmpty(platElderChildrenInfoList)){
...@@ -303,6 +308,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -303,6 +308,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
* @param alarmConfig * @param alarmConfig
* @param alarmRecord * @param alarmRecord
*/ */
@Override
@Transactional @Transactional
@TenantIdIgnore @TenantIdIgnore
public void noticeChildren(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord) { public void noticeChildren(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord) {
...@@ -321,9 +327,9 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -321,9 +327,9 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
Set<String> phoneSet = childrenInfoList.stream().map(PlatElderChildrenInfo::getPhone).collect(Collectors.toSet()); Set<String> phoneSet = childrenInfoList.stream().map(PlatElderChildrenInfo::getPhone).collect(Collectors.toSet());
//告警配置和租户告警 字典一致 //告警配置和租户告警 字典一致
List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS, SendTypeEnum.CHILD_WECHAT); List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS, SendTypeEnum.CHILD_WECHAT);
List<MsgSendDTO.ReceiverInfo> receiverInfos = buildReceiverInfo(allChildInfoList, alarmRecord);
//发送消息 //发送消息
noticeByChannel(alarmConfig, alarmRecord, phoneSet,null, notifyChannelList); noticeByChannel(alarmConfig, alarmRecord, phoneSet,null, notifyChannelList, receiverInfos);
String childIdJoin = allChildInfoList.stream().map(BaseEntity::getId).collect(Collectors.joining(",")); String childIdJoin = allChildInfoList.stream().map(BaseEntity::getId).collect(Collectors.joining(","));
//通知的子女 //通知的子女
...@@ -334,6 +340,21 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -334,6 +340,21 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
} }
private List<MsgSendDTO.ReceiverInfo> buildReceiverInfo(List<PlatElderChildrenInfo> childInfoList, PlatAlarmRecord alarmRecord) {
List<MsgSendDTO.ReceiverInfo> list = new ArrayList<>();
if (CollUtil.isEmpty(childInfoList)) {
return list;
}
childInfoList.forEach(c -> {
MsgSendDTO.ReceiverInfo receiverInfo = new MsgSendDTO.ReceiverInfo();
receiverInfo.setRegionName(alarmRecord.getRegionName());
receiverInfo.setName(c.getName());
receiverInfo.setWeChatOpenid(c.getWeChatOpenid());
});
return list;
}
/** /**
* 通知工作人员 * 通知工作人员
* 短信 * 短信
...@@ -374,7 +395,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -374,7 +395,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
Set<String> phoneSet = platUserList.stream().map(PlatUser::getMobile).collect(Collectors.toSet()); Set<String> phoneSet = platUserList.stream().map(PlatUser::getMobile).collect(Collectors.toSet());
Set<String> emailSet = platUserList.stream().map(PlatUser::getEmail).collect(Collectors.toSet()); Set<String> emailSet = platUserList.stream().map(PlatUser::getEmail).collect(Collectors.toSet());
//发送消息 //发送消息
noticeByChannel(alarmConfig, alarmRecord, phoneSet,emailSet, notifyChannelList); noticeByChannel(alarmConfig, alarmRecord, phoneSet,emailSet, notifyChannelList, null);
String userIdJoin = platUserList.stream().map(PlatUser::getId).collect(Collectors.joining(",")); String userIdJoin = platUserList.stream().map(PlatUser::getId).collect(Collectors.joining(","));
alarmRecord.setNotifyUser(userIdJoin); alarmRecord.setNotifyUser(userIdJoin);
...@@ -391,7 +412,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -391,7 +412,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
* @param phoneSet 工作人员手机号 * @param phoneSet 工作人员手机号
* @param notifyChannelList 通知渠道 * @param notifyChannelList 通知渠道
*/ */
private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet, List<SendTypeEnum> notifyChannelList) { private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet,
List<SendTypeEnum> notifyChannelList, List<MsgSendDTO.ReceiverInfo> receiverInfos) {
log.info("开始短信通知:{}", JSON.toJSONString(alarmConfig)); log.info("开始短信通知:{}", JSON.toJSONString(alarmConfig));
String notifyChannel = alarmConfig.getNotifyChannel(); String notifyChannel = alarmConfig.getNotifyChannel();
if(StringUtils.isEmpty(notifyChannel)){ if(StringUtils.isEmpty(notifyChannel)){
...@@ -423,6 +445,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -423,6 +445,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
msgSendDTO.setOriContent(alarmRecord.getContent()); msgSendDTO.setOriContent(alarmRecord.getContent());
msgSendDTO.setSubject(alarmRecord.getContent()); msgSendDTO.setSubject(alarmRecord.getContent());
msgSendDTO.setParam(alarmRecord.getElderName()); msgSendDTO.setParam(alarmRecord.getElderName());
msgSendDTO.setReceiverInfos(receiverInfos);
String alarmType = alarmConfig.getAlarmType(); String alarmType = alarmConfig.getAlarmType();
//告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常 5 离床异常 //告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常 5 离床异常
if (StringUtils.equals(alarmType, "1")) { if (StringUtils.equals(alarmType, "1")) {
...@@ -597,7 +620,11 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -597,7 +620,11 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
@Override @Override
public Integer unreadCount(PlatAlarmRecordQueryDTO dto) { public Integer unreadCount(PlatAlarmRecordQueryDTO dto) {
PlatElderChildrenInfo platElderChildrenInfo = platElderChildrenInfoService.getById(WechatUserUtil.getUserId()); String userId = WechatUserUtil.getUserId();
if (StrUtil.isBlank(userId)) {
return 0;
}
PlatElderChildrenInfo platElderChildrenInfo = platElderChildrenInfoService.getById(userId);
List<PlatElderChildrenInfo> platElderChildrenInfoList = getPlatElderChildrenInfosByOpenid(platElderChildrenInfo.getOpenid()); List<PlatElderChildrenInfo> platElderChildrenInfoList = getPlatElderChildrenInfosByOpenid(platElderChildrenInfo.getOpenid());
log.info("子女端账号:{}",JSON.toJSONString(platElderChildrenInfo)); log.info("子女端账号:{}",JSON.toJSONString(platElderChildrenInfo));
if(CollectionUtils.isEmpty(platElderChildrenInfoList)){ if(CollectionUtils.isEmpty(platElderChildrenInfoList)){
......
...@@ -465,16 +465,25 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev ...@@ -465,16 +465,25 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev
List<PlatDeviceOther> platDeviceOtherList = platDeviceOtherService.list(new QueryWrapper<PlatDeviceOther>().lambda() List<PlatDeviceOther> platDeviceOtherList = platDeviceOtherService.list(new QueryWrapper<PlatDeviceOther>().lambda()
.eq(PlatDeviceOther::getOriDeviceId, dto.getOriDeviceId())); .eq(PlatDeviceOther::getOriDeviceId, dto.getOriDeviceId()));
PlatDeviceBaseAttrDTO defaultAttr = getDefaultAttr(db);
String attribute = defaultAttr != null ? JSON.toJSONString(defaultAttr) : null;
for (PlatDeviceOther platDeviceOther : platDeviceOtherList) { for (PlatDeviceOther platDeviceOther : platDeviceOtherList) {
BeanUtils.copyProperties(dto, platDeviceOther,"id"); BeanUtils.copyProperties(dto, platDeviceOther,"id");
platDeviceOther.setDeviceId(id); platDeviceOther.setDeviceId(id);
platDeviceOther.setAttribute(getDefaultAttr(db)); platDeviceOther.setAttribute(attribute);
platDeviceOther.setOriDeviceId(db.getOriDeviceId()); platDeviceOther.setOriDeviceId(db.getOriDeviceId());
platDeviceOtherService.saveOrUpdate(platDeviceOther); platDeviceOtherService.saveOrUpdate(platDeviceOther);
} }
if (defaultAttr != null) {
List<PlatDevice> platDeviceList = list(new QueryWrapper<PlatDevice>().lambda().eq(PlatDevice::getOriDeviceId, db.getOriDeviceId()));
//更新区域设置设备安装方式
platRegionSettingService.update(new UpdateWrapper<PlatRegionSetting>().lambda()
.set(PlatRegionSetting::getInstallType, defaultAttr.getRadarMount())
.in(CollectionUtils.isNotEmpty(platDeviceList), PlatRegionSetting::getDeviceId, StreamUtil.map(platDeviceList, BaseEntity::getId)));
}
} }
private String getDefaultAttr(PlatDevice platDevice) { private PlatDeviceBaseAttrDTO getDefaultAttr(PlatDevice platDevice) {
String category = platDevice.getCategory(); String category = platDevice.getCategory();
if (!(PlatDeviceEnum.CategoryEnum.FALL.getValue().equals(category) || PlatDeviceEnum.CategoryEnum.SPACE.getValue().equals(category))) { if (!(PlatDeviceEnum.CategoryEnum.FALL.getValue().equals(category) || PlatDeviceEnum.CategoryEnum.SPACE.getValue().equals(category))) {
return null; return null;
...@@ -501,7 +510,7 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev ...@@ -501,7 +510,7 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev
platDeviceBaseAttrDTO.setRadarAngle(angle); platDeviceBaseAttrDTO.setRadarAngle(angle);
platDeviceBaseAttrDTO.setRadarDelay(30); platDeviceBaseAttrDTO.setRadarDelay(30);
} }
return JSON.toJSONString(platDeviceBaseAttrDTO); return platDeviceBaseAttrDTO;
} }
@Override @Override
......
...@@ -2,6 +2,7 @@ package com.makeit.service.platform.elder; ...@@ -2,6 +2,7 @@ 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.PlatElderBreatheAnalysis; import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.vo.platform.elder.wakeUpAnalysisVO;
import java.util.List; import java.util.List;
...@@ -16,4 +17,6 @@ import java.util.List; ...@@ -16,4 +17,6 @@ import java.util.List;
public interface PlatElderBreatheAnalysisService extends IService<PlatElderBreatheAnalysis> { public interface PlatElderBreatheAnalysisService extends IService<PlatElderBreatheAnalysis> {
List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month, Integer day); List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month, Integer day);
List<wakeUpAnalysisVO> elderGetUpAnalysisTask(Integer month, Integer day);
} }
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,10 +17,9 @@ import java.util.List; ...@@ -17,10 +17,9 @@ 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();
String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime, String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport); SaasSleepEvaluateStandardReport evaluateStandardReport);
} }
...@@ -13,6 +13,7 @@ import com.makeit.entity.platform.device.PlatDevice; ...@@ -13,6 +13,7 @@ import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder; import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis; import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.entity.platform.elder.PlatElderBreatheDayStat; import com.makeit.entity.platform.elder.PlatElderBreatheDayStat;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.saas.analysis.SaasDiseaseEvaluateReport; import com.makeit.entity.saas.analysis.SaasDiseaseEvaluateReport;
import com.makeit.entity.saas.analysis.SaasDiseaseModel; import com.makeit.entity.saas.analysis.SaasDiseaseModel;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
...@@ -23,10 +24,7 @@ import com.makeit.module.iot.vo.DeviceOperationLogEntity; ...@@ -23,10 +24,7 @@ import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.DiseaseReportVO; import com.makeit.module.iot.vo.analysis.DiseaseReportVO;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO; import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe; import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.elder.PlatElderBreatheAnalysisService; import com.makeit.service.platform.elder.*;
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.SaasDiseaseEvaluateReportService;
import com.makeit.service.saas.SaasDiseaseModelService; import com.makeit.service.saas.SaasDiseaseModelService;
import com.makeit.service.saas.SaasDiseaseReportService; import com.makeit.service.saas.SaasDiseaseReportService;
...@@ -34,6 +32,7 @@ import com.makeit.service.saas.SaasSleepAnalysisModelService; ...@@ -34,6 +32,7 @@ import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.utils.data.convert.JsonUtil; import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.data.convert.StreamUtil; import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.time.LocalDateTimeUtils; import com.makeit.utils.time.LocalDateTimeUtils;
import com.makeit.vo.platform.elder.wakeUpAnalysisVO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -47,9 +46,11 @@ import java.time.format.DateTimeFormatter; ...@@ -47,9 +46,11 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -84,6 +85,8 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -84,6 +85,8 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService; private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Autowired @Autowired
private PlatElderRealTimeService platElderRealTimeService; private PlatElderRealTimeService platElderRealTimeService;
@Autowired
private PlatElderSleepService platElderSleepService;
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
...@@ -183,7 +186,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -183,7 +186,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
} }
if (firstStopSecond != 0 && (timestamp - firstStopSecond) / 1000 >= breatheDuration) { if (firstStopSecond != 0 && (timestamp - firstStopSecond) / 1000 >= breatheDuration) {
// 避免每10s生成一次统计的方式,切换状态后重新计算 // 避免每10s生成一次统计的方式,切换状态后重新计算
if(!existBrStop.get()) { if (!existBrStop.get()) {
log.info("第一次呼吸暂停持续时间满足:{}:now:{}", breatheDuration, longToTime(timestamp)); log.info("第一次呼吸暂停持续时间满足:{}:now:{}", breatheDuration, longToTime(timestamp));
brStopCount.getAndIncrement(); brStopCount.getAndIncrement();
existBrStop.set(true); existBrStop.set(true);
...@@ -271,12 +274,12 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -271,12 +274,12 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
} }
hrFastSecond.set(0); hrFastSecond.set(0);
existHrFast.set(false); existHrFast.set(false);
}else { } else {
hrSlowSecond.set(0); hrSlowSecond.set(0);
existHrSlow.set(false); existHrSlow.set(false);
hrFastSecond.set(0); hrFastSecond.set(0);
existHrFast.set(false); existHrFast.set(false);
log.info("心率正常:{},min:{},max:{},的时间:{}", hr, heartThresholdMin,heartThresholdMax, longToTime(timestamp)); log.info("心率正常:{},min:{},max:{},的时间:{}", hr, heartThresholdMin, heartThresholdMax, longToTime(timestamp));
} }
}); });
...@@ -394,7 +397,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -394,7 +397,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month,Integer day) { public List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month, Integer day) {
// 12-06,12-18 12-07、 12-12(70分) // 12-06,12-18 12-07、 12-12(70分)
LocalDate nowDate = LocalDate.now(); LocalDate nowDate = LocalDate.now();
if (month != null && day != null) { if (month != null && day != null) {
...@@ -442,14 +445,6 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -442,14 +445,6 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
return result; return result;
} }
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).toHours() + 1;
}
public static String formatLongTime(long time) { public static String formatLongTime(long time) {
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault())); return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
} }
...@@ -466,5 +461,210 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -466,5 +461,210 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
return list; return list;
} }
@Override
public List<wakeUpAnalysisVO> elderGetUpAnalysisTask(Integer month, Integer day) {
LocalDate nowDate = LocalDate.now();
if (month != null && day != null) {
nowDate = LocalDate.of(2023, month, day);
}
LocalDate yesDate = nowDate.minusDays(1);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId).eq(PlatElder::getId,"1712648603580764161"));
List<wakeUpAnalysisVO> result = new ArrayList<>();
if (CollectionUtils.isEmpty(elderList)) {
return result;
}
List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId);
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
Map<String, List<PlatElderSleep>> sleepMap = StreamUtil.groupBy(platElderSleepService.list(Wrappers.<PlatElderSleep>lambdaQuery().eq(PlatElderSleep::getHappenDate, String.valueOf(yesDate))
.in(PlatElderSleep::getElderId, elderIdList)), PlatElderSleep::getElderId);
for (PlatElder platElder : elderList) {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElder.getId(), null);
if (platDevice == null) {
continue;
}
List<PlatElderSleep> sleepList = sleepMap.get(platElder.getId());
List<String> dayHourRange = getLastDayHourRange(yesStart);
List<LocalDateTime> leaveOverTime = new ArrayList<>();
List<LocalDateTime> wakeUpList = new ArrayList<>();
boolean isOffBed = false;
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);
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();
// 人离床大于(0.5)小时
double leaveHourThreshold = Double.parseDouble(analysisModel.getRiseLeaveThreshold());
// 或者每分钟大于30秒体动值 大于(50)
int actionThreshold = Integer.parseInt(analysisModel.getRiseActionThreshold());
// 每分钟大于30秒体动值 大于(50) 持续 (10)min
int actionDurationThreshold = Integer.parseInt(analysisModel.getRiseActionDuration());
// 且在 (2) 小时内无再次入睡
int riseRepeatThreshold = Integer.parseInt(analysisModel.getRiseRepeatThreshold());
Long firstOffBedTime = 0L;
TreeMap<LocalDateTime, Integer> minuteToActionCountMap = new TreeMap<>();
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
List<DeviceInfoContentBreathe> perMinDeviceInfoList = entry.getValue();
if (CollUtil.isEmpty(perMinDeviceInfoList)) {
continue;
}
int totalActionCount = 0;
int perMinInfoSize = perMinDeviceInfoList.size();
for (int i = 0; i < perMinDeviceInfoList.size(); i++) {
DeviceInfoContentBreathe deviceInfo = perMinDeviceInfoList.get(i);
DeviceInfoContentBreathe.Properties deviceProperties = deviceInfo.getProperties();
// 0无人,1有人
Integer hasPerson = deviceProperties.getPerson();
Long timestamp = deviceInfo.getTimestamp();
if (1 == hasPerson) {
isOffBed = false;
firstOffBedTime = 0L;
// 体动值大于阈值
if (deviceProperties.getBodymove() > actionThreshold) {
totalActionCount++;
}
} else {
if (!isOffBed) {
firstOffBedTime = timestamp;
isOffBed = true;
continue;
}
if (firstOffBedTime != 0L && (timestamp - firstOffBedTime) / 1000 >= (long) leaveHourThreshold * 60 * 60) {
logger.info("离床时间大于:{}小时,第一次离床时间:{},当前时间:{}", leaveHourThreshold, longToTime(firstOffBedTime), longToTime(timestamp));
leaveOverTime.add(longToTime(timestamp));
}
}
if (i == perMinInfoSize - 1 && totalActionCount >= perMinInfoSize / 2) {
LocalDateTime reportTime = parse(deviceInfo.getReportTime());
minuteToActionCountMap.put(reportTime, totalActionCount);
}
}
}
wakeUpList = getWakeUpTimes(minuteToActionCountMap, sleepList, actionDurationThreshold, riseRepeatThreshold);
}
wakeUpAnalysisVO wakeUpAnalysisVO = new wakeUpAnalysisVO();
wakeUpAnalysisVO.setElderId(platElder.getId());
wakeUpAnalysisVO.setName(platElder.getName());
wakeUpAnalysisVO.setWakeUpList(wakeUpList);
wakeUpAnalysisVO.setLeaveOverTimeList(leaveOverTime);
result.add(wakeUpAnalysisVO);
}
return result;
}
private List<LocalDateTime> getActionDurationTime(Map<String, List<DeviceInfoContentBreathe>> map, int actionDurationThreshold,
int actionThreshold, List<PlatElderSleep> sleepList, int riseRepeatThreshold) {
List<LocalDateTime> result = new ArrayList<>();
int totalActionCount = 0;
TreeMap<LocalDateTime, Integer> minuteToActionCountMap = new TreeMap<>();
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : map.entrySet()) {
List<DeviceInfoContentBreathe> perMinDeviceInfoList = entry.getValue();
if (CollUtil.isEmpty(perMinDeviceInfoList)) {
continue;
}
int perMinInfoSize = perMinDeviceInfoList.size();
for (int i = 0; i < perMinInfoSize; i++) {
DeviceInfoContentBreathe deviceInfo = perMinDeviceInfoList.get(i);
DeviceInfoContentBreathe.Properties deviceProperties = deviceInfo.getProperties();
// 0无人,1有人
Integer hasPerson = deviceProperties.getPerson();
if (1 == hasPerson) {
// 体动值大于阈值
if (deviceProperties.getBodymove() > actionThreshold) {
totalActionCount++;
}
}
if (i == perMinInfoSize - 1 && totalActionCount >= perMinInfoSize / 2) {
LocalDateTime reportTime = parse(deviceInfo.getReportTime());
minuteToActionCountMap.put(reportTime, totalActionCount);
}
}
}
if (CollUtil.isEmpty(minuteToActionCountMap)) {
return result;
}
result = getWakeUpTimes(minuteToActionCountMap, sleepList, actionDurationThreshold, riseRepeatThreshold);
return result;
}
/**
* 获取满足(每分钟大于30秒体动值大于(50),持续10min且在(2)小时内无再次入睡
* @param minuteToActionCountMap
* @return
*/
private List<LocalDateTime> getWakeUpTimes(TreeMap<LocalDateTime, Integer> minuteToActionCountMap, List<PlatElderSleep> elderSleeps,
int actionDurationThreshold, int riseRepeatThreshold) {
List<LocalDateTime> result = new ArrayList<>();
AtomicReference<LocalDateTime> startTime = new AtomicReference<>(LocalDateTime.MAX);
minuteToActionCountMap.forEach((k, v) -> {
int count = 0;
if (startTime.get().isEqual(LocalDateTime.MAX)) {
startTime.set(k);
}
for (int i = 1; i < actionDurationThreshold + 1; i++) {
if (minuteToActionCountMap.containsKey(k.plusMinutes(i))) {
count++;
}
if (count >= actionDurationThreshold / 2) {
if (k.compareTo(startTime.get()) != 1) {
result.add(k);
} else {
startTime.set(k);
}
}
}
if (!minuteToActionCountMap.containsKey(k.plusMinutes(1))) {
startTime.set(LocalDateTime.MAX);
}
});
if (CollUtil.isEmpty(result) || CollUtil.isEmpty(elderSleeps)) {
return result;
}
List<LocalDateTime> errorTime = new ArrayList<>();
// (2)小时内无再次入睡
for (LocalDateTime wakeUpTime : result) {
elderSleeps.stream().filter(f -> Duration.between(wakeUpTime, f.getStartSleep()).toHours() < riseRepeatThreshold)
.findFirst().ifPresent(platElderSleep -> errorTime.add(parse(platElderSleep.getStartSleep().toString())));
}
if (CollUtil.isNotEmpty(errorTime)) {
log.info("清醒时间和再次入睡:{}相隔太短{}", riseRepeatThreshold, errorTime);
result.removeAll(errorTime);
}
return result;
}
private LocalDateTime parse(String time) {
return LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
}
} }
...@@ -254,8 +254,12 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild ...@@ -254,8 +254,12 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild
@Override @Override
public PlatElderChildrenInfoWechatVO view() { public PlatElderChildrenInfoWechatVO view() {
String userId = WechatUserUtil.getUserId();
if (StrUtil.isBlank(userId)) {
return new PlatElderChildrenInfoWechatVO();
}
PlatElderChildrenInfoWechatVO wechatVO = PlatElderChildrenInfoWechatVO wechatVO =
BeanDtoVoUtils.convert(getById(WechatUserUtil.getUserId()), PlatElderChildrenInfoWechatVO.class); BeanDtoVoUtils.convert(getById(userId), PlatElderChildrenInfoWechatVO.class);
if (wechatVO != null && (StrUtil.isBlank(wechatVO.getName()) && StrUtil.isNotBlank(wechatVO.getPhone()))) { if (wechatVO != null && (StrUtil.isBlank(wechatVO.getName()) && StrUtil.isNotBlank(wechatVO.getPhone()))) {
wechatVO.setName(wechatVO.getPhone()); wechatVO.setName(wechatVO.getPhone());
} }
...@@ -304,7 +308,11 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild ...@@ -304,7 +308,11 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void bind(String elderId) { public void bind(String elderId) {
PlatElderChildrenInfo childrenInfo = getById(WechatUserUtil.getUserId()); String userId = WechatUserUtil.getUserId();
if (StrUtil.isBlank(userId)) {
return;
}
PlatElderChildrenInfo childrenInfo = getById(userId);
if (childrenInfo == null) { if (childrenInfo == null) {
return; return;
} }
...@@ -338,6 +346,7 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild ...@@ -338,6 +346,7 @@ public class PlatElderChildrenInfoServiceImpl extends ServiceImpl<PlatElderChild
} }
newChildrenInfo.setTenantId(platElder.getTenantId()); newChildrenInfo.setTenantId(platElder.getTenantId());
newChildrenInfo.setOpenid(copyInfo.getOpenid()); newChildrenInfo.setOpenid(copyInfo.getOpenid());
newChildrenInfo.setWeChatOpenid(copyInfo.getWeChatOpenid());
newChildrenInfo.setPhone(copyInfo.getPhone()); newChildrenInfo.setPhone(copyInfo.getPhone());
newChildrenInfo.setName(copyInfo.getName()); newChildrenInfo.setName(copyInfo.getName());
newChildrenInfo.setAvatar(copyInfo.getAvatar()); newChildrenInfo.setAvatar(copyInfo.getAvatar());
......
...@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder; import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderCoordinateRecord; import com.makeit.entity.platform.elder.PlatElderCoordinateRecord;
import com.makeit.entity.platform.space.PlatRegionSetting; import com.makeit.entity.platform.space.PlatRegionSetting;
import com.makeit.entity.platform.space.PlatRegionSettingFix; import com.makeit.entity.platform.space.PlatRegionSettingFix;
import com.makeit.mapper.platform.elder.PlatElderCoordinateRecordMapper; import com.makeit.mapper.platform.elder.PlatElderCoordinateRecordMapper;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderCoordinateRecordService; import com.makeit.service.platform.elder.PlatElderCoordinateRecordService;
import com.makeit.service.platform.elder.PlatElderDayReportDayService; import com.makeit.service.platform.elder.PlatElderDayReportDayService;
import com.makeit.service.platform.elder.PlatElderRealTimeService; import com.makeit.service.platform.elder.PlatElderRealTimeService;
...@@ -52,7 +54,7 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC ...@@ -52,7 +54,7 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
@Autowired @Autowired
private PlatRegionSettingService platRegionSettingService; private PlatRegionSettingService platRegionSettingService;
@Autowired @Autowired
private PlatElderRealTimeService platElderRealTimeService; private PlatDeviceService platDeviceService;
@Override @Override
public void coordinateRecordTask() { public void coordinateRecordTask() {
...@@ -90,6 +92,10 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC ...@@ -90,6 +92,10 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
} }
saveBatch(list); saveBatch(list);
} }
List<String> deviceIds = StreamUtil.map(platRegionSettingList, setting -> setting.getDeviceId());
List<PlatDevice> platDevices = platDeviceService.listByIds(deviceIds);
Map<String, String> deviceMap = StreamUtil.toMap(platDevices, PlatDevice::getId, PlatDevice::getId);
platRegionSettingList = StreamUtil.filter(platRegionSettingList, setting -> deviceMap.containsKey(setting.getDeviceId()));
List<PlatRegionSettingFix> settingFixList = StreamUtil.map(platRegionSettingList, setting -> { List<PlatRegionSettingFix> settingFixList = StreamUtil.map(platRegionSettingList, setting -> {
PlatRegionSettingFix settingFix = new PlatRegionSettingFix(); PlatRegionSettingFix settingFix = new PlatRegionSettingFix();
BeanUtils.copyProperties(setting, settingFix,"id"); BeanUtils.copyProperties(setting, settingFix,"id");
......
...@@ -102,21 +102,11 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -102,21 +102,11 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override @Override
public PlatElderSleepEvaluationVO sleepEvaluation(PlatElderReportDTO platElderIdDTO) { public PlatElderSleepEvaluationVO sleepEvaluation(PlatElderReportDTO platElderIdDTO) {
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now()); LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
PlatElderSleepEvaluationVO platElderSleepEvaluationVO = new PlatElderSleepEvaluationVO(); PlatElderSleepEvaluationVO platElderSleepEvaluationVO = new PlatElderSleepEvaluationVO();
String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now); String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
String elderId = platElderIdDTO.getElderId(); String elderId = platElderIdDTO.getElderId();
String deviceId = platElderIdDTO.getDeviceId(); String deviceId = platElderIdDTO.getDeviceId();
String tenantId = platElderIdDTO.getTenantId(); String tenantId = platElderIdDTO.getTenantId();
// if (StringUtils.isNotEmpty(deviceId)) {
// PlatElder platElder = platElderService.getByDeviceId(deviceId,platElderIdDTO.getTenantId());
// if (platElder != null) {
// elderId = platElder.getId();
// }
// }
PlatElderSleepAnalysis platElderSleepAnalysis = platElderSleepAnalysisService.getOne(new QueryWrapper<PlatElderSleepAnalysis>().lambda() PlatElderSleepAnalysis platElderSleepAnalysis = platElderSleepAnalysisService.getOne(new QueryWrapper<PlatElderSleepAnalysis>().lambda()
.eq(StrUtil.isNotBlank(elderId), PlatElderSleepAnalysis::getElderId, elderId) .eq(StrUtil.isNotBlank(elderId), PlatElderSleepAnalysis::getElderId, elderId)
...@@ -199,7 +189,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -199,7 +189,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override @Override
public List<PlatElderSleepDiagramVO> sleepDiagram(PlatElderReportDTO platElderIdDTO) { public List<PlatElderSleepDiagramVO> sleepDiagram(PlatElderReportDTO platElderIdDTO) {
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now()); LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
List<PlatElderSleepDiagramVO> voList; List<PlatElderSleepDiagramVO> voList;
String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now); String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
...@@ -216,31 +205,54 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -216,31 +205,54 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
.orderByAsc(PlatElderSleep::getStartSleep) .orderByAsc(PlatElderSleep::getStartSleep)
); );
setWakeUp(sleepList);
voList = StreamUtil.map(sleepList, e -> { voList = StreamUtil.map(sleepList, e -> {
PlatElderSleepDiagramVO vo = new PlatElderSleepDiagramVO(); PlatElderSleepDiagramVO vo = new PlatElderSleepDiagramVO();
vo.setSleepAt(e.getStartSleep()); vo.setSleepAt(e.getStartSleep());
vo.setWakeUpAt(e.getEndSleep()); vo.setWakeUpAt(e.getEndSleep());
vo.setNewWakeUpAt(e.getWakeUpTime());
vo.setElderSleepType(e.getElderSleepType()); vo.setElderSleepType(e.getElderSleepType());
List<PlatElderSleepDiagramContentVO> contentList = StreamUtil.map(Optional.ofNullable(e.getSleepRecord()).orElse(new ArrayList<>(10)), i -> { List<PlatElderSleepDiagramContentVO> contentList = StreamUtil.map(Optional.ofNullable(e.getSleepRecord()).orElse(new ArrayList<>(10)), i -> {
PlatElderSleepDiagramContentVO contentVO = new PlatElderSleepDiagramContentVO(); PlatElderSleepDiagramContentVO contentVO = new PlatElderSleepDiagramContentVO();
contentVO.setStartTime(i.getStartTime()); contentVO.setStartTime(i.getStartTime());
contentVO.setEndTime(i.getEndTime()); contentVO.setEndTime(i.getEndTime());
contentVO.setSleepType(i.getSleepType()); contentVO.setSleepType(i.getSleepType());
return contentVO; return contentVO;
}); });
vo.setContentList(contentList); vo.setContentList(contentList);
return vo; return vo;
}); });
return voList; return voList;
} }
private void setWakeUp(List<PlatElderSleep> sleepList) {
if (CollUtil.isEmpty(sleepList)) {
return;
}
List<PlatElderSleep> sleeps = sleepList.stream().filter(f -> f.getElderSleepType().equals(SleepTypeEnum.SLEEP.getType())).collect(Collectors.toList());
if (CollUtil.isEmpty(sleeps)) {
return;
}
List<PlatElderSleep> wakeUpList = sleepList.stream().filter(f -> f.getElderSleepType().equals(SleepTypeEnum.GETUP.getType())).collect(Collectors.toList());
sleeps.forEach(s -> {
List<PlatElderSleep> wakeList = wakeUpList.stream().filter(f -> s.getStartSleep().isAfter(s.getEndSleep())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(wakeList)) {
final long[] minute = {24 * 60};
wakeList.forEach(w -> {
long between = Duration.between(s.getEndSleep(), w.getStartSleep()).toMinutes();
if (between < minute[0]) {
minute[0] = between;
s.setWakeUpTime(w.getStartSleep());
}
});
}
});
}
@Override @Override
public PlatElderHeartRespiratoryEvaluationVO heartRespiratoryEvaluation(PlatElderReportDTO platElderIdDTO) { public PlatElderHeartRespiratoryEvaluationVO heartRespiratoryEvaluation(PlatElderReportDTO platElderIdDTO) {
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now()); LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
...@@ -547,7 +559,9 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -547,7 +559,9 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
} }
} }
List<PlatElderBehaviorDistributionVO> voList = new ArrayList<>(10); List<PlatElderBehaviorDistributionVO> voList = new ArrayList<>(10);
if (StrUtil.isBlank(elderId)) {
return voList;
}
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
List<PlatElderBehaviorDistributionVO> finalVoList = voList; List<PlatElderBehaviorDistributionVO> finalVoList = voList;
......
...@@ -230,7 +230,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService { ...@@ -230,7 +230,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
brNoPersonFlag = true; brNoPersonFlag = true;
} }
} else { } else {
log.info("当前呼吸设备没有上报数据直接返回:" + platElderIdDTO.getElderId()); // log.info("当前呼吸设备没有上报数据直接返回:" + platElderIdDTO.getElderId());
redisTemplate.delete(DEVICE_BR_ANALYSIS + platDevice.getOriDeviceId()); redisTemplate.delete(DEVICE_BR_ANALYSIS + platDevice.getOriDeviceId());
return platElderRealTimeNowVO; return platElderRealTimeNowVO;
} }
...@@ -405,7 +405,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService { ...@@ -405,7 +405,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
} }
vo.setDeviceId(platDevice.getOriDeviceId()); vo.setDeviceId(platDevice.getOriDeviceId());
String result = redisTemplate.opsForValue().get(DEVICE_BR_DATA + platDevice.getOriDeviceId()); String result = redisTemplate.opsForValue().get(DEVICE_BR_DATA + platDevice.getOriDeviceId());
log.info("实时获取设备呼吸数据:{}",result); // log.info("实时获取设备呼吸数据:{}",result);
if (result != null) { if (result != null) {
JSONObject jsonObject = JSON.parseObject(result); JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject != null) { if (jsonObject != null) {
...@@ -539,7 +539,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService { ...@@ -539,7 +539,7 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
} }
vo.setDeviceId(platDevice.getOriDeviceId()); vo.setDeviceId(platDevice.getOriDeviceId());
String result = redisTemplate.opsForValue().get(DEVICE_BR_DATA + platDevice.getOriDeviceId()); String result = redisTemplate.opsForValue().get(DEVICE_BR_DATA + platDevice.getOriDeviceId());
log.info("实时获取设备呼吸数据:{}",result); // log.info("实时获取设备呼吸数据:{}",result);
if (result != null) { if (result != null) {
JSONObject jsonObject = JSON.parseObject(result); JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject != null) { if (jsonObject != null) {
......
...@@ -69,9 +69,6 @@ public class PlatElderReportMonthServiceImpl extends ServiceImpl<PlatElderReport ...@@ -69,9 +69,6 @@ public class PlatElderReportMonthServiceImpl extends ServiceImpl<PlatElderReport
@Override @Override
public PlatElderComprehensiveEvaluationVO comprehensiveEvaluation(PlatElderReportDTO platElderIdDTO) { public PlatElderComprehensiveEvaluationVO comprehensiveEvaluation(PlatElderReportDTO platElderIdDTO) {
PlatElderSleepEvaluationVO platElderSleepEvaluationVO = sleepEvaluation(platElderIdDTO); PlatElderSleepEvaluationVO platElderSleepEvaluationVO = sleepEvaluation(platElderIdDTO);
if (platElderSleepEvaluationVO == null) {
return new PlatElderComprehensiveEvaluationVO();
}
PlatElderHeartRespiratoryEvaluationVO platElderHeartRespiratoryEvaluationVO = heartRespiratoryEvaluation(platElderIdDTO); PlatElderHeartRespiratoryEvaluationVO platElderHeartRespiratoryEvaluationVO = heartRespiratoryEvaluation(platElderIdDTO);
return platElderDayReportWeekService.comprehensiveEvaluationInternal(platElderSleepEvaluationVO, platElderHeartRespiratoryEvaluationVO); return platElderDayReportWeekService.comprehensiveEvaluationInternal(platElderSleepEvaluationVO, platElderHeartRespiratoryEvaluationVO);
......
package com.makeit.service.platform.elder.impl; package com.makeit.service.platform.elder.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
...@@ -9,11 +12,13 @@ import com.google.common.collect.Lists; ...@@ -9,11 +12,13 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.makeit.common.entity.BaseEntity; import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice; import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*; import com.makeit.entity.platform.elder.ElderSleepAnalysisVO;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.platform.space.PlatRoomBedDevice; import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport; import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.report.ElderSleepType;
import com.makeit.enums.report.SleepTypeEnum; import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.elder.PlatElderSleepMapper; import com.makeit.mapper.platform.elder.PlatElderSleepMapper;
...@@ -28,18 +33,18 @@ import com.makeit.service.saas.*; ...@@ -28,18 +33,18 @@ import com.makeit.service.saas.*;
import com.makeit.utils.data.convert.JsonUtil; import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.data.convert.StreamUtil; import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO; import com.makeit.vo.platform.elder.report.day.PlatSleepRangeVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -52,7 +57,6 @@ import java.util.stream.Collectors; ...@@ -52,7 +57,6 @@ import java.util.stream.Collectors;
* @since 2023-09-13 * @since 2023-09-13
*/ */
@Service @Service
@Slf4j
public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, PlatElderSleep> implements PlatElderSleepService { public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, PlatElderSleep> implements PlatElderSleepService {
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
...@@ -85,649 +89,741 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -85,649 +89,741 @@ 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);
// Calendar calendar = Calendar.getInstance();
// calendar.setTime(new Date());
// calendar.add(Calendar.DAY_OF_MONTH, -1);
// Date previousDate = calendar.getTime();
// String currentDate = DateUtil.format(previousDate, DatePattern.NORM_DATE_PATTERN);
String currentDate = LocalDate.now().minusDays(1).toString();
if(month != null && day != null){
currentDate = LocalDate.of(2023, 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()); for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
int sleepDeepActionTimeBegin = Integer.parseInt(analysisModel.getSleepDeepActionTimeBegin());
List<DeviceInfoContentBreathe> deviceInfoContentBreathes = entry.getValue();
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin()); DeviceInfoContentBreathe.Properties breatheProperties;
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax());
int reportSize = deviceInfoContentBreathes.size();
// 记录总呼吸率和总心率
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold()); int maxBr = 0;
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin()); int minBr = 0;
List<PlatElderSleepAnalysis> result = new ArrayList<>();
int maxHr = 0;
for (PlatRoomBedDevice platRoomBedDevice : platRoomBedDeviceList) { int minHr = 0;
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>(); int hrBrCount = 0; // 呼吸率心率统计次数
int totalBr = 0;
String bedId = platRoomBedDevice.getBedId(); int totalHr = 0;
PlatElder elder = platElderService.getOne(new QueryWrapper<PlatElder>().lambda()
.eq(PlatElder::getBedId, bedId)); Integer bodymoveCount = 0; // 体动次数
if (elder == null) { Integer turnoverCount = 0; // 翻身次数
continue; boolean isAction = false; // 每分钟是否动过
} AnalysisVO analysisVO = new AnalysisVO();
PlatDevice platDevice = platDeviceService.getById(platRoomBedDevice.getDeviceId()); int getUpBodymoveCount = 0;
if (platDevice == null) { boolean isMoveBed = false;
continue; // 清醒每分钟体动是否满足要求 (每分钟体动值大于60或无人)
} boolean awakeMinuteActionFlag = false;
String tenantId = elder.getTenantId();
int noPersonCount = 0; // 无人跳过计数
for (String hourRange : dayHourRangeList) { for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
String[] hourRangeArray = hourRange.split("~"); // 体动指数
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]); breatheProperties = infoContentBreathe.getProperties();
if (CollectionUtils.isEmpty(deviceOperationLogEntities)) { Integer bodyMove = breatheProperties.getBodymove();
int br = breatheProperties.getBr();
int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
if (hasPerson == 0) {
noPersonCount++;
isMoveBed = true;
awakeMinuteActionFlag = true;
continue;
}
// 0和255直接跳过
if (breatheProperties.getHr() == 255 || breatheProperties.getHr() == 0) {
noPersonCount++;
continue;
}
if (breatheProperties.getBr() == 255 || breatheProperties.getBr() == 0) {
noPersonCount++;
continue; 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();
// 统计每小时的体动和翻身 if (bodyMove > actionThreshold) {
Map<String, AnalysisVO> statisticsMap = Maps.newHashMap(); bodymoveCount++;
List<DeviceInfoContentBreathe> deviceInfoContentBreathes; }
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) { if (bodyMove > turnedThreshold) {
turnoverCount++;
deviceInfoContentBreathes = entry.getValue(); }
DeviceInfoContentBreathe.Properties breatheProperties; // 判断入睡时间的体动阈值
Integer bodymove; if (bodyMove >= sleepTimeActionThreshold) {
isAction = true;
int reportSize = deviceInfoContentBreathes.size(); }
// 记录总呼吸率和总心率 // 起床每分钟体动次数
int maxBr = 0; if (bodyMove > riseActionThreshold) {
int minBr = 0; getUpBodymoveCount++;
}
int maxHr = 0; // 清醒
int minHr = 0; if (bodyMove > awakeThreshold) {
int hrBrCount = 0; // 呼吸率心率统计次数 awakeMinuteActionFlag = true;
int totalBr = 0; }
int totalHr = 0;
Integer bodymoveCount = 0; // 体动次数
Integer turnoverCount = 0; // 翻身次数
boolean isAction = false; // 每分钟是否动过
AnalysisVO analysisVO = new AnalysisVO();
int getUpBodymoveCount = 0;
boolean isMoveBed = true;
boolean awakeMinuteActionFlag = true; // 清醒每分钟体动是否满足要求
int noPersonCount = 0; // 无人跳过计数
int sleepDeepMinuteCount = 0; // 深睡每分钟体动和翻身次数
int sleepModerateAMinuteCount = 0; // 中度睡每分钟体动和翻身次数
for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
// 体动指数
breatheProperties = infoContentBreathe.getProperties();
bodymove = breatheProperties.getBodymove();
int br = breatheProperties.getBr();
int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
if (breatheProperties.getPerson() == 0) {
noPersonCount++;
continue;
}
// 0和255直接跳过
if (breatheProperties.getHr() == 255 || breatheProperties.getHr() == 0 ) {
noPersonCount++;
continue;
}
if (breatheProperties.getBr() == 255 || breatheProperties.getBr() == 0) {
noPersonCount++;
continue;
}
if (bodymove > actionThreshold) {
bodymoveCount++;
}
if (bodymove > turnedThreshold) {
turnoverCount++;
}
// 判断入睡时间的体动阈值
if (bodymove > sleepTimeActionThreshold) {
isAction = true;
}
// 起床每分钟体动次数
if (getUpBodymoveCount > riseActionThreshold) {
getUpBodymoveCount++;
}
// 清醒
if (bodymove < awakeThreshold || hasPerson == 1) {
awakeMinuteActionFlag = false;
}
// 判断有没有离开床
if (hasPerson == 1) {
isMoveBed = false;
}
if (br > maxBr) {
maxBr = br;
}
if (br < minBr) {
minBr = br;
}
if (hr > maxHr) {
maxHr = hr;
}
if (hr < minHr) {
minHr = hr;
}
if (breatheProperties.getPerson() == 1) {
totalBr += br;
totalHr += hr;
hrBrCount++;
}
}
if (reportSize == noPersonCount) {
continue;
}
analysisVO.setTotalBr(totalBr);
analysisVO.setAvgBr(totalBr / reportSize); if (br > maxBr) {
maxBr = br;
}
if (minBr == 0) {
minBr = br;
} else if (br < minBr) {
minBr = br;
}
analysisVO.setTotalHr(totalHr); if (hr > maxHr) {
analysisVO.setAvgHr(totalHr / reportSize); maxHr = hr;
analysisVO.setMaxBr(maxBr); }
analysisVO.setMinBr(minBr);
analysisVO.setMaxHr(maxHr); if (minHr == 0) {
analysisVO.setMinHr(minHr); minHr = hr;
} else if (hr < minHr) {
minHr = hr;
}
analysisVO.setActionCount(bodymoveCount); if (hasPerson == 1) {
analysisVO.setTurnedCount(turnoverCount); totalBr += br;
analysisVO.setIsAction(isAction); totalHr += hr;
analysisVO.setIsMoveBed(isMoveBed); hrBrCount++;
analysisVO.setIsMinuteActionFlag(getUpBodymoveCount > 30);
analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag);
statisticsMap.put(entry.getKey(), analysisVO);
} }
TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap);
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
} }
if (reportSize == noPersonCount) {
if (totalMap.isEmpty()) {
log.info("呼吸设备上报的数据为空");
continue; continue;
} }
// 每分钟的数据
analysisVO.setTotalBr(totalBr);
analysisVO.setAvgBr(totalBr / reportSize);
analysisVO.setTotalHr(totalHr);
analysisVO.setAvgHr(totalHr / reportSize);
analysisVO.setMaxBr(maxBr);
analysisVO.setMinBr(minBr);
analysisVO.setMaxHr(maxHr);
analysisVO.setMinHr(minHr);
analysisVO.setActionCount(bodymoveCount);
analysisVO.setTurnedCount(turnoverCount);
analysisVO.setIsAction(isAction);
analysisVO.setIsMoveBed(isMoveBed);
analysisVO.setIsMinuteActionFlag(getUpBodymoveCount > 30);
analysisVO.setAwakeMinuteActionFlag(awakeMinuteActionFlag);
statisticsMap.put(entry.getKey(), analysisVO);
}
return statisticsMap;
}
/**
int totalActionCount = 0; * 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
int totalTurnedCount = 0; *
// 记录长者不同类型的睡眠时间 * @param totalMap
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList(); * @param sleepTimeActionDuration 体动值持续时间 0.5h
SleepTimeAnalysisVO sleepTimeAnalysisVO; * @param sleepTimeAnalysisVOList
* @return key:开始入睡时间,value:睡眠时间段内的数据
// 判断睡觉时间 */
String startSleepTime = null; // 入睡时间开始 private TreeMap<String, TreeMap<String, AnalysisVO>> getFallAsleepData(TreeMap<String, AnalysisVO> totalMap, double sleepTimeActionDuration,
int sleepMinute = 0; List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
// 入睡时间开始
String startSleepTime = null;
int sleepMinute = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startSleepTime)) {
startSleepTime = entry.getKey();
}
sleepMinute++;
continue;
}
if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) {
continue;
}
if (sleepMinute > sleepTimeActionDuration * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.DAY_SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startSleepTime = null;
sleepMinute = 0;
}
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>();
if (CollUtil.isEmpty(sleepTimeAnalysisVOList)) {
return sleepTypeMap;
}
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
boolean startTimeFlag = false;
TreeMap<String, AnalysisVO> sleepTotalMap = new TreeMap<>();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue(); if (entry.getKey().equals(timeAnalysisVO.getStartTime())) {
if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) { startTimeFlag = true;
if (StringUtils.isEmpty(startSleepTime)) { sleepTotalMap.put(entry.getKey(), entry.getValue());
startSleepTime = entry.getKey();
}
sleepMinute++;
continue;
} }
if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) { if (entry.getKey().equals(timeAnalysisVO.getEndTime())) {
continue; sleepTotalMap.put(entry.getKey(), entry.getValue());
startTimeFlag = false;
} }
if (sleepMinute > sleepTimeActionDuration * 60) { if (startTimeFlag) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTotalMap.put(entry.getKey(), entry.getValue());
sleepTimeAnalysisVO.setStartTime(startSleepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startSleepTime = null;
sleepMinute = 0;
}
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>();
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
boolean startTimeFlag = false;
TreeMap<String, AnalysisVO> sleepTotalMap = new TreeMap<>();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
if (entry.getKey().equals(timeAnalysisVO.getStartTime())) {
startTimeFlag = true;
sleepTotalMap.put(entry.getKey(), entry.getValue());
}
if (entry.getKey().equals(timeAnalysisVO.getEndTime())) {
sleepTotalMap.put(entry.getKey(), entry.getValue());
startTimeFlag = false;
}
if (startTimeFlag) {
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,且在两小时内无再次入睡
int getupMinute = 0; *
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { * @param totalMap
AnalysisVO analysisVO = entry.getValue(); * @param riseLeaveThreshold
if (analysisVO.getIsMoveBed()) { * @param riseActionDuration
if (StringUtils.isEmpty(startGetupTime)) { * @param sleepTimeAnalysisVOList
startGetupTime = entry.getKey(); */
} private void getUp(TreeMap<String, AnalysisVO> totalMap, double riseLeaveThreshold, int riseActionDuration,
getupMinute++; double repeatSleepThreshold, List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList,
continue; SleepCountDTO sleepCountDTO) {
} Integer actionCount = 0;
if (StringUtils.isEmpty(startGetupTime) && getupMinute == 0) { Integer turnedCount = 0;
continue; // 起床时间
} String startGetupTime = null;
if (getupMinute > riseLeaveThreshold * 60) { int getupMinute = 0;
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
sleepTimeAnalysisVO.setStartTime(startGetupTime); AnalysisVO analysisVO = entry.getValue();
actionCount += analysisVO.getActionCount();
turnedCount += analysisVO.getTurnedCount();
if (analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startGetupTime)) {
startGetupTime = entry.getKey();
}
getupMinute++;
continue;
}
if (StringUtils.isEmpty(startGetupTime) && getupMinute == 0) {
continue;
}
if (getupMinute > riseLeaveThreshold * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startGetupTime = null;
getupMinute = 0;
}
sleepCountDTO.setTotalActionCount(actionCount);
sleepCountDTO.setTotalTurnedCount(turnedCount);
List<SleepTimeAnalysisVO> sleepList = sleepTimeAnalysisVOList.stream().
filter(f -> SleepTypeEnum.SLEEP.getCode().equals(f.getType())).collect(Collectors.toList());
String startGetupTime2 = null;
int getupMinute2 = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getIsMinuteActionFlag()) {
if (StrUtil.isBlank(startGetupTime)) {
startGetupTime2 = entry.getKey();
}
getupMinute2++;
continue;
}
if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) {
continue;
}
if (getupMinute2 > riseActionDuration && startGetupTime2 != null) {
LocalDateTime startDateTime = LocalDateTime.parse(startGetupTime2, DEFAULT_FORMATTER);
SleepTimeAnalysisVO repeatSleep = sleepList.stream().filter(f -> Duration.between(startDateTime,
LocalDateTime.parse(f.getStartTime(), DEFAULT_FORMATTER)).toMinutes() < repeatSleepThreshold * 60)
.findFirst().orElse(null);
// 两小时内不在有入睡
if (repeatSleep == null) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime2);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
startGetupTime = null;
getupMinute = 0;
} }
startGetupTime2 = null;
getupMinute2 = 0;
}
}
// 判断起床时间 /**
String startGetupTime2 = null; // 起床时间开始 * 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
int getupMinute2 = 0; *
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { * @param sleepTypeMap
AnalysisVO analysisVO = entry.getValue(); * @param analysisModel
if (analysisVO.getIsMinuteActionFlag()) { * @param sleepTimeAnalysisVOList
if (StringUtils.isEmpty(startGetupTime2)) { */
startGetupTime2 = entry.getKey(); private void deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int sleepDeepMinute = 0;
String startSleepDeepTime = null;
int sleepDeepActionThreshold = Integer.parseInt(analysisModel.getSleepDeepActionThreshold());
int sleepDeepActionTimeBegin = Integer.parseInt(analysisModel.getSleepDeepActionTimeBegin());
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin());
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax());
if (CollUtil.isEmpty(sleepTypeMap)) {
return;
}
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue();
boolean actionFlag = analysisVO.getActionCount() == sleepDeepActionThreshold;
boolean turnedFlag = analysisVO.getTurnedCount() == sleepDeepActionThreshold;
if (actionFlag && turnedFlag
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = voEntry.getKey();
} }
getupMinute2++; sleepDeepMinute++;
continue; continue;
} }
if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) { if (StringUtils.isEmpty(startSleepDeepTime) && sleepDeepMinute == 0) {
continue; continue;
} }
if (getupMinute2 > riseActionDuration) { if (sleepDeepMinute > sleepDeepActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime2); sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
startGetupTime2 = null; startSleepDeepTime = null;
getupMinute2 = 0; sleepDeepMinute = 0;
}
int sleepDeepMinute = 0;
String startSleepDeepTime = null; // 入睡时间开始
// 判断深度睡眠时间
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue();
totalActionCount += analysisVO.getActionCount();
totalTurnedCount += analysisVO.getTurnedCount();
if (analysisVO.getActionCount() == sleepDeepActionThreshold && analysisVO.getTurnedCount() == sleepDeepActionThreshold
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr()) {
if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = voEntry.getKey();
}
sleepDeepMinute++;
continue;
}
if (StringUtils.isEmpty(startSleepDeepTime) && sleepDeepMinute == 0) {
continue;
}
if (sleepDeepMinute > sleepDeepActionTimeBegin) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startSleepDeepTime = null;
sleepDeepMinute = 0;
}
} }
}
}
// 中度睡眠 private SleepCountDTO deepSleepAndRestData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
int sleepMidMinute = 0; List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
String startSleepMidTime = null; // 入睡时间开始 String startSleepDeepTime;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { int napThreshold = Integer.parseInt(analysisModel.getNapThreshold());
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); int napDuration = Integer.parseInt(analysisModel.getNapDuration());
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue(); List<String> startTimeList = new ArrayList<>(sleepTypeMap.keySet());
if (analysisVO.getActionCount() < sleepModerateActionThreshold && analysisVO.getTurnedCount() < sleepModerateActionThreshold) { List<LocalDateTime> timeList = new ArrayList<>();
if (StringUtils.isEmpty(startSleepMidTime)) { startTimeList.forEach(t -> timeList.add(LocalDateTime.parse(t, DEFAULT_FORMATTER)));
startSleepMidTime = voEntry.getKey(); TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = new TreeMap<>();
} TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap = new TreeMap<>();
sleepMidMinute++; for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
continue; TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
} // 每分钟的数据
if (StringUtils.isEmpty(startSleepMidTime) && sleepMidMinute == 0) { int sleepMinute = sleepMap.size();
continue; Map.Entry<String, AnalysisVO> lastEntry = sleepMap.lastEntry();
} startSleepDeepTime = entry.getKey();
if (sleepMidMinute > sleepModerateActionTimeBegin) { // 睡眠:深度睡眠和浅度睡眠>3小时
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); if (sleepMinute > napThreshold * 60) {
sleepTimeAnalysisVO.setStartTime(startSleepMidTime); SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode()); sleepTimeAnalysisVO.setEndTime(lastEntry.getKey());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
} sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startSleepMidTime = null; daySleepMap.put(startSleepDeepTime, sleepMap);
sleepMidMinute = 0;
}
} }
LocalDateTime startTime = LocalDateTime.parse(startSleepDeepTime, DEFAULT_FORMATTER);
LocalDateTime repeatSleepTime = timeList.stream().filter(f -> Duration.between(startTime, f).toMinutes() <= napDuration * 60L).findFirst().orElse(null);
// 小憩:深度睡眠和浅度睡眠<=3小时,且2小时内无再次入睡
if (sleepMinute <= napThreshold * 60 && repeatSleepTime == null) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(lastEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.RESTING.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
daySleepMap.put(startSleepDeepTime, sleepMap);
}
}
// 清醒 SleepCountDTO sleepCountDTO = new SleepCountDTO();
int awakeMinute = 0; sleepCountDTO.setDaySleepMap(daySleepMap);
String startAwakeTime = null; // 入睡时间开始 sleepCountDTO.setRestSleepMap(restSleepMap);
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { return sleepCountDTO;
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); }
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue(); /**
if (analysisVO.getAwakeMinuteActionFlag() || analysisVO.getIsMoveBed()) { * 中度睡眠(体动和翻身次数10分钟内小于3次)
if (StringUtils.isEmpty(startAwakeTime)) { *
startAwakeTime = voEntry.getKey(); * @param sleepTypeMap
} * @param analysisModel
awakeMinute++; * @param sleepTimeAnalysisVOList
continue; */
} private void middleSleep(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) { List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
continue; int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
int sleepMidMinute = 0;
String startSleepMidTime = null;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue();
if (analysisVO.getActionCount() < sleepModerateActionThreshold && analysisVO.getTurnedCount() < sleepModerateActionThreshold) {
if (StringUtils.isEmpty(startSleepMidTime)) {
startSleepMidTime = voEntry.getKey();
} }
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepMidMinute++;
sleepTimeAnalysisVO.setStartTime(startAwakeTime); continue;
}
if (StringUtils.isEmpty(startSleepMidTime) && sleepMidMinute == 0) {
continue;
}
if (sleepMidMinute > sleepModerateActionTimeBegin) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepMidTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startAwakeTime = null;
awakeMinute = 0;
} }
startSleepMidTime = null;
sleepMidMinute = 0;
} }
}
}
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType); /**
List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode()); * 清醒(每分钟体动值大于60或无人)
if (CollectionUtils.isEmpty(sleepList)) { *
log.info("通过模型分析得出长者没有睡觉"); * @param sleepTypeMap
continue; * @param sleepTimeAnalysisVOList
} */
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型 private void sober(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList(); // 记录多端睡眠记录 List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
SleepTimeAnalysisVO sleepTimeAnalysis; int awakeMinute = 0;
String startAwakeTime = null;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
for (int i = 0; i < sleepList.size(); i++) { TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
sleepTimeAnalysis = new SleepTimeAnalysisVO(); for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
List<SleepTimeAnalysisVO> deepList = Lists.newArrayList(); AnalysisVO analysisVO = voEntry.getValue();
List<SleepTimeAnalysisVO> midList = Lists.newArrayList(); if (analysisVO.getAwakeMinuteActionFlag() || analysisVO.getIsMoveBed()) {
List<SleepTimeAnalysisVO> lightList = Lists.newArrayList(); if (StringUtils.isEmpty(startAwakeTime)) {
List<SleepTimeAnalysisVO> soberList = Lists.newArrayList(); startAwakeTime = voEntry.getKey();
SleepTimeAnalysisVO timeAnalysisVO = sleepList.get(i);
BeanUtils.copyProperties(timeAnalysisVO, sleepTimeAnalysis);
String startTime = timeAnalysisVO.getStartTime();
String endTime = timeAnalysisVO.getEndTime();
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
timeAnalysisVO.setInterval(durationRange);
LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
boolean lightSleepFlag = true; // 如果不满足下面条件,就默认都是浅睡
for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) || otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) {
continue;
} }
String deepStartTime = otherSleepTime.getStartTime(); awakeMinute++;
String deepEndTime = otherSleepTime.getEndTime(); continue;
LocalDateTime startDeepDateTime = LocalDateTime.parse(deepStartTime, DEFAULT_FORMATTER);
LocalDateTime endDeepDateTime = LocalDateTime.parse(deepEndTime, DEFAULT_FORMATTER);
if ((startDateTime.isBefore(startDeepDateTime) || startDateTime.equals(startDeepDateTime)) &&
(endDateTime.isAfter(endDeepDateTime) || endDateTime.equals(endDeepDateTime))) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) {
deepList.add(otherSleepTime);
} else if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_MODERATE.getCode())) {
midList.add(otherSleepTime);
} else if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) {
soberList.add(otherSleepTime);
} else {
otherSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightList.add(otherSleepTime);
}
lightSleepFlag = false;
}
}
if (lightSleepFlag) {
SleepTimeAnalysisVO lightSleepTime = new SleepTimeAnalysisVO();
lightSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightSleepTime.setStartTime(startTime);
lightSleepTime.setEndTime(endTime);
lightList.add(lightSleepTime);
}
sleepTimeAnalysis.setDeepList(deepList);
sleepTimeAnalysis.setInterval(durationRange);
sleepTimeAnalysis.setMidList(midList);
sleepTimeAnalysis.setLightList(lightList);
sleepTimeAnalysis.setSoberList(soberList);
finalSleepTimeAnalysisList.add(sleepTimeAnalysis);
}
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
.orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
// 算出每一段睡觉的不同睡眠类型的时间段
SaasSleepEvaluateStandardReportVO saasSleepEvaluateStandardReportVO = new SaasSleepEvaluateStandardReportVO();
List<PlatElderSleep> elderSleepList = Lists.newArrayList();
PlatSleepRangeVO sleepRangeVO;
for (SleepTimeAnalysisVO timeAnalysisVO : finalSleepTimeAnalysisList) {
List<PlatSleepRangeVO> sleepRangeVOList = Lists.newArrayList();
PlatElderSleep elderSleep = new PlatElderSleep();
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getDeepList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getMidList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getLightList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
for (SleepTimeAnalysisVO analysisVO : timeAnalysisVO.getSoberList()) {
sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
sleepRangeVOList.add(sleepRangeVO);
}
elderSleep.setStartSleep(LocalDateTime.parse(timeAnalysisVO.getStartTime(), DEFAULT_FORMATTER));
elderSleep.setEndSleep(LocalDateTime.parse(timeAnalysisVO.getEndTime(), DEFAULT_FORMATTER));
if (timeAnalysisVO.getInterval() / 60 > 3) {
elderSleep.setElderSleepType(ElderSleepType.SLEEP.getCode());
} else {
elderSleep.setElderSleepType(ElderSleepType.REST.getCode());
}
elderSleep.setInterval(timeAnalysisVO.getInterval());
elderSleep.setSleepRecord(sleepRangeVOList);
elderSleepList.add(elderSleep);
}
// 获取睡眠评估标准配置
String sleepDeepConfig = evaluateStandardReport.getSleepDeepConfig();
String soberConfig = evaluateStandardReport.getSoberConfig();
String sleepTimeConfig = evaluateStandardReport.getSleepTime();
String lightnessConfig = evaluateStandardReport.getSleepLightnessConfig();
List<SleepConfigVO> sleepDeepConfigList = JSON.parseArray(sleepDeepConfig, SleepConfigVO.class);
List<SleepConfigVO> soberConfigList = JSON.parseArray(soberConfig, SleepConfigVO.class);
List<SleepConfigVO> sleepTimeConfigList = JSON.parseArray(sleepTimeConfig, SleepConfigVO.class);
SleepConfigVO lightnessConfigVO = JSON.parseObject(lightnessConfig, SleepConfigVO.class);
long deepTime = 0;
long soberTime = 0;
long soberCount = 0;
long sleepTime = 0;
long lightTime = 0;
// 算出不同睡眠类型的总时长
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
timeAnalysisVO.setInterval(durationRange);
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) {
deepTime += durationRange;
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) {
soberTime += durationRange;
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_LIGHTNESS.getCode())) {
lightTime += durationRange;
soberCount++;
} }
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP.getCode())) { if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) {
sleepTime += durationRange; continue;
} }
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startAwakeTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startAwakeTime = null;
awakeMinute = 0;
} }
}
}
long deepScore = 0; private SleepTimeDTO groupSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
for (int i = 0; i < sleepDeepConfigList.size(); i++) { sleepTimeAnalysisVOList.forEach(s -> {
long hour = deepTime / 60; Long durationRange = getDurationRange(s.getStartTime(), s.getEndTime());
SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i); s.setInterval(durationRange);
long configHour = Long.parseLong(sleepConfigVO.getHour()); });
if (i == 0 && Objects.equals(hour, configHour)) { Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType);
deepScore = Long.parseLong(sleepConfigVO.getScore()); List<SleepTimeAnalysisVO> daySleepList = sleepMap.containsKey(SleepTypeEnum.DAY_SLEEP.getCode()) ? sleepMap.get(SleepTypeEnum.DAY_SLEEP.getCode()) : new ArrayList<>();
} List<SleepTimeAnalysisVO> sleepList = sleepMap.containsKey(SleepTypeEnum.SLEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP.getCode()) : new ArrayList<>();
if (i > 0 && hour > configHour) { List<SleepTimeAnalysisVO> deepList = sleepMap.containsKey(SleepTypeEnum.SLEEP_DEEP.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP_DEEP.getCode()) : new ArrayList<>();
deepScore += Long.parseLong(sleepConfigVO.getScore()); List<SleepTimeAnalysisVO> moderateList = sleepMap.containsKey(SleepTypeEnum.SLEEP_MODERATE.getCode()) ? sleepMap.get(SleepTypeEnum.SLEEP_MODERATE.getCode()) : new ArrayList<>();
} List<SleepTimeAnalysisVO> getUpList = sleepMap.containsKey(SleepTypeEnum.GETUP.getCode()) ? sleepMap.get(SleepTypeEnum.GETUP.getCode()) : new ArrayList<>();
List<SleepTimeAnalysisVO> soberList = sleepMap.containsKey(SleepTypeEnum.SOBER.getCode()) ? sleepMap.get(SleepTypeEnum.SOBER.getCode()) : new ArrayList<>();
SleepTimeDTO sleepTimeDTO = new SleepTimeDTO();
sleepTimeDTO.setDeepList(deepList);
sleepTimeDTO.setMidList(moderateList);
sleepTimeDTO.setSoberList(soberList);
sleepTimeDTO.setSleepList(sleepList);
sleepTimeDTO.setGetUpList(getUpList);
sleepTimeDTO.setDaySleepList(daySleepList);
List<SleepTimeAnalysisVO> lightSleepList = new ArrayList<>();
if (CollUtil.isNotEmpty(sleepList)) {
lightSleepList = sleepList;
if (CollUtil.isNotEmpty(deepList)) {
lightSleepList.removeAll(deepList);
} }
saasSleepEvaluateStandardReportVO.setDeepScore(deepScore); if (CollUtil.isNotEmpty(moderateList)) {
long soberScore = 0; lightSleepList.removeAll(moderateList);
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); }
sleepTimeDTO.setLightList(lightSleepList);
return sleepTimeDTO;
}
long lightScore = 0; 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;
}
long lightHour = lightTime / 60; private List<PlatElderSleep> saveElderSleep(SleepTimeDTO sleepTimeDTO, String platElderId, String currentDate) {
long lightnessConfigHour = Long.parseLong(lightnessConfigVO.getHour()); List<PlatElderSleep> elderSleepList = new ArrayList<>();
if ( Objects.equals(lightHour,lightnessConfigHour)) { List<SleepTimeAnalysisVO> deepList = sleepTimeDTO.getDeepList();
lightScore = Long.parseLong(lightnessConfigVO.getScore()); List<SleepTimeAnalysisVO> moderateList = sleepTimeDTO.getMidList();
List<SleepTimeAnalysisVO> lightList = sleepTimeDTO.getLightList();
List<SleepTimeAnalysisVO> soberList = sleepTimeDTO.getSoberList();
List<SleepTimeAnalysisVO> sleepList = sleepTimeDTO.getSleepList();
List<SleepTimeAnalysisVO> restList = sleepTimeDTO.getRestList();
if (CollUtil.isNotEmpty(sleepList)) {
for (SleepTimeAnalysisVO analysisVO : sleepList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
saasSleepEvaluateStandardReportVO.setLightScore(lightScore); }
if (CollUtil.isNotEmpty(restList)) {
long sleepScore = 0; for (SleepTimeAnalysisVO analysisVO : restList) {
for (int i = 0; i < sleepTimeConfigList.size(); i++) { PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
long hour = sleepTime / 60; sleepRangeVO.setStartTime(analysisVO.getStartTime());
SleepConfigVO sleepConfigVO = sleepTimeConfigList.get(i); sleepRangeVO.setEndTime(analysisVO.getEndTime());
long configHour = Long.parseLong(sleepConfigVO.getHour()); sleepRangeVO.setSleepType(analysisVO.getType());
if (i == 0 && Objects.equals(hour, configHour)) { PlatElderSleep platElderSleep = new PlatElderSleep();
sleepScore = Long.parseLong(sleepConfigVO.getScore());
} platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
if (i > 0 && hour > configHour) { platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
sleepScore += Long.parseLong(sleepConfigVO.getScore()); platElderSleep.setElderId(platElderId);
} platElderSleep.setElderSleepType(SleepTypeEnum.RESTING.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(deepList)) {
for (SleepTimeAnalysisVO analysisVO : deepList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP_DEEP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(moderateList)) {
for (SleepTimeAnalysisVO analysisVO : sleepTimeDTO.getMidList()) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP_MODERATE.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(lightList)) {
for (SleepTimeAnalysisVO analysisVO : lightList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP_LIGHTNESS.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(soberList)) {
for (SleepTimeAnalysisVO analysisVO : soberList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.SOBER.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
List<SleepTimeAnalysisVO> getUpList = sleepTimeDTO.getGetUpList();
if (CollUtil.isNotEmpty(getUpList)) {
for (SleepTimeAnalysisVO analysisVO : getUpList) {
PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
sleepRangeVO.setSleepType(analysisVO.getType());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setElderSleepType(SleepTypeEnum.GETUP.getType());
platElderSleep.setSleepRecord(Lists.newArrayList(sleepRangeVO));
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
} }
saasSleepEvaluateStandardReportVO.setSleepScore(sleepScore); }
long totalScore = sleepScore + deepScore + lightScore - soberScore; platElderSleepService.saveBatch(elderSleepList);
saasSleepEvaluateStandardReportVO.setTotalScore(totalScore); return elderSleepList;
}
// 记录长者一天睡眠的记录 private SleepTimeMinuteDTO getSleepTimeMinute(SleepTimeDTO sleepTimeDTO) {
long daySleepTime = 0; SleepTimeMinuteDTO result = new SleepTimeMinuteDTO();
long dayRestTime = 0; result.setDaySleepTime(CollUtil.isNotEmpty(sleepTimeDTO.getSleepList()) ? sleepTimeDTO.getSleepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
for (PlatElderSleep elderSleep : elderSleepList) { result.setDeepTime(CollUtil.isNotEmpty(sleepTimeDTO.getDeepList()) ? sleepTimeDTO.getDeepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
elderSleep.setElderId(elder.getId()); result.setLightTime(CollUtil.isNotEmpty(sleepTimeDTO.getLightList()) ? sleepTimeDTO.getLightList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
elderSleep.setHappenDate(currentDate); result.setSoberTime(CollUtil.isNotEmpty(sleepTimeDTO.getSoberList()) ? sleepTimeDTO.getSoberList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
elderSleep.setTenantId(tenantId); return result;
}
if (ElderSleepType.SLEEP.getCode() == elderSleep.getElderSleepType()) { @Override
daySleepTime += elderSleep.getInterval(); @Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day) {
List<String> dayHourRangeList = getLastDayHourRange(month, day);
String currentDate = LocalDate.now().minusDays(1).toString();
if (month != null && day != null) {
currentDate = LocalDate.of(2024, month, day).minusDays(1).toString();
}
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
List<PlatRoomBedDevice> platRoomBedDeviceList = roomBedDeviceService.list(new QueryWrapper<PlatRoomBedDevice>()
.lambda().isNotNull(PlatRoomBedDevice::getBedId));
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
.orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
double sleepTimeActionDuration = Double.parseDouble(analysisModel.getSleepTimeActionDuration());
int riseActionDuration = Integer.parseInt(analysisModel.getRiseActionDuration());
double riseLeaveThreshold = Double.parseDouble(analysisModel.getRiseLeaveThreshold());
double 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;
}
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;
} }
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);
} }
} }
platElderSleepService.saveBatch(elderSleepList); if (CollUtil.isEmpty(totalMap)) {
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport); continue;
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score)); }
// 记录长者不同类型的睡眠时间
// 长者一天的睡眠分析 List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis(); // 入睡时间
elderSleepAnalysis.setElderId(elder.getId()); TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap =
elderSleepAnalysis.setActionCount(totalActionCount); getFallAsleepData(totalMap, sleepTimeActionDuration, sleepTimeAnalysisVOList);
elderSleepAnalysis.setTurnedCount(totalTurnedCount); // 获取睡眠和小憩
elderSleepAnalysis.setHappenDate(currentDate); SleepCountDTO sleepCountDTO = deepSleepAndRestData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
elderSleepAnalysis.setSleepScore(score); // 满足睡眠条件的map
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime)); TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = sleepCountDTO.getDaySleepMap();
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime)); // 深度睡眠
elderSleepAnalysis.setSleepResult(sleepReport.getResult()); deepSleepData(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
elderSleepAnalysis.setTenantId(tenantId); // 中度睡眠
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate()); middleSleep(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId()); // 清醒
result.add(elderSleepAnalysis); sober(sleepTypeMap, sleepTimeAnalysisVOList);
platElderSleepAnalysisService.save(elderSleepAnalysis); // 起床
getUp(totalMap, riseLeaveThreshold, riseActionDuration, repeatSleepThreshold, sleepTimeAnalysisVOList, sleepCountDTO);
//浅睡
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList);
List<PlatElderSleep> platElderSleeps = saveElderSleep(sleepTimeDTO, elder.getId(), currentDate);
PlatElderSleepAnalysis platElderSleepAnalysis = savePlatElderSleepAnalysis(sleepTimeDTO, evaluateStandardReport, elder.getId(), currentDate,
sleepCountDTO, tenantId, platDevice.getOriDeviceId());
ElderSleepAnalysisVO analysisVO = BeanUtil.copyProperties(platElderSleepAnalysis, ElderSleepAnalysisVO.class);
analysisVO.setPlatElderSleeps(platElderSleeps);
result.add(analysisVO);
} }
return result; return result;
} }
...@@ -787,11 +883,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -787,11 +883,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault())); return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
} }
public List<String> getLastDayHourRange(Integer month,Integer day) { public List<String> getLastDayHourRange(Integer month, Integer day) {
int count = 24; int count = 24;
LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime = LocalDateTime.now();
if (month != null && day != null) { if (month != null && day != null) {
localDateTime = LocalDateTime.of(LocalDate.of(2023, month, day), LocalTime.now()); localDateTime = LocalDateTime.of(LocalDate.of(2024, month, day), LocalTime.now());
} }
List<String> list = Lists.newArrayList(); List<String> list = Lists.newArrayList();
String startTime; String startTime;
...@@ -804,113 +900,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -804,113 +900,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return list; return list;
} }
public static LocalDateTime getDayStart(LocalDate time) {
return time.atTime(0, 0, 0);
}
@Override
public void test1() {
int days = 30;
LocalDateTime localDateTime = LocalDateTime.now().minusDays(28);
List<String> timeRangeList = Lists.newArrayList();
PlatElder elder = platElderService.getById("1704706233484742658");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
int sleepNumber = 6;
SleepTypeEnum[] values = SleepTypeEnum.values();
for (int i = 0; i < days; i++) {
String lastDate = localDateTime.format(timeFormatter);
localDateTime = localDateTime.plusDays(1);
String currentDate = localDateTime.format(timeFormatter);
PlatElderSleep platElderSleep = new PlatElderSleep();
String sleepStartTime = lastDate + " 22:00";
String sleepEndTime = currentDate + " 08:00";
LocalDateTime startTime = LocalDateTime.parse(sleepStartTime, DEFAULT_FORMATTER);
LocalDateTime endTime = LocalDateTime.parse(sleepEndTime, DEFAULT_FORMATTER);
platElderSleep.setStartSleep(startTime);
platElderSleep.setEndSleep(endTime);
platElderSleep.setElderSleepType(1);
platElderSleep.setElderId(elder.getId());
platElderSleep.setHappenDate(currentDate);
platElderSleep.setTenantId(elder.getTenantId());
List<PlatSleepRangeVO> rangeVOList = Lists.newArrayList();
String start = "";
String end = "";
for (int i1 = 0; i1 < sleepNumber; i1++) {
PlatSleepRangeVO rangeVO = new PlatSleepRangeVO();
int random = RandomUtils.nextInt(0, 4);
long randomLong = RandomUtils.nextLong(1, 3);
SleepTypeEnum sleepTypeEnum = values[random];
rangeVO.setSleepType(sleepTypeEnum.getCode());
start = startTime.format(DEFAULT_FORMATTER);
LocalDateTime dateTime = startTime.plusHours(randomLong);
end = dateTime.format(DEFAULT_FORMATTER);
rangeVO.setStartTime(start);
rangeVO.setEndTime(end);
startTime = LocalDateTime.parse(end, DEFAULT_FORMATTER);
rangeVOList.add(rangeVO);
}
platElderSleep.setSleepRecord(rangeVOList);
//platElderSleepService.save(platElderSleep);
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elder.getId());
elderSleepAnalysis.setActionCount(700);
elderSleepAnalysis.setTurnedCount(500);
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore("80");
elderSleepAnalysis.setSleepTime("600");
elderSleepAnalysis.setRestTime("840");
elderSleepAnalysis.setSleepResult("良好");
elderSleepAnalysis.setTenantId(elder.getTenantId());
elderSleepAnalysis.setSleepEvaluate("不错");
//platElderSleepAnalysisService.save(elderSleepAnalysis);
PlatElderBreatheDayStat elderBreatheDayStat = new PlatElderBreatheDayStat();
elderBreatheDayStat.setElderId(elder.getId());
elderBreatheDayStat.setDeviceId("1704705639248334849");
elderBreatheDayStat.setOriDeviceId("218A00XE26691FC");
elderBreatheDayStat.setDay(localDateTime.toLocalDate());
elderBreatheDayStat.setHeartRateMax(72);
elderBreatheDayStat.setHeartRateMax(60);
elderBreatheDayStat.setHeartRateMax(65);
elderBreatheDayStat.setRespiratoryRateAvg(14);
elderBreatheDayStat.setRespiratoryRateMax(18);
elderBreatheDayStat.setRespiratoryRateMin(12);
elderBreatheDayStat.setTenantId(elder.getTenantId());
//platElderBreatheDayStatService.save(elderBreatheDayStat);
PlatElderReportMonth platElderReportMonth = new PlatElderReportMonth();
platElderReportMonth.setElderId(elder.getId());
platElderReportMonth.setDay(localDateTime.toLocalDate());
platElderReportMonth.setTenantId(elder.getTenantId());
platElderReportMonth.setSleepResult("良好");
platElderReportMonth.setRespiratoryExceptionCount(0);
platElderReportMonth.setHeartExceptionCount(0);
platElderReportMonth.setBehaviorExceptionCount(0);
platElderReportMonth.setOffBedExceptionCount(0);
platElderReportMonth.setHeartRate(80);
platElderReportMonth.setRespiratoryRate(20);
platElderReportMonth.setFailCount(0);
platElderReportMonthService.save(platElderReportMonth);
PlatElderBreatheAnalysis platElderBreatheAnalysis = new PlatElderBreatheAnalysis();
platElderBreatheAnalysis.setElderId(elder.getId());
platElderBreatheAnalysis.setAvgBreatheRate("65");
platElderBreatheAnalysis.setAvgHeartRate("14");
platElderBreatheAnalysis.setBreatheScore("60");
platElderBreatheAnalysis.setBreatheResult("良好");
platElderBreatheAnalysis.setHappenDate(currentDate);
platElderBreatheAnalysis.setTenantId(elder.getTenantId());
platElderBreatheAnalysis.setBreatheEvaluate("还不错");
//platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
}
}
} }
...@@ -78,10 +78,9 @@ public class PlatRegionSettingServiceImpl extends ServiceImpl<PlatRegionSettingM ...@@ -78,10 +78,9 @@ public class PlatRegionSettingServiceImpl extends ServiceImpl<PlatRegionSettingM
if(map.get(item)!=null){ if(map.get(item)!=null){
String attribute = map.get(item); String attribute = map.get(item);
PlatDeviceAttrWechatDTO deviceAttrWechatDTO = JsonUtil.toObj(attribute,PlatDeviceAttrWechatDTO.class); PlatDeviceAttrWechatDTO deviceAttrWechatDTO = JsonUtil.toObj(attribute,PlatDeviceAttrWechatDTO.class);
if (deviceAttrWechatDTO == null || deviceAttrWechatDTO.getRadarMount() == null) { if (deviceAttrWechatDTO != null) {
continue; platRegionSetting.setInstallType(deviceAttrWechatDTO.getRadarMount().toString());
} }
platRegionSetting.setInstallType(deviceAttrWechatDTO.getRadarMount().toString());
} }
list.add(platRegionSetting); list.add(platRegionSetting);
} }
......
package com.makeit.service.wechat.impl; package com.makeit.service.wechat.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.makeit.dto.platform.auth.PlatOrgSplitDTO;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo; import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import com.makeit.entity.saas.PlatTenant; import com.makeit.entity.saas.PlatTenant;
import com.makeit.enums.Const;
import com.makeit.enums.HeaderConst;
import com.makeit.global.aspect.misc.nofill.NoFillUtil; import com.makeit.global.aspect.misc.nofill.NoFillUtil;
import com.makeit.service.platform.elder.PlatElderChildrenInfoService; import com.makeit.service.platform.elder.PlatElderChildrenInfoService;
import com.makeit.service.saas.PlatTenantService; import com.makeit.service.saas.PlatTenantService;
...@@ -16,8 +13,8 @@ import com.makeit.utils.msg.config.WxConfig; ...@@ -16,8 +13,8 @@ import com.makeit.utils.msg.config.WxConfig;
import com.makeit.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import com.makeit.utils.sys.FileUtil; import com.makeit.utils.sys.FileUtil;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO; import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.third.wechat.WxUserInfo;
import com.makeit.utils.third.wechat.WechatUtil; import com.makeit.utils.third.wechat.WechatUtil;
import com.makeit.utils.third.wechat.WxUserInfo;
import com.makeit.utils.user.TokenUtil; import com.makeit.utils.user.TokenUtil;
import com.makeit.utils.user.wechat.WechatUserInfo; import com.makeit.utils.user.wechat.WechatUserInfo;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -60,7 +57,7 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde ...@@ -60,7 +57,7 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde
childrenInfo.setOpenid(userInfo.getOpenId()); childrenInfo.setOpenid(userInfo.getOpenId());
childrenInfo.setName(userInfo.getNickName()); childrenInfo.setName(userInfo.getNickName());
childrenInfo.setWeChatOpenid(dto.getWeChatOpenid());
childrenInfo.setCreateBy(userInfo.getNickName()); childrenInfo.setCreateBy(userInfo.getNickName());
childrenInfo.setUpdateBy(userInfo.getNickName()); childrenInfo.setUpdateBy(userInfo.getNickName());
childrenInfo.setPhone(userInfo.getPhoneNumber()); childrenInfo.setPhone(userInfo.getPhoneNumber());
......
...@@ -21,9 +21,13 @@ public class PlatElderSleepDiagramVO { ...@@ -21,9 +21,13 @@ public class PlatElderSleepDiagramVO {
@ApiModelProperty("图表集合") @ApiModelProperty("图表集合")
private List<PlatElderSleepDiagramContentVO> contentList; private List<PlatElderSleepDiagramContentVO> contentList;
@ApiModelProperty(value = "睡眠类型 1 睡眠 2 小憩") @ApiModelProperty(value = "睡眠类型 1 睡眠 2 小憩,3:深度睡眠,4:中度睡眠,5:浅度睡眠, 6:清醒,7:起床")
private Integer elderSleepType; private Integer elderSleepType;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
@ApiModelProperty("起床时间")
private LocalDateTime newWakeUpAt;
} }
package com.makeit.vo.platform.elder;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author wangzy
* @description
* @createDate 2023-12-29-14:48
*/
@Data
public class wakeUpAnalysisVO {
private List<LocalDateTime> wakeUpList;
private List<LocalDateTime> leaveOverTimeList;
private String elderId;
private String name;
}
...@@ -42,17 +42,20 @@ public class MqttPushClient { ...@@ -42,17 +42,20 @@ public class MqttPushClient {
try { try {
client = new MqttClient(host, clientId, new MemoryPersistence()); client = new MqttClient(host, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions(); MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true); options.setCleanSession(false);
options.setUserName(username); options.setUserName(username);
options.setPassword(password.toCharArray()); options.setPassword(password.toCharArray());
options.setConnectionTimeout(timeout); options.setConnectionTimeout(timeout);
options.setKeepAliveInterval(keepalive); options.setKeepAliveInterval(keepalive);
options.setAutomaticReconnect(true);
MqttPushClient.setMqttClient(client); MqttPushClient.setMqttClient(client);
try { if (!client.isConnected()) {
client.setCallback(pushCallback); try {
client.connect(options); client.setCallback(pushCallback);
} catch (Exception e) { client.connect(options);
e.printStackTrace(); } catch (Exception e) {
e.printStackTrace();
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -30,10 +30,7 @@ import com.makeit.utils.DeviceCacheUtil; ...@@ -30,10 +30,7 @@ import com.makeit.utils.DeviceCacheUtil;
import com.makeit.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import com.makeit.utils.redis.RedisUtil; import com.makeit.utils.redis.RedisUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -50,7 +47,7 @@ import java.util.concurrent.TimeUnit; ...@@ -50,7 +47,7 @@ import java.util.concurrent.TimeUnit;
@Component @Component
public class PushCallback implements MqttCallback { public class PushCallback implements MqttCallbackExtended {
private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class); private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);
public static final String DEVICE_BR_DATA = "device:brhr:data:"; public static final String DEVICE_BR_DATA = "device:brhr:data:";
...@@ -102,8 +99,21 @@ public class PushCallback implements MqttCallback { ...@@ -102,8 +99,21 @@ public class PushCallback implements MqttCallback {
@Override @Override
public void connectionLost(Throwable cause) { public void connectionLost(Throwable cause) {
logger.info("连接断开,可以重连"); logger.info("连接断开,可以重连");
if (client == null || !client.isConnected()) { int times = 1;
mqttConfig.getMqttPushClient(); while (client == null || !client.isConnected()) {
logger.info("重新连接, 第" + (times++) + "次");
MqttPushClient mqttPushClient = mqttConfig.getMqttPushClient();
if (mqttPushClient != null && mqttPushClient.getMqttClient() != null && mqttPushClient.getMqttClient().isConnected()) {
logger.info("重连成功");
break;
}
logger.info("重连失败");
// 每隔10秒重试一次
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} }
...@@ -127,6 +137,11 @@ public class PushCallback implements MqttCallback { ...@@ -127,6 +137,11 @@ public class PushCallback implements MqttCallback {
logger.info("deliveryComplete--------------" + token.isComplete()); logger.info("deliveryComplete--------------" + token.isComplete());
} }
@Override
public void connectComplete(boolean b, String s) {
logger.info("连接成功,连接方式:{}", b ? "重连" : "直连");
}
/** /**
* IOT端设备属性修改后同步 * IOT端设备属性修改后同步
* @param device * @param device
......
...@@ -9,8 +9,11 @@ import com.makeit.module.iot.service.IotOrgService; ...@@ -9,8 +9,11 @@ import com.makeit.module.iot.service.IotOrgService;
import com.makeit.module.iot.service.IotProductDeviceService; import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.service.IotTokenService; import com.makeit.module.iot.service.IotTokenService;
import com.makeit.service.platform.alarm.alarmStrategy.OffBedAlarm; import com.makeit.service.platform.alarm.alarmStrategy.OffBedAlarm;
import com.makeit.service.platform.elder.PlatElderSleepService;
import com.makeit.utils.redis.RedisUtil; import com.makeit.utils.redis.RedisUtil;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
...@@ -27,6 +30,11 @@ public class IotDeviceInfoContentFall { ...@@ -27,6 +30,11 @@ public class IotDeviceInfoContentFall {
private IotProductDeviceService iotProductDeviceService; private IotProductDeviceService iotProductDeviceService;
@Autowired @Autowired
private OffBedAlarm offBedAlarm; private OffBedAlarm offBedAlarm;
@Autowired
private PlatElderSleepService platElderSleepService;
private static final Logger logger = LoggerFactory.getLogger(IotDeviceInfoContentFall.class);
@Test @Test
......
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