This commit is contained in:
wangwenhua 2025-09-21 09:34:31 +08:00
commit ffdcf16683
11 changed files with 170 additions and 34 deletions

View File

@ -28,6 +28,7 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -68,6 +69,8 @@ public class Room implements AutoCloseable {
private RedisUtil redisUtil; private RedisUtil redisUtil;
private com.hivekion.statistic.service.ScenarioService scenarioService; private com.hivekion.statistic.service.ScenarioService scenarioService;
private AtomicInteger numStatus = new AtomicInteger(0);
/** /**
* 任务容器 * 任务容器
*/ */
@ -111,12 +114,14 @@ public class Room implements AutoCloseable {
//初始化系统资源 物资人员等信息 //初始化系统资源 物资人员等信息
initRoomParam(); initRoomParam();
pushRoomInfo(); pushRoomInfo();
numStatus.set(1);
} }
/** /**
* 停止 * 停止
*/ */
public void stop() { public void stop() {
numStatus.set(3);
status.set(false); status.set(false);
pushRoomInfo(); pushRoomInfo();
cancelTask(); cancelTask();
@ -135,7 +140,7 @@ public class Room implements AutoCloseable {
* 暂停 * 暂停
*/ */
public void pause() { public void pause() {
numStatus.set(2);
status.set(false); status.set(false);
pushRoomInfo(); pushRoomInfo();
cancelTask(); cancelTask();
@ -281,7 +286,7 @@ public class Room implements AutoCloseable {
ResponseCmdInfo<Object> respObj = new ResponseCmdInfo<>(); ResponseCmdInfo<Object> respObj = new ResponseCmdInfo<>();
Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>();
dataMap.put("mag", this.getMag()); dataMap.put("mag", this.getMag());
dataMap.put("status", this.getStatus()); dataMap.put("status", this.numStatus.get());
respObj.setData(dataMap); respObj.setData(dataMap);
respObj.setRoom(this.getRoomId()); respObj.setRoom(this.getRoomId());
respObj.setScenarioId(this.getScenario().getId()); respObj.setScenarioId(this.getScenario().getId());

View File

@ -0,0 +1,24 @@
package com.hivekion.scenario.bean;
import lombok.Data;
/**
* [类的简要说明]
* <p>
* [详细描述可选]
* <p>
*
* @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;
}

View File

@ -1,7 +1,17 @@
package com.hivekion.scenario.controller; 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.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RestController;
/** /**
* <p> * <p>
@ -11,8 +21,33 @@ import org.springframework.stereotype.Controller;
* @author liDongYu * @author liDongYu
* @since 2025-09-19 * @since 2025-09-19
*/ */
@Controller @RestController
@RequestMapping("/scenario/battleConsume") @RequestMapping("/scenario/battleConsume")
public class BattleConsumeController { public class BattleConsumeController {
@Resource
private IBattleConsumeService battleConsumeService;
@Resource
private ScenarioResourceService scenarioResourceService;
@GetMapping("/statistic/minute")
public ResponseData<List<StatisticConsumeBean>> statisticByMinute() {
return ResponseData.success(battleConsumeService.statistic());
}
@GetMapping("/statistic/resource")
public ResponseData<List<StatisticConsumeBean>> statisticByResource() {
List<StatisticConsumeBean> list = battleConsumeService.statisticByResource();
Map<String, ScenarioResource> 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()));
}
} }

View File

@ -117,6 +117,7 @@ public class ScenarioRoomController extends BaseController {
SecurityUtils.getCurrentLoginUser().getUsername())); SecurityUtils.getCurrentLoginUser().getUsername()));
scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.STARTED.getCode()); scenarioRoomService.updateStatus(room.getId(), ScenarioRoomStatusEnum.STARTED.getCode());
scenarioTaskService.start(room.getScenarioId(), room.getId()); scenarioTaskService.start(room.getScenarioId(), room.getId());
return ResponseData.success(null); return ResponseData.success(null);
} }

View File

@ -1,7 +1,9 @@
package com.hivekion.scenario.mapper; package com.hivekion.scenario.mapper;
import com.hivekion.scenario.bean.StatisticConsumeBean;
import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.entity.BattleConsume;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/** /**
* <p> * <p>
@ -12,5 +14,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @since 2025-09-19 * @since 2025-09-19
*/ */
public interface BattleConsumeMapper extends BaseMapper<BattleConsume> { public interface BattleConsumeMapper extends BaseMapper<BattleConsume> {
List<StatisticConsumeBean> statistic();
List<StatisticConsumeBean> statisticByResource();
} }

View File

@ -1,7 +1,9 @@
package com.hivekion.scenario.service; package com.hivekion.scenario.service;
import com.hivekion.scenario.bean.StatisticConsumeBean;
import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.entity.BattleConsume;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
@ -12,5 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @since 2025-09-19 * @since 2025-09-19
*/ */
public interface IBattleConsumeService extends IService<BattleConsume> { public interface IBattleConsumeService extends IService<BattleConsume> {
List<StatisticConsumeBean> statistic();
List<StatisticConsumeBean> statisticByResource();
} }

View File

@ -1,9 +1,12 @@
package com.hivekion.scenario.service.impl; package com.hivekion.scenario.service.impl;
import com.hivekion.scenario.bean.StatisticConsumeBean;
import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.entity.BattleConsume;
import com.hivekion.scenario.mapper.BattleConsumeMapper; import com.hivekion.scenario.mapper.BattleConsumeMapper;
import com.hivekion.scenario.service.IBattleConsumeService; import com.hivekion.scenario.service.IBattleConsumeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Collections;
import java.util.List;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@ -17,4 +20,13 @@ import org.springframework.stereotype.Service;
@Service @Service
public class BattleConsumeServiceImpl extends ServiceImpl<BattleConsumeMapper, BattleConsume> implements IBattleConsumeService { public class BattleConsumeServiceImpl extends ServiceImpl<BattleConsumeMapper, BattleConsume> implements IBattleConsumeService {
@Override
public List<StatisticConsumeBean> statistic() {
return this.baseMapper.statistic();
}
@Override
public List<StatisticConsumeBean> statisticByResource() {
return this.baseMapper.statisticByResource();
}
} }

View File

@ -49,13 +49,17 @@ public class ScenarioTaskServiceImpl extends
@Override @Override
public void start(Integer scenarioId, String roomId) { public void start(Integer scenarioId, String roomId) {
//查询想定的持续时间 //查询想定的持续时间
Scenario scenario = scenarioService.getScenarioById(scenarioId); Scenario scenario = scenarioService.getScenarioById(scenarioId);
if (scenario != null) { if (scenario != null) {
//查看想定的持续时间 //查看想定的持续时间
long duringTime = Duration.between(scenario.getStartTime(),scenario.getEndTime() ) long duringTime = Duration.between(scenario.getStartTime(),scenario.getEndTime() )
.getSeconds(); .getSeconds();
RoomManager.startRoom(roomId, scenario, duringTime); RoomManager.startRoom(roomId, scenario, duringTime);
addWeatherEvent(scenario, roomId); addWeatherEvent(scenario, roomId);
addTaskEvent(scenario, roomId); addTaskEvent(scenario, roomId);
} }
} }
@ -145,6 +149,7 @@ public class ScenarioTaskServiceImpl extends
//增加任务 //增加任务
private void addTaskEvent(Scenario scenario, String roomId) { private void addTaskEvent(Scenario scenario, String roomId) {
log.info("--------------------hello");
ScenarioTask scenarioTask = new ScenarioTask(); ScenarioTask scenarioTask = new ScenarioTask();
scenarioTask.setScenarioId(scenario.getId()); scenarioTask.setScenarioId(scenario.getId());
List<ScenarioTask> taskList = this.queryTaskList(scenarioTask); List<ScenarioTask> taskList = this.queryTaskList(scenarioTask);

View File

@ -30,7 +30,12 @@ public class HandleReceiveRunnable implements Runnable {
try { try {
RequestCmdInfo requestCmdInfo = Global.receiveCmdInfoQueue.take(); RequestCmdInfo requestCmdInfo = Global.receiveCmdInfoQueue.take();
switch (requestCmdInfo.getCmdType()) {
case "get_init_path":
case "get_room_info":
handleMessage(requestCmdInfo); handleMessage(requestCmdInfo);
break;
default:
//消息分发业务bean处理 //消息分发业务bean处理
if (SpringUtil.getBean(WebsocketMsgWrapper.class) != null) { if (SpringUtil.getBean(WebsocketMsgWrapper.class) != null) {
try { try {
@ -44,6 +49,9 @@ public class HandleReceiveRunnable implements Runnable {
} else { } else {
log.warn("==================WebsocketMsgWrapper is null=========================="); log.warn("==================WebsocketMsgWrapper is null==========================");
} }
}
} catch (Exception e) { } catch (Exception e) {
@ -72,21 +80,29 @@ public class HandleReceiveRunnable implements Runnable {
log.error("error::", e); log.error("error::", e);
} }
} }
private void handleGetRootInfo(RequestCmdInfo requestCmdInfo){
private void handleGetRootInfo(RequestCmdInfo requestCmdInfo) {
log.info("接收到获取到房间信息::{}", JSON.toJSONString(requestCmdInfo)); log.info("接收到获取到房间信息::{}", JSON.toJSONString(requestCmdInfo));
Room room = RoomManager.getRoom(requestCmdInfo.getRoom()); Room room = RoomManager.getRoom(requestCmdInfo.getRoom());
if (room != null) { log.info("room::{}", room);
ResponseCmdInfo<Object> respObj = new ResponseCmdInfo<>(); ResponseCmdInfo<Object> respObj = new ResponseCmdInfo<>();
Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>();
dataMap.put("mag", room.getMag());
dataMap.put("status", room.getStatus());
respObj.setData(dataMap); respObj.setData(dataMap);
respObj.setRoom(requestCmdInfo.getRoom()); respObj.setRoom(requestCmdInfo.getRoom());
respObj.setScenarioId(requestCmdInfo.getScenarioId()); respObj.setScenarioId(requestCmdInfo.getScenarioId());
respObj.setCmdType("room_info"); 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); Global.sendCmdInfoQueue.add(respObj);
} }
}
private void handleGetInitPath(RequestCmdInfo requestCmdInfo) { private void handleGetInitPath(RequestCmdInfo requestCmdInfo) {
log.info("接收到请求路线信息::{}", JSON.toJSONString(requestCmdInfo)); log.info("接收到请求路线信息::{}", JSON.toJSONString(requestCmdInfo));
Room room = RoomManager.getRoom(requestCmdInfo.getRoom()); Room room = RoomManager.getRoom(requestCmdInfo.getRoom());

View File

@ -118,7 +118,7 @@ public class WsServer {
} }
public static void sendMessage(Integer scenarioId, String room, String message) { public static void sendMessage(Integer scenarioId, String room, String message) {
// log.info("send {},{},{}", message, scenarioId, room); log.info("send {},{},{}", message, scenarioId, room);
synchronized (lock) { synchronized (lock) {
Map<String, Map<String, Session>> roomMap = SESSION_MAP.get(String.valueOf(scenarioId)); Map<String, Map<String, Session>> roomMap = SESSION_MAP.get(String.valueOf(scenarioId));

View File

@ -1,5 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hivekion.scenario.mapper.BattleConsumeMapper"> <mapper namespace="com.hivekion.scenario.mapper.BattleConsumeMapper">
<select id="statistic" resultType="com.hivekion.scenario.bean.StatisticConsumeBean">
SELECT
TO_CHAR(t.CONSUME_DATE, 'YYYY-MM-DD HH24:MI') AS minute,
NVL(SUM(t.FOOD), 0) AS food,
NVL(SUM(t.FUEL), 0) AS fuel,
NVL(SUM(t.WATER), 0) AS water,
NVL(SUM(t.MEDICAL), 0) AS medical,
NVL(SUM(t.AMMUNITION), 0) AS ammunition
FROM
TBL_BATTLE_CONSUME t
WHERE
t.CONSUME_DATE IS NOT NULL
GROUP BY
TO_CHAR(t.CONSUME_DATE, 'YYYY-MM-DD HH24:MI')
ORDER BY
minute
</select>
<select id="statisticByResource" resultType="com.hivekion.scenario.bean.StatisticConsumeBean">
SELECT
resource_id as resourceId,
NVL(SUM(t.FOOD), 0) AS food,
NVL(SUM(t.FUEL), 0) AS fuel,
NVL(SUM(t.WATER), 0) AS water,
NVL(SUM(t.MEDICAL), 0) AS medical,
NVL(SUM(t.AMMUNITION), 0) AS ammunition
FROM
TBL_BATTLE_CONSUME t
WHERE
t.CONSUME_DATE IS NOT NULL
GROUP BY
resource_id
</select>
</mapper> </mapper>