diff --git a/src/main/java/com/hivekion/CodeGenerator.java b/src/main/java/com/hivekion/CodeGenerator.java index 8f634e6..daa757b 100644 --- a/src/main/java/com/hivekion/CodeGenerator.java +++ b/src/main/java/com/hivekion/CodeGenerator.java @@ -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(); diff --git a/src/main/java/com/hivekion/scenario/controller/ScenarioResourceController.java b/src/main/java/com/hivekion/scenario/controller/ScenarioResourceController.java index c4dfa74..7727a47 100644 --- a/src/main/java/com/hivekion/scenario/controller/ScenarioResourceController.java +++ b/src/main/java/com/hivekion/scenario/controller/ScenarioResourceController.java @@ -31,6 +31,7 @@ public class ScenarioResourceController { @PostMapping("/save") public ResponseData save(@RequestBody ScenarioResource scenarioResource) { + if (scenarioResource.getId() == null) { scenarioResource.setId(IdUtils.simpleUUID()); scenarioResource.setUserName(SecurityUtils.getCurrentLoginUser().getUsername()); diff --git a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java index 94a9e0a..58648ce 100644 --- a/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java +++ b/src/main/java/com/hivekion/scenario/controller/ScenarioRoomController.java @@ -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 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); } diff --git a/src/main/java/com/hivekion/scenario/service/ScenarioResourceService.java b/src/main/java/com/hivekion/scenario/service/ScenarioResourceService.java index 2278d77..1143c03 100644 --- a/src/main/java/com/hivekion/scenario/service/ScenarioResourceService.java +++ b/src/main/java/com/hivekion/scenario/service/ScenarioResourceService.java @@ -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; /** *

@@ -14,5 +15,5 @@ import java.util.List; */ public interface ScenarioResourceService extends IService { List getResourceList(ScenarioResource resource); - + Map resourceMap(); } diff --git a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java b/src/main/java/com/hivekion/scenario/service/TaskLogicService.java index 0729ae1..e0396a1 100644 --- a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java +++ b/src/main/java/com/hivekion/scenario/service/TaskLogicService.java @@ -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 injuredTimeList); //保障任务 void supplierTask(ScenarioTask task,Scenario scenario, String roomId); diff --git a/src/main/java/com/hivekion/scenario/service/impl/ScenarioResourceServiceImpl.java b/src/main/java/com/hivekion/scenario/service/impl/ScenarioResourceServiceImpl.java index ff743f5..a0974b8 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioResourceServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioResourceServiceImpl.java @@ -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 resourceMap() { + return this.list().stream().collect(Collectors.toMap(ScenarioResource::getId, r -> r)); + } } 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 0151441..c2318d6 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java @@ -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", () -> { @@ -80,9 +80,9 @@ public class ScenarioTaskServiceImpl extends //时间累计 increaseTime(currentScenario, roomId); //天气触发 - weatherTrigger(currentScenario, roomId); + weatherTrigger(currentScenario, roomId); //任务触发 - // taskTrigger(currentScenario, roomId); + // taskTrigger(currentScenario, roomId); }); }).start(); @@ -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 @@ -115,7 +119,7 @@ public class ScenarioTaskServiceImpl extends int duringTime = getCurrentDuringTime(currentScenario, roomId); duringTime = duringTime + mag; - log.info("duringTime::{}",duringTime); + log.info("duringTime::{}", duringTime); redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", duringTime + ""); } @@ -147,7 +151,7 @@ public class ScenarioTaskServiceImpl extends if (currentScenario.getStartTime().plusSeconds(duringTime) .isAfter(resource.getLastBegTime())) { - log.info("{}","start_"+resource.getWeatherType()); + log.info("{}", "start_" + resource.getWeatherType()); resource.setStatus("running"); ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>(); responseCmdInfo.setScenarioId(currentScenario.getId()); @@ -162,7 +166,7 @@ public class ScenarioTaskServiceImpl extends if ("running".equals(resource.getStatus())) { if (currentScenario.getStartTime().plusSeconds(duringTime) .isAfter(resource.getLastEndTime())) { - log.info("{}","stopped_"+resource.getWeatherType()); + log.info("{}", "stopped_" + resource.getWeatherType()); resource.setStatus("stopped"); ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>(); responseCmdInfo.setScenarioId(currentScenario.getId()); @@ -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 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); - ScenarioTask scenarioTask = (ScenarioTask) task; - switch (scenarioTask.getTaskType()) { - case "1": - taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId, 18.0, - null); - break; - case "2": - taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId); - break; - case "4": - case "5": - case "6": - case "7": - default: - taskLogicService.supplierTask(scenarioTask, currentScenario, roomId); - } } } + + } + + redisUtil.hset(roomId + "_" + currentScenario.getId(), "taskList", + JSONArray.toJSONString(taskList)); } } catch (Exception e) { log.error("error::", e); 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 cd067a3..97dbcbd 100644 --- a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java +++ b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java @@ -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 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 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 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 injuredTime) { StatisticBean statistic = getStatistic(task, scenario, roomId); int duringTime = getCurrentDuringTime(scenario, roomId); long seconds = @@ -150,9 +151,19 @@ 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); } @@ -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> 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); @@ -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; } diff --git a/src/main/java/com/hivekion/statistic/bean/StatisticBean.java b/src/main/java/com/hivekion/statistic/bean/StatisticBean.java index 82bd5d0..8752bbd 100644 --- a/src/main/java/com/hivekion/statistic/bean/StatisticBean.java +++ b/src/main/java/com/hivekion/statistic/bean/StatisticBean.java @@ -25,5 +25,5 @@ public class StatisticBean { private FuelInfo fuel = new FuelInfo(); //药材 private MedicalInfo medical = new MedicalInfo(); - + private String status = "init"; } diff --git a/src/main/java/com/hivekion/ws/WsServer.java b/src/main/java/com/hivekion/ws/WsServer.java index 77720c0..9928926 100644 --- a/src/main/java/com/hivekion/ws/WsServer.java +++ b/src/main/java/com/hivekion/ws/WsServer.java @@ -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 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); } @@ -110,18 +111,19 @@ 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); Object lock = lockMap.computeIfAbsent(scenarioId, k -> new Object()); synchronized (lock) { Map> roomMap = SESSION_MAP.get(String.valueOf(scenarioId)); - if(roomMap!=null){ + log.info("roomMap:{}", roomMap); + if (roomMap != null) { if (roomMap.containsKey(room)) { Map singleRoomMap = roomMap.get(room); singleRoomMap.forEach((sessionId, session) -> { - try{ + try { session.getBasicRemote().sendText(message); - }catch (Exception e){ - log.error("error::",e); + } catch (Exception e) { + log.error("error::", e); } });