Commit 16949764 by 罗志长

Merge branch 'dev'

parents 633933d2 1d7be20b
Showing with 1109 additions and 401 deletions
ALTER TABLE `plat_device_other`
ALTER TABLE `plat_device_other`
......@@ -91,3 +91,34 @@ ALTER TABLE `plat_alarm_record`
ALTER TABLE `plat_tenant`
ADD COLUMN `open_api_url` varchar(128) COMMENT '第三方接口url' AFTER `secret`;
CREATE TABLE `plat_elder_breathe_heart_rate_record` (
`id` varchar(64) NOT NULL COMMENT 'id',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`del_flag` char(1) NOT NULL COMMENT ' 删除标志 0否 1是 ',
`tenant_id` varchar(64) DEFAULT NULL COMMENT ' 租户id ',
`elder_id` varchar(64) DEFAULT NULL COMMENT '长者id',
`report_time` bigint(20) DEFAULT NULL COMMENT '上报时间',
`heart_rate` int(11) DEFAULT NULL COMMENT '心率',
`respiratory_rate` int(11) DEFAULT NULL COMMENT '呼吸率',
`body_move` int(11) DEFAULT NULL COMMENT '体动值',
`device_id` varchar(255) DEFAULT NULL COMMENT '设备id',
`iot_device_id` varchar(64) DEFAULT NULL COMMENT 'iot设备id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='长者呼吸心率记录';
-- end
ALTER TABLE `plat_alarm_record`
ADD COLUMN `device_time` varchar(64) COMMENT '当前上报时间' AFTER `wechat_read_flag`;
alter table plat_elder_sleep_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id';
alter table plat_elder_breathe_analysis add column `ori_device_id` varchar(64) default NULL COMMENT 'iot设备id';
\ No newline at end of file
......@@ -59,6 +59,7 @@ public class SaasDeviceReportDayController {
@ApiOperation("心率呼吸评价")
@PostMapping("heartRespiratoryEvaluation")
@TenantIdIgnore
@AuthIgnore
public ApiResponseEntity<PlatElderHeartRespiratoryEvaluationVO> heartRespiratoryEvaluation(@RequestBody PlatElderReportDTO platElderIdDTO) {
return ApiResponseUtils.success(platElderDayReportDayService.heartRespiratoryEvaluation(platElderIdDTO));
}
......
......@@ -7,16 +7,20 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.alarm.PlatAlarmRecordQueryDTO;
import com.makeit.dto.platform.device.PlatDeviceQueryDTO;
import com.makeit.dto.platform.elder.PlatElderIdDTO;
import com.makeit.dto.platform.elder.PlatElderQueryDTO;
import com.makeit.global.annotation.AuthIgnore;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderRealTimeService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.utils.old.StringUtils;
import com.makeit.vo.platform.alarm.PlatAlarmExternalRecordVO;
import com.makeit.vo.platform.alarm.PlatAlarmRecordVO;
import com.makeit.vo.platform.device.PlatDeviceListVO;
import com.makeit.vo.platform.elder.PlatElderListVO;
import com.makeit.vo.platform.elder.realtime.PlatElderRealTimeHeartRespiratoryVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContextAware;
......@@ -40,6 +44,8 @@ public class IotPlatExternalController {
private PlatDeviceService platDeviceService;
@Autowired
private PlatAlarmRecordService platAlarmRecordService;
@Autowired
private PlatElderRealTimeService platElderRealTimeService;
@ApiOperation("长者列表")
@PostMapping("elderPage")
......@@ -48,7 +54,7 @@ public class IotPlatExternalController {
public ApiResponseEntity<PageVO<PlatElderListVO>> elderPage(@RequestBody PageReqDTO<PlatElderQueryDTO> page) {
PlatElderQueryDTO dto = page.getData();
if (dto == null || StringUtils.isEmpty(dto.getOrgId())) {
return ApiResponseUtils.success(new PageVO<>());
return ApiResponseUtils.success(PageVO.emptyPage());
}
return ApiResponseUtils.success(platElderService.page(page));
}
......@@ -61,7 +67,7 @@ public class IotPlatExternalController {
public ApiResponseEntity<PageVO<PlatDeviceListVO>> devicePage(@RequestBody PageReqDTO<PlatDeviceQueryDTO> pageReqDTO) {
PlatDeviceQueryDTO dto = pageReqDTO.getData();
if (dto == null || StringUtils.isEmpty(dto.getOrgId())) {
return ApiResponseUtils.success(new PageVO<>());
return ApiResponseUtils.success(PageVO.emptyPage());
}
return ApiResponseUtils.success(platDeviceService.page(pageReqDTO));
}
......@@ -74,7 +80,7 @@ public class IotPlatExternalController {
public ApiResponseEntity<PageVO<PlatAlarmRecordVO>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> pageReqDTO) {
PlatAlarmRecordQueryDTO dto = pageReqDTO.getData();
if (dto == null || StringUtils.isEmpty(dto.getOrgId())) {
return ApiResponseUtils.success(new PageVO<>());
return ApiResponseUtils.success(PageVO.emptyPage());
}
return ApiResponseUtils.success(platAlarmRecordService.page(pageReqDTO));
}
......@@ -88,4 +94,25 @@ public class IotPlatExternalController {
return ApiResponseUtils.success();
}
@ApiOperation("获取呼吸上报数据")
@PostMapping("deviceHealthReport")
@TenantIdIgnore
@AuthIgnore
public ApiResponseEntity<PlatElderRealTimeHeartRespiratoryVO> deviceHealthData(@RequestBody PlatElderIdDTO dto) {
return ApiResponseUtils.success(platElderRealTimeService.deviceHealthReport(dto));
}
@ApiOperation("获取跌倒记录数据")
@PostMapping("fallRecord")
@TenantIdIgnore
@AuthIgnore
public ApiResponseEntity<PageVO<PlatAlarmExternalRecordVO>> fallRecord(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> pageReqDTO) {
PlatAlarmRecordQueryDTO dto = pageReqDTO.getData();
if (dto == null || StringUtils.isEmpty(dto.getOrgId())) {
return ApiResponseUtils.success(PageVO.emptyPage());
}
return ApiResponseUtils.success(platAlarmRecordService.fallRecord(pageReqDTO));
}
}
......@@ -40,7 +40,16 @@ public class RSAUtils {
RSAPublicKey publicKey = getPublicKey(PUBLIC_KEY);
System.out.println("------------");
String encrypt = publicEncrypt("{\"page\":1,\"limit\":10,\"data\":{}}", publicKey, "UTF-8");
String encrypt = publicEncrypt("{\n" +
" \"page\": 1,\n" +
" \"limit\": 10,\n" +
" \"data\": {\n" +
" \"alarmType\": \"1\",\n" +
" \"orgId\": \"1701420402418446337\",\n" +
" \"createDateFrom\": \"2023-12-15 00:00:00\",\n" +
" \"createDateTo\": \"2023-12-15 23:59:59\"\n" +
" }\n" +
"}", publicKey, "UTF-8");
System.out.println(encrypt);
......
......@@ -23,8 +23,8 @@ public class RequestIdInterceptor implements HandlerInterceptor {
RequestIdUtil.set();
logger.info("本次请求ip:{},remoteAddr:{}", IpUtil.getIp(),IpUtil.getRemoteAddr());
logger.info("本次请求路径: {}", request.getRequestURI());
//logger.info("本次请求ip:{},remoteAddr:{}", IpUtil.getIp(),IpUtil.getRemoteAddr());
//logger.info("本次请求路径: {}", request.getRequestURI());
return true;
}
......
......@@ -102,11 +102,11 @@ public class IotDevicePropertiesOperateService extends IotCommonService {
return "";
}
public String deviceFunctionAttr(String deviceId, Long timestamp) {
public String deviceFunctionAttr(String deviceId, String alarmId) {
String url = iotUrl + "device/invoked/" + deviceId + "/function/misinformation";
Map<String,Map<String,Object>> map = Maps.newHashMap();
Map<String,Object> reqMap = Maps.newHashMap();
reqMap.put("timestamp",timestamp);
reqMap.put("alarmId",alarmId);
reqMap.put("url", uploadUrl);
map.put("misinformationNotify",reqMap);
HttpRequest request = buildRequest(url, JSON.toJSONString(map));
......
......@@ -7,6 +7,7 @@ import com.google.common.collect.Maps;
import com.makeit.module.admin.vo.plat.PlatTenantVO;
import com.makeit.module.iot.dto.IotQueryParam;
import com.makeit.module.iot.util.HttpRequest;
import com.makeit.module.iot.util.Response;
import com.makeit.module.iot.util.SimpleHttpRequest;
import com.makeit.module.iot.vo.DeviceInstanceEntity;
import com.makeit.module.iot.vo.DeviceProductEntity;
......@@ -141,7 +142,9 @@ public class IotOrgService extends IotCommonService{
HttpRequest request = buildRequest(url,body);
try {
ResponseMessage responseMessage = sendPost(url, request);
Response response = request.post();
Object result = JSON.parse(response.asBytes());
ResponseMessage responseMessage = JSON.parseObject(result.toString(), ResponseMessage.class);
if (responseMessage.getStatus() == 200) {
IotPagerResult pagerResult = JSON.parseObject(responseMessage.getResult().toString(), IotPagerResult.class);
......
package com.makeit.module.iot.vo.analysis;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SaasSleepEvaluateStandardReportVO {
@ApiModelProperty("深睡")
private Long deepScore;
@ApiModelProperty("浅睡")
private Long lightScore;
@ApiModelProperty("清醒")
private Long soberScore;
@ApiModelProperty("睡眠")
private Long sleepScore;
@ApiModelProperty("总得分")
private Long totalScore;
......
package com.makeit.module.controller.children.space;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.space.PlatRegionSettingDTO;
import com.makeit.dto.platform.space.PlatRegionSettingFixQueryDTO;
import com.makeit.service.platform.space.PlatRegionSettingFixService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "子女端小程序-区域设置固化")
@RestController
@RequestMapping("/children/plat/region/setting/fix")
public class PlatRegionSettingFixChildrenController {
@Autowired
private PlatRegionSettingFixService platRegionSettingFixService;
@ApiOperation("列表")
@PostMapping("list")
public ApiResponseEntity<List<PlatRegionSettingDTO>> list(@RequestBody PlatRegionSettingFixQueryDTO dto) {
List<PlatRegionSettingDTO> data = platRegionSettingFixService.list(dto);
return ApiResponseUtils.success(data);
}
}
......@@ -6,6 +6,7 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.external.huineng.HuiNengService;
import com.makeit.global.annotation.AuthIgnore;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
......@@ -44,6 +45,8 @@ public class PlatElderSleepController {
@Autowired
private PlatElderCoordinateRecordService platElderCoordinateRecordService;
@Autowired
private PlatElderBreatheHeartRateRecordService platElderBreatheHeartRateRecordService;
@Autowired
private HuiNengService huiNengService;
......@@ -60,6 +63,7 @@ public class PlatElderSleepController {
@ApiOperation("测试")
@PostMapping("test2")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> heartRespiratoryTask() {
platElderBreatheDayStatService.heartRespiratoryTask();
return ApiResponseUtils.success();
......@@ -68,17 +72,19 @@ public class PlatElderSleepController {
@ApiOperation("测试")
@GetMapping("test3")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<List<PlatElderBreatheAnalysis>> elderHeartRespiratoryAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) {
return ApiResponseUtils.success(platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask(month, day));
}
@ApiOperation("测试")
@PostMapping("test4")
@GetMapping("test4")
@AuthIgnore
public ApiResponseEntity<Void> elderSleepSleepAnalysisTask() {
platElderSleepService.elderSleepSleepAnalysisTask();
return ApiResponseUtils.success();
@TenantIdIgnore
public ApiResponseEntity<List<PlatElderSleepAnalysis>> elderSleepSleepAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) {
return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day));
}
@ApiOperation("测试")
......@@ -89,6 +95,15 @@ public class PlatElderSleepController {
return ApiResponseUtils.success();
}
@ApiOperation("测试")
@PostMapping("test6")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<Void> breatheHeartRateRecordTask() {
platElderBreatheHeartRateRecordService.breatheHeartRateRecordTask();
return ApiResponseUtils.success();
}
@ApiOperation("编辑设备属性")
@PostMapping("editDeviceProperties")
@AuthIgnore
......
package com.makeit.module.controller.space;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.space.PlatRegionSettingDTO;
import com.makeit.dto.platform.space.PlatRegionSettingFixQueryDTO;
import com.makeit.dto.platform.space.PlatRegionSettingQueryDTO;
import com.makeit.service.platform.space.PlatRegionSettingFixService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "区域设置固化")
@RestController
@RequestMapping("/plat/region/setting/fix")
public class PlatRegionSettingFixController {
@Autowired
private PlatRegionSettingFixService platRegionSettingFixService;
@ApiOperation("列表")
@PostMapping("list")
public ApiResponseEntity<List<PlatRegionSettingDTO>> list(@RequestBody PlatRegionSettingFixQueryDTO dto) {
List<PlatRegionSettingDTO> data = platRegionSettingFixService.list(dto);
return ApiResponseUtils.success(data);
}
}
......@@ -10,7 +10,6 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.alarm.PlatAlarmRecordQueryDTO;
import com.makeit.enums.report.PlatformTypeEnum;
import com.makeit.global.annotation.AuthIgnore;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.utils.user.common.CommonUserUtil;
import com.makeit.vo.platform.alarm.PlatAlarmRecordVO;
......@@ -34,17 +33,14 @@ public class PlatAlarmRecordWechatController {
@ApiOperation("列表")
@PostMapping("page")
@AuthIgnore
public ApiResponseEntity<Map<String,Object>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
//小程序告警记录只看到发给自己的告警
String userId = CommonUserUtil.getUserId();
// String userId = "1700085146788667394";
PlatAlarmRecordQueryDTO data = dto.getData();
data.setNotifyUser(userId);
Map<String,Object> resMap = Maps.newHashMap();
PageVO<PlatAlarmRecordVO> page = platAlarmRecordService.page(dto);
// boolean b = page.getList().stream().anyMatch(platAlarmRecord -> StringUtils.equals(CommonEnum.NO.getValue(), platAlarmRecord.getStatus()));
boolean b = CollUtil.isNotEmpty(page.getList()) && page.getList().get(0).getStatusFlag();
resMap.put("todoFlag",b);
resMap.put("page",page);
......
package com.makeit.module.controller.wechat.space;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.space.PlatRegionSettingDTO;
import com.makeit.dto.platform.space.PlatRegionSettingFixQueryDTO;
import com.makeit.service.platform.space.PlatRegionSettingFixService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "平台端小程序-区域设置固化")
@RestController
@RequestMapping("/wechat/plat/region/setting/fix")
public class PlatRegionSettingFixWechatController {
@Autowired
private PlatRegionSettingFixService platRegionSettingFixService;
@ApiOperation("列表")
@PostMapping("list")
public ApiResponseEntity<List<PlatRegionSettingDTO>> list(@RequestBody PlatRegionSettingFixQueryDTO dto) {
List<PlatRegionSettingDTO> data = platRegionSettingFixService.list(dto);
return ApiResponseUtils.success(data);
}
}
......@@ -32,6 +32,7 @@ public class PlatAlarmCheckDTO {
private String abnormalValue;
//设备状态
private String messageType;
private String deviceTime;
}
......@@ -19,7 +19,7 @@ public class PlatElderIdDTO {
@ApiModelProperty(value = "长者id")
private String elderId;
@ApiModelProperty(value = "长者id")
@ApiModelProperty(value = "机构id")
private String orgId;
@ApiModelProperty(value = "设备id")
......
package com.makeit.dto.platform.space;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ApiModel("PlatRegionSettingFixQueryDTO")
public class PlatRegionSettingFixQueryDTO {
@ApiModelProperty("报告类型 0:日报 1:周报")
private String reportType;
@ApiModelProperty("房间ID")
private String roomId;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("日期 yyyy-MM-dd")
private LocalDate now;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("开始时间 yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("结束时间 yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}
......@@ -93,8 +93,8 @@ public class PlatAlarmRecord extends BaseBusEntity {
@ApiModelProperty(value = "微信端 0-未读 1-已读")
private String wechatReadFlag;
@ApiModelProperty(value = "记录当前时间")
private String deviceTime;
}
......@@ -42,7 +42,7 @@ public class PlatElderBreatheAnalysis extends BaseBusEntity {
@ApiModelProperty(value = "当前日期 yyyy-mm-dd")
private String happenDate;
// @TableField(exist = false)
// private String remake;
@ApiModelProperty(value = "原始设备ID")
private String oriDeviceId;
}
package com.makeit.entity.platform.elder;
import com.makeit.common.entity.BaseBusEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "PlatElderBreatheHeartRateRecord对象", description = "长者呼吸心率记录")
public class PlatElderBreatheHeartRateRecord extends BaseBusEntity {
@ApiModelProperty(value = "长者id")
private String elderId;
@ApiModelProperty(value = "上报时间")
private Long reportTime;
@ApiModelProperty(value = "心率")
private Integer heartRate;
@ApiModelProperty(value = "呼吸率")
private Integer respiratoryRate;
@ApiModelProperty(value = "体动值")
private Integer bodyMove;
@ApiModelProperty(value = "设备Id")
private String deviceId;
@ApiModelProperty(value = "设备Id")
private String iotDeviceId;
}
......@@ -47,5 +47,8 @@ public class PlatElderSleepAnalysis extends BaseBusEntity {
@ApiModelProperty(value = "翻身次数")
private Integer turnedCount;
@ApiModelProperty(value = "原始设备ID")
private String oriDeviceId;
}
......@@ -19,5 +19,15 @@ public enum SleepTypeEnum {
private String value;
public static SleepTypeEnum getSleepType(String code) {
for (SleepTypeEnum typeEnum : SleepTypeEnum.values()) {
if (typeEnum.getCode().equals(code)) {
return typeEnum;
}
}
return null;
}
}
......@@ -65,6 +65,8 @@ public class HuiNengStrategy implements OpenApiBaseStrategy {
reportInfo.setSignalStrength("");
reportInfo.setQuantityElectricity("");
reportInfo.setECG("");
reportInfo.setSignalStrength("");
reportInfo.setQuantityElectricity("");
reportInfo.setBloodSugar("");
reportInfo.setBloodOxygen("");
reportInfo.setBloodPressure("");
......
package com.makeit.mapper.platform.elder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.platform.elder.PlatElderBreatheHeartRateRecord;
public interface PlatElderBreatheHeartRateRecordMapper extends BaseMapper<PlatElderBreatheHeartRateRecord> {
}
......@@ -12,6 +12,7 @@ import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.enums.report.PlatformTypeEnum;
import com.makeit.shengwang.agora.dto.PlatCallingDeviceDTO;
import com.makeit.shengwang.agora.vo.PlatAlarmCallDeviceVO;
import com.makeit.vo.platform.alarm.PlatAlarmExternalRecordVO;
import com.makeit.vo.platform.alarm.PlatAlarmRecordVO;
/**
......@@ -74,4 +75,6 @@ public interface PlatAlarmRecordService extends IService<PlatAlarmRecord> {
PlatAlarmCallDeviceVO callingDevice(PlatCallingDeviceDTO dto);
PlatAlarmCallDeviceVO callingDeviceAuthIgnoreRtm(PlatCallingDeviceDTO id);
PageVO<PlatAlarmExternalRecordVO> fallRecord(PageReqDTO<PlatAlarmRecordQueryDTO> pageReqDTO);
}
......@@ -112,7 +112,6 @@ public class BehaviorAlarm implements IAlarm {
long count = endLong - startLong;
//进入空间时间满足告警时长,判断是否已经告警过了
if (duration!= 0 && count / 1000 >= duration && StringUtils.equals(alarmRedisDTO.getAlarm(), CommonEnum.NO.getValue())) {
log.error("空间雷达发出告警,设备plat_id:" + platDevice.getId());
if(duration1 != 0) {
alarmRedisDTO.setAlarm(CommonEnum.YES.getValue());
RedisUtil.set(RedisConst.ALARM_DEVICE_BEHAVIOR_ID + deviceId, alarmRedisDTO);
......@@ -127,6 +126,7 @@ public class BehaviorAlarm implements IAlarm {
if (startLong == null) {
return;
}
log.info("设备离线或者没有人删除缓存,保存空间时长:{}",deviceId);
//保存每次进入空间时长
platDayDurationRecordService.saveDayDurationRecord(platAlarmCheckDTO, alarmRedisDTO);
RedisUtil.delete(RedisConst.ALARM_DEVICE_BEHAVIOR_ID + deviceId);
......@@ -150,7 +150,7 @@ public class BehaviorAlarm implements IAlarm {
platAlarmRecordService.getElderListByDeviceId(platAlarmCheckDTO);
List<PlatElder> platElderList = platAlarmCheckDTO.getPlatElderList();
if (CollectionUtils.isEmpty(platElderList)) {
log.error("未关联长者,设备id:"+platAlarmCheckDTO.getPlatDevice().getId());
//log.error("未关联长者,设备id:"+platAlarmCheckDTO.getPlatDevice().getId());
return;
}
......
......@@ -59,12 +59,10 @@ public class BreathAlarm implements IAlarm {
platAlarmRecordService.getElderListByDeviceId(platAlarmCheckDTO);
List<PlatElder> platElderList = platAlarmCheckDTO.getPlatElderList();
if(CollectionUtils.isEmpty(platElderList)){
log.error("呼吸设备未关联长者,设备plat_id:" + platAlarmCheckDTO.getPlatDevice().getId());
return;
}
PlatAlarmConfig config = platAlarmCheckDTO.getPlatAlarmConfig();
if (CommonEnum.NO.getValue().equals(config.getStatus())) {
log.error("呼吸告警配置为禁用,告警配置id:" + config.getId());
return;
}
PlatElder platElder = platElderList.get(0);
......@@ -94,7 +92,6 @@ public class BreathAlarm implements IAlarm {
int hasPerson = (int) properties.get("person");
if (0 == hasPerson) {
log.info("当前上报数据无人,不需要告警");
RedisUtil.delete(RedisConst.ALARM_DEVICE_BR_ID + deviceId);
return;
}
......@@ -184,6 +181,7 @@ public class BreathAlarm implements IAlarm {
PlatAlarmRecord platAlarmRecord = platAlarmRecordService.convertToPlatAlarmRecord(platAlarmCheckDTO,platElder);
platAlarmRecord.setElderIds(platElder.getId());
platAlarmRecord.setElderName(platElder.getName());
platAlarmRecord.setDeviceTime(platAlarmCheckDTO.getDeviceTime());
platAlarmRecordService.noticeDeviceAlarm(platAlarmCheckDTO.getPlatAlarmConfig(), platAlarmRecord);
log.error("长者呼吸异常,发出告警,设备id:"+platDevice.getId()+", 长者名称:"+platElder.getName());
}
......
......@@ -69,7 +69,7 @@ public class FallAlarm implements IAlarm {
*/
@Override
public void checkConfig(PlatAlarmCheckDTO platAlarmCheckDTO) {
log.info("跌倒预警config开始");
//log.info("跌倒预警config开始");
JSONObject properties = platAlarmCheckDTO.getProperties();
PlatDevice platDevice = platAlarmCheckDTO.getPlatDevice();
String deviceId = platDevice.getId();
......@@ -77,7 +77,7 @@ public class FallAlarm implements IAlarm {
properties = new JSONObject();
}
String personState = Convert.toStr(properties.get("personState"));
log.info("跌倒预警personState:{}", personState);
//log.info("跌倒预警personState:{}", personState);
//记录停留时长
recordDuration(platAlarmCheckDTO);
......@@ -232,6 +232,7 @@ public class FallAlarm implements IAlarm {
PlatAlarmRecord platAlarmRecord = platAlarmRecordService.convertToPlatAlarmRecord(platAlarmCheckDTO, platElder);
platAlarmRecord.setElderIds(platElder.getId());
platAlarmRecord.setElderName(platElder.getName());
platAlarmRecord.setDeviceTime(platAlarmCheckDTO.getDeviceTime());
platAlarmRecordService.noticeDeviceAlarm(platAlarmCheckDTO.getPlatAlarmConfig(), platAlarmRecord);
log.error("长者跌倒,发出告警,设备id:" + platDevice.getId() + ", 长者名称:" + platElder.getName());
}
......
......@@ -50,13 +50,13 @@ public class HeartAlarm implements IAlarm {
platAlarmRecordService.getElderListByDeviceId(platAlarmCheckDTO);
List<PlatElder> platElderList = platAlarmCheckDTO.getPlatElderList();
if(CollectionUtils.isEmpty(platElderList)){
log.error("心率设备未关联长者,设备plat_id:" + platAlarmCheckDTO.getPlatDevice().getId());
//log.error("心率设备未关联长者,设备plat_id:" + platAlarmCheckDTO.getPlatDevice().getId());
return;
}
PlatAlarmConfig config = platAlarmCheckDTO.getPlatAlarmConfig();
String messageType = platAlarmCheckDTO.getMessageType();
if (CommonEnum.NO.getValue().equals(config.getStatus())) {
log.error("呼吸告警配置为禁用,告警配置id:" + config.getId());
//log.error("呼吸告警配置为禁用,告警配置id:" + config.getId());
return;
}
PlatElder platElder = platElderList.get(0);
......@@ -107,7 +107,6 @@ public class HeartAlarm implements IAlarm {
RedisUtil.delete(RedisConst.ALARM_DEVICE_HR_ID + deviceId);
return;
}
log.info("hr:{},end:{},start:{},mes:{}", hr, end, start, messageType);
if ((hr > end || hr < start) && StringUtils.equalsAnyIgnoreCase(messageType, "REPORT_PROPERTY")) {
if(alarmRedisDTO==null){
alarmRedisDTO = new AlarmRedisDTO();
......@@ -167,6 +166,7 @@ public class HeartAlarm implements IAlarm {
PlatAlarmRecord platAlarmRecord = platAlarmRecordService.convertToPlatAlarmRecord(platAlarmCheckDTO,platElder);
platAlarmRecord.setElderIds(platElder.getId());
platAlarmRecord.setElderName(platElder.getName());
platAlarmRecord.setDeviceTime(platAlarmCheckDTO.getDeviceTime());
platAlarmRecordService.noticeDeviceAlarm(platAlarmCheckDTO.getPlatAlarmConfig(), platAlarmRecord);
log.error("长者心率异常,发出告警,设备plat_id:"+platDevice.getId()+", 长者名称:"+platElder.getName());
}
......
......@@ -51,10 +51,9 @@ public class OffBedAlarm implements IAlarm {
public void checkConfig(PlatAlarmCheckDTO platAlarmCheckDTO) {
PlatDevice platDevice = platAlarmCheckDTO.getPlatDevice();
platAlarmRecordService.getElderListByDeviceId(platAlarmCheckDTO);
log.info("执行离床checkConfig方法:");
//log.info("执行离床checkConfig方法:");
List<PlatElder> platElderList = platAlarmCheckDTO.getPlatElderList();
if (CollectionUtils.isEmpty(platElderList)) {
log.error("离床告警心率设备未关联长者,设备plat_id:" + platAlarmCheckDTO.getPlatDevice().getId());
return;
}
PlatAlarmConfig config = alarmConfigCacheUtil.get(platDevice.getOrgId(), PlatAlarmConfigEnum.AlarmTypeEnum.OFF_BED.getValue());
......@@ -105,13 +104,13 @@ public class OffBedAlarm implements IAlarm {
// 1-有人 0-无人
AlarmRedisDTO alarmRedisDTO = RedisUtil.get(RedisConst.ALARM_DEVICE_OFF_BED_ID + deviceId);
if ("1".equals(personState)) {
log.info("deviceId:{},离床告警有人状态下,删除redis", deviceId);
// log.info("deviceId:{},离床告警有人状态下,删除redis", deviceId);
RedisUtil.delete(RedisConst.ALARM_DEVICE_OFF_BED_ID + deviceId);
return;
}
String messageType = platAlarmCheckDTO.getMessageType();
if (StringUtils.equalsAnyIgnoreCase(messageType, "OFFLINE", "DISCONNECT")) {
log.info("deviceId:{},离床告警设备下线,删除redis off_bed 预警", deviceId);
//log.info("deviceId:{},离床告警设备下线,删除redis off_bed 预警", deviceId);
RedisUtil.delete(RedisConst.ALARM_DEVICE_OFF_BED_ID + deviceId);
}
if (isOffBed) {
......
......@@ -57,6 +57,7 @@ import com.makeit.utils.sql.join.JoinUtil;
import com.makeit.utils.user.common.CommonUserUtil;
import com.makeit.utils.user.common.CommonUserVO;
import com.makeit.utils.user.wechat.WechatUserUtil;
import com.makeit.vo.platform.alarm.PlatAlarmExternalRecordVO;
import com.makeit.vo.platform.alarm.PlatAlarmRecordVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
......@@ -65,7 +66,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Matcher;
......@@ -143,6 +143,22 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
return PageUtil.toPageVO(dtos, page);
}
@Override
public PageVO<PlatAlarmExternalRecordVO> fallRecord(PageReqDTO<PlatAlarmRecordQueryDTO> pageReqDTO) {
PlatAlarmRecordQueryDTO data = pageReqDTO.getData();
if (StringUtils.isEmpty(data.getOrgId())){
throw new RuntimeException("机构id不能为空");
}
if (data.getCreateDateFrom() == null && data.getCreateDateTo() == null) {
throw new RuntimeException("告警起始时间不能为空");
}
data.setAlarmType("1");
data.setStatus("0");
PageVO<PlatAlarmRecordVO> page = page(pageReqDTO);
List<PlatAlarmRecordVO> list = page.getList();
return PageUtil.toPageVO(BeanDtoVoUtils.listVo(list, PlatAlarmExternalRecordVO.class), page);
}
/**
* 子女端告警列表
*
......@@ -477,7 +493,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
//todo 要支持 设备绑定多个空间
List<PlatRoomBedDevice> platRoomBedDeviceList = platRoomBedDeviceService.list(roomBedDeviceLambdaQueryWrapper);
if(CollectionUtils.isEmpty(platRoomBedDeviceList)){
log.error("设备没绑定房间:"+platDevice.getId());
// log.error("设备没绑定房间:"+platDevice.getId());
return;
}
......@@ -617,9 +633,10 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
if (platDevice == null) {
throw new RuntimeException("找不到告警关联的设备,设备已解绑" + deviceId);
}
Timestamp timestamp = Timestamp.valueOf(platAlarmRecord.getCreateDate());
log.info("开始想设备发送误报通知");
String result = iotDevicePropertiesOperateService.deviceFunctionAttr(platDevice.getOriDeviceId(), timestamp.getTime());
String result = iotDevicePropertiesOperateService.deviceFunctionAttr(platDevice.getOriDeviceId(),
StringUtils.isEmpty(platAlarmRecord.getDeviceTime()) ? "" : platAlarmRecord.getDeviceTime());
if (StringUtils.isNotEmpty(result)) {
throw new RuntimeException("发送误报通知失败:" + result);
}
......
package com.makeit.service.platform.elder;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.elder.PlatElderBreatheHeartRateRecord;
import java.util.List;
public interface PlatElderBreatheHeartRateRecordService extends IService<PlatElderBreatheHeartRateRecord> {
void breatheHeartRateRecordTask();
List<PlatElderBreatheHeartRateRecord> list(String elderId, String iotDeviceId, String tenantId, long start, long end);
}
......@@ -14,4 +14,5 @@ import com.makeit.entity.platform.elder.PlatElderCoordinateRecord;
public interface PlatElderCoordinateRecordService extends IService<PlatElderCoordinateRecord> {
void coordinateRecordTask();
}
......@@ -41,6 +41,8 @@ public interface PlatElderDayReportDayService {
List<String> failRecordList(PlatElderReportDTO platElderIdDTO);
List<PlatElderCoordinateVO> coordinateList(String elderId, long start, long end);
List<PlatElderCoordinateVO> coordinateList(String elderId, String deviceId, LocalDateTime start, LocalDateTime end);
List<PlatElderCoordinateVO> coordinateList(PlatElderReportDTO platElderIdDTO);
......
......@@ -33,5 +33,5 @@ public interface PlatElderRealTimeService {
List<PlatElderCoordinateVO> coordinate(PlatElderIdDTO platElderIdDTO);
PlatElderRealTimeHeartRespiratoryVO deviceHealthReport(PlatElderIdDTO dto);
}
......@@ -2,6 +2,10 @@ package com.makeit.service.platform.elder;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import java.util.List;
/**
* <p>
......@@ -13,7 +17,10 @@ import com.makeit.entity.platform.elder.PlatElderSleep;
*/
public interface PlatElderSleepService extends IService<PlatElderSleep> {
void elderSleepSleepAnalysisTask();
List<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month, Integer day);
void test1();
String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport);
}
......@@ -8,7 +8,6 @@ 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.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
......@@ -21,8 +20,6 @@ import com.makeit.enums.report.ConditionTypeEnum;
import com.makeit.mapper.platform.elder.PlatElderBreatheAnalysisMapper;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import com.makeit.module.iot.vo.analysis.BreatheAbnormalVO;
import com.makeit.module.iot.vo.analysis.DiseaseReportVO;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
......@@ -37,22 +34,22 @@ import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.time.LocalDateTimeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
/**
......@@ -64,6 +61,7 @@ import java.util.stream.Collectors;
* @since 2023-09-15
*/
@Service
@Slf4j
public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBreatheAnalysisMapper, PlatElderBreatheAnalysis> implements PlatElderBreatheAnalysisService {
private static final Logger logger = LoggerFactory.getLogger(PlatElderBreatheAnalysisServiceImpl.class);
......@@ -89,45 +87,15 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@Override
@Transactional(rollbackFor = Exception.class)
public List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month,Integer day) {
// 12-06,12-18 12-07、 12-12(70分)
LocalDate nowDate = LocalDate.now();
if (month != null && day != null) {
nowDate = LocalDate.of(2023, month, day);
}
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
List<PlatElderBreatheAnalysis> result = new ArrayList<>();
if (CollectionUtils.isEmpty(elderList)) {
return result;
private LocalDateTime longToTime(Long longTime) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(longTime), ZoneOffset.of("+8"));
}
List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId);
List<PlatElderBreatheDayStat> elderBreatheDayStatList = platElderBreatheDayStatService.list(new QueryWrapper<PlatElderBreatheDayStat>().lambda()
.in(PlatElderBreatheDayStat::getElderId, elderIdList)
.eq(PlatElderBreatheDayStat::getDay, yesDate));
Map<String, PlatElderBreatheDayStat> breatheDayStatMap = StreamUtil.toMapDep(elderBreatheDayStatList, PlatElderBreatheDayStat::getElderId);
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
SaasDiseaseModel saasDiseaseModel = saasDiseaseModelService.getOne(new QueryWrapper<SaasDiseaseModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
Map<String, PlatElderBreatheAnalysis> analysisMap = StreamUtil.toMapDep(platElderBreatheAnalysisService.list(Wrappers.<PlatElderBreatheAnalysis>lambdaQuery()
.in(PlatElderBreatheAnalysis::getElderId, elderIdList)
.eq(PlatElderBreatheAnalysis::getHappenDate, yesDate).last("limit 1")), PlatElderBreatheAnalysis::getElderId);
private PlatElderBreatheAnalysis elderHeartAnalysis(PlatElder platElder, Map<String, PlatElderBreatheDayStat> breatheDayStatMap,
LocalDateTime yesStart, SaasSleepAnalysisModel analysisModel,
SaasDiseaseModel saasDiseaseModel,
LocalDate yesDate, Map<String, PlatElderBreatheAnalysis> analysisMap,
SaasDiseaseEvaluateReport saasDiseaseEvaluateReport) {
// 呼吸率
int breatheThresholdMin = Integer.parseInt(analysisModel.getBreatheThresholdMin());
int breatheThresholdMax = Integer.parseInt(analysisModel.getBreatheThresholdMax());
......@@ -137,23 +105,36 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
int heartThresholdMin = Integer.parseInt(analysisModel.getHeartThresholdMin());
int heartThresholdMax = Integer.parseInt(analysisModel.getHeartThresholdMax());
int heartDuration = Integer.parseInt(analysisModel.getHeartDuration());
for (PlatElder platElder : elderList) {
PlatElderBreatheDayStat elderBreatheDayStat = breatheDayStatMap.get(platElder.getId());
if (elderBreatheDayStat == null) {
continue;
return new PlatElderBreatheAnalysis();
}
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElder.getId(), null);
if (platDevice == null) {
continue;
return new PlatElderBreatheAnalysis();
}
List<String> dayHourRange = getLastDayHourRange(yesStart);
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>();
String reportStartTime = "";
String reportEndTime = "";
// 呼吸暂停
AtomicInteger brStopCount = new AtomicInteger(0);
AtomicLong brStopSecond = new AtomicLong(0);
// 呼吸过速
AtomicInteger brFastCount = new AtomicInteger(0);
;
AtomicLong brFastSecond = new AtomicLong();
// 呼吸过缓
AtomicInteger brSlowCount = new AtomicInteger(0);
AtomicLong brSlowSecond = new AtomicLong();
// 心率过速
AtomicInteger hrFastCount = new AtomicInteger(0);
AtomicLong hrFastSecond = new AtomicLong();
// 心率过缓
AtomicInteger hrSlowCount = new AtomicInteger(0);
AtomicLong hrSlowSecond = new AtomicLong();
for (String hourRange : dayHourRange) {
String[] hourRangeArray = hourRange.split("~");
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]);
List<DeviceOperationLogEntity> deviceOperationLogEntities = productDeviceService.getDeviceLogByTimeRange(
platDevice.getOriDeviceId(), "reportProperty", 5000, hourRangeArray[0], hourRangeArray[1]);
if (CollectionUtils.isEmpty(deviceOperationLogEntities)) {
continue;
}
......@@ -161,213 +142,160 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
.filter(deviceOperationLogEntity -> deviceOperationLogEntity.getType().contains("reportProperty"))
.map(deviceOperationLogEntity -> {
DeviceInfoContentBreathe deviceInfoContentBreathe = JsonUtil.toObj((String) deviceOperationLogEntity.getContent(), DeviceInfoContentBreathe.class);
assert deviceInfoContentBreathe != null;
deviceInfoContentBreathe.setReportTime(formatLongTime(deviceInfoContentBreathe.getTimestamp()));
return deviceInfoContentBreathe;
})
.collect(Collectors.toList());
Map<String, List<DeviceInfoContentBreathe>> minuteMap = StreamUtil.groupBy(deviceInfoContentBreatheList, DeviceInfoContentBreathe::getReportTime);
deviceOperationLogEntities.clear();
// 统计每小时的体动和翻身
Map<String, AnalysisVO> statisticsMap = Maps.newHashMap();
List<DeviceInfoContentBreathe> deviceInfoContentBreathes;
for (Map.Entry<String, List<DeviceInfoContentBreathe>> entry : minuteMap.entrySet()) {
if (StringUtils.isEmpty(reportStartTime)) {
reportStartTime = entry.getKey();
}
reportEndTime = entry.getKey();
deviceInfoContentBreathes = entry.getValue();
DeviceInfoContentBreathe.Properties breatheProperties;
// 呼吸暂停
int brStopCount = 0;
int brStopSecond = 0;
// 呼吸过速
int brFastCount = 0;
int brFastSecond = 0;
int brFast = 0;
// 呼吸过缓
int brSlowCount = 0;
int brSlowSecond = 0;
int brSlow = 0;
// 心率过速
int hrFastCount = 0;
int hrFast = 0;
int hrFastSecond = 0;
// 心率过缓
int hrSlowCount = 0;
int hrSlowSecond = 0;
int hrSlow = 0;
AnalysisVO analysisVO = new AnalysisVO();
for (DeviceInfoContentBreathe infoContentBreathe : deviceInfoContentBreathes) {
// 体动指数
breatheProperties = infoContentBreathe.getProperties();
int br = breatheProperties.getBr();
int hr = breatheProperties.getHr();
Integer hasPerson = breatheProperties.getPerson(); // 0无人,1有人
if (hasPerson == 0) {
continue;
}
AtomicBoolean existHrFast = new AtomicBoolean(false);
AtomicBoolean existHrSlow = new AtomicBoolean(false);
AtomicBoolean existBrFast = new AtomicBoolean(false);
AtomicBoolean existBrSlow = new AtomicBoolean(false);
AtomicBoolean existBrStop = new AtomicBoolean(false);
deviceInfoContentBreatheList.forEach(deviceInfo -> {
DeviceInfoContentBreathe.Properties deviceProperties = deviceInfo.getProperties();
int br = deviceProperties.getBr();
int hr = deviceProperties.getHr();
Integer hasPerson = deviceProperties.getPerson(); // 0无人,1有人
// 0和255设备误报直接跳过
if (hasPerson == 0 || hr == 255 || br == 255) {
brStopSecond.set(0);
brFastSecond.set(0);
brSlowSecond.set(0);
hrFastSecond.set(0);
hrSlowSecond.set(0);
existHrFast.set(false);
existHrSlow.set(false);
existBrFast.set(false);
existBrSlow.set(false);
existBrStop.set(false);
return;
}
Long timestamp = deviceInfo.getTimestamp();
// 判断呼吸暂停
if (br == 0) {
brStopSecond++;
if (brStopSecond == breatheDuration) {
brStopCount++;
brStopSecond = 0;
}
} else {
brStopSecond = 0;
}
// 判断呼吸率阈值,记录发生时间和当前呼吸率
if (breatheThresholdMax < br && br != 255) {
if (brFast == 0) {
brFast = br;
}
brFastSecond++;
if (brFastSecond == breatheDuration) {
brFastCount++;
brFastSecond = 0;
}
} else {
brFastSecond = 0;
}
if (br < breatheThresholdMin) {
if (brSlow == 0) {
brSlow = br;
}
brSlowSecond++;
if (brSlowSecond == breatheDuration) {
brSlowCount++;
brSlowSecond = 0;
}
} else {
brSlowSecond = 0;
}
if (heartThresholdMax < hr && hr != 255) {
if (hrFast == 0) {
hrFast = br;
}
hrFastSecond++;
if (hrFastSecond == heartDuration) {
hrFastCount++;
hrFastSecond = 0;
}
} else {
hrFastSecond = 0;
}
if (heartThresholdMin > hr) {
if (hrSlow == 0) {
hrSlow = br;
}
hrSlowSecond++;
if (hrSlowSecond == heartDuration) {
hrSlowCount++;
hrSlowSecond = 0;
}
long firstStopSecond = brStopSecond.get();
if (firstStopSecond == 0) {
log.info("第一次呼吸暂停的时间:{}", longToTime(timestamp));
brStopSecond.set(timestamp);
}
if (firstStopSecond != 0 && (timestamp - firstStopSecond) / 1000 >= breatheDuration) {
// 避免每10s生成一次统计的方式,切换状态后重新计算
if(!existBrStop.get()) {
log.info("第一次呼吸暂停持续时间满足:{}:now:{}", breatheDuration, longToTime(timestamp));
brStopCount.getAndIncrement();
existBrStop.set(true);
}
}
brFastSecond.set(0);
brSlowSecond.set(0);
existBrFast.set(false);
existBrSlow.set(false);
} else if (breatheThresholdMax < br) {
//呼吸过快
long firstFastBr = brFastSecond.get();
if (firstFastBr == 0) {
log.info("第一次呼吸:{},fast大于阈值:{},的时间:{}", br, breatheThresholdMax, longToTime(timestamp));
brFastSecond.set(timestamp);
}
if (firstFastBr != 0 && (timestamp - firstFastBr) / 1000 >= breatheDuration) {
if (!existBrFast.get()) {
log.info("第一次呼吸:{},fast持续时间满足:{}:now:{}", br, breatheDuration, longToTime(timestamp));
brFastCount.getAndIncrement();
existBrFast.set(true);
}
}
brSlowSecond.set(0);
brStopSecond.set(0);
existBrSlow.set(false);
existBrStop.set(false);
} else if (br < breatheThresholdMin) {
// 呼吸过慢
long firstSlowBr = brSlowSecond.get();
if (firstSlowBr == 0) {
log.info("第一次呼吸:{},slow小于阈值:{},的时间:{}", br, breatheThresholdMin, longToTime(timestamp));
brSlowSecond.set(timestamp);
}
if (firstSlowBr != 0 && (timestamp - firstSlowBr) / 1000 >= breatheDuration) {
if (!existBrSlow.get()) {
log.info("第一次呼吸:{},slow持续时间满足:{}:now:{}", br, breatheDuration, longToTime(timestamp));
brSlowCount.getAndIncrement();
}
}
brFastSecond.set(0);
brStopSecond.set(0);
existBrFast.set(false);
existBrStop.set(false);
} else {
hrSlowSecond = 0;
}
}
analysisVO.setBrStopThreshold(brStopCount);
analysisVO.setBrFastThreshold(brFastCount);
analysisVO.setBrSlowThreshold(brSlowCount);
analysisVO.setHrFastThreshold(hrFastCount);
analysisVO.setHrSlowThreshold(hrSlowCount);
statisticsMap.put(entry.getKey(), analysisVO);
}
TreeMap<String, AnalysisVO> treeMap = new TreeMap<>(statisticsMap);
totalMap.putAll(treeMap);
statisticsMap.clear();
treeMap.clear();
}
if (totalMap.isEmpty()) {
continue;
brSlowSecond.set(0);
brFastSecond.set(0);
brStopSecond.set(0);
existBrFast.set(false);
existBrStop.set(false);
existBrSlow.set(false);
log.info("呼吸正常:{},min:{},max:{},的时间:{}", br, breatheThresholdMin, breatheThresholdMax, longToTime(timestamp));
}
// 心率过快
if (heartThresholdMax < hr) {
long firstHrMax = hrFastSecond.get();
if (firstHrMax == 0) {
log.info("第一次心率:{},max大于阈值:{},的时间:{}", hr, heartThresholdMax, longToTime(timestamp));
hrFastSecond.set(timestamp);
}
if (firstHrMax != 0 && (timestamp - firstHrMax) / 1000 >= heartDuration) {
if (!existHrFast.get()) {
log.info("第一次心率:{},max持续时间满足:{}:now:{}", hr, heartDuration, longToTime(timestamp));
hrFastCount.getAndIncrement();
existHrFast.set(true);
}
}
hrSlowSecond.set(0);
existHrSlow.set(false);
} else if (heartThresholdMin > hr) {
// 心率过慢
long firstHrMin = hrSlowSecond.get();
if (firstHrMin == 0) {
log.info("第一次心率:{},min小于阈值:{},的时间:{}", hr, heartThresholdMin, longToTime(timestamp));
hrSlowSecond.set(timestamp);
}
if (firstHrMin != 0 && (timestamp - firstHrMin) / 1000 >= heartDuration) {
if (!existHrSlow.get()) {
log.info("第一次心率:{},min持续时间满足:{}:now:{}", hr, heartDuration, longToTime(timestamp));
hrSlowCount.getAndIncrement();
existHrSlow.set(true);
}
}
hrFastSecond.set(0);
existHrFast.set(false);
}else {
hrSlowSecond.set(0);
existHrSlow.set(false);
hrFastSecond.set(0);
existHrFast.set(false);
log.info("心率正常:{},min:{},max:{},的时间:{}", hr, heartThresholdMin,heartThresholdMax, longToTime(timestamp));
}
});
}
// 呼吸暂停
int apneaTime = Integer.parseInt(saasDiseaseModel.getApneaTime());
int apneaThreshold = Integer.parseInt(saasDiseaseModel.getApneaThreshold());
BigDecimal apneaRate = new BigDecimal(apneaTime).divide(new BigDecimal(apneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过速
int tachypneaTime = Integer.parseInt(saasDiseaseModel.getTachypneaTime());
int tachypneaThreshold = Integer.parseInt(saasDiseaseModel.getTachypneaThreshold());
BigDecimal tachypneaRate = new BigDecimal(tachypneaTime).divide(new BigDecimal(tachypneaThreshold), 2, RoundingMode.HALF_UP);
// 呼吸过缓
int bradypneaTime = Integer.parseInt(saasDiseaseModel.getBradypneaTime());
int bradypneaThreshold = Integer.parseInt(saasDiseaseModel.getBradypneaThreshold());
BigDecimal bradypneaRate = new BigDecimal(bradypneaTime).divide(new BigDecimal(bradypneaThreshold), 2, RoundingMode.HALF_UP);
// 心率过缓
int bradycardiaTime = Integer.parseInt(saasDiseaseModel.getBradycardiaTime());
int bradycardiaThreshold = Integer.parseInt(saasDiseaseModel.getBradycardiaThreshold());
BigDecimal bradycardiaRate = new BigDecimal(bradycardiaTime).divide(new BigDecimal(bradycardiaThreshold), 2, RoundingMode.HALF_UP);
// 心率过速
int tachycardiaTime = Integer.parseInt(saasDiseaseModel.getTachycardiaTime());
int tachycardiaComparison = Integer.parseInt(saasDiseaseModel.getTachycardiaThreshold());
BigDecimal tachycardiaRate = new BigDecimal(tachycardiaTime).divide(new BigDecimal(tachycardiaComparison), 2, RoundingMode.HALF_UP);
// 呼吸疾病报告
int brStopCount = 0;
int brFastCount = 0;
int brSlowCount = 0;
int hrFastCount = 0;
int hrSlowCount = 0;
// 计算异常的信息,并且统计异常的次数
List<BreatheAbnormalVO> breatheAbnormalVOList = Lists.newArrayList();
for (Map.Entry<String, AnalysisVO> entry : totalMap.entrySet()) {
AnalysisVO analysisVO = entry.getValue();
if (analysisVO.getBrStopThreshold() > 0) {
brStopCount += analysisVO.getBrStopThreshold();
}
if (analysisVO.getBrSlowThreshold() > 0) {
brSlowCount += analysisVO.getBrSlowThreshold();
}
if (analysisVO.getBrFastThreshold() > 0) {
brFastCount += analysisVO.getBrFastThreshold();
}
if (analysisVO.getHrFastThreshold() > 0) {
hrFastCount += analysisVO.getHrFastThreshold();
}
if (analysisVO.getHrSlowThreshold() > 0) {
hrSlowCount += analysisVO.getHrSlowThreshold();
}
}
int timeHourRange = 24;
if (StringUtils.isNotEmpty(reportStartTime) && StringUtils.isNotEmpty(reportEndTime)) {
Long durationRange = getDurationRange(reportStartTime, reportEndTime);
timeHourRange = (int) (durationRange / 60);
}
// 判断是否满足配置的呼吸心率异常类型
BigDecimal dayBrStopRate = brStopCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brStopCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrSlowRate = brSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brSlowCount), 2, RoundingMode.HALF_UP);
BigDecimal dayBrFastRate = brFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(brFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrFastRate = hrFastCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrFastCount), 2, RoundingMode.HALF_UP);
BigDecimal dayHrSlowRate = hrSlowCount == 0 ? BigDecimal.ZERO : new BigDecimal(timeHourRange).divide(new BigDecimal(hrSlowCount), 2, RoundingMode.HALF_UP);
boolean brStopFlag = false;
boolean brFastFlag = false;
boolean brSlowFlag = false;
......@@ -375,36 +303,30 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
boolean hrSlowFlag = false;
boolean normalFlag;
if (apneaRate.compareTo(dayBrStopRate) > 0) {
if (brStopCount.get() > apneaThreshold) {
brStopFlag = true;
}
if (tachypneaRate.compareTo(dayBrFastRate) > 0) {
if (brFastCount.get() > tachypneaThreshold) {
brFastFlag = true;
}
if (bradypneaRate.compareTo(dayBrSlowRate) > 0) {
if (brSlowCount.get() > bradypneaThreshold) {
brSlowFlag = true;
}
if (tachycardiaRate.compareTo(dayHrFastRate) > 0) {
if (hrFastCount.get() > tachycardiaComparison) {
hrFastFlag = true;
}
if (bradycardiaRate.compareTo(dayHrSlowRate) > 0) {
if (hrSlowCount.get() > bradycardiaThreshold) {
hrSlowFlag = true;
}
normalFlag = !(hrFastFlag || brStopFlag || brFastFlag || brSlowFlag || hrSlowFlag);
SaasDiseaseEvaluateReport saasDiseaseEvaluateReport = saasDiseaseEvaluateReportService.getOne(new QueryWrapper<SaasDiseaseEvaluateReport>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
String resultContent = saasDiseaseEvaluateReport.getResultContent();
List<DiseaseReportVO> evaluateReportList = JSON.parseArray(resultContent, DiseaseReportVO.class);
List<DiseaseReportVO> evaluateReportList = JSON.parseArray(saasDiseaseEvaluateReport.getResultContent(), DiseaseReportVO.class);
DiseaseReportVO finalReport = new DiseaseReportVO();
// 根据疾病标准配置的规则判断满足哪个区间范围
for (DiseaseReportVO diseaseReportVO : evaluateReportList) {
List<DiseaseReportVO.Condition> conditionList = diseaseReportVO.getCondition();
if (CollUtil.isEmpty(conditionList)) {
return result;
continue;
}
boolean conditionFlag = true;
......@@ -440,8 +362,13 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
finalReport = diseaseReportVO;
}
}
long scoreLong = Long.parseLong(finalReport.getScore());
if (scoreLong > 100) {
scoreLong = 100;
finalReport.setScore("100");
}
EvaluateReportVO diseaseReport = saasDiseaseReportService.getByScore(Long.parseLong(finalReport.getScore()));
EvaluateReportVO diseaseReport = saasDiseaseReportService.getByScore(scoreLong);
PlatElderBreatheAnalysis platElderBreatheAnalysis = new PlatElderBreatheAnalysis();
platElderBreatheAnalysis.setElderId(platElder.getId());
......@@ -451,6 +378,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
platElderBreatheAnalysis.setHappenDate(String.valueOf(yesDate));
platElderBreatheAnalysis.setTenantId(platElder.getTenantId());
platElderBreatheAnalysis.setBreatheEvaluate(diseaseReport == null ? "" : diseaseReport.getEvaluate());
platElderBreatheAnalysis.setOriDeviceId(platDevice.getOriDeviceId());
// 修复数据
PlatElderBreatheAnalysis breatheAnalysis = analysisMap.get(platElder.getId());
......@@ -460,11 +388,58 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
} else {
platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
}
result.add(platElderBreatheAnalysis);
return platElderBreatheAnalysis;
}
@Override
@Transactional(rollbackFor = Exception.class)
public List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month,Integer day) {
// 12-06,12-18 12-07、 12-12(70分)
LocalDate nowDate = LocalDate.now();
if (month != null && day != null) {
nowDate = LocalDate.of(2023, month, day);
}
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
List<PlatElderBreatheAnalysis> result = new ArrayList<>();
if (CollectionUtils.isEmpty(elderList)) {
return result;
}
List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId);
List<PlatElderBreatheDayStat> elderBreatheDayStatList = platElderBreatheDayStatService.list(new QueryWrapper<PlatElderBreatheDayStat>().lambda()
.in(PlatElderBreatheDayStat::getElderId, elderIdList)
.eq(PlatElderBreatheDayStat::getDay, yesDate));
Map<String, PlatElderBreatheDayStat> breatheDayStatMap = StreamUtil.toMapDep(elderBreatheDayStatList, PlatElderBreatheDayStat::getElderId);
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
SaasDiseaseModel saasDiseaseModel = saasDiseaseModelService.getOne(new QueryWrapper<SaasDiseaseModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
Map<String, PlatElderBreatheAnalysis> analysisMap = StreamUtil.toMapDep(platElderBreatheAnalysisService.list(Wrappers.<PlatElderBreatheAnalysis>lambdaQuery()
.in(PlatElderBreatheAnalysis::getElderId, elderIdList)
.eq(PlatElderBreatheAnalysis::getHappenDate, yesDate)), PlatElderBreatheAnalysis::getElderId);
SaasDiseaseEvaluateReport saasDiseaseEvaluateReport = saasDiseaseEvaluateReportService.getOne(
new QueryWrapper<SaasDiseaseEvaluateReport>().lambda().orderByDesc(BaseEntity::getCreateBy)
.last("limit 1"));
for (PlatElder platElder : elderList) {
PlatElderBreatheAnalysis platAnalysis = elderHeartAnalysis(platElder, breatheDayStatMap, yesStart, analysisModel,
saasDiseaseModel, yesDate, analysisMap, saasDiseaseEvaluateReport);
result.add(platAnalysis);
}
return result;
}
public Long getDurationRange(String startTime, String endTime) {
......@@ -472,7 +447,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期
// LocalDate today = LocalDate.now();
LocalDateTime source = LocalDateTime.parse(endTime, DEFAULT_FORMATTER);
return Duration.between(target, source).toMinutes();
return Duration.between(target, source).toHours() + 1;
}
public static String formatLongTime(long time) {
......
package com.makeit.service.platform.elder.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderBreatheHeartRateRecord;
import com.makeit.mapper.platform.elder.PlatElderBreatheHeartRateRecordMapper;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.elder.PlatElderBreatheHeartRateRecordService;
import com.makeit.service.platform.elder.PlatElderRealTimeService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.time.LocalDateTimeUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class PlatElderBreatheHeartRateRecordServiceImpl extends ServiceImpl<PlatElderBreatheHeartRateRecordMapper, PlatElderBreatheHeartRateRecord> implements PlatElderBreatheHeartRateRecordService {
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatElderRealTimeService platElderRealTimeService;
@Autowired
private IotProductDeviceService iotProductDeviceService;
@Override
public void breatheHeartRateRecordTask() {
LocalDate nowDate = LocalDate.now();
LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime start = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime end = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId));
if (CollectionUtils.isEmpty(elderList)) {
return;
}
List<PlatElderBreatheHeartRateRecord> list = Lists.newArrayList();
for (PlatElder e : elderList) {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(e.getId(), null);
if (platDevice == null) {
continue;
}
List<DeviceInfoContentBreathe> breatheList = iotProductDeviceService.getDeviceLogByTimeRangeBreathe(platDevice.getOriDeviceId(), 2 * 24 * 3600, start, end);
List<PlatElderBreatheHeartRateRecord> data = StreamUtil.map(breatheList, b -> {
PlatElderBreatheHeartRateRecord record = new PlatElderBreatheHeartRateRecord();
record.setElderId(e.getId());
record.setReportTime(b.getTimestamp());
record.setHeartRate(b.getProperties().getHr());
record.setRespiratoryRate(b.getProperties().getBr());
record.setBodyMove(b.getProperties().getBodymove());
record.setDeviceId(platDevice.getId());
record.setIotDeviceId(platDevice.getOriDeviceId());
record.setTenantId(e.getTenantId());
return record;
});
list.addAll(data);
}
saveBatch(list);
}
@Override
public List<PlatElderBreatheHeartRateRecord> list(String elderId, String iotDeviceId, String tenantId, long start, long end) {
LambdaQueryWrapper<PlatElderBreatheHeartRateRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(elderId), PlatElderBreatheHeartRateRecord::getElderId, elderId);
queryWrapper.eq(StringUtils.isNotBlank(iotDeviceId), PlatElderBreatheHeartRateRecord::getIotDeviceId, iotDeviceId);
queryWrapper.eq(StringUtils.isNotBlank(tenantId), PlatElderBreatheHeartRateRecord::getTenantId, tenantId);
queryWrapper.ge(PlatElderBreatheHeartRateRecord::getReportTime, start);
queryWrapper.le(PlatElderBreatheHeartRateRecord::getReportTime, end);
return list(queryWrapper);
}
}
......@@ -67,18 +67,12 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
return;
}
PlatElderCoordinateRecord platElderCoordinateRecord;
PlatRegionSettingFix platRegionSettingFix;
List<PlatRegionSetting> platRegionSettingList = platRegionSettingService.list(new QueryWrapper<>());
Function<PlatRegionSetting,String> function = entity -> entity.getRoomId() + "-" + entity.getDeviceId();
Map<String, PlatRegionSetting> platRegionSettingMap = StreamUtil.toMap(platRegionSettingList,
function);
for (PlatElder platElder : elderList) {
List<PlatElderCoordinateVO> elderCoordinateVOList = platElderDayReportDayService.coordinateList(platElder.getId(), null, datStart, dayEnd);
Set<String> deviceIdSet = Sets.newHashSet();
List<PlatElderCoordinateRecord> list = Lists.newArrayList();
for (PlatElderCoordinateVO vo : elderCoordinateVOList) {
platElderCoordinateRecord = new PlatElderCoordinateRecord();
......@@ -93,21 +87,15 @@ public class PlatElderCoordinateRecordServiceImpl extends ServiceImpl<PlatElderC
platElderCoordinateRecord.setElderId(platElder.getId());
platElderCoordinateRecord.setTenantId(platElder.getTenantId());
list.add(platElderCoordinateRecord);
deviceIdSet.add(vo.getDeviceId());
}
saveBatch(list);
for (String deviceId : deviceIdSet) {
PlatRegionSetting platRegionSetting = platRegionSettingMap.get(platElder.getRoomId() + "-" + deviceId);
if (platRegionSetting != null) {
platRegionSettingFix = new PlatRegionSettingFix();
BeanUtils.copyProperties(platRegionSetting,platRegionSettingFix,"id");
platRegionSettingFix.setElderId(platElder.getId());
platRegionSettingFix.setHappenDate(yesDate.toString());
platRegionSettingFixService.save(platRegionSettingFix);
}
}
}
List<PlatRegionSettingFix> settingFixList = StreamUtil.map(platRegionSettingList, setting -> {
PlatRegionSettingFix settingFix = new PlatRegionSettingFix();
BeanUtils.copyProperties(setting, settingFix,"id");
settingFix.setHappenDate(yesDate.toString());
return settingFix;
});
platRegionSettingFixService.saveBatch(settingFixList);
}
}
package com.makeit.service.platform.elder.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.makeit.common.entity.BaseEntity;
import com.makeit.dto.platform.elder.PlatElderReportDTO;
......@@ -8,15 +13,19 @@ import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.CommonEnum;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.fall.DeviceInfoContentFall;
import com.makeit.module.iot.vo.space.DeviceInfoContentSpace;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.alarm.PlatDayDurationRecordService;
import com.makeit.service.platform.elder.*;
import com.makeit.service.saas.SaasSleepEvaluateReportService;
import com.makeit.service.saas.SaasSleepEvaluateStandardReportService;
import com.makeit.utils.LongTimestampUtil;
import com.makeit.utils.data.convert.MathUtil;
import com.makeit.utils.data.convert.StreamUtil;
......@@ -26,14 +35,18 @@ import com.makeit.utils.time.LocalDateTimeUtils;
import com.makeit.vo.platform.elder.realtime.PlatElderCoordinateVO;
import com.makeit.vo.platform.elder.realtime.PlatElderRealTimeHeartRespiratoryVO;
import com.makeit.vo.platform.elder.report.day.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@Service
......@@ -62,7 +75,13 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Autowired
private PlatElderService platElderService;
@Autowired
private SaasSleepEvaluateReportService sleepEvaluateReportService;
@Autowired
private PlatElderCoordinateRecordService platElderCoordinateRecordService;
@Autowired
private PlatElderBreatheHeartRateRecordService platElderBreatheHeartRateRecordService;
@Autowired
private SaasSleepEvaluateStandardReportService saasSleepEvaluateStandardReportService;
private static LocalDateTime dayStartNow(LocalDate now) {
return LocalDateTimeUtils.getDayStart(now);
......@@ -84,35 +103,42 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
public PlatElderSleepEvaluationVO sleepEvaluation(PlatElderReportDTO platElderIdDTO) {
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
LocalDateTime start = dayStartNow(now);
LocalDateTime end = dayEndNow(now);
PlatElderSleepEvaluationVO platElderSleepEvaluationVO = new PlatElderSleepEvaluationVO();
String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
String elderId = platElderIdDTO.getElderId();
if (StringUtils.isNotEmpty(platElderIdDTO.getDeviceId())) {
PlatElder platElder = platElderService.getByDeviceId(platElderIdDTO.getDeviceId(),platElderIdDTO.getTenantId());
if (platElder != null) {
elderId = platElder.getId();
}
}
String deviceId = platElderIdDTO.getDeviceId();
String tenantId = platElderIdDTO.getTenantId();
// if (StringUtils.isNotEmpty(deviceId)) {
// PlatElder platElder = platElderService.getByDeviceId(deviceId,platElderIdDTO.getTenantId());
// if (platElder != null) {
// elderId = platElder.getId();
// }
// }
PlatElderSleepAnalysis platElderSleepAnalysis = platElderSleepAnalysisService.getOne(new QueryWrapper<PlatElderSleepAnalysis>().lambda()
.eq(PlatElderSleepAnalysis::getElderId, elderId)
.eq(StrUtil.isNotBlank(elderId), PlatElderSleepAnalysis::getElderId, elderId)
.eq(PlatElderSleepAnalysis::getHappenDate, nowString)
.orderByDesc(BaseEntity::getCreateDate)
.eq(StrUtil.isNotBlank(deviceId), PlatElderSleepAnalysis::getOriDeviceId, deviceId)
.eq(StrUtil.isNotBlank(tenantId), PlatElderSleepAnalysis::getTenantId, tenantId)
.last("limit 1")
);
if (platElderSleepAnalysis == null) {
return platElderSleepEvaluationVO;
}
// String sleepScore = platElderSleepAnalysis.getSleepScore();
platElderSleepEvaluationVO.setScore(Integer.valueOf(platElderSleepAnalysis.getSleepScore() + ""));
Long sleepScore = getSleepScore(platElderSleepAnalysis);
EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
platElderSleepEvaluationVO.setScore(Integer.valueOf(sleepScore + ""));
platElderSleepEvaluationVO.setResult(platElderSleepAnalysis.getSleepResult());
platElderSleepEvaluationVO.setEvaluation(platElderSleepAnalysis.getSleepEvaluate());
platElderSleepEvaluationVO.setEvaluation(evaluateReport.getEvaluate());
platElderSleepEvaluationVO.setSleepDuration(Integer.valueOf(platElderSleepAnalysis.getSleepTime() + ""));
platElderSleepEvaluationVO.setRestDuration(Integer.valueOf(platElderSleepAnalysis.getRestTime() + ""));
......@@ -123,6 +149,53 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
}
private Long getSleepScore (PlatElderSleepAnalysis platElderSleepAnalysis) {
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(
new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda().orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
List<PlatElderSleep> sleepList = platElderSleepService.list(Wrappers.<PlatElderSleep>lambdaQuery()
.eq(PlatElderSleep::getHappenDate, platElderSleepAnalysis.getHappenDate())
.eq(PlatElderSleep::getElderId, platElderSleepAnalysis.getElderId()));
String baseScore = platElderSleepService.calculateScores(Long.parseLong(platElderSleepAnalysis.getSleepTime()),
Long.parseLong(platElderSleepAnalysis.getRestTime()), 0, 0, 0, evaluateStandardReport);
if(CollUtil.isEmpty(sleepList)){
return Long.parseLong(baseScore);
}
AtomicReference<Long> score = new AtomicReference<>(0L);
sleepList.forEach(s-> {
List<PlatSleepRangeVO> sleepRecord = s.getSleepRecord();
sleepRecord.forEach(l -> {
LocalDateTime start = LocalDateTime.parse(l.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LocalDateTime end = LocalDateTime.parse(l.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
long minutes = Duration.between(start, end).toMinutes();
SleepTypeEnum sleepType = SleepTypeEnum.getSleepType(l.getSleepType());
if (sleepType == null) {
return;
}
String sleepScore = "0";
switch (sleepType) {
case SLEEP_LIGHTNESS:
sleepScore = platElderSleepService.calculateScores(0, 0, 0, 0, minutes, evaluateStandardReport);
break;
case SLEEP_DEEP:
sleepScore = platElderSleepService.calculateScores(0, 0, minutes, 0, 0, evaluateStandardReport);
break;
default:
}
String finalSleepScore = sleepScore;
score.updateAndGet(v -> v + Long.parseLong(finalSleepScore));
});
});
Long result = Long.parseLong(baseScore) + score.get();
return result.compareTo(100L) > 0 ? 100L : result;
}
@Override
public List<PlatElderSleepDiagramVO> sleepDiagram(PlatElderReportDTO platElderIdDTO) {
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
......@@ -176,15 +249,20 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
String nowString = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
String elderId = platElderIdDTO.getElderId();
if (StringUtils.isNotEmpty(platElderIdDTO.getDeviceId())) {
PlatElder platElder = platElderService.getByDeviceId(platElderIdDTO.getDeviceId(), platElderIdDTO.getTenantId());
if (platElder != null) {
elderId = platElder.getId();
}
}
String deviceId = platElderIdDTO.getDeviceId();
String tenantId = platElderIdDTO.getTenantId();
// if (StringUtils.isNotEmpty(deviceId)) {
// PlatElder platElder = platElderService.getByDeviceId(deviceId, platElderIdDTO.getTenantId());
// if (platElder != null) {
// elderId = platElder.getId();
// }
// }
PlatElderBreatheAnalysis platElderSleepAnalysis = platElderBreatheAnalysisService.getOne(new QueryWrapper<PlatElderBreatheAnalysis>().lambda()
.eq(PlatElderBreatheAnalysis::getElderId, elderId)
.eq(StrUtil.isNotBlank(elderId), PlatElderBreatheAnalysis::getElderId, elderId)
.eq(StrUtil.isNotBlank(deviceId), PlatElderBreatheAnalysis::getOriDeviceId, deviceId)
.eq(StrUtil.isNotBlank(tenantId), PlatElderBreatheAnalysis::getTenantId, tenantId)
.eq(PlatElderBreatheAnalysis::getHappenDate, nowString)
.last("limit 1")
);
if (platElderSleepAnalysis == null) {
......@@ -258,25 +336,21 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override
public List<PlatElderRealTimeHeartRespiratoryVO> heartRespiratory(PlatElderReportDTO platElderIdDTO) {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId());
if (platDevice == null) {
return new ArrayList<>(10);
}
LocalDate now = Optional.ofNullable(platElderIdDTO.getNow()).orElse(LocalDate.now());
LocalDateTime start = dayStartNow(now);
LocalDateTime end = dayEndNow(now);
long reportTimeStart = LocalDateTimeUtils.getMilliSecond(start);
long reportTimeEnd = LocalDateTimeUtils.getMilliSecond(end);
List<DeviceInfoContentBreathe> breatheList = iotProductDeviceService.getDeviceLogByTimeRangeBreathe(platDevice.getOriDeviceId(), 2 * 24 * 3600, start, end);
return StreamUtil.map(breatheList, e -> {
List<PlatElderBreatheHeartRateRecord> list = platElderBreatheHeartRateRecordService
.list(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId(), platElderIdDTO.getTenantId(), reportTimeStart, reportTimeEnd);
return StreamUtil.map(list, e -> {
PlatElderRealTimeHeartRespiratoryVO vo = new PlatElderRealTimeHeartRespiratoryVO();
vo.setTime(LongTimestampUtil.toLocalDateTime(e.getTimestamp()));
vo.setHeartRate(e.getProperties().getHr());
vo.setRespiratoryRate(e.getProperties().getBr());
vo.setTime(LongTimestampUtil.toLocalDateTime(e.getReportTime()));
vo.setHeartRate(e.getHeartRate());
vo.setRespiratoryRate(e.getRespiratoryRate());
return vo;
});
......@@ -373,6 +447,25 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
}
@Override
public List<PlatElderCoordinateVO> coordinateList(String elderId, long start, long end) {
LambdaQueryWrapper<PlatElderCoordinateRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PlatElderCoordinateRecord::getElderId, elderId);
queryWrapper.ge(PlatElderCoordinateRecord::getReportTime, start);
queryWrapper.le(PlatElderCoordinateRecord::getReportTime, end);
List<PlatElderCoordinateRecord> list = platElderCoordinateRecordService.list(queryWrapper);
return list.stream().map(r -> {
PlatElderCoordinateVO platElderCoordinateVO = new PlatElderCoordinateVO();
BeanUtils.copyProperties(r, platElderCoordinateVO);
platElderCoordinateVO.setTimestamp(r.getReportTime());
platElderCoordinateVO.setOriDeviceId(r.getIotDeviceId());
if (StringUtils.isNotBlank(r.getTrack())) {
platElderCoordinateVO.setTrack(JSON.parseArray(r.getTrack(), Integer.class));
}
return platElderCoordinateVO;
}).collect(Collectors.toList());
}
@Override
public List<PlatElderCoordinateVO> coordinateList(String elderId, String deviceId, LocalDateTime start, LocalDateTime end) {
List<PlatDevice> platDeviceListSpace = platElderRealTimeService.getSpaceDevice(elderId, deviceId);
......@@ -387,7 +480,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
platDeviceListSpace.forEach(e -> {
List<DeviceInfoContentSpace> spaceList = iotProductDeviceService.getDeviceLogByTimeRangeSpace(e.getOriDeviceId(), 24 * 3600, start, end);
voList.addAll(StreamUtil.map(spaceList, i -> {
PlatElderCoordinateVO vo = new PlatElderCoordinateVO();
......@@ -409,7 +501,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
platDeviceListFall.forEach(e -> {
List<DeviceInfoContentFall> fallList = iotProductDeviceService.getDeviceLogByTimeRangeFall(e.getOriDeviceId(), 2 * 24 * 3600, start, end);
voList.addAll(StreamUtil.map(fallList, i -> {
PlatElderCoordinateVO vo = new PlatElderCoordinateVO();
......@@ -438,7 +529,10 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
LocalDateTime start = dayStartNow(now);
LocalDateTime end = dayEndNow(now);
return coordinateList(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId(), start, end);
long reportTimeStart = start.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
long reportTimeEnd = end.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
return coordinateList(platElderIdDTO.getElderId(), reportTimeStart, reportTimeEnd);
}
......
package com.makeit.service.platform.elder.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.makeit.common.entity.BaseBusEntity;
......@@ -29,10 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
......@@ -174,15 +172,19 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String elderId = platElderIdDTO.getElderId();
if (StringUtils.isNotEmpty(platElderIdDTO.getDeviceId())) {
PlatElder platElder = platElderService.getByDeviceId(platElderIdDTO.getDeviceId(), platElderIdDTO.getTenantId());
if (platElder != null) {
elderId = platElder.getId();
}
}
String deviceId = platElderIdDTO.getDeviceId();
String tenantId = platElderIdDTO.getTenantId();
// if (StringUtils.isNotEmpty(deviceId)) {
// PlatElder platElder = platElderService.getByDeviceId(deviceId, platElderIdDTO.getTenantId());
// if (platElder != null) {
// elderId = platElder.getId();
// }
// }
List<PlatElderSleepAnalysis> sleepAnalysisList = platElderSleepAnalysisService.list(new QueryWrapper<PlatElderSleepAnalysis>().lambda()
.eq(PlatElderSleepAnalysis::getElderId, elderId)
.eq(StrUtil.isNotBlank(elderId), PlatElderSleepAnalysis::getElderId, elderId)
.ge(PlatElderSleepAnalysis::getHappenDate, dateTimeFormatter.format(weekStartDate))
.eq(StrUtil.isNotBlank(deviceId), PlatElderSleepAnalysis::getOriDeviceId, deviceId)
.eq(StrUtil.isNotBlank(tenantId), PlatElderSleepAnalysis::getTenantId, tenantId)
.le(PlatElderSleepAnalysis::getHappenDate, dateTimeFormatter.format(weekEndDate))
);
......@@ -330,15 +332,19 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String elderId = platElderIdDTO.getElderId();
if (StringUtils.isNotEmpty(platElderIdDTO.getDeviceId())) {
PlatElder platElder = platElderService.getByDeviceId(platElderIdDTO.getDeviceId(), platElderIdDTO.getTenantId());
if (platElder != null) {
elderId = platElder.getId();
}
}
String deviceId = platElderIdDTO.getDeviceId();
String tenantId = platElderIdDTO.getTenantId();
// if (StringUtils.isNotEmpty(deviceId)) {
// PlatElder platElder = platElderService.getByDeviceId(deviceId, platElderIdDTO.getTenantId());
// if (platElder != null) {
// elderId = platElder.getId();
// }
// }
List<PlatElderBreatheAnalysis> breatheAnalyses = platElderBreatheAnalysisService.list(new QueryWrapper<PlatElderBreatheAnalysis>().lambda()
.eq(PlatElderBreatheAnalysis::getElderId, elderId)
.eq(StrUtil.isNotBlank(elderId), PlatElderBreatheAnalysis::getElderId, elderId)
.ge(PlatElderBreatheAnalysis::getHappenDate, dateTimeFormatter.format(weekStartDate))
.eq(StrUtil.isNotBlank(deviceId), PlatElderBreatheAnalysis::getOriDeviceId, deviceId)
.eq(StrUtil.isNotBlank(tenantId), PlatElderBreatheAnalysis::getTenantId, tenantId)
.le(PlatElderBreatheAnalysis::getHappenDate, dateTimeFormatter.format(weekEndDate))
);
......@@ -477,7 +483,11 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
@Override
public List<PlatElderCoordinateVO> coordinateList(PlatElderReportDTO platElderIdDTO) {
return platElderDayReportDayService.coordinateList(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId(), weekStartDateTime(platElderIdDTO.getStartTime()), weekEndDateTime(platElderIdDTO.getEndTime()));
LocalDateTime start = weekStartDateTime(platElderIdDTO.getStartTime());
LocalDateTime end = weekEndDateTime(platElderIdDTO.getEndTime());
long reportTimeStart = start.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
long reportTimeEnd = end.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
return platElderDayReportDayService.coordinateList(platElderIdDTO.getElderId(), reportTimeStart, reportTimeEnd);
}
@Override
......
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.common.entity.BaseEntity;
import com.makeit.dto.platform.elder.PlatElderIdDTO;
import com.makeit.entity.platform.device.PlatDevice;
......@@ -519,5 +520,52 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
}
@Override
public PlatElderRealTimeHeartRespiratoryVO deviceHealthReport(PlatElderIdDTO dto) {
if (StringUtils.isEmpty(dto.getOrgId())) {
throw new RuntimeException("机构id不能为空");
}
if (StringUtils.isEmpty(dto.getDeviceId())) {
throw new RuntimeException("设备id不能为空");
}
PlatDevice platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, dto.getDeviceId())
.eq(BaseBusEntity::getTenantId,dto.getOrgId())
.last("limit 1"));
PlatElderRealTimeHeartRespiratoryVO vo = new PlatElderRealTimeHeartRespiratoryVO();
vo.setTime(LocalDateTime.now());
if (platDevice == null) {
return vo;
}
vo.setDeviceId(platDevice.getOriDeviceId());
String result = redisTemplate.opsForValue().get(DEVICE_BR_DATA + platDevice.getOriDeviceId());
log.info("实时获取设备呼吸数据:{}",result);
if (result != null) {
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject != null) {
String person = jsonObject.getString("person");
log.info("当前人员人员状态:{}",person);
vo.setTime(LocalDateTime.now());
if (StringUtils.equals(person,"0")) {
vo.setHeartRate(0);
vo.setRespiratoryRate(0);
vo.setBody(0);
vo.setStatus("0");
vo.setPersonState(0);
vo.setPoint(Lists.newArrayList());
} else {
vo.setHeartRate(Integer.valueOf(jsonObject.getString("hr")));
vo.setRespiratoryRate(Integer.valueOf(jsonObject.getString("br")));
vo.setBody(Integer.valueOf(jsonObject.getString("bodymove")));
vo.setPersonState(Integer.valueOf(jsonObject.getString("personState")));
Object point = jsonObject.get("point");
vo.setPoint((point == null ? Lists.newArrayList() : (List<Integer>) point));
vo.setStatus(person);
}
}
return vo;
}
return vo;
}
}
......@@ -40,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
......@@ -87,14 +88,18 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Override
@Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public void elderSleepSleepAnalysisTask() {
public List<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month,Integer day) {
List<String> dayHourRangeList = getLastDayHourRange();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, -1);
Date previousDate = calendar.getTime();
String currentDate = DateUtil.format(previousDate, DatePattern.NORM_DATE_PATTERN);
List<String> dayHourRangeList = getLastDayHourRange(month,day);
// Calendar calendar = Calendar.getInstance();
// calendar.setTime(new Date());
// calendar.add(Calendar.DAY_OF_MONTH, -1);
// Date previousDate = calendar.getTime();
// String currentDate = DateUtil.format(previousDate, DatePattern.NORM_DATE_PATTERN);
String currentDate = LocalDate.now().minusDays(1).toString();
if(month != null && day != null){
currentDate = LocalDate.of(2023, month, day).minusDays(1).toString();
}
SaasSleepAnalysisModel analysisModel = saasSleepAnalysisModelService.getOne(new QueryWrapper<SaasSleepAnalysisModel>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
......@@ -125,7 +130,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
int sleepModerateActionThreshold = Integer.parseInt(analysisModel.getSleepModerateActionThreshold());
int sleepModerateActionTimeBegin = Integer.parseInt(analysisModel.getSleepModerateActionTimeBegin());
List<PlatElderSleepAnalysis> result = new ArrayList<>();
for (PlatRoomBedDevice platRoomBedDevice : platRoomBedDeviceList) {
TreeMap<String, AnalysisVO> totalMap = new TreeMap<>();
......@@ -552,7 +557,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
}
SaasSleepEvaluateStandardReport evaluateStandardReport = saasSleepEvaluateStandardReportService.getOne(new QueryWrapper<SaasSleepEvaluateStandardReport>().lambda()
.orderByDesc(BaseEntity::getCreateBy)
.orderByDesc(BaseEntity::getCreateDate)
.last("limit 1"));
// 算出每一段睡觉的不同睡眠类型的时间段
......@@ -689,9 +694,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
long totalScore = sleepScore + deepScore + lightScore - soberScore;
saasSleepEvaluateStandardReportVO.setTotalScore(totalScore);
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(totalScore);
// 记录长者一天睡眠的记录
long daySleepTime = 0;
long dayRestTime = 0;
......@@ -708,6 +710,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
}
}
platElderSleepService.saveBatch(elderSleepList);
String score = calculateScores(daySleepTime, dayRestTime, deepTime, soberTime, lightTime, evaluateStandardReport);
EvaluateReportVO sleepReport = saasSleepEvaluateReportService.getByScore(Long.parseLong(score));
// 长者一天的睡眠分析
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
......@@ -715,15 +719,58 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
elderSleepAnalysis.setActionCount(totalActionCount);
elderSleepAnalysis.setTurnedCount(totalTurnedCount);
elderSleepAnalysis.setHappenDate(currentDate);
elderSleepAnalysis.setSleepScore(String.valueOf(totalScore));
elderSleepAnalysis.setSleepScore(score);
elderSleepAnalysis.setSleepTime(String.valueOf(daySleepTime));
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
elderSleepAnalysis.setSleepResult(sleepReport.getResult());
elderSleepAnalysis.setTenantId(tenantId);
elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
elderSleepAnalysis.setOriDeviceId(platDevice.getOriDeviceId());
result.add(elderSleepAnalysis);
platElderSleepAnalysisService.save(elderSleepAnalysis);
}
return result;
}
@Override
public String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport) {
List<SleepConfigVO> sleepDeepConfigList = JSON.parseArray(evaluateStandardReport.getSleepDeepConfig(), SleepConfigVO.class);
List<SleepConfigVO> soberConfigList = JSON.parseArray(evaluateStandardReport.getSoberConfig(), SleepConfigVO.class);
SleepConfigVO lightnessConfig = JSON.parseObject(evaluateStandardReport.getSleepLightnessConfig(), SleepConfigVO.class);
List<SleepConfigVO> sleepTimeConfigList = JSON.parseArray(evaluateStandardReport.getSleepTime(), SleepConfigVO.class);
long deepHour = deepTime / 60;
long soberHour = soberTime / 60;
long lightHour = lightTime / 60;
long sleepHour = (daySleepTime + dayRestTime) / 60;
AtomicReference<Integer> sleepScore = new AtomicReference<>(0);
AtomicReference<Integer> deepScore = new AtomicReference<>(0);
AtomicReference<Integer> soberScore = new AtomicReference<>(0);
int lightScore = 0;
sleepTimeConfigList.forEach(s -> {
int sleepKey = (int) Math.floor(sleepHour);
if (Integer.parseInt(s.getHour()) <= sleepKey) {
sleepScore.set(Integer.parseInt(s.getScore()));
}
});
sleepDeepConfigList.forEach(s -> {
int sleepKey = (int) Math.floor(deepHour);
if (Integer.parseInt(s.getHour()) <= sleepKey) {
deepScore.set(Integer.parseInt(s.getScore()));
}
});
soberConfigList.forEach(s -> {
int sleepKey = (int) Math.floor(soberHour);
if (Integer.parseInt(s.getHour()) <= sleepKey) {
soberScore.set(Integer.parseInt(s.getScore()));
}
});
if (Integer.parseInt(lightnessConfig.getHour()) <= lightHour) {
int multiplier = (int) lightHour / Integer.parseInt(lightnessConfig.getHour());
lightScore = Integer.parseInt(lightnessConfig.getScore()) * multiplier;
}
Integer totalScore = sleepScore.get() + deepScore.get() + lightScore - soberScore.get();
return String.valueOf(totalScore);
}
......@@ -740,9 +787,12 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
}
public List<String> getLastDayHourRange() {
public List<String> getLastDayHourRange(Integer month,Integer day) {
int count = 24;
LocalDateTime localDateTime = LocalDateTime.now();
if (month != null && day != null) {
localDateTime = LocalDateTime.of(LocalDate.of(2023, month, day), LocalTime.now());
}
List<String> list = Lists.newArrayList();
String startTime;
String endTime;
......@@ -758,14 +808,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
return time.atTime(0, 0, 0);
}
public static void main(String[] args) {
PlatElderSleepServiceImpl platElderSleepService1 = new PlatElderSleepServiceImpl();
List<String> lastDayHourRange = platElderSleepService1.getLastDayHourRange();
System.out.println();
}
@Override
public void test1() {
int days = 30;
......
package com.makeit.service.platform.space;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.dto.platform.space.PlatRegionSettingDTO;
import com.makeit.dto.platform.space.PlatRegionSettingFixQueryDTO;
import com.makeit.entity.platform.space.PlatRegionSettingFix;
import java.util.List;
/**
* <p>
* 区域设置固化 服务类
......@@ -13,4 +17,6 @@ import com.makeit.entity.platform.space.PlatRegionSettingFix;
*/
public interface PlatRegionSettingFixService extends IService<PlatRegionSettingFix> {
List<PlatRegionSettingDTO> list(PlatRegionSettingFixQueryDTO dto);
}
package com.makeit.service.platform.space.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.makeit.dto.platform.space.PlatRegionSettingDTO;
import com.makeit.dto.platform.space.PlatRegionSettingFixQueryDTO;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.space.PlatRegionSettingFix;
import com.makeit.mapper.platform.space.PlatRegionSettingFixMapper;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.space.PlatRegionSettingFixService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* <p>
* 区域设置固化 服务实现类
......@@ -18,4 +34,42 @@ import org.springframework.stereotype.Service;
@Service
public class PlatRegionSettingFixServiceImpl extends ServiceImpl<PlatRegionSettingFixMapper, PlatRegionSettingFix> implements PlatRegionSettingFixService {
@Autowired
private PlatDeviceService platDeviceService;
@Override
public List<PlatRegionSettingDTO> list(PlatRegionSettingFixQueryDTO dto) {
if (StringUtils.isAnyBlank(dto.getReportType(), dto.getRoomId())) {
return Lists.newArrayList();
}
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LambdaQueryWrapper<PlatRegionSettingFix> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PlatRegionSettingFix::getRoomId, dto.getRoomId());
if ("0".equals(dto.getReportType())) {
queryWrapper.eq(PlatRegionSettingFix::getHappenDate, dateTimeFormatter.format(dto.getNow()));
} else {
queryWrapper.ge(PlatRegionSettingFix::getHappenDate, dateTimeFormatter.format(dto.getStartTime()));
queryWrapper.le(PlatRegionSettingFix::getHappenDate, dateTimeFormatter.format(dto.getEndTime()));
}
queryWrapper.orderByDesc(PlatRegionSettingFix::getCreateDate);
List<PlatRegionSettingFix> list = this.list(queryWrapper);
list = list.stream().filter(distinctByKey(PlatRegionSettingFix::getDeviceId)).collect(Collectors.toList());
List<String> deviceIds = list.stream().map(PlatRegionSettingFix::getDeviceId).collect(Collectors.toList());
Map<String, PlatDevice> deviceMap = platDeviceService.listByIds(deviceIds).stream().collect(Collectors.toMap(PlatDevice::getId, Function.identity()));
return list.stream().map(p -> {
PlatRegionSettingDTO platRegionSettingDTO = new PlatRegionSettingDTO();
BeanUtils.copyProperties(p, platRegionSettingDTO);
PlatDevice device = deviceMap.getOrDefault(p.getDeviceId(), new PlatDevice());
platRegionSettingDTO.setOriDeviceId(device.getOriDeviceId());
platRegionSettingDTO.setDeviceName(device.getName());
platRegionSettingDTO.setCategory(device.getCategory());
return platRegionSettingDTO;
}).collect(Collectors.toList());
}
private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
}
package com.makeit.task;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.elder.PlatElderBreatheAnalysisService;
import com.makeit.service.platform.elder.PlatElderBreatheDayStatService;
import com.makeit.service.platform.elder.PlatElderCoordinateRecordService;
import com.makeit.service.platform.elder.PlatElderSleepService;
import com.makeit.service.platform.elder.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
......@@ -24,6 +21,8 @@ public class PlatElderReportTask {
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Autowired
private PlatElderCoordinateRecordService platElderCoordinateRecordService;
@Autowired
private PlatElderBreatheHeartRateRecordService platElderBreatheHeartRateRecordService;
......@@ -56,13 +55,24 @@ public class PlatElderReportTask {
}
/**
* 生成长者呼吸心率
*/
@Scheduled(cron = "0 30 2 * * ?")
@TenantIdIgnore
public void breatheHeartRateRecordTask() {
log.info("开始生成长者呼吸心率");
platElderBreatheHeartRateRecordService.breatheHeartRateRecordTask();
log.info("生成长者呼吸心率结束");
}
/**
* 长者睡眠分析
*/
@Scheduled(cron = "0 0 8 * * ?")
@TenantIdIgnore
public void elderSleepSleepAnalysisTask() {
log.info("开始定时分析长者睡眠质量");
platElderSleepService.elderSleepSleepAnalysisTask();
platElderSleepService.elderSleepSleepAnalysisTask(null,null);
log.info("定时分析长者睡眠质量结束");
}
}
package com.makeit.vo.platform.alarm;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.makeit.common.dto.BaseTenantDTO;
import com.makeit.entity.platform.device.PlatDevice;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* <p>
* 告警记录
* </p>
*
* @author eugene young
* @since 2023-09-04
*/
@Data
@ApiModel(value = "PlatAlarmRecord对象", description = "告警记录")
public class PlatAlarmExternalRecordVO {
/**
* 关联告警配置
*/
private String alarmId;
@ApiModelProperty(value = "告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常,5 离床异常")
private String alarmType;
@ApiModelProperty(value = "告警时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime alarmDate;
@ApiModelProperty(value = "状态 0 待处理 1 已处理")
private String status;
@ApiModelProperty(value = "通知家属状态 0 未通知 1 已通知")
private String noticeStatus;
@ApiModelProperty(value = "告警内容")
private String content;
@ApiModelProperty(value = "处理人")
private String dealUser;
@ApiModelProperty(value = "处理时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dealDate;
@ApiModelProperty(value = "所属组织id")
private String orgId;
@ApiModelProperty(value = "告警时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createDate;
@ApiModelProperty(value = "是否误报 1 误报 0 没有误报")
private String misinformationFlag;
private String deviceId;
private PlatDevice device;
}
......@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class PlatElderRealTimeHeartRespiratoryVO {
......@@ -23,6 +24,10 @@ public class PlatElderRealTimeHeartRespiratoryVO {
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("人员状态")
private Integer personState;
@ApiModelProperty("呼吸波形")
private List<Integer> point;
@ApiModelProperty("设备id")
private String deviceId;
......
......@@ -27,6 +27,7 @@ import com.makeit.service.saas.PlatTenantService;
import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.utils.AlarmConfigCacheUtil;
import com.makeit.utils.DeviceCacheUtil;
import com.makeit.utils.old.StringUtils;
import com.makeit.utils.redis.RedisUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
......@@ -195,7 +196,7 @@ public class PushCallback implements MqttCallback {
String messageType = device.getMessageType();
//更新设备状态
platDeviceService.updateDeviceStatus(messageType, deviceId, "");
if (org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(messageType, DeviceState.online.getValue())) {
if (StringUtils.equalsAnyIgnoreCase(messageType, DeviceState.online.getValue())) {
return;
}
for (HeaderInfo.Bind binding : bindings) {
......@@ -209,13 +210,13 @@ public class PushCallback implements MqttCallback {
//iot设备id
PlatDevice platDevice = deviceCacheUtil.get(deviceId + ":" + iot_tenantId);
if (platDevice == null) {
logger.error("获取设备信息异常,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId);
//logger.error("获取设备信息异常,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId);
continue;
}
List<PlatAlarmConfig> deviceAlarmConfigList = alarmConfigCacheUtil.getDeviceAlarmConfigMap(platDevice);
deviceAlarmConfigList.removeIf(Objects::isNull);
if (CollectionUtils.isEmpty(deviceAlarmConfigList)) {
logger.error("该设备没有告警配置,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId);
//logger.error("该设备没有告警配置,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId);
continue;
}
......@@ -238,6 +239,9 @@ public class PushCallback implements MqttCallback {
platAlarmCheckDTO.setProperties(properties);
//设备状态
platAlarmCheckDTO.setMessageType(messageType);
if (properties != null) {
platAlarmCheckDTO.setDeviceTime(properties.getString("alarmId"));
}
alarm.checkConfig(platAlarmCheckDTO);
}
}
......
......@@ -59,7 +59,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.logdir}/${logback.appname}/info/log_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>30</maxHistory>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
......@@ -82,7 +82,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.logdir}/${logback.appname}/error/log_error.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<maxHistory>30</maxHistory>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
......@@ -104,7 +104,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.logdir}/${logback.appname}/warn/log_warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>30</maxHistory>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
......
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