package com.muyu.template; import cn.hutool.json.JSONObject; import com.muyu.cache.MessageTemplateTypeCacheService; import com.muyu.cache.SysCarCacheService; import com.muyu.cache.WarnRuleCacheService; import com.muyu.cache.WarnStrategyCacheService; import com.muyu.common.domain.MessageTemplateType; import com.muyu.common.domain.SysCar; import com.muyu.common.domain.resp.SysCarVo; import com.muyu.common.domain.resp.WarnRuleResp; import com.muyu.common.domain.resp.WarnStrategyResp; import lombok.extern.log4j.Log4j2; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; /** * @author liuxinyue * @Package:com.muyu.template * @name:test2 * @Date:2024/10/6 10:34 */ @Log4j2 public class test { private static int DURATION_SECONDS = 5; private static List receivedStrings = new ArrayList<>(); private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); private static int elapsedSeconds = 0; private static String file="elapsed"; private static List messageTemplateTypes=null; private static Long msgTypeId=null; //滑窗时间 private static Long slideTime=null; //增长率 private static Long slideFrequency=null; //预警策略 @Resource private WarnStrategyCacheService warnStrategyCacheService; //车辆 @Resource private SysCarCacheService sysCarCacheService; //预警规则 @Resource private WarnRuleCacheService warnRuleCacheService; //报文模版 @Resource private MessageTemplateTypeCacheService messageTemplateTypeCacheService; public void main(String[] args) { //协议解析:每秒穿过来一个JSONObject jsonObject; 添加进receivedStrings //根据这个车辆VIN查询出他对应的车辆类型 String carVin=null; //报文模版的ID Integer templateId=null; for (JSONObject receivedString : receivedStrings) { carVin = receivedString.getStr("carVin"); } SysCar carByVin = null; List carVoList = sysCarCacheService.get(sysCarCacheService.keyPre()); Map carMap = carVoList.stream() .collect(Collectors.toMap(SysCarVo::getCarVin, Function.identity())); //获取到了这个车辆的信息 carByVin = carMap.get(carVin); //获取到这辆车绑定的报文模版 templateId=carByVin.getTemplateId(); //这个是这辆车对应的所有策略 List carWithWarnStrategyList=null; List warnStrategyResps = warnStrategyCacheService.get(warnStrategyCacheService.keyPre()); for (WarnStrategyResp warnStrategyResp : warnStrategyResps) { if(warnStrategyResp.getCarTypeId()==carByVin.getCarTypeId()){ carWithWarnStrategyList.add(warnStrategyResp); } } //该车对应的所有预警规则 List warnRuleResp=null; List warnRuleResps = warnRuleCacheService.get(warnRuleCacheService.keyPre()); for (WarnStrategyResp warnStrategyResp : carWithWarnStrategyList) { for (WarnRuleResp ruleResp : warnRuleResps) { if(warnStrategyResp.getId().equals(ruleResp.getStrategyId())){ warnRuleResp.add(ruleResp); } } } //报文模版 messageTemplateTypes = messageTemplateTypeCacheService.get(messageTemplateTypeCacheService.keyPre()); for (WarnRuleResp ruleResp : warnRuleResp) { //每一个规则他绑定了报文模版里面对应的一个配置 比如:电池,或者车速 msgTypeId = ruleResp.getMsgTypeId(); //将规则中对应的滑窗时间赋值为DURATION_SECONDS DURATION_SECONDS = Math.toIntExact(ruleResp.getSlideTime()); slideFrequency = ruleResp.getSlideFrequency(); } // 定义一个任务,每秒执行一次 Runnable task = new Runnable() { @Override public void run() { // 清理超过的数据 cleanUpOldStrings(); // 检查超速条件 checkForSpeeding(); } }; // 每隔1秒执行一次任务 scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); } // 清理超过60秒的数据 private static void cleanUpOldStrings() { long currentTime = System.currentTimeMillis(); receivedStrings.removeIf(jsonObject -> currentTime - jsonObject.getLong("time") > TimeUnit.SECONDS.toMillis(DURATION_SECONDS) ); } // 检查是否有超速情况 private static void checkForSpeeding() { if (receivedStrings.size() < 2) return; // 如果数据不足,直接返回 for (int i = 0; i < receivedStrings.size(); i++) { JSONObject current = receivedStrings.get(i); JSONObject next = receivedStrings.get(i + 1); for (MessageTemplateType messageTemplateType : messageTemplateTypes) { if(messageTemplateType.getMessageTemplateTypeId().equals(msgTypeId)){ Short currentElapsed = current.getShort(messageTemplateType.getMessageField()); Short nextElapsed = next.getShort(messageTemplateType.getMessageField()); if (nextElapsed > currentElapsed + slideFrequency) { log.info("出错啦,出错啦,您的"+messageTemplateType.getMessageField()+"不正常,请检查!!!"); } } } } } }