Commit 214aae5d by 朱淼 Committed by 罗志长

干休所demo

parent 7ab531ac
Showing with 1271 additions and 0 deletions
package com.makeit.module.demo.dto;
import lombok.Data;
/**
* Controller
*
* @author zm
* @version 2023/9/25
*/
@Data
public class DemoDeviceDTO {
private String entityCode;
private Boolean queryShadow;
}
package com.makeit.module.demo.service;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.makeit.module.demo.dto.DemoDeviceDTO;
import com.makeit.module.demo.vo.DemoResponseMessage;
import com.makeit.module.iot.dto.Condition;
import com.makeit.module.iot.dto.IotQueryParam;
import com.makeit.module.iot.dto.IotSort;
import com.makeit.module.iot.dto.Term;
import com.makeit.module.iot.util.HeaderUtils;
import com.makeit.module.iot.util.HttpRequest;
import com.makeit.module.iot.util.Response;
import com.makeit.module.iot.util.SimpleHttpRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
@Slf4j
public class DemoCommonService {
@Autowired
public HeaderUtils headerUtils;
@Value("${demo.url:}")
public String demoUrl;
protected static HttpClient httpClient = HttpClientBuilder.create().build();
public HttpRequest buildRequest(String url,String body) {
log.info("接口:{},请求参数:{}",url,body);
HttpRequest request = new SimpleHttpRequest(url, httpClient);
HashMap hashMap = JSON.parseObject(body, HashMap.class);
request.headers(headerUtils.createDemoHeadersOfParams(hashMap));
request.requestBody(body);
return request;
}
public DemoResponseMessage sendPut(String url, HttpRequest request) throws IOException {
Response response = request.put();
DemoResponseMessage responseMessage = getResponseMessage(url, response);
return responseMessage;
}
public DemoResponseMessage sendGet(String url, HttpRequest request) throws IOException {
Response response = request.get();
DemoResponseMessage responseMessage = getResponseMessage(url, response);
return responseMessage;
}
public DemoResponseMessage sendPost(String url, HttpRequest request) throws IOException {
Response response = request.post();
DemoResponseMessage responseMessage = getResponseMessage(url, response);
return responseMessage;
}
private static DemoResponseMessage getResponseMessage(String url, Response response) throws IOException {
Object result = JSON.parse(response.asBytes());
DemoResponseMessage responseMessage = JSON.parseObject(result.toString(), DemoResponseMessage.class);
log.info("接口:{},返回信息:{}", url,JSON.toJSONString(responseMessage));
return responseMessage;
}
/**
* 默认按照时间倒叙
* 可以根据terms进行条件查询 格式
* [
* {
* "terms": [
* {
* "type": "or",
* "value": "%123%",
* "termType": "like",
* "column": "name"
* }
* ]
* }
* ]
* @return
*/
public static DemoDeviceDTO buildQueryParam(String entityCode, boolean queryShadow) {
DemoDeviceDTO dto = new DemoDeviceDTO();
dto.setQueryShadow(queryShadow);
dto.setEntityCode(entityCode);
return dto;
}
/**
*
* @param pageSize 页大小
* @param column 查询列
* @param termType 动态条件类型
* @param assetType
* @param pkId
* @param type
* @return
*/
public static IotQueryParam buildQueryParam(int pageSize,String column,String termType,String assetType,String pkId,String type,String sortColumn) {
IotQueryParam iotQueryParam = new IotQueryParam();
iotQueryParam.setPageIndex(0);
iotQueryParam.setPageSize(pageSize);
List<Term> terms = getTerms(column, termType, assetType, pkId, type);
iotQueryParam.setTerms(terms);
List<IotSort> iotSortList = buildSort(sortColumn);
iotQueryParam.setSorts(iotSortList);
return iotQueryParam;
}
private static List<IotSort> buildSort(String createTime) {
List<IotSort> iotSortList = Lists.newArrayList();
IotSort iotSort = new IotSort();
iotSort.setOrder("desc");
iotSort.setName(createTime);
iotSortList.add(iotSort);
return iotSortList;
}
private static List<Term> getTerms(String column, String termType, String assetType, String pkId, String type) {
List<Term> terms = Lists.newArrayList();
if (StringUtils.isEmpty(column)) {
return terms;
}
List<Condition.Targets> targets = Lists.newArrayList();
Condition.Targets target = Condition.Targets.builder()
.id(pkId)
.type(type).build();
targets.add(target);
Condition condition = Condition.builder()
.assetType(assetType)
.targets(targets)
.build();
Term term = Term.builder()
.column(column)
.termType(termType)
.value(condition)
.terms(Lists.newArrayList())
.options(Lists.newArrayList())
.build();
terms.add(term);
return terms;
}
}
package com.makeit.module.demo.service;
import com.alibaba.fastjson.JSON;
import com.makeit.module.demo.dto.DemoDeviceDTO;
import com.makeit.module.demo.vo.DemoDeviceEntity;
import com.makeit.module.demo.vo.DemoResponseMessage;
import com.makeit.module.iot.util.HttpRequest;
import com.makeit.utils.data.convert.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* iot产品设备相关接口
*/
@Component
@Slf4j
public class DemoProductDeviceService extends DemoCommonService {
public static final String DEVICE_PREFIX_URL = "ym-open-api/s/api/v2/common/device/";
/**
* 获取设备信息
*/
public DemoDeviceEntity queryDeviceDetail(String entityCode, boolean queryShadow) {
String url = demoUrl + DEVICE_PREFIX_URL + "query-device-detail";
// 条件可以自己改
DemoDeviceDTO dto = buildQueryParam(entityCode, queryShadow);
String body = JsonUtil.toJson(dto);
HttpRequest request = buildRequest(url, body);
try {
DemoResponseMessage responseMessage = sendPost(url, request);
if (responseMessage.getRetcode() == 0) {
if(responseMessage.getData() != null){
DemoDeviceEntity demoDeviceEntities = JSON.parseObject(responseMessage.getData().toString(),DemoDeviceEntity.class);
return demoDeviceEntities;
}
}
log.error("获取设备接口失败:{}", responseMessage.getMsg());
} catch (IOException e) {
log.error("调用:{}接口异常:{}", url, e.getMessage());
}
return new DemoDeviceEntity();
}
}
package com.makeit.module.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class DemoDeviceEntity {
@Schema(description = "设备编码")
private String entityCode;
private String entityName;
private String status;
private List<DeviceShadowDTO> deviceShadowDTOList;
@Data
public static class DeviceShadowDTO{
private String id;
private Attribute attribute;
private String value;
private Long valueTime;
}
@Data
public static class Attribute{
private String attributeCode;
private String attributeName;
}
}
package com.makeit.module.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class DemoResponseMessage<T> {
@Schema(
description = "消息提示"
)
private String msg;
@Schema(
description = "数据内容"
)
private T data;
@Schema(
description = "状态码"
)
private int retcode;
}
package com.makeit.module.demo.vo;
import lombok.Data;
@Data
public class DemoResult<E> {
private E data;
}
package com.makeit.module.iot.util; package com.makeit.module.iot.util;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -27,6 +30,15 @@ public class HeaderUtils { ...@@ -27,6 +30,15 @@ public class HeaderUtils {
@Value("${iot.secureKey}") @Value("${iot.secureKey}")
private String secureKey; private String secureKey;
@Value("${demo.brand}")
private String brand;
@Value("${demo.accessKey}")
private String accessKey;
@Value("${demo.secretKey}")
private String secretKey;
protected static HttpClient httpClient = HttpClientBuilder.create().build();
public Map<String, String> createHeadersOfParams(Map<String, Object> params) { public Map<String, String> createHeadersOfParams(Map<String, Object> params) {
//时间戳 //时间戳
String xTimestamp = String.valueOf(new Date().getTime()); String xTimestamp = String.valueOf(new Date().getTime());
...@@ -71,4 +83,30 @@ public class HeaderUtils { ...@@ -71,4 +83,30 @@ public class HeaderUtils {
return headers; return headers;
} }
public Map<String, String> createDemoHeadersOfParams(Map<String, Object> params) {
//时间戳
String xTimestamp = String.valueOf(new Date().getTime());
params.put("AccessKey",accessKey);
params.put("Timestamp",xTimestamp);
//将参数按ASCII排序后拼接为k1=v1&k2=v2的格式
String paramString = new TreeMap<>(params).entrySet()
.stream()
.map(e -> e.getKey().concat("=").concat(String.valueOf(e.getValue())))
.collect(Collectors.joining("&"));
System.out.println(paramString);
paramString = paramString + "&SecretKey=" + secretKey;
MessageDigest digest = DigestUtils.getMd5Digest();
digest.update(paramString.getBytes());
Map<String, String> headers = new HashMap<>();
headers.put("signature", Hex.encodeHexString(digest.digest()).toUpperCase());
headers.put("brand", brand);
headers.put("timestamp", xTimestamp);
return headers;
}
} }
package com.makeit.module.controller.demo;
import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.alarm.PlatAlarmRecordQueryDTO;
import com.makeit.entity.platform.demo.PlatDeviceDemo;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.module.demo.dto.DemoDeviceDTO;
import com.makeit.module.demo.vo.DemoDeviceEntity;
import com.makeit.service.platform.demo.DemoDeviceService;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.demo.PlatAlarmRecordDemoService;
import com.makeit.vo.platform.alarm.PlatAlarmRecordVO;
import com.makeit.vo.platform.demo.DemoHeartRespiratoryVO;
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;
/**
* <p>
* 设备 前端控制器
* </p>
*
* @author eugene young
* @since 2023-09-05
*/
@Api(tags = "demo设备")
@RestController
@RequestMapping("/plat/demo/device")
public class DemoDeviceController {
@Autowired
private DemoDeviceService demoDeviceService;
@Autowired
private PlatAlarmRecordDemoService platAlarmRecordService;
@ApiOperation("详情")
@PostMapping("queryDeviceDetail")
public ApiResponseEntity<DemoDeviceEntity> queryDeviceDetail(@RequestBody DemoDeviceDTO dto) {
return ApiResponseUtils.success(demoDeviceService.queryDeviceDetail(dto));
}
@ApiOperation("设备列表")
@PostMapping("list")
public ApiResponseEntity<List<PlatDeviceDemo>> list() {
return ApiResponseUtils.success(demoDeviceService.getList());
}
@ApiOperation("报警列表")
@PostMapping("alarmPage")
public ApiResponseEntity<PageVO<PlatAlarmRecordVO>> page(@RequestBody PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
return ApiResponseUtils.success(platAlarmRecordService.page(dto));
}
@ApiOperation("心率")
@PostMapping("heartRate")
public ApiResponseEntity<DemoHeartRespiratoryVO> heartRate(@RequestBody DemoDeviceDTO dto) {
return ApiResponseUtils.success(demoDeviceService.heartRate(dto));
}
@ApiOperation("呼吸率")
@PostMapping("breathRate")
public ApiResponseEntity<DemoHeartRespiratoryVO> breathRate(@RequestBody DemoDeviceDTO dto) {
return ApiResponseUtils.success(demoDeviceService.breathRate(dto));
}
@ApiOperation("处理")
@PostMapping("deal")
public ApiResponseEntity<Void> deal(@RequestBody BaseIdDTO dto) {
platAlarmRecordService.deal(dto.getId());
return ApiResponseUtils.success();
}
@ApiOperation("通知家属")
@PostMapping("notice")
public ApiResponseEntity<Void> notice(@RequestBody BaseIdDTO dto) {
demoDeviceService.noticeRelation(dto.getId());
return ApiResponseUtils.success();
}
}
package com.makeit.entity.platform.demo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.makeit.common.entity.BaseBusEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 告警记录
* @TableName plat_alarm_record
*/
@TableName(value ="plat_alarm_record_demo")
@Data
public class PlatAlarmRecordDemo extends BaseBusEntity {
/**
* 关联告警配置
*/
private String alarmId;
@ApiModelProperty(value = "告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常")
private String alarmType;
/**
* 告警时间
*/
private LocalDateTime alarmDate;
/**
* 状态 0 待处理 1 已处理
*/
private String status;
/**
* 通知家属状态 0 未通知 1 已通知
*/
private String noticeStatus;
/**
* 告警内容
*/
private String content;
/**
* 处理人 存名字
*/
private String dealUser;
/**
* 处理时间
*/
private LocalDateTime dealDate;
/**
* 组织id
*/
private String orgId;
/**
* 通知人员,逗号拼接
*/
private String notifyUser;
/**
* 设备id
*/
private String deviceId;
/**
* 老人id,一个老人一条记录
*/
private String elderIds;
//异常说明
private String remark;
private String elderName;
//异常值
private String abnormalValue;
@ApiModelProperty("区域名称")
private String regionName;
private Long valueTime;
}
package com.makeit.entity.platform.demo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.module.iot.enums.DeviceState;
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-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "PlatDevice对象", description = "设备")
public class PlatDeviceDemo extends BaseBusEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "原始设备ID")
private String oriDeviceId;
@ApiModelProperty(value = "设备名称")
private String name;
@ApiModelProperty(value = "产品名称")
private String productName;
@ApiModelProperty(value = "产品id")
private String productId;
@ApiModelProperty(value = "固件版本")
private String firmwareVersion;
@ApiModelProperty(value = "注册时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime registrationDate;
@ApiModelProperty(value = "最后上线时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastOnlineData;
@ApiModelProperty(value = "说明")
private String description;
/**
* @see DeviceState
*/
@ApiModelProperty(value = "状态 notActive(\"notActive\",\"禁用\"),\n" +
" offline(\"offline\",\"离线\"),\n" +
" online(\"online\",\"在线\"); ")
private String status;
@ApiModelProperty(value = "组织id")
private String orgId;
@ApiModelProperty(value = "城市组织id")
private String cityOrgId;
@ApiModelProperty(value = "区组织id")
private String districtOrgId;
@ApiModelProperty(value = "街道组织id")
private String streetOrgId;
@ApiModelProperty(value = "组织路径")
private String orgPath;
@ApiModelProperty(value = "设备类型 0-呼吸心率雷达 1-空间人体雷达 2-跌倒检测雷达")
private String category;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endDate;
}
package com.makeit.mapper.platform.demo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.demo.PlatAlarmRecordDemo;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Mapper
* @createDate 2023-09-06 14:26:05
* @Entity com.makeit.entity.platform.alarm.PlatAlarmRecord
*/
public interface PlatAlarmRecordDemoMapper extends BaseMapper<PlatAlarmRecordDemo> {
}
package com.makeit.mapper.platform.demo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.makeit.dto.platform.dataScreen.PlatDataScreenQueryDTO;
import com.makeit.dto.platform.device.PlatDeviceQueryDTO;
import com.makeit.entity.platform.demo.PlatDeviceDemo;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.vo.platform.device.PlatDeviceListVO;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 设备 Mapper 接口
* </p>
*
* @author eugene young
* @since 2023-09-05
*/
public interface PlatDeviceDemoMapper extends BaseMapper<PlatDeviceDemo> {
}
package com.makeit.service.platform.demo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.demo.PlatDeviceDemo;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.module.demo.dto.DemoDeviceDTO;
import com.makeit.module.demo.vo.DemoDeviceEntity;
import com.makeit.vo.platform.demo.DemoHeartRespiratoryVO;
import java.util.List;
/**
* <p>
* 设备 服务类
* </p>
*
* @author eugene young
* @since 2023-09-05
*/
public interface DemoDeviceService extends IService<PlatDeviceDemo> {
DemoDeviceEntity queryDeviceDetail(DemoDeviceDTO dto);
List<PlatDeviceDemo> getList();
DemoHeartRespiratoryVO heartRate(DemoDeviceDTO dto);
DemoHeartRespiratoryVO breathRate(DemoDeviceDTO dto);
void noticeRelation(String id);
}
package com.makeit.service.platform.demo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.dto.platform.alarm.PlatAlarmRecordQueryDTO;
import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.demo.PlatAlarmRecordDemo;
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;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Service
* @createDate 2023-09-06 14:26:05
*/
public interface PlatAlarmRecordDemoService extends IService<PlatAlarmRecordDemo> {
PageVO<PlatAlarmRecordVO> page(PageReqDTO<PlatAlarmRecordQueryDTO> dto);
PlatAlarmRecordVO view(String recordId);
void deal(String recordId);
}
\ No newline at end of file
package com.makeit.service.platform.demo.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.demo.PlatAlarmRecordDemo;
import com.makeit.entity.platform.demo.PlatDeviceDemo;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.enums.CommonEnum;
import com.makeit.mapper.platform.demo.PlatDeviceDemoMapper;
import com.makeit.mapper.platform.device.PlatDeviceMapper;
import com.makeit.module.demo.dto.DemoDeviceDTO;
import com.makeit.module.demo.service.DemoProductDeviceService;
import com.makeit.module.demo.vo.DemoDeviceEntity;
import com.makeit.service.platform.demo.DemoDeviceService;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.demo.PlatAlarmRecordDemoService;
import com.makeit.vo.platform.demo.DemoHeartRespiratoryVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
/**
* <p>
* 设备 服务实现类
* </p>
*
* @author eugene young
* @since 2023-09-05
*/
@Service
public class DemoDeviceServiceImpl extends ServiceImpl<PlatDeviceDemoMapper, PlatDeviceDemo> implements DemoDeviceService {
@Autowired
private DemoProductDeviceService demoProductDeviceService;
@Autowired
private PlatAlarmRecordDemoService platAlarmRecordService;
@Override
public DemoDeviceEntity queryDeviceDetail(DemoDeviceDTO dto) {
DemoDeviceEntity demoDeviceEntity = demoProductDeviceService.queryDeviceDetail(dto.getEntityCode(),true);
return demoDeviceEntity;
}
@Override
public List<PlatDeviceDemo> getList() {
List<PlatDeviceDemo> platDevices = list();
for(PlatDeviceDemo device : platDevices){
DemoDeviceEntity demoDeviceEntity = demoProductDeviceService.queryDeviceDetail(device.getOriDeviceId(),true);
device.setStatus(demoDeviceEntity.getStatus());
}
return platDevices;
}
@Override
public DemoHeartRespiratoryVO heartRate(DemoDeviceDTO dto) {
List<Integer> values = Arrays.asList(1,3,-1,2,0,-2,-3);
Random rand = new Random();
int n =rand.nextInt(values.size());
Integer value = values.get(n);
DemoHeartRespiratoryVO vo = new DemoHeartRespiratoryVO();
DemoDeviceEntity demoDeviceEntity = demoProductDeviceService.queryDeviceDetail(dto.getEntityCode(),true);
if("3".equals(demoDeviceEntity.getStatus())){
for(DemoDeviceEntity.DeviceShadowDTO deviceShadowDTO : demoDeviceEntity.getDeviceShadowDTOList()){
if(deviceShadowDTO.getAttribute()!=null && "heartRate".equals(deviceShadowDTO.getAttribute().getAttributeCode())){
vo.setHeartRate(deviceShadowDTO.getValue());
if(deviceShadowDTO.getValue()!=null && Integer.valueOf(deviceShadowDTO.getValue())>3){
vo.setHeartRate(String.valueOf(Integer.valueOf(vo.getHeartRate())+value));
}
vo.setTime(LocalDateTime.now());
}
}
}else {
vo.setTime(LocalDateTime.now());
}
return vo;
}
@Override
public DemoHeartRespiratoryVO breathRate(DemoDeviceDTO dto) {
DemoHeartRespiratoryVO vo = new DemoHeartRespiratoryVO();
DemoDeviceEntity demoDeviceEntity = demoProductDeviceService.queryDeviceDetail(dto.getEntityCode(),true);
if("3".equals(demoDeviceEntity.getStatus())){
for(DemoDeviceEntity.DeviceShadowDTO deviceShadowDTO : demoDeviceEntity.getDeviceShadowDTOList()){
if(deviceShadowDTO.getAttribute()!=null && "breathRate".equals(deviceShadowDTO.getAttribute().getAttributeCode())){
vo.setRespiratoryRate(deviceShadowDTO.getValue());
Instant instant = Instant.ofEpochMilli(deviceShadowDTO.getValueTime());
ZoneId zone = ZoneId.systemDefault();
vo.setTime(LocalDateTime.ofInstant(instant, zone));
}
}
}else {
vo.setTime(LocalDateTime.now());
}
return vo;
}
@Override
public void noticeRelation(String id) {
PlatAlarmRecordDemo platAlarmRecord = platAlarmRecordService.getById(id);
platAlarmRecord.setNoticeStatus(CommonEnum.YES.getValue());
platAlarmRecordService.updateById(platAlarmRecord);
}
}
package com.makeit.service.platform.demo.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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.common.entity.BaseEntity;
import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.dto.platform.alarm.PlatAlarmRecordQueryDTO;
import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.auth.PlatOrg;
import com.makeit.entity.platform.auth.PlatUser;
import com.makeit.entity.platform.demo.PlatAlarmRecordDemo;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import com.makeit.entity.platform.space.PlatRegionSetting;
import com.makeit.entity.platform.space.PlatRoom;
import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.enums.CommonEnum;
import com.makeit.enums.report.PlatformTypeEnum;
import com.makeit.exception.BusinessException;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.demo.PlatAlarmRecordDemoMapper;
import com.makeit.module.iot.service.IotDevicePropertiesOperateService;
import com.makeit.service.platform.demo.PlatAlarmRecordDemoService;
import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.auth.PlatOrgService;
import com.makeit.service.platform.auth.PlatUserService;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderChildrenInfoService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.service.platform.space.PlatRegionSettingService;
import com.makeit.service.platform.space.PlatRoomBedDeviceService;
import com.makeit.service.platform.space.PlatRoomService;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.shengwang.agora.dto.PlatCallingDeviceDTO;
import com.makeit.shengwang.agora.service.ShengwangService;
import com.makeit.shengwang.agora.vo.PlatAlarmCallDeviceVO;
import com.makeit.utils.data.convert.BeanDtoVoUtils;
import com.makeit.utils.data.convert.PageUtil;
import com.makeit.utils.data.convert.StreamUtil;
import com.makeit.utils.msg.MsgSendUtil;
import com.makeit.utils.msg.SendTypeEnum;
import com.makeit.utils.msg.dto.MsgSendDTO;
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;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Service实现
* @createDate 2023-09-06 14:26:05
*/
@Service
@Slf4j
public class PlatAlarmRecordDemoServiceImpl extends ServiceImpl<PlatAlarmRecordDemoMapper, PlatAlarmRecordDemo>
implements PlatAlarmRecordDemoService {
@Autowired
private PlatAlarmConfigService platAlarmConfigService;
@Autowired
private PlatElderChildrenInfoService platElderChildrenInfoService;
@Autowired
private PlatUserService platUserService;
@Autowired
private MsgSendUtil msgUtil;
@Autowired
private PlatRoomBedDeviceService platRoomBedDeviceService;
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatRoomService platRoomService;
@Autowired
private PlatRegionSettingService platRegionSettingService;
@Autowired
private PlatTenantService platTenantService;
@Autowired
private PlatOrgService platOrgService;
@Autowired
private PlatDeviceService platDeviceService;
@Override
public PageVO<PlatAlarmRecordVO> page(PageReqDTO<PlatAlarmRecordQueryDTO> dto) {
PlatAlarmRecordQueryDTO param = dto.getData();
Page<PlatAlarmRecordDemo> mpPage = PageUtil.toMpPage(dto);
LambdaQueryWrapper<PlatAlarmRecordDemo> lambdaQueryWrapper = getLambdaQueryWrapper(param);
// List<PlatAlarmRecordDemo> list = list(lambdaQueryWrapper);
Page<PlatAlarmRecordDemo> page = page(mpPage, lambdaQueryWrapper);
List<PlatAlarmRecordDemo> records = page.getRecords();
List<PlatAlarmRecordVO> dtos = BeanDtoVoUtils.listVo(records, PlatAlarmRecordVO.class);
JoinUtil.join(dtos, platAlarmConfigService, PlatAlarmRecordVO::getAlarmId, BaseEntity::getId, (t, m) -> t.setNotifyRelation(m.getNotifyRelation()));
List<PlatDevice> platDeviceList = platDeviceService.list();
Map<String, PlatDevice> deviceMap = StreamUtil.toMap(platDeviceList, BaseEntity::getId);
for (PlatAlarmRecordVO platAlarmRecordVO : dtos) {
PlatDevice platDevice = deviceMap.get(platAlarmRecordVO.getDeviceId());
if (platDevice != null) {
platAlarmRecordVO.setDevice(platDevice);
}
}
return PageUtil.toPageVO(dtos, page);
}
private LambdaQueryWrapper<PlatAlarmRecordDemo> getLambdaQueryWrapper(PlatAlarmRecordQueryDTO param) {
List<String> typeOrgIdList = Lists.newArrayList();
List<String> choiceOrgIdList = Lists.newArrayList();
if (StringUtils.isNotEmpty(param.getType())) {
List<PlatOrg> platOrgList = platOrgService.list(new QueryWrapper<PlatOrg>().lambda().eq(PlatOrg::getType, param.getType()));
typeOrgIdList = StreamUtil.map(platOrgList, BaseEntity::getId);
}
if (StringUtils.isNotEmpty(param.getOrgId())) {
choiceOrgIdList.addAll(Lists.newArrayList(param.getOrgId().split(",")));
}
List<String> orgIdList = Lists.newArrayList();
if (com.makeit.utils.old.StringUtils.isNotEmpty(param.getType()) && com.makeit.utils.old.StringUtils.isEmpty(param.getOrgId())) {
orgIdList = typeOrgIdList;
if (CollectionUtils.isEmpty(orgIdList)) {
orgIdList.add("-1");
}
}
if (com.makeit.utils.old.StringUtils.isNotEmpty(param.getOrgId()) && com.makeit.utils.old.StringUtils.isEmpty(param.getType())) {
orgIdList = choiceOrgIdList;
if (CollectionUtils.isEmpty(orgIdList)) {
orgIdList.add("-1");
}
}
if (com.makeit.utils.old.StringUtils.isNotEmpty(param.getOrgId()) && com.makeit.utils.old.StringUtils.isNotEmpty(param.getType())) {
if (CollectionUtils.isNotEmpty(choiceOrgIdList) && CollectionUtils.isNotEmpty(typeOrgIdList)) {
orgIdList = new ArrayList<>(CollectionUtils.intersection(typeOrgIdList, choiceOrgIdList));
if (CollectionUtils.isEmpty(orgIdList)) {
orgIdList.add("-1");
}
}
}
return new LambdaQueryWrapper<PlatAlarmRecordDemo>().ge(Objects.nonNull(param.getCreateDateFrom()), BaseEntity::getCreateDate, param.getCreateDateFrom())
.eq(StringUtils.isNotBlank(param.getId()),BaseEntity::getId,param.getId())
.le(Objects.nonNull(param.getCreateDateTo()), BaseEntity::getCreateDate, param.getCreateDateTo())
.eq(StringUtils.isNotBlank(param.getAlarmType()), PlatAlarmRecordDemo::getAlarmType, param.getAlarmType())
.eq(StringUtils.isNotBlank(param.getStatus()), PlatAlarmRecordDemo::getStatus, param.getStatus())
.like(StringUtils.isNotBlank(param.getDealUser()), PlatAlarmRecordDemo::getDealUser, param.getDealUser())
.ge(Objects.nonNull(param.getDealDateFrom()), PlatAlarmRecordDemo::getDealDate, param.getDealDateFrom())
.le(Objects.nonNull(param.getDealDateTo()), PlatAlarmRecordDemo::getDealDate, param.getDealDateTo())
.in(CollectionUtils.isNotEmpty(orgIdList), PlatAlarmRecordDemo::getOrgId, orgIdList)
.apply(StringUtils.isNotBlank(param.getNotifyUser()), "find_in_set('" + param.getNotifyUser() + "',notify_user)")
.in(CollectionUtils.isNotEmpty(param.getElderIdList()),PlatAlarmRecordDemo::getElderIds,param.getElderIdList())
.eq(StringUtils.isNotBlank(param.getNoticeStatus()),PlatAlarmRecordDemo::getNoticeStatus,param.getNoticeStatus())
.orderByDesc(BaseEntity::getCreateDate)
;
}
@Override
public PlatAlarmRecordVO view(String recordId) {
PlatAlarmRecordDemo platAlarmRecord = getById(recordId);
if(platAlarmRecord == null ){
return null;
}
PlatAlarmRecordVO vo = BeanDtoVoUtils.convert(platAlarmRecord, PlatAlarmRecordVO.class);
if(StringUtils.isNotBlank(vo.getAlarmId())) {
JoinUtil.join(Arrays.asList(vo), platAlarmConfigService, PlatAlarmRecordVO::getAlarmId, BaseEntity::getId, (t, m) -> t.setNotifyRelation(m.getNotifyRelation()));
}
return vo;
}
@Override
@Transactional
public void deal(String recordId) {
CommonUserVO user = CommonUserUtil.getUser();
PlatAlarmRecordDemo platAlarmRecord = getById(recordId);
platAlarmRecord.setStatus(CommonEnum.YES.getValue());
platAlarmRecord.setDealDate(LocalDateTime.now());
platAlarmRecord.setDealUser(user.getName());
updateById(platAlarmRecord);
}
/**
* 根据配置渠道发送消息
*
* @param alarmConfig
* @param alarmRecord
* @param phoneSet 工作人员手机号
* @param notifyChannelList 通知渠道
*/
private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet,
List<SendTypeEnum> notifyChannelList, List<MsgSendDTO.ReceiverInfo> receiverInfos) {
log.info("开始短信通知:{}", JSON.toJSONString(alarmConfig));
String notifyChannel = alarmConfig.getNotifyChannel();
if(StringUtils.isEmpty(notifyChannel)){
return;
}
PlatTenant platTenant = platTenantService.getById(alarmConfig.getTenantId());
if(platTenant == null){
return;
}
String alertChannel = platTenant.getAlertChannel();
if(StringUtils.isBlank(alertChannel)){
return;
}
String[] tenantChannels = alertChannel.split(",");
List<String> tenantChannelList = Arrays.asList(tenantChannels);
String[] split = notifyChannel.split(",");
for (String sendType : split) {
//租户告警渠道 没配置的 就不发送
if(!tenantChannelList.contains(sendType)){
continue;
}
SendTypeEnum sendTypeEnum = SendTypeEnum.getByValue(sendType);
boolean contains = notifyChannelList.contains(sendTypeEnum);
if (contains) {
MsgSendDTO msgSendDTO = new MsgSendDTO();
msgSendDTO.setSendTypeEnum(sendTypeEnum);
msgSendDTO.setReceiverList(phoneSet);
msgSendDTO.setEmailSet(emailSet);
msgSendDTO.setOriContent(alarmRecord.getContent());
msgSendDTO.setSubject(alarmRecord.getContent());
msgSendDTO.setParam(alarmRecord.getElderName());
msgSendDTO.setReceiverInfos(receiverInfos);
String alarmType = alarmConfig.getAlarmType();
//告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常 5 离床异常
if (StringUtils.equals(alarmType, "1")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName());
}
if (StringUtils.equals(alarmType, "2")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark());
}
if (StringUtils.equals(alarmType, "3")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark());
}
if (StringUtils.equals(alarmType, "4")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName());
}
if (StringUtils.equals(alarmType, "5")) {
msgSendDTO.setParam(alarmRecord.getElderName(), "");
}
msgSendDTO.setAlarmType(alarmConfig.getAlarmType());
//todo 小程序消息
msgUtil.send(msgSendDTO);
}
}
}
public static String replaceParam(String oriContent,List<String> param) {
Pattern p = Pattern.compile("\\[#\\d+\\]|\\[#[\\p{IsHan}]+\\]|\\[#[^\\]]*\\]");
Matcher m = p.matcher(oriContent);
StringBuffer sb = new StringBuffer();
if (!m.find()) {
return oriContent;
}
m.reset();
int i = 0;
while (m.find()) {
String paramValue = "";
if(param.size()>i) {
paramValue = param.get(i);
}
m.appendReplacement(sb, paramValue);
i++;
}
m.appendTail(sb);
return sb.toString();
}
}
package com.makeit.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.makeit.entity.platform.demo.PlatAlarmRecordDemo;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.platform.alarm.PlatAlarmRecordEnum;
import com.makeit.module.demo.service.DemoProductDeviceService;
import com.makeit.module.demo.vo.DemoDeviceEntity;
import com.makeit.service.platform.demo.PlatAlarmRecordDemoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@Component
@Slf4j
public class DemoDeviceTask {
@Autowired
private PlatAlarmRecordDemoService platAlarmRecordDemoService;
@Autowired
private DemoProductDeviceService demoProductDeviceService;
@Scheduled(cron = "*/1 * * * * ?")
public void syncDemoAlarm() {
log.info("syncDemoAlarm开始执行");
List<String> names = Arrays.asList("钟奕轩","林彦辰","周子恒","唐景晨");
Random rand = new Random();
int n =rand.nextInt(names.size());
String name = names.get(n);
log.info("name:"+name);
List<PlatAlarmRecordDemo> records = platAlarmRecordDemoService.list(
new QueryWrapper<PlatAlarmRecordDemo>().lambda().orderByDesc(PlatAlarmRecordDemo::getAlarmDate)
);
DemoDeviceEntity demoDeviceEntity = demoProductDeviceService.queryDeviceDetail("219A02233700000",true);
if(demoDeviceEntity!=null && !demoDeviceEntity.getDeviceShadowDTOList().isEmpty()){
if(records.isEmpty()){
for(DemoDeviceEntity.DeviceShadowDTO dto : demoDeviceEntity.getDeviceShadowDTOList()){
if(dto.getAttribute()!=null && "personState".equals(dto.getAttribute().getAttributeCode())){
if("1".equals(dto.getValue())){
PlatAlarmRecordDemo alarmRecord = new PlatAlarmRecordDemo();
alarmRecord.setElderName(name);
alarmRecord.setAlarmType(PlatAlarmConfigEnum.AlarmTypeEnum.FALL.getValue());
alarmRecord.setContent(name+"在房间内跌倒,请及时处理");
alarmRecord.setStatus(PlatAlarmRecordEnum.AlarmRecordStatusEnum.UNHANDLED.getValue());
Instant instant = Instant.ofEpochMilli(dto.getValueTime());
ZoneId zone = ZoneId.systemDefault();
alarmRecord.setAlarmDate(LocalDateTime.ofInstant(instant, zone));
alarmRecord.setAlarmId(dto.getId());
alarmRecord.setValueTime(dto.getValueTime());
alarmRecord.setTenantId("1705124341248724993");
platAlarmRecordDemoService.save(alarmRecord);
break;
}
}
}
}else {
PlatAlarmRecordDemo record = records.get(0);
for(DemoDeviceEntity.DeviceShadowDTO dto : demoDeviceEntity.getDeviceShadowDTOList()){
if(dto.getAttribute()!=null && "personState".equals(dto.getAttribute().getAttributeCode())){
if("1".equals(dto.getValue()) && !record.getValueTime().equals(dto.getValueTime())){
PlatAlarmRecordDemo alarmRecord = new PlatAlarmRecordDemo();
alarmRecord.setElderName(name);
alarmRecord.setAlarmType(PlatAlarmConfigEnum.AlarmTypeEnum.FALL.getValue());
alarmRecord.setContent(name+"在房间内跌倒,请及时处理");
alarmRecord.setStatus(PlatAlarmRecordEnum.AlarmRecordStatusEnum.UNHANDLED.getValue());
Instant instant = Instant.ofEpochMilli(dto.getValueTime());
ZoneId zone = ZoneId.systemDefault();
alarmRecord.setAlarmDate(LocalDateTime.ofInstant(instant, zone));
alarmRecord.setAlarmId(dto.getId());
alarmRecord.setValueTime(dto.getValueTime());
alarmRecord.setTenantId("1705124341248724993");
platAlarmRecordDemoService.save(alarmRecord);
break;
}
}
}
}
}
log.info("syncDemoAlarm结束执行");
}
}
package com.makeit.vo.platform.demo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class DemoHeartRespiratoryVO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("时间")
private LocalDateTime time;
@ApiModelProperty("心率")
private String heartRate;
@ApiModelProperty("呼吸率")
private String respiratoryRate;
}
...@@ -180,6 +180,12 @@ elasticsearch: ...@@ -180,6 +180,12 @@ elasticsearch:
password: password:
scheme: http scheme: http
demo:
url: https://test-api.yunmaolink.com/
brand: kuangshi
accessKey: 389a05bf1bd24cdfa3a8be97708ba586
secretKey: 5d37ecc971ee400db4e30391902d3564
......
...@@ -178,3 +178,9 @@ elasticsearch: ...@@ -178,3 +178,9 @@ elasticsearch:
password: password:
scheme: http scheme: http
demo:
url: https://test-api.yunmaolink.com/
brand: kuangshi
accessKey: 389a05bf1bd24cdfa3a8be97708ba586
secretKey: 5d37ecc971ee400db4e30391902d3564
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