Commit 5167988d authored by 赵啸非's avatar 赵啸非

添加设备导入导出功能

parent e7b92ac0
package com.mortals.xhx.base.login.interceptor;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.xhx.base.framework.config.InterceptorConfig;
import com.mortals.framework.ap.CookieService;
import com.mortals.framework.ap.SysConstains;
......@@ -13,9 +14,12 @@ import com.mortals.framework.web.interceptor.BaseInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
@Order(1)
@Component
public class AuthJsonInterceptor extends BaseInterceptor {
......@@ -35,6 +39,13 @@ public class AuthJsonInterceptor extends BaseInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
try {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
UnAuth annotation = method.getAnnotation(UnAuth.class);
if (annotation != null) {
//取消校验
return true;
}
String uri = request.getServletPath();
if (config.needCheckAuth(uri)) {
boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
......
package com.mortals.xhx.busiz.req;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
@Data
public class DeviceMsgReq implements Serializable {
/**
* 设备编码
*/
private String deviceCode;
/**
* 消息类型
*/
private String messageType;
/**
* 时间戳(毫秒)
*/
private Long timestamp;
/**
* 消息内容
*/
private String data;
public static void main(String[] args) {
ArrayList<DeviceMsgReq> deq = new ArrayList<>();
DeviceMsgReq deviceMsgReq = new DeviceMsgReq();
deviceMsgReq.setDeviceCode("a1");
deviceMsgReq.setMessageType("heart_beat");
deviceMsgReq.setData("{xxxx}");
deviceMsgReq.setTimestamp(new Date().getTime());
deq.add(deviceMsgReq);
deviceMsgReq = new DeviceMsgReq();
deviceMsgReq.setDeviceCode("a2");
deviceMsgReq.setMessageType("heart_beat");
deviceMsgReq.setData("{bbbbbb}");
deviceMsgReq.setTimestamp(new Date().getTime());
deq.add(deviceMsgReq);
System.out.println(JSON.toJSONString(deq));
}
}
......@@ -3,6 +3,7 @@ package com.mortals.xhx.busiz.web;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.IAuthTokenService;
import com.mortals.framework.util.AESUtil;
......@@ -11,6 +12,7 @@ import com.mortals.xhx.base.framework.annotation.ApiUserAuth;
import com.mortals.xhx.base.login.web.LoginForm;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.busiz.req.DeviceMsgReq;
import com.mortals.xhx.busiz.req.DeviceReq;
import com.mortals.xhx.busiz.req.UploadDeviceReq;
import com.mortals.xhx.busiz.rsp.*;
......@@ -19,6 +21,8 @@ import com.mortals.xhx.common.key.Constant;
import com.mortals.xhx.common.model.DefaultTbQueueMsgHeaders;
import com.mortals.xhx.common.model.MessageHeader;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.common.utils.DownMsgTask;
import com.mortals.xhx.common.utils.SendTaskThreadPool;
import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.platform.model.PlatformEntity;
......@@ -37,6 +41,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
......@@ -75,7 +80,8 @@ public class DeviceApiController {
private String messageTtl;
@Value("${token.secret}")
private String secret;
@Autowired
private SendTaskThreadPool sendTaskThreadPool;
/**
* 设备注册
......@@ -198,6 +204,34 @@ public class DeviceApiController {
}
/**
* 设备数据上报
*
* @param list
* @return
*/
@PostMapping("callback")
@UnAuth
public String callback(@RequestBody List<DeviceMsgReq> list) {
log.debug("【设备数据消息接收】【请求体】--> " + JSONObject.toJSONString(list));
ApiResp<String> rsp = new ApiResp<>();
rsp.setMsg(ApiRespCodeEnum.SUCCESS.getLabel());
rsp.setCode(ApiRespCodeEnum.SUCCESS.getValue());
try {
DownMsgTask downMsgTask = new DownMsgTask(list, platformService, productService, deviceService);
sendTaskThreadPool.execute(downMsgTask);
} catch (Exception e) {
log.error("接收数据失败", e);
rsp.setCode(ApiRespCodeEnum.FAILED.getValue());
rsp.setMsg(e.getMessage());
return JSON.toJSONString(rsp);
}
log.debug("响应【设备数据消息接收】【响应体】--> " + JSONObject.toJSONString(rsp));
return JSON.toJSONString(rsp);
}
/**
* 设备数据上报
*
......
package com.mortals.xhx.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.base.framework.ws.message.SendToAllRequest;
import com.mortals.xhx.base.framework.ws.util.WebSocketUtil;
import com.mortals.xhx.busiz.req.DeviceMsgReq;
import com.mortals.xhx.busiz.req.DeviceReq;
import com.mortals.xhx.common.code.DeviceOnlineStatusEnum;
import com.mortals.xhx.common.key.Constant;
import com.mortals.xhx.common.model.DefaultTbQueueMsgHeaders;
import com.mortals.xhx.common.model.MessageHeader;
import com.mortals.xhx.module.device.model.DeviceEntity;
import com.mortals.xhx.module.device.model.DeviceLogEntity;
import com.mortals.xhx.module.device.service.DeviceLogService;
import com.mortals.xhx.module.device.service.DeviceService;
import com.mortals.xhx.module.platform.model.PlatformEntity;
import com.mortals.xhx.module.platform.service.PlatformService;
import com.mortals.xhx.module.product.model.ProductEntity;
import com.mortals.xhx.module.product.service.ProductService;
import com.mortals.xhx.queue.TbQueueMsgHeaders;
import com.mortals.xhx.queue.TopicPartitionInfo;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
/**
* 接收消息
*
* @author: zxfei
* @date: 2022/4/28 10:56
* @description:
**/
@Slf4j
@AllArgsConstructor
public class DownMsgTask implements Runnable {
private List<DeviceMsgReq> list;
private PlatformService platformService;
private ProductService productService;
private DeviceService deviceService;
@Override
public void run() {
try {
list.stream().sorted(Comparator.comparing(DeviceMsgReq::getTimestamp)).forEach(item -> {
//根据设备编码查询设备
DeviceEntity deviceEntity = deviceService.getExtCache(item.getDeviceCode());
if (!ObjectUtils.isEmpty(deviceEntity)) {
//将上报信息转发到mq中
PlatformEntity platformEntity = platformService.get(deviceEntity.getPlatformId());
if (ObjectUtils.isEmpty(platformEntity)) {
log.error("当前设备未配置所属系统平台,请在后台配置后再激活!");
return;
}
ProductEntity productEntity = productService.get(deviceEntity.getProductId());
if (ObjectUtils.isEmpty(productEntity)) {
log.error("当前设备未配置所属产品,请在后台配置后再激活!");
return;
}
String exchangeName = platformEntity.getPlatformSn() + Constant.EXCHANGE_SPLIT + productEntity.getProductCode();
TopicPartitionInfo info = TopicPartitionInfo.builder().exchangeName(exchangeName).topic(Constant.UPLOAD_TOPIC + deviceEntity.getDeviceMac()).build();
TbQueueMsgHeaders header = new DefaultTbQueueMsgHeaders();
header.put(MessageHeader.MESSAGETYPE, Constant.MESSAGETYPE_HEARTBEAT);
deviceService.sendDeviceMessage(deviceEntity, info, header, JSON.toJSONString(item.getData()), null);
}
});
} catch (Exception e) {
log.error("异常:", e);
}
}
}
......@@ -29,8 +29,8 @@ public class DeviceVo extends BaseEntityLong {
/**
* 产品编码
*/
@Excel(name = "产品编码",combo = {"排队机", "窗口屏", "呼叫器", "集中显示屏", "导视机", "评器", "自助服务终端", "填单机", "样表机"}
, readConverterExp = "pdj=排队机,ckp=窗口屏,hjq=呼叫器,jzxsp=集中显示屏,dsj=导视机,pjq=评器,zzfwzd=自助服务终端,tdj=填单机,ybj=样表机")
@Excel(name = "产品编码",combo = {"排队机", "窗口屏", "呼叫器", "集中显示屏", "导视机", "评器", "自助服务终端", "填单机", "样表机"}
, readConverterExp = "pdj=排队机,ckp=窗口屏,hjq=呼叫器,jzxsp=集中显示屏,dsj=导视机,pjq=评器,zzfwzd=自助服务终端,tdj=填单机,ybj=样表机")
private String productCode;
......
......@@ -205,6 +205,56 @@ data|object|数据对象|-
```
### 接收第三方平台命令消息
**请求URL:** m/api/callback
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 以数组方式进行提交
**请求参数:**
参数名称|类型|备注|必填|其它
:------|:---|:---|:---|:---
deviceCode|String|设备编码,如MAC地址|是|-
messageType|String|消息类型|是|如heart_beat
timestamp|Long|产品编码|是|见产品编码附录
data|String|数据体,内容自行定义|否|-
**请求样例:**
```
[
{
"data":"{xxxx}",
"deviceCode":"a1",
"messageType":"heart_beat",
"timestamp":1654656951795
},
{
"data":"{bbbbbb}",
"deviceCode":"a2",
"messageType":"heart_beat",
"timestamp":1654656951795
}
]
```
**响应参数:**
参数名称 |参数类型|备注|其它
---|---|---|---
code|Integer|结果码(-1.失败,1.接收成功)|-
msg|String|消息|-
**响应消息样例:**
```
```
### 回调各个平台通知消息
......
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 to comment