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 ce50287..9f7e080 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -17,11 +17,13 @@ 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; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -34,6 +36,7 @@ import org.springframework.stereotype.Service; * @since 2025-09-13 */ @Service +@Slf4j public class ScenarioTaskServiceImpl extends ServiceImpl implements ScenarioTaskService { @@ -55,12 +58,16 @@ 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"); //想定当前状态 redisUtil.hset(roomId + "_" + id, "states", "running"); - Scenario currentScenario = scenarioService.getScenarioById(id); + + + //查询天气数据 WeatherResource weatherList = weatherResourceService.getOne(new QueryWrapper() .eq("scenario_id",id)); @@ -74,6 +81,7 @@ public class ScenarioTaskServiceImpl extends new Thread(() -> { springGlobalTaskManager.startPerSecondTask(roomId + "_" + id + "_task", () -> { + //时间累计 increaseTime(currentScenario, roomId); //天气触发 @@ -101,19 +109,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); } + } /** @@ -151,35 +164,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); } + } 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..ecd2278 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,11 @@ public class TaskLogicServiceImpl implements TaskLogicService { @Value("${path.planning.url}") private String pathPlanningUrl; private final WebClient webClient = WebClient.create(); - + @Resource + private StatisticService statisticService; + 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, @@ -46,7 +53,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 +77,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,17 +126,32 @@ 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 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); + + + } } @@ -119,10 +160,43 @@ 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); + //推送到前端 + 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) { + Object duringTime = redisUtil.hget(roomId + "_" + scenario.getId(), "duringTime"); + if (duringTime != null) { + return (Integer) duringTime; + } + return 0; + } + }