2025-09-14 14:53:14 +08:00
|
|
|
package com.hivekion.scenario.service.impl;
|
|
|
|
|
|
2025-09-14 16:16:33 +08:00
|
|
|
import cn.hutool.json.JSONArray;
|
2025-09-14 15:30:47 +08:00
|
|
|
import cn.hutool.json.JSONObject;
|
2025-09-14 23:08:37 +08:00
|
|
|
import com.alibaba.fastjson.JSON;
|
2025-09-14 14:53:14 +08:00
|
|
|
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;
|
2025-09-14 15:30:47 +08:00
|
|
|
import com.hivekion.baseData.entity.WeatherResource;
|
|
|
|
|
import com.hivekion.baseData.service.IWeatherResourceService;
|
2025-09-14 14:53:14 +08:00
|
|
|
import com.hivekion.baseData.service.ScenarioService;
|
2025-09-14 15:30:47 +08:00
|
|
|
import com.hivekion.common.entity.ResponseCmdInfo;
|
2025-09-14 14:53:14 +08:00
|
|
|
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;
|
2025-09-14 16:40:30 +08:00
|
|
|
import com.hivekion.scenario.service.TaskLogicService;
|
2025-09-14 18:01:52 +08:00
|
|
|
import com.hivekion.statistic.service.StatisticService;
|
2025-09-14 14:53:14 +08:00
|
|
|
import com.hivekion.thread.SpringGlobalTaskManager;
|
2025-09-14 15:30:47 +08:00
|
|
|
import java.time.format.DateTimeFormatter;
|
2025-09-14 14:53:14 +08:00
|
|
|
import java.util.List;
|
2025-09-14 18:33:09 +08:00
|
|
|
import javax.annotation.PostConstruct;
|
2025-09-14 14:53:14 +08:00
|
|
|
import javax.annotation.Resource;
|
2025-09-14 18:27:23 +08:00
|
|
|
import lombok.extern.slf4j.Slf4j;
|
2025-09-14 14:53:14 +08:00
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <p>
|
|
|
|
|
* 服务实现类
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @author liDongYu
|
|
|
|
|
* @since 2025-09-13
|
|
|
|
|
*/
|
|
|
|
|
@Service
|
2025-09-14 18:27:23 +08:00
|
|
|
@Slf4j
|
2025-09-14 14:53:14 +08:00
|
|
|
public class ScenarioTaskServiceImpl extends
|
|
|
|
|
ServiceImpl<ScenarioTaskMapper, ScenarioTask> implements
|
|
|
|
|
ScenarioTaskService {
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private SpringGlobalTaskManager springGlobalTaskManager;
|
|
|
|
|
@Resource
|
|
|
|
|
private SimtoolWeatherService weatherService;
|
|
|
|
|
@Resource
|
|
|
|
|
private RedisUtil redisUtil;
|
|
|
|
|
@Resource
|
|
|
|
|
private ScenarioService scenarioService;
|
|
|
|
|
|
2025-09-14 15:30:47 +08:00
|
|
|
@Resource
|
|
|
|
|
private IWeatherResourceService weatherResourceService;
|
2025-09-14 16:40:30 +08:00
|
|
|
@Resource
|
|
|
|
|
private TaskLogicService taskLogicService;
|
2025-09-14 15:30:47 +08:00
|
|
|
|
2025-09-14 18:33:09 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
@Override
|
2025-09-14 23:08:37 +08:00
|
|
|
public void start(Integer scenarioId, String roomId) {
|
|
|
|
|
log.info("scenarioId::{},roomId::{}",scenarioId,roomId);
|
|
|
|
|
Scenario currentScenario = scenarioService.getScenarioById(scenarioId);
|
2025-09-14 14:53:14 +08:00
|
|
|
//想定当前持续时间
|
2025-09-14 23:08:37 +08:00
|
|
|
redisUtil.hset(roomId + "_" + scenarioId, "duringTime", "0");
|
2025-09-14 14:53:14 +08:00
|
|
|
//想定当前状态
|
2025-09-14 23:08:37 +08:00
|
|
|
redisUtil.hset(roomId + "_" + scenarioId, "states", "running");
|
2025-09-14 14:53:14 +08:00
|
|
|
|
2025-09-14 18:01:52 +08:00
|
|
|
|
|
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
|
|
|
|
|
//查询天气数据
|
2025-09-14 18:33:09 +08:00
|
|
|
WeatherResource weatherList = weatherResourceService.getOne(new QueryWrapper<WeatherResource>()
|
2025-09-14 23:08:37 +08:00
|
|
|
.eq("scenario_id",scenarioId));
|
2025-09-14 22:48:02 +08:00
|
|
|
if(weatherList!=null){
|
|
|
|
|
//放入天气数据
|
2025-09-14 23:08:37 +08:00
|
|
|
redisUtil.hset(roomId + "_" + scenarioId, "weather", JSON.toJSONString(weatherList));
|
2025-09-14 22:48:02 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
//查询任务
|
|
|
|
|
ScenarioTask queryTask = new ScenarioTask();
|
2025-09-14 23:08:37 +08:00
|
|
|
queryTask.setScenarioId(scenarioId);
|
|
|
|
|
redisUtil.hset(roomId + "_" + scenarioId, "taskList", JSON.toJSONString(queryTaskList(queryTask)));
|
2025-09-14 14:53:14 +08:00
|
|
|
new Thread(() -> {
|
|
|
|
|
|
2025-09-14 23:08:37 +08:00
|
|
|
springGlobalTaskManager.startPerSecondTask(roomId + "_" + scenarioId + "_task", () -> {
|
2025-09-14 18:28:51 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
//时间累计
|
|
|
|
|
increaseTime(currentScenario, roomId);
|
|
|
|
|
//天气触发
|
|
|
|
|
weatherTrigger(currentScenario, roomId);
|
|
|
|
|
//任务触发
|
|
|
|
|
taskTrigger(currentScenario, roomId);
|
2025-09-14 16:43:51 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
});
|
|
|
|
|
}).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) {
|
2025-09-14 18:28:51 +08:00
|
|
|
try{
|
2025-09-14 23:08:37 +08:00
|
|
|
log.info("currentScenario:;{}",currentScenario);
|
2025-09-14 18:28:51 +08:00
|
|
|
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);
|
|
|
|
|
}
|
2025-09-14 14:53:14 +08:00
|
|
|
|
2025-09-14 18:28:51 +08:00
|
|
|
}
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
log.error("error::",e);
|
2025-09-14 14:53:14 +08:00
|
|
|
}
|
2025-09-14 18:28:51 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 天气触发
|
|
|
|
|
*
|
|
|
|
|
* @param currentScenario 当前想定
|
|
|
|
|
* @param roomId 房间ID
|
|
|
|
|
*/
|
|
|
|
|
private void weatherTrigger(Scenario currentScenario, String roomId) {
|
2025-09-14 21:56:23 +08:00
|
|
|
//获取到 reids中天气数据
|
|
|
|
|
//每个天气开始遍历
|
|
|
|
|
//获取天气开始的时间 ,最好加一个状态,提示天气任务的开始,运行
|
|
|
|
|
//想定的开始时间+想定目前持续的时间
|
|
|
|
|
|
|
|
|
|
// try {
|
|
|
|
|
// QueryWrapper<WeatherResource> weatherResourceQueryWrapper = new QueryWrapper<>();
|
|
|
|
|
// weatherResourceQueryWrapper.eq("scenario_id", currentScenario.getId());
|
|
|
|
|
// List<WeatherResource> weatherResourceList = this.weatherResourceService.list(weatherResourceQueryWrapper);
|
|
|
|
|
// ResponseCmdInfo<JSONArray> 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());
|
|
|
|
|
// }
|
2025-09-14 15:30:47 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
|
|
|
|
|
}
|
2025-09-14 21:56:23 +08:00
|
|
|
/**
|
|
|
|
|
* 获取当前想定从开始到现在时间
|
|
|
|
|
* @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;
|
|
|
|
|
}
|
2025-09-14 14:53:14 +08:00
|
|
|
private void taskTrigger(Scenario currentScenario, String roomId) {
|
2025-09-14 18:28:51 +08:00
|
|
|
try{
|
2025-09-14 23:08:37 +08:00
|
|
|
log.info("{}",currentScenario);
|
2025-09-14 18:28:51 +08:00
|
|
|
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);
|
|
|
|
|
}
|
2025-09-14 17:03:11 +08:00
|
|
|
|
2025-09-14 18:28:51 +08:00
|
|
|
}
|
2025-09-14 16:40:30 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-14 18:28:51 +08:00
|
|
|
}catch (Exception e){
|
|
|
|
|
log.error("error::",e);
|
2025-09-14 16:40:30 +08:00
|
|
|
}
|
2025-09-14 18:28:51 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
}
|
2025-09-14 16:40:30 +08:00
|
|
|
|
2025-09-14 14:53:14 +08:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<ScenarioTask> queryTaskList(ScenarioTask task) {
|
|
|
|
|
QueryWrapper<ScenarioTask> queryWrapper = new QueryWrapper<>();
|
|
|
|
|
queryWrapper.eq("scenario_id", task.getScenarioId());
|
2025-09-14 16:40:30 +08:00
|
|
|
if (StringUtils.isNotBlank(task.getResourceId())) {
|
2025-09-14 14:53:14 +08:00
|
|
|
queryWrapper.eq("resource_id", task.getResourceId());
|
|
|
|
|
}
|
|
|
|
|
return this.list(queryWrapper);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|