package com.ruoyi.dataInterchange.server; import com.alibaba.fastjson.JSON; import com.ruoyi.dataInterchange.dao.UPExgMsgRealLocationDao; import com.ruoyi.dataInterchange.dao.UPWarnMsgAdptInfoDao; import com.ruoyi.dataInterchange.dao.UPWarnMsgUrgeTodoAckDao; import com.ruoyi.dataInterchange.model.*; 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.Arrays; 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; @Resource private UPExgMsgRealLocationDao upExgMsgRealLocationDao; public void up_warn_msg(ChannelHandlerContext ctx, OuterPacket out) { if (!redisTemplate.hasKey("login:" + out.getGnsscenterId())) { log.error("链路还未登录校验,拒绝连接:{}", out.getGnsscenterId()); 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); } //走川标的公司 private List enterprise = Arrays.asList(17458936, 43984060, 13914394); /** * 上报报警信息 * * @param ctx * @param inferiorPlatformId * @param warnMsg */ public void up_warn_msg_adpt_info(ChannelHandlerContext ctx, int inferiorPlatformId, WarnMsg warnMsg) { UPWarnMsgAdptInfo upWarnMsgAdptInfo = enterprise.contains(inferiorPlatformId) ? new UPWarnMsgAdptInfo().decode2(warnMsg) : new UPWarnMsgAdptInfo().decode1(warnMsg); upWarnMsgAdptInfo.setResult(0x00); upWarnMsgAdptInfo.setInferiorPlatformId(inferiorPlatformId); upWarnMsgAdptInfo.setCreateTime(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))); if(0 == upWarnMsgAdptInfo.getLongitude()){ UPExgMsgRealLocation upExgMsgRealLocation = upExgMsgRealLocationDao.findByVehicleNoOrderByCreateTimeDesc(upWarnMsgAdptInfo.getVehicleNo()); if (null != upExgMsgRealLocation) { GnssData gnssData = upExgMsgRealLocation.getGnssData(); upWarnMsgAdptInfo.setSpeed(gnssData.getVec1()); upWarnMsgAdptInfo.setLongitude(gnssData.getLon()); upWarnMsgAdptInfo.setLatitude(gnssData.getLat()); } }else if(2 != upWarnMsgAdptInfo.getLevel()){ return; } upWarnMsgAdptInfoDao.save(upWarnMsgAdptInfo); } /** * 定时任务督办报警请求 */ public void taskUrgeTodo() { List list = upWarnMsgAdptInfoDao.findByResultIsAndLevelNotNullAndPushTimeBefore(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("链路还未登录校验,拒绝连接:{}", upWarnMsgAdptInfo.getInferiorPlatformId()); 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.getCode(), inferiorPlatformId, 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); } }