diff --git a/pom.xml b/pom.xml index 7a605a3..5de3ef9 100644 --- a/pom.xml +++ b/pom.xml @@ -184,12 +184,12 @@ dynamic-datasource-spring-boot-starter 3.5.2 - - - cn.hutool - hutool-all - 5.7.6 - + + + + + + org.springframework.boot diff --git a/src/main/java/com/hivekion/CodeGenerator.java b/src/main/java/com/hivekion/CodeGenerator.java index daa757b..478cf8a 100644 --- a/src/main/java/com/hivekion/CodeGenerator.java +++ b/src/main/java/com/hivekion/CodeGenerator.java @@ -33,7 +33,7 @@ public class CodeGenerator { basePath + "/src/main/resources/mapper/tbl")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { - builder.addInclude("TBL_BATTLE_SUPPLIER".toLowerCase()) // 设置需要生成的表名(多个用逗号分隔) + builder.addInclude("TBL_ROOM_LOG".toLowerCase()) // 设置需要生成的表名(多个用逗号分隔) .addTablePrefix("tbl_"); // 设置过滤表前缀 }) .execute(); diff --git a/src/main/java/com/hivekion/Global.java b/src/main/java/com/hivekion/Global.java index be916f4..7adf6a1 100644 --- a/src/main/java/com/hivekion/Global.java +++ b/src/main/java/com/hivekion/Global.java @@ -3,7 +3,7 @@ package com.hivekion; import com.hivekion.common.entity.RequestCmdInfo; import com.hivekion.common.entity.ResponseCmdInfo; import com.hivekion.scenario.bean.ScenarioWsParam; -import java.util.HashMap; +import com.hivekion.scenario.entity.RoomLog; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; @@ -21,6 +21,6 @@ import java.util.concurrent.LinkedBlockingQueue; public class Global { public static BlockingQueue receiveCmdInfoQueue = new LinkedBlockingQueue<>(10000); public static BlockingQueue> sendCmdInfoQueue = new LinkedBlockingQueue<>(); - public static Map roomParamMap = new ConcurrentHashMap<>(); - + public static Map roomParamMap = new ConcurrentHashMap<>(); + public static BlockingQueue roomLogQueue = new LinkedBlockingQueue<>(1000); } 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/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/scenario/bean/Group.java b/src/main/java/com/hivekion/enums/TaskEnum.java similarity index 59% rename from src/main/java/com/hivekion/scenario/bean/Group.java rename to src/main/java/com/hivekion/enums/TaskEnum.java index 9223ac8..b51ed08 100644 --- a/src/main/java/com/hivekion/scenario/bean/Group.java +++ b/src/main/java/com/hivekion/enums/TaskEnum.java @@ -1,6 +1,4 @@ -package com.hivekion.scenario.bean; - -import lombok.Data; +package com.hivekion.enums; /** * [类的简要说明] @@ -11,7 +9,10 @@ import lombok.Data; * @author LiDongYU * @since 2025/7/22 */ -@Data -public class Group { +public enum TaskEnum { + MOVE, + + FIGHT, + } 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..6843782 --- /dev/null +++ b/src/main/java/com/hivekion/room/RoomManager.java @@ -0,0 +1,54 @@ +package com.hivekion.room; + +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, long time) { + Room room = new Room(id); + 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/Room.java b/src/main/java/com/hivekion/room/bean/Room.java new file mode 100644 index 0000000..f08bf5c --- /dev/null +++ b/src/main/java/com/hivekion/room/bean/Room.java @@ -0,0 +1,139 @@ +package com.hivekion.room.bean; + +import com.hivekion.common.uuid.IdUtils; +import com.hivekion.room.func.TaskAction; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +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; + +/** + * [类的简要说明] + *

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

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class Room implements AutoCloseable { + + + private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private ScheduledFuture future; + private String roomId; + private Map> actionMap = new ConcurrentHashMap<>(); + + //线程池 + private final ExecutorService actionExecutor = + new ThreadPoolExecutor( + 5, 5, // corePoolSize, maximumPoolSize + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(1000), // 有界队列,只允许100个待执行任务 + new ThreadPoolExecutor.AbortPolicy() // 超出直接抛异常 + ); + + public Room(String roomId) { + this.roomId = roomId; + } + + /** + * 剩余时间 + */ + private AtomicLong duringTime = new AtomicLong(0); + private AtomicLong totalTime = new AtomicLong(0); + + private int mag = 1; + + //获取剩余时间 + public long getDuringTime() { + return duringTime.get(); + } + + /** + * 启动 + * + * @param time 总时间 + */ + public void start(long time) { + totalTime.set(time); + startTask(); + } + + /** + * 停止 + */ + public void stop() { + cancelTask(); + } + + /** + * 暂停 + */ + public void pause() { + cancelTask(); + } + public void resume() { + startTask(); + } + /** + * 快进 + * + * @param mag 放大倍数 + */ + public void magChange(int mag) { + this.mag = mag; + } + + // 启动定时任务 + private void startTask() { + if (future == null || future.isCancelled()) { + future = scheduler.scheduleAtFixedRate(() -> { + long curTime = duringTime.addAndGet(this.mag); // 推荐用 addAndGet + Map actions = actionMap.get(curTime); + if (actions != null && !actions.isEmpty()) { + // 先复制key,避免并发删除问题 + for (Map.Entry entry : actions.entrySet()) { + actionExecutor.submit(entry.getValue()::doSomeThing); + } + // 全部执行后再清空 + actions.clear(); + // 或者 actionMap.remove(curTime); 如果你不需要重用这个 key + actionMap.remove(curTime); + } + }, 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(); + } + } +} diff --git a/src/main/java/com/hivekion/scenario/bean/EquipInfo.java b/src/main/java/com/hivekion/room/func/TaskAction.java similarity index 53% rename from src/main/java/com/hivekion/scenario/bean/EquipInfo.java rename to src/main/java/com/hivekion/room/func/TaskAction.java index 976b7b2..ae416e5 100644 --- a/src/main/java/com/hivekion/scenario/bean/EquipInfo.java +++ b/src/main/java/com/hivekion/room/func/TaskAction.java @@ -1,6 +1,4 @@ -package com.hivekion.scenario.bean; - -import lombok.Data; +package com.hivekion.room.func; /** * [类的简要说明] @@ -11,7 +9,8 @@ import lombok.Data; * @author LiDongYU * @since 2025/7/22 */ -@Data -public class EquipInfo { +@FunctionalInterface +public interface TaskAction { + void doSomeThing(); } 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/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/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..2d06871 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/controller/RoomLogController.java @@ -0,0 +1,37 @@ +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) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("room_id", roomId==null?"0":roomId); + queryWrapper.orderByAsc("log_time"); + queryWrapper.last("limit 10"); + List roomLogs = roomLogService.list(queryWrapper); + return ResponseData.success(roomLogs); + } +} diff --git a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java index 58648ce..c4ff97d 100644 --- a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java +++ b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java @@ -9,13 +9,16 @@ 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.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 org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; @@ -38,12 +41,14 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/scenario/room") public class ScenarioRoomController extends BaseController { - @Resource - private ScenarioTaskService scenarioTaskService; + @Resource private ScenarioRoomService scenarioRoomService; @Resource private ScenarioService scenarioService; + @Resource + private ScenarioTaskService scenarioTaskService; + /** * 查询想定列表 * @@ -52,11 +57,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 +97,31 @@ 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,7 +129,7 @@ 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()); } @@ -122,8 +139,13 @@ public class ScenarioRoomController extends BaseController { 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); } 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..87a09cb 100644 --- a/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java +++ b/src/main/java/com/hivekion/scenario/entity/ScenarioRoom.java @@ -38,5 +38,8 @@ public class ScenarioRoom extends SearchInputVo { private LocalDateTime createTime; @TableField(exist = false) private Integer mag; + private Integer status = 0; + @TableField(exist = false) + private String scenarioName; } 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..24eee51 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/service/IRoomLogService.java @@ -0,0 +1,16 @@ +package com.hivekion.scenario.service; + +import com.hivekion.scenario.entity.RoomLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author liDongYu + * @since 2025-09-17 + */ +public interface IRoomLogService extends IService { + +} 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..ca42873 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/service/impl/RoomLogServiceImpl.java @@ -0,0 +1,20 @@ +package com.hivekion.scenario.service.impl; + +import com.hivekion.scenario.entity.RoomLog; +import com.hivekion.scenario.mapper.RoomLogMapper; +import com.hivekion.scenario.service.IRoomLogService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author liDongYu + * @since 2025-09-17 + */ +@Service +public class RoomLogServiceImpl extends ServiceImpl implements IRoomLogService { + +} 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, 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"); + RoomManager.resumeRoom(roomId); } - 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"); - List weatherList = JSONArray.parseArray(weatherResources, - WeatherResource.class); - int duringTime = getCurrentDuringTime(currentScenario, roomId); - - for (WeatherResource resource : weatherList) { - - if ("init".equals(resource.getStatus())) { - - if (currentScenario.getStartTime().plusSeconds(duringTime) - .isAfter(resource.getLastBegTime())) { - log.info("{}", "start_" + resource.getWeatherType()); - resource.setStatus("running"); - ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>(); - responseCmdInfo.setScenarioId(currentScenario.getId()); - responseCmdInfo.setRoom(roomId); - responseCmdInfo.setCmdType("start_" + resource.getWeatherType()); - responseCmdInfo.setScenarioId(currentScenario.getId()); - responseCmdInfo.setRoom(roomId); - Global.sendCmdInfoQueue.add(responseCmdInfo); - } - - } - if ("running".equals(resource.getStatus())) { - if (currentScenario.getStartTime().plusSeconds(duringTime) - .isAfter(resource.getLastEndTime())) { - log.info("{}", "stopped_" + resource.getWeatherType()); - resource.setStatus("stopped"); - ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>(); - responseCmdInfo.setScenarioId(currentScenario.getId()); - responseCmdInfo.setRoom(roomId); - responseCmdInfo.setCmdType("stop_" + resource.getWeatherType()); - responseCmdInfo.setScenarioId(currentScenario.getId()); - responseCmdInfo.setRoom(roomId); - Global.sendCmdInfoQueue.add(responseCmdInfo); - } - } - - } - redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather", - JSONArray.toJSONString(weatherList)); - - - } 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); - } - - } @Override @@ -279,4 +81,44 @@ 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(); + //开始 + RoomManager.addAction(roomId, diff, () -> { + + Global.sendCmdInfoQueue.add( + create("start_" + weatherResource.getWeatherType(), scenario, roomId)); + }); + //结束 + long duringTime = Duration.between(weatherResource.getLastBegTime(), + weatherResource.getLastEndTime()) + .getSeconds(); + RoomManager.addAction(roomId, diff + duringTime, () -> { + Global.sendCmdInfoQueue.add( + create("stop_" + weatherResource.getWeatherType(), scenario, roomId)); + }); + } + } + + private void addTaskEvent(Scenario scenario, String roomId) { + + + + } + + 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> cmdInfo = new ResponseCmdInfo<>(); - Map dataMap = new HashMap<>(); - cmdInfo.setData(dataMap); - dataMap.put("resourceId", scenarioTask.getResourceId()); - cmdInfo.setScenarioId(scenarioTask.getScenarioId()); - cmdInfo.setRoom(roomId); - if ("init".equals(scenarioTask.getStatus())) { - scenarioTask.setStatus("running"); - - String url = pathPlanningUrl + "?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(url) - .retrieve() - .bodyToMono(String.class) - .block(); - com.alibaba.fastjson2.JSONObject resultObject = JSON.parseObject(result); - if (result != null) { - cmdInfo.setCmdType("init_path_planning"); - - - dataMap.put("points", resultObject); - - redisUtil.hset(roomId + "_" + currentScenario.getId(), - scenarioTask.getId() + "_path_points", result); - } - - Global.sendCmdInfoQueue.add(cmdInfo); - //设置获取物资信息 - StatisticBean statistic = statisticService.statistic(scenarioTask.getResourceId()); - redisUtil.hset(roomId + "_" + currentScenario.getId(), - "resourceId_statistic_" + scenarioTask.getResourceId(), JSON.toJSONString(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(), -// scenarioTask.getId() + "_path_points"); -// if (pathsObj != null) { -// JSONObject paths = JSONObject.parseObject(pathsObj.toString()); +// @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; // -// com.alibaba.fastjson2.JSONArray pointsArray = paths.getJSONArray("paths").getJSONObject(0) -// .getJSONObject("points").getJSONArray("coordinates"); +// @Override +// public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId, +// double speed, TaskFinishedCall call) { +// ResponseCmdInfo> cmdInfo = new ResponseCmdInfo<>(); +// Map dataMap = new HashMap<>(); +// cmdInfo.setData(dataMap); +// dataMap.put("resourceId", scenarioTask.getResourceId()); +// cmdInfo.setScenarioId(scenarioTask.getScenarioId()); +// cmdInfo.setRoom(roomId); +// if ("init".equals(scenarioTask.getStatus())) { +// scenarioTask.setStatus("running"); // -// for (int i = 0; i < pointsArray.size(); i++) { -// com.alibaba.fastjson2.JSONArray coordinateArray = pointsArray.getJSONArray(i); -// double[] data = new double[coordinateArray.size()]; -// for (int j = 0; j < coordinateArray.size(); j++) { -// data[j] = coordinateArray.getDouble(j); -// } -// points.add(data); -// } -// } -// //查看当前想定持续的时间 -// Object duringObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), -// "duringTime"); -// if (duringObj != null) { -// int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0; -// PositionResult result = MultiPointGeoPosition.getPosition(points, speed, -// oldValue); -// dataMap.put("currentPosition", result); -// if (result.reached) { -// if (call != null) { -// call.doneTask(); -// } -// } +// String url = pathPlanningUrl + "?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(url) +// .retrieve() +// .bodyToMono(String.class) +// .block(); +// com.alibaba.fastjson2.JSONObject resultObject = JSON.parseObject(result); +// if (result != null) { +// cmdInfo.setCmdType("init_path_planning"); +// +// +// dataMap.put("points", resultObject); +// +// redisUtil.hset(roomId + "_" + currentScenario.getId(), +// scenarioTask.getId() + "_path_points", result); // } +// // Global.sendCmdInfoQueue.add(cmdInfo); - } - - } - - @Override - public void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId, - List injuredTime) { - 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); - - } - //受伤 - injuredTime.forEach(time -> { - if (time == seconds) { - if (statistic.getPerson().getCurrent() > 0) { - statistic.getPerson().setCurrent(statistic.getPerson().getCurrent() - 1); - } - - } - }); - //产生任务 - - setStatistic(task, scenario, roomId, statistic); - } - - - @Override - public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) { - - //运20速度 - 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 JSON.parseObject(statisticObj.toString(), StatisticBean.class); - } - return new StatisticBean(); - } - } - - private void setStatistic(ScenarioTask task, Scenario scenario, String roomId, - StatisticBean bean) { - redisUtil.hset(roomId + "_" + scenario.getId(), - "resourceId_statistic_" + task.getResourceId(), JSON.toJSONString(bean)); - //推送到前端 - ResponseCmdInfo> cmdInfo = new ResponseCmdInfo<>(); - Map dataMap = new HashMap<>(); - cmdInfo.setData(dataMap); - cmdInfo.setScenarioId(scenario.getId()); - cmdInfo.setRoom(roomId); - dataMap.put("resourceId", task.getResourceId()); - dataMap.put("statistic", bean); - Global.sendCmdInfoQueue.add(cmdInfo); - } - - /** - * 获取当前想定从开始到现在时间 - * - * @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; - } +// //设置获取物资信息 +// StatisticBean statistic = statisticService.statistic(scenarioTask.getResourceId()); +// redisUtil.hset(roomId + "_" + currentScenario.getId(), +// "resourceId_statistic_" + scenarioTask.getResourceId(), JSON.toJSONString(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); +// } +// +// } +// +// } +// +// @Override +// public void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId, +// List injuredTime) { +// 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); +// +// } +// //受伤 +// injuredTime.forEach(time -> { +// if (time == seconds) { +// if (statistic.getPerson().getCurrent() > 0) { +// statistic.getPerson().setCurrent(statistic.getPerson().getCurrent() - 1); +// } +// +// } +// }); +// //产生任务 +// +// setStatistic(task, scenario, roomId, statistic); +// } +// +// +// @Override +// public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) { +// +// //运20速度 +// 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 JSON.parseObject(statisticObj.toString(), StatisticBean.class); +// } +// return new StatisticBean(); +// } +// } +// +// private void setStatistic(ScenarioTask task, Scenario scenario, String roomId, +// StatisticBean bean) { +// redisUtil.hset(roomId + "_" + scenario.getId(), +// "resourceId_statistic_" + task.getResourceId(), JSON.toJSONString(bean)); +// //推送到前端 +// ResponseCmdInfo> cmdInfo = new ResponseCmdInfo<>(); +// Map dataMap = new HashMap<>(); +// cmdInfo.setData(dataMap); +// cmdInfo.setScenarioId(scenario.getId()); +// cmdInfo.setRoom(roomId); +// dataMap.put("resourceId", task.getResourceId()); +// dataMap.put("statistic", bean); +// Global.sendCmdInfoQueue.add(cmdInfo); +// } +// +// /** +// * 获取当前想定从开始到现在时间 +// * +// * @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; +// } } diff --git a/src/main/java/com/hivekion/startup/Init.java b/src/main/java/com/hivekion/startup/Init.java index cbb02ab..48bfa34 100644 --- a/src/main/java/com/hivekion/startup/Init.java +++ b/src/main/java/com/hivekion/startup/Init.java @@ -1,8 +1,11 @@ package com.hivekion.startup; -import com.hivekion.thread.HandleReceiveThread; -import com.hivekion.thread.HandleSendThread; +import com.hivekion.scenario.service.IRoomLogService; +import com.hivekion.thread.HandleReceiveRunnable; +import com.hivekion.thread.HandleSendRunable; +import com.hivekion.thread.RoomLogRunnable; import javax.annotation.PostConstruct; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,11 +21,13 @@ import org.springframework.stereotype.Component; @Component @Slf4j public class Init { - + @Resource + private IRoomLogService roomLogService; @PostConstruct public void appInit() { log.info("Init start"); - new Thread(new HandleSendThread()).start(); - new Thread(new HandleReceiveThread()).start(); + new Thread(new HandleSendRunable()).start(); + new Thread(new HandleReceiveRunnable()).start(); + new Thread(new RoomLogRunnable(roomLogService)).start(); } } diff --git a/src/main/java/com/hivekion/thread/HandleReceiveThread.java b/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java similarity index 76% rename from src/main/java/com/hivekion/thread/HandleReceiveThread.java rename to src/main/java/com/hivekion/thread/HandleReceiveRunnable.java index 55f2745..14e252a 100644 --- a/src/main/java/com/hivekion/thread/HandleReceiveThread.java +++ b/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java @@ -9,7 +9,7 @@ package com.hivekion.thread; * @author LiDongYU * @since 2025/7/22 */ -public class HandleReceiveThread implements Runnable { +public class HandleReceiveRunnable implements Runnable { @Override public void run() { diff --git a/src/main/java/com/hivekion/thread/HandleSendThread.java b/src/main/java/com/hivekion/thread/HandleSendRunable.java similarity index 78% rename from src/main/java/com/hivekion/thread/HandleSendThread.java rename to src/main/java/com/hivekion/thread/HandleSendRunable.java index 339bfc9..ae7bb4f 100644 --- a/src/main/java/com/hivekion/thread/HandleSendThread.java +++ b/src/main/java/com/hivekion/thread/HandleSendRunable.java @@ -16,16 +16,16 @@ import lombok.extern.slf4j.Slf4j; * @since 2025/7/22 */ @Slf4j -public class HandleSendThread implements Runnable { +public class HandleSendRunable implements Runnable { @Override public void run() { - log.info("HandleSendThread start ....................."); + while (!Thread.currentThread().isInterrupted()) { try { - log.info("waiting message"); + ResponseCmdInfo response = Global.sendCmdInfoQueue.take(); - log.info("send response"); + WsServer.sendMessage(response.getScenarioId(), response.getRoom(), JSON.toJSONString(response)); } catch (Exception e) { log.error("error::", e); diff --git a/src/main/java/com/hivekion/thread/RoomLogRunnable.java b/src/main/java/com/hivekion/thread/RoomLogRunnable.java new file mode 100644 index 0000000..484dc49 --- /dev/null +++ b/src/main/java/com/hivekion/thread/RoomLogRunnable.java @@ -0,0 +1,39 @@ +package com.hivekion.thread; + +import com.hivekion.Global; +import com.hivekion.common.uuid.IdUtils; +import com.hivekion.scenario.entity.RoomLog; +import com.hivekion.scenario.service.IRoomLogService; +import lombok.extern.slf4j.Slf4j; + +/** + * [类的简要说明] + *

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

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Slf4j +public class RoomLogRunnable implements Runnable { + + private final IRoomLogService roomLogService; + + public RoomLogRunnable(IRoomLogService roomLogService) { + this.roomLogService = roomLogService; + } + + @Override + public void run() { + while(!Thread.currentThread().isInterrupted()){ + try{ + RoomLog roomLog = Global.roomLogQueue.take(); + roomLog.setId(IdUtils.simpleUUID()); + roomLogService.save(roomLog); + } catch (Exception e) { + log.error("error::",e); + } + } + } +} diff --git a/src/main/java/com/hivekion/thread/SpringGlobalTaskManager.java b/src/main/java/com/hivekion/thread/SpringGlobalTaskManager.java index dd7d359..bc25f8f 100644 --- a/src/main/java/com/hivekion/thread/SpringGlobalTaskManager.java +++ b/src/main/java/com/hivekion/thread/SpringGlobalTaskManager.java @@ -1,5 +1,6 @@ package com.hivekion.thread; +import cn.hutool.extra.spring.SpringUtil; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; diff --git a/src/main/resources/mapper/tbl/BattleSupplierMapper.xml b/src/main/resources/mapper/tbl/BattleSupplierMapper.xml new file mode 100644 index 0000000..8b15571 --- /dev/null +++ b/src/main/resources/mapper/tbl/BattleSupplierMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/tbl/RoomLogMapper.xml b/src/main/resources/mapper/tbl/RoomLogMapper.xml new file mode 100644 index 0000000..bb36e82 --- /dev/null +++ b/src/main/resources/mapper/tbl/RoomLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/test/java/com/hivekion/ApplicationTest.java b/src/test/java/com/hivekion/ApplicationTest.java index c6658d6..1760d2d 100644 --- a/src/test/java/com/hivekion/ApplicationTest.java +++ b/src/test/java/com/hivekion/ApplicationTest.java @@ -1,14 +1,7 @@ package com.hivekion; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.hivekion.baseData.entity.ModuleStatus; -import com.hivekion.baseData.entity.Scenario; import com.hivekion.baseData.service.ModuleStatusService; -import com.hivekion.baseData.service.ScenarioService; -import com.hivekion.scenario.bean.ScenarioData; -import java.io.UnsupportedEncodingException; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.Test; diff --git a/src/test/java/com/hivekion/JsonTest.java b/src/test/java/com/hivekion/JsonTest.java index dff2786..896bc4c 100644 --- a/src/test/java/com/hivekion/JsonTest.java +++ b/src/test/java/com/hivekion/JsonTest.java @@ -4,24 +4,7 @@ import cn.hutool.core.io.FileUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -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 java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * [类的简要说明] diff --git a/src/test/java/com/hivekion/YY.java b/src/test/java/com/hivekion/YY.java deleted file mode 100644 index fe1dbc5..0000000 --- a/src/test/java/com/hivekion/YY.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.hivekion; - -import com.alibaba.fastjson.JSONArray; -import com.hivekion.scenario.bean.Group; -import com.hivekion.scenario.bean.Mount; -import com.hivekion.scenario.bean.RegulationsRule; -import com.hivekion.scenario.bean.Route; -import com.hivekion.scenario.bean.Sensors; -import com.hivekion.scenario.bean.Task; -import com.hivekion.scenario.bean.Unit; -import com.hivekion.scenario.bean.Weather; -import java.util.List; -import lombok.Data; - -/** - * [类的简要说明] - *

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

- * - * @author LiDongYU - * @since 2025/7/22 - */ -@Data -public class YY { - 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 String 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; -}