package com.ruoyi.dataInterchange.server;
|
|
import com.alibaba.fastjson.JSON;
|
import com.ruoyi.dataInterchange.dao.UPWarnMsgAdptInfoDao;
|
import com.ruoyi.dataInterchange.dao.UPWarnMsgUrgeTodoAckDao;
|
import com.ruoyi.dataInterchange.model.DOWNWarnMsgUrgeTodoReq;
|
import com.ruoyi.dataInterchange.model.UPWarnMsgAdptInfo;
|
import com.ruoyi.dataInterchange.model.UPWarnMsgUrgeTodoAck;
|
import com.ruoyi.dataInterchange.model.WarnMsg;
|
import com.ruoyi.dataInterchange.model.enu.DataType;
|
import com.ruoyi.dataInterchange.netty.client.ChannelMap;
|
import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Util;
|
import com.ruoyi.dataInterchange.util.jtt809.packet.common.OuterPacket;
|
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.Unpooled;
|
import io.netty.channel.Channel;
|
import io.netty.channel.ChannelHandlerContext;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.time.LocalDateTime;
|
import java.time.ZoneOffset;
|
import java.util.List;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2025/3/4 20:45
|
*/
|
@Slf4j
|
@Component
|
public class WarnMsgService {
|
|
@Resource
|
private ConnectReqService connectReqService;
|
|
@Resource
|
private UPWarnMsgUrgeTodoAckDao upWarnMsgUrgeTodoAckDao;
|
|
@Resource
|
private UPWarnMsgAdptInfoDao upWarnMsgAdptInfoDao;
|
|
@Resource
|
private RedisTemplate redisTemplate;
|
|
|
public void up_warn_msg(ChannelHandlerContext ctx, OuterPacket out) {
|
if (!redisTemplate.hasKey("login:" + out.getGnsscenterId())) {
|
log.error("链路还未登录校验,拒绝连接");
|
ctx.close();
|
return;
|
}
|
WarnMsg warnMsg = getWarnMsg(out);
|
DataType dataType = DataType.getDataType(warnMsg.getDataType());
|
switch (dataType) {
|
case UP_WARN_MSG_URGE_TODO_ACK:
|
log.info("报警督办应答消息({}):{}", DataType.UP_WARN_MSG_URGE_TODO_ACK.getCode(), out);
|
up_warn_msg_urge_todo_ack(ctx, out.getGnsscenterId(), warnMsg);
|
break;
|
case UP_WARN_MSG_ADPT_INFO:
|
log.info("上报报警信息({}):{}", DataType.UP_WARN_MSG_ADPT_INFO.getCode(), out);
|
up_warn_msg_adpt_info(ctx, out.getGnsscenterId(), warnMsg);
|
break;
|
default:
|
break;
|
}
|
}
|
|
|
/**
|
* 解析子业务数据
|
*
|
* @param out
|
* @return
|
*/
|
public WarnMsg getWarnMsg(OuterPacket out) {
|
byte[] body = out.getBody();
|
ByteBuf byteBuf = Unpooled.wrappedBuffer(body);
|
//车牌号
|
String vehicleNo = Jtt809Util.readGBKString(byteBuf, 21);
|
//车牌颜色
|
byte vehicleColor = byteBuf.readByte();
|
//子业务类型标识
|
int dataType = byteBuf.readUnsignedShort();
|
//后续数据长度
|
int dataLength = byteBuf.readInt();
|
//子业务数据包
|
byte[] data = new byte[byteBuf.readableBytes()];
|
byteBuf.readBytes(data);
|
WarnMsg warnMsg = new WarnMsg();
|
warnMsg.setVehicleNo(vehicleNo);
|
warnMsg.setVehicleColor(vehicleColor);
|
warnMsg.setDataType(dataType);
|
warnMsg.setDataLength(dataLength);
|
warnMsg.setData(data);
|
return warnMsg;
|
}
|
|
|
/**
|
* 报警督办应答消息
|
*
|
* @param ctx
|
* @param inferiorPlatformId
|
* @param warnMsg
|
*/
|
public void up_warn_msg_urge_todo_ack(ChannelHandlerContext ctx, int inferiorPlatformId, WarnMsg warnMsg) {
|
UPWarnMsgUrgeTodoAck upWarnMsgUrgeTodoAck = new UPWarnMsgUrgeTodoAck().decode(warnMsg);
|
upWarnMsgUrgeTodoAck.setInferiorPlatformId(inferiorPlatformId);
|
upWarnMsgUrgeTodoAck.setCreateTime(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));
|
upWarnMsgUrgeTodoAckDao.save(upWarnMsgUrgeTodoAck);
|
}
|
|
/**
|
* 上报报警信息
|
*
|
* @param ctx
|
* @param inferiorPlatformId
|
* @param warnMsg
|
*/
|
public void up_warn_msg_adpt_info(ChannelHandlerContext ctx, int inferiorPlatformId, WarnMsg warnMsg) {
|
UPWarnMsgAdptInfo upWarnMsgAdptInfo = new UPWarnMsgAdptInfo().decode(warnMsg);
|
upWarnMsgAdptInfo.setResult(0x00);
|
upWarnMsgAdptInfo.setInferiorPlatformId(inferiorPlatformId);
|
upWarnMsgAdptInfo.setCreateTime(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));
|
upWarnMsgAdptInfoDao.save(upWarnMsgAdptInfo);
|
}
|
|
|
/**
|
* 定时任务督办报警请求
|
*/
|
public void taskUrgeTodo() {
|
List<UPWarnMsgAdptInfo> list = upWarnMsgAdptInfoDao.findByResultIsAndPushTimeBefore(0x00, LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));
|
for (UPWarnMsgAdptInfo upWarnMsgAdptInfo : list) {
|
down_warn_msg_urge_todo_req(upWarnMsgAdptInfo);
|
}
|
}
|
|
|
/**
|
* 报警督办请求
|
*/
|
public void down_warn_msg_urge_todo_req(UPWarnMsgAdptInfo upWarnMsgAdptInfo) {
|
if (!redisTemplate.hasKey("login:" + upWarnMsgAdptInfo.getInferiorPlatformId())) {
|
log.error("链路还未登录校验,拒绝连接");
|
return;
|
}
|
int inferiorPlatformId = upWarnMsgAdptInfo.getInferiorPlatformId();
|
DOWNWarnMsgUrgeTodoReq downWarnMsgUrgeTodoReq = new DOWNWarnMsgUrgeTodoReq().build(upWarnMsgAdptInfo);
|
downWarnMsgUrgeTodoReq.setDataType(DataType.DOWN_WARN_MSG_URGE_TODO_REQ.getCode());
|
downWarnMsgUrgeTodoReq.setDataLength(92);
|
byte[] body = downWarnMsgUrgeTodoReq.encode();
|
OuterPacket out = new OuterPacket(DataType.DOWN_WARN_MSG_URGE_TODO_REQ.getCode(), body);
|
//获取从链路通道
|
Channel channel = ChannelMap.getClientChannel(inferiorPlatformId);
|
if (null != channel && channel.isActive()) {
|
channel.writeAndFlush(out);
|
log.info("报警督办请求({}):{}", DataType.DOWN_WARN_MSG_URGE_TODO_REQ.getCode(), JSON.toJSONString(downWarnMsgUrgeTodoReq));
|
}
|
upWarnMsgAdptInfo.setPushTime(LocalDateTime.now().plusDays(7).toEpochSecond(ZoneOffset.ofHours(8)));
|
upWarnMsgAdptInfoDao.save(upWarnMsgAdptInfo);
|
}
|
}
|