From f775eb9214b4d454c13c1d6cc91999924ef07542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:29:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hivekion/room/bean/AbtParentTask.java | 15 ++-- .../com/hivekion/room/bean/MoveRootTask.java | 76 ++++++++++--------- .../resources/application-rule.properties | 14 ++-- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 73c94da..1acd0be 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -127,7 +127,7 @@ public abstract class AbtParentTask implements TaskAction { protected void initPath() { try { - + log.info("init path"); String url = SpringUtil.getBean(Environment.class).getProperty("path.planning.url"); String params = url + "?" + "profile=car" @@ -142,7 +142,7 @@ public abstract class AbtParentTask implements TaskAction { .retrieve() .bodyToMono(String.class) .block(); - + log.info("init path finished ::{}",result); JSONObject pointJson = JSON.parseObject(result); //获取路径点 if (pointJson != null) { @@ -206,12 +206,16 @@ public abstract class AbtParentTask implements TaskAction { if (this.getRoomStatus()) { long duringTime = getDuringTime() - taskRelativeTime; + if(duringTime <= 0) { + return; + } - log.info("duringTime::{}", duringTime); //跑动距离 double distance = duringTime * speed; + //获取大与此距离的第一个路线点key Entry endPoint = distanceInfoMap.ceilingEntry(distance); + //ws数据 List dataList = new ArrayList<>(); HashMap dataMap = new HashMap<>(); @@ -221,8 +225,7 @@ public abstract class AbtParentTask implements TaskAction { if (Double.compare(distance, endPoint.getKey()) < 0) { //获取小于最大值的第一个key Double lowerKey = distanceInfoMap.lowerKey(endPoint.getKey()); - // log.info("distance::{},lowerKey::{},endPoint{}",distance,lowerKey,endPoint.getKey()); - //获取从上一个开始节点到lowKey的数据 + NavigableMap subPathMap = distanceInfoMap.subMap(startPoint.get(), true, lowerKey, true); for (Double key : subPathMap.keySet()) { @@ -272,6 +275,8 @@ public abstract class AbtParentTask implements TaskAction { Global.sendCmdInfoQueue.add( ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId, scenarioTask.getScenarioId(), dataMap)); + //任务终止 + schedule.shutdown(); } diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index ce09eb9..cfab01c 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -77,53 +77,61 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { * 初始化环境 */ private void initEnv() { + try{ + //获取油品消耗规则 + String fuelConsumptionStr = SpringUtil.getBean(Environment.class) + .getProperty("fuel_spreed"); + fuelConsumption = Double.parseDouble(fuelConsumptionStr == null ? "0" : fuelConsumptionStr); + fuelThreshold = Double.parseDouble(SpringUtil.getBean(Environment.class) + .getProperty("fuel.warn ", "0")); + statisticBean = SpringUtil.getBean(StatisticServiceImpl.class) + .statistic(scenarioTask.getResourceId()); + }catch (Exception e){ + log.error("init env exception",e); + } - //获取油品消耗规则 - String fuelConsumptionStr = SpringUtil.getBean(Environment.class) - .getProperty("fuel_spreed"); - fuelConsumption = Double.parseDouble(fuelConsumptionStr == null ? "0" : fuelConsumptionStr); - fuelThreshold = Double.parseDouble(SpringUtil.getBean(Environment.class) - .getProperty("fuel.warn ", "0")); - statisticBean = SpringUtil.getBean(StatisticServiceImpl.class) - .statistic(scenarioTask.getResourceId()); } private void fuelConsumption() { + try{ + ScheduledExecutorService schedule = Executors.newScheduledThreadPool( + 1); + schedule.scheduleWithFixedDelay(() -> { + if (getRoomStatus()) { + double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; - ScheduledExecutorService schedule = Executors.newScheduledThreadPool( - 1); - schedule.scheduleWithFixedDelay(() -> { - if (getRoomStatus()) { - double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; - - //更新redis中油品的消耗 - Object currentFuelObj = redis.hget( - scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuel"); - if (currentFuelObj != null) { - double fuel = Double.parseDouble(currentFuelObj.toString()); - fuel = fuel - currentUseUp; - - redis.hset( + //更新redis中油品的消耗 + Object currentFuelObj = redis.hget( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuelConsume", fuel); + "fuel"); + if (currentFuelObj != null) { + double fuel = Double.parseDouble(currentFuelObj.toString()); + fuel = fuel - currentUseUp; - double totalFuel = statisticBean.getFuel().getTotal(); - if (fuel * 100 / totalFuel < fuelThreshold && !requestFlag.get()) { - requestFlag.set(true); - //需要产生需求 - produceFuelRequest(); - //产生任务 - produceTask(); + redis.hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "fuelConsume", fuel); + double totalFuel = statisticBean.getFuel().getTotal(); + if (fuel * 100 / totalFuel < fuelThreshold && !requestFlag.get()) { + requestFlag.set(true); + //需要产生需求 + produceFuelRequest(); + //产生任务 + produceTask(); + + } } + //插入消耗表 } - //插入消耗表 - } - }, 0, consumptionTaskInterval, TimeUnit.SECONDS); + }, 0, consumptionTaskInterval, TimeUnit.SECONDS); + }catch (Exception e){ + log.error("fuel consumption exception",e); + } + } diff --git a/src/main/resources/application-rule.properties b/src/main/resources/application-rule.properties index 853a04d..74de340 100644 --- a/src/main/resources/application-rule.properties +++ b/src/main/resources/application-rule.properties @@ -5,10 +5,10 @@ food.warn = 3 water.warn = 3 fuel.warn = 2 medical.warn = 1 -death.spreed = 3; -injured.spreed = 3; -ammunition_spreed = 2.6; -food_spreed = 2.3; -water_spreed = 3.6; -fuel_spreed = 3.6; -medical_spreed = 1.6; \ No newline at end of file +death.spreed = 3 +injured.spreed = 3 +ammunition_spreed = 2.6 +food_spreed = 2.3 +water_spreed = 3.6 +fuel_spreed = 3.6 +medical_spreed = 1.6 \ No newline at end of file From 5d078e0dac76a83e068297c6597b567cec511684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:40:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/room/bean/AbtParentTask.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 1acd0be..15be857 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -215,7 +215,11 @@ public abstract class AbtParentTask implements TaskAction { //获取大与此距离的第一个路线点key Entry endPoint = distanceInfoMap.ceilingEntry(distance); + if(endPoint == null) { + endPoint = distanceInfoMap.lastEntry(); + } + log.info("enPoint::{}",endPoint); //ws数据 List dataList = new ArrayList<>(); HashMap dataMap = new HashMap<>(); From 1af5e030e8e1da376d4754c77c44d5a687cb5768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:13:10 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hivekion/room/bean/AbtParentTask.java | 16 +++++++++++----- .../com/hivekion/room/bean/MoveRootTask.java | 2 +- src/main/java/com/hivekion/room/bean/Room.java | 4 ++-- .../service/impl/ScenarioTaskServiceImpl.java | 3 +++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 15be857..f2b7441 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -137,12 +137,13 @@ public abstract class AbtParentTask implements TaskAction { + scenarioTask.getToLng() + "&points_encoded=false" + "&algorithm=alternative_route&alternative_route.max_paths=3"; + log.info("params:;{}", params); //获取路线信息 String result = webClient.get().uri(params) .retrieve() .bodyToMono(String.class) .block(); - log.info("init path finished ::{}",result); + log.info("init path finished ::{}", result); JSONObject pointJson = JSON.parseObject(result); //获取路径点 if (pointJson != null) { @@ -204,9 +205,11 @@ public abstract class AbtParentTask implements TaskAction { try { if (this.getRoomStatus()) { - + if (distanceInfoMap.isEmpty()) { + return; + } long duringTime = getDuringTime() - taskRelativeTime; - if(duringTime <= 0) { + if (duringTime <= 0) { return; } @@ -215,11 +218,11 @@ public abstract class AbtParentTask implements TaskAction { //获取大与此距离的第一个路线点key Entry endPoint = distanceInfoMap.ceilingEntry(distance); - if(endPoint == null) { + if (endPoint == null) { endPoint = distanceInfoMap.lastEntry(); } - log.info("enPoint::{}",endPoint); + log.info("enPoint::{}",endPoint); //ws数据 List dataList = new ArrayList<>(); HashMap dataMap = new HashMap<>(); @@ -229,6 +232,9 @@ public abstract class AbtParentTask implements TaskAction { if (Double.compare(distance, endPoint.getKey()) < 0) { //获取小于最大值的第一个key Double lowerKey = distanceInfoMap.lowerKey(endPoint.getKey()); + if(lowerKey==null){ + lowerKey = endPoint.getKey(); + } NavigableMap subPathMap = distanceInfoMap.subMap(startPoint.get(), true, lowerKey, true); diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index cfab01c..4c38ce2 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -65,7 +65,7 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { @Override public void doSomeThing() { - log.info("move task running"); + log.info("move task running:{}",scenarioTask.getResourceId()); initEnv(); //初始化环境 initPath(); //初始化路径 diff --git a/src/main/java/com/hivekion/room/bean/Room.java b/src/main/java/com/hivekion/room/bean/Room.java index 6929061..14b7ee5 100644 --- a/src/main/java/com/hivekion/room/bean/Room.java +++ b/src/main/java/com/hivekion/room/bean/Room.java @@ -63,7 +63,7 @@ public class Room implements AutoCloseable { //线程池 private final ExecutorService actionExecutor = new ThreadPoolExecutor( - 5, 5, // corePoolSize, maximumPoolSize + 5, 100, // corePoolSize, maximumPoolSize 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1000), // 有界队列,只允许100个待执行任务 new ThreadPoolExecutor.AbortPolicy() // 超出直接抛异常 @@ -130,7 +130,7 @@ public class Room implements AutoCloseable { if (magValue != null) { this.mag = magValue.getMag(); } - log.info("mag:{}", mag); + long curTime = duringTime.addAndGet(this.mag); sendRemainTime((totalTime.get() - curTime)); diff --git a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java index 8c9814c..18235c8 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -144,6 +144,7 @@ public class ScenarioTaskServiceImpl extends ScenarioTask scenarioTask = new ScenarioTask(); scenarioTask.setScenarioId(scenario.getId()); List taskList = this.queryTaskList(scenarioTask); + log.info("taskList.size ::{}", taskList.size()); for (ScenarioTask task : taskList) { try { long diff = Duration.between(scenario.getStartTime(),task.getStartTime()) @@ -152,6 +153,7 @@ public class ScenarioTaskServiceImpl extends switch (task.getTaskType()) { //移动任务 case "1": + log.info("move task::{}",diff); MoveRootTask moveRootTask = new MoveRootTask(task, roomId); RoomManager.addAction(roomId, diff, moveRootTask); break; @@ -166,6 +168,7 @@ public class ScenarioTaskServiceImpl extends case "6": case "7": case "8": + log.info("supplier task::{}",diff); SupplierTask supplierTask = new SupplierTask(task, roomId); RoomManager.addAction(roomId, diff, supplierTask); break; From f539feef7fcd84b8ebd73d506a450975333b410c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:27:33 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hivekion/room/bean/AbtParentTask.java | 2 +- src/main/java/com/hivekion/room/bean/SupplierTask.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index f2b7441..257dc74 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -222,7 +222,7 @@ public abstract class AbtParentTask implements TaskAction { endPoint = distanceInfoMap.lastEntry(); } - log.info("enPoint::{}",endPoint); + // log.info("enPoint::{}",endPoint); //ws数据 List dataList = new ArrayList<>(); HashMap dataMap = new HashMap<>(); diff --git a/src/main/java/com/hivekion/room/bean/SupplierTask.java b/src/main/java/com/hivekion/room/bean/SupplierTask.java index 9cf2f79..244935d 100644 --- a/src/main/java/com/hivekion/room/bean/SupplierTask.java +++ b/src/main/java/com/hivekion/room/bean/SupplierTask.java @@ -70,7 +70,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction { SpringUtil.getBean(RedisUtil.class) .hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "medical", statistic.getMedical().getTotal()); + "medical", statistic.getMedical().getTotal()+""); } @@ -79,7 +79,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction { SpringUtil.getBean(RedisUtil.class) .hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuel", statistic.getFuel().getTotal()); + "fuel", statistic.getFuel().getTotal()+""); } @@ -87,7 +87,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction { SpringUtil.getBean(RedisUtil.class) .hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "ammunition", statistic.getAmmunition().getTotal()); + "ammunition", statistic.getAmmunition().getTotal()+""); } @@ -95,7 +95,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction { SpringUtil.getBean(RedisUtil.class) .hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "water", statistic.getWater().getTotal()); + "water", statistic.getWater().getTotal()+""); } @@ -103,7 +103,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction { SpringUtil.getBean(RedisUtil.class) .hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "food", statistic.getFood().getTotal()); + "food", statistic.getFood().getTotal()+""); }