From 4933c2c14e5352e78737df5c5d1b6e7f540a7830 Mon Sep 17 00:00:00 2001 From: MHW Date: Mon, 20 Apr 2026 16:59:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=99=BA=E5=94=90=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/Kj3TaskDataController.java | 28 ++ .../rule/domain/tasks/AssignTargetItem.java | 16 + .../rule/domain/tasks/DataOutput.java | 16 + .../rule/domain/tasks/Kj3ExecuteBlock.java | 13 + .../rule/domain/tasks/Kj3ForceSide.java | 16 + .../rule/domain/tasks/Kj3MilitaryItem.java | 25 ++ .../tasks/Kj3MilitaryPlatformComponent.java | 17 + .../domain/tasks/Kj3MilitaryScenario.java | 24 + .../rule/domain/tasks/Kj3PostResult.java | 15 + .../domain/tasks/Kj3RefAttributeObject.java | 15 + .../solution/rule/domain/tasks/Kj3Root.java | 13 + .../rule/domain/tasks/Kj3SubComponents.java | 13 + .../rule/domain/tasks/Kj3TargetItem.java | 15 + .../rule/domain/tasks/Kj3TaskNode.java | 15 + .../rule/domain/tasks/Kj3TaskPayload.java | 23 + .../rule/domain/tasks/Kj3TrackParam.java | 15 + .../rule/domain/tasks/Kj3TrackPoint.java | 17 + .../rule/domain/tasks/PlatformItem.java | 24 + .../rule/domain/tasks/RoutePoint.java | 15 + .../solution/rule/domain/tasks/TaskItem.java | 18 + .../solution/rule/domain/tasks/TaskTime.java | 11 + .../rule/service/Kj3TaskDataService.java | 23 + .../service/impl/Kj3TaskDataServiceImpl.java | 418 ++++++++++++++++++ 23 files changed, 805 insertions(+) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/controller/Kj3TaskDataController.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/AssignTargetItem.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/DataOutput.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ExecuteBlock.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ForceSide.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryItem.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryPlatformComponent.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryScenario.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3PostResult.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3RefAttributeObject.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3Root.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3SubComponents.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TargetItem.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskNode.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskPayload.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackParam.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackPoint.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/PlatformItem.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/RoutePoint.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskItem.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskTime.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/Kj3TaskDataService.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/impl/Kj3TaskDataServiceImpl.java diff --git a/auto-solution-rule/src/main/java/com/solution/rule/controller/Kj3TaskDataController.java b/auto-solution-rule/src/main/java/com/solution/rule/controller/Kj3TaskDataController.java new file mode 100644 index 0000000..2aec455 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/controller/Kj3TaskDataController.java @@ -0,0 +1,28 @@ +package com.solution.rule.controller; + +import com.solution.rule.domain.tasks.Kj3PostResult; +import com.solution.rule.service.Kj3TaskDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rule/kj3") +public class Kj3TaskDataController { + + @Autowired + private Kj3TaskDataService kj3TaskDataService; + + /** + * 接收外部传入的 kj-3 JSON,筛选红方任务并转换后 POST 到目标地址。 + * + * @param kj3Json 外部请求体 JSON + * @return 处理结果 + */ + @PostMapping("/parse-and-post") + public Kj3PostResult parseAndPost(@RequestBody String kj3Json) { + return kj3TaskDataService.parseAndPostRedTasks(kj3Json); + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/AssignTargetItem.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/AssignTargetItem.java new file mode 100644 index 0000000..6b95e45 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/AssignTargetItem.java @@ -0,0 +1,16 @@ +package com.solution.rule.domain.tasks; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class AssignTargetItem { + + private String task; + + private String type; + + private List target = new ArrayList<>(); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/DataOutput.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/DataOutput.java new file mode 100644 index 0000000..f4dfbd6 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/DataOutput.java @@ -0,0 +1,16 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class DataOutput { + + @JsonProperty("assign_target") + private List assignTarget = new ArrayList<>(); + + private List task = new ArrayList<>(); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ExecuteBlock.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ExecuteBlock.java new file mode 100644 index 0000000..cfa9422 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ExecuteBlock.java @@ -0,0 +1,13 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3ExecuteBlock { + + private List targetList; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ForceSide.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ForceSide.java new file mode 100644 index 0000000..e2f5288 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3ForceSide.java @@ -0,0 +1,16 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3ForceSide { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + @JsonProperty("ForceSideName") + private String forceSideName; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryItem.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryItem.java new file mode 100644 index 0000000..6ef0377 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryItem.java @@ -0,0 +1,25 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3MilitaryItem { + + @JsonProperty("Name") + private String name; + + @JsonProperty("OwnerForceSide") + private String ownerForceSide; + + @JsonProperty("EquipmentID") + private String equipmentId; + + @JsonProperty("Platform_type") + private String platformType; + + @JsonProperty("SubComponents") + private Kj3SubComponents subComponents; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryPlatformComponent.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryPlatformComponent.java new file mode 100644 index 0000000..9ae4caf --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryPlatformComponent.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3MilitaryPlatformComponent { + + @JsonProperty("TrackParamId") + private String trackParamId; + + private List positions; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryScenario.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryScenario.java new file mode 100644 index 0000000..5cc98d7 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3MilitaryScenario.java @@ -0,0 +1,24 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3MilitaryScenario { + + @JsonProperty("Tasks") + private List tasks; + + @JsonProperty("ForceSides") + private List forceSides; + + @JsonProperty("Military") + private List military; + + @JsonProperty("RefAttributeObject") + private Kj3RefAttributeObject refAttributeObject; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3PostResult.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3PostResult.java new file mode 100644 index 0000000..bed759d --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3PostResult.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import lombok.Data; + +@Data +public class Kj3PostResult { + + private boolean success; + + private String statusMessage; + + private String postUrl; + + private int taskCount; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3RefAttributeObject.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3RefAttributeObject.java new file mode 100644 index 0000000..1cd2127 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3RefAttributeObject.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3RefAttributeObject { + + @JsonProperty("TrackParam") + private Map trackParam; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3Root.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3Root.java new file mode 100644 index 0000000..99ba88c --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3Root.java @@ -0,0 +1,13 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3Root { + + @JsonProperty("MilitaryScenario") + private Kj3MilitaryScenario militaryScenario; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3SubComponents.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3SubComponents.java new file mode 100644 index 0000000..f07cb78 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3SubComponents.java @@ -0,0 +1,13 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3SubComponents { + + private List platform; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TargetItem.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TargetItem.java new file mode 100644 index 0000000..7504cdd --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TargetItem.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3TargetItem { + + private String targetId; + + @JsonProperty("cruiseRouteId") + private String cruiseRouteId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskNode.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskNode.java new file mode 100644 index 0000000..25bde0e --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskNode.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3TaskNode { + + private String name; + + private String side; + + private Kj3TaskPayload task; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskPayload.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskPayload.java new file mode 100644 index 0000000..2ed1ea3 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TaskPayload.java @@ -0,0 +1,23 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3TaskPayload { + + private String name; + + private String side; + + private String type; + + @JsonProperty("at_time") + private String atTime; + + private List execute; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackParam.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackParam.java new file mode 100644 index 0000000..07e00bc --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackParam.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3TrackParam { + + @JsonProperty("TrackPoints") + private List trackPoints; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackPoint.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackPoint.java new file mode 100644 index 0000000..e8fab28 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/Kj3TrackPoint.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Kj3TrackPoint { + + private String longitude; + + private String latitude; + + private String height; + + private String speed; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/PlatformItem.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/PlatformItem.java new file mode 100644 index 0000000..5b070ec --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/PlatformItem.java @@ -0,0 +1,24 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class PlatformItem { + + private String name; + + @JsonProperty("platform_type") + private String platformType; + + private String longitude; + + private String latitude; + + private Integer altitude; + + private List route = new ArrayList<>(); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/RoutePoint.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/RoutePoint.java new file mode 100644 index 0000000..ac87634 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/RoutePoint.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.tasks; + +import lombok.Data; + +@Data +public class RoutePoint { + + private String longitude; + + private String latitude; + + private Integer altitude; + + private Integer speed; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskItem.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskItem.java new file mode 100644 index 0000000..bfed3a5 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskItem.java @@ -0,0 +1,18 @@ +package com.solution.rule.domain.tasks; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class TaskItem { + + @JsonProperty("task_name") + private String taskName; + + private List platform = new ArrayList<>(); + + private TaskTime time; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskTime.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskTime.java new file mode 100644 index 0000000..498bb5b --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/tasks/TaskTime.java @@ -0,0 +1,11 @@ +package com.solution.rule.domain.tasks; + +import lombok.Data; + +@Data +public class TaskTime { + + private Integer begin; + + private Integer end; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/Kj3TaskDataService.java b/auto-solution-rule/src/main/java/com/solution/rule/service/Kj3TaskDataService.java new file mode 100644 index 0000000..d08ef34 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/Kj3TaskDataService.java @@ -0,0 +1,23 @@ +package com.solution.rule.service; + +import com.solution.rule.domain.tasks.Kj3PostResult; +import com.solution.rule.domain.tasks.Kj3Root; + +public interface Kj3TaskDataService { + + /** + * 解析接口入参 JSON,仅提取红方任务,转换为 data 结构后发送 HTTP POST。 + * + * @param kj3Json 传入的 kj-3 JSON 字符串 + * @return 发送结果 + */ + Kj3PostResult parseAndPostRedTasks(String kj3Json); + + /** + * 解析接口入参对象,仅提取红方任务,转换为 data 结构后发送 HTTP POST。 + * + * @param root 传入的 kj-3 对象 + * @return 发送结果 + */ + Kj3PostResult parseAndPostRedTasks(Kj3Root root); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/Kj3TaskDataServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/Kj3TaskDataServiceImpl.java new file mode 100644 index 0000000..c86e0c8 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/Kj3TaskDataServiceImpl.java @@ -0,0 +1,418 @@ +package com.solution.rule.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.solution.rule.domain.tasks.AssignTargetItem; +import com.solution.rule.domain.tasks.DataOutput; +import com.solution.rule.domain.tasks.Kj3ExecuteBlock; +import com.solution.rule.domain.tasks.Kj3ForceSide; +import com.solution.rule.domain.tasks.Kj3MilitaryItem; +import com.solution.rule.domain.tasks.Kj3MilitaryPlatformComponent; +import com.solution.rule.domain.tasks.Kj3MilitaryScenario; +import com.solution.rule.domain.tasks.Kj3PostResult; +import com.solution.rule.domain.tasks.Kj3RefAttributeObject; +import com.solution.rule.domain.tasks.Kj3Root; +import com.solution.rule.domain.tasks.Kj3TaskNode; +import com.solution.rule.domain.tasks.Kj3TaskPayload; +import com.solution.rule.domain.tasks.Kj3TrackParam; +import com.solution.rule.domain.tasks.Kj3TrackPoint; +import com.solution.rule.domain.tasks.Kj3TargetItem; +import com.solution.rule.domain.tasks.PlatformItem; +import com.solution.rule.domain.tasks.RoutePoint; +import com.solution.rule.domain.tasks.TaskItem; +import com.solution.rule.domain.tasks.TaskTime; +import com.solution.rule.service.Kj3TaskDataService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.UnknownHostException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class Kj3TaskDataServiceImpl implements Kj3TaskDataService { + + private static final Logger log = LoggerFactory.getLogger(Kj3TaskDataServiceImpl.class); + + private static final String DATA_POST_URL = "http://localhost:5000/bhtree/zhitangCompanyData"; + private static final String URL_PLACEHOLDER = "http://TODO-REPLACE"; + + private static final String RED_SIDE = "红方"; + + private static final String DEFAULT_ASSIGN_TYPE = "fire"; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public Kj3PostResult parseAndPostRedTasks(String kj3Json) { + if (ObjectUtil.isEmpty(kj3Json)) { + throw new IllegalArgumentException("kj3Json 不能为空"); + } + Kj3Root root = parseKj3Json(kj3Json); + return parseAndPostRedTasks(root); + } + + @Override + public Kj3PostResult parseAndPostRedTasks(Kj3Root root) { + if (ObjectUtil.isEmpty(root)) { + throw new IllegalArgumentException("kj3 入参对象不能为空"); + } + DataOutput output = transformToDataOutput(root); + String payload = writeJson(output); + log.info("kj3 转换后的 data 输出: {}", payload); + Kj3PostResult result = new Kj3PostResult(); + result.setPostUrl(DATA_POST_URL); + result.setTaskCount(output.getTask().size()); + if (!isPostUrlConfigured()) { + result.setSuccess(false); + result.setStatusMessage("POST URL 未配置,请将 DATA_POST_URL 从占位值替换为真实地址"); + return result; + } + try { + String response = postJson(payload); + result.setSuccess(true); + result.setStatusMessage(response); + } catch (RuntimeException ex) { + result.setSuccess(false); + result.setStatusMessage(ex.getMessage()); + } + return result; + } + + private boolean isPostUrlConfigured() { + return ObjectUtil.isNotEmpty(DATA_POST_URL) && !URL_PLACEHOLDER.equalsIgnoreCase(DATA_POST_URL); + } + + private Kj3Root parseKj3Json(String kj3Json) { + try { + return objectMapper.readValue(kj3Json, Kj3Root.class); + } catch (IOException e) { + throw new RuntimeException("解析接口入参 kj-3 JSON 失败", e); + } + } + + private DataOutput transformToDataOutput(Kj3Root root) { + DataOutput output = new DataOutput(); + Kj3MilitaryScenario scenario = root == null ? null : root.getMilitaryScenario(); + List tasks = scenario == null ? Collections.emptyList() : scenario.getTasks(); + if (CollUtil.isEmpty(tasks)) { + return output; + } + String redForceSideId = getRedForceSideId(scenario); + + List redTasks = tasks.stream() + .filter(this::isRedTask) + .collect(Collectors.toList()); + + for (Kj3TaskNode redTask : redTasks) { + String taskName = resolveTaskName(redTask); + Kj3TaskPayload payload = redTask.getTask(); + + TaskItem taskItem = new TaskItem(); + taskItem.setTaskName(taskName); + taskItem.setTime(buildTaskTime(payload)); + taskItem.setPlatform(buildPlatformsForTask(scenario, redForceSideId, payload)); + output.getTask().add(taskItem); + + AssignTargetItem assignTargetItem = new AssignTargetItem(); + assignTargetItem.setTask(taskName); + assignTargetItem.setType(resolveTaskType(payload)); + assignTargetItem.setTarget(extractTargets(payload)); + output.getAssignTarget().add(assignTargetItem); + } + return output; + } + + private boolean isRedTask(Kj3TaskNode taskNode) { + if (taskNode == null) { + return false; + } + if (RED_SIDE.equals(taskNode.getSide())) { + return true; + } + Kj3TaskPayload payload = taskNode.getTask(); + return payload != null && RED_SIDE.equals(payload.getSide()); + } + + private String resolveTaskName(Kj3TaskNode taskNode) { + Kj3TaskPayload payload = taskNode.getTask(); + if (payload != null && ObjectUtil.isNotEmpty(payload.getName())) { + return payload.getName(); + } + return taskNode.getName(); + } + + private String resolveTaskType(Kj3TaskPayload payload) { + if (payload != null && ObjectUtil.isNotEmpty(payload.getType())) { + return payload.getType(); + } + return DEFAULT_ASSIGN_TYPE; + } + + private String getRedForceSideId(Kj3MilitaryScenario scenario) { + if (scenario == null || CollUtil.isEmpty(scenario.getForceSides())) { + return ""; + } + for (Kj3ForceSide forceSide : scenario.getForceSides()) { + if (forceSide != null && RED_SIDE.equals(forceSide.getForceSideName())) { + return forceSide.getObjectHandle(); + } + } + return ""; + } + + private List buildRedPlatforms(Kj3MilitaryScenario scenario, String redForceSideId) { + if (scenario == null || CollUtil.isEmpty(scenario.getMilitary()) || ObjectUtil.isEmpty(redForceSideId)) { + return new ArrayList<>(); + } + Map trackParamMap = getTrackParamMap(scenario); + List platforms = new ArrayList<>(); + for (Kj3MilitaryItem militaryItem : scenario.getMilitary()) { + if (militaryItem == null || !redForceSideId.equals(militaryItem.getOwnerForceSide())) { + continue; + } + PlatformItem platformItem = mapMilitaryToPlatform(militaryItem, trackParamMap); + platforms.add(platformItem); + } + return platforms; + } + + private List buildPlatformsForTask(Kj3MilitaryScenario scenario, String redForceSideId, Kj3TaskPayload payload) { + List redPlatforms = buildRedPlatforms(scenario, redForceSideId); + if (CollUtil.isEmpty(redPlatforms)) { + return redPlatforms; + } + Map trackParamMap = getTrackParamMap(scenario); + String fallbackRouteId = resolveFallbackRouteId(payload); + if (ObjectUtil.isEmpty(fallbackRouteId)) { + return redPlatforms; + } + for (PlatformItem platform : redPlatforms) { + if (CollUtil.isNotEmpty(platform.getRoute())) { + continue; + } + platform.setRoute(buildRoute(fallbackRouteId, trackParamMap)); + } + return redPlatforms; + } + + private Map getTrackParamMap(Kj3MilitaryScenario scenario) { + Kj3RefAttributeObject refAttributeObject = scenario.getRefAttributeObject(); + if (refAttributeObject == null || refAttributeObject.getTrackParam() == null) { + return new HashMap<>(); + } + return refAttributeObject.getTrackParam(); + } + + private PlatformItem mapMilitaryToPlatform(Kj3MilitaryItem militaryItem, Map trackParamMap) { + PlatformItem platformItem = new PlatformItem(); + platformItem.setName(militaryItem.getName()); + platformItem.setPlatformType(militaryItem.getPlatformType()); + + Kj3MilitaryPlatformComponent positionSourceComponent = resolvePositionSourceComponent(militaryItem); + fillPosition(platformItem, positionSourceComponent); + String trackParamId = resolveTrackParamId(militaryItem); + platformItem.setRoute(buildRoute(trackParamId, trackParamMap)); + return platformItem; + } + + private String resolveFallbackRouteId(Kj3TaskPayload payload) { + if (payload == null || CollUtil.isEmpty(payload.getExecute())) { + return ""; + } + for (Kj3ExecuteBlock executeBlock : payload.getExecute()) { + if (executeBlock == null || CollUtil.isEmpty(executeBlock.getTargetList())) { + continue; + } + for (Kj3TargetItem targetItem : executeBlock.getTargetList()) { + if (targetItem != null && ObjectUtil.isNotEmpty(targetItem.getCruiseRouteId())) { + return targetItem.getCruiseRouteId(); + } + } + } + return ""; + } + + private Kj3MilitaryPlatformComponent resolvePositionSourceComponent(Kj3MilitaryItem militaryItem) { + if (militaryItem.getSubComponents() == null || CollUtil.isEmpty(militaryItem.getSubComponents().getPlatform())) { + return null; + } + for (Kj3MilitaryPlatformComponent component : militaryItem.getSubComponents().getPlatform()) { + if (component != null && CollUtil.isNotEmpty(component.getPositions())) { + return component; + } + } + return militaryItem.getSubComponents().getPlatform().get(0); + } + + private String resolveTrackParamId(Kj3MilitaryItem militaryItem) { + if (militaryItem.getSubComponents() == null || CollUtil.isEmpty(militaryItem.getSubComponents().getPlatform())) { + return ""; + } + for (Kj3MilitaryPlatformComponent component : militaryItem.getSubComponents().getPlatform()) { + if (component != null && ObjectUtil.isNotEmpty(component.getTrackParamId())) { + return component.getTrackParamId(); + } + } + return ""; + } + + private void fillPosition(PlatformItem platformItem, Kj3MilitaryPlatformComponent component) { + if (component == null || CollUtil.isEmpty(component.getPositions())) { + return; + } + List positions = component.getPositions(); + if (positions.size() > 0 && positions.get(0) != null) { + platformItem.setLongitude(String.valueOf(positions.get(0))); + } + if (positions.size() > 1 && positions.get(1) != null) { + platformItem.setLatitude(String.valueOf(positions.get(1))); + } + if (positions.size() > 2 && positions.get(2) != null) { + platformItem.setAltitude((int) Math.round(positions.get(2))); + } + } + + private List buildRoute(String trackParamId, Map trackParamMap) { + if (ObjectUtil.isEmpty(trackParamId)) { + return new ArrayList<>(); + } + Kj3TrackParam trackParam = trackParamMap.get(trackParamId); + if (trackParam == null || CollUtil.isEmpty(trackParam.getTrackPoints())) { + return new ArrayList<>(); + } + List routes = new ArrayList<>(); + for (Kj3TrackPoint trackPoint : trackParam.getTrackPoints()) { + if (trackPoint == null) { + continue; + } + RoutePoint routePoint = new RoutePoint(); + routePoint.setLongitude(trackPoint.getLongitude()); + routePoint.setLatitude(trackPoint.getLatitude()); + routePoint.setAltitude(parseInteger(trackPoint.getHeight())); + routePoint.setSpeed(parseInteger(trackPoint.getSpeed())); + routes.add(routePoint); + } + return routes; + } + + private TaskTime buildTaskTime(Kj3TaskPayload payload) { + int begin = parseAtTime(payload); + TaskTime taskTime = new TaskTime(); + taskTime.setBegin(begin); + taskTime.setEnd(begin); + return taskTime; + } + + private int parseAtTime(Kj3TaskPayload payload) { + if (payload == null || ObjectUtil.isEmpty(payload.getAtTime())) { + return 0; + } + try { + return Integer.parseInt(payload.getAtTime().trim()); + } catch (NumberFormatException ex) { + return 0; + } + } + + private Integer parseInteger(String value) { + if (ObjectUtil.isEmpty(value)) { + return null; + } + try { + return (int) Math.round(Double.parseDouble(value.trim())); + } catch (NumberFormatException ex) { + return null; + } + } + + private List extractTargets(Kj3TaskPayload payload) { + if (payload == null || CollUtil.isEmpty(payload.getExecute())) { + return new ArrayList<>(); + } + Set uniqueTargets = new LinkedHashSet<>(); + for (Kj3ExecuteBlock executeBlock : payload.getExecute()) { + if (executeBlock == null || CollUtil.isEmpty(executeBlock.getTargetList())) { + continue; + } + for (Kj3TargetItem targetItem : executeBlock.getTargetList()) { + if (targetItem == null || ObjectUtil.isEmpty(targetItem.getTargetId())) { + continue; + } + uniqueTargets.add(targetItem.getTargetId()); + } + } + return new ArrayList<>(uniqueTargets); + } + + private String writeJson(DataOutput output) { + try { + return objectMapper.writeValueAsString(output); + } catch (Exception e) { + throw new RuntimeException("序列化 data 输出失败", e); + } + } + + private String postJson(String payload) { + HttpURLConnection connection = null; + try { + URL url = new URL(DATA_POST_URL); + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + connection.setDoOutput(true); + + try (OutputStream outputStream = connection.getOutputStream()) { + outputStream.write(payload.getBytes(StandardCharsets.UTF_8)); + outputStream.flush(); + } + + int status = connection.getResponseCode(); + try (InputStream responseStream = status >= 400 ? connection.getErrorStream() : connection.getInputStream()) { + String responseBody = readResponse(responseStream); + return "HTTP " + status + " " + responseBody; + } + } catch (IOException e) { + if (e instanceof UnknownHostException) { + throw new RuntimeException("POST data 输出失败: 无法解析主机,请检查 DATA_POST_URL=" + DATA_POST_URL, e); + } + throw new RuntimeException("POST data 输出失败: " + e.getMessage(), e); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + private String readResponse(InputStream inputStream) throws IOException { + if (inputStream == null) { + return ""; + } + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } + } +} From c597c3c01f284192229e012f46ebce477e713ee2 Mon Sep 17 00:00:00 2001 From: MHW Date: Mon, 20 Apr 2026 17:10:01 +0800 Subject: [PATCH 2/2] =?UTF-8?q?PUT=E6=8E=A5=E5=8F=A3=E6=94=B9json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behaviour/BehaviortreeController.java | 10 +++++----- .../com/solution/system/domain/PlatFormDTO.java | 12 ++++++++++++ .../com/solution/system/mapper/PlatformMapper.java | 5 +++-- .../system/service/IBehaviortreeService.java | 5 +++-- .../service/impl/BehaviortreeServiceImpl.java | 13 +++++-------- 5 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 auto-solution-behaviour/src/main/java/com/solution/system/domain/PlatFormDTO.java diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java index 5bbbd9d..92d8ea0 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java @@ -3,6 +3,7 @@ package com.solution.web.controller.behaviour; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.solution.system.domain.PlatFormDTO; import com.solution.web.core.BehaviortreeProcessor; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -153,13 +154,12 @@ public class BehaviortreeController extends BaseController /** * 修改平台关联的行为树id - * @param behaviortreeId + * @param platFormDTO * @return */ @ApiOperation("修改平台关联的行为树id") - @PutMapping("/{behaviortreeId}") - public AjaxResult updateBehaviortreeId(@PathVariable Integer behaviortreeId, - @RequestParam(required = false) Integer id){ - return toAjax(behaviortreeService.updateBehaviortreeId(behaviortreeId,id)); + @PutMapping("/behaviortreeId") + public AjaxResult updateBehaviortreeId(@RequestBody PlatFormDTO platFormDTO){ + return toAjax(behaviortreeService.updateBehaviortreeId(platFormDTO)); } } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/domain/PlatFormDTO.java b/auto-solution-behaviour/src/main/java/com/solution/system/domain/PlatFormDTO.java new file mode 100644 index 0000000..dc736df --- /dev/null +++ b/auto-solution-behaviour/src/main/java/com/solution/system/domain/PlatFormDTO.java @@ -0,0 +1,12 @@ +package com.solution.system.domain; + +import lombok.Data; + +@Data +public class PlatFormDTO { + + private Integer id; + + private Integer behaviortreeId; + +} diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/mapper/PlatformMapper.java b/auto-solution-behaviour/src/main/java/com/solution/system/mapper/PlatformMapper.java index b15486e..81d203a 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/mapper/PlatformMapper.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/mapper/PlatformMapper.java @@ -1,5 +1,6 @@ package com.solution.system.mapper; +import com.solution.system.domain.PlatFormDTO; import com.solution.system.domain.PlatformTree; import com.solution.system.domain.PlatformVO; import org.apache.ibatis.annotations.Mapper; @@ -35,8 +36,8 @@ public interface PlatformMapper { /** * 修改平台关联的行为树id - * @param behaviortreeId + * @param platFormDTO * @return */ - Integer updateBehaviortreeId(@Param("behaviortreeId") Integer behaviortreeId,@Param("id") Integer id); + Integer updateBehaviortreeId(PlatFormDTO platFormDTO); } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java b/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java index 19c45ed..e51a379 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java @@ -3,6 +3,7 @@ package com.solution.system.service; import java.util.List; import com.solution.system.domain.Behaviortree; +import com.solution.system.domain.PlatFormDTO; import com.solution.system.domain.PlatformChiefCommander; import com.solution.system.domain.PlatformVO; @@ -87,8 +88,8 @@ public interface IBehaviortreeService /** * 修改平台关联的行为树id - * @param behaviortreeId + * @param platFormDTO * @return */ - Integer updateBehaviortreeId(Integer behaviortreeId,Integer id); + Integer updateBehaviortreeId(PlatFormDTO platFormDTO); } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java b/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java index 729b11f..4c34218 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java @@ -5,15 +5,12 @@ import java.util.List; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.solution.common.constant.ExceptionConstants; -import com.solution.system.domain.PlatformChiefCommander; -import com.solution.system.domain.PlatformTree; -import com.solution.system.domain.PlatformVO; +import com.solution.system.domain.*; import com.solution.system.mapper.PlatformCommunicationMapper; import com.solution.system.mapper.PlatformMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.solution.system.mapper.BehaviortreeMapper; -import com.solution.system.domain.Behaviortree; import com.solution.system.service.IBehaviortreeService; /** @@ -159,14 +156,14 @@ public class BehaviortreeServiceImpl implements IBehaviortreeService /** * 修改平台关联的行为树id - * @param behaviortreeId + * @param platFormDTO * @return */ @Override - public Integer updateBehaviortreeId(Integer behaviortreeId,Integer id) { - if(ObjectUtil.isEmpty(behaviortreeId) || ObjectUtil.isEmpty(id)){ + public Integer updateBehaviortreeId(PlatFormDTO platFormDTO) { + if(ObjectUtil.isEmpty(platFormDTO)){ throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); } - return platformMapper.updateBehaviortreeId(behaviortreeId,id); + return platformMapper.updateBehaviortreeId(platFormDTO); } }