roomLogQueue = new LinkedBlockingQueue<>(1000);
}
diff --git a/src/main/java/com/hivekion/Test.java b/src/main/java/com/hivekion/Test.java
new file mode 100644
index 0000000..e990746
--- /dev/null
+++ b/src/main/java/com/hivekion/Test.java
@@ -0,0 +1,24 @@
+package com.hivekion;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public class Test {
+
+ public static void main(String[] args) {
+ String test = "id\n"
+ + "general_time\n"
+ + "from_resource_id\n"
+ + "supplier_type\n"
+ + "supplier_num\n"
+ + "lat\n"
+ + "lng";
+ System.out.println(test.toUpperCase());
+ }
+}
diff --git a/src/main/java/com/hivekion/baseData/service/ScenarioService.java b/src/main/java/com/hivekion/baseData/service/ScenarioService.java
index 6004853..35244f1 100644
--- a/src/main/java/com/hivekion/baseData/service/ScenarioService.java
+++ b/src/main/java/com/hivekion/baseData/service/ScenarioService.java
@@ -5,6 +5,7 @@ import com.hivekion.baseData.entity.Scenario;
import com.hivekion.power.bean.PowerBase;
import com.hivekion.power.bean.ScenarioPowerData;
import java.util.List;
+import java.util.Map;
/**
*
@@ -68,5 +69,5 @@ public interface ScenarioService extends IService {
List allNoContent();
Scenario getScenarioById(Integer id);
-
+ Map scenarioMap();
}
diff --git a/src/main/java/com/hivekion/baseData/service/impl/ScenarioServiceImpl.java b/src/main/java/com/hivekion/baseData/service/impl/ScenarioServiceImpl.java
index d57d4d0..bb4dc6e 100644
--- a/src/main/java/com/hivekion/baseData/service/impl/ScenarioServiceImpl.java
+++ b/src/main/java/com/hivekion/baseData/service/impl/ScenarioServiceImpl.java
@@ -7,29 +7,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hivekion.baseData.entity.Scenario;
import com.hivekion.baseData.mapper.ScenarioMapper;
import com.hivekion.baseData.service.ScenarioService;
-import com.hivekion.common.redis.RedisUtil;
-import com.hivekion.environment.entity.SimtoolWeather;
-import com.hivekion.environment.service.SimtoolWeatherService;
-import com.hivekion.power.bean.ActionInfo;
-import com.hivekion.power.bean.AmmunitionInfo;
-import com.hivekion.power.bean.MaterialNumInfo;
-import com.hivekion.power.bean.PersonStatisticInfo;
-import com.hivekion.power.bean.PositionInfo;
import com.hivekion.power.bean.PowerBase;
-import com.hivekion.power.bean.PowerGroup;
import com.hivekion.power.bean.ScenarioPowerData;
-import com.hivekion.scenario.bean.ArraysTag;
-import com.hivekion.scenario.bean.Power;
-import com.hivekion.scenario.bean.PowerSet;
-import com.hivekion.scenario.bean.ScenarioData;
-import com.hivekion.scenario.bean.Unit;
-import com.hivekion.thread.SpringGlobalTaskManager;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
-import javax.annotation.Resource;
import org.springframework.stereotype.Service;
/**
@@ -45,7 +29,6 @@ public class ScenarioServiceImpl extends ServiceImpl i
ScenarioService {
-
@Override
public List List(Scenario scenario) {
return this.baseMapper.List(scenario);
@@ -166,149 +149,6 @@ public class ScenarioServiceImpl extends ServiceImpl i
// return scenarioPowerData;
}
- private PowerGroup createPowGroup(PowerSet set, ScenarioData scenarioData) {
- PowerGroup group = new PowerGroup();
- //todo
- group.setFight(makePowerbaseList(set.getFightPower(), scenarioData.getUnitList()));
- group.setGuarantee(makePowerbaseList(set.getSafeguardPower(), scenarioData.getUnitList()));
- return group;
- }
-
- private List makePowerbaseList(List arraysTagList,
- List unitList) {
- Map map = new LinkedHashMap<>();
- arraysTagList.forEach(arraysTag -> {
- if (arraysTag.getArray() != null) {
- arraysTag.getArray().forEach(a -> {
- PowerBase base = new PowerBase();
- base.setId(a.getUuid());
- base.setName(a.getText());
- map.put(a.getUuid(), base);
- });
- }
-
- });
- Map unitMap = unitList.stream()
- .collect(Collectors.toMap(Unit::getUuid, a -> a));
- //获取组织
- map.forEach((mapKey, mapValue) -> {
- Unit unit = unitMap.get(mapKey);
- if (unit != null) {
- //设置位置信息
- mapValue.setPosition(createPosition(unit));
- //设置人员统计
- mapValue.setPersonStatistic(createStatistic(unit));
- //设置食品信息
- mapValue.setFoodInfo(createFoodInfo(unit));
- //设置水信息
- mapValue.setWaterInfo(createWaterInfo(unit));
- //油信息
- mapValue.setOilInfo(createOilInfo(unit));
- //药材信息
- mapValue.setMedicalInfo(createMedicalInfo(unit));
- //弹药信息
- mapValue.setAmmunition(createAmmunitionInfo(unit));
- //行动信息
- mapValue.setActionList(createActionInfo(unit));
- }
-
- });
-
- return new ArrayList<>(map.values());
- }
-
- //创建position
- private PositionInfo createPosition(Unit unit) {
- PositionInfo positionInfo = new PositionInfo();
- positionInfo.setHeight(unit.getHeight() == null ? 0.0 : unit.getHeight().doubleValue());//高度
- positionInfo.setLng(unit.getLongitude() == null ? "" : unit.getLongitude().toPlainString());//经度
- positionInfo.setLat(unit.getLatitude() == null ? "" : unit.getLatitude().toPlainString());//纬度
- positionInfo.setSpeed(unit.getSpeed());//速度
- positionInfo.setDirection(unit.getCourse().doubleValue());//方向
- positionInfo.setDeduceTypeName(unit.getDeducType() == 1 ? "红军" : "蓝军"); //推演方类型名称
- positionInfo.setLogisticType(unit.getLogisticsSupportType());
-
- return positionInfo;
- }
-
- //人员统计信息
- private PersonStatisticInfo createStatistic(Unit unit) {
- PersonStatisticInfo personStatisticInfo = new PersonStatisticInfo();
- personStatisticInfo.setTotal(unit.getTeamPeopleNum());
- personStatisticInfo.setCurrent(unit.getTeamPeopleNum() - unit.getDeadPeopleNum());
- personStatisticInfo.setDeath(unit.getDeadPeopleNum());
- personStatisticInfo.setInjured(unit.getHurtPeopleNum());
- return personStatisticInfo;
- }
-
- //食品消耗信息
- private MaterialNumInfo createFoodInfo(Unit unit) {
- MaterialNumInfo materialNumInfo = new MaterialNumInfo();
- materialNumInfo.setStartNum(unit.getTeamFieldOperationsFoodInfo());
- materialNumInfo.setCurrentNum(
- unit.getTeamFieldOperationsFoodInfo() - unit.getPeoFieldOperationsFoodConsume());
- return materialNumInfo;
- }
-
- //水信息
- private MaterialNumInfo createWaterInfo(Unit unit) {
- MaterialNumInfo materialNumInfo = new MaterialNumInfo();
- materialNumInfo.setStartNum(
- unit.getTeamWaterInfo() == null ? 0 : unit.getTeamWaterInfo().doubleValue());
- materialNumInfo.setCurrentNum(
- materialNumInfo.getStartNum() - (unit.getPeoWaterConsume() == null ? 0
- : unit.getPeoWaterConsume()));
- return materialNumInfo;
- }
-
- //油信息
- private MaterialNumInfo createOilInfo(Unit unit) {
- MaterialNumInfo materialNumInfo = new MaterialNumInfo();
- materialNumInfo.setStartNum(unit.getOilInfo() == null ? 0 : unit.getOilInfo().doubleValue());
- //todo
- materialNumInfo.setCurrentNum(unit.getOilInfo() == null ? 0 : unit.getOilInfo().doubleValue());
- return materialNumInfo;
- }
-
- private MaterialNumInfo createMedicalInfo(Unit unit) {
- MaterialNumInfo materialNumInfo = new MaterialNumInfo();
- materialNumInfo.setStartNum(
- unit.getTeamMedicinalInfo() == null ? 0 : unit.getTeamMedicinalInfo().doubleValue());
- materialNumInfo.setStartNum(
- materialNumInfo.getStartNum() - (unit.getPeoHerbMedicalConsume() == null ? 0
- : unit.getPeoHerbMedicalConsume().doubleValue()) - (
- unit.getPeoBloodMedicalConsume() == null ? 0
- : unit.getPeoBloodMedicalConsume().doubleValue()));
- return materialNumInfo;
- }
-
- private AmmunitionInfo createAmmunitionInfo(Unit unit) {
- AmmunitionInfo ammunitionInfo = new AmmunitionInfo();
- //设置轻武器
- ammunitionInfo.setLightArms(
- unit.getLightAmmunitionInfo() == null ? 0 : unit.getLightAmmunitionInfo().doubleValue());
- //设置压制武器
- ammunitionInfo.setSuppressing(
- unit.getSuppressEquipNum() == null ? 0 : unit.getSuppressEquipNum().doubleValue());
-
- return ammunitionInfo;
- }
-
- private List createActionInfo(Unit unit) {
- List list = new ArrayList<>();
-
- JSONArray jsonArray = unit.getFightActionInfo();
- if (jsonArray != null) {
- for (int i = 0; i < jsonArray.size(); i++) {
- JSONObject jsonObject = jsonArray.getJSONObject(i);
- ActionInfo actionInfo = new ActionInfo();
- actionInfo.setBeginDateTime(jsonObject.getString("StartTime"));
- actionInfo.setEndDateTime(jsonObject.getString("EndTime"));
- list.add(actionInfo);
- }
- }
- return list;
- }
@Override
public void modifyUnitInfo(PowerBase info, Scenario data) {
@@ -370,38 +210,6 @@ public class ScenarioServiceImpl extends ServiceImpl i
return unitMap;
}
- private void modifyPower(String id, String name, Power power) {
- modifyRole(id, name, power.getPower().getRed());
- modifyRole(id, name, power.getPower().getBlue());
-
- }
-
- private void modifyRole(String id, String name, PowerSet role) {
- if (role != null && role.getFightPower() != null) {
- role.getFightPower().forEach(a -> {
- if (a.getArray() != null && !a.getArray().isEmpty()) {
- a.getArray().forEach(guidInfo -> {
- if (guidInfo.getUuid().equals(id)) {
- guidInfo.setText(name);
- }
- });
- }
-
- });
- }
- if (role != null && role.getSafeguardPower() != null) {
- role.getSafeguardPower().forEach(a -> {
- if (a.getArray() != null && !a.getArray().isEmpty()) {
- a.getArray().forEach(guidInfo -> {
- if (guidInfo.getUuid().equals(id)) {
- guidInfo.setText(name);
- }
- });
- }
-
- });
- }
- }
@Override
public List allNoContent() {
@@ -414,10 +222,13 @@ public class ScenarioServiceImpl extends ServiceImpl i
@Override
public Scenario getScenarioById(Integer id) {
-
- return this.baseMapper.selectByScenarioId(id);
+ return this.baseMapper.selectByScenarioId(id);
}
+ @Override
+ public Map scenarioMap() {
+ return this.allNoContent().stream()
+ .collect(Collectors.toMap(Scenario::getId, scenario -> scenario));
-
+ }
}
diff --git a/src/main/java/com/hivekion/common/entity/ResponseCmdInfo.java b/src/main/java/com/hivekion/common/entity/ResponseCmdInfo.java
index e06fce2..3f6f77d 100644
--- a/src/main/java/com/hivekion/common/entity/ResponseCmdInfo.java
+++ b/src/main/java/com/hivekion/common/entity/ResponseCmdInfo.java
@@ -19,13 +19,13 @@ public class ResponseCmdInfo implements java.io.Serializable {
private Integer scenarioId;
private T data;
- @Override
- public String toString() {
- return "ResponseCmdInfo{" +
- "cmdType='" + cmdType + '\'' +
- ", room='" + room + '\'' +
- ", scenarioId=" + scenarioId +
- ", data=" + data +
- '}';
+ public static ResponseCmdInfo create(String type, String room, Integer scenarioId,
+ T data) {
+ ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
+ responseCmdInfo.setCmdType(type);
+ responseCmdInfo.setRoom(room);
+ responseCmdInfo.setScenarioId(scenarioId);
+ responseCmdInfo.setData(data);
+ return responseCmdInfo;
}
}
diff --git a/src/main/java/com/hivekion/common/utils.java b/src/main/java/com/hivekion/common/utils.java
index 75a8ae3..cc916a9 100644
--- a/src/main/java/com/hivekion/common/utils.java
+++ b/src/main/java/com/hivekion/common/utils.java
@@ -1,6 +1,8 @@
package com.hivekion.common;
import com.hivekion.common.exception.BusinessException;
+import com.sun.javafx.binding.StringFormatter;
+import java.time.Duration;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
@@ -87,4 +89,16 @@ public class utils {
}
return level;
}
+ public static String formatSeconds(long totalSeconds) {
+
+ Duration duration = Duration.ofSeconds(totalSeconds);
+ long hours = duration.toHours();
+ long minutes = duration.minusHours(hours).toMinutes();
+ long seconds = duration.minusHours(hours).minusMinutes(minutes).getSeconds();
+ return StringFormatter.format("%d小时%d分钟%d秒\n", hours, minutes, seconds).get();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(utils.formatSeconds(3601));
+ }
}
diff --git a/src/main/java/com/hivekion/enums/ScenarioRoomStatusEnum.java b/src/main/java/com/hivekion/enums/ScenarioRoomStatusEnum.java
new file mode 100644
index 0000000..3237d3e
--- /dev/null
+++ b/src/main/java/com/hivekion/enums/ScenarioRoomStatusEnum.java
@@ -0,0 +1,26 @@
+package com.hivekion.enums;
+
+import lombok.Getter;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+
+public enum ScenarioRoomStatusEnum {
+ INIT(0),
+ STARTED(1),
+ BROKEN(2),
+ FINISHED(3);
+
+ @Getter
+ private final int code;
+ ScenarioRoomStatusEnum(int code) {
+ this.code = code;
+ }
+}
diff --git a/src/main/java/com/hivekion/enums/TaskEnum.java b/src/main/java/com/hivekion/enums/TaskEnum.java
new file mode 100644
index 0000000..ee60a30
--- /dev/null
+++ b/src/main/java/com/hivekion/enums/TaskEnum.java
@@ -0,0 +1,31 @@
+package com.hivekion.enums;
+
+import lombok.Getter;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public enum TaskEnum {
+
+ MOVE(1),
+
+ FIGHT(2),
+ SUPPLIER_WATER(5),
+ SUPPLIER_MEDICAL(8),
+ SUPPLIER_FOOD(7),
+ SUPPLIER_AMMO(4),
+ SUPPLIER_FUEL(6);
+ @Getter
+ private int code;
+
+ TaskEnum(int code) {
+ this.code = code;
+ }
+
+}
diff --git a/src/main/java/com/hivekion/room/RoomManager.java b/src/main/java/com/hivekion/room/RoomManager.java
new file mode 100644
index 0000000..2f583d8
--- /dev/null
+++ b/src/main/java/com/hivekion/room/RoomManager.java
@@ -0,0 +1,55 @@
+package com.hivekion.room;
+
+import com.hivekion.baseData.entity.Scenario;
+import com.hivekion.room.bean.Room;
+import com.hivekion.room.func.TaskAction;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public class RoomManager {
+
+ private static final Map roomsMap = new ConcurrentHashMap<>();
+
+ public static void startRoom(String id, Scenario scenario,long time) {
+ Room room = new Room(id,scenario);
+ roomsMap.put(id, room);
+ room.start(time);
+ }
+
+ public static void stopRoom(String id) {
+ Room room = roomsMap.get(id);
+ if (room != null) {
+ room.stop();
+ }
+ }
+
+ public static void pauseRoom(String id) {
+ Room room = roomsMap.get(id);
+ if (room != null) {
+ room.pause();
+ }
+ }
+
+ public static void resumeRoom(String id) {
+ Room room = roomsMap.get(id);
+ if (room != null) {
+ room.resume();
+ }
+ }
+
+ public static void addAction(String id, long time, TaskAction action) {
+ Room room = roomsMap.get(id);
+ if (room != null) {
+ room.addAction(time, action);
+ }
+ }
+}
diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java
new file mode 100644
index 0000000..c9f8982
--- /dev/null
+++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java
@@ -0,0 +1,114 @@
+package com.hivekion.room.bean;
+
+import com.hivekion.Global;
+import com.hivekion.room.func.TaskAction;
+import com.hivekion.scenario.bean.ScenarioWsParam;
+import com.hivekion.scenario.entity.ScenarioTask;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+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.AtomicLong;
+import org.springframework.web.reactive.function.client.WebClient;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+
+public abstract class AbtParentTask implements TaskAction {
+
+ protected final AtomicLong duringTime = new AtomicLong(0);
+ protected final ScheduledExecutorService schedule = Executors.newScheduledThreadPool(
+ 1);
+ protected ScheduledFuture> scheduledFuture;
+ //任务数据
+ protected final ScenarioTask scenarioTask;
+
+ protected final String roomId;
+ protected WebClient webClient = WebClient.create();
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(
+ 5, // 核心线程数
+ 10, // 最大线程数
+ 60L, // 空闲线程存活时间
+ TimeUnit.SECONDS, // 时间单位
+ new LinkedBlockingQueue<>(100), // 任务队列
+ new CustomThreadFactory("MyPool"), // 线程工厂
+ new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
+ );
+
+ public AbtParentTask(ScenarioTask scenarioTask, String roomId) {
+ this.scenarioTask = scenarioTask;
+ this.roomId = roomId;
+
+ }
+
+ protected void start() {
+ scheduledFuture = schedule.scheduleAtFixedRate(() -> {
+ ScenarioWsParam scenarioWsParam = Global.roomParamMap.get(
+ scenarioTask.getScenarioId() + "_" + roomId);
+ if (scenarioWsParam == null) {
+ duringTime.getAndSet(1);
+ } else {
+ duringTime.getAndSet(scenarioWsParam.getMag());
+ }
+
+
+ }, 0, 1, TimeUnit.SECONDS);
+ }
+
+ protected abstract void finished();
+
+ protected abstract void setMag(int mag);
+
+ @Override
+ public void doSomeThing() {
+
+ }
+
+ @Override
+ public String getId() {
+ return scenarioTask.getId();
+ }
+
+ @Override
+ public String getType() {
+ return scenarioTask.getTaskType();
+ }
+
+ public void cancelAllTask() {
+ if (scheduledFuture != null) {
+ scheduledFuture.cancel(true);
+ }
+ }
+
+ protected abstract void business();
+}
+
+// 自定义线程工厂
+class CustomThreadFactory implements ThreadFactory {
+
+ private final AtomicInteger threadNumber = new AtomicInteger(1);
+ private final String namePrefix;
+
+ public CustomThreadFactory(String namePrefix) {
+ this.namePrefix = namePrefix + "-thread-";
+ }
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = new Thread(r, namePrefix + threadNumber.getAndIncrement());
+ thread.setDaemon(false); // 设置为非守护线程
+ thread.setPriority(Thread.NORM_PRIORITY);
+ return thread;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/hivekion/room/bean/BattleRootTask.java b/src/main/java/com/hivekion/room/bean/BattleRootTask.java
new file mode 100644
index 0000000..e18d277
--- /dev/null
+++ b/src/main/java/com/hivekion/room/bean/BattleRootTask.java
@@ -0,0 +1,45 @@
+package com.hivekion.room.bean;
+
+import com.hivekion.Global;
+import com.hivekion.scenario.entity.ScenarioTask;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public class BattleRootTask extends AbtParentTask {
+
+
+ public BattleRootTask(ScenarioTask scenarioTask,String roomId) {
+ super(scenarioTask,roomId);
+ }
+ //执行一次
+ @Override
+ public void doSomeThing() {
+ //会知道想定ID, resourceId;
+ }
+ //固定间隔执行
+ @Override
+ protected void business() {
+ // Global.roomParamMap.get(scenarioTask.getScenarioId() + "," + this.roomId); 可以获取当前想定的步长
+ //战斗需要消耗弹药 按时间消耗,30秒
+ //人员消耗
+ //可能会产生需求,保障需求
+ }
+
+
+ @Override
+ protected void finished() {
+
+ }
+
+ @Override
+ protected void setMag(int mag) {
+
+ }
+}
diff --git a/src/main/java/com/hivekion/room/bean/MoveRootTask.java b/src/main/java/com/hivekion/room/bean/MoveRootTask.java
new file mode 100644
index 0000000..317f49d
--- /dev/null
+++ b/src/main/java/com/hivekion/room/bean/MoveRootTask.java
@@ -0,0 +1,104 @@
+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.common.MultiPointGeoPosition;
+import com.hivekion.common.entity.ResponseCmdInfo;
+import com.hivekion.room.func.TaskAction;
+import com.hivekion.scenario.entity.ScenarioTask;
+import java.util.Map;
+import java.util.TreeMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.env.Environment;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+@Slf4j
+public class MoveRootTask extends AbtParentTask implements TaskAction {
+
+
+ private final double SPEED = 170;
+ private double accumulatedDistance = 0;
+
+ public MoveRootTask(ScenarioTask scenarioTask, String roomId) {
+ super(scenarioTask, roomId);
+ }
+
+ private final Map distanceInfoMap = new TreeMap();
+
+ @Override
+ public void doSomeThing() {
+ log.info("move task running");
+ //累计距离
+
+ 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");
+ //推送路径任务
+ Global.sendCmdInfoQueue.add(
+ ResponseCmdInfo.create("path_init", roomId, scenarioTask.getScenarioId(), pointsObj));
+ JSONArray coordinates = pointsObj.getJSONArray("coordinates");
+ Double beforeLng = null;
+ Double beforeLat = null;
+ for (int i = 0; i < coordinates.size(); i++) {
+ JSONArray coordinate = coordinates.getJSONArray(i);
+ Double lng = coordinate.getDouble(0);
+ Double lat = coordinate.getDouble(1);
+ if (beforeLng == null && beforeLat == null) {
+ distanceInfoMap.put((double) 0, lng + "," + lat);
+ } else {
+ double distance = MultiPointGeoPosition.haversine(beforeLat, beforeLng, lng, lat);
+ distanceInfoMap.put(distance, lng + "," + lat);
+ }
+ beforeLng = lng;
+ beforeLat = lat;
+
+ }
+ }
+
+
+ }
+
+ @Override
+ protected void business() {
+
+ }
+
+
+ @Override
+ protected void finished() {
+
+ }
+
+ @Override
+ protected void setMag(int mag) {
+
+ }
+
+
+}
diff --git a/src/main/java/com/hivekion/room/bean/Room.java b/src/main/java/com/hivekion/room/bean/Room.java
new file mode 100644
index 0000000..f2ef23b
--- /dev/null
+++ b/src/main/java/com/hivekion/room/bean/Room.java
@@ -0,0 +1,184 @@
+package com.hivekion.room.bean;
+
+import com.hivekion.Global;
+import com.hivekion.baseData.entity.Scenario;
+import com.hivekion.common.entity.ResponseCmdInfo;
+import com.hivekion.common.utils;
+import com.hivekion.common.uuid.IdUtils;
+import com.hivekion.room.func.TaskAction;
+import com.hivekion.scenario.bean.ScenarioWsParam;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.NavigableMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+@Data
+@Slf4j
+public class Room implements AutoCloseable {
+
+ /**
+ * 任务管理相关
+ */
+ private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+ private ScheduledFuture> future;
+ /**
+ * 房间ID
+ */
+ private String roomId;
+ /**
+ * 想定信息
+ */
+ private Scenario scenario;
+ /**
+ * 任务容器
+ */
+ private NavigableMap> actionMap = new ConcurrentSkipListMap<>();
+ //日期格式化
+ private DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ //线程池
+ private final ExecutorService actionExecutor =
+ new ThreadPoolExecutor(
+ 5, 5, // corePoolSize, maximumPoolSize
+ 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>(1000), // 有界队列,只允许100个待执行任务
+ new ThreadPoolExecutor.AbortPolicy() // 超出直接抛异常
+ );
+
+ public Room(String roomId, Scenario scenario) {
+ this.roomId = roomId;
+ this.scenario = scenario;
+ }
+
+ /**
+ * 持续时间
+ */
+ private AtomicLong duringTime = new AtomicLong(0);
+ private AtomicLong totalTime = new AtomicLong(0);
+
+ private int mag = 1;
+
+
+
+ /**
+ * 启动
+ *
+ * @param time 总时间
+ */
+ public void start(long time) {
+
+ totalTime.set(time);
+ startTask();
+ }
+
+ /**
+ * 停止
+ */
+ public void stop() {
+ cancelTask();
+ }
+
+ /**
+ * 暂停
+ */
+ public void pause() {
+ cancelTask();
+ }
+
+ public void resume() {
+ startTask();
+ }
+
+
+
+ // 启动定时任务
+ private void startTask() {
+ if (future == null || future.isCancelled()) {
+ future = scheduler.scheduleAtFixedRate(() -> {
+ ScenarioWsParam magValue = Global.roomParamMap.get(this.scenario.getId() + "_" + this.roomId);
+ if(magValue!=null){
+ this.mag = magValue.getMag();
+ }
+
+ long curTime = duringTime.addAndGet(this.mag);
+
+ sendRemainTime((totalTime.get() - curTime));
+
+ NavigableMap> actions = actionMap.headMap(curTime, true);
+ if (!actions.isEmpty() ) {
+ actions.forEach((key, action) -> {
+ action.forEach((taskAction, task) -> {
+ actionExecutor.submit(task::doSomeThing);
+ });
+ });
+
+
+ // 全部执行后再清空
+
+
+ actions.clear();
+ }
+ }, 0, 1, TimeUnit.SECONDS);
+ }
+ }
+
+ // 取消定时任务
+ private void cancelTask() {
+ if (future != null && !future.isCancelled()) {
+ future.cancel(true);
+
+ }
+ }
+
+ public void addAction(long time, TaskAction action) {
+ actionMap.computeIfAbsent(time, k -> new ConcurrentHashMap<>())
+ .put(IdUtils.simpleUUID(), action);
+
+ }
+
+ @Override
+ public void close() throws Exception {
+ actionMap.clear();
+ if (future != null && !future.isCancelled()) {
+ future.cancel(true);
+ }
+ if (scheduler != null && !scheduler.isShutdown()) {
+ scheduler.shutdown();
+ }
+ }
+
+ private void sendRemainTime(long remainTime) {
+
+ Map timeMap = new HashMap<>();
+ timeMap.put("update_time_str",utils.formatSeconds(remainTime));
+ timeMap.put("remain_time",remainTime);
+ timeMap.put("during_time",duringTime.get());
+ timeMap.put("current_time",df.format(this.scenario.getStartTime().plusSeconds(duringTime.get())));
+
+ Global.sendCmdInfoQueue.add(
+ ResponseCmdInfo.create("update_time", this.roomId, this.scenario.getId(),
+ timeMap));
+ }
+}
diff --git a/src/main/java/com/hivekion/room/bean/SupplierTask.java b/src/main/java/com/hivekion/room/bean/SupplierTask.java
new file mode 100644
index 0000000..666f1ae
--- /dev/null
+++ b/src/main/java/com/hivekion/room/bean/SupplierTask.java
@@ -0,0 +1,41 @@
+package com.hivekion.room.bean;
+
+import com.hivekion.room.func.TaskAction;
+import com.hivekion.scenario.entity.ScenarioTask;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public class SupplierTask extends AbtParentTask implements TaskAction {
+
+ public SupplierTask(ScenarioTask scenarioTask,String roomId) {
+ super(scenarioTask,roomId);
+ }
+
+ @Override
+ protected void finished() {
+
+ }
+
+ @Override
+ public void doSomeThing() {
+
+ }
+
+ @Override
+ protected void business() {
+
+ }
+
+
+ @Override
+ protected void setMag(int mag) {
+
+ }
+}
diff --git a/src/main/java/com/hivekion/room/func/TaskAction.java b/src/main/java/com/hivekion/room/func/TaskAction.java
new file mode 100644
index 0000000..68dc629
--- /dev/null
+++ b/src/main/java/com/hivekion/room/func/TaskAction.java
@@ -0,0 +1,17 @@
+package com.hivekion.room.func;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public interface TaskAction {
+
+ void doSomeThing();
+ String getId();
+ String getType();
+}
diff --git a/src/main/java/com/hivekion/scenario/TaskFinishedCall.java b/src/main/java/com/hivekion/scenario/TaskFinishedCall.java
deleted file mode 100644
index d9a0614..0000000
--- a/src/main/java/com/hivekion/scenario/TaskFinishedCall.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.hivekion.scenario;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-public interface TaskFinishedCall {
- void doneTask();
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/ArraysTag.java b/src/main/java/com/hivekion/scenario/bean/ArraysTag.java
deleted file mode 100644
index 9049592..0000000
--- a/src/main/java/com/hivekion/scenario/bean/ArraysTag.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class ArraysTag {
- private List Array;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/EquipInfo.java b/src/main/java/com/hivekion/scenario/bean/EquipInfo.java
deleted file mode 100644
index 976b7b2..0000000
--- a/src/main/java/com/hivekion/scenario/bean/EquipInfo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class EquipInfo {
-
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Group.java b/src/main/java/com/hivekion/scenario/bean/Group.java
deleted file mode 100644
index 9223ac8..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Group.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Group {
-
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/GuidInfo.java b/src/main/java/com/hivekion/scenario/bean/GuidInfo.java
deleted file mode 100644
index 51933f7..0000000
--- a/src/main/java/com/hivekion/scenario/bean/GuidInfo.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class GuidInfo {
- private String Deduc;
- private String OrMin;
- private String Text;
- private String Uuid;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Mount.java b/src/main/java/com/hivekion/scenario/bean/Mount.java
deleted file mode 100644
index 8c12a90..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Mount.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONArray;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Mount {
- private String Uuid;
- private JSONArray MountsData;
- private Integer MsgType;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/PostInfo.java b/src/main/java/com/hivekion/scenario/bean/PostInfo.java
deleted file mode 100644
index 892877c..0000000
--- a/src/main/java/com/hivekion/scenario/bean/PostInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class PostInfo {
- private Integer PostCount;
- private String PostName;
- private Integer PostId;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Power.java b/src/main/java/com/hivekion/scenario/bean/Power.java
deleted file mode 100644
index b5c159a..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Power.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson2.JSONObject;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Power {
- private PowerUnion Power;
- private PowerTask Task;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/PowerSet.java b/src/main/java/com/hivekion/scenario/bean/PowerSet.java
deleted file mode 100644
index c00286c..0000000
--- a/src/main/java/com/hivekion/scenario/bean/PowerSet.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class PowerSet {
- private List FightPower;
- private List SafeguardPower;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/PowerTask.java b/src/main/java/com/hivekion/scenario/bean/PowerTask.java
deleted file mode 100644
index 7aa4e1a..0000000
--- a/src/main/java/com/hivekion/scenario/bean/PowerTask.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson2.JSONArray;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class PowerTask {
- private PowerTaskInfo Blue;
- private PowerTaskInfo Red;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/PowerTaskInfo.java b/src/main/java/com/hivekion/scenario/bean/PowerTaskInfo.java
deleted file mode 100644
index 9db8807..0000000
--- a/src/main/java/com/hivekion/scenario/bean/PowerTaskInfo.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson2.JSONArray;
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class PowerTaskInfo {
- private List FightTask;
- private List SafeguardTask;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/PowerUnion.java b/src/main/java/com/hivekion/scenario/bean/PowerUnion.java
deleted file mode 100644
index 4db9c4c..0000000
--- a/src/main/java/com/hivekion/scenario/bean/PowerUnion.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class PowerUnion {
- private PowerSet Blue;
- private PowerSet Red;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/RegulationsRule.java b/src/main/java/com/hivekion/scenario/bean/RegulationsRule.java
deleted file mode 100644
index f1aa9fb..0000000
--- a/src/main/java/com/hivekion/scenario/bean/RegulationsRule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class RegulationsRule {
-
- private Integer KeepDistanceTarget;
- private Boolean AttackDefendElecPowerEdit;
- private Integer WeaControlToDive;
- private Integer WeaControlToGround;
- private Integer OilProvide;
- private Integer AutoEvasion;
- private Integer UseNWeapon;
- private Boolean AlliedForcesOilProvideEdit;
- private Integer WarAppearTarget;
- private Integer OilStatusReturn;
- private Boolean DiscardAmmunitionEdit;
- private Integer AttackWeaponReturn;
- private Integer UseShipAirMissile;
- private Boolean WarAppearTargetEdit;
- private Boolean OilStatusReturnEdit;
- private Integer QuickDispatch;
- private Integer AttackNeglectPlanLine;
- private Boolean UseAIPPropulsionEdit;
- private Integer DamageLevelRedeploy;
- private Boolean WarFuzzyPositionTargetEdit;
- private Integer AirActionTempo;
- private Boolean SelectUnitOilProvideEdit;
- private Boolean UnderAttckNeglectElecEdit;
- private Integer WarFuzzyPositionTarget;
- private Boolean UseNWeaponEdit;
- private Integer WeaControlToSky;
- private Integer DiscardAmmunition;
- private Boolean SurveyMenaceToDiveEdit;
- private Boolean WeaponStatusReturnEdit;
- private Boolean OilStatusPlanEdit;
- private Integer DeducType;
- private Boolean VoyageCenterElecPowerEdit;
- private Boolean OilProvideEdit;
- private Integer SelectUnitOilProvide;
- private Integer OilRedeploy;
- private Integer UnderAttckNeglectElec;
- private Integer DefendWeaponRedeploy;
- private Boolean TorpedoPowerRangeEdit;
- private Integer AutoLoadingTime;
- private Integer AttackDefendElecPower;
- private Boolean KeepDistanceTargetEdit;
- private Integer UseAIPPropulsion;
- private Integer OilReturn;
- private Boolean WeaponStatusPlanEdit;
- private Integer OilStatusPlan;
- private Boolean HangSonarEdit;
- private Integer SkyToGroundShot;
- private Integer HangSonar;
- private Integer Radar;
- private Integer VoyageCenterElecPower;
- private Boolean QuickDispatchEdit;
- private Integer TorpedoPowerRange;
- private Boolean AutoLoadingTimeEdit;
- private Integer WeaControlToSea;
- private Integer AlliedForcesOilProvide;
- private Boolean AvoidSearchElementEdit;
- private Boolean AttackNeglectPlanLineEdit;
- private Integer Sonar;
- private Boolean WeaControlToGroundEdit;
- private Boolean WeaControlToDiveEdit;
- private Boolean WeaControlToSeaEdit;
- private Integer MsgType;
- private Boolean AirActionTempoEdit;
- private Boolean SkyToGroundShotEdit;
- private Boolean WeaControlToSkyEdit;
- private Integer AvoidSearchElement;
- private Integer SurveyMenaceToDive;
- private Integer AttackWeaponRedeploy;
- private Boolean ConsistentSuperiors;
- private Integer DefendWeaponReturn;
- private Integer WeaponStatusReturn;
- private Boolean AutoEvasionEdit;
- private Integer Jammer;
- private Integer WeaponStatusPlan;
- private Integer Laser;
- private Integer DamageLevelReturn;
- private Integer RuleLevelType;
- private Boolean UseShipAirMissileEdit;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Route.java b/src/main/java/com/hivekion/scenario/bean/Route.java
deleted file mode 100644
index 3ea55e7..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Route.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONArray;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Route {
- private String Uuid;
- private JSONArray FlyPath;
- private Integer MsgType;
- private JSONArray SupportPath;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/ScenarioData.java b/src/main/java/com/hivekion/scenario/bean/ScenarioData.java
deleted file mode 100644
index 0ef7766..0000000
--- a/src/main/java/com/hivekion/scenario/bean/ScenarioData.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONArray;
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class ScenarioData {
- private Integer continueTime;
- private String planDesc;
- private double leftDownLat;
- private String treeList;
- private String planName;
- private double rightUpLon;
- private double leftDownLon;
- private long wasterTime;
- private String planId;
- private String startTime;
- private String author;
- private String planImage;
- private double rightUpLat;
- private String planTime;
- private double leftUpLat;
- private double rightDownLat;
- private String startDate;
- private double leftUpLon;
- private String planDate;
- private RegulationsRule regulationsRule;
-
- private List unitList; //编制
- private List taskList;
- private List periodWeather;
- private List routesList;
- private List groupList;
- private List mountList;
- private List sensorsList;
-
-
-
- private Integer BlueGroupNum;
- private String MetoEnvironment;
- private JSONArray ProAreaList;
- private Integer RedGroupNum;
- private String WeatherInfo;
-
- private JSONArray blockList;
-
-
-
- private String scenTest;
-
-
-
-
-
-
-
-
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/ScenarioWsParam.java b/src/main/java/com/hivekion/scenario/bean/ScenarioWsParam.java
index f4c0ccc..5dc2830 100644
--- a/src/main/java/com/hivekion/scenario/bean/ScenarioWsParam.java
+++ b/src/main/java/com/hivekion/scenario/bean/ScenarioWsParam.java
@@ -13,6 +13,11 @@ import lombok.Data;
*/
@Data
public class ScenarioWsParam {
+
//放大倍数
private Integer mag;
+
+ public ScenarioWsParam(Integer mag) {
+ this.mag = mag;
+ }
}
diff --git a/src/main/java/com/hivekion/scenario/bean/Sensors.java b/src/main/java/com/hivekion/scenario/bean/Sensors.java
deleted file mode 100644
index b89fdc9..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Sensors.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONArray;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Sensors {
- private String Uuid;
- private Integer MsgType;
- private JSONArray SensorsData;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Task.java b/src/main/java/com/hivekion/scenario/bean/Task.java
deleted file mode 100644
index 6fde602..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Task.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONObject;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class Task {
- private JSONObject TargetDetailListInfo;
- private JSONObject UnitAllocation;
- private JSONObject TaskBaseInfo;
- private String Guid;
- private Integer MsgType;
- private Integer DeducType;
- private JSONObject RuleSetInfo;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/TeamPeoWeaInfo.java b/src/main/java/com/hivekion/scenario/bean/TeamPeoWeaInfo.java
deleted file mode 100644
index 10813ce..0000000
--- a/src/main/java/com/hivekion/scenario/bean/TeamPeoWeaInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-public class TeamPeoWeaInfo {
- private Integer OrganId;
- private String OrganName;
- private List EquipInfo;
- private List PostInfo;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Unit.java b/src/main/java/com/hivekion/scenario/bean/Unit.java
deleted file mode 100644
index 2f5dd9b..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Unit.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import java.math.BigDecimal;
-import java.util.List;
-import lombok.Data;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@Data
-@JsonInclude(Include.ALWAYS)
-public class Unit {
- private Integer ChemicalEquipNum;
- private Integer LogisticsSupportType;
- private Integer TeamProvisionFoodInfo;
- private Integer GenericEquipNum;
- private Integer EngineerConsume;
- private Integer CarEquipNum;
- private String TrainLevel;
- private Integer MinesweepAmmunitionInfo;
- private Integer AirEquipNum;
- private Integer PeoShroudBuryConsume;
- private Integer DamageTargetType;
- private Integer PeoBloodMedicalConsume;
- private Integer AntitankAmmunitionConsume;
- private BigDecimal Longitude;
- private Integer MinesweepTotalConsume;
- private Integer LightAmmunitionConsume;
- private Integer PressAmmunitionInfo;
- private Integer HitTarget;
- private Integer TeamPeopleNum;
- private Integer TeamSupportType;
- private Integer TeamFieldOperationsFoodInfo;
- private Integer TeamBurialBagInfo;
- private String FormationName;
- private Integer AntitankAmmunitionInfo;
- private Boolean ElecStatus;
- private Integer TeamBloodInfo;
- private String UnitTeamTreeInfo;
- private Integer AntitankTotalConsume;
- private Integer OilWheelEquipNum;
- private Integer WaterSafeDay;
- private Integer StrikePosition;
- private Integer PressAmmunitionConsume;
- private Integer SuppressConsume;
- private Integer ModelScale;
- private Integer MaterialStrike;
- private Integer ChemicalTotalConsume;
- private Integer LightAmmunitionInfo;
- private String Rname;
- private Integer MsgType;
- private Integer PressTotalConsume;
- private Integer EngineerEquipNum;
- private Integer TeamMedicinalInfo;
- private Integer ExplosivesTotalConsume;
- private Integer ArmorEquipNum;
- private Integer PeoHerbMedicalConsume;
- private Integer AirAmmunitionConsume;
- private Integer LogisticsAspectType;
- private Integer LaserCalType;
- private Integer EquipOilConsume;
- private Integer HurtPeopleNum;
- private Integer ModelSizeChangeMultiple;
- private Integer ChemicalConsume;
- private Integer PeoFieldOperationsFoodConsume;
- private BigDecimal Latitude;
- private String Creator;
- private Integer FoodSafeDay;
- private String Guid;
- private String Name;
- private Integer TeamQuiltInfo;
- private Integer DamageRusult;
- private Integer SmokeFireTotalConsume;
- private Integer SmokeFireAmmunitionConsume;
- private Boolean FoodStatus;
- private Integer UnitType;
- private Integer ChemicalAmmunitionInfo;
- private Integer PeoWaterConsume;
- private Integer OilArmorEquipNum;
- private BigDecimal Course;
- private Integer AirConsume;
- private Boolean OrNotWaterCar;
- private Integer AirAmmunitionInfo;
- private String Flag;
- private Integer EntityType;
- private Integer InveEquipNum;
- private Integer LightTotalConsume;
- private String State;
- private JSONArray FightActionInfo;
- private Integer TeamEquipNum;
- private Integer DeducType;
- private Integer InveConsume;
- private Integer ReactorConsume;
- private Integer ElecSafeDay;
- private Integer ExplosivesAmmunitionInfo;
- private BigDecimal TeamWaterInfo;
- private Integer ArmorConsume;
- private Integer ChemicalAmmunitionConsume;
- private Integer GenericConsume;
- private Integer MinesweepAmmunitionConsume;
- private Integer SmokeFireAmmunitionInfo;
- private Integer PeoProvisionFoodConsume;
- private Integer OilInfo;
- private Integer ExplosivesAmmunitionConsume;
- private Boolean MedicalStatus;
- private Boolean WaterStatus;
- private Integer SuppressEquipNum;
- private BigDecimal Height;
- private Integer DeadPeopleNum;
- private Integer PeoQuiltConsume;
- private Integer ReactorEquipNum;
- private Integer Speed;
- private String Uuid;
- private Integer CarConsume;
- private Integer ThirdFunctionState;
- private Integer MedicalSafeDay;
- private Integer AirTotalConsume;
-
- private List TeamPeoWeaInfo;
- private RegulationsRule RegulationsRule;
-}
diff --git a/src/main/java/com/hivekion/scenario/bean/Weather.java b/src/main/java/com/hivekion/scenario/bean/Weather.java
deleted file mode 100644
index fe7e635..0000000
--- a/src/main/java/com/hivekion/scenario/bean/Weather.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.hivekion.scenario.bean;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-@JsonInclude(Include.ALWAYS)
-public class Weather {
-
-}
diff --git a/src/main/java/com/hivekion/scenario/controller/BattleSupplierController.java b/src/main/java/com/hivekion/scenario/controller/BattleSupplierController.java
new file mode 100644
index 0000000..fd97cdd
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/controller/BattleSupplierController.java
@@ -0,0 +1,75 @@
+package com.hivekion.scenario.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hivekion.common.entity.ResponseData;
+import com.hivekion.common.uuid.IdUtils;
+import com.hivekion.scenario.entity.BattleSupplier;
+import com.hivekion.scenario.entity.ScenarioResource;
+import com.hivekion.scenario.service.IBattleSupplierService;
+import com.hivekion.scenario.service.ScenarioResourceService;
+import com.hivekion.team.entity.Teaminfo;
+import com.hivekion.team.service.ITeaminfoService;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-15
+ */
+@Controller
+@RequestMapping("/battleSupplier")
+public class BattleSupplierController {
+
+ @Resource
+ private IBattleSupplierService battleSupplierService;
+ @Resource
+ private ITeaminfoService teamInfoService;
+ @Resource
+ private ScenarioResourceService resourceService;
+
+ @PostMapping("/save")
+ public ResponseData save(@RequestBody BattleSupplier battleSupplier) {
+ if (battleSupplier.getId() == null) {
+ battleSupplier.setId(IdUtils.simpleUUID());
+ battleSupplierService.save(battleSupplier);
+ } else {
+ battleSupplierService.updateById(battleSupplier);
+ }
+ return ResponseData.success(null);
+ }
+
+ @GetMapping("/remove/{id}")
+ public ResponseData remove(@PathVariable String id) {
+ battleSupplierService.removeById(id);
+ return ResponseData.success(null);
+ }
+
+ @GetMapping("/list")
+ public ResponseData> list(String supplierId) {
+ Map map = teamInfoService.teamInfoMap();
+ Map resourceMap = resourceService.resourceMap();
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("supplier_resource_id", supplierId);
+ List list = battleSupplierService.list(queryWrapper);
+ list.forEach(item -> {
+ if (resourceMap.get(item.getBattleResourceId()) != null) {
+ ScenarioResource resource = resourceMap.get(item.getBattleResourceId());
+ if (map.get(resource.getResourceId()) != null) {
+ item.setSupplierResourceName(map.get(resource.getResourceId()).getName());
+ }
+ }
+ });
+ return ResponseData.success(list);
+ }
+}
diff --git a/src/main/java/com/hivekion/scenario/controller/RoomLogController.java b/src/main/java/com/hivekion/scenario/controller/RoomLogController.java
new file mode 100644
index 0000000..699faaa
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/controller/RoomLogController.java
@@ -0,0 +1,33 @@
+package com.hivekion.scenario.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hivekion.common.entity.ResponseData;
+import com.hivekion.scenario.entity.RoomLog;
+import com.hivekion.scenario.service.IRoomLogService;
+import java.util.List;
+import javax.annotation.Resource;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ * 前端控制器
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-17
+ */
+@RestController
+@RequestMapping("/scenario/roomLog")
+public class RoomLogController {
+
+ @Resource
+ private IRoomLogService roomLogService;
+
+ @GetMapping("/list")
+ public ResponseData> list(String roomId) {
+
+ return ResponseData.success(roomLogService.roomLogListLimit10(roomId));
+ }
+}
diff --git a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java
index 58648ce..6ffa79b 100644
--- a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java
+++ b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java
@@ -9,14 +9,20 @@ import com.hivekion.common.entity.ResponseData;
import com.hivekion.common.enums.ResultCodeEnum;
import com.hivekion.common.security.SecurityUtils;
import com.hivekion.common.uuid.IdUtils;
+import com.hivekion.enums.ScenarioRoomStatusEnum;
import com.hivekion.scenario.bean.ScenarioWsParam;
+import com.hivekion.scenario.entity.RoomLog;
import com.hivekion.scenario.entity.ScenarioRoom;
+import com.hivekion.scenario.service.IRoomLogService;
import com.hivekion.scenario.service.ScenarioRoomService;
import com.hivekion.scenario.service.ScenarioTaskService;
import io.swagger.annotations.ApiOperation;
import java.time.LocalDateTime;
import java.util.List;
+import java.util.Map;
import javax.annotation.Resource;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -36,14 +42,20 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequestMapping("/scenario/room")
+@Data
+@Slf4j
public class ScenarioRoomController extends BaseController {
- @Resource
- private ScenarioTaskService scenarioTaskService;
+
@Resource
private ScenarioRoomService scenarioRoomService;
@Resource
private ScenarioService scenarioService;
+ @Resource
+ private ScenarioTaskService scenarioTaskService;
+ @Resource
+ private IRoomLogService roomLogService;
+
/**
* 查询想定列表
*
@@ -52,11 +64,16 @@ public class ScenarioRoomController extends BaseController {
@ApiOperation(value = "分页查询房间列表", notes = "")
@GetMapping("/list")
public PagedResultVo list(ScenarioRoom search) {
-
+ Map scenarioMap = scenarioService.scenarioMap();
//设置开始索引
search.setStart(search.getPageSize() * (search.getPageNum() - 1));
//查询结果列表
List list = scenarioRoomService.list(search);
+ for (ScenarioRoom scenarioRoom : list) {
+ if (scenarioMap.get(scenarioRoom.getScenarioId()) != null) {
+ scenarioRoom.setScenarioName(scenarioMap.get(scenarioRoom.getScenarioId()).getName());
+ }
+ }
//查询总数
Long total = scenarioRoomService.count(search);
return list(search, list, total);
@@ -87,24 +104,34 @@ public class ScenarioRoomController extends BaseController {
public ResponseData start(@RequestBody ScenarioRoom room) {
//验证
Scenario scenario = scenarioService.getScenarioById(room.getScenarioId());
- if(scenario==null){
- return ResponseData.generator(ResultCodeEnum.PARAMETER_ERROR.getCode(),"想定不存在",null);
+ if (scenario == null) {
+ return ResponseData.generator(ResultCodeEnum.PARAMETER_ERROR.getCode(), "想定不存在", null);
}
- if(scenarioRoomService.getById(room.getId())==null){
- return ResponseData.generator(ResultCodeEnum.PARAMETER_ERROR.getCode(),"房间不存在",null);
- };
+ if (scenarioRoomService.getById(room.getId()) == null) {
+ return ResponseData.generator(ResultCodeEnum.PARAMETER_ERROR.getCode(), "房间不存在", null);
+ }
+ Global.roomLogQueue.add(RoomLog.createRoomLog(room.getId(), "启动想定",
+ SecurityUtils.getCurrentLoginUser().getUsername()));
+
+ scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.STARTED.getCode());
scenarioTaskService.start(room.getScenarioId(), room.getId());
return ResponseData.success(null);
}
@PostMapping("/break")
public ResponseData breakAWhile(@RequestBody ScenarioRoom room) {
+ Global.roomLogQueue.add(RoomLog.createRoomLog(room.getId(), "暂停想定",
+ SecurityUtils.getCurrentLoginUser().getUsername()));
+ scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.BROKEN.getCode());
scenarioTaskService.sleepWhile(room.getScenarioId(), room.getId());
return ResponseData.success(null);
}
@PostMapping("/wakeUp")
public ResponseData wakeUp(@RequestBody ScenarioRoom room) {
+ Global.roomLogQueue.add(RoomLog.createRoomLog(room.getId(), "想定继续",
+ SecurityUtils.getCurrentLoginUser().getUsername()));
+ scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.STARTED.getCode());
scenarioTaskService.wakeup(room.getScenarioId(), room.getId());
return ResponseData.success(null);
}
@@ -112,20 +139,50 @@ public class ScenarioRoomController extends BaseController {
@PostMapping("/mag")
public ResponseData mag(@RequestBody ScenarioRoom room) {
synchronized (this) {
-
+ Global.roomLogQueue.add(RoomLog.createRoomLog(room.getId(), "想定加速/减速",
+ SecurityUtils.getCurrentLoginUser().getUsername()));
if (Global.roomParamMap.get(room.getScenarioId() + "_" + room.getId()) == null) {
- Global.roomParamMap.put(room.getScenarioId() + "_" + room.getId(), new ScenarioWsParam());
- }
- ScenarioWsParam magValue = Global.roomParamMap.get(room.getScenarioId() + "_" + room.getId());
- magValue.setMag(room.getMag());
- }
+ Global.roomParamMap.put(room.getScenarioId() + "_" + room.getId(), new ScenarioWsParam(room.getMag()));
+ }else{
+ ScenarioWsParam magValue = Global.roomParamMap.get(room.getScenarioId() + "_" + room.getId());
+ magValue.setMag(room.getMag());
+ }
+
+ log.info("magValue:{}",Global.roomParamMap.get(room.getScenarioId() + "_" + room.getId()));
+ }
return ResponseData.success(null);
}
+
+
@PostMapping("/stop")
public ResponseData stop(@RequestBody ScenarioRoom room) {
+ Global.roomLogQueue.add(RoomLog.createRoomLog(room.getId(), "想定结束",
+ SecurityUtils.getCurrentLoginUser().getUsername()));
+ scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.FINISHED.getCode());
scenarioTaskService.stop(room.getScenarioId(), room.getId());
return ResponseData.success(null);
}
+
+ @GetMapping("/view")
+ public ResponseData view(String id) {
+ ScenarioRoom room = scenarioRoomService.getById(id);
+ if (room != null) {
+ Scenario scenario = scenarioService.getScenarioById(room.getScenarioId());
+ room.setScenarioId(scenario.getId());
+ room.setScenario(scenario);
+ room.setScenarioName(scenario.getName());
+ room.setRoomLogs(roomLogService.roomLogListLimit10(id));
+ if (Global.roomParamMap.get(scenario.getId()+"_"+id) == null) {
+ ScenarioWsParam scenarioWsParam = new ScenarioWsParam(1);
+ scenarioWsParam.setMag(1);
+ Global.roomParamMap.put(scenario.getId()+"_"+id, scenarioWsParam);
+ room.setMag(1);
+ } else {
+ room.setMag(Global.roomParamMap.get(scenario.getId()+"_"+id).getMag());
+ }
+ }
+ return ResponseData.success(room);
+ }
}
diff --git a/src/main/java/com/hivekion/scenario/entity/BattleSupplier.java b/src/main/java/com/hivekion/scenario/entity/BattleSupplier.java
new file mode 100644
index 0000000..6e7bb9e
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/entity/BattleSupplier.java
@@ -0,0 +1,34 @@
+package com.hivekion.scenario.entity;
+
+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 io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ *
+ *
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-15
+ */
+@TableName("TBL_BATTLE_SUPPLIER")
+@ApiModel(value = "BattleSupplier对象", description = "")
+@Data
+public class BattleSupplier implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ @TableId(type = IdType.INPUT)
+ private String id;
+ @TableField(value = "battle_resource_id")
+ private String battleResourceId;
+ @TableField(value = "supplier_resource_id")
+ private String supplierResourceId;
+
+ private String supplierResourceName;
+
+}
diff --git a/src/main/java/com/hivekion/scenario/entity/RoomLog.java b/src/main/java/com/hivekion/scenario/entity/RoomLog.java
new file mode 100644
index 0000000..9efd2e8
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/entity/RoomLog.java
@@ -0,0 +1,45 @@
+package com.hivekion.scenario.entity;
+
+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 io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ *
+ *
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-17
+ */
+@TableName("TBL_ROOM_LOG")
+@ApiModel(value = "RoomLog对象", description = "")
+@Data
+public class RoomLog implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ @TableId(type = IdType.INPUT)
+ private String id;
+ @TableField(value = "room_id")
+ private String roomId;
+ @TableField(value = "log_time")
+ private LocalDateTime logTime;
+
+ private String message;
+ @TableField(value = "user_name")
+ private String userName;
+
+ public static RoomLog createRoomLog(String roomId, String message, String userName) {
+ RoomLog roomLog = new RoomLog();
+ roomLog.setRoomId(roomId);
+ roomLog.setLogTime(LocalDateTime.now());
+ roomLog.setMessage(message);
+ roomLog.setUserName(userName);
+ return roomLog;
+ }
+}
diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java b/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java
index 6c4eceb..18703ef 100644
--- a/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java
+++ b/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java
@@ -1,12 +1,14 @@
package com.hivekion.scenario.entity;
+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.hivekion.baseData.entity.Scenario;
import com.hivekion.common.entity.SearchInputVo;
-import java.io.Serializable;
-import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import java.time.LocalDateTime;
+import java.util.List;
import javax.validation.constraints.NotNull;
import lombok.Data;
@@ -21,22 +23,30 @@ import lombok.Data;
@TableName("TBL_SCENARIO_ROOM")
@ApiModel(value = "ScenarioRoom对象", description = "想定房间")
@Data
-public class ScenarioRoom extends SearchInputVo {
+public class ScenarioRoom extends SearchInputVo {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+ @TableId(type = IdType.INPUT)
+ private String id;
+ @NotNull(message = "房间号不能为空")
+ @TableField(value = "room_name")
+ private String roomName;
+ @NotNull(message = "想定ID不能为空")
+ @TableField(value = "scenario_id")
+ private Integer scenarioId;
+ @TableField(value = "user_id")
+ private String userId;
+ @TableField(value = "create_time")
+ private LocalDateTime createTime;
+ @TableField(exist = false)
+ private Integer mag = 1;
+ private Integer status = 0;
+ @TableField(exist = false)
+ private String scenarioName;
+ @TableField(exist = false)
+ private Scenario scenario;
+ @TableField(exist = false)
+ private List roomLogs;
- private String id;
- @NotNull(message = "房间号不能为空")
- @TableField(value="room_name")
- private String roomName;
- @NotNull(message = "想定ID不能为空")
- @TableField(value="scenario_id")
- private Integer scenarioId;
- @TableField(value="user_id")
- private String userId;
- @TableField(value="create_time")
- private LocalDateTime createTime;
- @TableField(exist = false)
- private Integer mag;
}
diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
index f44ba62..faae520 100644
--- a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
+++ b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
@@ -58,5 +58,11 @@ public class ScenarioTask implements Serializable {
private String taskType;
@TableField(exist = false)
private String status = "init";
+ @TableField(value = "during_time")
+ private Integer duringTime;
+ @TableField(value = "supplier_resource_id")
+ private String supplierResourceId;
+ @TableField(value = "supplier_num")
+ private double supplierNum;
}
diff --git a/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java b/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java
new file mode 100644
index 0000000..0426a64
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/mapper/BattleSupplierMapper.java
@@ -0,0 +1,16 @@
+package com.hivekion.scenario.mapper;
+
+import com.hivekion.scenario.entity.BattleSupplier;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-15
+ */
+public interface BattleSupplierMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/hivekion/scenario/mapper/RoomLogMapper.java b/src/main/java/com/hivekion/scenario/mapper/RoomLogMapper.java
new file mode 100644
index 0000000..5e354a4
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/mapper/RoomLogMapper.java
@@ -0,0 +1,16 @@
+package com.hivekion.scenario.mapper;
+
+import com.hivekion.scenario.entity.RoomLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-17
+ */
+public interface RoomLogMapper extends BaseMapper {
+
+}
diff --git a/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java b/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java
new file mode 100644
index 0000000..ee247d7
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/service/IBattleSupplierService.java
@@ -0,0 +1,19 @@
+package com.hivekion.scenario.service;
+
+import com.hivekion.scenario.entity.BattleSupplier;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-15
+ */
+public interface IBattleSupplierService extends IService {
+ public Set getBattleResourceBySupplierId(String id);
+ public Set getSupplierIdByBattleId(String id);
+}
diff --git a/src/main/java/com/hivekion/scenario/service/IRoomLogService.java b/src/main/java/com/hivekion/scenario/service/IRoomLogService.java
new file mode 100644
index 0000000..9ff3f0b
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/service/IRoomLogService.java
@@ -0,0 +1,17 @@
+package com.hivekion.scenario.service;
+
+import com.hivekion.scenario.entity.RoomLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ *
+ * 服务类
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-17
+ */
+public interface IRoomLogService extends IService {
+ List roomLogListLimit10(String roomId);
+}
diff --git a/src/main/java/com/hivekion/scenario/service/ScenarioRoomService.java b/src/main/java/com/hivekion/scenario/service/ScenarioRoomService.java
index 6cd8d96..f8be1e1 100644
--- a/src/main/java/com/hivekion/scenario/service/ScenarioRoomService.java
+++ b/src/main/java/com/hivekion/scenario/service/ScenarioRoomService.java
@@ -15,5 +15,6 @@ import java.util.List;
public interface ScenarioRoomService extends IService {
List list(ScenarioRoom room);
Long count(ScenarioRoom room);
+ void updateStatus(String id,Integer status);
}
diff --git a/src/main/java/com/hivekion/scenario/service/ScenarioTaskService.java b/src/main/java/com/hivekion/scenario/service/ScenarioTaskService.java
index 19bc678..57e3028 100644
--- a/src/main/java/com/hivekion/scenario/service/ScenarioTaskService.java
+++ b/src/main/java/com/hivekion/scenario/service/ScenarioTaskService.java
@@ -17,5 +17,6 @@ public interface ScenarioTaskService extends IService {
void stop(Integer id,String roomId);
void sleepWhile(Integer id,String roomId);
void wakeup(Integer id,String roomId);
+
List queryTaskList(ScenarioTask task);
}
diff --git a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java b/src/main/java/com/hivekion/scenario/service/TaskLogicService.java
deleted file mode 100644
index e0396a1..0000000
--- a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.hivekion.scenario.service;
-
-import com.hivekion.baseData.entity.Scenario;
-import com.hivekion.scenario.TaskFinishedCall;
-import com.hivekion.scenario.entity.ScenarioTask;
-import java.util.List;
-
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
-public interface TaskLogicService {
-
- //移动任务
- void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId,double speed,
- TaskFinishedCall call);
- //战斗任务
- void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId,
- List injuredTimeList);
- //保障任务
-
- void supplierTask(ScenarioTask task,Scenario scenario, String roomId);
-
-
-}
diff --git a/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java
new file mode 100644
index 0000000..d11c8a6
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/service/impl/BattleSupplierServiceImpl.java
@@ -0,0 +1,41 @@
+package com.hivekion.scenario.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hivekion.scenario.entity.BattleSupplier;
+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;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-15
+ */
+@Service
+public class BattleSupplierServiceImpl extends ServiceImpl implements IBattleSupplierService {
+
+ @Override
+ public Set getBattleResourceBySupplierId(String id) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("supplier_resource_id",id);
+ List list = this.list(queryWrapper);
+ return list.stream().map(BattleSupplier::getBattleResourceId).collect(Collectors.toSet());
+ }
+
+ @Override
+ public Set getSupplierIdByBattleId(String id) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("battle_resource_id",id);
+ List list = this.list(queryWrapper);
+
+ return list.stream().map(BattleSupplier::getSupplierResourceId).collect(Collectors.toSet());
+ }
+}
diff --git a/src/main/java/com/hivekion/scenario/service/impl/RoomLogServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/RoomLogServiceImpl.java
new file mode 100644
index 0000000..1953825
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/service/impl/RoomLogServiceImpl.java
@@ -0,0 +1,32 @@
+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.RoomLog;
+import com.hivekion.scenario.mapper.RoomLogMapper;
+import com.hivekion.scenario.service.IRoomLogService;
+import java.util.List;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 服务实现类
+ *
+ *
+ * @author liDongYu
+ * @since 2025-09-17
+ */
+@Service
+public class RoomLogServiceImpl extends ServiceImpl implements
+ IRoomLogService {
+
+ @Override
+ public List roomLogListLimit10(String roomId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("room_id", roomId == null ? "0" : roomId);
+ queryWrapper.orderByAsc("log_time");
+ queryWrapper.last("limit 10");
+ return list(queryWrapper);
+
+ }
+}
diff --git a/src/main/java/com/hivekion/scenario/service/impl/ScenarioRoomServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/ScenarioRoomServiceImpl.java
index 40c3027..3223da3 100644
--- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioRoomServiceImpl.java
+++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioRoomServiceImpl.java
@@ -1,10 +1,9 @@
package com.hivekion.scenario.service.impl;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hivekion.scenario.entity.ScenarioRoom;
import com.hivekion.scenario.mapper.ScenarioRoomMapper;
import com.hivekion.scenario.service.ScenarioRoomService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service;
@@ -17,7 +16,8 @@ import org.springframework.stereotype.Service;
* @since 2025-09-03
*/
@Service
-public class ScenarioRoomServiceImpl extends ServiceImpl implements
+public class ScenarioRoomServiceImpl extends
+ ServiceImpl implements
ScenarioRoomService {
@Override
@@ -30,4 +30,10 @@ public class ScenarioRoomServiceImpl extends ServiceImpl implements
ScenarioTaskService {
- @Resource
- private SpringGlobalTaskManager springGlobalTaskManager;
- @Resource
- private RedisUtil redisUtil;
@Resource
private ScenarioService scenarioService;
@Resource
private IWeatherResourceService weatherResourceService;
- @Resource
- private TaskLogicService taskLogicService;
@Override
public void start(Integer scenarioId, String roomId) {
- log.info("scenarioId::{},roomId::{}", scenarioId, roomId);
- Scenario currentScenario = scenarioService.getScenarioById(scenarioId);
- //想定当前持续时间
- redisUtil.hset(roomId + "_" + scenarioId, "duringTime", "0");
- //想定当前状态
- redisUtil.hset(roomId + "_" + scenarioId, "status", "running");
-
- //查询天气数据
- List weatherList = weatherResourceService.list(
- new QueryWrapper()
- .eq("scenario_id", scenarioId));
-
- //放入天气数据
- redisUtil.hset(roomId + "_" + scenarioId, "weather", JSONArray.toJSONString(weatherList));
- //查询任务
- ScenarioTask queryTask = new ScenarioTask();
- queryTask.setScenarioId(scenarioId);
- redisUtil.hset(roomId + "_" + scenarioId, "taskList",
- JSONArray.toJSONString(queryTaskList(queryTask)));
- new Thread(() -> {
-
- springGlobalTaskManager.startPerSecondTask(roomId + "_" + scenarioId + "_task", () -> {
-
- //时间累计
- increaseTime(currentScenario, roomId);
- //天气触发
- weatherTrigger(currentScenario, roomId);
- //任务触发
- // taskTrigger(currentScenario, roomId);
-
- });
- }).start();
+ //查询想定的持续时间
+ Scenario scenario = scenarioService.getScenarioById(scenarioId);
+ if (scenario != null) {
+ //查看想定的持续时间
+ long duringTime = Duration.between(scenario.getStartTime(),scenario.getEndTime() )
+ .getSeconds();
+ RoomManager.startRoom(roomId, scenario, duringTime);
+ addWeatherEvent(scenario, roomId);
+ addTaskEvent(scenario, roomId);
+ }
}
@Override
public void stop(Integer id, String roomId) {
- if (Global.roomParamMap.get(id + "_" + roomId) != null) {
- Global.roomParamMap.get(id + "_" + roomId).setMag(1);
- }
-
- springGlobalTaskManager.cancelTask(roomId + "_" + id + "_task");
+ RoomManager.stopRoom(roomId);
}
@Override
public void sleepWhile(Integer id, String roomId) {
- redisUtil.hset(roomId + "_" + id, "states", "sleep");
+ RoomManager.stopRoom(roomId);
}
@Override
public void wakeup(Integer id, String roomId) {
- redisUtil.hset(roomId + "_" + id, "states", "running");
- }
-
- private void increaseTime(Scenario currentScenario, String roomId) {
- 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");
- log.info("scenario_id:{},status::{}", currentScenario.getId(), statusObj);
- if (statusObj != null && statusObj.toString().equals("running")) {
- int duringTime = getCurrentDuringTime(currentScenario, roomId);
-
- duringTime = duringTime + mag;
- log.info("duringTime::{}", duringTime);
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", duringTime + "");
- }
-
-
- } catch (
- Exception e) {
- log.error("error::", e);
- }
-
- }
-
- /**
- * 天气触发
- *
- * @param currentScenario 当前想定
- * @param roomId 房间ID
- */
- private void weatherTrigger(Scenario currentScenario, String roomId) {
- try {
- String weatherResources = (String) redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather");
- JSONArray weatherArray = JSONArray.parseArray(weatherResources);
- String weatherStatus = redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather-status") !=null?(String) redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather-status"):null;
- for(int i=0;i= timeBegstamp && StringUtils.isEmpty(weatherStatus)) {
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("start-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather-status","start");
- Global.sendCmdInfoQueue.add(responseCmdInfo);
- }
- else if(timeBegstamp+duringTime >= timeEndstamp && StringUtils.isNotEmpty(weatherStatus)){
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("end-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather-status","end");
- Global.sendCmdInfoQueue.add(responseCmdInfo);
- }else{
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("remain-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- Global.sendCmdInfoQueue.add(responseCmdInfo);
- }
- }
-
-
- } catch (Exception ex) {
-
- log.error(ex.getMessage());
- }
-
-
- }
-
- /**
- * 获取当前想定从开始到现在时间
- *
- * @param scenario
- * @param roomId
- * @return
- */
- private int getCurrentDuringTime(Scenario scenario, String roomId) {
- Object duringTime = redisUtil.hget(roomId + "_" + scenario.getId(), "duringTime");
- if (duringTime != null) {
- return Integer.parseInt(duringTime.toString());
- }
- return 0;
- }
-
- private void taskTrigger(Scenario currentScenario, String roomId) {
- try {
-
- Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status");
- if (statusObj != null && statusObj.toString().equals("running")) {
- Object taskListObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "taskList");
-
- List taskList = JSONArray.parseArray(taskListObj.toString(),
- ScenarioTask.class);
-
- for (ScenarioTask scenarioTask : taskList) {
- int duringTime = getCurrentDuringTime(currentScenario, roomId);
- log.info("task duringTime::{},{},{}", duringTime,
- currentScenario.getStartTime().plusSeconds(duringTime), scenarioTask.getStartTime());
- if (currentScenario.getStartTime().plusSeconds(duringTime)
- .isAfter(scenarioTask.getStartTime())) {
- switch (scenarioTask.getTaskType()) {
- case "1":
-
- taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId, 18.0,
- null);
-
- break;
- case "2":
- Random random = new Random();
- List randomIntList = new ArrayList<>();
- long continueSeconds =
- Duration.between(scenarioTask.getStartTime(), scenarioTask.getEndTime())
- .toMinutes() * 60;
- for (int i = 0; i < 5; i++) {
- randomIntList.add(random.nextInt((int) continueSeconds) + 1);
- }
-
- taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId,
- randomIntList);
-
- break;
- case "4":
- case "5":
- case "6":
- case "7":
- default:
-
- log.info("start a type=7 task");
- taskLogicService.supplierTask(scenarioTask, currentScenario, roomId);
-
-
- }
- }
-
-
- }
-
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "taskList",
- JSONArray.toJSONString(taskList));
- }
- } catch (Exception e) {
- log.error("error::", e);
- }
-
+ RoomManager.resumeRoom(roomId);
}
@@ -281,4 +85,108 @@ public class ScenarioTaskServiceImpl extends
return this.list(queryWrapper);
}
+ /**
+ * 增加天气任务
+ */
+ private void addWeatherEvent(Scenario scenario, String roomId) {
+ List weatherList = weatherResourceService.list();
+
+ for (WeatherResource weatherResource : weatherList) {
+ long diff = Duration.between(weatherResource.getLastBegTime(), scenario.getStartTime())
+ .getSeconds();
+ //开始
+ TaskAction startAction = new TaskAction() {
+ @Override
+ public void doSomeThing() {
+ Global.sendCmdInfoQueue.add(
+ create("start_" + weatherResource.getWeatherType(), scenario, roomId));
+ }
+
+ @Override
+ public String getId() {
+ return "";
+ }
+
+ @Override
+ public String getType() {
+ return "";
+ }
+ };
+ RoomManager.addAction(roomId, diff, startAction);
+ //结束
+ long duringTime = Duration.between(weatherResource.getLastBegTime(),
+ weatherResource.getLastEndTime())
+ .getSeconds();
+ //开始
+ TaskAction endAction = new TaskAction() {
+ @Override
+ public void doSomeThing() {
+ Global.sendCmdInfoQueue.add(
+ create("stop_" + weatherResource.getWeatherType(), scenario, roomId));
+ }
+
+ @Override
+ public String getId() {
+ return "";
+ }
+
+ @Override
+ public String getType() {
+ return "";
+ }
+ };
+ RoomManager.addAction(roomId, diff + duringTime, endAction);
+ }
+ }
+
+ //增加任务
+ private void addTaskEvent(Scenario scenario, String roomId) {
+ ScenarioTask scenarioTask = new ScenarioTask();
+ scenarioTask.setScenarioId(scenario.getId());
+ List taskList = this.queryTaskList(scenarioTask);
+ for (ScenarioTask task : taskList) {
+ try {
+ long diff = Duration.between(scenario.getStartTime(),task.getStartTime())
+ .getSeconds();
+ log.info("diff::{},taskType::{}",diff,task.getTaskType());
+ switch (task.getTaskType()) {
+ //移动任务
+ case "1":
+ MoveRootTask moveRootTask = new MoveRootTask(task, roomId);
+ RoomManager.addAction(roomId, diff, moveRootTask);
+ break;
+ //战斗任务
+ case "2":
+ BattleRootTask battleRootTask = new BattleRootTask(task, roomId);
+ RoomManager.addAction(roomId, diff, battleRootTask);
+ break;
+ //补充保障任务
+ case "4":
+ case "5":
+ case "6":
+ case "7":
+ case "8":
+ SupplierTask supplierTask = new SupplierTask(task, roomId);
+ RoomManager.addAction(roomId, diff, supplierTask);
+ break;
+ default:
+ break;
+ }
+
+
+ } catch (Exception e) {
+ log.error("error::", e);
+ }
+ }
+ }
+
+ private ResponseCmdInfo create(String type, Scenario scenario, String roomId) {
+ ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>();
+ responseCmdInfo.setScenarioId(scenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ responseCmdInfo.setCmdType(type);
+ responseCmdInfo.setScenarioId(scenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ return responseCmdInfo;
+ }
}
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 97dbcbd..7f59601 100644
--- a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java
+++ b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java
@@ -1,27 +1,6 @@
package com.hivekion.scenario.service.impl;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.hivekion.Global;
-import com.hivekion.baseData.entity.Scenario;
-import com.hivekion.common.MultiPointGeoPosition;
-import com.hivekion.common.MultiPointGeoPosition.PositionResult;
-import com.hivekion.common.entity.ResponseCmdInfo;
-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;
-import java.util.Map;
-import javax.annotation.Resource;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
-import org.springframework.web.reactive.function.client.WebClient;
/**
* [类的简要说明]
@@ -33,190 +12,156 @@ import org.springframework.web.reactive.function.client.WebClient;
* @since 2025/7/22
*/
@Service
-public class TaskLogicServiceImpl implements TaskLogicService {
+public class TaskLogicServiceImpl {
- @Resource
- private RedisUtil redisUtil;
- @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,
- double speed, TaskFinishedCall call) {
- ResponseCmdInfo