From 8422b7e13ddcd7bab07593578c5074e94de0c7f1 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: Sun, 14 Sep 2025 18:01:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hivekion/baseData/entity/Scenario.java | 10 ++- .../scenario/entity/ScenarioTask.java | 2 +- .../service/impl/ScenarioTaskServiceImpl.java | 6 +- .../service/impl/TaskLogicServiceImpl.java | 69 ++++++++++++++++--- 4 files changed, 73 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hivekion/baseData/entity/Scenario.java b/src/main/java/com/hivekion/baseData/entity/Scenario.java index ef9ffc1..58a7343 100644 --- a/src/main/java/com/hivekion/baseData/entity/Scenario.java +++ b/src/main/java/com/hivekion/baseData/entity/Scenario.java @@ -4,12 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import com.hivekion.common.entity.SearchInputVo; import com.hivekion.scenario.entity.ScenarioResource; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.List; import javax.validation.constraints.NotNull; @@ -66,8 +66,12 @@ public class Scenario extends SearchInputVo { @ApiModelProperty("是不是小堆") private Byte isXd; - - + @TableField(value = "start_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + @TableField(value = "end_time") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; @Override public String toString() { diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java index 19cee2e..f44ba62 100644 --- a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java +++ b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java @@ -57,6 +57,6 @@ public class ScenarioTask implements Serializable { @TableField(value = "task_type") private String taskType; @TableField(exist = false) - private String status; + private String status = "init"; } 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 d835449..de4350c 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -17,6 +17,7 @@ import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.mapper.ScenarioTaskMapper; import com.hivekion.scenario.service.ScenarioTaskService; import com.hivekion.scenario.service.TaskLogicService; +import com.hivekion.statistic.service.StatisticService; import com.hivekion.thread.SpringGlobalTaskManager; import java.time.format.DateTimeFormatter; import java.util.List; @@ -53,12 +54,15 @@ public class ScenarioTaskServiceImpl extends @Override public void start(Integer id, String roomId) { + Scenario currentScenario = scenarioService.getScenarioById(id); //想定当前持续时间 redisUtil.hset(roomId + "_" + id, "duringTime", 0); //想定当前状态 redisUtil.hset(roomId + "_" + id, "states", "running"); + //想定物资信息 + + - Scenario currentScenario = scenarioService.getScenarioById(id); //查询天气数据 List weatherList = weatherService.queryByScenarioUuid( currentScenario.getGuid()); diff --git a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java index 36bd79c..54fe900 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java @@ -10,6 +10,9 @@ import com.hivekion.common.redis.RedisUtil; import com.hivekion.scenario.TaskFinishedCall; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.service.TaskLogicService; +import com.hivekion.statistic.bean.StatisticBean; +import com.hivekion.statistic.service.StatisticService; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,7 +39,9 @@ public class TaskLogicServiceImpl implements TaskLogicService { @Value("${path.planning.url}") private String pathPlanningUrl; private final WebClient webClient = WebClient.create(); - + @Resource + private StatisticService statisticService; + private final double fuelUseUpPerSecond = 0.1; @Override public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId, @@ -46,7 +51,7 @@ public class TaskLogicServiceImpl implements TaskLogicService { cmdInfo.setData(dataMap); dataMap.put("resourceId", scenarioTask.getResourceId()); - if (!"running".equals(scenarioTask.getStatus())) { + if ("init".equals(scenarioTask.getStatus())) { scenarioTask.setStatus("running"); String url = pathPlanningUrl + "?profile=car&point=" + scenarioTask.getFromLat() + "," @@ -70,7 +75,26 @@ public class TaskLogicServiceImpl implements TaskLogicService { scenarioTask.getId() + "_path_points", resultObject.getJSONArray("paths")); } - } else {//更新坐标 + Global.sendCmdInfoQueue.add(cmdInfo); + //获取物资信息 + StatisticBean statistic = statisticService.statistic(scenarioTask.getResourceId()); + redisUtil.hset(roomId + "_" + currentScenario.getId(), + "resourceId_statistic_" + scenarioTask.getResourceId(), statistic); + } else if ("running".equals(scenarioTask.getStatus())) { + + //消耗油料 + StatisticBean statistic = getStatistic(scenarioTask, currentScenario, roomId); + //获取想定持续时间 + int duringTime = getCurrentDuringTime(currentScenario, roomId); + long seconds = + duringTime - Duration.between(scenarioTask.getStartTime(), currentScenario.getStartTime()) + .getSeconds(); + if (seconds > 0) { + double useUp = seconds * fuelUseUpPerSecond; + statistic.getFuel().setCurrent(statistic.getFuel().getTotal() - useUp); + setStatistic(scenarioTask, currentScenario, roomId, statistic); + } + //更新坐标 List points = new ArrayList<>(); cmdInfo.setCmdType("current_position"); Object pathsObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), @@ -100,13 +124,14 @@ public class TaskLogicServiceImpl implements TaskLogicService { oldValue); dataMap.put("currentPosition", result); if (result.reached) { - if(call!=null){ - call.doneTask(); - } + if (call != null) { + call.doneTask(); + } } } + Global.sendCmdInfoQueue.add(cmdInfo); } - Global.sendCmdInfoQueue.add(cmdInfo); + } @Override @@ -119,10 +144,36 @@ public class TaskLogicServiceImpl implements TaskLogicService { public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) { //运20速度 - handleMoveTask(task, scenario, roomId, 217,()->{ - //更新想定的物资 + handleMoveTask(task, scenario, roomId, 217, () -> { + //更新想定的物资 }); } + + private StatisticBean getStatistic(ScenarioTask task, Scenario scenario, String roomId) { + synchronized (this) { + Object statisticObj = redisUtil.hget(roomId + "_" + scenario.getId(), + "resourceId_statistic_" + task.getResourceId()); + if (statisticObj != null) { + return (StatisticBean) statisticObj; + } + return new StatisticBean(); + } + } + + private void setStatistic(ScenarioTask task, Scenario scenario, String roomId, + StatisticBean bean) { + redisUtil.hset(roomId + "_" + scenario.getId(), + "resourceId_statistic_" + task.getResourceId(), bean); + } + + private int getCurrentDuringTime(Scenario scenario, String roomId) { + Object duringTime = redisUtil.hget(roomId + "_" + scenario.getId(), "duringTime"); + if (duringTime != null) { + return (Integer) duringTime; + } + return 0; + } + } From 203139a7eb542f88887a8b707d0ba18363b619a4 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: Sun, 14 Sep 2025 18:25:11 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ScenarioTaskServiceImpl.java | 4 +-- .../service/impl/TaskLogicServiceImpl.java | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) 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 de4350c..5d8b683 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -56,10 +56,10 @@ public class ScenarioTaskServiceImpl extends public void start(Integer id, String roomId) { Scenario currentScenario = scenarioService.getScenarioById(id); //想定当前持续时间 - redisUtil.hset(roomId + "_" + id, "duringTime", 0); + redisUtil.hset(roomId + "_" + id, "duringTime", "0"); //想定当前状态 redisUtil.hset(roomId + "_" + id, "states", "running"); - //想定物资信息 + diff --git a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java index 54fe900..ecd2278 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java @@ -41,7 +41,9 @@ public class TaskLogicServiceImpl implements TaskLogicService { private final WebClient webClient = WebClient.create(); @Resource private StatisticService statisticService; - private final double fuelUseUpPerSecond = 0.1; + private final static double fuelUseUpPerSecond = 0.1; + private final static double medicalUseUpPerSecond = 0.1; + private final static double ammunitionUsePerSecond = 0.1; @Override public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId, @@ -136,6 +138,20 @@ public class TaskLogicServiceImpl implements TaskLogicService { @Override public void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId) { + StatisticBean statistic = getStatistic(task, scenario, roomId); + int duringTime = getCurrentDuringTime(scenario, roomId); + long seconds = + duringTime - Duration.between(task.getStartTime(), scenario.getStartTime()) + .getSeconds(); + if (seconds > 0) { + statistic.getMedical() + .setCurrent(statistic.getMedical().getTotal() - seconds * medicalUseUpPerSecond); + statistic.getAmmunition() + .setCurrent(statistic.getAmmunition().getTotal() - seconds * ammunitionUsePerSecond); + setStatistic(task, scenario, roomId, statistic); + + + } } @@ -166,6 +182,13 @@ public class TaskLogicServiceImpl implements TaskLogicService { StatisticBean bean) { redisUtil.hset(roomId + "_" + scenario.getId(), "resourceId_statistic_" + task.getResourceId(), bean); + //推送到前端 + ResponseCmdInfo> cmdInfo = new ResponseCmdInfo<>(); + Map dataMap = new HashMap<>(); + cmdInfo.setData(dataMap); + dataMap.put("resourceId", task.getResourceId()); + dataMap.put("statistic", bean); + Global.sendCmdInfoQueue.add(cmdInfo); } private int getCurrentDuringTime(Scenario scenario, String roomId) { From 8a67a6366eb6c9c5de6e6f212bf0f81295167744 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: Sun, 14 Sep 2025 18:27:23 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scenario/service/impl/ScenarioTaskServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) 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 5d8b683..70927ec 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -22,6 +22,7 @@ import com.hivekion.thread.SpringGlobalTaskManager; import java.time.format.DateTimeFormatter; import java.util.List; import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -34,6 +35,7 @@ import org.springframework.stereotype.Service; * @since 2025-09-13 */ @Service +@Slf4j public class ScenarioTaskServiceImpl extends ServiceImpl implements ScenarioTaskService { @@ -54,6 +56,7 @@ public class ScenarioTaskServiceImpl extends @Override public void start(Integer id, String roomId) { + log.info("id::{},roomId::{}",id,roomId); Scenario currentScenario = scenarioService.getScenarioById(id); //想定当前持续时间 redisUtil.hset(roomId + "_" + id, "duringTime", "0"); From 6a50a67babea423adad1bf94b9f2ab133570ba6e 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: Sun, 14 Sep 2025 18:28:51 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ScenarioTaskServiceImpl.java | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) 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 70927ec..6ba5997 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -78,6 +78,7 @@ public class ScenarioTaskServiceImpl extends new Thread(() -> { springGlobalTaskManager.startPerSecondTask(roomId + "_" + id + "_task", () -> { + //时间累计 increaseTime(currentScenario, roomId); //天气触发 @@ -105,19 +106,24 @@ public class ScenarioTaskServiceImpl extends } private void increaseTime(Scenario currentScenario, String roomId) { - int mag = Global.roomParamMap.get(currentScenario.getId() + "_" + roomId) == null ? 1 - : Global.roomParamMap.get(currentScenario.getId() + "_" + roomId).getMag(); - //获取当前状态 - Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status"); - if (statusObj != null && statusObj.toString().equals("running")) { - Object duringObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "duringTime"); - if (duringObj != null) { - int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0; - oldValue = oldValue + mag; - redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", oldValue); - } + try{ + int mag = Global.roomParamMap.get(currentScenario.getId() + "_" + roomId) == null ? 1 + : Global.roomParamMap.get(currentScenario.getId() + "_" + roomId).getMag(); + //获取当前状态 + Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status"); + if (statusObj != null && statusObj.toString().equals("running")) { + Object duringObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "duringTime"); + if (duringObj != null) { + int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0; + oldValue = oldValue + mag; + redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", oldValue); + } + } + }catch (Exception e){ + log.error("error::",e); } + } /** @@ -154,35 +160,40 @@ public class ScenarioTaskServiceImpl extends } private void taskTrigger(Scenario currentScenario, String roomId) { - Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status"); - if (statusObj != null && statusObj.toString().equals("running")) { - Object taskListObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "taskList"); - if (taskListObj != null) { + try{ + Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status"); + if (statusObj != null && statusObj.toString().equals("running")) { + Object taskListObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "taskList"); + if (taskListObj != null) { - if (taskListObj instanceof List) { - List taskList = (List) taskListObj; - for (Object task : taskList) { + if (taskListObj instanceof List) { + List taskList = (List) taskListObj; + for (Object task : taskList) { + + ScenarioTask scenarioTask = (ScenarioTask) task; + switch (scenarioTask.getTaskType()) { + case "1": + taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId,18.0,null); + break; + case "2": + taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId); + break; + case "4": + case "5": + case "6": + case "7": + default: + taskLogicService.supplierTask(scenarioTask, currentScenario, roomId); + } - ScenarioTask scenarioTask = (ScenarioTask) task; - switch (scenarioTask.getTaskType()) { - case "1": - taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId,18.0,null); - break; - case "2": - taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId); - break; - case "4": - case "5": - case "6": - case "7": - default: - taskLogicService.supplierTask(scenarioTask, currentScenario, roomId); } - } } } + }catch (Exception e){ + log.error("error::",e); } + }