From ee505e3fb000664224cca2200482e1abffc6f52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Sun, 21 Sep 2025 07:57:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hivekion/room/bean/Room.java | 9 ++- .../scenario/bean/StatisticConsumeBean.java | 24 +++++++ .../controller/BattleConsumeController.java | 39 ++++++++++- .../controller/ScenarioRoomController.java | 1 + .../scenario/mapper/BattleConsumeMapper.java | 5 +- .../service/IBattleConsumeService.java | 5 +- .../impl/BattleConsumeServiceImpl.java | 12 ++++ .../service/impl/ScenarioTaskServiceImpl.java | 5 ++ .../thread/HandleReceiveRunnable.java | 70 ++++++++++++------- src/main/java/com/hivekion/ws/WsServer.java | 2 +- .../mapper/tbl/BattleConsumeMapper.xml | 32 +++++++++ 11 files changed, 170 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/hivekion/scenario/bean/StatisticConsumeBean.java diff --git a/src/main/java/com/hivekion/room/bean/Room.java b/src/main/java/com/hivekion/room/bean/Room.java index 41a4974..716ad74 100644 --- a/src/main/java/com/hivekion/room/bean/Room.java +++ b/src/main/java/com/hivekion/room/bean/Room.java @@ -28,6 +28,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -68,6 +69,8 @@ public class Room implements AutoCloseable { private RedisUtil redisUtil; private com.hivekion.statistic.service.ScenarioService scenarioService; + + private AtomicInteger numStatus = new AtomicInteger(0); /** * 任务容器 */ @@ -111,12 +114,14 @@ public class Room implements AutoCloseable { //初始化系统资源 物资人员等信息 initRoomParam(); pushRoomInfo(); + numStatus.set(1); } /** * 停止 */ public void stop() { + numStatus.set(3); status.set(false); pushRoomInfo(); cancelTask(); @@ -135,7 +140,7 @@ public class Room implements AutoCloseable { * 暂停 */ public void pause() { - + numStatus.set(2); status.set(false); pushRoomInfo(); cancelTask(); @@ -281,7 +286,7 @@ public class Room implements AutoCloseable { ResponseCmdInfo respObj = new ResponseCmdInfo<>(); Map dataMap = new HashMap<>(); dataMap.put("mag", this.getMag()); - dataMap.put("status", this.getStatus()); + dataMap.put("status", this.numStatus.get()); respObj.setData(dataMap); respObj.setRoom(this.getRoomId()); respObj.setScenarioId(this.getScenario().getId()); diff --git a/src/main/java/com/hivekion/scenario/bean/StatisticConsumeBean.java b/src/main/java/com/hivekion/scenario/bean/StatisticConsumeBean.java new file mode 100644 index 0000000..c7e1f32 --- /dev/null +++ b/src/main/java/com/hivekion/scenario/bean/StatisticConsumeBean.java @@ -0,0 +1,24 @@ +package com.hivekion.scenario.bean; + +import lombok.Data; + +/** + * [类的简要说明] + *

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

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class StatisticConsumeBean { + private String minute; + private double food; + private double fuel; + private double water; + private double medical; + private double ammunition; + private String resourceId; + private String resourceName; +} diff --git a/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java b/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java index cb17d98..d74c197 100644 --- a/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java +++ b/src/main/java/com/hivekion/scenario/controller/BattleConsumeController.java @@ -1,7 +1,17 @@ package com.hivekion.scenario.controller; +import com.hivekion.common.entity.ResponseData; +import com.hivekion.scenario.bean.StatisticConsumeBean; +import com.hivekion.scenario.entity.ScenarioResource; +import com.hivekion.scenario.service.IBattleConsumeService; +import com.hivekion.scenario.service.ScenarioResourceService; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RestController; /** *

@@ -11,8 +21,33 @@ import org.springframework.stereotype.Controller; * @author liDongYu * @since 2025-09-19 */ -@Controller +@RestController @RequestMapping("/scenario/battleConsume") public class BattleConsumeController { + @Resource + private IBattleConsumeService battleConsumeService; + @Resource + private ScenarioResourceService scenarioResourceService; + + @GetMapping("/statistic/minute") + public ResponseData> statisticByMinute() { + return ResponseData.success(battleConsumeService.statistic()); + } + + @GetMapping("/statistic/resource") + public ResponseData> statisticByResource() { + + List list = battleConsumeService.statisticByResource(); + Map resourceMap = scenarioResourceService.resourceMap(); + + list.forEach(item -> { + + if (resourceMap.get(item.getResourceId()) != null) { + item.setResourceName(resourceMap.get(item.getResourceId()).getResourceName()); + } + }); + return ResponseData.success(list.stream().filter(a->a.getResourceName()!=null).collect( + Collectors.toList())); + } } diff --git a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java index c70294e..ac89768 100644 --- a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java +++ b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java @@ -117,6 +117,7 @@ public class ScenarioRoomController extends BaseController { SecurityUtils.getCurrentLoginUser().getUsername())); scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.STARTED.getCode()); + scenarioTaskService.start(room.getScenarioId(), room.getId()); return ResponseData.success(null); } diff --git a/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java b/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java index e8f29e7..38b0c62 100644 --- a/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java +++ b/src/main/java/com/hivekion/scenario/mapper/BattleConsumeMapper.java @@ -1,7 +1,9 @@ package com.hivekion.scenario.mapper; +import com.hivekion.scenario.bean.StatisticConsumeBean; import com.hivekion.scenario.entity.BattleConsume; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; /** *

@@ -12,5 +14,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @since 2025-09-19 */ public interface BattleConsumeMapper extends BaseMapper { - + List statistic(); + List statisticByResource(); } diff --git a/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java b/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java index 6d74af7..cba48e0 100644 --- a/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java +++ b/src/main/java/com/hivekion/scenario/service/IBattleConsumeService.java @@ -1,7 +1,9 @@ package com.hivekion.scenario.service; +import com.hivekion.scenario.bean.StatisticConsumeBean; import com.hivekion.scenario.entity.BattleConsume; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; /** *

@@ -12,5 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2025-09-19 */ public interface IBattleConsumeService extends IService { - + List statistic(); + List statisticByResource(); } diff --git a/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java index 3b5c151..3942b62 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/BattleConsumeServiceImpl.java @@ -1,9 +1,12 @@ package com.hivekion.scenario.service.impl; +import com.hivekion.scenario.bean.StatisticConsumeBean; import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.mapper.BattleConsumeMapper; import com.hivekion.scenario.service.IBattleConsumeService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Collections; +import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,13 @@ import org.springframework.stereotype.Service; @Service public class BattleConsumeServiceImpl extends ServiceImpl implements IBattleConsumeService { + @Override + public List statistic() { + return this.baseMapper.statistic(); + } + + @Override + public List statisticByResource() { + return this.baseMapper.statisticByResource(); + } } diff --git a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java index cd8a5b0..4b5c61f 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -49,13 +49,17 @@ public class ScenarioTaskServiceImpl extends @Override public void start(Integer scenarioId, String roomId) { //查询想定的持续时间 + 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); } } @@ -145,6 +149,7 @@ public class ScenarioTaskServiceImpl extends //增加任务 private void addTaskEvent(Scenario scenario, String roomId) { + log.info("--------------------hello"); ScenarioTask scenarioTask = new ScenarioTask(); scenarioTask.setScenarioId(scenario.getId()); List taskList = this.queryTaskList(scenarioTask); diff --git a/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java b/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java index 7f2d3d1..61ff83e 100644 --- a/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java +++ b/src/main/java/com/hivekion/thread/HandleReceiveRunnable.java @@ -30,22 +30,30 @@ public class HandleReceiveRunnable implements Runnable { try { RequestCmdInfo requestCmdInfo = Global.receiveCmdInfoQueue.take(); - handleMessage(requestCmdInfo); - //消息分发业务bean处理 - if (SpringUtil.getBean(WebsocketMsgWrapper.class) != null) { - try { - WebsocketMsgWrapper websocketMsgWrapper = SpringUtil.getBean(WebsocketMsgWrapper.class); - websocketMsgWrapper.msgHandle(requestCmdInfo.getScenarioId(), requestCmdInfo.getRoom(), - requestCmdInfo.getResourceId(), requestCmdInfo.getMessage()); - } catch (Exception e) { - log.error("error::", e); - } + switch (requestCmdInfo.getCmdType()) { + case "get_init_path": + case "get_room_info": + handleMessage(requestCmdInfo); + break; + default: + //消息分发业务bean处理 + if (SpringUtil.getBean(WebsocketMsgWrapper.class) != null) { + try { + WebsocketMsgWrapper websocketMsgWrapper = SpringUtil.getBean(WebsocketMsgWrapper.class); + websocketMsgWrapper.msgHandle(requestCmdInfo.getScenarioId(), requestCmdInfo.getRoom(), + requestCmdInfo.getResourceId(), requestCmdInfo.getMessage()); + } catch (Exception e) { + log.error("error::", e); + } - } else { - log.warn("==================WebsocketMsgWrapper is null=========================="); + } else { + log.warn("==================WebsocketMsgWrapper is null=========================="); + } } + + } catch (Exception e) { log.error("error::", e); } @@ -72,21 +80,29 @@ public class HandleReceiveRunnable implements Runnable { log.error("error::", e); } } - private void handleGetRootInfo(RequestCmdInfo requestCmdInfo){ - log.info("接收到获取到房间信息::{}", JSON.toJSONString(requestCmdInfo)); - Room room = RoomManager.getRoom(requestCmdInfo.getRoom()); - if (room != null) { - ResponseCmdInfo respObj = new ResponseCmdInfo<>(); - Map dataMap = new HashMap<>(); - dataMap.put("mag", room.getMag()); - dataMap.put("status", room.getStatus()); - respObj.setData(dataMap); - respObj.setRoom(requestCmdInfo.getRoom()); - respObj.setScenarioId(requestCmdInfo.getScenarioId()); - respObj.setCmdType("room_info"); - Global.sendCmdInfoQueue.add(respObj); - } - } + + private void handleGetRootInfo(RequestCmdInfo requestCmdInfo) { + log.info("接收到获取到房间信息::{}", JSON.toJSONString(requestCmdInfo)); + Room room = RoomManager.getRoom(requestCmdInfo.getRoom()); + log.info("room::{}", room); + ResponseCmdInfo respObj = new ResponseCmdInfo<>(); + Map dataMap = new HashMap<>(); + respObj.setData(dataMap); + respObj.setRoom(requestCmdInfo.getRoom()); + respObj.setScenarioId(requestCmdInfo.getScenarioId()); + respObj.setCmdType("room_info"); + + if (room != null) { + + dataMap.put("status", room.getNumStatus().get()); + dataMap.put("mag", room.getMag()); + } else { + dataMap.put("status", 0); + dataMap.put("mag", 1); + } + Global.sendCmdInfoQueue.add(respObj); + } + private void handleGetInitPath(RequestCmdInfo requestCmdInfo) { log.info("接收到请求路线信息::{}", JSON.toJSONString(requestCmdInfo)); Room room = RoomManager.getRoom(requestCmdInfo.getRoom()); diff --git a/src/main/java/com/hivekion/ws/WsServer.java b/src/main/java/com/hivekion/ws/WsServer.java index 6b84e62..e4e55a7 100644 --- a/src/main/java/com/hivekion/ws/WsServer.java +++ b/src/main/java/com/hivekion/ws/WsServer.java @@ -116,7 +116,7 @@ public class WsServer { } public static void sendMessage(Integer scenarioId, String room, String message) { - // log.info("send {},{},{}", message, scenarioId, room); + log.info("send {},{},{}", message, scenarioId, room); synchronized (lock) { Map> roomMap = SESSION_MAP.get(String.valueOf(scenarioId)); diff --git a/src/main/resources/mapper/tbl/BattleConsumeMapper.xml b/src/main/resources/mapper/tbl/BattleConsumeMapper.xml index 8537969..e0a8f4a 100644 --- a/src/main/resources/mapper/tbl/BattleConsumeMapper.xml +++ b/src/main/resources/mapper/tbl/BattleConsumeMapper.xml @@ -1,5 +1,37 @@ + +