package com.hivekion.scenario.service.impl; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hivekion.Global; import com.hivekion.baseData.entity.Scenario; import com.hivekion.baseData.entity.WeatherResource; import com.hivekion.baseData.service.IWeatherResourceService; import com.hivekion.baseData.service.ScenarioService; import com.hivekion.common.entity.ResponseCmdInfo; import com.hivekion.common.redis.RedisUtil; import com.hivekion.environment.entity.SimtoolWeather; import com.hivekion.environment.service.SimtoolWeatherService; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.mapper.ScenarioTaskMapper; import com.hivekion.scenario.service.ScenarioTaskService; import com.hivekion.scenario.service.TaskLogicService; import com.hivekion.statistic.service.StatisticService; import com.hivekion.thread.SpringGlobalTaskManager; import java.time.format.DateTimeFormatter; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; /** *

* 服务实现类 *

* * @author liDongYu * @since 2025-09-13 */ @Service @Slf4j public class ScenarioTaskServiceImpl extends ServiceImpl implements ScenarioTaskService { @Resource private SpringGlobalTaskManager springGlobalTaskManager; @Resource private SimtoolWeatherService weatherService; @Resource private RedisUtil redisUtil; @Resource private ScenarioService scenarioService; @Resource private IWeatherResourceService weatherResourceService; @Resource private TaskLogicService taskLogicService; @Override public void start(Integer id, String roomId) { log.info("id::{},roomId::{}",id,roomId); Scenario currentScenario = scenarioService.getScenarioById(id); //想定当前持续时间 redisUtil.hset(roomId + "_" + id, "duringTime", "0"); //想定当前状态 redisUtil.hset(roomId + "_" + id, "states", "running"); //查询天气数据 WeatherResource weatherList = weatherResourceService.getOne(new QueryWrapper() .eq("scenario_id",id)); if(weatherList!=null){ //放入天气数据 redisUtil.hset(roomId + "_" + id, "weather", weatherList); } //查询任务 ScenarioTask queryTask = new ScenarioTask(); queryTask.setScenarioId(id); redisUtil.hset(roomId + "_" + id, "taskList", queryTaskList(queryTask)); new Thread(() -> { springGlobalTaskManager.startPerSecondTask(roomId + "_" + id + "_task", () -> { //时间累计 increaseTime(currentScenario, roomId); //天气触发 weatherTrigger(currentScenario, roomId); //任务触发 taskTrigger(currentScenario, roomId); }); }).start(); } @Override public void stop(Integer id, String roomId) { } @Override public void sleepWhile(Integer id, String roomId) { redisUtil.hset(roomId + "_" + id, "states", "sleep"); } @Override public void wakeup(Integer id, String roomId) { redisUtil.hset(roomId + "_" + id, "states", "running"); } 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"); if (statusObj != null && statusObj.toString().equals("running")) { Object duringObj = redisUtil.hget(roomId + "_" + currentScenario.getId(), "duringTime"); if (duringObj != null) { int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0; oldValue = oldValue + mag; redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", oldValue); } } }catch (Exception e){ log.error("error::",e); } } /** * 天气触发 * * @param currentScenario 当前想定 * @param roomId 房间ID */ private void weatherTrigger(Scenario currentScenario, String roomId) { //获取到 reids中天气数据 //每个天气开始遍历 //获取天气开始的时间 ,最好加一个状态,提示天气任务的开始,运行 //想定的开始时间+想定目前持续的时间 // try { // QueryWrapper weatherResourceQueryWrapper = new QueryWrapper<>(); // weatherResourceQueryWrapper.eq("scenario_id", currentScenario.getId()); // List weatherResourceList = this.weatherResourceService.list(weatherResourceQueryWrapper); // ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo(); // responseCmdInfo.setScenarioId(currentScenario.getId()); // responseCmdInfo.setRoom(roomId); // JSONArray weatherMsgArray = new JSONArray(); // for (WeatherResource weatherResource : weatherResourceList) { // JSONObject jsonObject = new JSONObject(); // DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // jsonObject.putOnce("begTime", dtf.format(weatherResource.getLastBegTime())); // jsonObject.putOnce("endTime", dtf.format(weatherResource.getLastEndTime())); // weatherMsgArray.add(jsonObject); // responseCmdInfo.setCmdType("66-" + weatherResource.getWeatherType()); // } // responseCmdInfo.setData(weatherMsgArray); // System.out.println(responseCmdInfo.toString()); // Global.sendCmdInfoQueue.add(responseCmdInfo); // } 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) duringTime; } 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"); if (taskListObj != null) { if (taskListObj instanceof List) { List taskList = (List) taskListObj; for (Object task : taskList) { 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); } } } } } }catch (Exception e){ log.error("error::",e); } } @Override public List queryTaskList(ScenarioTask task) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("scenario_id", task.getScenarioId()); if (StringUtils.isNotBlank(task.getResourceId())) { queryWrapper.eq("resource_id", task.getResourceId()); } return this.list(queryWrapper); } }