Commit ce1e9c90 by 罗志长

Merge branch 'dev'

parents 8e1d0ca8 3eb46154
Showing with 1376 additions and 695 deletions
...@@ -46205,6 +46205,9 @@ INSERT INTO `saas_menu` VALUES ('1699779383360856066', '0', '数据分析', NULL ...@@ -46205,6 +46205,9 @@ INSERT INTO `saas_menu` VALUES ('1699779383360856066', '0', '数据分析', NULL
INSERT INTO `saas_menu` VALUES ('1701192156686856193', '0', '空间管理', NULL, 'QuestionFilled', 500, '1', '1', NULL, NULL, NULL, NULL, '1', '2023-09-11 19:13:11', '2023-09-11 19:13:11', '0', NULL, 'root', 'root', NULL, NULL); INSERT INTO `saas_menu` VALUES ('1701192156686856193', '0', '空间管理', NULL, 'QuestionFilled', 500, '1', '1', NULL, NULL, NULL, NULL, '1', '2023-09-11 19:13:11', '2023-09-11 19:13:11', '0', NULL, 'root', 'root', NULL, NULL);
INSERT INTO `saas_menu` VALUES ('1702153993116991489', '1699779383360856066', '模型管理', 'saasAnalysisModelList', NULL, 500, '1', '2', '/saas/analysis/model-list', NULL, NULL, NULL, '1', '2023-09-14 10:55:11', '2023-09-14 10:55:11', '0', NULL, 'root', 'root', 'list', NULL); INSERT INTO `saas_menu` VALUES ('1702153993116991489', '1699779383360856066', '模型管理', 'saasAnalysisModelList', NULL, 500, '1', '2', '/saas/analysis/model-list', NULL, NULL, NULL, '1', '2023-09-14 10:55:11', '2023-09-14 10:55:11', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1702227189241573378', '1699779383360856066', '报告管理', 'saasAnalysisReportList', NULL, 500, '1', '2', '/saas/analysis/report-list', NULL, NULL, NULL, '1', '2023-09-14 15:46:02', '2023-09-14 15:46:02', '0', NULL, 'root', 'root', 'list', NULL); INSERT INTO `saas_menu` VALUES ('1702227189241573378', '1699779383360856066', '报告管理', 'saasAnalysisReportList', NULL, 500, '1', '2', '/saas/analysis/report-list', NULL, NULL, NULL, '1', '2023-09-14 15:46:02', '2023-09-14 15:46:02', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1731523714760503298', '1699699374096998402', '租户设备日志', 'saasTenantDeviceLogList', NULL, 500, '1', '2', '/saas/tenant/device-log-list', NULL, NULL, NULL, '1', '2023-12-04 11:59:58', '2023-12-04 11:59:58', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1735846783046008833', '1699699374096998402', '声网PID管理', 'saasTenantSwPidList', NULL, 500, '1', '2', '/saas/tenant/sw-pid-list', NULL, NULL, NULL, '1', '2023-12-16 10:18:18', '2023-12-16 10:18:18', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1751073621548666882', '1699699374096998402', 'OpenAPI管理', 'saasTenantOpenApiList', NULL, 500, '1', '2', '/saas/tenant/open-api-list', NULL, NULL, NULL, '1', '2024-01-27 10:44:19', '2024-01-27 10:44:19', '0', NULL, 'root', 'root', 'list', NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for saas_model_manage -- Table structure for saas_model_manage
INSERT INTO sys_dictionary (id, code, name, value, sort, description, category_id, create_date,
INSERT INTO sys_dictionary (id, code, name, value, sort, description, category_id, create_date,
update_date, del_flag, create_by, update_by, eng_name)
VALUES ('213', 'alarm.sendType.childWechat', '子女端小程序', '6', 4, '', '201', '2022-05-16 17:13:23',
'2022-05-16 17:13:27', '0', null, null, null);
\ No newline at end of file
...@@ -20,7 +20,10 @@ public class AnalysisVO { ...@@ -20,7 +20,10 @@ public class AnalysisVO {
private Boolean isAction; // 每分钟是否动过 private Boolean isAction; // 每分钟是否动过
private Boolean isMoveBed; // 是否离开床 /**
* 是否离开床或无人
*/
private Boolean isMoveBed;
private Boolean isMinuteActionFlag; // 每分钟体动值是否大于阈值 private Boolean isMinuteActionFlag; // 每分钟体动值是否大于阈值
...@@ -49,6 +52,10 @@ public class AnalysisVO { ...@@ -49,6 +52,10 @@ public class AnalysisVO {
private int hrSlow; // 当前心率 private int hrSlow; // 当前心率
private String hrSlowTime; // 发生时间 private String hrSlowTime; // 发生时间
private String createdTime;
private String deviceId;
// private Integer sleepDeepMinuteCount; // 深睡每分钟体动和翻身次数 // private Integer sleepDeepMinuteCount; // 深睡每分钟体动和翻身次数
......
...@@ -20,4 +20,6 @@ public class SleepCountDTO { ...@@ -20,4 +20,6 @@ public class SleepCountDTO {
private TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap; private TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap;
private TreeMap<String, TreeMap<String, AnalysisVO>> allSleepMap;
} }
...@@ -17,10 +17,9 @@ public class SleepTimeAnalysisVO { ...@@ -17,10 +17,9 @@ public class SleepTimeAnalysisVO {
*/ */
private String endTime; private String endTime;
/** private String getUpTime;
* 起床时间
*/ private String remark;
private String newEndTime;
/** /**
* 间隔时间(分钟) * 间隔时间(分钟)
...@@ -32,6 +31,20 @@ public class SleepTimeAnalysisVO { ...@@ -32,6 +31,20 @@ public class SleepTimeAnalysisVO {
*/ */
private String type; private String type;
/**
* 体动次数
*/
private Integer actionCount;
/**
* 翻身次数
*/
private Integer turnedCount;
/**
* 所属睡眠区间开始时间
*/
private String belongToSleepTime;
private List<SleepTimeAnalysisVO> deepList; private List<SleepTimeAnalysisVO> deepList;
private List<SleepTimeAnalysisVO> midList; private List<SleepTimeAnalysisVO> midList;
/** /**
......
...@@ -44,7 +44,7 @@ public class WxSpSender implements IMsgSender{ ...@@ -44,7 +44,7 @@ public class WxSpSender implements IMsgSender{
public void send(MsgSendDTO msgDTO) { public void send(MsgSendDTO msgDTO) {
List<MsgSendDTO.ReceiverInfo> receiverInfos = msgDTO.getReceiverInfos(); List<MsgSendDTO.ReceiverInfo> receiverInfos = msgDTO.getReceiverInfos();
if (CollUtil.isNotEmpty(receiverInfos)) { if (CollUtil.isEmpty(receiverInfos)) {
return; return;
} }
String content = msgDTO.getOriContent(); String content = msgDTO.getOriContent();
......
package com.makeit.utils.third.wechat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-26-14:09
*/
@Data
public class WechatBindDTO {
@ApiModelProperty(value = "用户id")
private String id;
@ApiModelProperty(value = "微信公众号openid")
private String weChatOpenid;
private String appid;
private String secret;
private String code;
private String grantType;
}
package com.makeit.utils.third.wechat;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-30-16:57
*/
@Data
public class WechatCodeDTO {
// {"access_token":"77_hfkGpaiIT8xPltYrmRmrHj_svTcoLKIvR-w_lkR_wWqGHyF1NnZiIvIg0LxnI2rO55U2NqSGpXStYFmwxPE2mO0gNyfUrGvHUMcckrNNM9I",
// "expires_in":7200,
// "refresh_token":"77_MFeHId8uo1EgV6NFlhDiaQMrK6FXGmKcDMfa-BqGOaWr20u-6aM4lkBx1fnsSMrgL5m_Q3Csdw8D4Z3_qmpDj0kZKMXLmTzxosLz2BEqJHs",
// "openid":"o1es866cj4fp2Np9S5rmnbIdSg4U",
// "scope":"snsapi_base"}
private String accessToken;
private String openid;
private String scope;
}
...@@ -56,5 +56,7 @@ public class WechatUserInfo implements Serializable { ...@@ -56,5 +56,7 @@ public class WechatUserInfo implements Serializable {
private String isTenant; private String isTenant;
private String weChatOpenid;
} }
...@@ -4,6 +4,7 @@ import com.makeit.common.response.ApiResponseEntity; ...@@ -4,6 +4,7 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils; import com.makeit.common.response.ApiResponseUtils;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.wechat.PlatElderChildrenInfoUserLoginWechatService; import com.makeit.service.wechat.PlatElderChildrenInfoUserLoginWechatService;
import com.makeit.utils.third.wechat.WechatBindDTO;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO; import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.user.wechat.WechatUserInfo; import com.makeit.utils.user.wechat.WechatUserInfo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -37,4 +38,12 @@ public class PlatElderChildrenInfoUserLoginChildrenController { ...@@ -37,4 +38,12 @@ public class PlatElderChildrenInfoUserLoginChildrenController {
return ApiResponseUtils.success(); return ApiResponseUtils.success();
} }
@ApiOperation(value = "绑定公众号")
@PostMapping(value = "/bind")
@TenantIdIgnore
public ApiResponseEntity<Void> bind(@RequestBody WechatBindDTO dto) {
platElderChildrenInfoUserLoginWechatService.bind(dto);
return ApiResponseUtils.success();
}
} }
...@@ -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;
...@@ -73,7 +74,7 @@ public class PlatElderSleepController { ...@@ -73,7 +74,7 @@ public class PlatElderSleepController {
@GetMapping("test4") @GetMapping("test4")
@AuthIgnore @AuthIgnore
@TenantIdIgnore @TenantIdIgnore
public ApiResponseEntity<List<PlatElderSleepAnalysis>> elderSleepSleepAnalysisTask(@RequestParam Integer month, public ApiResponseEntity<List<ElderSleepAnalysisVO>> elderSleepSleepAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) { @RequestParam Integer day) {
return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day)); return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day));
} }
......
package com.makeit.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:42
*/
@Data
public class SaveLogDTO {
@JsonProperty("messageType")
private String messageType;
@JsonProperty("deviceId")
private String deviceId;
@JsonProperty("reportTime")
private LocalDateTime reportTime;
@JsonProperty("createdTime")
private LocalDateTime createdTime;
@JsonProperty("br")
private Integer br;
@JsonProperty("bodyMove")
private Integer bodyMove;
@JsonProperty("personState")
private Integer personState;
@JsonProperty("person")
private Integer person;
@JsonProperty("hr")
private Integer hr;
}
...@@ -45,7 +45,7 @@ public class PlatTenant extends BaseEntity { ...@@ -45,7 +45,7 @@ public class PlatTenant extends BaseEntity {
private String menuList; private String menuList;
/** /**
* 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单 * 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单 6-微信公众号
*/ */
private String alertChannel; private String alertChannel;
......
...@@ -2,7 +2,10 @@ package com.makeit.mapper.platform.auth; ...@@ -2,7 +2,10 @@ package com.makeit.mapper.platform.auth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.dto.SaveLogDTO;
import com.makeit.entity.platform.auth.PlatOrg; import com.makeit.entity.platform.auth.PlatOrg;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
...@@ -15,4 +18,10 @@ import java.util.List; ...@@ -15,4 +18,10 @@ import java.util.List;
public interface PlatOrgMapper extends BaseMapper<PlatOrg> { public interface PlatOrgMapper extends BaseMapper<PlatOrg> {
List<PlatOrg> getSelfAndParents(String id); List<PlatOrg> getSelfAndParents(String id);
void insertBatch(@Param("list") List<SaveLogDTO> saveList);
void saveBatch(@Param("list")List<AnalysisVO> list);
List<AnalysisVO> getData();
} }
...@@ -2,6 +2,9 @@ package com.makeit.mapper.platform.elder; ...@@ -2,6 +2,9 @@ package com.makeit.mapper.platform.elder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo; import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* <p> * <p>
...@@ -13,4 +16,5 @@ import com.makeit.entity.platform.elder.PlatElderChildrenInfo; ...@@ -13,4 +16,5 @@ import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
*/ */
public interface PlatElderChildrenInfoMapper extends BaseMapper<PlatElderChildrenInfo> { public interface PlatElderChildrenInfoMapper extends BaseMapper<PlatElderChildrenInfo> {
List<PlatElderChildrenInfo> list(@Param("tenantId") String tenantId, @Param("elderIds") String elderIds);
} }
package com.makeit.service.platform.alarm.alarmStrategy; package com.makeit.service.platform.alarm.alarmStrategy;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO; import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigOffBedDTOVO; import com.makeit.dto.platform.alarm.PlatAlarmConfigOffBedDTOVO;
...@@ -27,6 +28,7 @@ import java.time.*; ...@@ -27,6 +28,7 @@ import java.time.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Component @Component
@Slf4j @Slf4j
...@@ -315,6 +317,9 @@ public class OffBedAlarm implements IAlarm { ...@@ -315,6 +317,9 @@ public class OffBedAlarm implements IAlarm {
return; return;
} }
// PlatRoom platRoom = platAlarmCheckDTO.getPlatRoom(); // PlatRoom platRoom = platAlarmCheckDTO.getPlatRoom();
log.info("离床告警配置,发出告警,设备id:{},长者名称:{},config_id:{},configL{}", platDevice.getId(), JSONUtil.toJsonStr(platElderList),
config.getId(), config.getRuleConfig());
platElderList = platElderList.stream().distinct().collect(Collectors.toList());
for (PlatElder platElder : platElderList) { for (PlatElder platElder : platElderList) {
List<String> param = new ArrayList<>(); List<String> param = new ArrayList<>();
// param.add(platRoom.getName()); // param.add(platRoom.getName());
......
...@@ -33,6 +33,7 @@ import com.makeit.enums.report.PlatformTypeEnum; ...@@ -33,6 +33,7 @@ import com.makeit.enums.report.PlatformTypeEnum;
import com.makeit.exception.BusinessException; import com.makeit.exception.BusinessException;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper; import com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper;
import com.makeit.mapper.platform.elder.PlatElderChildrenInfoMapper;
import com.makeit.module.iot.service.IotDevicePropertiesOperateService; import com.makeit.module.iot.service.IotDevicePropertiesOperateService;
import com.makeit.service.platform.alarm.PlatAlarmConfigService; import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.PlatAlarmRecordService; import com.makeit.service.platform.alarm.PlatAlarmRecordService;
...@@ -67,6 +68,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -67,6 +68,7 @@ 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 javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -113,6 +115,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -113,6 +115,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
private ShengwangService shengwangService; private ShengwangService shengwangService;
@Autowired @Autowired
private IotDevicePropertiesOperateService iotDevicePropertiesOperateService; private IotDevicePropertiesOperateService iotDevicePropertiesOperateService;
@Resource
private PlatElderChildrenInfoMapper platElderChildrenInfoMapper;
@Override @Override
...@@ -316,27 +320,27 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -316,27 +320,27 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
List<PlatElderChildrenInfo> allChildInfoList = new ArrayList<>(); List<PlatElderChildrenInfo> allChildInfoList = new ArrayList<>();
//通知每个长者的子女 //通知每个长者的子女
LambdaQueryWrapper<PlatElderChildrenInfo> childrenInfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PlatElderChildrenInfo> childrenInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
childrenInfoLambdaQueryWrapper.eq(BaseBusEntity::getTenantId, alarmConfig.getTenantId()); childrenInfoLambdaQueryWrapper.eq(BaseBusEntity::getTenantId, alarmConfig.getTenantId());
childrenInfoLambdaQueryWrapper.and(qw -> qw.apply("find_in_set('" + elderIds + "',elder_id)")); childrenInfoLambdaQueryWrapper.and(qw -> qw.apply("find_in_set('" + elderIds + "',elder_id)"));
List<PlatElderChildrenInfo> childrenInfoList = platElderChildrenInfoService.list(childrenInfoLambdaQueryWrapper); List<PlatElderChildrenInfo> childrenInfoList = platElderChildrenInfoService.list(childrenInfoLambdaQueryWrapper);
if (CollectionUtils.isEmpty(childrenInfoList)) { if (CollectionUtils.isEmpty(childrenInfoList)) {
throw new BusinessException("子女端账号未绑定长者,长者id:"+elderIds); throw new BusinessException("子女端账号未绑定长者,长者id:" + elderIds);
} }
allChildInfoList.addAll(childrenInfoList); allChildInfoList.addAll(childrenInfoList);
Set<String> phoneSet = childrenInfoList.stream().map(PlatElderChildrenInfo::getPhone).collect(Collectors.toSet()); Set<String> phoneSet = childrenInfoList.stream().map(PlatElderChildrenInfo::getPhone).collect(Collectors.toSet());
//告警配置和租户告警 字典一致 //告警配置和租户告警 字典一致 todo SendTypeEnum.CHILD_WECHAT 公众号模板未好
List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS, SendTypeEnum.CHILD_WECHAT); List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS);
List<MsgSendDTO.ReceiverInfo> receiverInfos = buildReceiverInfo(allChildInfoList, alarmRecord); List<MsgSendDTO.ReceiverInfo> receiverInfos = buildReceiverInfo(allChildInfoList, alarmRecord);
//发送消息 //发送消息
noticeByChannel(alarmConfig, alarmRecord, phoneSet,null, notifyChannelList, receiverInfos); 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(","));
//通知的子女 //通知的子女
alarmConfig.setNotifyRelation(childIdJoin); alarmConfig.setNotifyRelation(childIdJoin);
alarmRecord.setNoticeStatus(CommonEnum.YES.getValue()); alarmRecord.setNoticeStatus(CommonEnum.YES.getValue());
alarmRecord.setTenantId(alarmConfig.getTenantId()); alarmRecord.setTenantId(alarmConfig.getTenantId());
saveOrUpdate(alarmRecord); saveOrUpdate(alarmRecord);
} }
...@@ -347,10 +351,14 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -347,10 +351,14 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
return list; return list;
} }
childInfoList.forEach(c -> { childInfoList.forEach(c -> {
if (StrUtil.isBlank(c.getWeChatOpenid())) {
return;
}
MsgSendDTO.ReceiverInfo receiverInfo = new MsgSendDTO.ReceiverInfo(); MsgSendDTO.ReceiverInfo receiverInfo = new MsgSendDTO.ReceiverInfo();
receiverInfo.setRegionName(alarmRecord.getRegionName()); receiverInfo.setRegionName(alarmRecord.getRegionName());
receiverInfo.setName(c.getName()); receiverInfo.setName(c.getName());
receiverInfo.setWeChatOpenid(c.getWeChatOpenid()); receiverInfo.setWeChatOpenid(c.getWeChatOpenid());
list.add(receiverInfo);
}); });
return list; return list;
} }
...@@ -414,21 +422,33 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -414,21 +422,33 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
*/ */
private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet, private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet,
List<SendTypeEnum> notifyChannelList, List<MsgSendDTO.ReceiverInfo> receiverInfos) { List<SendTypeEnum> notifyChannelList, List<MsgSendDTO.ReceiverInfo> receiverInfos) {
log.info("开始短信通知:{}", JSON.toJSONString(alarmConfig)); String elderName = alarmRecord.getElderName();
log.info("开始短信通知:{},老人:{}", JSON.toJSONString(alarmConfig), elderName);
if (StrUtil.isNotBlank(alarmRecord.getElderIds()) && StrUtil.isBlank(elderName)) {
List<PlatElder> platElders = platElderService.listByIds(Arrays.asList(alarmRecord.getElderIds().split(",")));
elderName = platElders.stream().map(PlatElder::getName).collect(Collectors.joining(","));
log.info("开始短信通知--通知老人:{}", elderName);
}
String notifyChannel = alarmConfig.getNotifyChannel(); String notifyChannel = alarmConfig.getNotifyChannel();
if(StringUtils.isEmpty(notifyChannel)){ if (StringUtils.isEmpty(notifyChannel)) {
return; // 微信公众号
notifyChannel = "6";
}else {
notifyChannel = notifyChannel + ",6";
} }
PlatTenant platTenant = platTenantService.getById(alarmConfig.getTenantId()); PlatTenant platTenant = platTenantService.getById(alarmConfig.getTenantId());
if(platTenant == null){ if (platTenant == null || !"1".equals(platTenant.getStatus())) {
return; return;
} }
String alertChannel = platTenant.getAlertChannel(); String alertChannel = platTenant.getAlertChannel();
if(StringUtils.isBlank(alertChannel)){ if (StringUtils.isBlank(alertChannel)) {
return; // 微信公众号
alertChannel = "6";
} else {
alertChannel = alertChannel + ",6";
} }
String[] tenantChannels = alertChannel.split(","); String[] tenantChannels = alertChannel.split(",");
List<String> tenantChannelList = Arrays.asList(tenantChannels); List<String> tenantChannelList = Lists.newArrayList(Arrays.asList(tenantChannels));
String[] split = notifyChannel.split(","); String[] split = notifyChannel.split(",");
for (String sendType : split) { for (String sendType : split) {
//租户告警渠道 没配置的 就不发送 //租户告警渠道 没配置的 就不发送
...@@ -444,24 +464,24 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -444,24 +464,24 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
msgSendDTO.setEmailSet(emailSet); msgSendDTO.setEmailSet(emailSet);
msgSendDTO.setOriContent(alarmRecord.getContent()); msgSendDTO.setOriContent(alarmRecord.getContent());
msgSendDTO.setSubject(alarmRecord.getContent()); msgSendDTO.setSubject(alarmRecord.getContent());
msgSendDTO.setParam(alarmRecord.getElderName()); msgSendDTO.setParam(elderName);
msgSendDTO.setReceiverInfos(receiverInfos); 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")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName()); msgSendDTO.setParam(elderName,alarmRecord.getRegionName());
} }
if (StringUtils.equals(alarmType, "2")) { if (StringUtils.equals(alarmType, "2")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark()); msgSendDTO.setParam(elderName,alarmRecord.getRemark());
} }
if (StringUtils.equals(alarmType, "3")) { if (StringUtils.equals(alarmType, "3")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark()); msgSendDTO.setParam(elderName,alarmRecord.getRemark());
} }
if (StringUtils.equals(alarmType, "4")) { if (StringUtils.equals(alarmType, "4")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName()); msgSendDTO.setParam(elderName,alarmRecord.getRegionName());
} }
if (StringUtils.equals(alarmType, "5")) { if (StringUtils.equals(alarmType, "5")) {
msgSendDTO.setParam(alarmRecord.getElderName(), ""); msgSendDTO.setParam(elderName, "");
} }
msgSendDTO.setAlarmType(alarmConfig.getAlarmType()); msgSendDTO.setAlarmType(alarmConfig.getAlarmType());
//todo 小程序消息 //todo 小程序消息
......
package com.makeit.service.platform.elder;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import java.util.List;
import java.util.TreeMap;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
public interface DeviceLogService {
void save(List<DeviceOperationLogEntity> list);
void saveEntity(TreeMap<String, AnalysisVO> statisticsMap, String id);
TreeMap<String, AnalysisVO> getData();
void fillDefaultData(TreeMap<String, AnalysisVO> statisticsMap,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,7 +17,7 @@ import java.util.List; ...@@ -17,7 +17,7 @@ import java.util.List;
*/ */
public interface PlatElderSleepService extends IService<PlatElderSleep> { public interface PlatElderSleepService extends IService<PlatElderSleep> {
List<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month, Integer day); List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day);
String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime, String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport); SaasSleepEvaluateStandardReport evaluateStandardReport);
......
package com.makeit.service.platform.elder.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Lists;
import com.makeit.dto.SaveLogDTO;
import com.makeit.exception.BusinessException;
import com.makeit.mapper.platform.auth.PlatOrgMapper;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.elder.DeviceLogService;
import com.makeit.utils.data.convert.JsonUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
@Service
public class DeviceLogServiceImpl implements DeviceLogService {
@Resource
private PlatOrgMapper platOrgMapper;
@Override
public void save(List<DeviceOperationLogEntity> list) {
if (CollUtil.isEmpty(list)) {
return;
}
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
List<SaveLogDTO> saveList = new ArrayList<>();
list.forEach(l -> {
SaveLogDTO saveLogDTO = new SaveLogDTO();
long timestamp = l.getTimestamp();
String time = formatLongTime(timestamp);
saveLogDTO.setReportTime(LocalDateTime.parse(time, fmt));
saveLogDTO.setCreatedTime(longToTime(timestamp));
DeviceInfoContentBreathe deviceInfoContentBreathe = JsonUtil.toObj((String) l.getContent(), DeviceInfoContentBreathe.class);
DeviceInfoContentBreathe.Properties properties = deviceInfoContentBreathe.getProperties();
saveLogDTO.setBodyMove(properties.getBodymove());
saveLogDTO.setBr(properties.getBr());
saveLogDTO.setDeviceId(deviceInfoContentBreathe.getDeviceId());
saveLogDTO.setHr(properties.getHr());
saveLogDTO.setPerson(properties.getPerson());
saveLogDTO.setMessageType(deviceInfoContentBreathe.getMessageType());
saveLogDTO.setPersonState(properties.getPersonState());
saveList.add(saveLogDTO);
});
platOrgMapper.insertBatch(saveList);
}
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public static String formatLongTime(long time) {
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
}
private LocalDateTime longToTime(Long longTime) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(longTime), ZoneOffset.of("+8"));
}
@Override
public void saveEntity(TreeMap<String, AnalysisVO> statisticsMap, String id) {
List<AnalysisVO> list = new ArrayList<>();
statisticsMap.forEach((k,v) -> {
v.setCreatedTime(k);
v.setDeviceId(id);
list.add(v);
});
platOrgMapper.saveBatch(list);
}
@Override
public TreeMap<String, AnalysisVO> getData() {
List<AnalysisVO> data = platOrgMapper.getData();
LinkedHashMap<String, AnalysisVO> collect1 = data.stream().collect(Collectors.toMap(AnalysisVO::getCreatedTime, a -> a, (u, v) -> {
throw new BusinessException(String.format("Duplicate key %s", u));
}, LinkedHashMap::new));
TreeMap<String, AnalysisVO> result = new TreeMap<>();
collect1.forEach(result::put);
getDayMinute(1,10).forEach(minute -> {
boolean key = result.containsKey(minute);
if (!key) {
AnalysisVO analysisVO = buildDefaultData(minute);
result.put(minute, analysisVO);
}
});
return result;
}
public static List<String> getDayMinute(Integer month, Integer day) {
List<String> list = Lists.newArrayList();
LocalDateTime of1 = LocalDateTime.of(2024, month, day, 8, 0);
LocalDateTime now = of1.plusDays(-1);
for (int i = 0; i < 24; i++) {
int hour = now.getHour();
for (int j = 0; j < 60; j++) {
LocalDateTime of = LocalDateTime.of(2024, 1, now.getDayOfMonth(), hour, j);
list.add(DateUtil.format(of, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
}
now = now.plusHours(1);
}
list.add(DateUtil.format(of1, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
return list;
}
@Override
public void fillDefaultData(TreeMap<String, AnalysisVO> statisticsMap, Integer month, Integer day) {
List<String> dayMinute = getDayMinute(month, day);
dayMinute.forEach(minute -> {
boolean key = statisticsMap.containsKey(minute);
if (!key) {
AnalysisVO analysisVO = buildDefaultData(minute);
statisticsMap.put(minute, analysisVO);
}
});
}
private AnalysisVO buildDefaultData(String minute) {
AnalysisVO analysisVO = new AnalysisVO();
analysisVO.setTotalHr(0);
analysisVO.setAvgHr(0);
analysisVO.setMaxHr(0);
analysisVO.setMinHr(0);
analysisVO.setTotalBr(0);
analysisVO.setAvgBr(0);
analysisVO.setMaxBr(0);
analysisVO.setMinBr(0);
analysisVO.setHrBrCount(0);
analysisVO.setActionCount(0);
analysisVO.setTurnedCount(0);
analysisVO.setIsAction(false);
analysisVO.setIsMoveBed(true);
analysisVO.setIsMinuteActionFlag(false);
analysisVO.setAwakeMinuteActionFlag(false);
analysisVO.setCreatedTime(minute);
return analysisVO;
}
}
...@@ -11,13 +11,15 @@ import com.makeit.dto.platform.elder.PlatElderReportDTO; ...@@ -11,13 +11,15 @@ import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.entity.platform.alarm.PlatAlarmRecord; import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.alarm.PlatDayDurationRecord; import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
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.PlatElder;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
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 com.makeit.enums.CommonEnum; import com.makeit.enums.CommonEnum;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum; import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.SleepTypeEnum; import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.module.iot.service.IotProductDeviceService; import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.fall.DeviceInfoContentFall; import com.makeit.module.iot.vo.fall.DeviceInfoContentFall;
import com.makeit.module.iot.vo.space.DeviceInfoContentSpace; import com.makeit.module.iot.vo.space.DeviceInfoContentSpace;
import com.makeit.service.platform.alarm.PlatAlarmRecordService; import com.makeit.service.platform.alarm.PlatAlarmRecordService;
...@@ -134,14 +136,12 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -134,14 +136,12 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
} }
// String sleepScore = platElderSleepAnalysis.getSleepScore(); // String sleepScore = platElderSleepAnalysis.getSleepScore();
Long sleepScore = getSleepScore(platElderSleepAnalysis); // Long sleepScore = getSleepScore(platElderSleepAnalysis);
// EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
platElderSleepEvaluationVO.setScore(Integer.parseInt(platElderSleepAnalysis.getSleepScore()));
EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
platElderSleepEvaluationVO.setScore(Integer.valueOf(sleepScore + ""));
platElderSleepEvaluationVO.setResult(platElderSleepAnalysis.getSleepResult()); platElderSleepEvaluationVO.setResult(platElderSleepAnalysis.getSleepResult());
platElderSleepEvaluationVO.setEvaluation(evaluateReport.getEvaluate()); platElderSleepEvaluationVO.setEvaluation(platElderSleepAnalysis.getSleepEvaluate());
platElderSleepEvaluationVO.setSleepDuration(Integer.valueOf(platElderSleepAnalysis.getSleepTime() + "")); platElderSleepEvaluationVO.setSleepDuration(Integer.valueOf(platElderSleepAnalysis.getSleepTime() + ""));
platElderSleepEvaluationVO.setRestDuration(Integer.valueOf(platElderSleepAnalysis.getRestTime() + "")); platElderSleepEvaluationVO.setRestDuration(Integer.valueOf(platElderSleepAnalysis.getRestTime() + ""));
...@@ -218,7 +218,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -218,7 +218,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
.orderByAsc(PlatElderSleep::getStartSleep) .orderByAsc(PlatElderSleep::getStartSleep)
); );
setWakeUp(sleepList); // setWakeUp(sleepList);
voList = StreamUtil.map(sleepList, e -> { voList = StreamUtil.map(sleepList, e -> {
PlatElderSleepDiagramVO vo = new PlatElderSleepDiagramVO(); PlatElderSleepDiagramVO vo = new PlatElderSleepDiagramVO();
...@@ -235,6 +235,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -235,6 +235,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
return contentVO; return contentVO;
}); });
contentList = contentList.stream().filter(f -> !"resting".equals(f.getSleepType())).collect(Collectors.toList());
vo.setContentList(contentList); vo.setContentList(contentList);
return vo; return vo;
}); });
...@@ -242,29 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -242,29 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
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 -> f.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) {
......
...@@ -33,11 +33,7 @@ import java.math.BigDecimal; ...@@ -33,11 +33,7 @@ import java.math.BigDecimal;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
...@@ -267,9 +263,7 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek ...@@ -267,9 +263,7 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
Map<Integer, Map<String, List<PlatElderSleep>>> sleepMap = sleepList.stream().collect(Collectors.groupingBy(PlatElderSleep::getElderSleepType, Collectors.groupingBy(PlatElderSleep::getHappenDate))); Map<Integer, Map<String, List<PlatElderSleep>>> sleepMap = sleepList.stream().collect(Collectors.groupingBy(PlatElderSleep::getElderSleepType, Collectors.groupingBy(PlatElderSleep::getHappenDate)));
Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = sleepAnalysisList.stream().collect(Collectors.toMap(PlatElderSleepAnalysis::getHappenDate, Function.identity(),(v1,v2)->v1)); Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMapDep(sleepAnalysisList, PlatElderSleepAnalysis::getHappenDate);
// Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMap(sleepAnalysisList, PlatElderSleepAnalysis::getHappenDate);
List<LocalDate> dateList = LocalDateTimeUtils.getDateSeries(weekStartDate, weekEndDate); List<LocalDate> dateList = LocalDateTimeUtils.getDateSeries(weekStartDate, weekEndDate);
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
...@@ -277,8 +271,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek ...@@ -277,8 +271,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List<PlatElderSleepDiagramWeekContentVO> sleep = StreamUtil.map(dateList, e -> { List<PlatElderSleepDiagramWeekContentVO> sleep = StreamUtil.map(dateList, e -> {
PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO(); PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO();
vo.setDay(e); vo.setDay(e);
Map<String, List<PlatElderSleep>> sleepListMap = Optional.ofNullable(sleepMap.get(SleepTypeEnum.SLEEP.getType())).orElse(new HashMap<>());
List<PlatElderSleep> list = Optional.ofNullable(sleepMap.get(1)).map(i -> i.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10)); List<PlatElderSleep> list = Optional.ofNullable(sleepListMap.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>());
List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> i.getSleepRecord().stream()).collect(Collectors.toList()); List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> i.getSleepRecord().stream()).collect(Collectors.toList());
...@@ -289,8 +283,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek ...@@ -289,8 +283,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List<PlatElderSleepDiagramWeekContentVO> rest = StreamUtil.map(dateList, e -> { List<PlatElderSleepDiagramWeekContentVO> rest = StreamUtil.map(dateList, e -> {
PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO(); PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO();
vo.setDay(e); vo.setDay(e);
Map<String, List<PlatElderSleep>> restListMap = Optional.ofNullable(sleepMap.get(SleepTypeEnum.RESTING.getType())).orElse(new HashMap<>());
List<PlatElderSleep> list = Optional.ofNullable(sleepMap.get(2)).map(i -> i.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10)); List<PlatElderSleep> list = Optional.ofNullable(restListMap.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10));
List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> Optional.ofNullable(i.getSleepRecord()).orElse(new ArrayList<>(10)).stream()).collect(Collectors.toList()); List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> Optional.ofNullable(i.getSleepRecord()).orElse(new ArrayList<>(10)).stream()).collect(Collectors.toList());
......
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.core.toolkit.Wrappers;
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.Maps; import com.google.common.collect.Maps;
import com.makeit.common.entity.BaseEntity; import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice; import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.ElderSleepAnalysisVO;
import com.makeit.entity.platform.elder.PlatElder; import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderSleep; import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis; import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.platform.space.PlatRoomBedDevice; import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport; import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.report.ElderSleepType;
import com.makeit.enums.report.SleepTypeEnum; import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.elder.PlatElderSleepMapper; import com.makeit.mapper.platform.elder.PlatElderSleepMapper;
...@@ -24,22 +28,29 @@ import com.makeit.module.iot.vo.DeviceOperationLogEntity; ...@@ -24,22 +28,29 @@ import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.*; import com.makeit.module.iot.vo.analysis.*;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe; import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
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.DeviceLogService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.service.platform.elder.PlatElderSleepAnalysisService;
import com.makeit.service.platform.elder.PlatElderSleepService;
import com.makeit.service.platform.space.PlatRoomBedDeviceService; import com.makeit.service.platform.space.PlatRoomBedDeviceService;
import com.makeit.service.saas.*; import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.service.saas.SaasSleepEvaluateReportService;
import com.makeit.service.saas.SaasSleepEvaluateStandardReportService;
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 org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
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;
...@@ -61,12 +72,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -61,12 +72,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired @Autowired
private SaasSleepEvaluateReportService saasSleepEvaluateReportService; private SaasSleepEvaluateReportService saasSleepEvaluateReportService;
@Autowired @Autowired
private SaasElderReportConfigService saasElderReportConfigService;
@Autowired
private SaasSleepEvaluateStandardReportService saasSleepEvaluateStandardReportService; private SaasSleepEvaluateStandardReportService saasSleepEvaluateStandardReportService;
@Autowired @Autowired
private SaasDiseaseModelService saasDiseaseModelService;
@Autowired
private IotProductDeviceService productDeviceService; private IotProductDeviceService productDeviceService;
@Autowired @Autowired
private PlatRoomBedDeviceService roomBedDeviceService; private PlatRoomBedDeviceService roomBedDeviceService;
...@@ -77,647 +84,884 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -77,647 +84,884 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Autowired @Autowired
private PlatElderSleepAnalysisService platElderSleepAnalysisService; private PlatElderSleepAnalysisService platElderSleepAnalysisService;
@Autowired @Autowired
private PlatElderBreatheDayStatService platElderBreatheDayStatService;
@Autowired
private PlatElderSleepService platElderSleepService; private PlatElderSleepService platElderSleepService;
@Resource
private DeviceLogService deviceLogService;
@Autowired private TreeMap<String, AnalysisVO> getPerMinuteData(Map<String, List<DeviceInfoContentBreathe>> minuteMap, SaasSleepAnalysisModel analysisModel) {
private PlatElderReportMonthService platElderReportMonthService;
@Override
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month,Integer day) {
List<String> dayHourRangeList = getLastDayHourRange(month,day);
String currentDate = LocalDate.now().minusDays(1).toString();
if(month != null && day != null){
currentDate = LocalDate.of(2024, month, day).minusDays(1).toString();
}
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
List<PlatRoomBedDevice> platRoomBedDeviceList = roomBedDeviceService.list(new QueryWrapper<PlatRoomBedDevice>()
.lambda().isNotNull(PlatRoomBedDevice::getBedId));
Integer actionThreshold = Integer.valueOf(analysisModel.getActionThreshold());
int turnedThreshold = Integer.parseInt(analysisModel.getTurnedThreshold()); int turnedThreshold = Integer.parseInt(analysisModel.getTurnedThreshold());
int sleepTimeActionThreshold = Integer.parseInt(analysisModel.getSleepTimeActionThreshold()); int sleepTimeActionThreshold = Integer.parseInt(analysisModel.getSleepTimeActionThreshold());
Integer actionThreshold = Integer.valueOf(analysisModel.getActionThreshold());
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();
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
List<DeviceInfoContentBreathe> deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties;
int reportSize = deviceInfoContentBreathes.size();
// 记录总呼吸率和总心率
int maxBr = 0;
int minBr = 0;
int maxHr = 0;
int minHr = 0;
int hrBrCount = 0; // 呼吸率心率统计次数
int totalBr = 0;
int totalHr = 0;
Integer bodymoveCount = 0; // 体动次数
Integer turnoverCount = 0; // 翻身次数
boolean isAction = false; // 每分钟是否动过
AnalysisVO analysisVO = new AnalysisVO();
int getUpBodymoveCount = 0;
boolean isMoveBed = false;
// 清醒每分钟体动是否满足要求 (每分钟体动值大于60或无人)
boolean awakeMinuteActionFlag = false;
int noPersonCount = 0; // 无人跳过计数
boolean isLive = false;
for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
// 体动指数
breatheProperties = infoContentBreathe.getProperties();
Integer bodyMove = breatheProperties.getBodymove();
int br = breatheProperties.getBr();
int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
if (hasPerson == 0 && !isLive) {
noPersonCount++;
isMoveBed = true;
awakeMinuteActionFlag = true;
// continue;
}
if (hasPerson == 1) {
totalBr += br;
totalHr += hr;
hrBrCount++;
isMoveBed = false;
isLive = true;
}
// 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 (bodyMove > riseActionThreshold) {
getUpBodymoveCount++;
}
// 清醒
if (bodyMove > awakeThreshold) {
awakeMinuteActionFlag = true;
}
if (br > maxBr) {
maxBr = br;
}
if (minBr == 0) {
minBr = br;
} else if (br < minBr) {
minBr = br;
}
if (hr > maxHr) {
maxHr = hr;
}
if (minHr == 0) {
minHr = hr;
} else if (hr < minHr) {
minHr = hr;
}
int sleepDeepActionThreshold = Integer.parseInt(analysisModel.getSleepDeepActionThreshold()); }
int sleepDeepActionTimeBegin = Integer.parseInt(analysisModel.getSleepDeepActionTimeBegin()); // if (reportSize == noPersonCount) {
// // continue;
int sleepDeepBreatheMin = Integer.parseInt(analysisModel.getSleepDeepBreatheMin()); // }
int sleepDeepBreatheMax = Integer.parseInt(analysisModel.getSleepDeepBreatheMax()); // 每分钟的数据
analysisVO.setTotalBr(totalBr);
analysisVO.setAvgBr(totalBr / reportSize);
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold()); analysisVO.setTotalHr(totalHr);
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin()); analysisVO.setAvgHr(totalHr / reportSize);
List<PlatElderSleepAnalysis> result = new ArrayList<>(); analysisVO.setMaxBr(maxBr);
analysisVO.setMinBr(minBr);
for (PlatRoomBedDevice platRoomBedDevice : platRoomBedDeviceList) { analysisVO.setMaxHr(maxHr);
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>(); 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;
}
String bedId = platRoomBedDevice.getBedId(); /**
PlatElder elder = platElderService.getOne(new QueryWrapper<PlatElder>().lambda() * 获取满足入睡时间条件数据(体动值小于20且连续0.5小时)
.eq(PlatElder::getBedId, bedId)); *
if (elder == null) { * @param totalMap
* @param sleepTimeActionDuration 体动值持续时间 0.5h
* @param sleepTimeAnalysisVOList
* @return key:开始入睡时间,value:睡眠时间段内的数据
*/
private TreeMap<String, TreeMap<String, AnalysisVO>> getFallAsleepData(TreeMap<String, AnalysisVO> totalMap,
double sleepTimeActionDuration,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList,
SaasSleepAnalysisModel analysisModel) {
String startSleepTime = null;
String getUpTime1 = null;
String getUpTime2 = null;
String getUpTime;
boolean isSleep = false;
int moveMinute = 0;
int minuteActionCount = 0;
int sleepMinute = 0;
int riseActionDuration = Integer.parseInt(analysisModel.getRiseActionDuration());
double riseLeaveThreshold = Double.parseDouble(analysisModel.getRiseLeaveThreshold());
Integer totalActionCount = 0;
Integer totalTurnedCount = 0;
String lastKey = totalMap.lastKey();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
// 非离床且体动值<20
if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(startSleepTime)) {
startSleepTime = entry.getKey();
}
sleepMinute++;
totalActionCount += analysisVO.getActionCount();
totalTurnedCount += analysisVO.getTurnedCount();
continue; continue;
} }
PlatDevice platDevice = platDeviceService.getById(platRoomBedDevice.getDeviceId()); if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) {
if (platDevice == null) {
continue; continue;
} }
String tenantId = elder.getTenantId(); SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
if (sleepMinute > sleepTimeActionDuration * 60) {
for (String hourRange : dayHourRangeList) { sleepTimeAnalysisVO.setStartTime(startSleepTime);
String[] hourRangeArray = hourRange.split("~"); sleepTimeAnalysisVO.setEndTime(entry.getKey());
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]); sleepTimeAnalysisVO.setType(SleepTypeEnum.DAY_SLEEP.getCode());
if (CollectionUtils.isEmpty(deviceOperationLogEntities)) { sleepTimeAnalysisVO.setActionCount(totalActionCount);
continue; sleepTimeAnalysisVO.setTurnedCount(totalTurnedCount);
isSleep = true;
}
getUpTime = sleepTimeAnalysisVO.getGetUpTime();
if (StrUtil.isBlank(getUpTime) && lastKey.equals(entry.getKey())) {
getUpTime = entry.getKey();
sleepTimeAnalysisVO.setGetUpTime(getUpTime);
sleepTimeAnalysisVO.setEndTime(getUpTime);
sleepTimeAnalysisVO.setRemark("最后一条数据算起床时间");
}
// 离床数据计算起床时间
if (isSleep && analysisVO.getIsMoveBed()) {
if (StrUtil.isBlank(getUpTime1)) {
getUpTime1 = entry.getKey();
} }
List<DeviceInfoContentBreathe> deviceInfoContentBreatheList = deviceOperationLogEntities.stream() LocalDateTime nowTime = LocalDateTime.parse(entry.getKey(), DEFAULT_FORMATTER);
.filter(deviceOperationLogEntity -> deviceOperationLogEntity.getType().contains("reportProperty")) long between = Duration.between(LocalDateTime.parse(getUpTime1, DEFAULT_FORMATTER),
.map(deviceOperationLogEntity -> { nowTime).toMinutes();
DeviceInfoContentBreathe deviceInfoContentBreathe = JsonUtil.toObj((String) deviceOperationLogEntity.getContent(), DeviceInfoContentBreathe.class); // 数据需要连续
assert deviceInfoContentBreathe != null; if (between == moveMinute) {
deviceInfoContentBreathe.setReportTime(formatLongTime(deviceInfoContentBreathe.getTimestamp())); moveMinute++;
return deviceInfoContentBreathe; } else {
}) moveMinute = 0;
.collect(Collectors.toList()); getUpTime1 = null;
Map<String, List<DeviceInfoContentBreathe>> minuteMap = StreamUtil.groupBy(deviceInfoContentBreatheList, DeviceInfoContentBreathe::getReportTime);
deviceOperationLogEntities.clear();
// 统计每小时的体动和翻身
Map<String, AnalysisVO> statisticsMap = Maps.newHashMap();
List<DeviceInfoContentBreathe> deviceInfoContentBreathes;
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties;
Integer bodymove;
int reportSize = deviceInfoContentBreathes.size();
// 记录总呼吸率和总心率
int maxBr = 0;
int minBr = 0;
int maxHr = 0;
int minHr = 0;
int hrBrCount = 0; // 呼吸率心率统计次数
int totalBr = 0;
int totalHr = 0;
Integer bodymoveCount = 0; // 体动次数
Integer turnoverCount = 0; // 翻身次数
boolean isAction = false; // 每分钟是否动过
AnalysisVO analysisVO = new AnalysisVO();
int getUpBodymoveCount = 0;
boolean isMoveBed = false;
boolean awakeMinuteActionFlag = false; // 清醒每分钟体动是否满足要求
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 (hasPerson == 0) {
noPersonCount++;
isMoveBed = true;
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) {
awakeMinuteActionFlag = true;
}
if (br > maxBr) {
maxBr = br;
}
if (br < minBr) {
minBr = br;
}
if (hr > maxHr) {
maxHr = hr;
}
if (hr < minHr) {
minHr = hr;
}
if (hasPerson == 1) {
totalBr += br;
totalHr += hr;
hrBrCount++;
}
}
if (reportSize == noPersonCount) {
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);
} }
TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap);
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
} }
if (moveMinute > riseLeaveThreshold * 60 && StrUtil.isBlank(getUpTime)) {
if (totalMap.isEmpty()) { getUpTime = entry.getKey();
continue; sleepTimeAnalysisVO.setGetUpTime(getUpTime);
sleepTimeAnalysisVO.setEndTime(getUpTime);
sleepTimeAnalysisVO.setRemark("离床数据计算起床时间");
} }
// 体动值计算起床时间
if (isSleep && analysisVO.getIsMinuteActionFlag()) {
int totalActionCount = 0; if (StrUtil.isBlank(getUpTime2)) {
int totalTurnedCount = 0; getUpTime2 = entry.getKey();
// 记录长者不同类型的睡眠时间
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
SleepTimeAnalysisVO sleepTimeAnalysisVO;
// 判断睡觉时间
String startSleepTime = null; // 入睡时间开始
int sleepMinute = 0;
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
if (!analysisVO.getIsAction() && !analysisVO.getIsMoveBed()) {
if (StringUtils.isEmpty(startSleepTime)) {
startSleepTime = entry.getKey();
}
sleepMinute++;
continue;
} }
if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) { long between = Duration.between(LocalDateTime.parse(getUpTime2, DEFAULT_FORMATTER),
continue; LocalDateTime.parse(entry.getKey(), DEFAULT_FORMATTER)).toMinutes();
} if (between == minuteActionCount) {
if (sleepMinute > sleepTimeActionDuration * 60) { minuteActionCount++;
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); } else {
sleepTimeAnalysisVO.setStartTime(startSleepTime); minuteActionCount = 0;
sleepTimeAnalysisVO.setEndTime(entry.getKey()); getUpTime2 = null;
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
}
if (minuteActionCount > riseActionDuration && StrUtil.isBlank(getUpTime)) {
getUpTime = entry.getKey();
sleepTimeAnalysisVO.setGetUpTime(getUpTime);
sleepTimeAnalysisVO.setEndTime(getUpTime);
sleepTimeAnalysisVO.setRemark("体动值计算起床时间");
}
if (!isSleep) {
startSleepTime = null; startSleepTime = null;
sleepMinute = 0; sleepMinute = 0;
totalActionCount = 0;
totalTurnedCount = 0;
} }
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>(); if (isSleep && StrUtil.isNotBlank(getUpTime)) {
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) { startSleepTime = null;
boolean startTimeFlag = false; sleepMinute = 0;
TreeMap<String, AnalysisVO> sleepTotalMap = new TreeMap<>(); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { getUpTime2 = null;
if (entry.getKey().equals(timeAnalysisVO.getStartTime())) { getUpTime1 = null;
startTimeFlag = true; moveMinute = 0;
sleepTotalMap.put(entry.getKey(), entry.getValue()); minuteActionCount = 0;
} getUpTime = null;
if (entry.getKey().equals(timeAnalysisVO.getEndTime())) { isSleep = false;
sleepTotalMap.put(entry.getKey(), entry.getValue()); totalActionCount = 0;
startTimeFlag = false; totalTurnedCount = 0;
}
if (startTimeFlag) {
sleepTotalMap.put(entry.getKey(), entry.getValue());
}
sleepTypeMap.put(timeAnalysisVO.getType(), sleepTotalMap);
}
} }
}
// 判断起床时间 TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap = new TreeMap<>();
String startGetupTime = null; // 起床时间开始 if (CollUtil.isEmpty(sleepTimeAnalysisVOList)) {
int getupMinute = 0; return sleepTypeMap;
}
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) {
if (!timeAnalysisVO.getType().equals(SleepTypeEnum.DAY_SLEEP.getCode())) {
continue;
}
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()) {
String reportTime = entry.getKey();
AnalysisVO analysisVO = entry.getValue(); AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getIsMoveBed()) { if (reportTime.equals(timeAnalysisVO.getStartTime())) {
if (StringUtils.isEmpty(startGetupTime)) { startTimeFlag = true;
startGetupTime = entry.getKey(); sleepTotalMap.put(reportTime, analysisVO);
}
getupMinute++;
continue;
} }
if (StringUtils.isEmpty(startGetupTime) && getupMinute == 0) { if (reportTime.equals(timeAnalysisVO.getEndTime())) {
continue; sleepTotalMap.put(reportTime, analysisVO);
startTimeFlag = false;
} }
if (getupMinute > riseLeaveThreshold * 60) { if (startTimeFlag) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); sleepTotalMap.put(reportTime, analysisVO);
sleepTimeAnalysisVO.setStartTime(startGetupTime);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
startGetupTime = null; sleepTypeMap.put(timeAnalysisVO.getStartTime(), sleepTotalMap);
getupMinute = 0;
} }
}
return sleepTypeMap;
}
// 判断起床时间 /**
String startGetupTime2 = null; // 起床时间开始 *
int getupMinute2 = 0; * @param totalMap
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) { */
AnalysisVO analysisVO = entry.getValue(); private void countTotal(TreeMap<String, TreeMap<String, AnalysisVO>> totalMap,
if (analysisVO.getIsMinuteActionFlag()) { SleepCountDTO sleepCountDTO) {
if (StringUtils.isEmpty(startGetupTime2)) { AtomicReference<Integer> actionCount = new AtomicReference<>(0);
startGetupTime2 = entry.getKey(); AtomicReference<Integer> turnedCount = new AtomicReference<>(0);
totalMap.forEach((k, v) -> v.forEach((k2, v2) -> {
actionCount.updateAndGet(v1 -> v1 + v2.getActionCount());
turnedCount.updateAndGet(v1 -> v1 + v2.getTurnedCount());
}));
sleepCountDTO.setTotalActionCount(actionCount.get());
sleepCountDTO.setTotalTurnedCount(turnedCount.get());
}
/**
* 深度睡眠(体动和翻身次数10分钟内等于0次,且呼吸率在10-20范围内)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private void deepSleepData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
int 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();
String key = entry.getKey();
int sleepDeepMinute = 0;
String startSleepDeepTime = null;
boolean isDeepSleep = false;
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
AnalysisVO analysisVO = voEntry.getValue();
boolean actionFlag = analysisVO.getActionCount() == sleepDeepActionThreshold;
boolean turnedFlag = analysisVO.getTurnedCount() == sleepDeepActionThreshold;
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
boolean condition = actionFlag && turnedFlag
&& sleepDeepBreatheMin <= analysisVO.getAvgBr() && sleepDeepBreatheMax >= analysisVO.getAvgBr();
if (condition) {
if (StringUtils.isEmpty(startSleepDeepTime)) {
startSleepDeepTime = voEntry.getKey();
}
long between = Duration.between(LocalDateTime.parse(startSleepDeepTime, DEFAULT_FORMATTER),
LocalDateTime.parse(voEntry.getKey(), DEFAULT_FORMATTER)).toMinutes();
// 数据连续
if (between == sleepDeepMinute) {
sleepDeepMinute++;
} else {
if (isDeepSleep) {
sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
}
sleepDeepMinute = 0;
startSleepDeepTime = null;
} }
getupMinute2++;
continue; continue;
} }
if (StringUtils.isEmpty(startGetupTime2) && getupMinute2 == 0) { if (StringUtils.isEmpty(startSleepDeepTime) && sleepDeepMinute == 0) {
continue; continue;
} }
if (getupMinute2 > riseActionDuration) {
sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startGetupTime2);
sleepTimeAnalysisVO.setEndTime(entry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.GETUP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
}
startGetupTime2 = null;
getupMinute2 = 0;
}
int sleepDeepMinute = 0; if (sleepDeepMinute > sleepDeepActionTimeBegin && !isDeepSleep) {
String startSleepDeepTime = null; // 入睡时间开始 sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
// 判断深度睡眠时间 sleepTimeAnalysisVO.setEndTime(getLastMinute(voEntry.getKey()));
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_DEEP.getCode());
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); sleepTimeAnalysisVO.setBelongToSleepTime(key);
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { isDeepSleep = true;
AnalysisVO analysisVO = voEntry.getValue(); }
totalActionCount += analysisVO.getActionCount(); String endTime = sleepTimeAnalysisVO.getEndTime();
totalTurnedCount += analysisVO.getTurnedCount(); if (isDeepSleep && StrUtil.isNotBlank(endTime)) {
if (analysisVO.getActionCount() == sleepDeepActionThreshold && analysisVO.getTurnedCount() == sleepDeepActionThreshold sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
&& 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; startSleepDeepTime = null;
sleepDeepMinute = 0; sleepDeepMinute = 0;
isDeepSleep = false;
} }
}
}
}
private String getLastMinute (String minute) {
LocalDateTime parse = LocalDateTime.parse(minute, DEFAULT_FORMATTER);
return DateUtil.format(parse.plusMinutes(-1), DatePattern.NORM_DATETIME_MINUTE_PATTERN);
}
private SleepCountDTO deepSleepAndRestData(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
String startSleepDeepTime;
int napThreshold = Integer.parseInt(analysisModel.getNapThreshold());
TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = new TreeMap<>();
TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap = new TreeMap<>();
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
// 每分钟的数据
int sleepMinute = sleepMap.size();
Map.Entry<String, AnalysisVO> lastEntry = sleepMap.lastEntry();
startSleepDeepTime = entry.getKey();
// 睡眠:深度睡眠和浅度睡眠>3小时
if (sleepMinute > napThreshold * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(lastEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
daySleepMap.put(startSleepDeepTime, sleepMap);
}
// 小憩:深度睡眠和浅度睡眠<=3小时,且2小时内无再次入睡
if (sleepMinute <= napThreshold * 60) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startSleepDeepTime);
sleepTimeAnalysisVO.setEndTime(lastEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.RESTING.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
restSleepMap.put(startSleepDeepTime, sleepMap);
} }
}
SleepCountDTO sleepCountDTO = new SleepCountDTO();
sleepCountDTO.setDaySleepMap(daySleepMap);
sleepCountDTO.setRestSleepMap(restSleepMap);
TreeMap<String, TreeMap<String, AnalysisVO>> allSleepMap = new TreeMap<>();
if (CollUtil.isNotEmpty(daySleepMap)) {
allSleepMap.putAll(daySleepMap);
}
if (CollUtil.isNotEmpty(restSleepMap)) {
allSleepMap.putAll(restSleepMap);
}
sleepCountDTO.setAllSleepMap(allSleepMap);
return sleepCountDTO;
}
// 中度睡眠 /**
* 中度睡眠(体动和翻身次数10分钟内小于3次)
*
* @param sleepTypeMap
* @param analysisModel
* @param sleepTimeAnalysisVOList
*/
private void middleSleep(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap, SaasSleepAnalysisModel analysisModel,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
//3次
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
// 10minute
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
String key = entry.getKey();
int sleepMidMinute = 0; int sleepMidMinute = 0;
String startSleepMidTime = null; // 入睡时间开始 int size = 0;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { String startSleepMidTime = null;
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { AnalysisVO analysisVO = voEntry.getValue();
AnalysisVO analysisVO = voEntry.getValue(); String key1 = voEntry.getKey();
if (analysisVO.getActionCount() < sleepModerateActionThreshold && analysisVO.getTurnedCount() < sleepModerateActionThreshold) { Integer actionCount = analysisVO.getActionCount();
if (StringUtils.isEmpty(startSleepMidTime)) { Integer turnedCount = analysisVO.getTurnedCount();
startSleepMidTime = voEntry.getKey(); boolean isAction = actionCount > sleepModerateActionThreshold;
} boolean isTurned = turnedCount > sleepModerateActionThreshold;
sleepMidMinute++; SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
continue; size++;
} long between = 0;
if (StringUtils.isEmpty(startSleepMidTime) && sleepMidMinute == 0) { if (startSleepMidTime != null) {
continue; between = Duration.between(LocalDateTime.parse(startSleepMidTime, DEFAULT_FORMATTER),
} LocalDateTime.parse(key1, DEFAULT_FORMATTER)).toMinutes();
if (sleepMidMinute > sleepModerateActionTimeBegin) { }
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); if (!isAction && !isTurned) {
sleepTimeAnalysisVO.setStartTime(startSleepMidTime); if (StringUtils.isEmpty(startSleepMidTime)) {
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); startSleepMidTime = key1;
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode());
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
} }
sleepMidMinute += actionCount;
sleepMidMinute += turnedCount;
} else {
sleepMidMinute = 0;
startSleepMidTime = null;
continue;
}
if (StringUtils.isEmpty(startSleepMidTime) && sleepMidMinute == 0) {
continue;
}
boolean condition = sleepMidMinute >= sleepModerateActionThreshold && between > sleepModerateActionTimeBegin;
if (condition || size == sleepMap.size() - 1) {
sleepTimeAnalysisVO.setStartTime(startSleepMidTime);
sleepTimeAnalysisVO.setEndTime(key1);
sleepTimeAnalysisVO.setType(SleepTypeEnum.SLEEP_MODERATE.getCode());
sleepTimeAnalysisVO.setBelongToSleepTime(key);
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startSleepMidTime = null; startSleepMidTime = null;
sleepMidMinute = 0; sleepMidMinute = 0;
} }
} }
}
}
// 清醒 /**
* 清醒(每分钟体动值大于60或无人)
*
* @param sleepTypeMap
* @param sleepTimeAnalysisVOList
*/
private void sober(TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap,
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue();
String key = entry.getKey();
int awakeMinute = 0; int awakeMinute = 0;
String startAwakeTime = null; // 入睡时间开始 String startAwakeTime = null;
for (Map.Entry<String, TreeMap<String, AnalysisVO>> entry : sleepTypeMap.entrySet()) { for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) {
TreeMap<String, AnalysisVO> sleepMap = entry.getValue(); AnalysisVO analysisVO = voEntry.getValue();
for (Map.Entry<String, AnalysisVO> voEntry : sleepMap.entrySet()) { if (analysisVO.getAwakeMinuteActionFlag() || analysisVO.getIsMoveBed()) {
AnalysisVO analysisVO = voEntry.getValue(); if (StringUtils.isEmpty(startAwakeTime)) {
if (analysisVO.getAwakeMinuteActionFlag() || analysisVO.getIsMoveBed()) { startAwakeTime = voEntry.getKey();
if (StringUtils.isEmpty(startAwakeTime)) {
startAwakeTime = voEntry.getKey();
}
awakeMinute++;
continue;
}
if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) {
continue;
} }
sleepTimeAnalysisVO = new SleepTimeAnalysisVO(); awakeMinute++;
continue;
}
if (StringUtils.isEmpty(startAwakeTime) && awakeMinute == 0) {
continue;
}
if (StrUtil.isNotBlank(startAwakeTime) && awakeMinute > 0) {
SleepTimeAnalysisVO sleepTimeAnalysisVO = new SleepTimeAnalysisVO();
sleepTimeAnalysisVO.setStartTime(startAwakeTime); sleepTimeAnalysisVO.setStartTime(startAwakeTime);
sleepTimeAnalysisVO.setEndTime(voEntry.getKey()); sleepTimeAnalysisVO.setEndTime(voEntry.getKey());
sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode()); sleepTimeAnalysisVO.setType(SleepTypeEnum.SOBER.getCode());
sleepTimeAnalysisVO.setBelongToSleepTime(key);
sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO); sleepTimeAnalysisVOList.add(sleepTimeAnalysisVO);
startAwakeTime = null;
awakeMinute = 0;
} }
startAwakeTime = null;
awakeMinute = 0;
} }
}
}
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType); private SleepTimeDTO groupSleepData(List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList) {
List<SleepTimeAnalysisVO> sleepList = sleepMap.get(SleepTypeEnum.SLEEP.getCode()); sleepTimeAnalysisVOList.forEach(s -> {
if (CollectionUtils.isEmpty(sleepList)) { Long durationRange = getDurationRange(s.getStartTime(), s.getEndTime());
continue; s.setInterval(durationRange);
});
Map<String, List<SleepTimeAnalysisVO>> sleepMap = StreamUtil.groupBy(sleepTimeAnalysisVOList, SleepTimeAnalysisVO::getType);
List<SleepTimeAnalysisVO> daySleepList = sleepMap.getOrDefault(SleepTypeEnum.DAY_SLEEP.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> sleepList = sleepMap.getOrDefault(SleepTypeEnum.SLEEP.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> deepList = sleepMap.getOrDefault(SleepTypeEnum.SLEEP_DEEP.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> moderateList = sleepMap.getOrDefault(SleepTypeEnum.SLEEP_MODERATE.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> getUpList = sleepMap.getOrDefault(SleepTypeEnum.GETUP.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> soberList = sleepMap.getOrDefault(SleepTypeEnum.SOBER.getCode(), new ArrayList<>());
List<SleepTimeAnalysisVO> restList = sleepMap.getOrDefault(SleepTypeEnum.RESTING.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);
sleepTimeDTO.setRestList(restList);
sleepTimeDTO.setLightList(setLightSleepList(deepList,moderateList,restList,sleepList));
return sleepTimeDTO;
}
/**
* 获取浅度睡眠
* @param deepList
* @param moderateList
* @param restList
* @param sleepList
* @return
*/
private List<SleepTimeAnalysisVO> setLightSleepList(List<SleepTimeAnalysisVO> deepList, List<SleepTimeAnalysisVO> moderateList,
List<SleepTimeAnalysisVO> restList, List<SleepTimeAnalysisVO> sleepList) {
List<SleepTimeAnalysisVO> result = new ArrayList<>();
Map<String, List<SleepTimeAnalysisVO>> deepMap = deepList.stream().collect(Collectors.groupingBy(SleepTimeAnalysisVO::getBelongToSleepTime));
Map<String, List<SleepTimeAnalysisVO>> moderMap = moderateList.stream().collect(Collectors.groupingBy(SleepTimeAnalysisVO::getBelongToSleepTime));
if (CollUtil.isNotEmpty(sleepList)) {
buildLightList(sleepList, result, deepMap, moderMap);
}
if (CollUtil.isNotEmpty(restList)) {
buildLightList(restList, result, deepMap, moderMap);
}
return result;
}
private void buildLightList(List<SleepTimeAnalysisVO> list, List<SleepTimeAnalysisVO> result,
Map<String, List<SleepTimeAnalysisVO>> deepMap,
Map<String, List<SleepTimeAnalysisVO>> moderMap) {
list.forEach(s -> {
LocalDateTime startTime = LocalDateTime.parse(s.getStartTime(), DEFAULT_FORMATTER);
LocalDateTime endTime = LocalDateTime.parse(s.getEndTime(), DEFAULT_FORMATTER);
List<LocalDateTime> rangeTimes = getRangeTime(startTime, endTime);
List<SleepTimeAnalysisVO> deeps = deepMap.get(s.getStartTime());
List<LocalDateTime> removeList = new ArrayList<>();
if (CollUtil.isNotEmpty(deeps)) {
deeps.forEach(d -> CollUtil.addAll(removeList, getRangeTime(startTime, endTime)));
} }
// 遍历得出长者一天多次睡眠中包含的不同睡眠类型 List<SleepTimeAnalysisVO> moder = moderMap.get(s.getStartTime());
List<SleepTimeAnalysisVO> finalSleepTimeAnalysisList = Lists.newArrayList(); // 记录多端睡眠记录 if (CollUtil.isNotEmpty(moder)) {
SleepTimeAnalysisVO sleepTimeAnalysis; moder.forEach(d -> CollUtil.addAll(removeList, getRangeTime(startTime, endTime)));
for (int i = 0; i < sleepList.size(); i++) {
sleepTimeAnalysis = new SleepTimeAnalysisVO();
List<SleepTimeAnalysisVO> deepList = Lists.newArrayList();
List<SleepTimeAnalysisVO> midList = Lists.newArrayList();
List<SleepTimeAnalysisVO> lightList = Lists.newArrayList();
List<SleepTimeAnalysisVO> soberList = Lists.newArrayList();
SleepTimeAnalysisVO timeAnalysisVO = sleepList.get(i);
BeanUtils.copyProperties(timeAnalysisVO, sleepTimeAnalysis);
String startTime = timeAnalysisVO.getStartTime();
String endTime = timeAnalysisVO.getEndTime();
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime());
timeAnalysisVO.setInterval(durationRange);
LocalDateTime startDateTime = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
boolean lightSleepFlag = true; // 如果不满足下面条件,就默认都是浅睡
for (SleepTimeAnalysisVO otherSleepTime : sleepTimeAnalysisVOList) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP.getCode()) || otherSleepTime.getType().equals(SleepTypeEnum.GETUP.getCode())) {
continue;
}
String deepStartTime = otherSleepTime.getStartTime();
String deepEndTime = otherSleepTime.getEndTime();
LocalDateTime startDeepDateTime = LocalDateTime.parse(deepStartTime, DEFAULT_FORMATTER);
LocalDateTime endDeepDateTime = LocalDateTime.parse(deepEndTime, DEFAULT_FORMATTER);
if ((startDateTime.isBefore(startDeepDateTime) || startDateTime.equals(startDeepDateTime)) &&
(endDateTime.isAfter(endDeepDateTime) || endDateTime.equals(endDeepDateTime))) {
if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) {
deepList.add(otherSleepTime);
} else if (otherSleepTime.getType().equals(SleepTypeEnum.SLEEP_MODERATE.getCode())) {
midList.add(otherSleepTime);
} else if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) {
soberList.add(otherSleepTime);
} else {
otherSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightList.add(otherSleepTime);
}
lightSleepFlag = false;
}
}
if (lightSleepFlag) {
SleepTimeAnalysisVO lightSleepTime = new SleepTimeAnalysisVO();
lightSleepTime.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
lightSleepTime.setStartTime(startTime);
lightSleepTime.setEndTime(endTime);
lightList.add(lightSleepTime);
}
sleepTimeAnalysis.setDeepList(deepList);
sleepTimeAnalysis.setInterval(durationRange);
sleepTimeAnalysis.setMidList(midList);
sleepTimeAnalysis.setLightList(lightList);
sleepTimeAnalysis.setSoberList(soberList);
finalSleepTimeAnalysisList.add(sleepTimeAnalysis);
}
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);
} }
if (CollUtil.isNotEmpty(removeList)) {
rangeTimes.removeAll(removeList);
}
result.addAll(getLightList(rangeTimes));
});
}
private List<SleepTimeAnalysisVO> getLightList (List<LocalDateTime> rangeTimes) {
List<SleepTimeAnalysisVO> result = new ArrayList<>();
LocalDateTime startTime = null;
long count = 0;
for (int i = 0; i < rangeTimes.size(); i++) {
LocalDateTime time = rangeTimes.get(i);
if (startTime == null) {
startTime = time;
}
long minutes = Duration.between(startTime, time).toMinutes();
if (minutes != count) {
SleepTimeAnalysisVO analysisVO = new SleepTimeAnalysisVO();
analysisVO.setBelongToSleepTime(DateUtil.format(startTime, DatePattern.NORM_DATETIME_PATTERN));
analysisVO.setStartTime(DateUtil.format(startTime, DatePattern.NORM_DATETIME_PATTERN));
analysisVO.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
analysisVO.setEndTime(DateUtil.format(rangeTimes.get(i - 1), DatePattern.NORM_DATETIME_PATTERN));
analysisVO.setInterval(count - 1);
result.add(analysisVO);
startTime = time;
count = 1;
} else {
count++;
}
if (i == rangeTimes.size() - 1 && startTime != null) {
SleepTimeAnalysisVO analysisVO = new SleepTimeAnalysisVO();
analysisVO.setBelongToSleepTime(DateUtil.format(startTime, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
analysisVO.setStartTime(DateUtil.format(startTime, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
analysisVO.setType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
analysisVO.setEndTime(DateUtil.format(rangeTimes.get(i), DatePattern.NORM_DATETIME_MINUTE_PATTERN));
analysisVO.setInterval(count - 1);
result.add(analysisVO);
}
}
return result;
}
// 获取睡眠评估标准配置
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; private List<LocalDateTime> getRangeTime(LocalDateTime startTime, LocalDateTime endTime) {
long soberTime = 0; List<LocalDateTime> result = new ArrayList<>();
long soberCount = 0; long minutes = Duration.between(startTime, endTime).toMinutes();
long sleepTime = 0; for (int i = 0; i < minutes + 1; i++) {
long lightTime = 0; result.add(startTime.plusMinutes(i));
// 算出不同睡眠类型的总时长 }
for (SleepTimeAnalysisVO timeAnalysisVO : sleepTimeAnalysisVOList) { return result;
Long durationRange = getDurationRange(timeAnalysisVO.getStartTime(), timeAnalysisVO.getEndTime()); }
timeAnalysisVO.setInterval(durationRange);
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_DEEP.getCode())) { private PlatElderSleepAnalysis savePlatElderSleepAnalysis(SleepTimeDTO sleepTimeDTO,
deepTime += durationRange; SaasSleepEvaluateStandardReport evaluateStandardReport,
} String elderId, String currentDate, SleepCountDTO sleepCountDTO,
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SOBER.getCode())) { String tenantId,
soberTime += durationRange; String oriDeviceId) {
}
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP_LIGHTNESS.getCode())) { SleepTimeMinuteDTO sleepTimeMinute = getSleepTimeMinute(sleepTimeDTO);
lightTime += durationRange; long daySleepTime = sleepTimeMinute.getDaySleepTime() != null ? sleepTimeMinute.getDaySleepTime() : 0L;
soberCount++; long deepTime = sleepTimeMinute.getDeepTime() != null ? sleepTimeMinute.getDeepTime() : 0L;
} long dayRestTime = sleepTimeMinute.getDayRestTime() != null ? sleepTimeMinute.getDayRestTime() : 0L;
if (timeAnalysisVO.getType().equals(SleepTypeEnum.SLEEP.getCode())) { long soberTime = sleepTimeMinute.getSoberTime() != null ? sleepTimeMinute.getSoberTime() : 0L;
sleepTime += durationRange; long lightTime = sleepTimeMinute.getLightTime() != null ? sleepTimeMinute.getLightTime() : 0L;
} String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
} long scoreLong = Long.parseLong(score);
if (scoreLong > 100) {
long deepScore = 0; scoreLong = 100;
for (int i = 0; i < sleepDeepConfigList.size(); i++) { }
long hour = deepTime / 60; if (scoreLong < 0) {
SleepConfigVO sleepConfigVO = sleepDeepConfigList.get(i); scoreLong = 0;
long configHour = Long.parseLong(sleepConfigVO.getHour()); }
if (i == 0 && Objects.equals(hour, configHour)) { EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(scoreLong);
deepScore = Long.parseLong(sleepConfigVO.getScore()); // 长者一天的睡眠分析
} PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
if (i > 0 && hour > configHour) { elderSleepAnalysis.setElderId(elderId);
deepScore += Long.parseLong(sleepConfigVO.getScore()); elderSleepAnalysis.setActionCount(sleepCountDTO.getTotalActionCount());
} elderSleepAnalysis.setTurnedCount(sleepCountDTO.getTotalTurnedCount());
} elderSleepAnalysis.setHappenDate(currentDate);
saasSleepEvaluateStandardReportVO.setDeepScore(deepScore); elderSleepAnalysis.setSleepScore(String.valueOf(scoreLong));
long soberScore = 0; elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
for (int i = 0; i < soberConfigList.size(); i++) { elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
SleepConfigVO sleepConfigVO = soberConfigList.get(i); elderSleepAnalysis.setSleepResult(sleepReport.getResult());
long configHour = Long.parseLong(sleepConfigVO.getHour()); elderSleepAnalysis.setTenantId(tenantId);
if (i == 0 && soberCount != 0) { elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
soberScore = Long.parseLong(sleepConfigVO.getScore()) * soberCount; elderSleepAnalysis.setOriDeviceId(oriDeviceId);
} platElderSleepAnalysisService.remove(Wrappers.<PlatElderSleepAnalysis>lambdaQuery()
if (i > 0 && soberTime > configHour) { .eq(PlatElderSleepAnalysis::getHappenDate, currentDate).eq(PlatElderSleepAnalysis::getElderId, elderId));
soberScore += Long.parseLong(sleepConfigVO.getScore()); platElderSleepAnalysisService.save(elderSleepAnalysis);
} return elderSleepAnalysis;
} }
saasSleepEvaluateStandardReportVO.setSoberScore(soberScore);
private List<PlatElderSleep> saveElderSleep(SleepTimeDTO sleepTimeDTO, String platElderId, String tenantId, String currentDate) {
long lightScore = 0; List<PlatElderSleep> elderSleepList = new ArrayList<>();
List<SleepTimeAnalysisVO> deepList = sleepTimeDTO.getDeepList();
long lightHour = lightTime / 60; List<SleepTimeAnalysisVO> moderateList = sleepTimeDTO.getMidList();
long lightnessConfigHour = Long.parseLong(lightnessConfigVO.getHour()); List<SleepTimeAnalysisVO> lightList = sleepTimeDTO.getLightList();
if ( Objects.equals(lightHour,lightnessConfigHour)) { List<SleepTimeAnalysisVO> soberList = sleepTimeDTO.getSoberList();
lightScore = Long.parseLong(lightnessConfigVO.getScore()); List<SleepTimeAnalysisVO> sleepList = sleepTimeDTO.getSleepList();
} List<SleepTimeAnalysisVO> restList = sleepTimeDTO.getRestList();
saasSleepEvaluateStandardReportVO.setLightScore(lightScore); List<PlatSleepRangeVO> sleepRangeList = new ArrayList<>();
if (CollUtil.isNotEmpty(deepList)) {
long sleepScore = 0; for (SleepTimeAnalysisVO analysisVO : deepList) {
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(SleepTypeEnum.SLEEP_DEEP.getCode());
if (i == 0 && Objects.equals(hour, configHour)) { sleepRangeVO.setBelongToSleepTime(analysisVO.getBelongToSleepTime());
sleepScore = Long.parseLong(sleepConfigVO.getScore()); sleepRangeList.add(sleepRangeVO);
} }
if (i > 0 && hour > configHour) { }
sleepScore += Long.parseLong(sleepConfigVO.getScore()); if (CollUtil.isNotEmpty(moderateList)) {
} for (SleepTimeAnalysisVO analysisVO : sleepTimeDTO.getMidList()) {
} PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
saasSleepEvaluateStandardReportVO.setSleepScore(sleepScore); sleepRangeVO.setStartTime(analysisVO.getStartTime());
long totalScore = sleepScore + deepScore + lightScore - soberScore; sleepRangeVO.setEndTime(analysisVO.getEndTime());
saasSleepEvaluateStandardReportVO.setTotalScore(totalScore); sleepRangeVO.setSleepType(SleepTypeEnum.SLEEP_MODERATE.getCode());
sleepRangeVO.setBelongToSleepTime(analysisVO.getBelongToSleepTime());
// 记录长者一天睡眠的记录 sleepRangeList.add(sleepRangeVO);
long daySleepTime = 0; }
long dayRestTime = 0; }
for (PlatElderSleep elderSleep : elderSleepList) { if (CollUtil.isNotEmpty(lightList)) {
elderSleep.setElderId(elder.getId()); for (SleepTimeAnalysisVO analysisVO : lightList) {
elderSleep.setHappenDate(currentDate); PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
elderSleep.setTenantId(tenantId); sleepRangeVO.setStartTime(analysisVO.getStartTime());
sleepRangeVO.setEndTime(analysisVO.getEndTime());
if (ElderSleepType.SLEEP.getCode() == elderSleep.getElderSleepType()) { sleepRangeVO.setSleepType(SleepTypeEnum.SLEEP_LIGHTNESS.getCode());
daySleepTime += elderSleep.getInterval(); sleepRangeVO.setBelongToSleepTime(analysisVO.getBelongToSleepTime());
} sleepRangeList.add(sleepRangeVO);
if (ElderSleepType.REST.getCode() == elderSleep.getElderSleepType()) { }
dayRestTime += elderSleep.getInterval(); }
} if (CollUtil.isNotEmpty(soberList)) {
} for (SleepTimeAnalysisVO analysisVO : soberList) {
int riseRepeatThreshold = Integer.parseInt(analysisModel.getRiseRepeatThreshold()); PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
platElderSleepService.saveBatch(elderSleepList); sleepRangeVO.setStartTime(analysisVO.getStartTime());
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport); sleepRangeVO.setEndTime(analysisVO.getEndTime());
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score)); sleepRangeVO.setSleepType(SleepTypeEnum.SOBER.getCode());
sleepRangeVO.setBelongToSleepTime(analysisVO.getBelongToSleepTime());
// 长者一天的睡眠分析 sleepRangeList.add(sleepRangeVO);
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis(); }
elderSleepAnalysis.setElderId(elder.getId()); }
elderSleepAnalysis.setActionCount(totalActionCount); List<SleepTimeAnalysisVO> getUpList = sleepTimeDTO.getGetUpList();
elderSleepAnalysis.setTurnedCount(totalTurnedCount); if (CollUtil.isNotEmpty(getUpList)) {
elderSleepAnalysis.setHappenDate(currentDate); for (SleepTimeAnalysisVO analysisVO : getUpList) {
elderSleepAnalysis.setSleepScore(score); PlatSleepRangeVO sleepRangeVO = new PlatSleepRangeVO();
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime)); sleepRangeVO.setStartTime(analysisVO.getStartTime());
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime)); sleepRangeVO.setEndTime(analysisVO.getEndTime());
elderSleepAnalysis.setSleepResult(sleepReport.getResult()); sleepRangeVO.setSleepType(SleepTypeEnum.GETUP.getCode());
elderSleepAnalysis.setTenantId(tenantId); sleepRangeVO.setBelongToSleepTime(analysisVO.getBelongToSleepTime());
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate()); sleepRangeList.add(sleepRangeVO);
elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId()); }
result.add(elderSleepAnalysis); }
platElderSleepAnalysisService.save(elderSleepAnalysis); Map<String, List<PlatSleepRangeVO>> rangeMap = sleepRangeList.stream().collect(Collectors.groupingBy(PlatSleepRangeVO::getBelongToSleepTime));
if (CollUtil.isNotEmpty(sleepList)) {
for (SleepTimeAnalysisVO analysisVO : sleepList) {
List<PlatSleepRangeVO> rangeList = rangeMap.get(analysisVO.getStartTime());
PlatElderSleep platElderSleep = new PlatElderSleep();
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setTenantId(tenantId);
platElderSleep.setElderSleepType(SleepTypeEnum.SLEEP.getType());
platElderSleep.setSleepRecord(rangeList);
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(restList)) {
for (SleepTimeAnalysisVO analysisVO : restList) {
PlatElderSleep platElderSleep = new PlatElderSleep();
List<PlatSleepRangeVO> rangeList = rangeMap.get(analysisVO.getStartTime());
platElderSleep.setStartSleep(LocalDateTime.parse(analysisVO.getStartTime(), DEFAULT_FORMATTER));
platElderSleep.setEndSleep(LocalDateTime.parse(analysisVO.getEndTime(), DEFAULT_FORMATTER));
platElderSleep.setElderId(platElderId);
platElderSleep.setTenantId(tenantId);
platElderSleep.setElderSleepType(SleepTypeEnum.RESTING.getType());
platElderSleep.setSleepRecord(rangeList);
platElderSleep.setInterval(analysisVO.getInterval());
platElderSleep.setHappenDate(currentDate);
elderSleepList.add(platElderSleep);
}
}
if (CollUtil.isNotEmpty(elderSleepList)) {
platElderSleepService.remove(Wrappers.<PlatElderSleep>lambdaQuery()
.eq(PlatElderSleep::getHappenDate, currentDate).eq(PlatElderSleep::getElderId, platElderId));
elderSleepList.forEach(e -> platElderSleepService.save(e));
}
return elderSleepList;
}
private SleepTimeMinuteDTO getSleepTimeMinute(SleepTimeDTO sleepTimeDTO) {
SleepTimeMinuteDTO result = new SleepTimeMinuteDTO();
result.setDaySleepTime(CollUtil.isNotEmpty(sleepTimeDTO.getSleepList()) ? sleepTimeDTO.getSleepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setDeepTime(CollUtil.isNotEmpty(sleepTimeDTO.getDeepList()) ? sleepTimeDTO.getDeepList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setLightTime(CollUtil.isNotEmpty(sleepTimeDTO.getLightList()) ? sleepTimeDTO.getLightList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
result.setSoberTime(CollUtil.isNotEmpty(sleepTimeDTO.getSoberList()) ? sleepTimeDTO.getSoberList().stream().mapToLong(SleepTimeAnalysisVO::getInterval).reduce(0L, Long::sum) : 0);
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day) {
List<String> dayHourRangeList = getLastDayHourRange(month, day);
LocalDate now = LocalDate.now();
String currentDate = now.minusDays(1).toString();
if (month != null && day != null) {
currentDate = LocalDate.of(2024, month, day).minusDays(1).toString();
}else {
month = now.getMonth().getValue();
day = now.getDayOfMonth();
}
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());
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));
// || !"1712648603580764161".equals(elder.getId())
if (elder == null) {
continue;
}
PlatDevice platDevice = platDeviceService.getById(platRoomBedDevice.getDeviceId());
// || !"218A00XE2669104".equals(platDevice.getOriDeviceId())
if (platDevice == null) {
continue;
}
String tenantId = elder.getTenantId();
// dayHourRangeList = Lists.newArrayList("2024-01-30 23:00:00~2024-01-31 00:32:00","2024-01-31 00:32:00~2024-01-31 01:32:00","2024-01-31 01:32:00~2024-01-31 02:40:00");
for (String hourRange : dayHourRangeList) {
String[] hourRangeArray = hourRange.split("~");
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 10000, hourRangeArray[0], hourRangeArray[1]);
if (CollUtil.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);
// deviceLogService.save(deviceOperationLogEntities);
deviceOperationLogEntities.clear();
TreeMap<String, AnalysisVO> statisticsMap = getPerMinuteData(minuteMap, analysisModel);
if (CollUtil.isNotEmpty(statisticsMap)) {
//测试环境数据 device_minute_info
// deviceLogService.saveEntity(statisticsMap, platRoomBedDevice.getId());
totalMap.putAll(statisticsMap);
}
}
if (CollUtil.isEmpty(totalMap)) {
continue;
}
// 没有上报数据的时间,填默认值
deviceLogService.fillDefaultData(totalMap, month, day);
// 记录长者不同类型的睡眠时间
List<SleepTimeAnalysisVO> sleepTimeAnalysisVOList = Lists.newArrayList();
// 入睡时间
TreeMap<String, TreeMap<String, AnalysisVO>> sleepTypeMap =
getFallAsleepData(totalMap, sleepTimeActionDuration, sleepTimeAnalysisVOList, analysisModel);
// 获取睡眠和小憩
SleepCountDTO sleepCountDTO = deepSleepAndRestData(sleepTypeMap, analysisModel, sleepTimeAnalysisVOList);
// 满足睡眠条件的map
TreeMap<String, TreeMap<String, AnalysisVO>> daySleepMap = sleepCountDTO.getAllSleepMap();
// 深度睡眠
deepSleepData(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
// 中度睡眠
middleSleep(daySleepMap, analysisModel, sleepTimeAnalysisVOList);
// 清醒
sober(daySleepMap, sleepTimeAnalysisVOList);
countTotal(sleepTypeMap, sleepCountDTO);
//浅睡
SleepTimeDTO sleepTimeDTO = groupSleepData(sleepTimeAnalysisVOList);
List<PlatElderSleep> platElderSleeps = saveElderSleep(sleepTimeDTO, elder.getId(), elder.getTenantId(), 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;
} }
...@@ -760,14 +1004,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -760,14 +1004,15 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
lightScore = Integer.parseInt(lightnessConfig.getScore()) * multiplier; lightScore = Integer.parseInt(lightnessConfig.getScore()) * multiplier;
} }
Integer totalScore = sleepScore.get() + deepScore.get() + lightScore - soberScore.get(); Integer totalScore = sleepScore.get() + deepScore.get() + lightScore - soberScore.get();
if (totalScore < 0) {
totalScore = 0;
}
return String.valueOf(totalScore); return String.valueOf(totalScore);
} }
public Long getDurationRange(String startTime, String endTime) { public Long getDurationRange(String startTime, String endTime) {
LocalDateTime target = LocalDateTime.parse(startTime, DEFAULT_FORMATTER); LocalDateTime target = LocalDateTime.parse(startTime, DEFAULT_FORMATTER);
// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期
// LocalDate today = LocalDate.now();
LocalDateTime source = LocalDateTime.parse(endTime, DEFAULT_FORMATTER); LocalDateTime source = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
return Duration.between(target, source).toMinutes(); return Duration.between(target, source).toMinutes();
} }
...@@ -777,11 +1022,11 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -777,11 +1022,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 static 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(2024, month, day), LocalTime.now()); localDateTime = LocalDateTime.of(LocalDate.of(2024, month, day), LocalTime.of(8,0));
} }
List<String> list = Lists.newArrayList(); List<String> list = Lists.newArrayList();
String startTime; String startTime;
...@@ -794,8 +1039,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -794,8 +1039,4 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return list; return list;
} }
public static LocalDateTime getDayStart(LocalDate time) {
return time.atTime(0, 0, 0);
}
} }
package com.makeit.service.wechat; package com.makeit.service.wechat;
import com.makeit.utils.third.wechat.WechatBindDTO;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO; import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.user.wechat.WechatUserInfo; import com.makeit.utils.user.wechat.WechatUserInfo;
...@@ -9,4 +10,5 @@ public interface PlatElderChildrenInfoUserLoginWechatService { ...@@ -9,4 +10,5 @@ public interface PlatElderChildrenInfoUserLoginWechatService {
void logout(); void logout();
void bind(WechatBindDTO dto);
} }
package com.makeit.service.wechat.impl; package com.makeit.service.wechat.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.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.global.aspect.misc.nofill.NoFillUtil; import com.makeit.global.aspect.misc.nofill.NoFillUtil;
...@@ -12,9 +16,7 @@ import com.makeit.utils.data.id.IdGen; ...@@ -12,9 +16,7 @@ import com.makeit.utils.data.id.IdGen;
import com.makeit.utils.msg.config.WxConfig; 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.*;
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;
...@@ -25,7 +27,9 @@ import org.springframework.stereotype.Service; ...@@ -25,7 +27,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@Service @Service
public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElderChildrenInfoUserLoginWechatService { public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElderChildrenInfoUserLoginWechatService {
...@@ -121,6 +125,49 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde ...@@ -121,6 +125,49 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde
} }
@Override @Override
public void bind(WechatBindDTO dto) {
WechatCodeDTO codeDTO = getAppid(dto);
if (StrUtil.isBlank(dto.getId()) || codeDTO == null || StrUtil.isBlank(codeDTO.getOpenid())) {
return;
}
bindToChildrenInfo(dto.getId(), codeDTO.getOpenid());
}
private WechatCodeDTO getAppid(WechatBindDTO dto) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, Object> params = new HashMap<>(12);
params.put("appid", dto.getAppid());
params.put("secret", dto.getSecret());
params.put("code", dto.getCode());
params.put("grant_type", dto.getGrantType());
String post = "";
try {
post = HttpUtil.post(url, params);
logger.info("获取微信公众号appid:response:{},params:{}", post, dto);
} catch (Exception e) {
logger.error("获取微信公众号appid失败:response:{}", post);
}
return JSONUtil.toBean(post, WechatCodeDTO.class);
}
private void bindToChildrenInfo(String id, String weChatOpenid) {
PlatElderChildrenInfo childrenInfo = platElderChildrenInfoService.getById(id);
if (childrenInfo == null) {
return;
}
if (StrUtil.isNotBlank(childrenInfo.getOpenid())) {
List<PlatElderChildrenInfo> infoList = platElderChildrenInfoService.list(Wrappers.<PlatElderChildrenInfo>lambdaQuery()
.in(PlatElderChildrenInfo::getOpenid, childrenInfo.getOpenid()));
infoList.forEach(i -> i.setWeChatOpenid(weChatOpenid));
platElderChildrenInfoService.updateBatchById(infoList);
} else {
childrenInfo.setWeChatOpenid(weChatOpenid);
platElderChildrenInfoService.updateById(childrenInfo);
}
}
@Override
public void logout() { public void logout() {
TokenUtil.wechatLogout(); TokenUtil.wechatLogout();
} }
......
...@@ -8,4 +8,9 @@ public class PlatSleepRangeVO { ...@@ -8,4 +8,9 @@ public class PlatSleepRangeVO {
private String sleepType; private String sleepType;
private String startTime; private String startTime;
private String endTime; private String endTime;
/**
* 所属睡眠区间开始时间
*/
private String belongToSleepTime;
} }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.makeit.mapper.platform.elder.PlatElderChildrenInfoMapper">
<select id="list" parameterType="String" resultType="com.makeit.entity.platform.elder.PlatElderChildrenInfo">
select *
from plat_elder_children_info
where tenant_id = #{tenantId}
and find_in_set(#{elderIds},elder_id)
and del_flag = '0'
</select>
</mapper>
...@@ -19,4 +19,46 @@ ...@@ -19,4 +19,46 @@
ON T1._id COLLATE utf8mb4_general_ci = T2.id COLLATE utf8mb4_general_ci ON T1._id COLLATE utf8mb4_general_ci = T2.id COLLATE utf8mb4_general_ci
</select> </select>
<!-- 批量插入数据 查询主键ID注入到是实体中-->
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_info_log
(message_type,device_id,report_time,br,body_move,person_state,person,hr,created_time)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.messageType},#{item.deviceId},#{item.reportTime},#{item.br},#{item.bodyMove},
#{item.personState},#{item.person},#{item.hr},#{item.createdTime})
</foreach>
</insert>
<insert id="saveBatch" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_minute_info(total_hr, avg_hr, max_hr, min_hr, total_br, avg_br, max_br, min_br, hr_br_count,
action_count, turned_count, is_action, is_move_bed, is_minute_action_flag,
awake_minute_action_flag, br_stop_threshold, br_stop, br_stop_time, br_fast_threshold,
br_fast, br_fast_time, br_slow_threshold, br_slow, br_slow_time, hr_fast_threshold,
hr_fast, hr_fast_time, hr_slow_threshold, hr_slow, hr_slow_time, created_time,device_id)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.totalHr},#{item.avgHr},#{item.maxHr},#{item.minHr},#{item.totalBr},#{item.avgBr},#{item.maxBr},#{item.minBr},#{item.hrBrCount},
#{item.actionCount},#{item.turnedCount},#{item.isAction},#{item.isMoveBed},#{item.isMinuteActionFlag},
#{item.awakeMinuteActionFlag},#{item.brStopThreshold},#{item.brStop},#{item.brStopTime},#{item.brFastThreshold},
#{item.brFast},#{item.brFastTime},#{item.brSlowThreshold},#{item.brSlow},#{item.brSlowTime},#{item.hrFastThreshold},
#{item.hrFast},#{item.hrFastTime},#{item.hrSlowThreshold},#{item.hrSlow},#{item.hrSlowTime},#{item.createdTime},#{item.deviceId})
</foreach>
</insert>
<select id="getData" resultType="com.makeit.module.iot.vo.analysis.AnalysisVO">
select * from device_minute_info where device_id = '1732647368962203650' order by created_time
</select>
</mapper> </mapper>
...@@ -115,7 +115,7 @@ iot: ...@@ -115,7 +115,7 @@ iot:
clientId: fyxmb5h52iKwE2Hi clientId: fyxmb5h52iKwE2Hi
secureKey: 22fZbnH36wdHn7ZTyKKHraFw233npcez secureKey: 22fZbnH36wdHn7ZTyKKHraFw233npcez
sync: sync:
enable: false enable: true
mqtt: mqtt:
username: admin|1693982115969 username: admin|1693982115969
...@@ -141,8 +141,10 @@ wx: ...@@ -141,8 +141,10 @@ wx:
msgDataFormat: JSON msgDataFormat: JSON
mp: mp:
config: config:
appid: wx5c73cad7aeb788c6 appid: wxa5ddf4b1355ce62a
secret: 7c3a0665bf2adbe67a58a4d6c8017243 secret: 92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms: sms:
send: send:
url: http://www.aozoneyun.com/message/message/send url: http://www.aozoneyun.com/message/message/send
......
...@@ -12,7 +12,7 @@ spring: ...@@ -12,7 +12,7 @@ spring:
name: iot-server name: iot-server
datasource: datasource:
url: jdbc:mysql://124.71.100.177:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true url: jdbc:mysql://192.168.0.29:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
username: jenlinks-iot username: jenlinks-iot
password: jenlinks-iot@123Frrd password: jenlinks-iot@123Frrd
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
...@@ -139,8 +139,10 @@ wx: ...@@ -139,8 +139,10 @@ wx:
msgDataFormat: JSON msgDataFormat: JSON
mp: mp:
config: config:
appid: wx5c73cad7aeb788c6 appid: wxa5ddf4b1355ce62a
secret: 7c3a0665bf2adbe67a58a4d6c8017243 secret: 92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms: sms:
send: send:
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
</encoder> </encoder>
</appender> </appender>
<!-- info --> <!-- logging -->
<appender name="FILELOGGING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILELOGGING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level> <level>INFO</level>
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
<FileNamePattern>${logback.logdir}/${logback.appname}/info/log_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${logback.logdir}/${logback.appname}/info/log_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>10</maxHistory> <maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize> <maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy> </timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy> </rollingPolicy>
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
</FileNamePattern> </FileNamePattern>
<maxHistory>10</maxHistory> <maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize> <maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy> </timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy> </rollingPolicy>
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
<FileNamePattern>${logback.logdir}/${logback.appname}/warn/log_warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${logback.logdir}/${logback.appname}/warn/log_warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>10</maxHistory> <maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize> <maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy> </timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy> </rollingPolicy>
......
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