From 59b129c064286f819044d97eac429af5c05cd600 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?=
<129883742+liyudong2018@users.noreply.github.com>
Date: Mon, 15 Sep 2025 00:36:13 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/java/com/hivekion/Init.java | 4 +
.../baseData/entity/WeatherResource.java | 104 +++--------
.../service/impl/ScenarioTaskServiceImpl.java | 166 ++++++++----------
.../com/hivekion/thread/HandleSendThread.java | 3 +
src/main/java/com/hivekion/ws/WsServer.java | 1 +
5 files changed, 108 insertions(+), 170 deletions(-)
diff --git a/src/main/java/com/hivekion/Init.java b/src/main/java/com/hivekion/Init.java
index 3e5cafc..49ff586 100644
--- a/src/main/java/com/hivekion/Init.java
+++ b/src/main/java/com/hivekion/Init.java
@@ -3,6 +3,7 @@ package com.hivekion;
import com.hivekion.thread.HandleReceiveThread;
import com.hivekion.thread.HandleSendThread;
import javax.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
@@ -15,9 +16,12 @@ import org.springframework.stereotype.Component;
* @since 2025/7/22
*/
@Component
+@Slf4j
public class Init {
+
@PostConstruct
public void init() {
+
new Thread(new HandleSendThread()).start();
new Thread(new HandleReceiveThread()).start();
}
diff --git a/src/main/java/com/hivekion/baseData/entity/WeatherResource.java b/src/main/java/com/hivekion/baseData/entity/WeatherResource.java
index 50c801b..162b32c 100644
--- a/src/main/java/com/hivekion/baseData/entity/WeatherResource.java
+++ b/src/main/java/com/hivekion/baseData/entity/WeatherResource.java
@@ -4,10 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Data;
/**
*
@@ -19,91 +20,36 @@ import io.swagger.annotations.ApiModelProperty;
*/
@TableName("TBL_WEATHER_RESOURCE")
@ApiModel(value = "WeatherResource对象", description = "气像资源信息")
+@Data
public class WeatherResource implements Serializable {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- @ApiModelProperty("物理主键")
- @TableId(value = "id", type = IdType.AUTO)
- private Integer id;
+ @ApiModelProperty("物理主键")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
- @ApiModelProperty("想定房间编号")
- @TableField(value="room_id")
- private String roomId;
+ @ApiModelProperty("想定房间编号")
+ @TableField(value = "room_id")
+ private String roomId;
- @ApiModelProperty("想定场景编号")
- @TableField(value="scenario_id")
- private Integer scenarioId;
+ @ApiModelProperty("想定场景编号")
+ @TableField(value = "scenario_id")
+ private Integer scenarioId;
- @ApiModelProperty("天气类型")
- @TableField(value = "weather_type")
- private String weatherType;
+ @ApiModelProperty("天气类型")
+ @TableField(value = "weather_type")
+ private String weatherType;
- @ApiModelProperty("持续开始时间")
- @TableField(value = "last_beg_time")
- private LocalDateTime lastBegTime;
+ @ApiModelProperty("持续开始时间")
+ @TableField(value = "last_beg_time")
+ private LocalDateTime lastBegTime;
- @ApiModelProperty("持续结束时间")
- @TableField(value = "last_end_time")
- private LocalDateTime lastEndTime;
+ @ApiModelProperty("持续结束时间")
+ @TableField(value = "last_end_time")
+ private LocalDateTime lastEndTime;
+ @TableField(exist = false)
+ private String status = "init";
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getRoomId() {
- return roomId;
- }
-
- public void setRoomId(String roomId) {
- this.roomId = roomId;
- }
-
- public Integer getScenarioId() {
- return scenarioId;
- }
-
- public void setScenarioId(Integer scenarioId) {
- this.scenarioId = scenarioId;
- }
-
- public String getWeatherType() {
- return weatherType;
- }
-
- public void setWeatherType(String weatherType) {
- this.weatherType = weatherType;
- }
-
- public LocalDateTime getLastBegTime() {
- return lastBegTime;
- }
-
- public void setLastBegTime(LocalDateTime lastBegTime) {
- this.lastBegTime = lastBegTime;
- }
-
- public LocalDateTime getLastEndTime() {
- return lastEndTime;
- }
-
- public void setLastEndTime(LocalDateTime lastEndTime) {
- this.lastEndTime = lastEndTime;
- }
-
- @Override
- public String toString() {
- return "WeatherResource{" +
- "id = " + id +
- ", roomId = " + roomId +
- ", scenarioId = " + scenarioId +
- ", weatherType = " + weatherType +
- ", lastBegTime = " + lastBegTime +
- ", lastEndTime = " + lastEndTime +
- "}";
- }
}
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 ad2cc57..0151441 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 cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -12,17 +11,11 @@ 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.ZoneId;
-import java.time.format.DateTimeFormatter;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@@ -57,45 +50,29 @@ public class ScenarioTaskServiceImpl extends
@Resource
private TaskLogicService taskLogicService;
- @PostConstruct
- public void initTest(){
- this.start(2746,"1");
- }
+
+
@Override
public void start(Integer scenarioId, String roomId) {
- log.info("scenarioId::{},roomId::{}",scenarioId,roomId);
+ log.info("scenarioId::{},roomId::{}", scenarioId, roomId);
Scenario currentScenario = scenarioService.getScenarioById(scenarioId);
//想定当前持续时间
redisUtil.hset(roomId + "_" + scenarioId, "duringTime", "0");
//想定当前状态
- redisUtil.hset(roomId + "_" + scenarioId, "states", "running");
-
-
-
+ redisUtil.hset(roomId + "_" + scenarioId, "status", "running");
//查询天气数据
- List weatherList = weatherResourceService.list(new QueryWrapper()
- .eq("scenario_id",scenarioId));
- JSONArray jsonArray = new JSONArray();
- for(WeatherResource weatherResource: weatherList) {
- String weaherStr = JSON.toJSONString(weatherResource);
- Long timeBegstamp = weatherResource.getLastBegTime().atZone(ZoneId.systemDefault())
- .toInstant()
- .toEpochMilli();
- Long timeEndstamp = weatherResource.getLastEndTime().atZone(ZoneId.systemDefault())
- .toInstant()
- .toEpochMilli();
- com.alibaba.fastjson.JSONObject weatherObj = JSON.parseObject(weaherStr);
- weatherObj.put("weatherBegTime",timeBegstamp);
- weatherObj.put("weatherEndTime",timeEndstamp);
- jsonArray.add(weatherObj);
- }
+ List weatherList = weatherResourceService.list(
+ new QueryWrapper()
+ .eq("scenario_id", scenarioId));
+
//放入天气数据
- redisUtil.hset(roomId + "_" + scenarioId, "weather", JSON.toJSONString(jsonArray));
+ redisUtil.hset(roomId + "_" + scenarioId, "weather", JSONArray.toJSONString(weatherList));
//查询任务
ScenarioTask queryTask = new ScenarioTask();
queryTask.setScenarioId(scenarioId);
- redisUtil.hset(roomId + "_" + scenarioId, "taskList", JSON.toJSONString(queryTaskList(queryTask)));
+ redisUtil.hset(roomId + "_" + scenarioId, "taskList",
+ JSON.toJSONString(queryTaskList(queryTask)));
new Thread(() -> {
springGlobalTaskManager.startPerSecondTask(roomId + "_" + scenarioId + "_task", () -> {
@@ -103,9 +80,9 @@ public class ScenarioTaskServiceImpl extends
//时间累计
increaseTime(currentScenario, roomId);
//天气触发
- weatherTrigger(currentScenario, roomId);
+ weatherTrigger(currentScenario, roomId);
//任务触发
- taskTrigger(currentScenario, roomId);
+ // taskTrigger(currentScenario, roomId);
});
}).start();
@@ -127,23 +104,25 @@ public class ScenarioTaskServiceImpl extends
}
private void increaseTime(Scenario currentScenario, String roomId) {
- try{
- log.info("currentScenario:;{}",currentScenario);
+ 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");
+ log.info("scenario_id:{},status::{}", currentScenario.getId(), statusObj);
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);
- }
+ int duringTime = getCurrentDuringTime(currentScenario, roomId);
+ duringTime = duringTime + mag;
+ log.info("duringTime::{}",duringTime);
+ redisUtil.hset(roomId + "_" + currentScenario.getId(), "duringTime", duringTime + "");
}
- }catch (Exception e){
- log.error("error::",e);
+
+
+ } catch (
+ Exception e) {
+ log.error("error::", e);
}
}
@@ -156,58 +135,61 @@ public class ScenarioTaskServiceImpl extends
*/
private void weatherTrigger(Scenario currentScenario, String roomId) {
try {
- String weatherResources = (String) redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather");
- JSONArray weatherArray = JSONArray.parseArray(weatherResources);
- String weatherStatus = redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather-status") !=null?(String) redisUtil.hget(roomId + "_" + currentScenario.getId(), "weather-status"):null;
- for(int i=0;i= timeBegstamp && StringUtils.isEmpty(weatherStatus)) {
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("start-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather-status","start");
- Global.sendCmdInfoQueue.add(responseCmdInfo);
+ String weatherResources = (String) redisUtil.hget(roomId + "_" + currentScenario.getId(),
+ "weather");
+ List weatherList = JSONArray.parseArray(weatherResources,
+ WeatherResource.class);
+ int duringTime = getCurrentDuringTime(currentScenario, roomId);
+
+ for (WeatherResource resource : weatherList) {
+
+ if ("init".equals(resource.getStatus())) {
+
+ if (currentScenario.getStartTime().plusSeconds(duringTime)
+ .isAfter(resource.getLastBegTime())) {
+ log.info("{}","start_"+resource.getWeatherType());
+ resource.setStatus("running");
+ ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>();
+ responseCmdInfo.setScenarioId(currentScenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ responseCmdInfo.setCmdType("start_" + resource.getWeatherType());
+ responseCmdInfo.setScenarioId(currentScenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ Global.sendCmdInfoQueue.add(responseCmdInfo);
+ }
+
}
- else if(timeBegstamp+duringTime >= timeEndstamp && StringUtils.isNotEmpty(weatherStatus)){
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("end-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather-status","end");
- Global.sendCmdInfoQueue.add(responseCmdInfo);
- }else{
- ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo();
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- responseCmdInfo.setCmdType("remain-" + weatherObj.getString("weatherType"));
- responseCmdInfo.setScenarioId(currentScenario.getId());
- responseCmdInfo.setRoom(roomId);
- System.out.println(responseCmdInfo.toString());
- Global.sendCmdInfoQueue.add(responseCmdInfo);
+ if ("running".equals(resource.getStatus())) {
+ if (currentScenario.getStartTime().plusSeconds(duringTime)
+ .isAfter(resource.getLastEndTime())) {
+ log.info("{}","stopped_"+resource.getWeatherType());
+ resource.setStatus("stopped");
+ ResponseCmdInfo responseCmdInfo = new ResponseCmdInfo<>();
+ responseCmdInfo.setScenarioId(currentScenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ responseCmdInfo.setCmdType("stop_" + resource.getWeatherType());
+ responseCmdInfo.setScenarioId(currentScenario.getId());
+ responseCmdInfo.setRoom(roomId);
+ Global.sendCmdInfoQueue.add(responseCmdInfo);
+ }
}
+
}
+ redisUtil.hset(roomId + "_" + currentScenario.getId(), "weather",
+ JSONArray.toJSONString(weatherList));
} catch (Exception ex) {
- ex.printStackTrace();
+
log.error(ex.getMessage());
}
}
+
/**
* 获取当前想定从开始到现在时间
+ *
* @param scenario
* @param roomId
* @return
@@ -215,13 +197,14 @@ public class ScenarioTaskServiceImpl extends
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;
}
+
private void taskTrigger(Scenario currentScenario, String roomId) {
- try{
- log.info("{}",currentScenario);
+ 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");
@@ -234,7 +217,8 @@ public class ScenarioTaskServiceImpl extends
ScenarioTask scenarioTask = (ScenarioTask) task;
switch (scenarioTask.getTaskType()) {
case "1":
- taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId,18.0,null);
+ taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId, 18.0,
+ null);
break;
case "2":
taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId);
@@ -251,8 +235,8 @@ public class ScenarioTaskServiceImpl extends
}
}
}
- }catch (Exception e){
- log.error("error::",e);
+ } catch (Exception e) {
+ log.error("error::", e);
}
}
diff --git a/src/main/java/com/hivekion/thread/HandleSendThread.java b/src/main/java/com/hivekion/thread/HandleSendThread.java
index 3750f9c..339bfc9 100644
--- a/src/main/java/com/hivekion/thread/HandleSendThread.java
+++ b/src/main/java/com/hivekion/thread/HandleSendThread.java
@@ -20,9 +20,12 @@ public class HandleSendThread implements Runnable {
@Override
public void run() {
+ log.info("HandleSendThread start .....................");
while (!Thread.currentThread().isInterrupted()) {
try {
+ log.info("waiting message");
ResponseCmdInfo> response = Global.sendCmdInfoQueue.take();
+ log.info("send response");
WsServer.sendMessage(response.getScenarioId(), response.getRoom(), JSON.toJSONString(response));
} catch (Exception e) {
log.error("error::", e);
diff --git a/src/main/java/com/hivekion/ws/WsServer.java b/src/main/java/com/hivekion/ws/WsServer.java
index 9739497..302d607 100644
--- a/src/main/java/com/hivekion/ws/WsServer.java
+++ b/src/main/java/com/hivekion/ws/WsServer.java
@@ -116,6 +116,7 @@ public class WsServer {
}
public static void sendMessage(Integer scenarioId, String room, String message) {
+ log.info("send {},{},{}",message,scenarioId,room);
Object lock = lockMap.computeIfAbsent(scenarioId, k -> new Object());
synchronized (lock) {
Map> roomMap = SESSION_MAP.get(String.valueOf(scenarioId));