From f38efce42f11a68519b410b0c7c73f2ecfa9e821 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 11:17:49 +0800 Subject: [PATCH] =?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 | 20 +++- .../com/hivekion/room/bean/MoveRootTask.java | 109 ++++++++++++++++-- .../resources/application-rule.properties | 4 +- 3 files changed, 118 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 7b804d1..c60c04e 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -3,8 +3,13 @@ package com.hivekion.room.bean; import com.hivekion.room.RoomManager; import com.hivekion.room.func.TaskAction; import com.hivekion.scenario.entity.ScenarioTask; - -import java.util.concurrent.*; +import com.hivekion.statistic.bean.StatisticBean; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.springframework.web.reactive.function.client.WebClient; @@ -68,14 +73,15 @@ public abstract class AbtParentTask implements TaskAction { public long getDuringTime() { return RoomManager.getRoomDuringTime(this.roomId); } + //获取房间状态 public boolean getRoomStatus() { return RoomManager.isRunning(roomId); } - public void createBattleTaskOnTimingHandle(BizTaskOnTiming bizTaskOnTiming){ + public void createBattleTaskOnTimingHandle(BizTaskOnTiming bizTaskOnTiming) { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( - 1); + 1); schedule.scheduleWithFixedDelay(() -> { bizTaskOnTiming.execTask(); }, 0, 10, TimeUnit.SECONDS); @@ -83,9 +89,13 @@ public abstract class AbtParentTask implements TaskAction { addScheduledExecutorServiceRefenceToRoom(schedule); } + protected void pushStatistic() { + StatisticBean statisticBean = new StatisticBean(); + //获取分队信息 + } } - interface BizTaskOnTiming{ +interface BizTaskOnTiming { public void execTask(); } diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index 052bf82..0f9a9b2 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -5,11 +5,17 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.hivekion.Global; +import com.hivekion.baseData.entity.Scenario; +import com.hivekion.baseData.service.ScenarioService; import com.hivekion.common.MultiPointGeoPosition; import com.hivekion.common.entity.ResponseCmdInfo; +import com.hivekion.common.redis.RedisUtil; import com.hivekion.enums.WsCmdTypeEnum; import com.hivekion.room.func.TaskAction; import com.hivekion.scenario.entity.ScenarioTask; +import com.hivekion.statistic.bean.StatisticBean; +import com.hivekion.statistic.service.impl.StatisticServiceImpl; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -49,6 +55,23 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { * 开始点坐标 */ private final AtomicReference startPoint = new AtomicReference<>(); + /** + * 任务相对与想定的开始时间 + */ + private long taskRelativeStartTime = 0; + /** + * 油料消耗速率 + */ + private double fuelConsumption = 0; + /** + * 消耗任务间隔 + */ + private final int consumptionTaskInterval = 5; + /** + * redis 服务类 + */ + private final RedisUtil redis = SpringUtil.getBean(RedisUtil.class); + private StatisticBean statisticBean; public MoveRootTask(ScenarioTask scenarioTask, String roomId) { @@ -59,8 +82,28 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { @Override public void doSomeThing() { log.info("move task running"); + + initEnv(); //初始化环境 initPath(); //初始化路径 updatePath(); //更新路径 + fuelConsumption();//油品消耗 + } + + /** + * 初始化环境 + */ + private void initEnv() { + //获取任务相对于想定的开始时间 + Scenario scenario = SpringUtil.getBean(ScenarioService.class) + .getScenarioById(scenarioTask.getScenarioId()); + taskRelativeStartTime = Math.abs( + Duration.between(scenario.getStartTime(), scenarioTask.getStartTime()).getSeconds()); + //获取油品消耗规则 + String fuelConsumptionStr = SpringUtil.getBean(Environment.class) + .getProperty("vehicle.fuel.consumption.per.km"); + fuelConsumption = Double.parseDouble(fuelConsumptionStr == null ? "0" : fuelConsumptionStr); + + statisticBean = SpringUtil.getBean(StatisticServiceImpl.class).statistic(scenarioTask.getResourceId()); } /** @@ -98,7 +141,11 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { Global.sendCmdInfoQueue.add( ResponseCmdInfo.create(WsCmdTypeEnum.PATH_INIT.getCode(), roomId, scenarioTask.getScenarioId(), dataMap)); - log.info("init::{}", JSON.toJSONString(coordinates)); + + redis.hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "init_path", JSON.toJSONString(coordinates)); + //计算各个点的累计距离和坐标的对应关系 double beforeLng = Double.parseDouble(scenarioTask.getFromLng()); double beforeLat = Double.parseDouble(scenarioTask.getFromLat()); @@ -142,7 +189,8 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { try { if (this.getRoomStatus()) { - long duringTime = getDuringTime(); + long duringTime = getDuringTime() - taskRelativeStartTime; + log.info("duringTime::{}", duringTime); //跑动距离 double distance = duringTime * SPEED; @@ -157,7 +205,7 @@ public class MoveRootTask extends 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()); + // log.info("distance::{},lowerKey::{},endPoint{}",distance,lowerKey,endPoint.getKey()); //获取从上一个开始节点到lowKey的数据 NavigableMap subPathMap = distanceInfoMap.subMap(startPoint.get(), true, lowerKey, true); @@ -165,23 +213,23 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { Coordinate coordinate = subPathMap.get(key); dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); } - double diff =distance - lowerKey ; + double diff = distance - lowerKey; //插入值 double[] insertPoints = MultiPointGeoPosition.pointAlong( distanceInfoMap.get(lowerKey).getLat(), distanceInfoMap.get(lowerKey).getLng(), endPoint.getValue().getLat(), endPoint.getValue().getLng(), diff); - - dataList.add(new double[]{insertPoints[1], insertPoints[0]}); - Coordinate coordinate = new Coordinate(); + Coordinate coordinate = new Coordinate(); coordinate.setLat(insertPoints[0]); coordinate.setLng(insertPoints[1]); distanceInfoMap.put(distance, coordinate); startPoint.set(distance); - + redis.hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "position", JSON.toJSONString(coordinate)); Global.sendCmdInfoQueue.add( ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, @@ -208,7 +256,6 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { } - } } catch (Exception e) { log.error("error::", e); @@ -221,7 +268,51 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { addScheduledExecutorServiceRefenceToRoom(schedule); } + private void fuelConsumption() { + ScheduledExecutorService schedule = Executors.newScheduledThreadPool( + 1); + schedule.scheduleWithFixedDelay(() -> { + if (getRoomStatus()) { + double total = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; + //更新redis中油品的消耗 + Object currentFuelObj = redis.hget( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "fuel"); + if (currentFuelObj != null) { + double fuel = Double.parseDouble(currentFuelObj.toString()); + if (fuel > 0) { + fuel = fuel - total < 0 ? 0 : fuel - total; + //更新值 + redis.hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "fuel", fuel); + //推送前端 + + } + } + } + + + }, 0, consumptionTaskInterval, TimeUnit.SECONDS); + + } + + private void statistic() { + + Object positionObj = redis.hget( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "position"); + if (positionObj != null) { + Coordinate coordinate = JSONObject.parseObject(positionObj.toString(), Coordinate.class); + statisticBean.getTeam().setLat(coordinate.lat+""); + statisticBean.getTeam().setLng(coordinate.lng+""); + + } + //设置人员受伤信息 + + + } } @Data diff --git a/src/main/resources/application-rule.properties b/src/main/resources/application-rule.properties index 094db2a..f302868 100644 --- a/src/main/resources/application-rule.properties +++ b/src/main/resources/application-rule.properties @@ -3,4 +3,6 @@ battle.ammunition.warn = 3 battle.food.warn = 3 battle.water.warn = 3 battle.fuel.warn = 2 -battle.medical.warn = 1 \ No newline at end of file +battle.medical.warn = 1 +## ?????????????? +vehicle.fuel.consumption.per.km: 0.08 \ No newline at end of file