Commit 4d500f0e by 罗志长

Merge branch 'dev'

parents aed900b0 8d009a5a
Showing with 1054 additions and 75 deletions
ALTER TABLE `plat_device_other` ALTER TABLE `plat_device_other`
...@@ -85,3 +85,9 @@ CREATE TABLE `saas_pid_manage` ( ...@@ -85,3 +85,9 @@ CREATE TABLE `saas_pid_manage` (
ALTER TABLE `plat_alarm_record` ALTER TABLE `plat_alarm_record`
ADD COLUMN `wechat_read_flag` char(1) DEFAULT 0 COMMENT '小程序端是否读取 0未读 1已读' AFTER `misinformation_flag`; ADD COLUMN `wechat_read_flag` char(1) DEFAULT 0 COMMENT '小程序端是否读取 0未读 1已读' AFTER `misinformation_flag`;
-- 12.15 end
ALTER TABLE `plat_tenant`
ADD COLUMN `open_api_url` varchar(128) COMMENT '第三方接口url' AFTER `secret`;
\ No newline at end of file
...@@ -65,4 +65,6 @@ public class PlatTenantDTOVO extends BaseIdDTO { ...@@ -65,4 +65,6 @@ public class PlatTenantDTOVO extends BaseIdDTO {
private String appid; private String appid;
@ApiModelProperty(value = "secret") @ApiModelProperty(value = "secret")
private String secret; private String secret;
@ApiModelProperty(value = "openApiUrl")
private String openApiUrl;
} }
...@@ -35,6 +35,8 @@ public class PlatTenantVO extends BaseIdDTO implements Serializable { ...@@ -35,6 +35,8 @@ public class PlatTenantVO extends BaseIdDTO implements Serializable {
@ApiModelProperty(value = "租户管理员用户名") @ApiModelProperty(value = "租户管理员用户名")
private String userName; private String userName;
@ApiModelProperty(value = "openApiUrl")
private String openApiUrl;
/** /**
* 创建时间 * 创建时间
......
...@@ -10,10 +10,8 @@ import com.makeit.module.iot.dto.IotQueryParam; ...@@ -10,10 +10,8 @@ import com.makeit.module.iot.dto.IotQueryParam;
import com.makeit.module.iot.dto.IotSort; import com.makeit.module.iot.dto.IotSort;
import com.makeit.module.iot.dto.Term; import com.makeit.module.iot.dto.Term;
import com.makeit.module.iot.util.HttpRequest; import com.makeit.module.iot.util.HttpRequest;
import com.makeit.module.iot.vo.DeviceInstanceEntity; import com.makeit.module.iot.util.SimpleHttpRequest;
import com.makeit.module.iot.vo.DeviceOperationLogEntity; import com.makeit.module.iot.vo.*;
import com.makeit.module.iot.vo.IotPagerResult;
import com.makeit.module.iot.vo.ResponseMessage;
import com.makeit.module.iot.vo.analysis.AnalysisVO; import com.makeit.module.iot.vo.analysis.AnalysisVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe; import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.module.iot.vo.fall.DeviceInfoContentFall; import com.makeit.module.iot.vo.fall.DeviceInfoContentFall;
...@@ -33,10 +31,7 @@ import java.io.IOException; ...@@ -33,10 +31,7 @@ import java.io.IOException;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Comparator; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -78,18 +73,36 @@ public class IotProductDeviceService extends IotCommonService { ...@@ -78,18 +73,36 @@ public class IotProductDeviceService extends IotCommonService {
return Lists.newArrayList(); return Lists.newArrayList();
} }
public DeviceDetail getDetail(String deviceId) {
String url = iotUrl + DEVICE_PREFIX_URL + "/" + deviceId + "/detail";
HttpRequest request = new SimpleHttpRequest(url, httpClient);
request.headers(headerUtils.createHeadersOfParams(new HashMap<>()));
try {
ResponseMessage responseMessage = sendGet(url, request);
if (responseMessage.getStatus() == 200) {
log.info("获取设备详情成功:{}", deviceId);
return JSON.parseObject(responseMessage.getResult().toString(), DeviceDetail.class);
} else {
log.error("获取设备详情失败:{}", responseMessage.getMessage());
}
} catch (IOException e) {
log.error("调用:{}接口异常:{}", url, e.getMessage());
}
return null;
}
@Async @Async
public void syncUpdateDeviceInfo(String id, String name, String productId) { public void syncUpdateDeviceInfo(String id, String name, String productId, String describe) {
String url = iotUrl + "/device-instance"; String url = iotUrl + "/device-instance";
Map<String,Object> reqMap = Maps.newHashMap(); Map<String,Object> reqMap = Maps.newHashMap();
reqMap.put("id",id); reqMap.put("id", id);
reqMap.put("name",name); reqMap.put("name", name);
reqMap.put("productId",productId); reqMap.put("productId", productId);
reqMap.put("describe", describe);
String body = JsonUtil.toJson(reqMap); String body = JsonUtil.toJson(reqMap);
HttpRequest request = buildRequest(url, body); HttpRequest request = buildRequest(url, body);
request.encode("UTF-8");
request.contentType("application/json");
try { try {
ResponseMessage responseMessage = sendPatch(url, request); ResponseMessage responseMessage = sendPatch(url, request);
if (responseMessage.getStatus() == 200) { if (responseMessage.getStatus() == 200) {
......
...@@ -106,7 +106,7 @@ public class SimpleHttpRequest implements HttpRequest { ...@@ -106,7 +106,7 @@ public class SimpleHttpRequest implements HttpRequest {
public Response patch() throws IOException { public Response patch() throws IOException {
HttpPatch delete = new HttpPatch(url); HttpPatch delete = new HttpPatch(url);
if (requestBody != null) if (requestBody != null)
delete.setEntity(new StringEntity(requestBody, ContentType.create(contentType))); delete.setEntity(new StringEntity(requestBody, ContentType.create(contentType, encode)));
else { else {
delete.setEntity(createUrlEncodedFormEntity()); delete.setEntity(createUrlEncodedFormEntity());
} }
......
package com.makeit.module.iot.vo;
import lombok.Data;
@Data
public class DeviceDetail {
// 固件信息
private DeviceFirmwareInfo firmwareInfo;
// 上线时间
private long onlineTime;
//说明
private String description;
}
package com.makeit.module.iot.vo;
import lombok.Data;
import java.util.Map;
@Data
public class DeviceFirmwareInfo {
// 固件版本
private String version;
// 创建时间(只读)
private Long createTime;
// 修改时间
private Long updateTime;
// 其他配置
private Map<String, Object> properties;
}
...@@ -12,10 +12,13 @@ public class DiseaseReportVO { ...@@ -12,10 +12,13 @@ public class DiseaseReportVO {
private String score; private String score;
private String evaluate; private String evaluate;
@Data @Data
public static class Condition { public static class Condition {
// 条件直接的关联关系、and or
private String resultRelational; private String resultRelational;
/**
* 0:正常 1:呼吸暂停 2:呼吸过速 3:呼吸过缓 4:心率过速 5:心率过缓
*/
private String resultCondition; private String resultCondition;
} }
} }
package com.makeit.utils.redis; package com.makeit.utils.redis;
import cn.hutool.core.collection.CollUtil;
import com.makeit.utils.ThreadUtil; import com.makeit.utils.ThreadUtil;
import com.makeit.utils.data.convert.JsonUtil; import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
...@@ -193,6 +194,21 @@ public class RedisUtil { ...@@ -193,6 +194,21 @@ public class RedisUtil {
return bucket.get(); return bucket.get();
} }
/**
* 获取字符串
*/
public static <T> List<T> getLike(String key) {
RKeys keys = client.getKeys();
Iterable<String> keyList = keys.getKeysByPattern(getProjectName() + key + "*");
RBatch rBatch = client.createBatch();
if(CollUtil.isNotEmpty(keyList)){
keyList.forEach(k-> rBatch.getBucket(k).getAsync());
}
List<?> dbList = rBatch.execute().getResponses();
return dbList.stream().map(e -> (T) e).collect(Collectors.toList());
}
public static <T> List<T> get(List<String> key) { public static <T> List<T> get(List<String> key) {
RBatch rBatch = client.createBatch(); RBatch rBatch = client.createBatch();
......
...@@ -51,7 +51,7 @@ public class PlatDeviceController { ...@@ -51,7 +51,7 @@ public class PlatDeviceController {
@ApiOperation("分页列表") @ApiOperation("分页列表")
@PostMapping("page") @PostMapping("page")
public ApiResponseEntity<PageVO<PlatDeviceListVO>> page(@RequestBody PageReqDTO<PlatDeviceQueryDTO> pageReqDTO) { public ApiResponseEntity<PageVO<PlatDeviceListVO>> page(@RequestBody PageReqDTO<PlatDeviceQueryDTO> pageReqDTO) {
return ApiResponseUtils.success(platDeviceService.page(pageReqDTO)); return ApiResponseUtils.success(platDeviceService.platPage(pageReqDTO));
} }
@ApiOperation("编辑") @ApiOperation("编辑")
......
package com.makeit.module.controller.elder; package com.makeit.module.controller.elder;
import com.alibaba.fastjson.JSONObject;
import com.makeit.common.response.ApiResponseEntity; import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils; import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO; import com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.external.huineng.HuiNengService;
import com.makeit.global.annotation.AuthIgnore; import com.makeit.global.annotation.AuthIgnore;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService; import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.*; import com.makeit.service.platform.elder.*;
import com.makeit.task.PlatElderReportTask;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import java.util.List;
import org.springframework.web.bind.annotation.RestController;
/** /**
* <p> * <p>
...@@ -42,6 +43,8 @@ public class PlatElderSleepController { ...@@ -42,6 +43,8 @@ public class PlatElderSleepController {
private PlatElderBreatheAnalysisService platElderBreatheAnalysisService; private PlatElderBreatheAnalysisService platElderBreatheAnalysisService;
@Autowired @Autowired
private PlatElderCoordinateRecordService platElderCoordinateRecordService; private PlatElderCoordinateRecordService platElderCoordinateRecordService;
@Autowired
private HuiNengService huiNengService;
...@@ -63,11 +66,11 @@ public class PlatElderSleepController { ...@@ -63,11 +66,11 @@ public class PlatElderSleepController {
} }
@ApiOperation("测试") @ApiOperation("测试")
@PostMapping("test3") @GetMapping("test3")
@AuthIgnore @AuthIgnore
public ApiResponseEntity<Void> elderHeartRespiratoryAnalysisTask() { public ApiResponseEntity<List<PlatElderBreatheAnalysis>> elderHeartRespiratoryAnalysisTask(@RequestParam Integer month,
platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask(); @RequestParam Integer day) {
return ApiResponseUtils.success(); return ApiResponseUtils.success(platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask(month, day));
} }
@ApiOperation("测试") @ApiOperation("测试")
...@@ -103,5 +106,34 @@ public class PlatElderSleepController { ...@@ -103,5 +106,34 @@ public class PlatElderSleepController {
return ApiResponseUtils.success(platDeviceService.readDeviceProperties(dto)); return ApiResponseUtils.success(platDeviceService.readDeviceProperties(dto));
} }
@ApiOperation("读设备属性")
@PostMapping("healthReport")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<?> healthReport() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("hr","80");
jsonObject.put("br","30");
jsonObject.put("person","1");
jsonObject.put("personState","2");
jsonObject.put("distance","100");
jsonObject.put("bodymove","30");
huiNengService.healthReport("1712384736845950978","1712376790484275200",jsonObject);
return ApiResponseUtils.success();
}
@ApiOperation("读设备属性")
@PostMapping("bodyAlarm")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<?> bodyAlarm() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("person","1");
jsonObject.put("personState","1");
huiNengService.bodyAlarm("1712384736845950978","219A04X1856F6D8",jsonObject);
return ApiResponseUtils.success();
}
} }
...@@ -123,4 +123,11 @@ public class PlatSpaceController { ...@@ -123,4 +123,11 @@ public class PlatSpaceController {
return ApiResponseUtils.success(data); return ApiResponseUtils.success(data);
} }
@ApiOperation("修复空间层级数据")
@GetMapping("fixPlacePath")
public ApiResponseEntity<String> fixPlacePath(@RequestParam String spaceId) {
spaceService.fixPlacePath(spaceId);
return ApiResponseUtils.success();
}
} }
...@@ -38,6 +38,7 @@ public class PlatAlarmRecordWechatController { ...@@ -38,6 +38,7 @@ public class PlatAlarmRecordWechatController {
public ApiResponseEntity<Map<String,Object>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) { public ApiResponseEntity<Map<String,Object>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
//小程序告警记录只看到发给自己的告警 //小程序告警记录只看到发给自己的告警
String userId = CommonUserUtil.getUserId(); String userId = CommonUserUtil.getUserId();
// String userId = "1700085146788667394";
PlatAlarmRecordQueryDTO data = dto.getData(); PlatAlarmRecordQueryDTO data = dto.getData();
data.setNotifyUser(userId); data.setNotifyUser(userId);
......
...@@ -30,6 +30,7 @@ public class PlatDeviceEditDTO extends BaseTenantDTO { ...@@ -30,6 +30,7 @@ public class PlatDeviceEditDTO extends BaseTenantDTO {
@ApiModelProperty(value = "设备属性json") @ApiModelProperty(value = "设备属性json")
private String attribute; private String attribute;
@ApiModelProperty(value = "描述")
private String description;
} }
...@@ -42,5 +42,7 @@ public class PlatElderBreatheAnalysis extends BaseBusEntity { ...@@ -42,5 +42,7 @@ public class PlatElderBreatheAnalysis extends BaseBusEntity {
@ApiModelProperty(value = "当前日期 yyyy-mm-dd") @ApiModelProperty(value = "当前日期 yyyy-mm-dd")
private String happenDate; private String happenDate;
// @TableField(exist = false)
// private String remake;
} }
...@@ -65,6 +65,8 @@ public class PlatTenant extends BaseEntity { ...@@ -65,6 +65,8 @@ public class PlatTenant extends BaseEntity {
private String url; private String url;
private String appid; private String appid;
private String secret; private String secret;
private String openApiUrl;
} }
\ No newline at end of file
package com.makeit.enums.report;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wangzy
*/
@AllArgsConstructor
@Getter
public enum ConditionTypeEnum {
/**
* 0:正常 1:呼吸暂停 2:呼吸过速 3:呼吸过缓 4:心率过速 5:心率过缓
*/
NORMAL("0", "正常"),
BREATHE_STOP("1", "呼吸暂停"),
BREATHE_FAST("2", "呼吸过速"),
BREATHE_SLOW("3", "呼吸过缓"),
HEART_FAST("4", "心率过速"),
HEART_SLOW("5", "心率过缓");
private final String code;
private final String value;
}
package com.makeit.external;
public enum TenantLogoEnum {
HNGZ("汇能感知","hngz");
private String tenantName;
private String value;
public String getTenantName() {
return tenantName;
}
public String getValue() {
return value;
}
TenantLogoEnum(String tenantName, String value) {
this.tenantName = tenantName;
this.value = value;
}
}
package com.makeit.external.huineng;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
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.entity.platform.device.PlatDevice;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.saas.PlatTenantService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Component
@Slf4j
public class HuiNengService {
@Autowired
private PlatTenantService platTenantService;
@Autowired
private PlatDeviceService platDeviceService;
@TenantIdIgnore
public void healthReport(String tenantId, String deviceId, JSONObject jsonObject) {
PlatTenant platTenant = platTenantService.getById(tenantId);
if (platTenant == null) {
return;
}
PlatDevice platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, deviceId)
.eq(BaseBusEntity::getTenantId, tenantId));
if (platDevice == null) {
return;
}
HuinengHealthReportDTO dto = new HuinengHealthReportDTO();
dto.setId(platDevice.getOriDeviceId());
dto.setDeviceType("健康监测设备");
dto.setDtype("实时上报");
dto.setUid(platDevice.getOriDeviceId());
dto.setPk("");
dto.setDid(platDevice.getOriDeviceId());
dto.setSite("");
dto.setLatitude("");
dto.setLongitude("");
dto.setTimestamp(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
dto.setCompanyName(platTenant.getName());
List<HuinengHealthReportDTO.ReportInfo> data = Lists.newArrayList();
HuinengHealthReportDTO.ReportInfo reportInfo = new HuinengHealthReportDTO.ReportInfo();
reportInfo.setECG("");
reportInfo.setBloodSugar("");
reportInfo.setBloodOxygen("");
reportInfo.setBloodPressure("");
reportInfo.setTemperature("");
reportInfo.setSleepQuality("");
reportInfo.setMedicationStatus("");
reportInfo.setAlarmReason("");
reportInfo.setAlarmType("");
reportInfo.setAlarmTime("");
reportInfo.setEventName("设备上报");
reportInfo.setEventType("1");
reportInfo.setHeartRate(jsonObject.getString("hr"));
reportInfo.setInBedState(jsonObject.getString("person"));
reportInfo.setRespiratoryRate(jsonObject.getString("br"));
String bodymove = jsonObject.getString("bodymove");
reportInfo.setTurn(bodymove);
reportInfo.setTurnState(bodymove.equals("0") ? "0" : "1");
data.add(reportInfo);
dto.setData(data);
String reqJson = JSONUtil.toJsonStr(dto);
String url = platTenant.getOpenApiUrl() + "/admin-api/v1/HealthMonitoringEquipment/TimingdataPush?token=aHVpbmVuZ2dhbnpoaV9wdXNoc2V0";
log.info("请求url:{},参数:{}",url,reqJson);
String result = HttpUtil.createPost(url)
.body(reqJson,"application/json")
.execute().body();
HuinengResultVO responseMessage = JSON.parseObject(result, HuinengResultVO.class);
log.info("接口:{},返回信息:{}", url, JSON.toJSONString(responseMessage));
}
@TenantIdIgnore
public void bodyAlarm(String tenantId, String deviceId, JSONObject jsonObject) {
PlatTenant platTenant = platTenantService.getById(tenantId);
if (platTenant == null) {
return;
}
PlatDevice platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, deviceId)
.eq(BaseBusEntity::getTenantId, tenantId));
if (platDevice == null) {
return;
}
HuinengBodyReportDTO dto = new HuinengBodyReportDTO();
dto.setId(platDevice.getOriDeviceId());
dto.setDeviceType("人体感应探测器\"");
dto.setDtype("报警上报");
dto.setUid(platDevice.getOriDeviceId());
dto.setPk("");
dto.setDid(platDevice.getOriDeviceId());
dto.setSite("");
dto.setLatitude("");
dto.setLongitude("");
String currentDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
dto.setTimestamp(currentDate);
dto.setCompanyName(platTenant.getName());
List<HuinengBodyReportDTO.AlarmInfo> data = Lists.newArrayList();
HuinengBodyReportDTO.AlarmInfo alarmInfo = new HuinengBodyReportDTO.AlarmInfo();
alarmInfo.setQuantityElectricity("");
alarmInfo.setSignalStrength("");
alarmInfo.setPerson(jsonObject.getString("person"));
alarmInfo.setAlarmReason("跌倒触发报警");
alarmInfo.setAlarmType("3");
alarmInfo.setAlarmTime(currentDate);
alarmInfo.setEventName("设备告警");
alarmInfo.setEventType("1");
data.add(alarmInfo);
dto.setData(data);
String reqJson = JSON.toJSONString(dto);
String url = platTenant.getOpenApiUrl() + "/admin-api/v1/HumanBodyInductionDetector/TimingdataPush?token=aHVpbmVuZ2dhbnpoaV9wdXNoc2V0";
log.info("请求url:{},参数:{}",url,reqJson);
String result = HttpUtil.createPost(url)
.body(JSON.toJSONString(dto),"application/json")
.execute().body();
HuinengResultVO responseMessage = JSON.parseObject(result, HuinengResultVO.class);
log.info("接口:{},返回信息:{}", url, JSON.toJSONString(responseMessage));
}
}
package com.makeit.external.huineng;
import lombok.Data;
import java.util.List;
/**
* 人体感应探测器数据接口
*/
@Data
public class HuinengBodyReportDTO {
private String id;
private String pk;
private String did;
private String deviceType;
private String deviceModel;
private String uid;
private String dtype;
private String site;
private String longitude;
private String latitude;
private String companyName;
private String timestamp;
private List<AlarmInfo> data;
@Data
public static class AlarmInfo {
private String signalStrength;
private String quantityElectricity;
private String person;
private String alarmReason;
private String alarmType;
private String eventName;
private String eventType;
private String alarmTime;
}
}
package com.makeit.external.huineng;
import lombok.Data;
import java.util.List;
/**
* 健康监测设备
*/
@Data
public class HuinengHealthReportDTO {
private String id;
private String pk;
private String did;
private String deviceType;
private String deviceModel;
private String uid;
private String dtype;
private String site;
private String longitude;
private String latitude;
private String companyName;
private String timestamp;
private List<ReportInfo> data;
@Data
public static class ReportInfo {
private String signalStrength;
private String quantityElectricity;
private String ECG;
private String bloodPressure;
private String bloodSugar;
private String bloodOxygen;
private String temperature;
private String heartRate;
private String inBedState;
private String respiratoryRate;
private String turn;
private String turnState;
private String sleepQuality;
private String medicationStatus;
private String alarmReason;
private String alarmType;
private String eventName;
private String eventType;
private String alarmTime;
}
}
package com.makeit.external.huineng;
import lombok.Data;
@Data
public class HuinengResultVO {
private Integer code;
private String msg;
private boolean data;
}
package com.makeit.external.strategy;
import cn.hutool.http.HttpUtil;
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.entity.platform.device.PlatDevice;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.external.TenantLogoEnum;
import com.makeit.external.huineng.HuinengBodyReportDTO;
import com.makeit.external.huineng.HuinengHealthReportDTO;
import com.makeit.external.huineng.HuinengResultVO;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.platform.device.PlatDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
@Slf4j
public class HuiNengStrategy implements OpenApiBaseStrategy {
@Autowired
private PlatDeviceService platDeviceService;
@Override
@TenantIdIgnore
public void report(PlatTenant platTenant, String deviceId, JSONObject jsonObject) {
log.info("{},开始执行上报",platTenant.getName());
PlatDevice platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, deviceId)
.eq(BaseBusEntity::getTenantId, platTenant.getId()));
if (platDevice == null) {
return;
}
if (StringUtils.isEmpty(platTenant.getUrl())) {
log.info("当前租户为配置openapi地址");
return;
}
HuinengHealthReportDTO dto = new HuinengHealthReportDTO();
dto.setId(platDevice.getOriDeviceId());
dto.setDeviceType("健康监测设备");
dto.setDeviceModel(platDevice.getProductId());
dto.setDtype("实时上报");
dto.setUid("");
dto.setPk(platDevice.getProductId());
dto.setDid(platDevice.getOriDeviceId());
dto.setSite("");
dto.setLatitude("");
dto.setLongitude("");
dto.setTimestamp(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
dto.setCompanyName(platTenant.getName());
List<HuinengHealthReportDTO.ReportInfo> data = Lists.newArrayList();
HuinengHealthReportDTO.ReportInfo reportInfo = new HuinengHealthReportDTO.ReportInfo();
reportInfo.setECG("");
reportInfo.setBloodSugar("");
reportInfo.setBloodOxygen("");
reportInfo.setBloodPressure("");
reportInfo.setTemperature("");
reportInfo.setSleepQuality("");
reportInfo.setMedicationStatus("");
reportInfo.setAlarmReason("");
reportInfo.setAlarmType("1");
reportInfo.setAlarmTime("");
reportInfo.setEventName("设备上报");
reportInfo.setEventType("1");
reportInfo.setHeartRate(jsonObject.getString("hr"));
reportInfo.setInBedState(jsonObject.getString("person"));
reportInfo.setRespiratoryRate(jsonObject.getString("br"));
String bodymove = jsonObject.getString("bodymove");
reportInfo.setTurn(bodymove);
reportInfo.setTurnState(bodymove.equals("0") ? "0" : "1");
data.add(reportInfo);
dto.setData(data);
String reqJson = JSON.toJSONString(dto);
String url = platTenant.getOpenApiUrl() + "/admin-api/v1/HealthMonitoringEquipment/TimingdataPush?token=aHVpbmVuZ2dhbnpoaV9wdXNoc2V0";
log.info("请求url:{},参数:{}", url, reqJson);
String result = HttpUtil.createPost(url)
.body(reqJson, "application/json")
.execute().body();
HuinengResultVO responseMessage = JSON.parseObject(result, HuinengResultVO.class);
log.info("接口:{},返回信息:{}", url, JSON.toJSONString(responseMessage));
}
@Override
@TenantIdIgnore
public void alarm(PlatTenant platTenant, String deviceId, JSONObject jsonObject) {
log.info("{},开始执行告警",platTenant.getName());
PlatDevice platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, deviceId)
.eq(BaseBusEntity::getTenantId, platTenant.getId()));
if (platDevice == null) {
return;
}
if (StringUtils.isEmpty(platTenant.getUrl())) {
log.info("当前租户为配置openapi地址");
return;
}
HuinengBodyReportDTO dto = new HuinengBodyReportDTO();
dto.setId(platDevice.getOriDeviceId());
dto.setDeviceType("人体感应探测器");
dto.setDtype("报警上报");
dto.setUid("");
dto.setPk(platDevice.getProductId());
dto.setDeviceModel(platDevice.getProductId());
dto.setDid(platDevice.getOriDeviceId());
dto.setSite("");
dto.setLatitude("");
dto.setLongitude("");
String currentDate = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
dto.setTimestamp(currentDate);
dto.setCompanyName(platTenant.getName());
List<HuinengBodyReportDTO.AlarmInfo> data = Lists.newArrayList();
HuinengBodyReportDTO.AlarmInfo alarmInfo = new HuinengBodyReportDTO.AlarmInfo();
alarmInfo.setQuantityElectricity("");
alarmInfo.setSignalStrength("");
alarmInfo.setPerson(jsonObject.getString("person"));
alarmInfo.setAlarmReason("跌倒触发报警");
alarmInfo.setAlarmType("4");
alarmInfo.setAlarmTime(currentDate);
alarmInfo.setEventName("设备告警");
alarmInfo.setEventType("1");
data.add(alarmInfo);
dto.setData(data);
String reqJson = JSON.toJSONString(dto);
String url = platTenant.getOpenApiUrl() + "/admin-api/v1/HumanBodyInductionDetector/TimingdataPush?token=aHVpbmVuZ2dhbnpoaV9wdXNoc2V0";
log.info("请求url:{},参数:{}", url, reqJson);
String result = HttpUtil.createPost(url)
.body(JSON.toJSONString(dto), "application/json")
.execute().body();
HuinengResultVO responseMessage = JSON.parseObject(result, HuinengResultVO.class);
log.info("接口:{},返回信息:{}", url, JSON.toJSONString(responseMessage));
}
@Override
public String getTenantLogo() {
return TenantLogoEnum.HNGZ.getValue();
}
}
package com.makeit.external.strategy;
import com.alibaba.fastjson.JSONObject;
import com.makeit.entity.saas.PlatTenant;
public interface OpenApiBaseStrategy {
void report(PlatTenant platTenant, String deviceId, JSONObject jsonObject);
void alarm(PlatTenant platTenant, String deviceId, JSONObject jsonObject);
String getTenantLogo();
}
package com.makeit.external.strategy;
import com.google.common.collect.Maps;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class OpenApiBaseStrategyFactory implements InitializingBean, ApplicationContextAware {
private static final Map<String, OpenApiBaseStrategy> HANDLER_MAP = Maps.newConcurrentMap();
private ApplicationContext appContext;
public OpenApiBaseStrategy getHandler(String logo) {
return HANDLER_MAP.get(logo);
}
@Override
public void afterPropertiesSet() {
appContext.getBeansOfType(OpenApiBaseStrategy.class)
.values()
.forEach(handler -> HANDLER_MAP.put(handler.getTenantLogo(), handler));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appContext = applicationContext;
}
}
...@@ -21,4 +21,5 @@ public interface PlatAlarmConfigMapper extends BaseMapper<PlatAlarmConfig> { ...@@ -21,4 +21,5 @@ public interface PlatAlarmConfigMapper extends BaseMapper<PlatAlarmConfig> {
* @return * @return
*/ */
List<PlatHealthConfigDTO> getHealthConfigList(); List<PlatHealthConfigDTO> getHealthConfigList();
} }
...@@ -21,5 +21,7 @@ public interface PlatDeviceMapper extends BaseMapper<PlatDevice> { ...@@ -21,5 +21,7 @@ public interface PlatDeviceMapper extends BaseMapper<PlatDevice> {
Page<PlatDeviceListVO> getDeviceIdsBySpaceId(@Param("param")PlatDeviceQueryDTO param, Page page); Page<PlatDeviceListVO> getDeviceIdsBySpaceId(@Param("param")PlatDeviceQueryDTO param, Page page);
Page<PlatDeviceListVO> getDeviceIdsBySpaceIdAndElder(@Param("param")PlatDeviceQueryDTO param, Page page);
Page<PlatDeviceListVO> getDevices(@Param("param")PlatDataScreenQueryDTO param, Page<PlatDevice> page); Page<PlatDeviceListVO> getDevices(@Param("param")PlatDataScreenQueryDTO param, Page<PlatDevice> page);
} }
...@@ -42,4 +42,6 @@ public interface PlatAlarmConfigService extends IService<PlatAlarmConfig> { ...@@ -42,4 +42,6 @@ public interface PlatAlarmConfigService extends IService<PlatAlarmConfig> {
List<PlatHealthConfigDTO> getHealthConfigList(); List<PlatHealthConfigDTO> getHealthConfigList();
void initData(); void initData();
List<PlatAlarmConfig> listOfBed(List<String> orgIds);
} }
...@@ -11,11 +11,15 @@ import com.makeit.entity.platform.alarm.PlatDayDurationRecord; ...@@ -11,11 +11,15 @@ import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
import com.makeit.entity.platform.device.PlatDevice; import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder; import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.space.PlatRoom; import com.makeit.entity.platform.space.PlatRoom;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.enums.CommonEnum; import com.makeit.enums.CommonEnum;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum; import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.redis.RedisConst; import com.makeit.enums.redis.RedisConst;
import com.makeit.external.strategy.OpenApiBaseStrategy;
import com.makeit.external.strategy.OpenApiBaseStrategyFactory;
import com.makeit.service.platform.alarm.PlatAlarmRecordService; import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.alarm.PlatDayDurationRecordService; import com.makeit.service.platform.alarm.PlatDayDurationRecordService;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.utils.AlarmConfigCacheUtil; import com.makeit.utils.AlarmConfigCacheUtil;
import com.makeit.utils.AlarmRedisDTO; import com.makeit.utils.AlarmRedisDTO;
import com.makeit.utils.DayDurationUtil; import com.makeit.utils.DayDurationUtil;
...@@ -47,7 +51,10 @@ public class FallAlarm implements IAlarm { ...@@ -47,7 +51,10 @@ public class FallAlarm implements IAlarm {
@Autowired @Autowired
private DayDurationUtil dayDurationUtil; private DayDurationUtil dayDurationUtil;
@Autowired
private OpenApiBaseStrategyFactory openApiBaseStrategyFactory;
@Autowired
private PlatTenantService platTenantService;
private final PlatAlarmConfigEnum.AlarmTypeEnum alarmTypeEnum = PlatAlarmConfigEnum.AlarmTypeEnum.FALL; private final PlatAlarmConfigEnum.AlarmTypeEnum alarmTypeEnum = PlatAlarmConfigEnum.AlarmTypeEnum.FALL;
@Override @Override
...@@ -90,6 +97,21 @@ public class FallAlarm implements IAlarm { ...@@ -90,6 +97,21 @@ public class FallAlarm implements IAlarm {
alarmRedisDTO.setAlarm(CommonEnum.YES.getValue()); alarmRedisDTO.setAlarm(CommonEnum.YES.getValue());
RedisUtil.set(RedisConst.ALARM_DEVICE_FALL_ID + deviceId, alarmRedisDTO); RedisUtil.set(RedisConst.ALARM_DEVICE_FALL_ID + deviceId, alarmRedisDTO);
notice(platAlarmCheckDTO); notice(platAlarmCheckDTO);
// 跌倒了设备需要发送告警到第三方平台
PlatTenant platTenant = platTenantService.getById(platDevice.getTenantId());
if (platTenant != null) {
OpenApiBaseStrategy strategyFactoryHandler = openApiBaseStrategyFactory.getHandler(platTenant.getCode());
if (strategyFactoryHandler != null) {
try {
strategyFactoryHandler.alarm(platTenant, platDevice.getOriDeviceId(), properties);
} catch (Exception e) {
log.error("调用openapi告警接口失败:{}", e.getMessage(), e);
}
}
}
} else { } else {
if (StringUtils.equals(alarmRedisDTO.getAlarm(), CommonEnum.YES.getValue())) { if (StringUtils.equals(alarmRedisDTO.getAlarm(), CommonEnum.YES.getValue())) {
alarmRedisDTO.setAlarm(CommonEnum.NO.getValue()); alarmRedisDTO.setAlarm(CommonEnum.NO.getValue());
......
...@@ -2,6 +2,7 @@ package com.makeit.service.platform.alarm.impl; ...@@ -2,6 +2,7 @@ package com.makeit.service.platform.alarm.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
...@@ -15,7 +16,9 @@ import com.makeit.entity.platform.auth.PlatUser; ...@@ -15,7 +16,9 @@ import com.makeit.entity.platform.auth.PlatUser;
import com.makeit.enums.CodeMessageEnum; import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.CommonEnum; import com.makeit.enums.CommonEnum;
import com.makeit.enums.id.IdConst; import com.makeit.enums.id.IdConst;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.exception.BusinessException; import com.makeit.exception.BusinessException;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.global.aspect.tenant.TenantIdUtil; import com.makeit.global.aspect.tenant.TenantIdUtil;
import com.makeit.mapper.platform.alarm.PlatAlarmConfigMapper; import com.makeit.mapper.platform.alarm.PlatAlarmConfigMapper;
import com.makeit.service.platform.alarm.PlatAlarmConfigService; import com.makeit.service.platform.alarm.PlatAlarmConfigService;
...@@ -57,6 +60,8 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe ...@@ -57,6 +60,8 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe
private AlarmConfigCacheUtil alarmConfigUtil; private AlarmConfigCacheUtil alarmConfigUtil;
@Resource @Resource
private PlatOrgService platOrgService; private PlatOrgService platOrgService;
@Resource
private PlatAlarmConfigMapper configMapper;
@Override @Override
public List<PlatAlarmConfigListVO> list(PlatAlarmConfigQueryDTO dto) { public List<PlatAlarmConfigListVO> list(PlatAlarmConfigQueryDTO dto) {
...@@ -243,7 +248,7 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe ...@@ -243,7 +248,7 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe
Map<String, PlatAlarmConfig> configMap = StreamUtil.toMap(existList, PlatAlarmConfig::getOrgId); Map<String, PlatAlarmConfig> configMap = StreamUtil.toMap(existList, PlatAlarmConfig::getOrgId);
List<PlatAlarmConfig> saveList = Lists.newArrayList(); List<PlatAlarmConfig> saveList = Lists.newArrayList();
for (PlatOrg o : orgList) { for (PlatOrg o : orgList) {
if (configMap.containsKey(o.getId())) { if (configMap.containsKey(o.getId()) || StrUtil.isBlank(o.getTenantId()) || "0".equals(o.getTenantId())) {
continue; continue;
} }
PlatAlarmConfig alarmConfig = new PlatAlarmConfig(); PlatAlarmConfig alarmConfig = new PlatAlarmConfig();
...@@ -256,4 +261,11 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe ...@@ -256,4 +261,11 @@ public class PlatAlarmConfigServiceImpl extends ServiceImpl<PlatAlarmConfigMappe
saveBatch(saveList); saveBatch(saveList);
} }
} }
@Override
@TenantIdIgnore
public List<PlatAlarmConfig> listOfBed(List<String> orgIds) {
return list(Wrappers.<PlatAlarmConfig>lambdaQuery().in(PlatAlarmConfig::getOrgId, orgIds).eq(PlatAlarmConfig::getAlarmType,
PlatAlarmConfigEnum.AlarmTypeEnum.OFF_BED.getValue()));
}
} }
...@@ -123,7 +123,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -123,7 +123,7 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
Boolean isUnWechatRead = CollUtil.isNotEmpty(list) && list.stream() Boolean isUnWechatRead = CollUtil.isNotEmpty(list) && list.stream()
.anyMatch(a -> CommonEnum.NO.getValue().equals(a.getWechatReadFlag())); .anyMatch(a -> CommonEnum.NO.getValue().equals(a.getWechatReadFlag()));
Boolean statusFlag = CollUtil.isNotEmpty(list) && list.stream() Boolean statusFlag = CollUtil.isNotEmpty(list) && list.stream()
.anyMatch(a -> CommonEnum.NO.getValue().equals(a.getStatus())); .anyMatch(a -> CommonEnum.NO.getValue().equals(a.getReadFlag()));
Page<PlatAlarmRecord> page = page(mpPage, lambdaQueryWrapper); Page<PlatAlarmRecord> page = page(mpPage, lambdaQueryWrapper);
List<PlatAlarmRecord> records = page.getRecords(); List<PlatAlarmRecord> records = page.getRecords();
List<PlatAlarmRecordVO> dtos = BeanDtoVoUtils.listVo(records, PlatAlarmRecordVO.class); List<PlatAlarmRecordVO> dtos = BeanDtoVoUtils.listVo(records, PlatAlarmRecordVO.class);
......
...@@ -32,6 +32,8 @@ import java.util.List; ...@@ -32,6 +32,8 @@ import java.util.List;
*/ */
public interface PlatDeviceService extends IService<PlatDevice> { public interface PlatDeviceService extends IService<PlatDevice> {
PageVO<PlatDeviceListVO> platPage(PageReqDTO<PlatDeviceQueryDTO> pageReqDTO);
PageVO<PlatDeviceListVO> page(PageReqDTO<PlatDeviceQueryDTO> pageReqDTO); PageVO<PlatDeviceListVO> page(PageReqDTO<PlatDeviceQueryDTO> pageReqDTO);
void edit(PlatDeviceEditDTO dto); void edit(PlatDeviceEditDTO dto);
...@@ -95,4 +97,6 @@ public interface PlatDeviceService extends IService<PlatDevice> { ...@@ -95,4 +97,6 @@ public interface PlatDeviceService extends IService<PlatDevice> {
void devicePushLog(MultipartFile multipartFile, String deviceId) throws IOException; void devicePushLog(MultipartFile multipartFile, String deviceId) throws IOException;
void syncIotProperties(String deviceId, JSONObject iotProperties); void syncIotProperties(String deviceId, JSONObject iotProperties);
List<PlatDevice> listOffBed(String oriDeviceId);
} }
...@@ -3,6 +3,8 @@ package com.makeit.service.platform.elder; ...@@ -3,6 +3,8 @@ package com.makeit.service.platform.elder;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis; import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import java.util.List;
/** /**
* <p> * <p>
* 长者每天呼吸分析 服务类 * 长者每天呼吸分析 服务类
...@@ -13,5 +15,5 @@ import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis; ...@@ -13,5 +15,5 @@ import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
*/ */
public interface PlatElderBreatheAnalysisService extends IService<PlatElderBreatheAnalysis> { public interface PlatElderBreatheAnalysisService extends IService<PlatElderBreatheAnalysis> {
void elderHeartRespiratoryAnalysisTask(); List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month, Integer day);
} }
package com.makeit.service.platform.elder.impl; package com.makeit.service.platform.elder.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
...@@ -15,8 +16,7 @@ import com.makeit.entity.platform.elder.PlatElderBreatheDayStat; ...@@ -15,8 +16,7 @@ import com.makeit.entity.platform.elder.PlatElderBreatheDayStat;
import com.makeit.entity.saas.analysis.SaasDiseaseEvaluateReport; import com.makeit.entity.saas.analysis.SaasDiseaseEvaluateReport;
import com.makeit.entity.saas.analysis.SaasDiseaseModel; import com.makeit.entity.saas.analysis.SaasDiseaseModel;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.enums.report.BreatheTypeEnum; import com.makeit.enums.report.ConditionTypeEnum;
import com.makeit.enums.report.HeartRateTypeEnum;
import com.makeit.mapper.platform.elder.PlatElderBreatheAnalysisMapper; import com.makeit.mapper.platform.elder.PlatElderBreatheAnalysisMapper;
import com.makeit.module.iot.service.IotProductDeviceService; import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.DeviceOperationLogEntity; import com.makeit.module.iot.vo.DeviceOperationLogEntity;
...@@ -38,6 +38,8 @@ import com.makeit.utils.data.convert.StreamUtil; ...@@ -38,6 +38,8 @@ import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.time.LocalDateTimeUtils; import com.makeit.utils.time.LocalDateTimeUtils;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -46,6 +48,7 @@ import java.math.BigDecimal; ...@@ -46,6 +48,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
...@@ -62,6 +65,8 @@ import java.util.stream.Collectors; ...@@ -62,6 +65,8 @@ import java.util.stream.Collectors;
@Service @Service
public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBreatheAnalysisMapper, PlatElderBreatheAnalysis> implements PlatElderBreatheAnalysisService { public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBreatheAnalysisMapper, PlatElderBreatheAnalysis> implements PlatElderBreatheAnalysisService {
private static final Logger logger = LoggerFactory.getLogger(PlatElderBreatheAnalysisServiceImpl.class);
@Autowired @Autowired
private PlatElderService platElderService; private PlatElderService platElderService;
@Autowired @Autowired
...@@ -85,16 +90,19 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -85,16 +90,19 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void elderHeartRespiratoryAnalysisTask() { public List<PlatElderBreatheAnalysis> elderHeartRespiratoryAnalysisTask(Integer month,Integer day) {
// 12-06,12-18 12-07、 12-12(70分)
LocalDate nowDate = LocalDate.now(); LocalDate nowDate = LocalDate.now();
// LocalDate nowDate = LocalDate.of(2023, month, day);
LocalDate yesDate = nowDate.minusDays(1); LocalDate yesDate = nowDate.minusDays(1);
LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate); LocalDateTime yesStart = LocalDateTimeUtils.getDayStart(yesDate);
LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate); LocalDateTime yesEnd = LocalDateTimeUtils.getDayEnd(yesDate);
List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda() List<PlatElder> elderList = platElderService.list(new QueryWrapper<PlatElder>().lambda()
.isNotNull(PlatElder::getBedId)); .isNotNull(PlatElder::getBedId));
List<PlatElderBreatheAnalysis> result = new ArrayList<>();
if (CollectionUtils.isEmpty(elderList)) { if (CollectionUtils.isEmpty(elderList)) {
return; return result;
} }
List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId); List<String> elderIdList = StreamUtil.map(elderList, BaseEntity::getId);
...@@ -211,7 +219,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -211,7 +219,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
} }
// 判断呼吸率阈值,记录发生时间和当前呼吸率 // 判断呼吸率阈值,记录发生时间和当前呼吸率
if (breatheThresholdMax < br) { if (breatheThresholdMax < br && br != 255) {
if (brFast == 0) { if (brFast == 0) {
brFast = br; brFast = br;
} }
...@@ -238,7 +246,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -238,7 +246,7 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
} }
if (heartThresholdMax < hr) { if (heartThresholdMax < hr && hr != 255) {
if (hrFast == 0) { if (hrFast == 0) {
hrFast = br; hrFast = br;
} }
...@@ -387,7 +395,9 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -387,7 +395,9 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
// 根据疾病标准配置的规则判断满足哪个区间范围 // 根据疾病标准配置的规则判断满足哪个区间范围
for (DiseaseReportVO diseaseReportVO : evaluateReportList) { for (DiseaseReportVO diseaseReportVO : evaluateReportList) {
List<DiseaseReportVO.Condition> conditionList = diseaseReportVO.getCondition(); List<DiseaseReportVO.Condition> conditionList = diseaseReportVO.getCondition();
if (CollUtil.isEmpty(conditionList)) {
return result;
}
boolean conditionFlag = true; boolean conditionFlag = true;
for (DiseaseReportVO.Condition condition : conditionList) { for (DiseaseReportVO.Condition condition : conditionList) {
...@@ -398,22 +408,22 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -398,22 +408,22 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
break; break;
} }
} else { } else {
if (resultRelational.equals("normal")) { if (resultCondition.equals(ConditionTypeEnum.NORMAL.getCode())) {
conditionFlag = normalFlag && conditionFlag; conditionFlag = normalFlag && conditionFlag;
} }
if (resultRelational.equals(BreatheTypeEnum.APNEA.getCode())) { if (resultCondition.equals(ConditionTypeEnum.BREATHE_STOP.getCode())) {
conditionFlag = brStopFlag && conditionFlag; conditionFlag = brStopFlag && conditionFlag;
} }
if (resultRelational.equals(BreatheTypeEnum.TACHYPNEA.getCode())) { if (resultCondition.equals(ConditionTypeEnum.BREATHE_FAST.getCode())) {
conditionFlag = brFastFlag && conditionFlag; conditionFlag = brFastFlag && conditionFlag;
} }
if (resultRelational.equals(BreatheTypeEnum.BRADYPNEA.getCode())) { if (resultCondition.equals(ConditionTypeEnum.BREATHE_SLOW.getCode())) {
conditionFlag = brSlowFlag && conditionFlag; conditionFlag = brSlowFlag && conditionFlag;
} }
if (resultRelational.equals(HeartRateTypeEnum.TACHYCARDIA.getCode())) { if (resultCondition.equals(ConditionTypeEnum.HEART_FAST.getCode())) {
conditionFlag = hrFastFlag && conditionFlag; conditionFlag = hrFastFlag && conditionFlag;
} }
if (resultRelational.equals(HeartRateTypeEnum.BRADYCARDIA.getCode())) { if (resultCondition.equals(ConditionTypeEnum.HEART_SLOW.getCode())) {
conditionFlag = hrSlowFlag && conditionFlag; conditionFlag = hrSlowFlag && conditionFlag;
} }
} }
...@@ -434,8 +444,12 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr ...@@ -434,8 +444,12 @@ public class PlatElderBreatheAnalysisServiceImpl extends ServiceImpl<PlatElderBr
platElderBreatheAnalysis.setTenantId(platElder.getTenantId()); platElderBreatheAnalysis.setTenantId(platElder.getTenantId());
platElderBreatheAnalysis.setBreatheEvaluate(diseaseReport == null ? "" : diseaseReport.getEvaluate()); platElderBreatheAnalysis.setBreatheEvaluate(diseaseReport == null ? "" : diseaseReport.getEvaluate());
platElderBreatheAnalysisService.save(platElderBreatheAnalysis); platElderBreatheAnalysisService.save(platElderBreatheAnalysis);
// platElderBreatheAnalysis.setRemake(String.format("normalFlag:%s,hrFastFlag:%s,brStopFlag:%s,brFastFlag:%s,brSlowFlag:%s,hrSlowFlag:%s",
// normalFlag, hrFastFlag, brStopFlag, brFastFlag, brSlowFlag, hrSlowFlag));
result.add(platElderBreatheAnalysis);
} }
return result;
} }
......
...@@ -258,7 +258,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe ...@@ -258,7 +258,6 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
@Override @Override
public List<PlatElderRealTimeHeartRespiratoryVO> heartRespiratory(PlatElderReportDTO platElderIdDTO) { public List<PlatElderRealTimeHeartRespiratoryVO> heartRespiratory(PlatElderReportDTO platElderIdDTO) {
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId()); PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId());
if (platDevice == null) { if (platDevice == null) {
......
...@@ -9,6 +9,7 @@ import com.makeit.entity.platform.elder.*; ...@@ -9,6 +9,7 @@ import com.makeit.entity.platform.elder.*;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum; import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.SleepTypeEnum; import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO; import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.*; import com.makeit.service.platform.elder.*;
import com.makeit.service.saas.SaasDiseaseReportService; import com.makeit.service.saas.SaasDiseaseReportService;
import com.makeit.service.saas.SaasElderReportConfigService; import com.makeit.service.saas.SaasElderReportConfigService;
...@@ -71,6 +72,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek ...@@ -71,6 +72,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
private PlatElderSleepAnalysisService platElderSleepAnalysisService; private PlatElderSleepAnalysisService platElderSleepAnalysisService;
@Autowired @Autowired
private PlatElderService platElderService; private PlatElderService platElderService;
@Autowired
private PlatDeviceService platDeviceService;
private LocalDateTime weekStartDateTime(LocalDateTime defaultTime) { private LocalDateTime weekStartDateTime(LocalDateTime defaultTime) {
return weekStartDateTime(LocalDate.now().minusDays(1), defaultTime); return weekStartDateTime(LocalDate.now().minusDays(1), defaultTime);
...@@ -408,7 +411,14 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek ...@@ -408,7 +411,14 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId()); PlatDevice platDevice = platElderRealTimeService.getBreathDevice(platElderIdDTO.getElderId(), platElderIdDTO.getDeviceId());
if (platDevice != null) { if (platDevice != null) {
deviceId = platDevice.getId(); if (StringUtils.isNotEmpty(platElderIdDTO.getTenantId()) && !platDevice.getTenantId().equals(platElderIdDTO.getTenantId())) {
platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(BaseBusEntity::getTenantId,platElderIdDTO.getTenantId())
.eq(PlatDevice::getOriDeviceId, platElderIdDTO.getDeviceId()).last("limit 1"));
deviceId = platDevice.getId();
} else {
deviceId = platDevice.getId();
}
//oriDeviceId = platDevice.getOriDeviceId(); //oriDeviceId = platDevice.getOriDeviceId();
} }
......
...@@ -103,6 +103,11 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService { ...@@ -103,6 +103,11 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
if (StringUtils.isNotBlank(deviceId)) { if (StringUtils.isNotBlank(deviceId)) {
platDevice = platDeviceService.getById(deviceId); platDevice = platDeviceService.getById(deviceId);
if (platDevice == null) {
platDevice = platDeviceService.getOne(new QueryWrapper<PlatDevice>().lambda()
.eq(PlatDevice::getOriDeviceId, deviceId).last("limit 1"));
}
} }
return platDevice; return platDevice;
......
...@@ -2,6 +2,7 @@ package com.makeit.service.platform.elder.impl; ...@@ -2,6 +2,7 @@ package com.makeit.service.platform.elder.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.dto.platform.elder.PlatElderReportDTO; import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.entity.platform.elder.PlatElderReportMonth; import com.makeit.entity.platform.elder.PlatElderReportMonth;
import com.makeit.mapper.platform.elder.PlatElderReportMonthMapper; import com.makeit.mapper.platform.elder.PlatElderReportMonthMapper;
...@@ -94,9 +95,10 @@ public class PlatElderReportMonthServiceImpl extends ServiceImpl<PlatElderReport ...@@ -94,9 +95,10 @@ public class PlatElderReportMonthServiceImpl extends ServiceImpl<PlatElderReport
List<PlatElderReportMonth> monthList = list(new QueryWrapper<PlatElderReportMonth>().lambda() List<PlatElderReportMonth> monthList = list(new QueryWrapper<PlatElderReportMonth>().lambda()
.eq(StringUtils.isNotBlank(platElderIdDTO.getElderId()), PlatElderReportMonth::getElderId, platElderIdDTO.getElderId()) .eq(StringUtils.isNotBlank(platElderIdDTO.getElderId()), PlatElderReportMonth::getElderId, platElderIdDTO.getElderId())
.eq(StringUtils.isNotBlank(platElderIdDTO.getDeviceId()), PlatElderReportMonth::getBreatheDeviceId, platElderIdDTO.getDeviceId()) .eq(StringUtils.isNotBlank(platElderIdDTO.getDeviceId()), PlatElderReportMonth::getBreatheOriDeviceId, platElderIdDTO.getDeviceId())
.ge(PlatElderReportMonth::getDay, start) .ge(PlatElderReportMonth::getDay, start)
.le(PlatElderReportMonth::getDay, end) .le(PlatElderReportMonth::getDay, end)
.eq(StringUtils.isNotEmpty(platElderIdDTO.getTenantId()), BaseBusEntity::getTenantId,platElderIdDTO.getTenantId())
.orderByAsc(PlatElderReportMonth::getDay) .orderByAsc(PlatElderReportMonth::getDay)
); );
......
...@@ -15,6 +15,7 @@ import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; ...@@ -15,6 +15,7 @@ import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport; import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.report.ElderSleepType; import com.makeit.enums.report.ElderSleepType;
import com.makeit.enums.report.SleepTypeEnum; import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.elder.PlatElderSleepMapper; import com.makeit.mapper.platform.elder.PlatElderSleepMapper;
import com.makeit.module.iot.service.IotProductDeviceService; import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.DeviceOperationLogEntity; import com.makeit.module.iot.vo.DeviceOperationLogEntity;
...@@ -85,6 +86,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -85,6 +86,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@TenantIdIgnore
public void elderSleepSleepAnalysisTask() { public void elderSleepSleepAnalysisTask() {
List<String> dayHourRangeList = getLastDayHourRange(); List<String> dayHourRangeList = getLastDayHourRange();
...@@ -305,6 +307,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -305,6 +307,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
startSleepTime = entry.getKey(); startSleepTime = entry.getKey();
} }
sleepMinute++; sleepMinute++;
continue;
} }
if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) { if (StringUtils.isEmpty(startSleepTime) && sleepMinute == 0) {
continue; continue;
...@@ -635,8 +638,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -635,8 +638,6 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
} }
} }
// 根据睡眠报告评估标准算出不同睡眠类型的得分
sleepTime = sleepTime - soberTime;
long deepScore = 0; long deepScore = 0;
for (int i = 0; i < sleepDeepConfigList.size(); i++) { for (int i = 0; i < sleepDeepConfigList.size(); i++) {
long hour = deepTime / 60; long hour = deepTime / 60;
...@@ -706,11 +707,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -706,11 +707,8 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
dayRestTime += elderSleep.getInterval(); dayRestTime += elderSleep.getInterval();
} }
} }
// TODO 起床时间和入睡时间
platElderSleepService.saveBatch(elderSleepList); platElderSleepService.saveBatch(elderSleepList);
EvaluateReportVO elderReport = saasElderReportConfigService.getByScore(totalScore);
// 长者一天的睡眠分析 // 长者一天的睡眠分析
PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis(); PlatElderSleepAnalysis elderSleepAnalysis = new PlatElderSleepAnalysis();
elderSleepAnalysis.setElderId(elder.getId()); elderSleepAnalysis.setElderId(elder.getId());
...@@ -722,7 +720,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper, ...@@ -722,7 +720,7 @@ public class PlatElderSleepServiceImpl extends ServiceImpl<PlatElderSleepMapper,
elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime)); elderSleepAnalysis.setRestTime(String.valueOf(dayRestTime));
elderSleepAnalysis.setSleepResult(sleepReport.getResult()); elderSleepAnalysis.setSleepResult(sleepReport.getResult());
elderSleepAnalysis.setTenantId(tenantId); elderSleepAnalysis.setTenantId(tenantId);
elderSleepAnalysis.setSleepEvaluate(elderReport == null ? "" : elderReport.getEvaluate()); elderSleepAnalysis.setSleepEvaluate(sleepReport.getEvaluate());
platElderSleepAnalysisService.save(elderSleepAnalysis); platElderSleepAnalysisService.save(elderSleepAnalysis);
} }
......
...@@ -96,4 +96,6 @@ public interface PlatSpaceService extends IService<PlatSpace> { ...@@ -96,4 +96,6 @@ public interface PlatSpaceService extends IService<PlatSpace> {
List<PlatSpace> listChildAndOrgIds(List<String> spaceIds, List<String> orgIds); List<PlatSpace> listChildAndOrgIds(List<String> spaceIds, List<String> orgIds);
void fixPlacePath(String spaceId);
} }
...@@ -43,6 +43,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport; ...@@ -43,6 +43,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -68,6 +69,11 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -68,6 +69,11 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
private PlatElderService platElderService; private PlatElderService platElderService;
private void check(PlatSpaceAddDTO dto) { private void check(PlatSpaceAddDTO dto) {
if (StrUtil.isNotBlank(dto.getParentPath())
&& dto.getParentPath().split(",").length > 4) {
throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_OVER_LEVEL);
}
LambdaQueryWrapper<PlatSpace> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PlatSpace> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PlatSpace::getName, dto.getName()); queryWrapper.eq(PlatSpace::getName, dto.getName());
queryWrapper.ne(StringUtil.isNotEmpty(dto.getId()), PlatSpace::getId, dto.getId()); queryWrapper.ne(StringUtil.isNotEmpty(dto.getId()), PlatSpace::getId, dto.getId());
...@@ -148,8 +154,7 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -148,8 +154,7 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
if (parentSpace!=null && parentSpace.getParentPath()!=null && parentSpace.getParentPath().contains(dto.getId())) { if (parentSpace!=null && parentSpace.getParentPath()!=null && parentSpace.getParentPath().contains(dto.getId())) {
throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_NOT_AUTH_PARENT); throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_NOT_AUTH_PARENT);
} }
// todo 编辑后层级大于4,不允许编辑 脏数据太多,待校验 checkAndUpdateSonSpace(space);
// checkAndUpdateSonSpace(space);
this.updateById(space); this.updateById(space);
List<String> lastSpaceIds = recursionLastSpaceIds(space.getId(), new ArrayList<>()); List<String> lastSpaceIds = recursionLastSpaceIds(space.getId(), new ArrayList<>());
if (CollUtil.isEmpty(lastSpaceIds)) { if (CollUtil.isEmpty(lastSpaceIds)) {
...@@ -219,8 +224,8 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -219,8 +224,8 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
private void checkAndUpdateSonSpace(PlatSpace space) { private void checkAndUpdateSonSpace(PlatSpace space) {
String parentPath = space.getParentPath(); String parentPath = space.getParentPath();
int level = StrUtil.isBlank(parentPath) ? 0 : parentPath.split(",").length; int level = StrUtil.isBlank(parentPath) ? 1 : parentPath.split(",").length + 1;
if (level > 3) { if (level > 4) {
throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_OVER_LEVEL); throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_OVER_LEVEL);
} }
String spaceId = space.getId(); String spaceId = space.getId();
...@@ -228,19 +233,19 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -228,19 +233,19 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
.apply(StringUtils.isNotBlank(spaceId), "find_in_set('" + spaceId + "',parent_path)")); .apply(StringUtils.isNotBlank(spaceId), "find_in_set('" + spaceId + "',parent_path)"));
int sonLevel = 0; int sonLevel = 0;
if (CollUtil.isNotEmpty(platSpaceList)) { if (CollUtil.isNotEmpty(platSpaceList)) {
final int[] maxLength = {1}; AtomicInteger maxLength = new AtomicInteger(1);
platSpaceList.forEach(s -> { platSpaceList.forEach(s -> {
if (StrUtil.isBlank(s.getParentPath())) { if (StrUtil.isBlank(s.getParentPath())) {
return; return;
} }
String[] parentSpaceIds = s.getParentPath().split(","); int maxSpacePath = getMaxSpacePath(s.getParentPath(), spaceId);
if (parentSpaceIds.length > maxLength[0]) { if (maxSpacePath > maxLength.get()) {
maxLength[0] = parentSpaceIds.length; maxLength.set(maxSpacePath);
} }
}); });
sonLevel = maxLength[0]; sonLevel = maxLength.get();
} }
if (level + sonLevel > 3) { if (level + sonLevel > 4) {
throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_OVER_LEVEL); throw new BusinessException(CodeMessageEnum.PLATFORM_ERROR_SPACE_OVER_LEVEL);
} }
// 更新下级空间的parentPath // 更新下级空间的parentPath
...@@ -261,6 +266,12 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -261,6 +266,12 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
} }
private Integer getMaxSpacePath(String path, String splitSpace) {
List<String> pathList = Arrays.asList(path.split(","));
return pathList.size() - pathList.indexOf(splitSpace);
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void del(String id) { public void del(String id) {
...@@ -1086,7 +1097,47 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace ...@@ -1086,7 +1097,47 @@ public class PlatSpaceServiceImpl extends ServiceImpl<PlatSpaceMapper, PlatSpace
return data; return data;
} }
@Override
public void fixPlacePath(String spaceId) {
PlatSpace space = getById(spaceId);
if (space == null || StrUtil.isNotBlank(space.getParentId())) {
return;
}
List<PlatSpace> allList = new ArrayList<>();
recursionSetParentPath(spaceId, space.getParentPath(), allList);
if (CollUtil.isNotEmpty(allList)) {
updateBatchById(allList);
}
// fixAllSpacePath();
}
private void fixAllSpacePath() {
List<PlatSpace> firstSpaceList = list(Wrappers.<PlatSpace>lambdaQuery().isNull(PlatSpace::getParentPath)
.isNull(PlatSpace::getParentId));
if (CollUtil.isEmpty(firstSpaceList)) {
return;
}
firstSpaceList.forEach(f -> {
List<PlatSpace> allList = new ArrayList<>();
recursionSetParentPath(f.getId(), f.getParentPath(), allList);
if (CollUtil.isNotEmpty(allList)) {
updateBatchById(allList);
}
});
}
private void recursionSetParentPath(String spaceId, String parentPath, List<PlatSpace> allList) {
List<PlatSpace> firstSonList = list(Wrappers.<PlatSpace>lambdaQuery().eq(PlatSpace::getParentId, spaceId));
if (CollUtil.isEmpty(firstSonList)) {
return;
}
firstSonList.forEach(s -> {
s.setParentPath(StrUtil.isNotBlank(parentPath) ? parentPath + "," + s.getParentId() : spaceId);
allList.add(s);
recursionSetParentPath(s.getId(), s.getParentPath(), allList);
});
}
} }
...@@ -24,4 +24,7 @@ public interface PlatLogoConfigService extends IService<PlatLogoConfig> { ...@@ -24,4 +24,7 @@ public interface PlatLogoConfigService extends IService<PlatLogoConfig> {
* @return * @return
*/ */
PlatLogoConfigDTOVO view(PlatLogoConfigQueryDTO dto); PlatLogoConfigDTOVO view(PlatLogoConfigQueryDTO dto);
void updateByTenantId(String tenantId, String code);
} }
package com.makeit.service.platform.sys.impl; package com.makeit.service.platform.sys.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.dto.platform.sys.PlatLogoConfigDTO; import com.makeit.dto.platform.sys.PlatLogoConfigDTO;
import com.makeit.dto.platform.sys.PlatLogoConfigDTOVO; import com.makeit.dto.platform.sys.PlatLogoConfigDTOVO;
...@@ -66,4 +67,13 @@ public class PlatLogoConfigServiceImpl extends ServiceImpl<PlatLogoConfigMapper, ...@@ -66,4 +67,13 @@ public class PlatLogoConfigServiceImpl extends ServiceImpl<PlatLogoConfigMapper,
return data; return data;
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void updateByTenantId(String tenantId, String code) {
LambdaUpdateWrapper<PlatLogoConfig> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(PlatLogoConfig::getCode, code).eq(PlatLogoConfig::getTenantId, tenantId);
update(updateWrapper);
}
} }
package com.makeit.service.saas.impl; package com.makeit.service.saas.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -9,7 +8,6 @@ import com.makeit.common.entity.BaseBusEntity; ...@@ -9,7 +8,6 @@ import com.makeit.common.entity.BaseBusEntity;
import com.makeit.common.entity.BaseEntity; import com.makeit.common.entity.BaseEntity;
import com.makeit.common.page.PageReqDTO; import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO; import com.makeit.common.page.PageVO;
import com.makeit.config.WxMaConfiguration;
import com.makeit.dto.platform.sys.PlatLogoConfigDTO; import com.makeit.dto.platform.sys.PlatLogoConfigDTO;
import com.makeit.entity.platform.auth.PlatOrg; import com.makeit.entity.platform.auth.PlatOrg;
import com.makeit.entity.platform.auth.PlatUser; import com.makeit.entity.platform.auth.PlatUser;
...@@ -321,6 +319,8 @@ public class PlatTenantServiceImpl extends ServiceImpl<PlatTenantMapper, PlatTen ...@@ -321,6 +319,8 @@ public class PlatTenantServiceImpl extends ServiceImpl<PlatTenantMapper, PlatTen
//更新组织表 //更新组织表
platOrgService.edit(platOrg); platOrgService.edit(platOrg);
platLogoConfigService.updateByTenantId(tntTenant.getId(), dto.getCode());
//分配菜单 todo 慢 //分配菜单 todo 慢
assignMenuList(tntTenant.getId(), dto.getMenuIdList()); assignMenuList(tntTenant.getId(), dto.getMenuIdList());
......
...@@ -51,7 +51,7 @@ public class PlatElderReportTask { ...@@ -51,7 +51,7 @@ public class PlatElderReportTask {
@TenantIdIgnore @TenantIdIgnore
public void elderHeartRespiratoryAnalysisTask() { public void elderHeartRespiratoryAnalysisTask() {
log.info("开始定时分析长者呼吸心率"); log.info("开始定时分析长者呼吸心率");
platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask(); platElderBreatheAnalysisService.elderHeartRespiratoryAnalysisTask(null,null);
log.info("定时分析长者呼吸心率结束"); log.info("定时分析长者呼吸心率结束");
} }
......
package com.makeit.utils; package com.makeit.utils;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.makeit.entity.platform.device.PlatDevice; import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.saas.PlatTenant; import com.makeit.entity.saas.PlatTenant;
...@@ -57,6 +58,15 @@ public class DeviceCacheUtil implements ApplicationRunner { ...@@ -57,6 +58,15 @@ public class DeviceCacheUtil implements ApplicationRunner {
} }
return RedisUtil.get(RedisConst.PLAT_IOT_DEVICE_PREFIX + oriDeviceIdAndIotOrgId); return RedisUtil.get(RedisConst.PLAT_IOT_DEVICE_PREFIX + oriDeviceIdAndIotOrgId);
} }
public List<PlatDevice> getByDeviceId(String oriDeviceId) {
List<PlatDevice> platDevice = RedisUtil.getLike(RedisConst.PLAT_IOT_DEVICE_PREFIX + oriDeviceId);
if (CollUtil.isEmpty(platDevice)) {
getAll();
}
return RedisUtil.getLike(RedisConst.PLAT_IOT_DEVICE_PREFIX + oriDeviceId);
}
public void putAll(Collection<PlatDevice> platDeviceList) { public void putAll(Collection<PlatDevice> platDeviceList) {
platDeviceList.forEach(vo -> { platDeviceList.forEach(vo -> {
put(vo); put(vo);
......
...@@ -90,9 +90,16 @@ public class PlatDeviceListVO extends BaseTenantDTO { ...@@ -90,9 +90,16 @@ public class PlatDeviceListVO extends BaseTenantDTO {
private String spaceName; private String spaceName;
private String roomId;
private String roomName; private String roomName;
private String bedId;
private String bedName; private String bedName;
private String elderName;
@ApiModelProperty(value = "许可证") @ApiModelProperty(value = "许可证")
private String deviceLicense; private String deviceLicense;
......
...@@ -21,4 +21,6 @@ ...@@ -21,4 +21,6 @@
and pehi.respiratory_exception_time != '' and pehi.respiratory_rate != '') and pehi.respiratory_exception_time != '' and pehi.respiratory_rate != '')
) )
</select> </select>
</mapper> </mapper>
...@@ -60,6 +60,71 @@ ...@@ -60,6 +60,71 @@
order by pd.update_date desc,pd.id desc order by pd.update_date desc,pd.id desc
</select> </select>
<select id="getDeviceIdsBySpaceIdAndElder" resultType="com.makeit.vo.platform.device.PlatDeviceListVO">
select
pd.*,
ps.parent_path as spaceParentPath,
ps.name as spaceName,
pr.name as roomName,
pb.name as bedName,
pr.id as roomId,
pb.id as bedId
from plat_device pd
left join plat_room_bed_device prbd on (pd.id = prbd.device_id and prbd.del_flag = '0')
left join plat_room pr on (pr.id = prbd.room_id and pr.del_flag = '0' )
left join plat_bed pb on ( pb.id = prbd.bed_id and pb.del_flag = '0')
left join plat_space ps on (ps.id = pr.space_id and ps.del_flag = '0')
left join plat_elder pe on (pe.room_id = pr.id and pe.del_flag = '0')
<where>
pd.del_flag = '0'
<if test="param.spaceId != null and param.spaceId != ''">
and ( FIND_IN_SET(#{param.spaceId},ps.parent_path) or ps.id = #{param.spaceId})
</if>
<if test="param.oriDeviceId != null and param.oriDeviceId != ''">
and pd.ori_device_id like concat('%',#{param.oriDeviceId},'%')
</if>
<if test="param.name != null and param.name != ''">
and pd.name like concat('%',#{param.name},'%')
</if>
<if test="param.status != null and param.status != '' ">
and pd.status = #{param.status}
</if>
<if test="param.productName != null and param.productName != '' ">
and pd.product_name like concat('%',#{param.productName},'%')
</if>
<if test="param.productId != null and param.productId != '' ">
and pd.product_id = #{param.productId}
</if>
<if test="param.orgId != null and param.orgId != '' ">
and pd.org_id = #{param.orgId}
</if>
<if test="param.tenantId != null and param.tenantId != ''">
and pd.tenant_id = #{param.tenantId}
</if>
<if test="param.active !=null and param.active == 1">
and pd.device_license is not null
</if>
<if test="param.active !=null and param.active == 0">
and pd.device_license is null
</if>
<if test="param.elderId !=null and param.elderId != ''">
and (pe.id = #{param.elderId} and
((pd.category != '0' and prbd.bed_id is null and prbd.room_id = pe.room_id) -- 空间、跌倒 关联房间
or
(pd.category = '0' and prbd.bed_id is not null and prbd.bed_id = pe.bed_id))) -- 呼吸 关联床位
</if>
<if test="param.orgIds != null and param.orgIds.size() > 0 ">
AND pd.org_id in
<foreach collection="param.orgIds" item="item" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
</where>
group by pd.id
order by pd.update_date desc,pd.id desc
</select>
<select id="getDevices" resultType="com.makeit.vo.platform.device.PlatDeviceListVO"> <select id="getDevices" resultType="com.makeit.vo.platform.device.PlatDeviceListVO">
select select
distinct distinct
......
package com.makeit.mqtt; package com.makeit.mqtt;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.makeit.common.entity.BaseEntity; import com.makeit.common.entity.BaseEntity;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO; import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.entity.platform.alarm.PlatAlarmConfig; import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import com.makeit.entity.platform.device.PlatDevice; import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel; import com.makeit.entity.saas.analysis.SaasSleepAnalysisModel;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.redis.RedisConst;
import com.makeit.external.strategy.OpenApiBaseStrategy;
import com.makeit.external.strategy.OpenApiBaseStrategyFactory;
import com.makeit.global.aspect.tenant.TenantIdIgnore; import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.module.iot.enums.DeviceState; import com.makeit.module.iot.enums.DeviceState;
import com.makeit.module.iot.vo.DeviceInfo; import com.makeit.module.iot.vo.DeviceInfo;
...@@ -15,12 +23,12 @@ import com.makeit.module.iot.vo.HeaderInfo; ...@@ -15,12 +23,12 @@ import com.makeit.module.iot.vo.HeaderInfo;
import com.makeit.service.platform.alarm.PlatAlarmConfigService; import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.alarmStrategy.IAlarm; import com.makeit.service.platform.alarm.alarmStrategy.IAlarm;
import com.makeit.service.platform.device.PlatDeviceService; import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.service.saas.SaasSleepAnalysisModelService; import com.makeit.service.saas.SaasSleepAnalysisModelService;
import com.makeit.utils.AlarmConfigCacheUtil; import com.makeit.utils.AlarmConfigCacheUtil;
import com.makeit.utils.DeviceCacheUtil; import com.makeit.utils.DeviceCacheUtil;
import com.makeit.utils.redis.RedisUtil; import com.makeit.utils.redis.RedisUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttClient;
...@@ -31,7 +39,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -31,7 +39,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -64,6 +71,8 @@ public class PushCallback implements MqttCallback { ...@@ -64,6 +71,8 @@ public class PushCallback implements MqttCallback {
public static final String WRITE_PROPERTY_REPLY = "WRITE_PROPERTY_REPLY"; public static final String WRITE_PROPERTY_REPLY = "WRITE_PROPERTY_REPLY";
public static final String OPEN_API_KEY_COUNT = "open:api:key:count";
@Autowired @Autowired
private MqttConfig mqttConfig; private MqttConfig mqttConfig;
...@@ -84,7 +93,10 @@ public class PushCallback implements MqttCallback { ...@@ -84,7 +93,10 @@ public class PushCallback implements MqttCallback {
private SaasSleepAnalysisModelService saasSleepAnalysisModelService; private SaasSleepAnalysisModelService saasSleepAnalysisModelService;
@Resource @Resource
private PlatAlarmConfigService alarmConfigService; private PlatAlarmConfigService alarmConfigService;
@Autowired
private OpenApiBaseStrategyFactory openApiBaseStrategyFactory;
@Autowired
private PlatTenantService platTenantService;
@Override @Override
public void connectionLost(Throwable cause) { public void connectionLost(Throwable cause) {
...@@ -99,12 +111,10 @@ public class PushCallback implements MqttCallback { ...@@ -99,12 +111,10 @@ public class PushCallback implements MqttCallback {
// 收到消息并设置返回字符串格式 // 收到消息并设置返回字符串格式
String payload = new String(message.getPayload(), "UTF-8"); String payload = new String(message.getPayload(), "UTF-8");
// logger.info("接收消息主题:{}, 接收消息QoS:{}", topic, message.getQos());
logger.info("接收消息内容:payload格式:{}", payload); logger.info("接收消息内容:payload格式:{}", payload);
// 解析数据 // 解析数据
DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class); DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class);
// todo
syncProperties(device); syncProperties(device);
...@@ -184,7 +194,7 @@ public class PushCallback implements MqttCallback { ...@@ -184,7 +194,7 @@ public class PushCallback implements MqttCallback {
String deviceId = device.getDeviceId(); String deviceId = device.getDeviceId();
String messageType = device.getMessageType(); String messageType = device.getMessageType();
//更新设备状态 //更新设备状态
boolean statusFlag = platDeviceService.updateDeviceStatus(messageType, deviceId, ""); platDeviceService.updateDeviceStatus(messageType, deviceId, "");
if (org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(messageType, DeviceState.online.getValue())) { if (org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(messageType, DeviceState.online.getValue())) {
return; return;
} }
...@@ -193,6 +203,9 @@ public class PushCallback implements MqttCallback { ...@@ -193,6 +203,9 @@ public class PushCallback implements MqttCallback {
String iot_tenantId = binding.getId(); String iot_tenantId = binding.getId();
JSONObject properties = device.getProperties(); JSONObject properties = device.getProperties();
// 设备上报到第三方,一分钟一次
reportBrData(device, iot_tenantId);
//iot设备id //iot设备id
PlatDevice platDevice = deviceCacheUtil.get(deviceId + ":" + iot_tenantId); PlatDevice platDevice = deviceCacheUtil.get(deviceId + ":" + iot_tenantId);
if (platDevice == null) { if (platDevice == null) {
...@@ -205,9 +218,14 @@ public class PushCallback implements MqttCallback { ...@@ -205,9 +218,14 @@ public class PushCallback implements MqttCallback {
logger.error("该设备没有告警配置,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId); logger.error("该设备没有告警配置,设备iot-id,iot_tenantId:" + deviceId+","+iot_tenantId);
return; return;
} }
handleOffBed(platDevice,properties,messageType);
for (PlatAlarmConfig config : deviceAlarmConfigList) { for (PlatAlarmConfig config : deviceAlarmConfigList) {
String alarmType = config.getAlarmType(); String alarmType = config.getAlarmType();
if (PlatAlarmConfigEnum.AlarmTypeEnum.OFF_BED.getValue().equals(alarmType)) {
continue;
}
for (IAlarm alarm : alarmList) { for (IAlarm alarm : alarmList) {
if (alarm.support(alarmType)) { if (alarm.support(alarmType)) {
//防止呼吸心率的数据交叉 //防止呼吸心率的数据交叉
...@@ -224,6 +242,7 @@ public class PushCallback implements MqttCallback { ...@@ -224,6 +242,7 @@ public class PushCallback implements MqttCallback {
} }
} }
} }
}catch (Exception e){ }catch (Exception e){
logger.error("告警异常pushCallback:",e); logger.error("告警异常pushCallback:",e);
} }
...@@ -232,6 +251,75 @@ public class PushCallback implements MqttCallback { ...@@ -232,6 +251,75 @@ public class PushCallback implements MqttCallback {
} }
/**
* 离床预警
* @param platDevice
* @param properties
* @param messageType
*/
private void handleOffBed(PlatDevice platDevice, JSONObject properties, String messageType) {
List<PlatDevice> platDeviceList = deviceCacheUtil.getByDeviceId(platDevice.getOriDeviceId());
if (CollUtil.isEmpty(platDeviceList)) {
return;
}
String alarmType = PlatAlarmConfigEnum.AlarmTypeEnum.OFF_BED.getValue();
List<String> type = Lists.newArrayList("OFFLINE", "DISCONNECT");
platDeviceList.forEach(device -> {
if (StrUtil.isBlank(messageType) || type.contains(messageType)
|| DeviceState.offline.getValue().equals(device.getStatus())) {
logger.warn("离线清除离床预警缓存!");
RedisUtil.delete(RedisConst.ALARM_DEVICE_OFF_BED_ID + device.getId());
}
for (IAlarm alarm : alarmList) {
if (alarm.support(alarmType)) {
PlatAlarmConfig config = alarmConfigCacheUtil.get(device.getOrgId(), alarmType);
if (config == null) {
continue;
}
//防止呼吸心率的数据交叉
PlatAlarmCheckDTO platAlarmCheckDTO = new PlatAlarmCheckDTO();
//告警配置
platAlarmCheckDTO.setPlatAlarmConfig(config);
//设备信息
platAlarmCheckDTO.setPlatDevice(device);
//iot上报数据
platAlarmCheckDTO.setProperties(properties);
//设备状态
platAlarmCheckDTO.setMessageType(messageType);
alarm.checkConfig(platAlarmCheckDTO);
}
}
});
}
private void reportBrData(DeviceInfo device,String iot_tenantId) {
HeaderInfo headers = device.getHeaders();
String deviceId = device.getDeviceId();
JSONObject properties = device.getProperties();
if (REPORT_PROPERTY.equals(device.getMessageType()) && headers.getProductName().contains("呼吸")) {
Long increment = redisTemplate.opsForValue().increment(OPEN_API_KEY_COUNT + deviceId + ":" + iot_tenantId,1);
if (increment != null && increment == 60) {
redisTemplate.delete(OPEN_API_KEY_COUNT + deviceId + ":" + iot_tenantId);
PlatTenant platTenant = platTenantService.getOne(new QueryWrapper<PlatTenant>()
.lambda().eq(PlatTenant::getIotOrgId,iot_tenantId));
if (platTenant != null) {
OpenApiBaseStrategy strategyFactoryHandler = openApiBaseStrategyFactory.getHandler(platTenant.getCode());
if (strategyFactoryHandler != null) {
try {
strategyFactoryHandler.report(platTenant, deviceId, properties);
} catch (Exception e) {
logger.error("调用呼吸设备上报数据接口失败:{}",e.getMessage(),e);
}
}
}
}
}
}
private void cacheSpaceFallDeviceData(String deviceSpaceTempData, DeviceInfo device, long currentSecond) { private void cacheSpaceFallDeviceData(String deviceSpaceTempData, DeviceInfo device, long currentSecond) {
long maxSize = 10L; long maxSize = 10L;
String key = deviceSpaceTempData + device.getDeviceId(); String key = deviceSpaceTempData + device.getDeviceId();
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logback.logdir}/${logback.appname}/logging/logging.%d{yyyy-MM-dd}.%i.log <FileNamePattern>${logback.logdir}/${logback.appname}/logging/logging.%d{yyyy-MM-dd}.%i.log
</FileNamePattern> </FileNamePattern>
<maxHistory>30</maxHistory> <maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize> <maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy> </timeBasedFileNamingAndTriggeringPolicy>
......
package com.makeit.iotapi; package com.makeit.iotapi;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.module.admin.vo.plat.PlatTenantVO; import com.makeit.module.admin.vo.plat.PlatTenantVO;
import com.makeit.module.iot.service.IotOrgService; import com.makeit.module.iot.service.IotOrgService;
import com.makeit.module.iot.service.IotProductDeviceService; import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.service.IotTokenService; import com.makeit.module.iot.service.IotTokenService;
import com.makeit.service.platform.alarm.alarmStrategy.OffBedAlarm;
import com.makeit.utils.redis.RedisUtil;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest @SpringBootTest
public class IotDeviceInfoContentFall { public class IotDeviceInfoContentFall {
...@@ -17,6 +25,8 @@ public class IotDeviceInfoContentFall { ...@@ -17,6 +25,8 @@ public class IotDeviceInfoContentFall {
private IotOrgService iotOrgService; private IotOrgService iotOrgService;
@Autowired @Autowired
private IotProductDeviceService iotProductDeviceService; private IotProductDeviceService iotProductDeviceService;
@Autowired
private OffBedAlarm offBedAlarm;
@Test @Test
...@@ -76,4 +86,32 @@ public class IotDeviceInfoContentFall { ...@@ -76,4 +86,32 @@ public class IotDeviceInfoContentFall {
void updateIotOrgInfo() { void updateIotOrgInfo() {
iotOrgService.updateIotOrgInfo("1698964909267415040", "lxl2234"); iotOrgService.updateIotOrgInfo("1698964909267415040", "lxl2234");
} }
@Test
void offBedAlarm() {
PlatAlarmCheckDTO platAlarmCheckDTO = new PlatAlarmCheckDTO();
PlatDevice platDevice = new PlatDevice();
platDevice.setOrgId("1712384736845950978");
platDevice.setId("1732609639364812811");
platAlarmCheckDTO.setPlatDevice(platDevice);
JSONObject properties = JSON.parseObject("{\n" +
" \"person\": 0,\n" +
" \"personState\": 0,\n" +
" \"distance\": 50,\n" +
" \"hr\": 80,\n" +
" \"br\": 20,\n" +
" \"bodymove\": 50,\n}");
platAlarmCheckDTO.setProperties(properties);
offBedAlarm.checkConfig(platAlarmCheckDTO);
}
@Test
void getRedis() {
// iot-plafform:plat:iot:device:1712376790484275200:1701420402262994944
// iot-plafform:plat:iot:device:1712377046877884416:1703950733042053120
List<PlatDevice> list = RedisUtil.getLike("plat:iot:device:" + "1712377046877884416");
System.out.println(list);
}
} }
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