cloud-car/cloud-modules/cloud-modules-template/src/main/java/com/muyu/template/test.java

137 lines
5.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
* @Packagecom.muyu.template
* @nametest2
* @Date2024/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()+"不正常,请检查!!!");
}
}
}
}
}
}