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 01/21] =?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 From 1e78632634847ca37a783f0059c5ae1185092018 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 11:56:48 +0800 Subject: [PATCH 02/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 12b9faa..1b6ab2f 100644 --- a/pom.xml +++ b/pom.xml @@ -51,11 +51,11 @@ mysql-connector-java 5.1.47 - + org.apache.commons commons-pool2 From 4a2f80b66628cb2a2eaf429271563c39bc750647 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 11:59:50 +0800 Subject: [PATCH 03/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 3b749cf..3743dc9 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -10,14 +10,14 @@ spring.redis.host=192.168.0.53 spring.redis.port=6379 #spring.redis.password=123 spring.redis.timeout=5000 -spring.redis.lettuce.shutdown-timeout=5000 -#spring.redis.lettuce.timeout=5000 -spring.redis.lettuce.pool.max-active=8 -spring.redis.lettuce.pool.max-idle=8 -spring.redis.lettuce.pool.min-idle=0 -spring.redis.lettuce.pool.max-wait=2000ms -spring.redis.lettuce.pool.timeout=5000ms # ִгʱ -spring.redis.lettuce.pool.connect-timeout=10000ms # ӽʱ +#spring.redis.lettuce.shutdown-timeout=5000 +##spring.redis.lettuce.timeout=5000 +#spring.redis.lettuce.pool.max-active=8 +#spring.redis.lettuce.pool.max-idle=8 +#spring.redis.lettuce.pool.min-idle=0 +#spring.redis.lettuce.pool.max-wait=2000ms +#spring.redis.lettuce.pool.timeout=5000ms # ִгʱ +#spring.redis.lettuce.pool.connect-timeout=10000ms # ӽʱ server.port=8099 From 9c8c10f3c0b461380f2053ab2953326a7a6fb1a4 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 12:04:41 +0800 Subject: [PATCH 04/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +++--- src/main/resources/application-prod.properties | 9 +-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 1b6ab2f..1cb39b1 100644 --- a/pom.xml +++ b/pom.xml @@ -56,11 +56,11 @@ lettuce-core 6.2.4.RELEASE --> - + - + 2.12.0 <!– 建议使用最新稳定版本 –> + --> diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 3743dc9..cae530e 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -10,14 +10,7 @@ spring.redis.host=192.168.0.53 spring.redis.port=6379 #spring.redis.password=123 spring.redis.timeout=5000 -#spring.redis.lettuce.shutdown-timeout=5000 -##spring.redis.lettuce.timeout=5000 -#spring.redis.lettuce.pool.max-active=8 -#spring.redis.lettuce.pool.max-idle=8 -#spring.redis.lettuce.pool.min-idle=0 -#spring.redis.lettuce.pool.max-wait=2000ms -#spring.redis.lettuce.pool.timeout=5000ms # ִгʱ -#spring.redis.lettuce.pool.connect-timeout=10000ms # ӽʱ + server.port=8099 From cdfa6e3a8a2f1757f3244ba043ebf9ed40e699d9 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 12:14:09 +0800 Subject: [PATCH 05/21] =?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/enums/WsCmdTypeEnum.java | 1 + .../com/hivekion/room/bean/AbtParentTask.java | 203 +++++++++++- .../hivekion/room/bean/BattleRootTask.java | 6 +- .../com/hivekion/room/bean/Coordinate.java | 19 ++ .../com/hivekion/room/bean/MoveRootTask.java | 312 ++++++------------ .../com/hivekion/room/bean/SupplierTask.java | 7 +- 6 files changed, 326 insertions(+), 222 deletions(-) create mode 100644 src/main/java/com/hivekion/room/bean/Coordinate.java diff --git a/src/main/java/com/hivekion/enums/WsCmdTypeEnum.java b/src/main/java/com/hivekion/enums/WsCmdTypeEnum.java index 1b00d81..257bc33 100644 --- a/src/main/java/com/hivekion/enums/WsCmdTypeEnum.java +++ b/src/main/java/com/hivekion/enums/WsCmdTypeEnum.java @@ -14,6 +14,7 @@ import lombok.Getter; public enum WsCmdTypeEnum { PATH_UPDATE("path_update"), PATH_FINISHED("path_finished"), + STATISTIC("statistic"), PATH_INIT("path_init"); @Getter private final String code; diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index c60c04e..8016256 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -1,9 +1,28 @@ package com.hivekion.room.bean; +import cn.hutool.extra.spring.SpringUtil; +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.RoomManager; import com.hivekion.room.func.TaskAction; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.statistic.bean.StatisticBean; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.NavigableMap; +import java.util.TreeMap; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -11,6 +30,9 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; import org.springframework.web.reactive.function.client.WebClient; /** @@ -22,16 +44,26 @@ import org.springframework.web.reactive.function.client.WebClient; * @author LiDongYU * @since 2025/7/22 */ - +@Slf4j public abstract class AbtParentTask implements TaskAction { - - + /** + * 开始点坐标 + */ + private final AtomicReference startPoint = new AtomicReference<>(); + /** + * 距离和坐标的对应关系 + */ + protected final TreeMap distanceInfoMap = new TreeMap<>(); //任务数据 protected final ScenarioTask scenarioTask; //房间ID protected final String roomId; //http请求 protected WebClient webClient = WebClient.create(); + /** + * 任务相对与想定的开始时间 + */ + private long taskRelativeTime = 0; //线程池 protected ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, // 核心线程数 @@ -46,7 +78,10 @@ public abstract class AbtParentTask implements TaskAction { public AbtParentTask(ScenarioTask scenarioTask, String roomId) { this.scenarioTask = scenarioTask; this.roomId = roomId; - + Scenario scenario = SpringUtil.getBean(ScenarioService.class) + .getScenarioById(scenarioTask.getScenarioId()); + taskRelativeTime = Math.abs( + Duration.between(scenario.getStartTime(), scenarioTask.getStartTime()).getSeconds()); } public void addScheduledExecutorServiceRefenceToRoom( @@ -89,9 +124,163 @@ public abstract class AbtParentTask implements TaskAction { addScheduledExecutorServiceRefenceToRoom(schedule); } - protected void pushStatistic() { - StatisticBean statisticBean = new StatisticBean(); - //获取分队信息 + + protected void initPath(){ + try { + + String url = SpringUtil.getBean(Environment.class).getProperty("path.planning.url"); + String params = url + "?" + + "profile=car" + + "&point=" + scenarioTask.getFromLat() + "," + + scenarioTask.getFromLng() + + "&point=" + scenarioTask.getToLat() + "," + + scenarioTask.getToLng() + + "&points_encoded=false" + + "&algorithm=alternative_route&alternative_route.max_paths=3"; + //获取路线信息 + String result = webClient.get().uri(params) + .retrieve() + .bodyToMono(String.class) + .block(); + + JSONObject pointJson = JSON.parseObject(result); + //获取路径点 + if (pointJson != null) { + JSONObject pointsObj = pointJson.getJSONArray("paths").getJSONObject(0) + .getJSONObject("points"); + JSONArray coordinates = pointsObj.getJSONArray("coordinates"); + //组装信息 + Map dataMap = new HashMap<>(); + dataMap.put("resourceId", scenarioTask.getResourceId()); + dataMap.put("points", coordinates); + //推送路径任务 + Global.sendCmdInfoQueue.add( + ResponseCmdInfo.create(WsCmdTypeEnum.PATH_INIT.getCode(), roomId, + scenarioTask.getScenarioId(), dataMap)); + + SpringUtil.getBean(RedisUtil.class).hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "init_path", JSON.toJSONString(coordinates)); + + //计算各个点的累计距离和坐标的对应关系 + double beforeLng = Double.parseDouble(scenarioTask.getFromLng()); + double beforeLat = Double.parseDouble(scenarioTask.getFromLat()); + double total = 0; + for (int i = 0; i < coordinates.size(); i++) { + JSONArray coordinate = coordinates.getJSONArray(i); + Double lng = coordinate.getDouble(0); + + Double lat = coordinate.getDouble(1); + + double distance = MultiPointGeoPosition.haversine(beforeLat, beforeLng, lat, lng); + //当前总距离 + total = total + distance; + //定义坐标对象 + Coordinate coordinateInfo = new Coordinate(); + coordinateInfo.setLat(lat); + coordinateInfo.setLng(lng); + + //记录距离和数组列表直接的索引关系 + distanceInfoMap.put(total, coordinateInfo); + + beforeLng = lng; + beforeLat = lat; + + } + //设置第一个开始位置 + startPoint.set(distanceInfoMap.firstKey()); + } + + } catch (Exception e) { + log.error("error::", e); + } + } + protected void updatePath(double speed) { + + ScheduledExecutorService schedule = Executors.newScheduledThreadPool( + 1); + schedule.scheduleWithFixedDelay(() -> { + + try { + if (this.getRoomStatus()) { + + long duringTime = getDuringTime() - taskRelativeTime; + + log.info("duringTime::{}", duringTime); + //跑动距离 + double distance = duringTime * speed; + //获取大与此距离的第一个路线点key + Entry endPoint = distanceInfoMap.ceilingEntry(distance); + //ws数据 + List dataList = new ArrayList<>(); + HashMap dataMap = new HashMap<>(); + dataMap.put("resourceId", scenarioTask.getResourceId()); + dataMap.put("points", dataList); + + 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()) { + Coordinate coordinate = subPathMap.get(key); + dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); + } + 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.setLat(insertPoints[0]); + coordinate.setLng(insertPoints[1]); + distanceInfoMap.put(distance, coordinate); + startPoint.set(distance); + SpringUtil.getBean(RedisUtil.class).hset( + scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), + "position", JSON.toJSONString(coordinate)); + + Global.sendCmdInfoQueue.add( + ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, + scenarioTask.getScenarioId(), dataMap)); + + } else if (Double.compare(distance, endPoint.getKey()) == 0) { + NavigableMap subPathMap = distanceInfoMap.subMap(startPoint.get(), + true, endPoint.getKey(), true); + for (Double key : subPathMap.keySet()) { + Coordinate coordinate = subPathMap.get(key); + dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); + } + + startPoint.set(endPoint.getKey()); + Global.sendCmdInfoQueue.add( + ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, + scenarioTask.getScenarioId(), dataMap)); + + } else { + //完成路径 + Global.sendCmdInfoQueue.add( + ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId, + scenarioTask.getScenarioId(), dataMap)); + } + + + } + } catch (Exception e) { + log.error("error::", e); + } + + + }, 0, 1, TimeUnit.SECONDS); + + //房间统一管理定时器;房间关闭后,定时器销毁 + addScheduledExecutorServiceRefenceToRoom(schedule); } } diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index b14dae1..d83d400 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -189,7 +189,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(String.valueOf(suppleAmount)); + supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleAmount))); supplierRequest.setSupplierType("ammunition"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); @@ -201,7 +201,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(String.valueOf(suppleDeath)); + supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleDeath))); supplierRequest.setSupplierType("death"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); @@ -213,7 +213,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(String.valueOf(suppleInjured)); + supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleInjured))); supplierRequest.setSupplierType("injured"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); diff --git a/src/main/java/com/hivekion/room/bean/Coordinate.java b/src/main/java/com/hivekion/room/bean/Coordinate.java new file mode 100644 index 0000000..bf656df --- /dev/null +++ b/src/main/java/com/hivekion/room/bean/Coordinate.java @@ -0,0 +1,19 @@ +package com.hivekion.room.bean; + +import lombok.Data; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class Coordinate { + + private double lng; + private double lat; +} diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index 0f9a9b2..79c4f27 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -47,22 +47,12 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { * 速度 换算为100Km/小时 */ private final double SPEED = 27; - /** - * 距离和坐标的对应关系 - */ - private final TreeMap distanceInfoMap = new TreeMap<>(); - /** - * 开始点坐标 - */ - private final AtomicReference startPoint = new AtomicReference<>(); - /** - * 任务相对与想定的开始时间 - */ - private long taskRelativeStartTime = 0; + /** * 油料消耗速率 */ private double fuelConsumption = 0; + private double fuelThreshold = 0; /** * 消耗任务间隔 */ @@ -85,7 +75,7 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { initEnv(); //初始化环境 initPath(); //初始化路径 - updatePath(); //更新路径 + updatePath(SPEED); //更新路径 fuelConsumption();//油品消耗 } @@ -93,204 +83,52 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { * 初始化环境 */ 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"); + .getProperty("fuel_spreed"); fuelConsumption = Double.parseDouble(fuelConsumptionStr == null ? "0" : fuelConsumptionStr); - - statisticBean = SpringUtil.getBean(StatisticServiceImpl.class).statistic(scenarioTask.getResourceId()); + fuelThreshold = Double.parseDouble(SpringUtil.getBean(Environment.class) + .getProperty("fuel.warn ","0")); + statisticBean = SpringUtil.getBean(StatisticServiceImpl.class) + .statistic(scenarioTask.getResourceId()); } - /** - * 初始化路径 - */ - private void initPath() { - try { - - String url = SpringUtil.getBean(Environment.class).getProperty("path.planning.url"); - String params = url + "?" - + "profile=car" - + "&point=" + scenarioTask.getFromLat() + "," - + scenarioTask.getFromLng() - + "&point=" + scenarioTask.getToLat() + "," - + scenarioTask.getToLng() - + "&points_encoded=false" - + "&algorithm=alternative_route&alternative_route.max_paths=3"; - //获取路线信息 - String result = webClient.get().uri(params) - .retrieve() - .bodyToMono(String.class) - .block(); - - JSONObject pointJson = JSON.parseObject(result); - //获取路径点 - if (pointJson != null) { - JSONObject pointsObj = pointJson.getJSONArray("paths").getJSONObject(0) - .getJSONObject("points"); - JSONArray coordinates = pointsObj.getJSONArray("coordinates"); - //组装信息 - Map dataMap = new HashMap<>(); - dataMap.put("resourceId", scenarioTask.getResourceId()); - dataMap.put("points", coordinates); - //推送路径任务 - Global.sendCmdInfoQueue.add( - ResponseCmdInfo.create(WsCmdTypeEnum.PATH_INIT.getCode(), roomId, - scenarioTask.getScenarioId(), dataMap)); - - redis.hset( - scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "init_path", JSON.toJSONString(coordinates)); - - //计算各个点的累计距离和坐标的对应关系 - double beforeLng = Double.parseDouble(scenarioTask.getFromLng()); - double beforeLat = Double.parseDouble(scenarioTask.getFromLat()); - double total = 0; - for (int i = 0; i < coordinates.size(); i++) { - JSONArray coordinate = coordinates.getJSONArray(i); - Double lng = coordinate.getDouble(0); - - Double lat = coordinate.getDouble(1); - - double distance = MultiPointGeoPosition.haversine(beforeLat, beforeLng, lat, lng); - //当前总距离 - total = total + distance; - //定义坐标对象 - Coordinate coordinateInfo = new Coordinate(); - coordinateInfo.setLat(lat); - coordinateInfo.setLng(lng); - - //记录距离和数组列表直接的索引关系 - distanceInfoMap.put(total, coordinateInfo); - - beforeLng = lng; - beforeLat = lat; - - } - //设置第一个开始位置 - startPoint.set(distanceInfoMap.firstKey()); - } - - } catch (Exception e) { - log.error("error::", e); - } - } - - private void updatePath() { - - ScheduledExecutorService schedule = Executors.newScheduledThreadPool( - 1); - schedule.scheduleWithFixedDelay(() -> { - - try { - if (this.getRoomStatus()) { - - long duringTime = getDuringTime() - taskRelativeStartTime; - - log.info("duringTime::{}", duringTime); - //跑动距离 - double distance = duringTime * SPEED; - //获取大与此距离的第一个路线点key - Entry endPoint = distanceInfoMap.ceilingEntry(distance); - //ws数据 - List dataList = new ArrayList<>(); - HashMap dataMap = new HashMap<>(); - dataMap.put("resourceId", scenarioTask.getResourceId()); - dataMap.put("points", dataList); - - 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()) { - Coordinate coordinate = subPathMap.get(key); - dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); - } - 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.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, - scenarioTask.getScenarioId(), dataMap)); - - } else if (Double.compare(distance, endPoint.getKey()) == 0) { - NavigableMap subPathMap = distanceInfoMap.subMap(startPoint.get(), - true, endPoint.getKey(), true); - for (Double key : subPathMap.keySet()) { - Coordinate coordinate = subPathMap.get(key); - dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); - } - - startPoint.set(endPoint.getKey()); - Global.sendCmdInfoQueue.add( - ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, - scenarioTask.getScenarioId(), dataMap)); - - } else { - //完成路径 - Global.sendCmdInfoQueue.add( - ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId, - scenarioTask.getScenarioId(), dataMap)); - } - } - } catch (Exception e) { - log.error("error::", e); - } - }, 0, 1, TimeUnit.SECONDS); - - //房间统一管理定时器;房间关闭后,定时器销毁 - addScheduledExecutorServiceRefenceToRoom(schedule); - } - private void fuelConsumption() { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( 1); schedule.scheduleWithFixedDelay(() -> { if (getRoomStatus()) { - double total = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; + double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; + + + //更新redis中油品的消耗 Object currentFuelObj = redis.hget( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuel"); + "fuelConsume"); if (currentFuelObj != null) { double fuel = Double.parseDouble(currentFuelObj.toString()); - if (fuel > 0) { - fuel = fuel - total < 0 ? 0 : fuel - total; + fuel = fuel + currentUseUp; //更新值 redis.hset( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuel", fuel); - //推送前端 + "fuelConsume", fuel); + + double totalFuel = statisticBean.getFuel().getTotal(); + if(fuel*100/totalFuel Date: Fri, 19 Sep 2025 12:16:49 +0800 Subject: [PATCH 06/21] =?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 | 10 +++++++--- src/main/java/com/hivekion/room/bean/MoveRootTask.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 8016256..73c94da 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -14,7 +14,6 @@ import com.hivekion.enums.WsCmdTypeEnum; import com.hivekion.room.RoomManager; import com.hivekion.room.func.TaskAction; import com.hivekion.scenario.entity.ScenarioTask; -import com.hivekion.statistic.bean.StatisticBean; import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; @@ -46,6 +45,7 @@ import org.springframework.web.reactive.function.client.WebClient; */ @Slf4j public abstract class AbtParentTask implements TaskAction { + /** * 开始点坐标 */ @@ -125,7 +125,7 @@ public abstract class AbtParentTask implements TaskAction { } - protected void initPath(){ + protected void initPath() { try { String url = SpringUtil.getBean(Environment.class).getProperty("path.planning.url"); @@ -195,7 +195,8 @@ public abstract class AbtParentTask implements TaskAction { log.error("error::", e); } } - protected void updatePath(double speed) { + + protected void updatePath(double speed, TaskAction action) { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( 1); @@ -264,6 +265,9 @@ public abstract class AbtParentTask implements TaskAction { scenarioTask.getScenarioId(), dataMap)); } else { + if (action != null) { + action.doSomeThing(); + } //完成路径 Global.sendCmdInfoQueue.add( ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId, diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index 79c4f27..f6d7b45 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -75,7 +75,7 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { initEnv(); //初始化环境 initPath(); //初始化路径 - updatePath(SPEED); //更新路径 + updatePath(SPEED,null); //更新路径 fuelConsumption();//油品消耗 } From 1b96fda87d1bba4ac749e10eb3dfcb38bf5c20a9 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 12:23:59 +0800 Subject: [PATCH 07/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 +++++----- src/main/resources/application-prod.properties | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 1cb39b1..bd82bc5 100644 --- a/pom.xml +++ b/pom.xml @@ -56,11 +56,11 @@ lettuce-core 6.2.4.RELEASE --> - + 2.12.0 + @@ -190,11 +190,11 @@ org.springframework.boot spring-boot-starter-data-redis - + com.baomidou dynamic-datasource-spring-boot-starter diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index cae530e..3b749cf 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -10,7 +10,14 @@ spring.redis.host=192.168.0.53 spring.redis.port=6379 #spring.redis.password=123 spring.redis.timeout=5000 - +spring.redis.lettuce.shutdown-timeout=5000 +#spring.redis.lettuce.timeout=5000 +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.min-idle=0 +spring.redis.lettuce.pool.max-wait=2000ms +spring.redis.lettuce.pool.timeout=5000ms # ִгʱ +spring.redis.lettuce.pool.connect-timeout=10000ms # ӽʱ server.port=8099 From 0315e5a8b0cdeb8789f28ee9286b8c138d625684 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 12:26:43 +0800 Subject: [PATCH 08/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/supplier/entity/SupplierRequest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java b/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java index 7b90516..aef5424 100644 --- a/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java +++ b/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java @@ -34,7 +34,6 @@ public class SupplierRequest implements Serializable { private String supplierType; @TableField(value="SUPPLIER_NUM") private String supplierNum; - @TableField(value="LAT") private String lat; @TableField(value="LNG") From d57e9d1948b465c684b7df545cc17fc7726ab327 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 12:29:25 +0800 Subject: [PATCH 09/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/room/bean/BattleRootTask.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index d83d400..b14dae1 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -189,7 +189,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleAmount))); + supplierRequest.setSupplierNum(String.valueOf(suppleAmount)); supplierRequest.setSupplierType("ammunition"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); @@ -201,7 +201,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleDeath))); + supplierRequest.setSupplierNum(String.valueOf(suppleDeath)); supplierRequest.setSupplierType("death"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); @@ -213,7 +213,7 @@ public class BattleRootTask extends AbtParentTask { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); - supplierRequest.setSupplierNum(Double.valueOf(String.valueOf(suppleInjured))); + supplierRequest.setSupplierNum(String.valueOf(suppleInjured)); supplierRequest.setSupplierType("injured"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); From 0d3615bf86d64a0e18af16213ee1749fa971d0aa 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 13:58:18 +0800 Subject: [PATCH 10/21] =?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/MoveRootTask.java | 117 ++---------------- .../com/hivekion/room/bean/SupplierTask.java | 84 ++++++++++++- 2 files changed, 91 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index f6d7b45..f630946 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -1,33 +1,14 @@ package com.hivekion.room.bean; import cn.hutool.extra.spring.SpringUtil; -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; -import java.util.Map; -import java.util.Map.Entry; -import java.util.NavigableMap; -import java.util.TreeMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; @@ -97,8 +78,6 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { - - private void fuelConsumption() { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( @@ -107,16 +86,14 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { if (getRoomStatus()) { double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; - - //更新redis中油品的消耗 Object currentFuelObj = redis.hget( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuelConsume"); + "fuel"); if (currentFuelObj != null) { double fuel = Double.parseDouble(currentFuelObj.toString()); - fuel = fuel + currentUseUp; - //更新值 + fuel = fuel - currentUseUp; + redis.hset( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "fuelConsume", fuel); @@ -124,11 +101,12 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { double totalFuel = statisticBean.getFuel().getTotal(); if(fuel*100/totalFuel Date: Fri, 19 Sep 2025 14:56:12 +0800 Subject: [PATCH 11/21] =?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/CodeGenerator.java | 4 +- .../com/hivekion/room/bean/MoveRootTask.java | 76 ++++++++++--- .../java/com/hivekion/room/bean/Room.java | 4 +- .../scenario/entity/ScenarioTask.java | 2 +- .../scenario/mapper/BattleSupplierMapper.java | 4 +- .../service/IBattleSupplierService.java | 2 + .../impl/BattleSupplierServiceImpl.java | 18 ++- .../supplier/entity/SupplierRequest.java | 104 +++++------------- .../mapper/tbl/BattleSupplierMapper.xml | 10 +- 9 files changed, 119 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/hivekion/CodeGenerator.java b/src/main/java/com/hivekion/CodeGenerator.java index ef2ea8a..76df43b 100644 --- a/src/main/java/com/hivekion/CodeGenerator.java +++ b/src/main/java/com/hivekion/CodeGenerator.java @@ -28,12 +28,12 @@ public class CodeGenerator { }) .packageConfig(builder -> { builder.parent("com.hivekion") // 设置父包名 - .moduleName("basedata") // 设置模块名(可选) + .moduleName("supplier") // 设置模块名(可选) .pathInfo(Collections.singletonMap(OutputFile.xml, basePath + "/src/main/resources/mapper/tbl")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { - builder.addInclude("IMG_VEHICLE_IMAGE".toLowerCase()) // 设置需要生成的表名(多个用逗号分隔) + builder.addInclude("TBL_BATTLE_SUPPLIER".toLowerCase()) // 设置需要生成的表名(多个用逗号分隔) .addTablePrefix("tbl_"); // 设置过滤表前缀 }) .execute(); diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index f630946..ec9e2e4 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -2,13 +2,23 @@ package com.hivekion.room.bean; import cn.hutool.extra.spring.SpringUtil; import com.hivekion.common.redis.RedisUtil; +import com.hivekion.common.uuid.IdUtils; +import com.hivekion.room.RoomManager; import com.hivekion.room.func.TaskAction; +import com.hivekion.scenario.entity.ScenarioResource; import com.hivekion.scenario.entity.ScenarioTask; +import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl; +import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl; import com.hivekion.statistic.bean.StatisticBean; import com.hivekion.statistic.service.impl.StatisticServiceImpl; +import com.hivekion.supplier.entity.SupplierRequest; +import com.hivekion.supplier.service.impl.SupplierRequestServiceImpl; +import java.time.LocalDateTime; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; @@ -28,7 +38,10 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { * 速度 换算为100Km/小时 */ private final double SPEED = 27; - + /** + * 需求产生标志 + */ + private final AtomicBoolean requestFlag = new AtomicBoolean(false); /** * 油料消耗速率 */ @@ -56,7 +69,7 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { initEnv(); //初始化环境 initPath(); //初始化路径 - updatePath(SPEED,null); //更新路径 + updatePath(SPEED, null); //更新路径 fuelConsumption();//油品消耗 } @@ -65,19 +78,17 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { */ private void initEnv() { - //获取油品消耗规则 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")); + .getProperty("fuel.warn ", "0")); statisticBean = SpringUtil.getBean(StatisticServiceImpl.class) .statistic(scenarioTask.getResourceId()); } - private void fuelConsumption() { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( @@ -94,19 +105,21 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { double fuel = Double.parseDouble(currentFuelObj.toString()); fuel = fuel - currentUseUp; - redis.hset( - scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), - "fuelConsume", fuel); + 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(); - double totalFuel = statisticBean.getFuel().getTotal(); - if(fuel*100/totalFuel resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class) + .selectSupplierResource(scenarioTask.getResourceId()); + if (!resourceList.isEmpty()) { + ScenarioTask task = new ScenarioTask(); + task.setId(IdUtils.simpleUUID()); + task.setScenarioId(scenarioTask.getScenarioId()); + task.setResourceId(scenarioTask.getResourceId()); + task.setTaskType("6"); + task.setSupplierNum(statisticBean.getFuel().getTotal()); + task.setToLat(scenarioTask.getToLat()); + task.setToLng(scenarioTask.getToLng()); + task.setStartTime(LocalDateTime.now()); + task.setFromLat(resourceList.get(0).getLat()); + task.setFromLng(resourceList.get(0).getLng()); + task.setFrom("general"); + SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task); + //增加到房间任务 + SupplierTask supplierTask = new SupplierTask(task, roomId); + //立即执行 + RoomManager.addAction(roomId, 0, supplierTask); + } + } } diff --git a/src/main/java/com/hivekion/room/bean/Room.java b/src/main/java/com/hivekion/room/bean/Room.java index 5ac43d9..6929061 100644 --- a/src/main/java/com/hivekion/room/bean/Room.java +++ b/src/main/java/com/hivekion/room/bean/Room.java @@ -119,9 +119,7 @@ public class Room implements AutoCloseable { return duringTime.get(); } - public long getTotalTime() { - return totalTime.get(); - } + // 启动定时任务 private void startTask() { diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java index faae520..9a9c900 100644 --- a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java +++ b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java @@ -64,5 +64,5 @@ public class ScenarioTask implements Serializable { private String supplierResourceId; @TableField(value = "supplier_num") private double supplierNum; - + private String from; } diff --git a/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java b/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java index 0426a64..08c0708 100644 --- a/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java +++ b/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java @@ -2,6 +2,8 @@ package com.hivekion.scenario.mapper; import com.hivekion.scenario.entity.BattleSupplier; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hivekion.scenario.entity.ScenarioResource; +import java.util.List; /** *

@@ -12,5 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @since 2025-09-15 */ public interface BattleSupplierMapper extends BaseMapper { - + List selectSupplierResource(String battleResourceId); } diff --git a/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java b/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java index ee247d7..494ab14 100644 --- a/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java +++ b/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java @@ -2,6 +2,7 @@ package com.hivekion.scenario.service; import com.hivekion.scenario.entity.BattleSupplier; import com.baomidou.mybatisplus.extension.service.IService; +import com.hivekion.scenario.entity.ScenarioResource; import java.util.List; import java.util.Set; @@ -16,4 +17,5 @@ import java.util.Set; public interface IBattleSupplierService extends IService { public Set getBattleResourceBySupplierId(String id); public Set getSupplierIdByBattleId(String id); + List selectSupplierResource(String battleResourceId); } diff --git a/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java index d11c8a6..b78608f 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java @@ -1,11 +1,11 @@ package com.hivekion.scenario.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hivekion.scenario.entity.BattleSupplier; +import com.hivekion.scenario.entity.ScenarioResource; import com.hivekion.scenario.mapper.BattleSupplierMapper; import com.hivekion.scenario.service.IBattleSupplierService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -13,19 +13,20 @@ import org.springframework.stereotype.Service; /** *

- * 服务实现类 + * 服务实现类 *

* * @author liDongYu * @since 2025-09-15 */ @Service -public class BattleSupplierServiceImpl extends ServiceImpl implements IBattleSupplierService { +public class BattleSupplierServiceImpl extends + ServiceImpl implements IBattleSupplierService { @Override public Set getBattleResourceBySupplierId(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("supplier_resource_id",id); + queryWrapper.eq("supplier_resource_id", id); List list = this.list(queryWrapper); return list.stream().map(BattleSupplier::getBattleResourceId).collect(Collectors.toSet()); } @@ -33,9 +34,14 @@ public class BattleSupplierServiceImpl extends ServiceImpl getSupplierIdByBattleId(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("battle_resource_id",id); + queryWrapper.eq("battle_resource_id", id); List list = this.list(queryWrapper); return list.stream().map(BattleSupplier::getSupplierResourceId).collect(Collectors.toSet()); } + + @Override + public List selectSupplierResource(String battleResourceId) { + return this.baseMapper.selectSupplierResource(battleResourceId); + } } diff --git a/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java b/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java index aef5424..e026a20 100644 --- a/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java +++ b/src/main/java/com/hivekion/supplier/entity/SupplierRequest.java @@ -2,102 +2,54 @@ package com.hivekion.supplier.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; import java.io.Serializable; import java.time.LocalDateTime; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** *

- * + * *

* * @author liDongYu * @since 2025-09-18 */ +@Data @TableName("TBL_SUPPLIER_REQUEST") @ApiModel(value = "SupplierRequest对象", description = "") public class SupplierRequest implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @TableField(value="ID") - private String id; + @TableField(value = "ID") + private String id; - @TableField(value="GENERAL_TIME") - private LocalDateTime generalTime; + @TableField(value = "GENERAL_TIME") + private LocalDateTime generalTime; - @TableField(value="FROM_RESOURCE_ID") - private String fromResourceId; + @TableField(value = "FROM_RESOURCE_ID") + private String fromResourceId; - @TableField(value="SUPPLIER_TYPE") - private String supplierType; - @TableField(value="SUPPLIER_NUM") - private String supplierNum; - @TableField(value="LAT") - private String lat; - @TableField(value="LNG") - private String lng; + @TableField(value = "SUPPLIER_TYPE") + private String supplierType; + @TableField(value = "SUPPLIER_NUM") + private String supplierNum; + @TableField(value = "LAT") + private String lat; + @TableField(value = "LNG") + private String lng; + /** + * 0 未处理 ;1 处理 + */ + @TableField(value = "handle_flag") + private int handleFlag; - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public LocalDateTime getGeneralTime() { - return generalTime; - } - - public void setGeneralTime(LocalDateTime generalTime) { - this.generalTime = generalTime; - } - - public String getFromResourceId() { - return fromResourceId; - } - - public void setFromResourceId(String fromResourceId) { - this.fromResourceId = fromResourceId; - } - - public String getSupplierType() { - return supplierType; - } - - public void setSupplierType(String supplierType) { - this.supplierType = supplierType; - } - - public String getSupplierNum() { - return supplierNum; - } - - public void setSupplierNum(String supplierNum) { - this.supplierNum = supplierNum; - } - - public String getLat() { - return lat; - } - - public void setLat(String lat) { - this.lat = lat; - } - - public String getLng() { - return lng; - } - - public void setLng(String lng) { - this.lng = lng; - } - - @Override - public String toString() { - return "SupplierRequest{" + + @Override + public String toString() { + return "SupplierRequest{" + "id = " + id + ", generalTime = " + generalTime + ", fromResourceId = " + fromResourceId + @@ -106,5 +58,5 @@ public class SupplierRequest implements Serializable { ", lat = " + lat + ", lng = " + lng + "}"; - } + } } diff --git a/src/main/resources/mapper/tbl/BattleSupplierMapper.xml b/src/main/resources/mapper/tbl/BattleSupplierMapper.xml index 8b15571..0de6659 100644 --- a/src/main/resources/mapper/tbl/BattleSupplierMapper.xml +++ b/src/main/resources/mapper/tbl/BattleSupplierMapper.xml @@ -1,5 +1,11 @@ - + - + From 4409df8984d726575d4787e1c3eb228bbcafbe22 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 15:05:41 +0800 Subject: [PATCH 12/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hivekion/room/bean/BattleRootTask.java | 60 ++++--- .../controller/BattleConsumeController.java | 18 +++ .../scenario/entity/BattleConsume.java | 153 ++++++++++++++++++ .../scenario/mapper/BattleConsumeMapper.java | 16 ++ .../service/IBattleConsumeService.java | 16 ++ .../impl/BattleConsumeServiceImpl.java | 20 +++ .../resources/application-rule.properties | 10 +- .../mapper/tbl/BattleConsumeMapper.xml | 5 + 8 files changed, 273 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java create mode 100644 src/main/java/com/hivekion/scenario/entity/BattleConsume.java create mode 100644 src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java create mode 100644 src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java create mode 100644 src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java create mode 100644 src/main/resources/mapper/tbl/BattleConsumeMapper.xml diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index b14dae1..4d8f653 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -8,7 +8,9 @@ import com.hivekion.Global; import com.hivekion.common.entity.ResponseCmdInfo; import com.hivekion.common.redis.RedisUtil; import com.hivekion.common.uuid.IdUtils; +import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.entity.ScenarioTask; +import com.hivekion.scenario.service.IBattleConsumeService; import com.hivekion.statistic.bean.*; import com.hivekion.statistic.service.StatisticService; import com.hivekion.statistic.service.impl.StatisticServiceImpl; @@ -18,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.util.CollectionUtils; +import javax.swing.*; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; @@ -42,6 +45,8 @@ public class BattleRootTask extends AbtParentTask { private ISupplierRequestService supplierRequestService; + private IBattleConsumeService battleConsumeService; + private static final Integer DEATH_SPREED = 3; private static final Integer INJURED_SPREED = 3; private static final Double AMMUNITION_SPREED = 2.6D; @@ -66,6 +71,9 @@ public class BattleRootTask extends AbtParentTask { if(supplierRequestService == null){ supplierRequestService = SpringUtil.getBean(ISupplierRequestService.class); } + if(battleConsumeService == null){ + battleConsumeService = SpringUtil.getBean(IBattleConsumeService.class); + } } //执行一次 @Override @@ -85,11 +93,11 @@ public class BattleRootTask extends AbtParentTask { // statisticBean.getAmmunition().getCurrent() //初始化本次战斗任务各种资源数 - battleParams.put("ammunition",Double.valueOf(statisticBean.getAmmunition().getCurrent()).toString()); - battleParams.put("food",Double.valueOf(statisticBean.getFood().getCurrent()).toString()); - battleParams.put("fuel",Double.valueOf(statisticBean.getFuel().getCurrent()).toString()); - battleParams.put("medical",Double.valueOf(statisticBean.getMedical().getCurrent()).toString()); - battleParams.put("water",Double.valueOf(statisticBean.getWater().getCurrent()).toString()); + battleParams.put("ammunition",Double.valueOf(statisticBean.getAmmunition().getTotal()).toString()); + battleParams.put("food",Double.valueOf(statisticBean.getFood().getTotal()).toString()); + battleParams.put("fuel",Double.valueOf(statisticBean.getFuel().getTotal()).toString()); + battleParams.put("medical",Double.valueOf(statisticBean.getMedical().getTotal()).toString()); + battleParams.put("water",Double.valueOf(statisticBean.getWater().getTotal()).toString()); battleParams.put("death",Double.valueOf(statisticBean.getPerson().getDeath()).toString()); battleParams.put("injured",Double.valueOf(statisticBean.getPerson().getInjured()).toString()); battleParams.put("teamLat",statisticBean.getTeam().getLat().toString()); @@ -169,23 +177,34 @@ public class BattleRootTask extends AbtParentTask { jsonObject.put("teamLng",teamLng); sendConsumeMsg.setData(jsonObject); Global.sendCmdInfoQueue.add(sendConsumeMsg); + BattleConsume battleConsume = new BattleConsume(); + battleConsume.setLat(teamLat); + battleConsume.setLng(teamLng); + battleConsume.setId(IdUtils.simpleUUID()); + battleConsume.setAmmunition(ammunitionConsume); + battleConsume.setDeath(Integer.valueOf(deathConsume.toString())); + battleConsume.setInjured(Integer.valueOf(injuredConsume.toString())); + battleConsume.setFood(foodConsume); + battleConsume.setFuel(fuelConsume); + battleConsume.setMedical(medicalConsume); + battleConsume.setWater(waterConsume); + battleConsume.setResourceId(scenarioTask.getResourceId()); + battleConsumeService.save(battleConsume); }catch (Exception ex){ log.error("==================推送消耗數據 失败============================================",ex.getMessage()); } try { LocalDateTime currentDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); - String death = SpringUtil.getBean(Environment.class).getProperty("battle.death.warn"); - String injured = SpringUtil.getBean(Environment.class).getProperty("battle.injured.warn"); - String ammunition = SpringUtil.getBean(Environment.class).getProperty("battle.ammunition.warn"); + String death = SpringUtil.getBean(Environment.class).getProperty("death.warn"); + String injured = SpringUtil.getBean(Environment.class).getProperty("injured.warn"); + String ammunition = SpringUtil.getBean(Environment.class).getProperty("ammunition.warn"); log.info("===========person ammunition==={}===={}====={}========",death,injured,ammunition); -// String food = SpringUtil.getBean(Environment.class).getProperty("battle.food.warn"); -// String water = SpringUtil.getBean(Environment.class).getProperty("battle.water.warn"); -// String fuel = SpringUtil.getBean(Environment.class).getProperty("battle.fuel.warn"); -// String medical = SpringUtil.getBean(Environment.class).getProperty("battle.medical.warn"); - - if(Double.valueOf(battleParams.get("ammunition").toString()) <= Double.valueOf(ammunition) && suppleFlagMap.get("ammunition") == false){ - + HashMap battleConsumeMap = (HashMap) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId()); + Double restAmmunition = Double.valueOf(battleConsumeMap.get("ammunition").toString()); + StatisticBean battleResourceStat = statisticService.statistic(scenarioTask.getResourceId()); + Double ammunitionConsumeRate = restAmmunition/battleResourceStat.getAmmunition().getTotal()*100; + if(Double.valueOf(ammunitionConsumeRate) <= Double.valueOf(ammunition) && suppleFlagMap.get("ammunition") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); @@ -197,7 +216,9 @@ public class BattleRootTask extends AbtParentTask { supplierRequestService.save(supplierRequest); suppleFlagMap.put("ammunition",true) ; } - if(Long.valueOf(battleParams.get("death").toString()) <= Long.valueOf(death) && suppleFlagMap.get("death") == false){ + Long restNoDeath = Long.valueOf(battleConsumeMap.get("death").toString()); + Long deathConsumeRate = restNoDeath*100/battleResourceStat.getPerson().getDeath(); + if(deathConsumeRate <= Long.valueOf(death) && suppleFlagMap.get("death") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); @@ -209,7 +230,9 @@ public class BattleRootTask extends AbtParentTask { supplierRequestService.save(supplierRequest); suppleFlagMap.put("death",true) ; } - if(Long.valueOf(battleParams.get("injured").toString()) <= Long.valueOf(injured) && suppleFlagMap.get("injured") == false){ + Long restNoInjured = Long.valueOf(battleConsumeMap.get("injured").toString()); + Long injuredConsumeRate = restNoInjured*100/battleResourceStat.getPerson().getDeath(); + if(Long.valueOf(injuredConsumeRate) <= Long.valueOf(injured) && suppleFlagMap.get("injured") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); @@ -229,14 +252,11 @@ public class BattleRootTask extends AbtParentTask { } }); - } - } - } diff --git a/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java b/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java new file mode 100644 index 0000000..cb17d98 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java @@ -0,0 +1,18 @@ +package com.hivekion.scenario.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.stereotype.Controller; + +/** + *

+ * 战斗消耗 前端控制器 + *

+ * + * @author liDongYu + * @since 2025-09-19 + */ +@Controller +@RequestMapping("/scenario/battleConsume") +public class BattleConsumeController { + +} diff --git a/src/main/java/com/hivekion/scenario/entity/BattleConsume.java b/src/main/java/com/hivekion/scenario/entity/BattleConsume.java new file mode 100644 index 0000000..7c18d94 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/entity/BattleConsume.java @@ -0,0 +1,153 @@ +package com.hivekion.scenario.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + *

+ * 战斗消耗 + *

+ * + * @author liDongYu + * @since 2025-09-19 + */ +@TableName("TBL_BATTLE_CONSUME") +@ApiModel(value = "BattleConsume对象", description = "战斗消耗") +public class BattleConsume implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("物理主键") + private String id; + + @ApiModelProperty("资源编号") + private String resourceId; + + private Double ammunition; + + private Integer death; + + private Integer injured; + + private Double fuel; + + private Double food; + + private Double water; + + private Double medical; + + private String lat; + + private String lng; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getResourceId() { + return resourceId; + } + + public void setResourceId(String resourceId) { + this.resourceId = resourceId; + } + + + + public Integer getDeath() { + return death; + } + + public void setDeath(Integer death) { + this.death = death; + } + + public Integer getInjured() { + return injured; + } + + public void setInjured(Integer injured) { + this.injured = injured; + } + + public Double getAmmunition() { + return ammunition; + } + + public void setAmmunition(Double ammunition) { + this.ammunition = ammunition; + } + + public Double getFuel() { + return fuel; + } + + public void setFuel(Double fuel) { + this.fuel = fuel; + } + + public Double getFood() { + return food; + } + + public void setFood(Double food) { + this.food = food; + } + + public Double getWater() { + return water; + } + + public void setWater(Double water) { + this.water = water; + } + + public Double getMedical() { + return medical; + } + + public void setMedical(Double medical) { + this.medical = medical; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + @Override + public String toString() { + return "BattleConsume{" + + "id = " + id + + ", resourceId = " + resourceId + + ", ammunition = " + ammunition + + ", death = " + death + + ", injured = " + injured + + ", fuel = " + fuel + + ", food = " + food + + ", water = " + water + + ", medical = " + medical + + ", lat = " + lat + + ", lng = " + lng + + "}"; + } +} diff --git a/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java b/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java new file mode 100644 index 0000000..e8f29e7 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java @@ -0,0 +1,16 @@ +package com.hivekion.scenario.mapper; + +import com.hivekion.scenario.entity.BattleConsume; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 战斗消耗 Mapper 接口 + *

+ * + * @author liDongYu + * @since 2025-09-19 + */ +public interface BattleConsumeMapper extends BaseMapper { + +} diff --git a/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java b/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java new file mode 100644 index 0000000..6d74af7 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java @@ -0,0 +1,16 @@ +package com.hivekion.scenario.service; + +import com.hivekion.scenario.entity.BattleConsume; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 战斗消耗 服务类 + *

+ * + * @author liDongYu + * @since 2025-09-19 + */ +public interface IBattleConsumeService extends IService { + +} diff --git a/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java new file mode 100644 index 0000000..3b5c151 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java @@ -0,0 +1,20 @@ +package com.hivekion.scenario.service.impl; + +import com.hivekion.scenario.entity.BattleConsume; +import com.hivekion.scenario.mapper.BattleConsumeMapper; +import com.hivekion.scenario.service.IBattleConsumeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 战斗消耗 服务实现类 + *

+ * + * @author liDongYu + * @since 2025-09-19 + */ +@Service +public class BattleConsumeServiceImpl extends ServiceImpl implements IBattleConsumeService { + +} diff --git a/src/main/resources/application-rule.properties b/src/main/resources/application-rule.properties index 853a04d..71b684e 100644 --- a/src/main/resources/application-rule.properties +++ b/src/main/resources/application-rule.properties @@ -7,8 +7,8 @@ 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 +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 diff --git a/src/main/resources/mapper/tbl/BattleConsumeMapper.xml b/src/main/resources/mapper/tbl/BattleConsumeMapper.xml new file mode 100644 index 0000000..8537969 --- /dev/null +++ b/src/main/resources/mapper/tbl/BattleConsumeMapper.xml @@ -0,0 +1,5 @@ + + + + + From de3028c19a94b1f755274e8d13006b825ff9f904 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:11:47 +0800 Subject: [PATCH 13/21] =?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/MoveRootTask.java | 2 +- src/main/java/com/hivekion/scenario/entity/ScenarioTask.java | 3 ++- .../com/hivekion/system/controller/UserLoginController.java | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java index ec9e2e4..ce09eb9 100644 --- a/src/main/java/com/hivekion/room/bean/MoveRootTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java @@ -156,7 +156,7 @@ public class MoveRootTask extends AbtParentTask implements TaskAction { task.setStartTime(LocalDateTime.now()); task.setFromLat(resourceList.get(0).getLat()); task.setFromLng(resourceList.get(0).getLng()); - task.setFrom("general"); + task.setFromSource("general"); SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task); //增加到房间任务 SupplierTask supplierTask = new SupplierTask(task, roomId); diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java index 9a9c900..63ec65c 100644 --- a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java +++ b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java @@ -64,5 +64,6 @@ public class ScenarioTask implements Serializable { private String supplierResourceId; @TableField(value = "supplier_num") private double supplierNum; - private String from; + @TableField(value="from_source") + private String fromSource; } diff --git a/src/main/java/com/hivekion/system/controller/UserLoginController.java b/src/main/java/com/hivekion/system/controller/UserLoginController.java index ccd66a1..964a9cb 100644 --- a/src/main/java/com/hivekion/system/controller/UserLoginController.java +++ b/src/main/java/com/hivekion/system/controller/UserLoginController.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -49,6 +50,7 @@ import org.springframework.web.bind.annotation.RestController; @Validated @RestController @Api(value = "登录管理", tags = {"认证管理-登录"}) +@Slf4j public class UserLoginController { @Autowired @@ -161,6 +163,7 @@ public class UserLoginController { throw new BusinessException(500, "客户端编码为空"); } String capText = captchaProducer.createText(); + log.info("capText::{}",capText); try { Object o = redisUtil.get(clientCode); if (o != null) { 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 14/21] =?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 a40b23cbe9e1726a6862c2b203440971a610bb49 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 15:30:45 +0800 Subject: [PATCH 15/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hivekion/room/bean/BattleRootTask.java | 19 ++++++++++--------- .../scenario/entity/BattleConsume.java | 2 ++ .../resources/application-rule.properties | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index 4d8f653..4e29016 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -98,8 +98,8 @@ public class BattleRootTask extends AbtParentTask { battleParams.put("fuel",Double.valueOf(statisticBean.getFuel().getTotal()).toString()); battleParams.put("medical",Double.valueOf(statisticBean.getMedical().getTotal()).toString()); battleParams.put("water",Double.valueOf(statisticBean.getWater().getTotal()).toString()); - battleParams.put("death",Double.valueOf(statisticBean.getPerson().getDeath()).toString()); - battleParams.put("injured",Double.valueOf(statisticBean.getPerson().getInjured()).toString()); + battleParams.put("death",Integer.valueOf(statisticBean.getPerson().getDeath()).toString()); + battleParams.put("injured",Integer.valueOf(statisticBean.getPerson().getInjured()).toString()); battleParams.put("teamLat",statisticBean.getTeam().getLat().toString()); battleParams.put("teamLng",statisticBean.getTeam().getLng().toString()); battleParams.put("duringTime",Long.valueOf(initDuringTime).toString()); @@ -156,8 +156,8 @@ public class BattleRootTask extends AbtParentTask { battleParams.put("fuel",Double.valueOf(fuel - fuelConsume).toString()); battleParams.put("medical",Double.valueOf(medical - medicalConsume).toString()); battleParams.put("water",Double.valueOf(water - waterConsume).toString()); - battleParams.put("death",Long.valueOf(death - deathConsume).toString()); - battleParams.put("injured",Long.valueOf(injured - injuredConsume).toString()); + battleParams.put("death",Long.valueOf(death+deathConsume).toString()); + battleParams.put("injured",Long.valueOf(injured +injuredConsume).toString()); battleParams.put("duringTime",Long.valueOf(duringTime).toString()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), battleParams); }catch (Exception ex){ @@ -191,6 +191,7 @@ public class BattleRootTask extends AbtParentTask { battleConsume.setResourceId(scenarioTask.getResourceId()); battleConsumeService.save(battleConsume); }catch (Exception ex){ + ex.printStackTrace(); log.error("==================推送消耗數據 失败============================================",ex.getMessage()); } @@ -216,9 +217,9 @@ public class BattleRootTask extends AbtParentTask { supplierRequestService.save(supplierRequest); suppleFlagMap.put("ammunition",true) ; } - Long restNoDeath = Long.valueOf(battleConsumeMap.get("death").toString()); - Long deathConsumeRate = restNoDeath*100/battleResourceStat.getPerson().getDeath(); - if(deathConsumeRate <= Long.valueOf(death) && suppleFlagMap.get("death") == false){ + Long restDeath = Long.valueOf(battleConsumeMap.get("death").toString()); + Long deathConsumeRate = restDeath*100/battleResourceStat.getPerson().getTotal(); + if(deathConsumeRate >= Long.valueOf(death) && suppleFlagMap.get("death") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); @@ -230,8 +231,8 @@ public class BattleRootTask extends AbtParentTask { supplierRequestService.save(supplierRequest); suppleFlagMap.put("death",true) ; } - Long restNoInjured = Long.valueOf(battleConsumeMap.get("injured").toString()); - Long injuredConsumeRate = restNoInjured*100/battleResourceStat.getPerson().getDeath(); + Long restInjured = Long.valueOf(battleConsumeMap.get("injured").toString()); + Long injuredConsumeRate = restInjured*100/battleResourceStat.getPerson().getTotal(); if(Long.valueOf(injuredConsumeRate) <= Long.valueOf(injured) && suppleFlagMap.get("injured") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); diff --git a/src/main/java/com/hivekion/scenario/entity/BattleConsume.java b/src/main/java/com/hivekion/scenario/entity/BattleConsume.java index 7c18d94..ef2fe86 100644 --- a/src/main/java/com/hivekion/scenario/entity/BattleConsume.java +++ b/src/main/java/com/hivekion/scenario/entity/BattleConsume.java @@ -1,5 +1,6 @@ package com.hivekion.scenario.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; @@ -24,6 +25,7 @@ public class BattleConsume implements Serializable { private String id; @ApiModelProperty("资源编号") + @TableField(value = "resource_id") private String resourceId; private Double ammunition; diff --git a/src/main/resources/application-rule.properties b/src/main/resources/application-rule.properties index 71b684e..b73df47 100644 --- a/src/main/resources/application-rule.properties +++ b/src/main/resources/application-rule.properties @@ -1,5 +1,5 @@ -injured.warn = 20 -death.warn = 10 +injured.warn = 60 +death.warn = 56 ammunition.warn = 3 food.warn = 3 water.warn = 3 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 16/21] =?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 7d144a39bbaf88ba987877c66534ef011baa4342 Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 15:43:17 +0800 Subject: [PATCH 17/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/room/bean/BattleRootTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index 4e29016..e997018 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -98,6 +98,7 @@ public class BattleRootTask extends AbtParentTask { battleParams.put("fuel",Double.valueOf(statisticBean.getFuel().getTotal()).toString()); battleParams.put("medical",Double.valueOf(statisticBean.getMedical().getTotal()).toString()); battleParams.put("water",Double.valueOf(statisticBean.getWater().getTotal()).toString()); + battleParams.put("person",Integer.valueOf(statisticBean.getPerson().getTotal()).toString()); battleParams.put("death",Integer.valueOf(statisticBean.getPerson().getDeath()).toString()); battleParams.put("injured",Integer.valueOf(statisticBean.getPerson().getInjured()).toString()); battleParams.put("teamLat",statisticBean.getTeam().getLat().toString()); @@ -182,8 +183,8 @@ public class BattleRootTask extends AbtParentTask { battleConsume.setLng(teamLng); battleConsume.setId(IdUtils.simpleUUID()); battleConsume.setAmmunition(ammunitionConsume); - battleConsume.setDeath(Integer.valueOf(deathConsume.toString())); - battleConsume.setInjured(Integer.valueOf(injuredConsume.toString())); + battleConsume.setDeath(Integer.valueOf(Double.valueOf(deathConsume).intValue())); + battleConsume.setInjured(Integer.valueOf(Double.valueOf(injuredConsume).intValue())); battleConsume.setFood(foodConsume); battleConsume.setFuel(fuelConsume); battleConsume.setMedical(medicalConsume); 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 18/21] =?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 19/21] =?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()+""); } From ea615272c09a359a3836da8eb2f76cf3a9d609bb Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 16:30:13 +0800 Subject: [PATCH 20/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/room/bean/BattleRootTask.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index e997018..daf1bb7 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -177,6 +177,9 @@ public class BattleRootTask extends AbtParentTask { jsonObject.put("teamLat",teamLat); jsonObject.put("teamLng",teamLng); sendConsumeMsg.setData(jsonObject); + sendConsumeMsg.setRoom(roomId); + sendConsumeMsg.setScenarioId(scenarioTask.getScenarioId()); + sendConsumeMsg.setCmdType("battleConsume"); Global.sendCmdInfoQueue.add(sendConsumeMsg); BattleConsume battleConsume = new BattleConsume(); battleConsume.setLat(teamLat); From bd8ab8142a5dbd373cac0f830718fd31615bc49b Mon Sep 17 00:00:00 2001 From: wangwenhua <12345678> Date: Fri, 19 Sep 2025 16:35:52 +0800 Subject: [PATCH 21/21] =?UTF-8?q?=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B6=88=E8=80=97=E8=B5=84=E6=BA=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/room/bean/BattleRootTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java index daf1bb7..6b32c60 100644 --- a/src/main/java/com/hivekion/room/bean/BattleRootTask.java +++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java @@ -176,6 +176,7 @@ public class BattleRootTask extends AbtParentTask { jsonObject.put("medicalConsume", medicalConsume); jsonObject.put("teamLat",teamLat); jsonObject.put("teamLng",teamLng); + jsonObject.put("resourceId",scenarioTask.getResourceId()); sendConsumeMsg.setData(jsonObject); sendConsumeMsg.setRoom(roomId); sendConsumeMsg.setScenarioId(scenarioTask.getScenarioId());