张天森
2022-11-10 d99a56e37cf9109b46ee68d34a06594ef5615ed3
springcloud_k8s_panzhihuazhihuishequ/service_property/src/main/java/com/panzhihua/service_property/netty/NettyServerHandler.java
@@ -1,26 +1,46 @@
package com.panzhihua.service_property.netty;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.panzhihua.common.utlis.DateUtils;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.service_property.dao.ComPropertyAlarmDao;
import com.panzhihua.service_property.dao.ComPropertyAlarmSettingDao;
import com.panzhihua.service_property.dao.ComPropertyEquipmentDao;
import com.panzhihua.service_property.entity.ComPropertyAlarm;
import com.panzhihua.service_property.entity.ComPropertyAlarmSetting;
import com.panzhihua.service_property.entity.ComPropertyEquipment;
import com.panzhihua.service_property.util.MyTools;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.Duration;
import java.util.Date;
import java.util.Objects;
@Slf4j
@Component
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    @Resource
    private ComPropertyAlarmDao comPropertyAlarmDao;
    @Resource
    private ComPropertyAlarmSettingDao comPropertyAlarmSettingDao;
    @Resource
    private ComPropertyEquipmentDao comPropertyEquipmentDao;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RabbitTemplate rabbitTemplate;
    private static NettyServerHandler nettyServerHandler;
    /**
     * 客户端连接会触发
     */
@@ -34,22 +54,28 @@
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        MyTools myTools=new MyTools();
        MyTools myTools = new MyTools();
        log.info("服务器收到消息: {}", msg.toString());
        if(msg.toString().startsWith("4A1802")){
            myTools.writeToClient("404A021823",ctx,"状态包");
        if (msg.toString().startsWith("4A1802")) {
            myTools.writeToClient("404A021823", ctx, "状态包");
        }
        if(msg.toString().startsWith("4A0C0134")){
            myTools.writeToClient("404A01"+ DateUtils.getDateFormatString(new Date(),"HHmmss")+"23",ctx,"心跳包");
        if (msg.toString().startsWith("4A0C01")) {
            myTools.writeToClient("404A01" + DateUtils.getDateFormatString(new Date(), "HHmmss") + "23", ctx, "心跳包");
        }
        if(msg.toString().startsWith("4A1803")){
            String serial=msg.toString().substring(14,24);
            myTools.writeToClient("404A03"+msg.toString().substring(msg.toString().length()-2)+"23",ctx,"事件包");
            ComPropertyAlarm comPropertyAlarm=new ComPropertyAlarm();
            comPropertyAlarm.setCreateTime(DateUtil.date());
            comPropertyAlarm.setSerialNo(serial);
            comPropertyAlarm.setType(ComPropertyAlarm.type.one);
            nettyServerHandler.comPropertyAlarmDao.insert(comPropertyAlarm);
        if (msg.toString().startsWith("4A1803")) {
            String serial = msg.toString().substring(14, 24);
            myTools.writeToClient("404A03" + msg.toString().substring(msg.toString().length() - 2) + "23", ctx, "事件包");
            if (msg.toString().startsWith("4A18031")) {
                //正式处理
                 delayAlarm(serial);
                //展会处理
//                ComPropertyAlarm comPropertyAlarm = new ComPropertyAlarm();
//                comPropertyAlarm.setCreateTime(DateUtil.date());
//                comPropertyAlarm.setSerialNo(serial);
//                comPropertyAlarm.setType(ComPropertyAlarm.type.one);
//                nettyServerHandler.comPropertyAlarmDao.insert(comPropertyAlarm);
            }
        }
        ctx.flush();
    }
@@ -65,7 +91,44 @@
    @PostConstruct
    public void init() {
        nettyServerHandler=this;
        nettyServerHandler.comPropertyAlarmDao=this.comPropertyAlarmDao;
        nettyServerHandler = this;
        nettyServerHandler.comPropertyAlarmDao = this.comPropertyAlarmDao;
        nettyServerHandler.stringRedisTemplate = this.stringRedisTemplate;
        nettyServerHandler.rabbitTemplate = this.rabbitTemplate;
    }
    //报警事件包延迟处理方法
    private void delayAlarm(String serial) {
        int duration = 0;
        if (StringUtils.isNotEmpty(serial)) {
            ComPropertyEquipment comPropertyEquipment = new ComPropertyEquipment();
            if (nettyServerHandler.stringRedisTemplate.hasKey(serial)) {
                comPropertyEquipment = JSONObject.parseObject(nettyServerHandler.stringRedisTemplate.boundValueOps(serial).get(), ComPropertyEquipment.class);
                duration = getDuration(Objects.requireNonNull(comPropertyEquipment));
                nettyServerHandler.stringRedisTemplate.boundValueOps(serial).set(JSONObject.toJSONString(comPropertyEquipment), Duration.ofHours(duration));
            } else {
                comPropertyEquipment = nettyServerHandler.comPropertyEquipmentDao.selectOne(new QueryWrapper<ComPropertyEquipment>().eq("serial_no", serial));
                duration = getDuration(comPropertyEquipment);
                nettyServerHandler.stringRedisTemplate.boundValueOps(serial).set(JSONObject.toJSONString(comPropertyEquipment));
            }
            int finalDuration = duration;
            nettyServerHandler.rabbitTemplate.convertAndSend("huacheng.delayed.exchange", "huacheng.delayed.key", comPropertyEquipment, message -> {
                message.getMessageProperties().setHeader("x-delay", finalDuration * 1000 * 3601);
                return message;
            });
        }
    }
    private int getDuration(ComPropertyEquipment comPropertyEquipment) {
        int duration;
        if (nettyServerHandler.stringRedisTemplate.hasKey(comPropertyEquipment.getCommunityId().toString())) {
            duration = Integer.parseInt(nettyServerHandler.stringRedisTemplate.boundValueOps(comPropertyEquipment.getCommunityId().toString()).get());
        } else {
            ComPropertyAlarmSetting comPropertyAlarmSetting = nettyServerHandler.comPropertyAlarmSettingDao.getByCommunityId(comPropertyEquipment.getCommunityId());
            duration = comPropertyAlarmSetting.getTriggerTime();
            nettyServerHandler.stringRedisTemplate.boundValueOps(comPropertyEquipment.getCommunityId().toString()).set(comPropertyAlarmSetting.getTriggerTime().toString());
        }
        return duration;
    }
}