初次提交

This commit is contained in:
李玉东 2025-09-15 08:50:32 +08:00
parent 08ee625021
commit ba59c13054
10 changed files with 156 additions and 91 deletions

View File

@ -28,12 +28,12 @@ public class CodeGenerator {
})
.packageConfig(builder -> {
builder.parent("com.hivekion") // 设置父包名
.moduleName("baseData") // 设置模块名可选
.moduleName("scenario") // 设置模块名可选
.pathInfo(Collections.singletonMap(OutputFile.xml,
basePath + "/src/main/resources/mapper/tbl")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("TBL_ORG_SUPPLIER".toLowerCase()) // 设置需要生成的表名多个用逗号分隔
builder.addInclude("TBL_BATTLE_SUPPLIER".toLowerCase()) // 设置需要生成的表名多个用逗号分隔
.addTablePrefix("tbl_"); // 设置过滤表前缀
})
.execute();

View File

@ -31,6 +31,7 @@ public class ScenarioResourceController {
@PostMapping("/save")
public ResponseData<Boolean> save(@RequestBody ScenarioResource scenarioResource) {
if (scenarioResource.getId() == null) {
scenarioResource.setId(IdUtils.simpleUUID());
scenarioResource.setUserName(SecurityUtils.getCurrentLoginUser().getUsername());

View File

@ -2,8 +2,11 @@ package com.hivekion.scenario.controller;
import com.hivekion.Global;
import com.hivekion.baseData.controller.BaseController;
import com.hivekion.baseData.entity.Scenario;
import com.hivekion.baseData.service.ScenarioService;
import com.hivekion.common.entity.PagedResultVo;
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.scenario.bean.ScenarioWsParam;
@ -39,7 +42,8 @@ public class ScenarioRoomController extends BaseController {
private ScenarioTaskService scenarioTaskService;
@Resource
private ScenarioRoomService scenarioRoomService;
@Resource
private ScenarioService scenarioService;
/**
* 查询想定列表
*
@ -81,6 +85,14 @@ public class ScenarioRoomController extends BaseController {
@PostMapping("/start")
public ResponseData<Void> start(@RequestBody ScenarioRoom room) {
//验证
Scenario scenario = scenarioService.getScenarioById(room.getScenarioId());
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);
};
scenarioTaskService.start(room.getScenarioId(), room.getId());
return ResponseData.success(null);
}

View File

@ -3,6 +3,7 @@ package com.hivekion.scenario.service;
import com.hivekion.scenario.entity.ScenarioResource;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* <p>
@ -14,5 +15,5 @@ import java.util.List;
*/
public interface ScenarioResourceService extends IService<ScenarioResource> {
List<ScenarioResource> getResourceList(ScenarioResource resource);
Map<String,ScenarioResource> resourceMap();
}

View File

@ -3,6 +3,7 @@ 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;
/**
* [类的简要说明]
@ -19,7 +20,8 @@ public interface TaskLogicService {
void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId,double speed,
TaskFinishedCall call);
//战斗任务
void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId);
void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId,
List<Integer> injuredTimeList);
//保障任务
void supplierTask(ScenarioTask task,Scenario scenario, String roomId);

View File

@ -11,8 +11,10 @@ import com.hivekion.scenario.service.IResourceService;
import com.hivekion.scenario.service.ScenarioResourceService;
import com.hivekion.team.entity.Teaminfo;
import com.hivekion.team.service.ITeaminfoService;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@ -99,5 +101,9 @@ public class ScenarioResourceServiceImpl extends
return scenarioResourceList;
}
@Override
public Map<String, ScenarioResource> resourceMap() {
return this.list().stream().collect(Collectors.toMap(ScenarioResource::getId, r -> r));
}
}

View File

@ -1,6 +1,5 @@
package com.hivekion.scenario.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -16,8 +15,10 @@ import com.hivekion.scenario.mapper.ScenarioTaskMapper;
import com.hivekion.scenario.service.ScenarioTaskService;
import com.hivekion.scenario.service.TaskLogicService;
import com.hivekion.thread.SpringGlobalTaskManager;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import java.util.Random;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -51,7 +52,6 @@ public class ScenarioTaskServiceImpl extends
private TaskLogicService taskLogicService;
@Override
public void start(Integer scenarioId, String roomId) {
log.info("scenarioId::{},roomId::{}", scenarioId, roomId);
@ -72,7 +72,7 @@ public class ScenarioTaskServiceImpl extends
ScenarioTask queryTask = new ScenarioTask();
queryTask.setScenarioId(scenarioId);
redisUtil.hset(roomId + "_" + scenarioId, "taskList",
JSON.toJSONString(queryTaskList(queryTask)));
JSONArray.toJSONString(queryTaskList(queryTask)));
new Thread(() -> {
springGlobalTaskManager.startPerSecondTask(roomId + "_" + scenarioId + "_task", () -> {
@ -90,7 +90,11 @@ public class ScenarioTaskServiceImpl extends
@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");
}
@Override
@ -204,36 +208,59 @@ public class ScenarioTaskServiceImpl extends
private void taskTrigger(Scenario currentScenario, String roomId) {
try {
log.info("{}", JSON.toJSONString(currentScenario));
Object statusObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "status");
if (statusObj != null && statusObj.toString().equals("running")) {
Object taskListObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "taskList");
if (taskListObj != null) {
if (taskListObj instanceof List<?>) {
List<?> taskList = (List<?>) taskListObj;
for (Object task : taskList) {
List<ScenarioTask> taskList = JSONArray.parseArray(taskListObj.toString(),
ScenarioTask.class);
ScenarioTask scenarioTask = (ScenarioTask) task;
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":
taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId);
Random random = new Random();
List<Integer> 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);

View File

@ -1,6 +1,7 @@
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;
@ -52,7 +53,8 @@ public class TaskLogicServiceImpl implements TaskLogicService {
Map<String, Object> 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");
@ -66,22 +68,21 @@ public class TaskLogicServiceImpl implements TaskLogicService {
.bodyToMono(String.class)
.block();
com.alibaba.fastjson2.JSONObject resultObject = JSON.parseObject(result);
if (resultObject != null) {
if (result != null) {
cmdInfo.setCmdType("init_path_planning");
cmdInfo.setScenarioId(scenarioTask.getScenarioId());
cmdInfo.setRoom(roomId);
dataMap.put("points", resultObject);
redisUtil.hset(roomId + "_" + currentScenario.getId(),
scenarioTask.getId() + "_path_points", resultObject.getJSONArray("paths"));
scenarioTask.getId() + "_path_points", result);
}
Global.sendCmdInfoQueue.add(cmdInfo);
//获取物资信息
//设置获取物资信息
StatisticBean statistic = statisticService.statistic(scenarioTask.getResourceId());
redisUtil.hset(roomId + "_" + currentScenario.getId(),
"resourceId_statistic_" + scenarioTask.getResourceId(), statistic);
"resourceId_statistic_" + scenarioTask.getResourceId(), JSON.toJSONString(statistic));
} else if ("running".equals(scenarioTask.getStatus())) {
//消耗油料
@ -97,47 +98,47 @@ public class TaskLogicServiceImpl implements TaskLogicService {
setStatistic(scenarioTask, currentScenario, roomId, statistic);
}
//更新坐标
List<double[]> points = new ArrayList<>();
cmdInfo.setCmdType("current_position");
Object pathsObj = redisUtil.hget(roomId + "_" + currentScenario.getId(),
scenarioTask.getId() + "_path_points");
if (pathsObj != null) {
com.alibaba.fastjson2.JSONArray paths = (com.alibaba.fastjson2.JSONArray) pathsObj;
com.alibaba.fastjson2.JSONObject jsonObject = (com.alibaba.fastjson2.JSONObject) paths.get(
0);
com.alibaba.fastjson2.JSONArray pointsArray = jsonObject.getJSONObject("paths")
.getJSONObject("points").getJSONArray("coordinates");
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();
}
}
}
Global.sendCmdInfoQueue.add(cmdInfo);
// List<double[]> 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());
//
// com.alibaba.fastjson2.JSONArray pointsArray = paths.getJSONArray("paths").getJSONObject(0)
// .getJSONObject("points").getJSONArray("coordinates");
//
// 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();
// }
// }
// }
// Global.sendCmdInfoQueue.add(cmdInfo);
}
}
@Override
public void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId) {
public void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId,
List<Integer> injuredTime) {
StatisticBean statistic = getStatistic(task, scenario, roomId);
int duringTime = getCurrentDuringTime(scenario, roomId);
long seconds =
@ -150,10 +151,20 @@ public class TaskLogicServiceImpl implements TaskLogicService {
.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
@ -172,7 +183,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
Object statisticObj = redisUtil.hget(roomId + "_" + scenario.getId(),
"resourceId_statistic_" + task.getResourceId());
if (statisticObj != null) {
return (StatisticBean) statisticObj;
return JSON.parseObject(statisticObj.toString(), StatisticBean.class);
}
return new StatisticBean();
}
@ -181,11 +192,13 @@ public class TaskLogicServiceImpl implements TaskLogicService {
private void setStatistic(ScenarioTask task, Scenario scenario, String roomId,
StatisticBean bean) {
redisUtil.hset(roomId + "_" + scenario.getId(),
"resourceId_statistic_" + task.getResourceId(), bean);
"resourceId_statistic_" + task.getResourceId(), JSON.toJSONString(bean));
//推送到前端
ResponseCmdInfo<Map<String, Object>> cmdInfo = new ResponseCmdInfo<>();
Map<String, Object> 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);
@ -193,6 +206,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
/**
* 获取当前想定从开始到现在时间
*
* @param scenario
* @param roomId
* @return
@ -200,7 +214,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
private int getCurrentDuringTime(Scenario scenario, String roomId) {
Object duringTime = redisUtil.hget(roomId + "_" + scenario.getId(), "duringTime");
if (duringTime != null) {
return (Integer) duringTime;
return Integer.parseInt(duringTime.toString());
}
return 0;
}

View File

@ -25,5 +25,5 @@ public class StatisticBean {
private FuelInfo fuel = new FuelInfo();
//药材
private MedicalInfo medical = new MedicalInfo();
private String status = "init";
}

View File

@ -1,10 +1,7 @@
package com.hivekion.ws;
import com.alibaba.fastjson2.JSON;
import com.hivekion.Global;
import com.hivekion.common.entity.RequestCmdInfo;
import com.hivekion.common.entity.ResponseCmdInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
@ -56,6 +53,10 @@ public class WsServer {
Map<String, Session> sessionMap = new ConcurrentHashMap<>();
sessionMap.put(session.getId(), session);
SESSION_MAP.get(scenarioId).put(room, sessionMap);
} else {
SESSION_MAP.get(scenarioId).get(room).put(session.getId(), session);
}
@ -114,6 +115,7 @@ public class WsServer {
Object lock = lockMap.computeIfAbsent(scenarioId, k -> new Object());
synchronized (lock) {
Map<String, Map<String, Session>> roomMap = SESSION_MAP.get(String.valueOf(scenarioId));
log.info("roomMap:{}", roomMap);
if (roomMap != null) {
if (roomMap.containsKey(room)) {
Map<String, Session> singleRoomMap = roomMap.get(room);