diff --git a/src/main/java/com/hivekion/common/MultiPointGeoPosition.java b/src/main/java/com/hivekion/common/MultiPointGeoPosition.java
index 0b2950a..de99522 100644
--- a/src/main/java/com/hivekion/common/MultiPointGeoPosition.java
+++ b/src/main/java/com/hivekion/common/MultiPointGeoPosition.java
@@ -4,15 +4,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-/**
- * [类的简要说明]
- *
- * [详细描述,可选]
- *
- *
- * @author LiDongYU
- * @since 2025/7/22
- */
public class MultiPointGeoPosition {
private static final double EARTH_RADIUS = 6371000.0;
@@ -24,7 +15,6 @@ public class MultiPointGeoPosition {
return radian * 180.0 / Math.PI;
}
- // 球面距离
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
@@ -38,7 +28,6 @@ public class MultiPointGeoPosition {
return EARTH_RADIUS * c;
}
- // 球面距离的角度
public static double haversineAngle(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
@@ -50,7 +39,6 @@ public class MultiPointGeoPosition {
return 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
}
- // 球面插值
public static double[] interpolate(double lat1, double lon1, double lat2, double lon2, double f) {
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
@@ -72,10 +60,20 @@ public class MultiPointGeoPosition {
return new double[] { toDegrees(lat), toDegrees(lon) };
}
- // 主流程
- public static double[] getPosition(List points, double speed, double seconds) {
+ public static class PositionResult {
+ public final double latitude;
+ public final double longitude;
+ public final boolean reached;
+
+ public PositionResult(double latitude, double longitude, boolean reached) {
+ this.latitude = latitude;
+ this.longitude = longitude;
+ this.reached = reached;
+ }
+ }
+
+ public static PositionResult getPosition(List points, double speed, double seconds) {
if (points == null || points.size() < 2) throw new IllegalArgumentException("点数必须≥2");
- // 1. 计算每段距离
List segDists = new ArrayList<>();
double totalDist = 0.0;
for (int i = 1; i < points.size(); i++) {
@@ -85,17 +83,11 @@ public class MultiPointGeoPosition {
segDists.add(d);
totalDist += d;
}
-
- // 2. 已行驶距离
double movedDist = speed * seconds;
-
- // 3. 超出则返回终点
if (movedDist >= totalDist) {
double[] last = points.get(points.size() - 1);
- return new double[] { last[1], last[0] }; // [lat, lng]
+ return new PositionResult(last[1], last[0], true);
}
-
- // 4. 找到属于哪一段
double accum = 0.0;
for (int i = 0; i < segDists.size(); i++) {
double seg = segDists.get(i);
@@ -104,27 +96,26 @@ public class MultiPointGeoPosition {
double f = remain / seg;
double[] p1 = points.get(i);
double[] p2 = points.get(i + 1);
- return interpolate(p1[1], p1[0], p2[1], p2[0], f); // [lat, lng]
+ double[] pos = interpolate(p1[1], p1[0], p2[1], p2[0], f);
+ return new PositionResult(pos[0], pos[1], false);
}
accum += seg;
}
- // 理论不会到这里
double[] last = points.get(points.size() - 1);
- return new double[] { last[1], last[0] };
+ return new PositionResult(last[1], last[0], true);
}
public static void main(String[] args) {
- // 轨迹点(lng, lat 格式)
List points = Arrays.asList(
new double[] {121.148362, 25.007064},
new double[] {121.147192, 25.007612},
new double[] {121.146891, 25.00789},
new double[] {121.147089, 25.008096}
);
- double speed = 5.0; // 米/秒
- double time = 30.0; // 秒
+ double speed = 5.0;
+ double time = 30.0;
- double[] pos = getPosition(points, speed, time);
- System.out.printf("当前位置:纬度 %.6f, 经度 %.6f\n", pos[0], pos[1]);
+ PositionResult pos = getPosition(points, speed, time);
+ System.out.printf("当前位置:纬度 %.6f, 经度 %.6f, 是否到达:%s\n", pos.latitude, pos.longitude, pos.reached ? "是" : "否");
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/hivekion/scenario/TaskFinishedCall.java b/src/main/java/com/hivekion/scenario/TaskFinishedCall.java
new file mode 100644
index 0000000..d9a0614
--- /dev/null
+++ b/src/main/java/com/hivekion/scenario/TaskFinishedCall.java
@@ -0,0 +1,14 @@
+package com.hivekion.scenario;
+
+/**
+ * [类的简要说明]
+ *
+ * [详细描述,可选]
+ *
+ *
+ * @author LiDongYU
+ * @since 2025/7/22
+ */
+public interface TaskFinishedCall {
+ void doneTask();
+}
diff --git a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
index 1bf454a..19cee2e 100644
--- a/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
+++ b/src/main/java/com/hivekion/scenario/entity/ScenarioTask.java
@@ -58,4 +58,5 @@ public class ScenarioTask implements Serializable {
private String taskType;
@TableField(exist = false)
private String status;
+
}
diff --git a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java b/src/main/java/com/hivekion/scenario/service/TaskLogicService.java
index 010ea23..0729ae1 100644
--- a/src/main/java/com/hivekion/scenario/service/TaskLogicService.java
+++ b/src/main/java/com/hivekion/scenario/service/TaskLogicService.java
@@ -1,6 +1,7 @@
package com.hivekion.scenario.service;
import com.hivekion.baseData.entity.Scenario;
+import com.hivekion.scenario.TaskFinishedCall;
import com.hivekion.scenario.entity.ScenarioTask;
/**
@@ -15,11 +16,11 @@ import com.hivekion.scenario.entity.ScenarioTask;
public interface TaskLogicService {
//移动任务
- void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId);
+ void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId,double speed,
+ TaskFinishedCall call);
//战斗任务
void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId);
- //整备
- void restTask(ScenarioTask task,Scenario scenario, String roomId);
+ //保障任务
void supplierTask(ScenarioTask task,Scenario scenario, String roomId);
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 5bdf35b..d835449 100644
--- a/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java
+++ b/src/main/java/com/hivekion/scenario/service/impl/ScenarioTaskServiceImpl.java
@@ -155,11 +155,23 @@ public class ScenarioTaskServiceImpl extends
if (taskListObj instanceof List>) {
List> taskList = (List>) taskListObj;
for (Object task : taskList) {
+
ScenarioTask scenarioTask = (ScenarioTask) task;
- //移动任务
- if (scenarioTask.getTaskType().equals("1")) {
- taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId);
+ 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);
}
+
}
}
}
@@ -167,8 +179,6 @@ public class ScenarioTaskServiceImpl extends
}
-
-
@Override
public List queryTaskList(ScenarioTask task) {
QueryWrapper queryWrapper = new QueryWrapper<>();
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 0586751..36bd79c 100644
--- a/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java
+++ b/src/main/java/com/hivekion/scenario/service/impl/TaskLogicServiceImpl.java
@@ -4,8 +4,10 @@ import com.alibaba.fastjson2.JSON;
import com.hivekion.Global;
import com.hivekion.baseData.entity.Scenario;
import com.hivekion.common.MultiPointGeoPosition;
+import com.hivekion.common.MultiPointGeoPosition.PositionResult;
import com.hivekion.common.entity.ResponseCmdInfo;
import com.hivekion.common.redis.RedisUtil;
+import com.hivekion.scenario.TaskFinishedCall;
import com.hivekion.scenario.entity.ScenarioTask;
import com.hivekion.scenario.service.TaskLogicService;
import java.util.ArrayList;
@@ -28,14 +30,17 @@ import org.springframework.web.reactive.function.client.WebClient;
*/
@Service
public class TaskLogicServiceImpl implements TaskLogicService {
+
@Resource
private RedisUtil redisUtil;
@Value("${path.planning.url}")
private String pathPlanningUrl;
private final WebClient webClient = WebClient.create();
- private final static double SPEED = 18.0;
+
+
@Override
- public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId) {
+ public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId,
+ double speed, TaskFinishedCall call) {
ResponseCmdInfo