137 lines
5.8 KiB
Java
137 lines
5.8 KiB
Java
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<JSONObject> receivedStrings = new ArrayList<>();
|
||
private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||
private static int elapsedSeconds = 0;
|
||
private static String file="elapsed";
|
||
private static List<MessageTemplateType> 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<SysCarVo> carVoList = sysCarCacheService.get(sysCarCacheService.keyPre());
|
||
Map<String, SysCarVo> carMap = carVoList.stream()
|
||
.collect(Collectors.toMap(SysCarVo::getCarVin, Function.identity()));
|
||
//获取到了这个车辆的信息
|
||
carByVin = carMap.get(carVin);
|
||
//获取到这辆车绑定的报文模版
|
||
templateId=carByVin.getTemplateId();
|
||
//这个是这辆车对应的所有策略
|
||
List<WarnStrategyResp> carWithWarnStrategyList=null;
|
||
List<WarnStrategyResp> warnStrategyResps = warnStrategyCacheService.get(warnStrategyCacheService.keyPre());
|
||
for (WarnStrategyResp warnStrategyResp : warnStrategyResps) {
|
||
if(warnStrategyResp.getCarTypeId()==carByVin.getCarTypeId()){
|
||
carWithWarnStrategyList.add(warnStrategyResp);
|
||
}
|
||
}
|
||
//该车对应的所有预警规则
|
||
List<WarnRuleResp> warnRuleResp=null;
|
||
List<WarnRuleResp> 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()+"不正常,请检查!!!");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|