From 50a369c722b0b9a3624cc36045539bef9a1dc8c2 Mon Sep 17 00:00:00 2001 From: MHW Date: Sat, 4 Apr 2026 07:07:20 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=E6=9C=80=E7=BB=88=E7=89=88json=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/rule/FireRuleController.java | 16 + .../rule/domain/simplerulepojo/Task.java | 12 + .../rule/domain/simplerulepojo/Weapon.java | 9 + .../dto/FireRuleComponentParamDTO.java | 32 + .../ultimately/dto/FireRuleCoordinateDTO.java | 27 + .../dto/FireRuleInputArithmeticRefDTO.java | 13 + .../ultimately/dto/FireRuleInputDTO.java | 29 + .../dto/FireRuleInputDeviceRefDTO.java | 15 + ...FireRuleInputLauncherConfigurationDTO.java | 17 + .../dto/FireRuleInputMountedWeaponRefDTO.java | 15 + .../dto/FireRuleInputRedCircleStyleDTO.java | 20 + .../dto/FireRuleInputRedCommSlotDTO.java | 37 + .../dto/FireRuleInputRedLeadPayloadDTO.java | 34 + .../dto/FireRuleInputRedLeadPositionDTO.java | 18 + .../dto/FireRuleInputRedMotorizedSlotDTO.java | 33 + .../dto/FireRuleInputRedPlatformSlotDTO.java | 42 + .../dto/FireRuleInputRedSubComponentsDTO.java | 21 + .../dto/FireRuleInputRedWeaponElementDTO.java | 70 + .../dto/FireRuleInputRedWeaponSlotDTO.java | 43 + .../dto/FireRuleInputRedWingItemDTO.java | 17 + .../ultimately/dto/FireRuleTaskInputDTO.java | 59 + .../ultimately/dto/FireRuleTaskWeaponDTO.java | 50 + .../ultimately/dto/FireRuleTrackPointDTO.java | 37 + .../dto/FireRuleWeaponComponentDTO.java | 29 + .../domain/ultimately/dto/package-info.java | 7 + .../vo/FireRuleArithmeticRefVO.java | 22 + .../vo/FireRuleComponentParamVO.java | 32 + .../ultimately/vo/FireRuleCoordinateVO.java | 27 + .../vo/FireRuleCruiseRouteOffsetItemVO.java | 27 + .../ultimately/vo/FireRuleDeviceRefVO.java | 27 + .../ultimately/vo/FireRuleExecuteBlockVO.java | 21 + .../vo/FireRuleExecuteTargetItemVO.java | 63 + .../vo/FireRuleLauncherConfigurationVO.java | 32 + .../vo/FireRuleMissionListItemVO.java | 23 + .../vo/FireRuleMountedWeaponRefVO.java | 24 + .../ultimately/vo/FireRuleOutputVO.java | 42 + .../vo/FireRuleRedCommunicationSlotVO.java | 40 + .../vo/FireRuleRedMotorizedSlotVO.java | 36 + .../vo/FireRuleRedPlatformSlotVO.java | 45 + .../vo/FireRuleRedSubComponentsVO.java | 24 + .../vo/FireRuleRedWeaponEquipmentVO.java | 49 + .../vo/FireRuleRedWeaponSlotVO.java | 46 + .../vo/FireRuleSceneGroupNodeVO.java | 44 + .../vo/FireRuleSceneTaskNodeVO.java | 42 + .../vo/FireRuleSceneTaskPayloadVO.java | 42 + .../vo/FireRuleTargetAttTimeVO.java | 22 + .../ultimately/vo/FireRuleTaskInputVO.java | 64 + .../ultimately/vo/FireRuleTaskWeaponVO.java | 49 + .../ultimately/vo/FireRuleTrackPointVO.java | 37 + .../vo/FireRuleWeaponComponentVO.java | 29 + .../ultimately/vo/FireRuleWingmanDataVO.java | 22 + .../rule/service/FireRuleService.java | 9 + .../service/impl/FireRuleServiceImpl.java | 36 +- .../resources/json/火力规则输入-无注释.json | 349 +++++ .../src/main/resources/json/火力规则输入.json | 474 ++++++ .../src/main/resources/json/火力规则输出.json | 355 +++++ .../src/main/resources/rules/README.md | 313 ++-- .../src/main/resources/rules/fire-rule.drl | 1395 +++++++++++++++-- .../src/main/resources/rules/rule.drl | 0 59 files changed, 4320 insertions(+), 244 deletions(-) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleComponentParamDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleCoordinateDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputArithmeticRefDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDeviceRefDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputLauncherConfigurationDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputMountedWeaponRefDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCommSlotDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedMotorizedSlotDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedPlatformSlotDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedSubComponentsDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponSlotDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskWeaponDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTrackPointDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleWeaponComponentDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleArithmeticRefVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleComponentParamVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCoordinateVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCruiseRouteOffsetItemVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleDeviceRefVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteBlockVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleLauncherConfigurationVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMissionListItemVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMountedWeaponRefVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedCommunicationSlotVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedMotorizedSlotVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedPlatformSlotVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedSubComponentsVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponSlotVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneGroupNodeVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskNodeVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskPayloadVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTargetAttTimeVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskInputVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskWeaponVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackPointVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWeaponComponentVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWingmanDataVO.java create mode 100644 auto-solution-rule/src/main/resources/json/火力规则输入-无注释.json create mode 100644 auto-solution-rule/src/main/resources/json/火力规则输入.json create mode 100644 auto-solution-rule/src/main/resources/json/火力规则输出.json create mode 100644 auto-solution-rule/src/main/resources/rules/rule.drl diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java index 8c4eac0..4abef30 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java @@ -4,6 +4,7 @@ import com.solution.common.core.controller.BaseController; import com.solution.common.core.domain.AjaxResult; import com.solution.rule.domain.FireRuleExecuteDTO; import com.solution.rule.domain.simplerulepojo.Task; +import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; import com.solution.rule.service.FireRuleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -95,4 +96,19 @@ public class FireRuleController extends BaseController { public AjaxResult execute(@RequestBody Task task){ return success(ruleService.executeTask(task)); } + + + /** + * 开始执行规则匹配 + * @param task 敌方参数 + * @return + */ + @PostMapping("/rule") + @ApiOperation("开始执行规则匹配") + public AjaxResult rule(@RequestBody FireRuleInputDTO task){ + return success(ruleService.rule(task)); + } + + + } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Task.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Task.java index c2d10c3..d1c68f5 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Task.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Task.java @@ -39,4 +39,16 @@ public class Task { //防区经纬高 private List defZoneLocation; + + //阵型类型:TRIANGLE/DIAMOND/LINE/COLUMN/WEDGE + private String formationType; + + //阵型基础间距(米) + private Integer formationSpacingMeters; + + //主僚标准距离(米) + private Integer mainWingDistanceMeters; + + //阵型朝向(0~359) + private Integer formationHeadingDeg; } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Weapon.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Weapon.java index 1956766..14f0de9 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Weapon.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/Weapon.java @@ -30,4 +30,13 @@ public class Weapon { //目标id private String targetId; + + //编队角色:MAIN=主机,WING=僚机 + private String formationRole; + + //僚机相对主机距离(米) + private Integer wingRelativeDistanceMeters; + + //僚机相对主机方位角(度) + private Integer wingRelativeBearingDeg; } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleComponentParamDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleComponentParamDTO.java new file mode 100644 index 0000000..55563ee --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleComponentParamDTO.java @@ -0,0 +1,32 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 装备组件参数项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleComponentParamDTO { + + /** + * 参数唯一标识 + */ + private String uuid; + + /** + * 属性默认值 + */ + private String attDefaultValue; + + /** + * 属性说明 + */ + private String attExplain; + + /** + * 数量 + */ + private Integer number; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleCoordinateDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleCoordinateDTO.java new file mode 100644 index 0000000..94a55c5 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleCoordinateDTO.java @@ -0,0 +1,27 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 经纬高坐标点 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleCoordinateDTO { + + /** + * 经度 + */ + private Double longitude; + + /** + * 纬度 + */ + private Double latitude; + + /** + * 高程(米) + */ + private Double height; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputArithmeticRefDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputArithmeticRefDTO.java new file mode 100644 index 0000000..5bd82c7 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputArithmeticRefDTO.java @@ -0,0 +1,13 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputArithmeticRefDTO { + + private String id; + + private String name; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java new file mode 100644 index 0000000..9c30a96 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java @@ -0,0 +1,29 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 火力规则输入根文档,与 {@code 火力规则输入-无注释.json} 顶层字段对应。 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputDTO { + + /** + * 来源场景文件名 + */ + private String sourceFile; + + /** + * 蓝方任务列表 + */ + private List tasks; + + /** + * 红方侧异构条目列表(武器、场景任务节点、装备、指挥所、防区等) + */ + private List redWeapons; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDeviceRefDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDeviceRefDTO.java new file mode 100644 index 0000000..baf4286 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDeviceRefDTO.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputDeviceRefDTO { + + private String id; + + private String name; + + private String refId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputLauncherConfigurationDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputLauncherConfigurationDTO.java new file mode 100644 index 0000000..0b0fc82 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputLauncherConfigurationDTO.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputLauncherConfigurationDTO { + + private String classifyName; + + private Integer isMount; + + private FireRuleInputMountedWeaponRefDTO mountedWeapon; + + private Integer number; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputMountedWeaponRefDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputMountedWeaponRefDTO.java new file mode 100644 index 0000000..5d275ac --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputMountedWeaponRefDTO.java @@ -0,0 +1,15 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputMountedWeaponRefDTO { + + @JsonProperty("_id") + private String id; + + private String name; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java new file mode 100644 index 0000000..de251a8 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java @@ -0,0 +1,20 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 防区圆形条目中 isWing 为对象时的样式字段 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedCircleStyleDTO { + + private String outlineWidth; + + private String lineType; + + private String outlineColor; + + private String color; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCommSlotDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCommSlotDTO.java new file mode 100644 index 0000000..d4e82b5 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCommSlotDTO.java @@ -0,0 +1,37 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedCommSlotDTO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleInputArithmeticRefDTO arithmetic; + + private FireRuleInputDeviceRefDTO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java new file mode 100644 index 0000000..6acd324 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java @@ -0,0 +1,34 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * redWeapons 条目中 isLead:可能是长机编队参数,也可能是圆形防区参数(字段并集) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedLeadPayloadDTO { + + private String leader; + + private String side; + + private String supportType; + + private List positions; + + private String drawName; + + private String airspaceType; + + private String selectLonLat; + + private String radius; + + private String height; + + private String extrudedHeight; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java new file mode 100644 index 0000000..96be030 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java @@ -0,0 +1,18 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 长机/圆形等结构中的坐标点(示例中可能为数值或占位字符串) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedLeadPositionDTO { + + private String longitude; + + private String latitude; + + private String height; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedMotorizedSlotDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedMotorizedSlotDTO.java new file mode 100644 index 0000000..4c3c670 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedMotorizedSlotDTO.java @@ -0,0 +1,33 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedMotorizedSlotDTO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleInputArithmeticRefDTO arithmetic; + + private FireRuleInputDeviceRefDTO device; + + private String deviceId; + + private String deviceName; + + private String soleId; + + @JsonProperty("ParentPlat") + private String parentPlat; + + private Map twiceModified; + + private List zLists; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedPlatformSlotDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedPlatformSlotDTO.java new file mode 100644 index 0000000..afc801f --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedPlatformSlotDTO.java @@ -0,0 +1,42 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedPlatformSlotDTO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleInputArithmeticRefDTO arithmetic; + + private FireRuleInputDeviceRefDTO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("TrackParamId") + private String trackParamId; + + private List positions; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedSubComponentsDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedSubComponentsDTO.java new file mode 100644 index 0000000..bdf951c --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedSubComponentsDTO.java @@ -0,0 +1,21 @@ +package com.solution.rule.domain.ultimately.dto; + +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 FireRuleInputRedSubComponentsDTO { + + private List communication; + + @JsonProperty("motorized_assembly") + private List motorizedAssembly; + + private List platform; + + private List weapon; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java new file mode 100644 index 0000000..1f0b3de --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java @@ -0,0 +1,70 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 输入 JSON 中 {@code redWeapons} 数组元素并集:武器摘要、红方装备、营指挥所、防区圆形等形态共用此类。 + *

+ * {@code isWing} 在 JSON 中可能为僚机数组或圆形样式对象,故使用 {@link Object} 承接;可结合 + * {@link FireRuleInputRedWingItemDTO}、{@link FireRuleInputRedCircleStyleDTO} 在业务层转型。 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedWeaponElementDTO { + + private String name; + + @JsonProperty("Name") + private String displayName; + + private String id; + + @JsonProperty("EquipmentID") + private String equipmentId; + + private List components; + + private Object number; + + private String successTargetRad; + + private FireRuleInputRedLeadPayloadDTO isLead; + + private Object isWing; + + /** + * 装备类条目中为 {@code equipment} 等 + */ + private String groupType; + + @JsonProperty("SupportType") + private String supportType; + + @JsonProperty("TroopsDetail") + private Map troopsDetail; + + @JsonProperty("Platform_type") + private String platformType; + + private Boolean isStrikeTarget; + + private Boolean isReconTarget; + + private Boolean isInterferenceTarget; + + private Boolean isDefendImportantPlace; + + @JsonProperty("OwnerForceSide") + private String ownerForceSide; + + @JsonProperty("PlatID") + private String platId; + + @JsonProperty("SubComponents") + private FireRuleInputRedSubComponentsDTO subComponents; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponSlotDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponSlotDTO.java new file mode 100644 index 0000000..ebcaf6b --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponSlotDTO.java @@ -0,0 +1,43 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedWeaponSlotDTO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleInputArithmeticRefDTO arithmetic; + + private String codedQueue; + + private FireRuleInputLauncherConfigurationDTO configuration; + + private FireRuleInputDeviceRefDTO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String serialNumber; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java new file mode 100644 index 0000000..be303e3 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputRedWingItemDTO { + + private String name; + + private String distance; + + private String angle; + + private String alt; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java new file mode 100644 index 0000000..965faa5 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java @@ -0,0 +1,59 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 单条火力规则任务输入(蓝方多任务时为列表中的一项) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTaskInputDTO { + + /** + * 任务唯一标识 + */ + private String id; + + /** + * 任务名称 + */ + private String drawName; + + /** + * 任务类型 + */ + private String dataType; + + /** + * 任务所属阵营 + */ + private String side; + + /** + * 航迹所属实体或阵营标识 + */ + private String trackPointsId; + + /** + * 任务航迹点列表 + */ + private List trackPoints; + + /** + * 任务武器配置列表 + */ + private List taskWeapons; + + /** + * 任务目标 id + */ + private String targetId; + + /** + * 作战区经纬高坐标列表 + */ + private List warZoneLocation; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskWeaponDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskWeaponDTO.java new file mode 100644 index 0000000..2a3c047 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskWeaponDTO.java @@ -0,0 +1,50 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 任务挂载的武器配置 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTaskWeaponDTO { + + /** + * 装备 id(武器唯一标识) + */ + private String equipmentId; + + /** + * 装备名称 + */ + private String name; + + /** + * 装备类型 + */ + private String supportType; + + /** + * 装备组件列表 + */ + private List components; + + /** + * 装备部署位置 + */ + private FireRuleCoordinateDTO coordinate; + + /** + * 武器数量;对应 JSON 键 {@code number}。{@code _comment_number} 为注释键,不映射。 + * 可为数值或业务文案(如「最大载弹量」)。 + */ + private Object number; + + /** + * 该武器打击目标 id + */ + private String targetId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTrackPointDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTrackPointDTO.java new file mode 100644 index 0000000..ef0e346 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTrackPointDTO.java @@ -0,0 +1,37 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 任务航迹点 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTrackPointDTO { + + /** + * 航迹点序号 + */ + private Integer index; + + /** + * 经度 + */ + private Double longitude; + + /** + * 纬度 + */ + private Double latitude; + + /** + * 高度 + */ + private Double height; + + /** + * 速度 + */ + private Double speed; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleWeaponComponentDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleWeaponComponentDTO.java new file mode 100644 index 0000000..6830981 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleWeaponComponentDTO.java @@ -0,0 +1,29 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 任务武器下的设备组件 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleWeaponComponentDTO { + + /** + * 设备 id + */ + private String deviceId; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 组件参数列表 + */ + private List componentParams; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java new file mode 100644 index 0000000..58083f2 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java @@ -0,0 +1,7 @@ +/** + * 火力规则输入侧 DTO,与 {@code resources/json/火力规则输入-无注释.json} 对齐。 + *

+ * {@code redWeapons} 数组元素为并集类型 {@link com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO}, + * 常见形态包括:武器摘要、红方装备(含子组件)、营指挥所、防区圆形等。 + */ +package com.solution.rule.domain.ultimately.dto; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleArithmeticRefVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleArithmeticRefVO.java new file mode 100644 index 0000000..f467715 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleArithmeticRefVO.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 算法引用(id / 名称) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleArithmeticRefVO { + + /** + * 算法 id + */ + private String id; + + /** + * 算法名称 + */ + private String name; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleComponentParamVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleComponentParamVO.java new file mode 100644 index 0000000..904e4cd --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleComponentParamVO.java @@ -0,0 +1,32 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 装备组件参数项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleComponentParamVO { + + /** + * 参数唯一标识 + */ + private String uuid; + + /** + * 属性默认值 + */ + private String attDefaultValue; + + /** + * 属性说明 + */ + private String attExplain; + + /** + * 数量或序号 + */ + private Integer number; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCoordinateVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCoordinateVO.java new file mode 100644 index 0000000..5fa4486 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCoordinateVO.java @@ -0,0 +1,27 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 经纬高坐标点 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleCoordinateVO { + + /** + * 经度 + */ + private Double longitude; + + /** + * 纬度 + */ + private Double latitude; + + /** + * 高程(米) + */ + private Double height; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCruiseRouteOffsetItemVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCruiseRouteOffsetItemVO.java new file mode 100644 index 0000000..bee5bdd --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleCruiseRouteOffsetItemVO.java @@ -0,0 +1,27 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 巡航航线偏移量项(上下 / 前后 / 左右 三选一与取值) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleCruiseRouteOffsetItemVO { + + @JsonProperty("UpOrDown") + private Boolean upOrDown; + + @JsonProperty("BeforeOrAfter") + private Boolean beforeOrAfter; + + @JsonProperty("LeftOrRight") + private Boolean leftOrRight; + + /** + * 偏移数值 + */ + private Number value; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleDeviceRefVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleDeviceRefVO.java new file mode 100644 index 0000000..0f4eaba --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleDeviceRefVO.java @@ -0,0 +1,27 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 设备引用 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleDeviceRefVO { + + /** + * 设备 id + */ + private String id; + + /** + * 设备名称 + */ + private String name; + + /** + * 引用 id + */ + private String refId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteBlockVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteBlockVO.java new file mode 100644 index 0000000..fb505c1 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteBlockVO.java @@ -0,0 +1,21 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 任务载荷中的单次执行块(含目标列表与类型) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleExecuteBlockVO { + + private List targetList; + + /** + * 执行类型,如 assault + */ + private String type; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java new file mode 100644 index 0000000..b337bc8 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java @@ -0,0 +1,63 @@ +package com.solution.rule.domain.ultimately.vo; + +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 FireRuleExecuteTargetItemVO { + + @JsonProperty("ID") + private String id; + + /** + * 阵列位置 id + */ + private Integer arrayPositionId; + + /** + * 阵列位置 id 备份 + */ + private String arrayPositionIdBak; + + /** + * 到达时间配置 + */ + @JsonProperty("at_time") + private FireRuleTargetAttTimeVO atTime; + + @JsonProperty("times_interval") + private Integer timesInterval; + + private String attackType; + + private String boost; + + private String bootTime; + + private String companion; + + private String cruiseRouteId; + + private List cruiseRouteOffset; + + private String fireType; + + private List strategy; + + private String targetId; + + private String weaponId; + + private String weaponRelease; + + private String weaponType; + + private Integer weaponUseCount; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleLauncherConfigurationVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleLauncherConfigurationVO.java new file mode 100644 index 0000000..946209d --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleLauncherConfigurationVO.java @@ -0,0 +1,32 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 发射架配置块 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleLauncherConfigurationVO { + + /** + * 分类名称 + */ + private String classifyName; + + /** + * 是否挂载 + */ + private Integer isMount; + + /** + * 已挂载武器 + */ + private FireRuleMountedWeaponRefVO mountedWeapon; + + /** + * 数量 + */ + private Integer number; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMissionListItemVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMissionListItemVO.java new file mode 100644 index 0000000..6f10e13 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMissionListItemVO.java @@ -0,0 +1,23 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 任务载荷中的挂载/任务清单项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleMissionListItemVO { + + private String label; + + /** + * 发射器类型,如 sam + */ + private String launcherType; + + private Integer number; + + private String value; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMountedWeaponRefVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMountedWeaponRefVO.java new file mode 100644 index 0000000..9c34cd6 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleMountedWeaponRefVO.java @@ -0,0 +1,24 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 挂载武器简要信息 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleMountedWeaponRefVO { + + /** + * 武器文档 id + */ + @JsonProperty("_id") + private String id; + + /** + * 武器名称 + */ + private String name; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java new file mode 100644 index 0000000..38071b0 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java @@ -0,0 +1,42 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 火力规则输出根文档(与 {@code 火力规则输出.json} 字段一一对应)。 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleOutputVO { + + /** + * 来源场景文件名 + */ + private String sourceFile; + + /** + * 火力规则任务列表(可含防区等输出字段) + */ + private List fireRuleInputs; + + /** + * 场景任务节点列表 + */ + @JsonProperty("Tasks") + private List tasks; + + /** + * 编组列表 + */ + @JsonProperty("Groups") + private List groups; + + /** + * 红方装备列表 + */ + private List redWeapons; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedCommunicationSlotVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedCommunicationSlotVO.java new file mode 100644 index 0000000..fc2b134 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedCommunicationSlotVO.java @@ -0,0 +1,40 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 红方装备子组件:通信类数组元素 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedCommunicationSlotVO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleArithmeticRefVO arithmetic; + + private FireRuleDeviceRefVO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedMotorizedSlotVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedMotorizedSlotVO.java new file mode 100644 index 0000000..a2ed317 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedMotorizedSlotVO.java @@ -0,0 +1,36 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 红方装备子组件:机动组件数组元素 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedMotorizedSlotVO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleArithmeticRefVO arithmetic; + + private FireRuleDeviceRefVO device; + + private String deviceId; + + private String deviceName; + + private String soleId; + + @JsonProperty("ParentPlat") + private String parentPlat; + + private Map twiceModified; + + private List zLists; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedPlatformSlotVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedPlatformSlotVO.java new file mode 100644 index 0000000..619f94b --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedPlatformSlotVO.java @@ -0,0 +1,45 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 红方装备子组件:平台数组元素 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedPlatformSlotVO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleArithmeticRefVO arithmetic; + + private FireRuleDeviceRefVO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("TrackParamId") + private String trackParamId; + + private List positions; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedSubComponentsVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedSubComponentsVO.java new file mode 100644 index 0000000..268e249 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedSubComponentsVO.java @@ -0,0 +1,24 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 红方装备子组件分组(按 communication / motorized_assembly / platform / weapon) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedSubComponentsVO { + + private List communication; + + @JsonProperty("motorized_assembly") + private List motorizedAssembly; + + private List platform; + + private List weapon; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java new file mode 100644 index 0000000..47c4548 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java @@ -0,0 +1,49 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +/** + * 火力规则输出中 redWeapons 数组的单项(红方装备/平台) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedWeaponEquipmentVO { + + @JsonProperty("SupportType") + private String supportType; + + @JsonProperty("TroopsDetail") + private Map troopsDetail; + + @JsonProperty("Platform_type") + private String platformType; + + private Boolean isStrikeTarget; + + private Boolean isReconTarget; + + private Boolean isInterferenceTarget; + + private Boolean isDefendImportantPlace; + + private String groupType; + + @JsonProperty("EquipmentID") + private String equipmentId; + + @JsonProperty("Name") + private String name; + + @JsonProperty("OwnerForceSide") + private String ownerForceSide; + + @JsonProperty("PlatID") + private String platId; + + @JsonProperty("SubComponents") + private FireRuleRedSubComponentsVO subComponents; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponSlotVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponSlotVO.java new file mode 100644 index 0000000..e7cd92a --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponSlotVO.java @@ -0,0 +1,46 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 红方装备子组件:武器 / 发射架子项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRedWeaponSlotVO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + private FireRuleArithmeticRefVO arithmetic; + + private String codedQueue; + + private FireRuleLauncherConfigurationVO configuration; + + private FireRuleDeviceRefVO device; + + private String deviceId; + + private String deviceName; + + private Boolean employLabel; + + private String facilityName; + + private String serialNumber; + + private String soleId; + + private Map twiceModified; + + private List zLists; + + @JsonProperty("ParentPlat") + private String parentPlat; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneGroupNodeVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneGroupNodeVO.java new file mode 100644 index 0000000..eeba417 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneGroupNodeVO.java @@ -0,0 +1,44 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 火力规则输出中 Groups 数组的单项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleSceneGroupNodeVO { + + private Number allAngle; + + private String drawName; + + private List editPermission; + + private String groupType; + + private String id; + + private String idKey; + + private Boolean isSelected; + + private Boolean isShow; + + private String leader; + + private String name; + + private String parentId; + + private List permission; + + private Boolean show; + + private Long sort; + + private List wingmanData; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskNodeVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskNodeVO.java new file mode 100644 index 0000000..7de8b12 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskNodeVO.java @@ -0,0 +1,42 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 火力规则输出中 Tasks 数组的单项(场景树任务节点) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleSceneTaskNodeVO { + + private String color; + + private String dataType; + + private String drawName; + + private String groupType; + + private String id; + + private String idKey; + + private Boolean isSelected; + + private String name; + + private String parentId; + + private List permission; + + private Boolean show; + + private String side; + + private Long sort; + + private FireRuleSceneTaskPayloadVO task; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskPayloadVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskPayloadVO.java new file mode 100644 index 0000000..ed3dbec --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleSceneTaskPayloadVO.java @@ -0,0 +1,42 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 场景任务节点中的内层 task 对象 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleSceneTaskPayloadVO { + + @JsonProperty("at_time") + private String atTime; + + private String attackId; + + private String color; + + private String departureAirport; + + private List execute; + + private String landAirport; + + private List missionList; + + private String name; + + private String side; + + private String sideId; + + private Integer speed; + + private String type; + + private String weaponId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTargetAttTimeVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTargetAttTimeVO.java new file mode 100644 index 0000000..badb157 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTargetAttTimeVO.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 目标项中的到达时间开关与取值 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTargetAttTimeVO { + + /** + * 时间上限是否为真 + */ + private Boolean timeUp; + + /** + * 时间值 + */ + private Number value; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskInputVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskInputVO.java new file mode 100644 index 0000000..476f0e1 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskInputVO.java @@ -0,0 +1,64 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 单条火力规则任务输出(相对输入增加防区坐标) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTaskInputVO { + + /** + * 任务唯一标识 + */ + private String id; + + /** + * 任务名称 + */ + private String drawName; + + /** + * 任务类型 + */ + private String dataType; + + /** + * 任务所属阵营 + */ + private String side; + + /** + * 航迹所属实体或阵营标识 + */ + private String trackPointsId; + + /** + * 任务航迹点列表 + */ + private List trackPoints; + + /** + * 任务武器配置列表 + */ + private List taskWeapons; + + /** + * 任务目标 id + */ + private String targetId; + + /** + * 作战区经纬高坐标列表 + */ + private List warZoneLocation; + + /** + * 防区经纬高坐标列表 + */ + private List defZoneLocation; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskWeaponVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskWeaponVO.java new file mode 100644 index 0000000..ffe0fce --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTaskWeaponVO.java @@ -0,0 +1,49 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 任务挂载的武器配置 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTaskWeaponVO { + + /** + * 装备 id(武器唯一标识) + */ + private String equipmentId; + + /** + * 装备名称 + */ + private String name; + + /** + * 装备类型编码 + */ + private String supportType; + + /** + * 装备组件列表 + */ + private List components; + + /** + * 装备部署位置 + */ + private FireRuleCoordinateVO coordinate; + + /** + * 武器数量;可为数值或业务文案(如「最大载弹量」) + */ + private Object number; + + /** + * 该武器打击目标 id + */ + private String targetId; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackPointVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackPointVO.java new file mode 100644 index 0000000..6f08fc9 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackPointVO.java @@ -0,0 +1,37 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 任务航迹点 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTrackPointVO { + + /** + * 航迹点序号 + */ + private Integer index; + + /** + * 经度 + */ + private Double longitude; + + /** + * 纬度 + */ + private Double latitude; + + /** + * 高度 + */ + private Double height; + + /** + * 速度 + */ + private Double speed; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWeaponComponentVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWeaponComponentVO.java new file mode 100644 index 0000000..3c46888 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWeaponComponentVO.java @@ -0,0 +1,29 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * 任务武器下的设备组件 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleWeaponComponentVO { + + /** + * 设备 id + */ + private String deviceId; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 组件参数列表 + */ + private List componentParams; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWingmanDataVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWingmanDataVO.java new file mode 100644 index 0000000..fba994e --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleWingmanDataVO.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * 编组中的僚机相对参数 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleWingmanDataVO { + + private Integer alt; + + private String angle; + + private Integer distance; + + private Integer key; + + private String name; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java b/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java index 53af5ef..bb6ea62 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java @@ -5,6 +5,8 @@ import com.solution.rule.domain.FireRuleExecuteDTO; import com.solution.rule.domain.Platform; import com.solution.rule.domain.PlatformComponent; import com.solution.rule.domain.simplerulepojo.Task; +import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; +import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; import com.solution.rule.domain.vo.PlatformComponentNamesVO; import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; @@ -58,4 +60,11 @@ public interface FireRuleService { * @return */ Task executeTask(Task task); + + /** + * 火力规则 + * @param task + * @return + */ + FireRuleOutputVO rule(FireRuleInputDTO task); } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java index c6e2fb5..d9773f8 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java @@ -7,6 +7,10 @@ import com.solution.rule.domain.*; import com.solution.rule.domain.dto.WeaponModelDTO; import com.solution.rule.domain.simplerulepojo.Task; import com.solution.rule.domain.simplerulepojo.Weapon; +import com.solution.rule.domain.simplerulepojo.fact.FactTask; +import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; import com.solution.rule.domain.vo.ComponentCountVO; import com.solution.rule.domain.vo.PlatformComponentNamesVO; import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; @@ -19,13 +23,11 @@ import com.solution.rule.simpstrategy.FireRuleStrategyFactory; import com.solution.rule.strategy.SceneStrategy; import com.solution.rule.strategy.SceneStrategyFactory; import org.kie.api.KieBase; +import org.kie.api.runtime.KieSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -186,6 +188,32 @@ public class FireRuleServiceImpl implements FireRuleService { return task; } + /** + * 执行任务 + * @param task + * @return + */ + @Override + public FireRuleOutputVO rule(FireRuleInputDTO task) { + if(ObjectUtil.isEmpty(task)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + List tasks = task.getTasks(); + if(CollUtil.isEmpty( tasks)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + KieSession kieSession = kieBase.newKieSession(); + Map globalParams = new HashMap<>(); + kieSession.setGlobal("globalParams", globalParams); + for (FireRuleTaskInputDTO fireRuleTaskInputDTO : tasks) { + + + } + + FireRuleOutputVO FireRuleOutputVO = new FireRuleOutputVO(); + return FireRuleOutputVO; + } + /** * 获取所有组件以及数量 * @return diff --git a/auto-solution-rule/src/main/resources/json/火力规则输入-无注释.json b/auto-solution-rule/src/main/resources/json/火力规则输入-无注释.json new file mode 100644 index 0000000..d1b25d3 --- /dev/null +++ b/auto-solution-rule/src/main/resources/json/火力规则输入-无注释.json @@ -0,0 +1,349 @@ +{ + "sourceFile": "区域防空31111_2026-04-02 15_29_03.json", + "tasks": [ + { + "id": "ed0e67e8-691f-4902-bb67-bd289aec89a1", + "drawName": "F-22-1打击任务", + "dataType": "taskPlane", + "side": "BLUE", + "trackPointsId": "d685ca26-2ffa-4b2b-8e75-ecf5897338f5", + "trackPoints": [ + { + "index": 1, + "longitude": 124.02895007578839, + "latitude": 26.836172676390202, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 2, + "longitude": 122.81034067987203, + "latitude": 27.017765463140986, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 3, + "longitude": 121.49435868664283, + "latitude": 27.17048502942595, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 4, + "longitude": 120.87774502345792, + "latitude": 27.16848996890842, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 5, + "longitude": 120.86773193816859, + "latitude": 26.390372000100005, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 6, + "longitude": 122.81161998730377, + "latitude": 25.50052904615808, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 7, + "longitude": 125.09035998725984, + "latitude": 24.79876865711152, + "height": 6000.0, + "speed": 600.0 + } + ], + "taskWeapons": [ + { + "equipmentId": "40b341f6-d60a-4a29-b84d-2973a3065124", + "name": "导弹", + "supportType": "2001", + "components": [ + { + "deviceId": "81c7e7da-cb7b-4435-bba3-1648e946d2b2", + "deviceName": "导弹机动组件", + "componentParams": [ + { + "uuid": "b47f34c2-3cba-4be3-a1d5-be0a986dff6f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "4cf26cd0-bd5b-4d4c-a2eb-bca6184be5a1", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "32beea38-ffc2-445a-9687-e9bdb087727f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "coordinate": { + "longitude": 124.74107151788, + "latitude": 26.74143394432, + "height": -498.06469972014 + }, + "number": "1" , + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1" + } + ], + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1", + "warZoneLocation": [ + { + "longitude": 122.18971775079, + "latitude": 28.64177652916, + "height": -99.95248993318 + }, + { + "longitude": 127.22874089381, + "latitude": 28.54075963352, + "height": -1063.0224849918 + }, + { + "longitude": 127.99831970891, + "latitude": 23.81306022325, + "height": -5900.62524601637 + }, + { + "longitude": 120.14866648107, + "latitude": 23.90272134296, + "height": -22.17614107099 + } + ] + } +], + "redWeapons": [ + { + "name": "HQ-9", + "id": "07e18ffb-3826-4e84-b884-68d77838ae25", + "components": [ + { + "deviceId": "89a639f5-3675-457b-ad4c-6b91a8d900e3", + "deviceName": "", + "componentParams": [ + { + "uuid": "647087e6-ccad-4b14-ba32-9962ae42eee7", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "7c6529f5-3fe5-4cfe-b4c8-b5a5a8178cda", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "a2ac6d74-09ac-49d5-8e05-fcaec47757c5", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "number": 1, + "successTargetRad": "命中率", + "isLead": { + "leader": "长机平台的唯一标识 id", + "side": "阵营", + "supportType": "长机平台类型", + "positions": [ + { + "longitude": "经度", + "latitude": "纬度", + "height": "高度" + } + ] + }, + "isWing": [ + { + "name": "僚机名称", + "distance": "距离", + "angle": "角度", + "alt": "高度差" + } + ] + }, + { + "SupportType": "car", + "TroopsDetail": {}, + "Platform_type": "HQ-9发射车", + "isStrikeTarget": false, + "isReconTarget": false, + "isInterferenceTarget": false, + "isDefendImportantPlace": false, + "groupType": "equipment", + "EquipmentID": "b3c6de29-2b27-4500-a9ce-95d0bebc5cb9", + "Name": "HQ-9发射车--5", + "OwnerForceSide": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "PlatID": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_equipmentPlane", + "SubComponents": { + "communication": [ + { + "ObjectHandle": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "arithmetic": { + "id": "66cd29fdce08f520f1d9bf0e", + "name": "短波电台" + }, + "device": { + "id": "5e0e5b064f1fae2ee9fa1000", + "name": "3MHZ通信电台", + "refId": "5e0e5b064f1fae2ee9fa1000" + }, + "deviceId": "0b700ca6-290e-422a-b4e3-73b222809938", + "deviceName": "3MHZ通信电台", + "employLabel": false, + "facilityName": "3MHZ通信电台", + "soleId": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "twiceModified": {}, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "motorized_assembly": [ + { + "ObjectHandle": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "arithmetic": {}, + "device": {}, + "deviceId": "55915bc4-c825-43c4-93eb-6a76ab345e42", + "deviceName": "", + "soleId": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "platform": [ + { + "ObjectHandle": "04a96dbc-837a-48be-8c04-e4f53586c47e", + "arithmetic": { + "id": "68876d0fd41989f086e905b8", + "name": "通用发射车算法" + }, + "device": { + "id": "68876d2dd41989f086e905b9", + "name": "发射车平台", + "refId": "68876d2dd41989f086e905b9" + }, + "deviceId": "164c75ec-6db5-48f9-8285-a7e726fd2a11", + "deviceName": "发射车平台", + "employLabel": false, + "facilityName": "发射车平台", + "soleId": "87905d6b-857a-4c5a-a922-5e2d191588d4", + "twiceModified": {}, + "zLists": [], + "TrackParamId": "", + "positions": [ + 119.28585462691, + 25.67974332623, + 34.28352933882 + ] + } + ], + "weapon": [ + { + "ObjectHandle": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "arithmetic": { + "id": "669dd6356bc286bd64e5d66c", + "name": "发射架算法" + }, + "codedQueue": "weapon.launcher", + "configuration": { + "classifyName": "导弹平台", + "isMount": 1, + "mountedWeapon": { + "_id": "68f681794ddde62a52c7e569", + "name": "HQ-9" + }, + "number": 4 + }, + "device": { + "id": "67ff279dafa7ea5aaa3a1236", + "name": "通用发射架", + "refId": "b9665788-9437-40fb-8a24-eff3d4d3b529" + }, + "deviceId": "4e910ccf-d937-4a93-9b68-116167eda202", + "deviceName": "通用发射架", + "employLabel": false, + "facilityName": "通用发射架", + "serialNumber": "launcher", + "soleId": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "twiceModified": { + "launcherType": "sam" + }, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ] + } + }, + { + "name": "营指挥所", + "id": "9843e2ec-59a5-440f-9669-67f910b8edc3", + "components": [ + { + "deviceId": "7f41d14e-83bc-41c7-8e20-cb61f4fc1289", + "deviceName": "", + "componentParams": [ + { + "uuid": "5da5f834-a8a9-407d-8a10-6dc78e488af9", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "591217ed-04e5-4120-87db-b5896d87b44d", + "deviceName": "地面指挥所", + "componentParams": [ + { + "uuid": "2c53125c-76da-4454-9f91-04ab3c940b9a", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "number": 1, + "successTargetRad": "命中率" + }, + { + "name": "防区2", + "id": "c2259481-279a-4c10-ae45-cf2a669e7b52_Circle", + "isLead": { + "drawName": "圆形名称", + "airspaceType": "空域类型", + "side": "阵营", + "selectLonLat": "positions", + "positions": [ + { + "longitude": "圆心经度", + "latitude": "圆心纬度", + "height": "圆心高程" + } + ], + "radius": "圆半径(KM)", + "height": "高度(米)", + "extrudedHeight": "离地高度(米)" + }, + "isWing": { + "outlineWidth": "线宽", + "lineType": "线条", + "outlineColor": "轮廓色", + "color": "填充色" + } + } + ] +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/json/火力规则输入.json b/auto-solution-rule/src/main/resources/json/火力规则输入.json new file mode 100644 index 0000000..149e36a --- /dev/null +++ b/auto-solution-rule/src/main/resources/json/火力规则输入.json @@ -0,0 +1,474 @@ +{ + "_comment_sourceFile": "来源场景文件名", + "sourceFile": "区域防空31111_2026-04-02 15_29_03.json", + "_comment_tasks": "蓝方火力规则任务列表(数组,每项为一条任务)", + "tasks": [ + { + "_comment_id": "任务id:唯一标识符", + "id": "ed0e67e8-691f-4902-bb67-bd289aec89a1", + "_comment_drawName": "任务名称", + "drawName": "F-22-1打击任务", + "_comment_dataType": "任务类型", + "dataType": "taskPlane", + "_comment_side": "任务所属阵营", + "side": "BLUE", + "_comment_trackPointsId": "航迹所属实体/阵营标识", + "trackPointsId": "d685ca26-2ffa-4b2b-8e75-ecf5897338f5", + "_comment_trackPoints": "任务航迹点列表", + "trackPoints": [ + { + "index": 1, + "longitude": 124.02895007578839, + "latitude": 26.836172676390202, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 2, + "longitude": 122.81034067987203, + "latitude": 27.017765463140986, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 3, + "longitude": 121.49435868664283, + "latitude": 27.17048502942595, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 4, + "longitude": 120.87774502345792, + "latitude": 27.16848996890842, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 5, + "longitude": 120.86773193816859, + "latitude": 26.390372000100005, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 6, + "longitude": 122.81161998730377, + "latitude": 25.50052904615808, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 7, + "longitude": 125.09035998725984, + "latitude": 24.79876865711152, + "height": 6000.0, + "speed": 600.0 + } + ], + "_comment_taskWeapons": "任务武器配置列表", + "taskWeapons": [ + { + "_comment_equipmentId": "装备id:武器唯一标识", + "equipmentId": "40b341f6-d60a-4a29-b84d-2973a3065124", + "_comment_name": "装备名称", + "name": "导弹", + "_comment_supportType": "装备类型", + "supportType": "2001", + "_comment_components": "装备组件列表", + "components": [ + { + "deviceId": "81c7e7da-cb7b-4435-bba3-1648e946d2b2", + "deviceName": "导弹机动组件", + "componentParams": [ + { + "uuid": "b47f34c2-3cba-4be3-a1d5-be0a986dff6f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "4cf26cd0-bd5b-4d4c-a2eb-bca6184be5a1", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "32beea38-ffc2-445a-9687-e9bdb087727f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "_comment_coordinate": "装备部署位置:经纬高坐标", + "coordinate": { + "longitude": 124.74107151788, + "latitude": 26.74143394432, + "height": -498.06469972014 + }, + "_comment_number": "武器数量", + "number": "最大载弹量" , + "_comment_targetId": "目标id", + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1" + } + ], + "_comment_targetId": "任务目标id", + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1", + "_comment_warZoneLocation": "作战区经纬高坐标列表", + "warZoneLocation": [ + { + "longitude": 122.18971775079, + "latitude": 28.64177652916, + "height": -99.95248993318 + }, + { + "longitude": 127.22874089381, + "latitude": 28.54075963352, + "height": -1063.0224849918 + }, + { + "longitude": 127.99831970891, + "latitude": 23.81306022325, + "height": -5900.62524601637 + }, + { + "longitude": 120.14866648107, + "latitude": 23.90272134296, + "height": -22.17614107099 + } + ] + } + ], + "_comment_redWeapons": "红方武器汇总()", + "redWeapons": [ + { + "_comment_name": "红方武器名称", + "name": "HQ-9", + "_comment_id": "红方武器id", + "id": "07e18ffb-3826-4e84-b884-68d77838ae25", + "_comment_components": "红方武器下组件列表", + "components": [ + { + "deviceId": "89a639f5-3675-457b-ad4c-6b91a8d900e3", + "deviceName": "", + "componentParams": [ + { + "uuid": "647087e6-ccad-4b14-ba32-9962ae42eee7", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "7c6529f5-3fe5-4cfe-b4c8-b5a5a8178cda", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "a2ac6d74-09ac-49d5-8e05-fcaec47757c5", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "_comment_number": "红方武器弹药数量", + "number": 1, + "_comment_successTargetRad": "红方武器命中率(目前无)", + "successTargetRad": "命中率", + "_comment_isLead": "长机入参结构", + "isLead": { + "leader": "长机平台的唯一标识 id", + "side": "阵营", + "supportType": "长机平台类型", + "positions": [ + { + "longitude": "经度", + "latitude": "纬度", + "height": "高度" + } + ] + }, + "_comment_isWing": "僚机入参结构", + "isWing": [ + { + "name": "僚机名称", + "distance": "距离", + "angle": "角度", + "alt": "高度差" + } + ] + }, + { + "color": "rgb(220,39,39)", + "dataType": "taskPlane", + "drawName": "", + "groupType": "tasks", + "id": "41d3c5ce-3fda-4dee-a38f-fd3ae7e15e69", + "idKey": "id", + "isSelected": false, + "name": "", + "parentId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_taskPlane", + "permission": [ + "14bc8ff9-3c93-4218-b01a-e144add196f9", + "56a96b1b-14a8-4daf-a2d0-47c7faa4b831" + ], + "show": true, + "side": "红方", + "sort": 1774271151846, + "task": { + "at_time": "180", + "attackId": "267c5d87-bf36-42f2-b0a8-09c608d94b62", + "color": "rgb(220,39,39)", + "departureAirport": "", + "execute": [ + { + "targetList": [ + { + "ID": "fbddc49c-f7b0-4d07-8000-1b5a2633c461", + "arrayPositionId": 4, + "arrayPositionIdBak": "", + "at_time": { + "timeUp": true, + "value": 180 + }, + "attackType": "", + "boost": "", + "bootTime": "", + "companion": "", + "cruiseRouteId": "routeLine_f01be820-33ca-4843-8354-3f93a9986fe3", + "cruiseRouteOffset": [ + { + "UpOrDown": true, + "value": 0 + }, + { + "BeforeOrAfter": true, + "value": 0 + }, + { + "LeftOrRight": true, + "value": 0 + } + ], + "decoyNum": "0", + "decoyTime": "0", + "disturbNum": "0", + "disturbStartTime": "0", + "droneNum": "", + "fireType": "absolute", + "hitNum": "", + "launchAngle": "", + "launchAzimuth": "", + "noFlyZone": "", + "orbitInclination": "", + "refulId": "", + "salvo": { + "salvoUp": true, + "value": 0 + }, + "strategy": [], + "targetId": "dd20d7d9-7ce8-4531-aa0c-0b2056e7fbcd", + "times_interval": 1, + "weaponId": "HQ-9", + "weaponRelease": "", + "weaponType": "", + "weaponUseCount": 3 + } + ], + "type": "assault" //任务类型 + } + ], + "landAirport": "", + "missionList": [ + { + "label": "HQ-9(4)", + "launcherType": "sam", + "number": 4, + "value": "HQ-9" + } + ], + "name": "HQ-9发射车--3打击任务", + "side": "红方", + "sideId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "speed": 600, + "type": "assault", + "weaponId": "" + } + }, + { + "SupportType": "car", + "TroopsDetail": {}, + "Platform_type": "HQ-9发射车", + "isStrikeTarget": false, + "isReconTarget": false, + "isInterferenceTarget": false, + "isDefendImportantPlace": false, + "groupType": "equipment", + "EquipmentID": "b3c6de29-2b27-4500-a9ce-95d0bebc5cb9", + "Name": "HQ-9发射车--5", + "OwnerForceSide": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "PlatID": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_equipmentPlane", + "SubComponents": { + "communication": [ + { + "ObjectHandle": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "arithmetic": { + "id": "66cd29fdce08f520f1d9bf0e", + "name": "短波电台" + }, + "device": { + "id": "5e0e5b064f1fae2ee9fa1000", + "name": "3MHZ通信电台", + "refId": "5e0e5b064f1fae2ee9fa1000" + }, + "deviceId": "0b700ca6-290e-422a-b4e3-73b222809938", + "deviceName": "3MHZ通信电台", + "employLabel": false, + "facilityName": "3MHZ通信电台", + "soleId": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "twiceModified": {}, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "motorized_assembly": [ + { + "ObjectHandle": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "arithmetic": {}, + "device": {}, + "deviceId": "55915bc4-c825-43c4-93eb-6a76ab345e42", + "deviceName": "", + "soleId": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "platform": [ + { + "ObjectHandle": "04a96dbc-837a-48be-8c04-e4f53586c47e", + "arithmetic": { + "id": "68876d0fd41989f086e905b8", + "name": "通用发射车算法" + }, + "device": { + "id": "68876d2dd41989f086e905b9", + "name": "发射车平台", + "refId": "68876d2dd41989f086e905b9" + }, + "deviceId": "164c75ec-6db5-48f9-8285-a7e726fd2a11", + "deviceName": "发射车平台", + "employLabel": false, + "facilityName": "发射车平台", + "soleId": "87905d6b-857a-4c5a-a922-5e2d191588d4", + "twiceModified": {}, + "zLists": [], + "TrackParamId": "", + "positions": [ + 119.28585462691, + 25.67974332623, + 34.28352933882 + ] + } + ], + "weapon": [ + { + "ObjectHandle": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "arithmetic": { + "id": "669dd6356bc286bd64e5d66c", + "name": "发射架算法" + }, + "codedQueue": "weapon.launcher", + "configuration": { + "classifyName": "导弹平台", + "isMount": 1, + "mountedWeapon": { + "_id": "68f681794ddde62a52c7e569", + "name": "HQ-9" + }, + "number": 4 + }, + "device": { + "id": "67ff279dafa7ea5aaa3a1236", + "name": "通用发射架", + "refId": "b9665788-9437-40fb-8a24-eff3d4d3b529" + }, + "deviceId": "4e910ccf-d937-4a93-9b68-116167eda202", + "deviceName": "通用发射架", + "employLabel": false, + "facilityName": "通用发射架", + "serialNumber": "launcher", + "soleId": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "twiceModified": { + "launcherType": "sam" + }, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ] + } + }, + { + "name": "营指挥所", + "id": "9843e2ec-59a5-440f-9669-67f910b8edc3", + "components": [ + { + "deviceId": "7f41d14e-83bc-41c7-8e20-cb61f4fc1289", + "deviceName": "", + "componentParams": [ + { + "uuid": "5da5f834-a8a9-407d-8a10-6dc78e488af9", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "591217ed-04e5-4120-87db-b5896d87b44d", + "deviceName": "地面指挥所", + "componentParams": [ + { + "uuid": "2c53125c-76da-4454-9f91-04ab3c940b9a", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "number": 1, + "successTargetRad": "命中率" + }, + { + "name": "防区2", + "id": "c2259481-279a-4c10-ae45-cf2a669e7b52_Circle", + "_comment_isLead": "圆形编辑入参结构", + "isLead": { + "drawName": "圆形名称", + "airspaceType": "空域类型", + "side": "阵营", + "selectLonLat": "positions", + "positions": [ + { + "longitude": "圆心经度", + "latitude": "圆心纬度", + "height": "圆心高程" + } + ], + "radius": "圆半径(KM)", + "height": "高度(米)", + "extrudedHeight": "离地高度(米)" + }, + "_comment_isWing": "圆形样式入参结构", + "isWing": { + "outlineWidth": "线宽", + "lineType": "线条", + "outlineColor": "轮廓色", + "color": "填充色" + } + } + ] +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/json/火力规则输出.json b/auto-solution-rule/src/main/resources/json/火力规则输出.json new file mode 100644 index 0000000..7ebc365 --- /dev/null +++ b/auto-solution-rule/src/main/resources/json/火力规则输出.json @@ -0,0 +1,355 @@ +{ + "sourceFile": "区域防空31111_2026-04-02 15_29_03.json", + "fireRuleInputs": [ + + { + "id": "ed0e67e8-691f-4902-bb67-bd289aec89a1", + "drawName": "红方打击任务", + "dataType": "taskPlane", + "side": "RED", + "trackPointsId": "d685ca26-2ffa-4b2b-8e75-ecf5897338f5", + "trackPoints": [ + { + "index": 1, + "longitude": 124.02895007578839, + "latitude": 26.836172676390202, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 2, + "longitude": 122.81034067987203, + "latitude": 27.017765463140986, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 3, + "longitude": 121.49435868664283, + "latitude": 27.17048502942595, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 4, + "longitude": 120.87774502345792, + "latitude": 27.16848996890842, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 5, + "longitude": 120.86773193816859, + "latitude": 26.390372000100005, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 6, + "longitude": 122.81161998730377, + "latitude": 25.50052904615808, + "height": 6000.0, + "speed": 600.0 + }, + { + "index": 7, + "longitude": 125.09035998725984, + "latitude": 24.79876865711152, + "height": 6000.0, + "speed": 600.0 + } + ], + "taskWeapons": [ + { + "equipmentId": "40b341f6-d60a-4a29-b84d-2973a3065124", + "name": "导弹", + "supportType": "2001", + "components": [ + { + "deviceId": "81c7e7da-cb7b-4435-bba3-1648e946d2b2", + "deviceName": "导弹机动组件", + "componentParams": [ + { + "uuid": "b47f34c2-3cba-4be3-a1d5-be0a986dff6f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "4cf26cd0-bd5b-4d4c-a2eb-bca6184be5a1", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "32beea38-ffc2-445a-9687-e9bdb087727f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "coordinate": { + "longitude": 124.74107151788, + "latitude": 26.74143394432, + "height": -498.06469972014 + }, + "number": 10, + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1" + } + ], + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1", + "warZoneLocation": [ + { + "longitude": 122.18971775079, + "latitude": 28.64177652916, + "height": -99.95248993318 + }, + { + "longitude": 127.22874089381, + "latitude": 28.54075963352, + "height": -1063.0224849918 + }, + { + "longitude": 127.99831970891, + "latitude": 23.81306022325, + "height": -5900.62524601637 + }, + { + "longitude": 120.14866648107, + "latitude": 23.90272134296, + "height": -22.17614107099 + } + ], + "defZoneLocation": [] + } + ], + "Tasks": [ + { + "color": "rgb(220,39,39)", + "dataType": "taskPlane", + "drawName": "HQ-9发射车--3打击任务", + "groupType": "tasks", + "id": "41d3c5ce-3fda-4dee-a38f-fd3ae7e15e69", + "idKey": "id", + "isSelected": false, + "name": "HQ-9发射车--3打击任务", + "parentId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_taskPlane", + "permission": [ + "14bc8ff9-3c93-4218-b01a-e144add196f9", + "56a96b1b-14a8-4daf-a2d0-47c7faa4b831" + ], + "show": true, + "side": "红方", + "sort": 1774271151846, + "task": { + "at_time": "180", + "attackId": "267c5d87-bf36-42f2-b0a8-09c608d94b62", + "color": "rgb(220,39,39)", + "departureAirport": "", + "execute": [ + { + "targetList": [ + { + "ID": "fbddc49c-f7b0-4d07-8000-1b5a2633c461", + "arrayPositionId": 4, + "arrayPositionIdBak": "", + "at_time": { + "timeUp": true, + "value": 180 + }, + "attackType": "", + "boost": "", + "bootTime": "", + "companion": "", + "cruiseRouteId": "routeLine_f01be820-33ca-4843-8354-3f93a9986fe3", + "cruiseRouteOffset": [ + { + "UpOrDown": true, + "value": 0 + }, + { + "BeforeOrAfter": true, + "value": 0 + }, + { + "LeftOrRight": true, + "value": 0 + } + ], + + "fireType": "absolute", + "strategy": [], + "targetId": "dd20d7d9-7ce8-4531-aa0c-0b2056e7fbcd", + "times_interval": 1, + "weaponId": "HQ-9", + "weaponRelease": "", + "weaponType": "", + "weaponUseCount": 3 + } + ], + "type": "assault" + } + ], + "landAirport": "", + "missionList": [ + { + "label": "HQ-9(4)", + "launcherType": "sam", + "number": 4, + "value": "HQ-9" + } + ], + "name": "HQ-9发射车--3打击任务", + "side": "红方", + "sideId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "speed": 600, + "type": "assault", + "weaponId": "" + } + } +], +"Groups": [ + { + "allAngle": 0, + "drawName": "J15编组1", + "editPermission": [], + "groupType": "addGroup", + "id": "5dea9ff7-5e45-4f8e-a67f-3ff4187c39ed", + "idKey": "id", + "isSelected": false, + "isShow": false, + "leader": "7a16c098-ceec-4c4d-8a24-8f44976a90ca", + "name": "addGroup", + "parentId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_batFormation", + "permission": [ + "14bc8ff9-3c93-4218-b01a-e144add196f9" + ], + "show": false, + "sort": 1774271497726, + "wingmanData": [ + { + "alt": 40, + "angle": "50", + "distance": 100, + "key": 0, + "name": "9aa9e5aa-9273-4c27-88e1-e582ff561685" + } + ] + } +], + "redWeapons": [ + { + "SupportType": "car", + "TroopsDetail": {}, + "Platform_type": "HQ-9发射车", + "isStrikeTarget": false, + "isReconTarget": false, + "isInterferenceTarget": false, + "isDefendImportantPlace": false, + "groupType": "equipment", + "EquipmentID": "b3c6de29-2b27-4500-a9ce-95d0bebc5cb9", + "Name": "HQ-9发射车--5", + "OwnerForceSide": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "PlatID": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_equipmentPlane", + "SubComponents": { + "communication": [ + { + "ObjectHandle": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "arithmetic": { + "id": "66cd29fdce08f520f1d9bf0e", + "name": "短波电台" + }, + "device": { + "id": "5e0e5b064f1fae2ee9fa1000", + "name": "3MHZ通信电台", + "refId": "5e0e5b064f1fae2ee9fa1000" + }, + "deviceId": "0b700ca6-290e-422a-b4e3-73b222809938", + "deviceName": "3MHZ通信电台", + "employLabel": false, + "facilityName": "3MHZ通信电台", + "soleId": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "twiceModified": {}, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "motorized_assembly": [ + { + "ObjectHandle": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "arithmetic": {}, + "device": {}, + "deviceId": "55915bc4-c825-43c4-93eb-6a76ab345e42", + "deviceName": "", + "soleId": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "platform": [ + { + "ObjectHandle": "04a96dbc-837a-48be-8c04-e4f53586c47e", + "arithmetic": { + "id": "68876d0fd41989f086e905b8", + "name": "通用发射车算法" + }, + "device": { + "id": "68876d2dd41989f086e905b9", + "name": "发射车平台", + "refId": "68876d2dd41989f086e905b9" + }, + "deviceId": "164c75ec-6db5-48f9-8285-a7e726fd2a11", + "deviceName": "发射车平台", + "employLabel": false, + "facilityName": "发射车平台", + "soleId": "87905d6b-857a-4c5a-a922-5e2d191588d4", + "twiceModified": {}, + "zLists": [], + "TrackParamId": "", + "positions": [ + 119.28585462691, + 25.67974332623, + 34.28352933882 + ] + } + ], + "weapon": [ + { + "ObjectHandle": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "arithmetic": { + "id": "669dd6356bc286bd64e5d66c", + "name": "发射架算法" + }, + "codedQueue": "weapon.launcher", + "configuration": { + "classifyName": "导弹平台", + "isMount": 1, + "mountedWeapon": { + "_id": "68f681794ddde62a52c7e569", + "name": "HQ-9" + }, + "number": 4 + }, + "device": { + "id": "67ff279dafa7ea5aaa3a1236", + "name": "通用发射架", + "refId": "b9665788-9437-40fb-8a24-eff3d4d3b529" + }, + "deviceId": "4e910ccf-d937-4a93-9b68-116167eda202", + "deviceName": "通用发射架", + "employLabel": false, + "facilityName": "通用发射架", + "serialNumber": "launcher", + "soleId": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "twiceModified": { + "launcherType": "sam" + }, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/rules/README.md b/auto-solution-rule/src/main/resources/rules/README.md index 5414aab..656e1ea 100644 --- a/auto-solution-rule/src/main/resources/rules/README.md +++ b/auto-solution-rule/src/main/resources/rules/README.md @@ -15,6 +15,33 @@ ## 2. 参数-效果对照(给业务人员) +### 2.0 规则过程总览(先看这一条) + +引擎按 **salience 从高到低** 依次执行(同一 `agenda-group` 内数字越大越先跑)。主链路可以理解为:**先定武器与目标关系 → 再补组件与数量 → 再定任务名与空间位置 → 最后射程与航迹**。 + +```mermaid +flowchart TD + step1["红方武器自适应装配 55"] + step2["导弹联动增强 54"] + step3["导弹组件数量匹配 53"] + step4["命中率动态数量与offset 52"] + step5["任务自动匹配 50"] + step6["阵位区域解析 49"] + step7["阵位武器部署赋位 48"] + step8["射程合理性校验 47"] + step9["航迹生成 46"] + step1 --> step2 --> step3 --> step4 --> step5 --> step6 --> step7 --> step8 --> step9 +``` + +**两种装配主路径(由 `enableRuleScoring` 决定)** + +| 模式 | 开关 | 武器从哪来 | `targetId` 怎么定 | +|------|------|------------|---------------------| +| 过程驱动整数加分 | `enableRuleScoring=true`(默认) | 对每个蓝方目标抽特征 → 红方候选池打分 → **并列最高分全选** → 按需求数克隆武器 | 生成红方武器时 **直接写入** 对应该蓝目标的 `equipmentId`(见 `allocateRedWeaponsForBlueTarget`) | +| 传统白名单映射 | `enableRuleScoring=false` | 按 `enableAirRule` 等开关 + `map_*_targets` 映射追加武器 | 装配结束后调用 **`bindTargetIdsForRedWeapons`**:可行性过滤 + **五维加权分** + 边际递减 + 比例/回退 | + +**调参时的阅读顺序建议**:先确认当前是过程驱动还是白名单 → 再改对应段落里的开关与阈值 → 最后看下游规则(命中率改数量、阵位改坐标)是否仍符合预期。 + ### 2.1 武器名称映射(改名字,不改逻辑) - `redStrikeDroneName`:空中反制组中的无人机名称。 - `redArmedHelicopterName`:空中反制组中的武装直升机名称。 @@ -26,17 +53,20 @@ - `redMissileVehicleName`:导弹补充组中的导弹发射车名称。 ### 2.2 白名单开关(决定“是否匹配”) -- `enableAirRule`:`true` 时,蓝方空中目标会触发红方空中反制组;`false` 时该组永不触发。 -- `enableGroundRule`:`true` 时,蓝方地面目标会触发红方炮类反制组;`false` 时不触发。 -- `enableArmorRule`:`true` 时,蓝方装甲目标会触发红方反坦克组;`false` 时不触发。 -- `enableMissileVehicleRule`:`true` 时,蓝方有导弹能力可追加导弹发射车;`false` 时不追加。 -- `enableMissileLinkage`:`true` 时开启导弹数量/范围联动;`false` 时不做导弹联动增强。 -- `allowMultiGroup`: - - `true`:同一批输入可命中多组策略并叠加武器; - - `false`:只命中第一组,后续组不再生效(更“死规则”)。 -- `enableArmedHelicopterOnAir`:空中组中是否包含武装直升机。 -### 2.3 蓝方类型到红方方案映射(核心,可多选) +> **仅当 `enableRuleScoring=false` 时**,下列开关与映射主导装配;`enableRuleScoring=true` 时走过程驱动,本节开关对**是否出武器**基本不生效(仍可能影响你后续阅读的兼容映射字段)。 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `enableAirRule` | 是否允许“蓝方有空中目标”时走空中反制映射 | `false` 时空中组整条链路不追加武器 | 不需要空中反制时置 `false`,减少误匹配 | +| `enableGroundRule` | 是否允许蓝方地面目标触发炮类反制组 | 影响迫榴炮/车载迫击炮等是否出现 | 只想反装甲不上炮时置 `false` | +| `enableArmorRule` | 是否允许装甲目标触发反坦克组 | 影响反坦克火箭/导弹系统等是否出现 | 关闭后装甲线完全不走映射 | +| `enableMissileVehicleRule` | 蓝方有导弹能力时是否追加导弹发射车 | 控制是否额外生成 `map_missile_targets` 对应武器 | 默认多为 `false`,需导弹车时再开 | +| `enableMissileLinkage` | 导弹联动增强(`applyMissileLinkage`)是否执行 | 为 `true` 且满足门槛时,给红方**空中**武器补/增强导弹组件数量与射程 | 不想自动改导弹数量与范围时置 `false` | +| `allowMultiGroup` | 多组策略是否可叠加 | `true`:空中/地面/装甲等多条可同时命中;`false`:**只命中第一组**,后续不再加武器 | 想规则更“硬”、少组合时置 `false` | +| `enableArmedHelicopterOnAir` | 空中映射中是否包含武装直升机 | 影响空中组是否出 `redArmedHelicopterName` 对应装备 | 只要无人机不要武直时置 `false` | + +### 2.3 蓝方类型到红方方案映射(兼容项,评分模式下弱化) 先解释你提到的 “k”: - 这里的 `k` 就是 **key(键名)**,例如 `map_armor_targets`。 @@ -51,68 +81,173 @@ - `map_missile_targets`:蓝方有导弹能力时,红方使用哪些武器。 映射规则说明: -- 值必须是红方武器库内合法名称,否则该项会被忽略。 -- 为空时视为该组不配置,允许不命中。 -- 示例:`map_armor_targets=反坦克火箭,反坦克导弹系统` 表示坦克可同时触发两种红方反制武器。 +- 当 `enableScoringSelection=true` 时,本组配置不再主导最终结果,仅作为兼容保留。 +- 当前主决策由“过程驱动评分引擎”完成(类型/距离/命中率/成本综合评分)。 -### 2.4 数量和阈值(决定“匹配后给多少”) -- `defaultAirNum`:空中组默认数量。 -- `defaultGroundNum`:地面/装甲组默认数量。 -- `defaultMissileVehicleNum`:导弹发射车默认数量。 -- `shellRangeDefault`:炮类组件参数值,单位固定 `范围米`。 -- `missileCountOffset`:红方导弹数量 = 蓝方导弹数量 + 偏移量。 -- `missileRangeOffset`:红方导弹范围 = 蓝方导弹范围 + 偏移量(单位 `破坏范围米`)。 -- `blueMissileRangeDefault`:蓝方导弹范围缺失时采用的默认值。 -- `minBlueMissileCountForLinkage`:蓝方导弹数量达到该值才触发联动增强。 +### 2.4 数量与参数(匹配后给多少、导弹与炮类参数) -### 2.5 全组件数量匹配参数(新增) -- `enableComponentQuantityMatch`:是否启用全组件数量覆盖(非导弹组件)。 -- `componentDeviceNameMappingCsv`:组件名映射表(逗号分隔),格式 `蓝组件deviceName->红组件deviceName`;为空则默认 `deviceName` 直匹配。 -- `skipMissileComponentsByNameContains`:跳过覆盖关键词:蓝方组件 `deviceName` 包含该关键词则不覆盖;默认 `导弹`(用于保留导弹联动偏移)。 +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `defaultAirNum` | 白名单路径下空中映射默认实例数量 | 每轮 `map_air_targets` 展开时基数 | 需要更多同型机时调大 | +| `defaultGroundNum` | 地面/装甲/炮类映射默认数量 | 非空中组映射展开基数 | 同上 | +| `defaultMissileVehicleNum` | 导弹发射车映射默认数量 | `enableMissileVehicleRule=true` 时追加数量 | 导弹车要多台时调大 | +| `shellRangeDefault` | 炮类武器“炮弹”组件射程字符串 | `limitRedArtilleryToShellOnly` 写入的默认 `范围米` | 想压远/压近打击时改数值 | +| `missileCountOffset` | 联动时红方导弹数量相对蓝方的增量 | `applyMissileLinkage` 中目标导弹发数 | 希望红方导弹明显多于蓝方时调大 | +| `missileRangeOffset` | 联动时红方导弹射程在蓝方基础上的增量 | 红方空中武器导弹组件首参数(破坏范围米) | 需要更远覆盖时调大 | +| `blueMissileRangeDefault` | 蓝方未给导弹射程时的假定值 | 联动计算 `redRangeTarget` 的输入 | 输入不全时兜底,按典型弹种改 | +| `minBlueMissileCountForLinkage` | 联动触发门槛(蓝方导弹总数) | 低于则 `applyMissileLinkage` 直接返回 | 想更难触发联动时调大(如 2、3) | -### 2.6 targetId 自动绑定参数(新增) -- `enableTargetAutoBind`:是否自动给红方武器写入 `targetId`。 -- `minTargetBindRatio`:最低绑定比例(例如 `0.7` 表示至少 70% 红方武器有目标)。 -- `allowReserveWithoutTarget`: - - `true`:允许少量红方武器 `targetId` 为空(火力冗余)。 - - `false`:尽量给每个红方武器分配目标。 +### 2.5 仅导弹组件匹配(`导弹组件数量匹配规则`,salience 53) -绑定规则说明(固定,不需要业务改代码): -- 绑定来源是蓝方武器 `equipmentId`。 -- 匹配优先级按武器类型: - - 防空类红方武器优先绑定蓝方空中目标 - - 反装甲类红方武器优先绑定蓝方装甲目标 - - 炮类红方武器优先绑定蓝方炮类/地面目标 - - 导弹发射车优先绑定蓝方导弹能力目标 -- 当优先池不足时自动回退到地面池/全目标池,保证大部分武器有目标。 +**规则过程**:在红方武器已有 `targetId` 的前提下,按蓝方对应装备的**导弹类组件**去对齐红方导弹组件的**数量**与**首参数**;其它组件不动。 -### 2.7 命中率与动态火力参数(新增) -- `hitRateCsv`:业务可配置红方武器命中率,格式 `武器名=0.72,武器名2=0.55`。 -- `defaultHitRateFallback`:未命中 `hitRateCsv` 且武器未携带 `hitRate` 时的兜底命中率。 -- `desiredKillProbability`:目标毁伤置信度(例如 `0.9`)。 -- `offsetCsvByWeapon`:显式 offset(最高优先级),格式 `武器名=1,武器名2=2`。 -- `enableDynamicMultiRedPerBlue`:是否按命中率动态决定“一个蓝方目标需要几把红方武器”。 -- `minRedWeaponsPerBlueTarget` / `maxRedWeaponsPerBlueTargetCap`:每个蓝方目标的最小/最大红方分配数。 +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `enableComponentQuantityMatch` | 总开关 | `false` 时本规则不改写任何组件 | 完全手工控组件时关闭 | +| `componentDeviceNameMappingCsv` | 蓝/红导弹组件 `deviceName` 映射 | 解决双方组件命名不一致导致对不上 | 填 `机载导弹->某某导弹` 形式,逗号分隔多对 | +| `missileComponentNameContains` | 判定“导弹组件”的关键词 | 只有 `deviceName` 含该词的组件参与匹配 | 若业务用“火箭弹”等命名,可改关键词 | -优先级说明(重要): -- 若 `offsetCsvByWeapon` 命中某武器,则直接使用显式 offset,不再使用命中率推导 offset。 -- 未配置显式 offset 时,规则按命中率与 `desiredKillProbability` 自动推导所需火力数量。 -- 同一蓝方 `equipmentId` 可能被多个红方武器绑定(不是固定 2 把),数量由命中率动态计算并受 cap 限制。 +**输出影响**:仅改导弹组件 `componentParams[0].number` 与 `componentParams[0].attDefaultValue`(破坏范围等),非导弹组件保持红方原值。 -### 2.8 阵位规则参数(新增) -- `enablePositionRules`:阵位规则总开关。 -- 阵位输入来源:`blueTask.warZoneLocation` 与 `blueTask.defZoneLocation`(各 4 个经纬点)。 -- `fireUnitSpacingMeters`:防区/作战区点位间距(米),例如 `100` 代表约每 100 米一个火力单元。 -- `airDeployZonePreference`:飞机优先部署区域(`combat` 或 `defense`)。 -- `defensePriorityWeapons`:优先部署在防区的武器名单(逗号分隔)。 -- `groundDeployHeight` / `airDeployHeight`:地面/空中武器部署高度。 +### 2.6 targetId 自动绑定(仅传统白名单路径) -阵位规则效果: -- 新增两条规则: - - `阵位规则-区域解析与点位生成` - - `阵位规则-武器部署赋位` -- 飞机可在任意区(按偏好区优先);反坦克等重火力优先防区。 -- 在多边形区域内按间距生成候选点,并给红方武器写入 `weapon.coordinate`。 +> **`enableRuleScoring=true`(过程驱动)时**:装配阶段已在 `allocateRedWeaponsForBlueTarget` 里把 `targetId` 设为对应蓝方 `equipmentId`,**不会**再走下表的五维分配逻辑。下表仅在 **`enableRuleScoring=false`** 且 `configureRedWeaponsByBlue` 末尾调用 `bindTargetIdsForRedWeapons` 时生效。 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `enableTargetAutoBind` | 是否执行绑定函数 | `false` 时红方 `targetId` 保持入参/空 | 全手工指定目标时关闭 | +| `minTargetBindRatio` | 最低绑定比例下限 | 绑定数/红武器总数低于该比例时,尝试用 `pickAnyBlueId` 补足 | 想“几乎全要有目标”时调高(如 0.9);允许大量空则调低 | +| `allowReserveWithoutTarget` | 是否允许故意留空 | `true`:允许火力冗余;`false`:尽量全部塞满目标 | 与 `minTargetBindRatio` 配合使用 | +| `w_target_type` | 类型匹配在总分中的权重 | 越大越强调类型对口 | 类型错配不可接受时略调高 | +| `w_target_dist` | 距离权重 | 越大越偏向更近、易打击的蓝目标 | 强调近战压制时调高 | +| `w_target_height` | 高度差权重 | 越大越惩罚高度层不匹配 | 空地混合作战可略调高 | +| `w_target_hit` | 命中率权重 | 越大高 `hitRate` 武器越易抢到好目标 | 强调效费比时调高 | +| `w_target_threat` | 蓝方威胁权重 | 越大越优先高威胁蓝目标 | 要“先打高威胁”时调高 | +| `maxEffectiveDistance` | 配对最大有效距离 | 超过则 `isPairFeasible` 直接否 | 只允许远程交火时调大;强制近战调小 | +| `maxHeightGap` | 允许的最大高度差 | 超过则候选失效 | 高原/低空混编时适度调大 | +| `targetDecayAlpha` | 边际递减系数 | `marginal = score / (1 + alpha*k)`,`k` 为该蓝目标已分配数;**越大越不扎堆** | 避免多机打同一目标时调大 | +| `fallbackToNearestTarget` | 无可行候选时是否按距离回退 | `true` 时尽量给一个最近蓝 `equipmentId` | 不想硬塞错误目标时改 `false` 并配合 `allowUnassignedRedWeapon` | +| `allowUnassignedRedWeapon` | 仍无可行时是否允许 `targetId` 为空 | `true` 允许空;`false` 会再 `pickAnyBlueId` 硬填 | 与火力冗余策略一致即可 | + +**绑定过程(白名单路径,固定实现)**:绑定键为蓝方 `equipmentId` → 逐把红武器在可行集合上算分 → 取边际最高 → 更新已分配计数 → 不足比例再补 → 仍不行则按上表回退或留空。 + +### 2.7 过程驱动整数加分参数(核心,`enableRuleScoring=true`) + +**规则过程**(函数 `runProcessDrivenSelection`):对每个带 `equipmentId` 的蓝方武器抽一条特征 → 在配置给出的红方武器池里用 `scoreRedWeaponByRules` 打**整数分** → 去掉低于 `minScoreToAssign` 的 → **并列最高分全部保留** → 按 `computeNeededRedCountFromFeature` 得到 `needCount`,再被 `minRedWeaponsPerBlueTarget`~`maxRedWeaponsPerBlueTargetCap` 钳位 → 轮询 `topNames` 克隆武器并 `setTargetId(blueId)`。 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `enableRuleScoring` | 是否走过程驱动主路径 | `true` 走本节;`false` 回退 2.2 白名单 + 2.6 绑定 | 与旧映射二选一 | +| `minScoreToAssign` | 候选武器最低整数分 | 低于则该红方武器名不参与本蓝目标的并列候选 | 想更少种类参与时调大;想多并列时调小 | +| `nearDefenseDistanceMeters` | 蓝方到防区距离“近”的米阈值 | 与 `score_nearDefense_artillery` 联动:近且炮名命中则加分 | 防区尺度变化时同步改 | +| `highThreatLevel` | 任务威胁等级算“高威胁”的整数阈值 | 与 `score_highThreat_missile` 等联动 | 想更容易触发“高威胁分支”时调低 | +| `highTargetCount` | 蓝方该目标 `number` 的“数量高”阈值 | 与 `score_highCount_artillery` 联动 | 集群目标多时调低 | +| `score_type_antiArmor` | 装甲特征下反坦克类名加分 | 含“反坦克”的红方名更容易进并列最高 | 强化反坦时调大 | +| `score_nearDefense_artillery` | 近防区 + 迫榴/迫击炮名加分 | 近防区时更倾向出炮 | 强调要炮时调大 | +| `score_highThreat_missile` | 高威胁或空中场景下导弹/防空类加分(实现中与多项条件叠加) | 高威胁/空中时防空、导弹类名分更高 | 防空压制想加重时调大 | +| `score_highCount_artillery` | 蓝方数量高时炮类加分 | 多目标时更倾向炮 | 炮火优先时调大 | +| `score_hasMissile_airDefence` | 蓝方有导弹组件时防空/导弹发射车类加分 | 有导弹威胁时更倾向防空与导弹车 | 导弹对抗想加重时调大 | + +**并列全选机制**: + +- 对同一蓝方 `equipmentId`,所有红方候选算分后取 `maxScore`,**凡 `score == maxScore` 的武器名称都进入 `topNames`**。 +- 需要数量大于名称种数时,会在 `allocateRedWeaponsForBlueTarget` 里**轮询** `topNames` 重复添加,故同名武器可出现多把。 +- 另:实现里若估算射程覆盖蓝方距离(含安全裕量)还会 **+1 分**,便于优先能打的装备。 + +### 2.8 命中率与动态火力(`命中率规则-动态数量与offset`,salience 52) + +**规则过程**:在装配之后,对**已有**红方武器的 `number` 做增量:优先读 `offsetCsvByWeapon` 显式 offset;否则用命中率与阈值的 **gap 阶梯** 加 `hitRateStep*Offset`。 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `hitRateCsv` | 按武器名配置命中率 | `applyDefaultHitRateIfAbsent` 与 gap 计算 | 调整个体武器假定命中能力 | +| `defaultHitRateFallback` | 未配置且武器无 `hitRate` 时 | gap 计算用的默认 p | 整体偏乐观/悲观时改 | +| `desiredKillProbability` | 过程驱动里毁伤置信目标 | `computeNeededRedCountFromFeature` 中 `computeRequiredShots` 的输入 | 想“打得更保险”时调高(需求发数可能变多) | +| `offsetCsvByWeapon` | **最高优先级**数量偏移 | 命中武器名则 **忽略** gap 阶梯,直接 `base + offset` | 某武器必须固定加 N 发时配置 | +| `hitRateThreshold` | 命中率门槛 | `gap = threshold - hitRate`,决定进哪一档增量 | 门槛越高,低命中武器越易吃到正 offset | +| `hitRateGapStep1Max` / `hitRateGapStep2Max` | gap 的一、二档上界 | 分档加 `hitRateStep1Offset` 或 `hitRateStep2Offset` | 拉宽档位可减少落到高档 | +| `hitRateStep1Offset` / `hitRateStep2Offset` | 各档对 `number` 的加量 | 直接增加 `weapon.number` | 低命中时想多压弹药则调大 | +| `minRedWeaponsPerBlueTarget` | 每蓝目标至少分配红武器数下限 | 过程驱动里与 `needCount` 取大 | 强制“至少 N 把伺候一个目标” | +| `maxRedWeaponsPerBlueTargetCap` | 每蓝目标分配上限 | 与 `needCount` 取小,防止无限膨胀 | 控制火力上限 | +| `enableDynamicMultiRedPerBlue` | 配置项(当前实现**未读取**) | 预留;**改之暂无效果**,以 `desiredKillProbability` + min/max 钳位为准 | 待代码接入后再用 | + +**阶梯优先级(与代码一致)**: + +1. `offsetCsvByWeapon` 命中 → 只用显式 offset。 +2. 否则 `gap <= 0` → `+0`。 +3. `0 < gap <= hitRateGapStep1Max` → `+hitRateStep1Offset`。 +4. `hitRateGapStep1Max < gap <= hitRateGapStep2Max` → `+hitRateStep2Offset`。 +5. `gap > hitRateGapStep2Max` → 仍按 **第二档 offset**(避免数量无上限膨胀)。 + +### 2.9 阵位规则参数(`阵位规则` 49→48) + +**规则过程**:`prepareDeploymentPools` 用作战区/防区多边形生成候选点网格;`applyWeaponDeployment` 用蓝方航迹与防区关系得到 **部署模式** `deployMode`(近快/远快/近慢/默认)→ 选锚点 → `resolveFormationType`(人工阵型 / 自动阵型 / 默认)→ `buildFormationOffsets` 展开队形 → 写入 `weapon.coordinate`;地面高度固定、空中可走自动生成高度。 + +**输入依赖**:`blueTask.warZoneLocation`、`blueTask.defZoneLocation`(各 4 点经纬);部署模式还依赖 `trackPoints`(算速度与距防区)。 + +#### 2.9.1 总开关与点位 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `enablePositionRules` | 阵位总开关 | `false` 时跳过点位池与赋位 | 仅要装配不要坐标时关闭 | +| `fireUnitSpacingMeters` | 作战区/防区内网格点间距(米) | 点密度:越小点越多、部署越密 | 地形细粒度要求高调小 | +| `airDeployZonePreference` | 空中锚点优先作战区还是防区 | `combat`/`defense` 影响 `pickAnchorByMode` 选取 | 想飞机靠前压则偏 `combat` | +| `defensePriorityWeapons` | 名单内武器优先取防区点 | 名单武器在无锚点回退时优先 `defense` 池 | 要扼守防区的装备写入 | + +#### 2.9.2 部署模式(与 `speedFastThreshold`、距离阈值) + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `speedFastThreshold` | 蓝方平均速度是否算“快” | 与 `distanceNearDefenseThresholdMeters`、`distanceFarDefenseThresholdMeters` 组合成 **near_fast / far_fast / near_slow / default** | 高速标准提高则更少判成“快” | +| `distanceNearDefenseThresholdMeters` | 蓝方航迹末端距防区“近”的米阈值 | 参与部署模式与锚点策略 | 防区尺度大时略调大 | +| `distanceFarDefenseThresholdMeters` | “远”阈值 | 同上 | 与上配合拉开近/远带 | + +#### 2.9.3 高度(地面固定 / 空中可自动) + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `groundDeployHeight` | 地面武器统一高度 | 地面编队 `moveCoordinateByMeters` / 克隆点高度 | 地表 DEM 约定高度 | +| `airDeployHeight` | 关闭自动或兜底时用 | 过程驱动关闭自动高度时的固定空高 | 与 `airHeightFallback` 一般同量级 | +| `enableAutoAirDeployHeight` | 空中是否按态势算高 | `false` 时空中全程用 `airDeployHeight` | 想完全手工高时关 | +| `airHeightFallback` | 无航迹且无蓝方武器高度时的基准 | `resolveBlueBaseHeight` 最后兜底 | 与默认战术层一致即可 | +| `airHeightMin` / `airHeightMax` | 自动高度钳位 | 防止算出过矮/过高 | 任务高度包线 | +| `airHeightSpeedThreshold` / `airHeightAdjustFast` | 快于阈值则加高度 | 快目标对应更高拦截层 | 拦截想更猛则加 `AdjustFast` | +| `airHeightNearDefenseDistance` / `airHeightFarDefenseDistance` | 距防区近/远分界 | 近用 `airHeightAdjustNear`(多为负)、远用 `airHeightAdjustFar` | 调整防区内外高度差 | +| `airHeightAdjustMain` / `airHeightAdjustWing` | 主僚高度差 | 主机略高、僚机略低 | 战术队形垂直疏开 | + +#### 2.9.4 阵型类型(人工 / 自动 / 默认) + +**说明(与部署模式共用阈值)**:`resolveDeployModeByBlueState` 用 **`speedFastThreshold`**、`distanceNearDefenseThresholdMeters`、`distanceFarDefenseThresholdMeters` 得到 `near_fast / far_fast / near_slow / default`,`autoSelectFormationType` 直接消费该 `deployMode` 字符串选 `formationRule_*`。配置里的 **`formationFastSpeedThreshold`、`formationNearDefenseDistance`、`formationFarDefenseDistance` 当前未参与运算**,调整无效;若要与部署模式解耦,需开发在代码中改为读取这三项。 + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `formationDefaultType` | 阵型名兜底 | 非法或未选时 `normalizeFormationType` 回退 | 填 `TRIANGLE` 等合法枚举 | +| `enableAutoFormationSelect` | 是否 `autoSelectFormationType` | `false` 时只用 Task 指定或默认 | 想完全人工阵型时关 | +| `formationHighThreatLevel` | 威胁≥该值走 `formationRule_high_threat` | **优先于**速度距离分支 | 想更早用“高威胁阵型”则调低 | +| `formationLargeGroupCount` | **大编队**阈值 | 比较 **`redTask.taskWeapons.size()`(红方武器条数)** ≥ 阈值则走 `formationRule_large_group`(不是蓝方数量) | 想更早切换“大编队阵型”则调小 | +| `formationRule_near_fast` 等 | 各分支对应阵型名 | 决策序:**高威胁 > 近快/远快/近慢 > 大编队(红方条数)> 空中占比≥0.5 > default** | 改字符串即改映射 | +| `formationRule_air_majority` | 红方空中占比高时阵型 | `computeRedAirRatio` ≥ 0.5 | 无人机群战术时调整 | + +#### 2.9.5 间距、主僚距、朝向(自动 + 兜底) + +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `formationDefaultSpacingMeters` | 阵型间距兜底 | 自动间距失败时用 | 与最小安全间距匹配 | +| `formationSpacingMinMeters` / `formationSpacingMaxMeters` | 自动间距上下界 | 限制 `resolveFormationSpacing` 输出 | 地形窄/宽时收放 | +| `defenseScaleMinMeters` / `defenseScaleMaxMeters` | 防区尺度映射到间距的范围 | 防区越大间距可越大 | 与防区实际大小一致 | +| `mainWingDistanceDefaultMeters` | 主僚距兜底 | 自动主僚距失败时 | 编队纵向尺度 | +| `mainWingDistanceMinMeters` / `mainWingDistanceMaxMeters` | 主僚距钳位 | 限制自动主僚距 | 避免过近相撞 | +| `mainWingDistanceModeFactor_near_fast` 等 | 部署模式对主僚距的乘子 | 近快更紧、远快更疏等 | 战术疏密 | +| `formationHeadingDefaultDeg` | 朝向兜底 | 无航迹、无 Task 朝向时 | 默认机头方向 | + +**实体覆盖优先级(与代码一致)**: + +- 阵型类型:`Task.formationType`(非空)> 自动选阵型 > `formationDefaultType`。 +- 间距:`Task.formationSpacingMeters` > 防区尺度自动 > `formationDefaultSpacingMeters`。 +- 主僚距:`Weapon.wingRelativeDistanceMeters` > `Task.mainWingDistanceMeters` > 自动 > `mainWingDistanceDefaultMeters`。 +- 朝向:`Task.formationHeadingDeg` > 航迹末段方向 > `formationHeadingDefaultDeg`。 + +**实体字段建议**:`Task`:`formationType`、`formationSpacingMeters`、`mainWingDistanceMeters`、`formationHeadingDeg`;`Weapon`:`formationRole`、`wingRelativeDistanceMeters`、`wingRelativeBearingDeg`。 阵位输入示例(仅经纬度,4点): @@ -133,7 +268,7 @@ } ``` -### 2.9 航迹规则参数(新增) +### 2.10 航迹规则参数(新增) - `enableTrajectoryRules`:航迹规则总开关。 - `strategyMode`:`auto/shortest/flank/interfere`。 - `auto`:智能选择策略。 @@ -159,38 +294,40 @@ ## 3. 当前规则行为(简版) - `装备组件匹配`、`组件参数匹配`:已作为 `legacy` 占位,不承担当前业务决策。 -- 主决策在 `红方武器自适应装配规则`:调用 `configureRedWeaponsByBlue(...)`,按“映射配置”添加武器。 +- 主决策在 `红方武器自适应装配规则`:调用 `configureRedWeaponsByBlue(...)`,默认走“过程驱动整数加分选武器”。 +- 过程驱动链路:蓝方特征提取 -> 候选整数加分 -> 最高分并列全选 -> 动态分配数量与 targetId。 - 导弹增强在 `导弹联动增强规则`:调用 `applyMissileLinkage(...)`,受开关和阈值控制。 -- 全组件数量匹配在 `全组件数量匹配规则`:按红方 `targetId` 绑定蓝方装备,覆盖非导弹组件 `componentParams[0].number`;找不到组件/targetId 允许跳过。 -- 命中率驱动数量在 `命中率规则-动态数量与offset`:按 `hitRate` 与目标毁伤概率推导火力数量;显式 offset 配置优先。 +- `全组件数量匹配规则` 当前语义已收敛为“仅导弹组件匹配”:只改导弹组件数量与首参数,非导弹不改。 +- 命中率驱动数量在 `命中率规则-动态数量与offset`:按 `hitRateThreshold` 与 `gap` 阶梯增量计算数量;显式 offset 配置优先。 - 任务命名在 `任务自动匹配规则`:调用 `assignTaskNameByRedWeapons(...)`,按红方最终武器自动生成任务名和 `dataType`。 - 炮类约束:命中炮类条件时,炮类武器只保留 `炮弹` 组件,单位 `范围米`。 -- `targetId` 绑定:在装配后自动执行,按命中率动态给蓝目标分配多个红方武器(受上下限约束),允许少量空值冗余。 -- 阵位部署:按多边形区域和武器类型自动赋位,保证防区火力覆盖。 +- `targetId`:**过程驱动**下在装配时直接写入对应蓝方 `equipmentId`;**白名单路径**下用“可行性 + 五维评分 + 边际递减”分配(见 2.6)。 +- 阵位部署:按“速度距离驱动锚点 + 阵型偏移 + 主僚机相对位移”自动赋位,最终输出经纬高。 - 射程合理性在 `射程合理性校验规则`:基于蓝/红武器坐标计算距离,自动避免“射程不足却打击”的不合理情况(可自动调参)。 - 航迹生成:根据蓝方 `trackPoints` 生成红方 `trackPoints`,点数与蓝方一致,支持三套策略和智能选择。 -## 3.1 任务名称自动匹配(新增) +## 3.1 任务名称自动匹配(`任务自动匹配规则`,salience 50) -任务命名依据:**红方最终武器**(不是蓝方任务名关键字)。 +**规则过程**:在武器与数量基本落定之后,按 **红方最终 `taskWeapons` 列表** 做分类(不看蓝方 `drawName` 关键字),写入 `redTask.drawName` 与 `redTask.dataType`。 -当前分类优先级: -- 导弹突击(导弹发射车) -- 防空压制(防空导弹武器/火力打击无人机/武装直升机) -- 反装甲打击(反坦克火箭/反坦克导弹系统) -- 炮火压制(迫榴炮/车载迫击炮) -- 通用打击(兜底) +**分类优先级(先命中先生效)**: -业务可调模板(在 `buildBusinessConfig()`): -- `taskName_missile_strike` / `taskDataType_missile_strike` -- `taskName_air_defence` / `taskDataType_air_defence` -- `taskName_anti_armor` / `taskDataType_anti_armor` -- `taskName_artillery` / `taskDataType_artillery` -- `taskName_general` / `taskDataType_general` +1. 导弹突击:含导弹发射车类武器名 +2. 防空压制:防空导弹 / 火力打击无人机 / 武装直升机 +3. 反装甲打击:反坦克火箭 / 反坦克导弹系统 +4. 炮火压制:迫榴炮 / 车载迫击炮 +5. 通用打击:兜底 -效果说明: -- 只改这些模板文字,不改函数,也能改变最终任务展示名。 -- 若分类与武器不一致,会自动回落到 `通用打击任务`,避免“任务名和武器不符”。 +| 参数 | 作用 | 影响什么 | 怎么调整 | +|------|------|----------|----------| +| `taskName_missile_strike` | 导弹突击类展示名 | `drawName` 当命中导弹突击分支时 | 改中文任务标题 | +| `taskDataType_missile_strike` | 导弹突击类业务类型 | `dataType` 同步写入 | 与前端/报表枚举对齐 | +| `taskName_air_defence` / `taskDataType_air_defence` | 防空压制类 | 同上 | 同上 | +| `taskName_anti_armor` / `taskDataType_anti_armor` | 反装甲类 | 同上 | 同上 | +| `taskName_artillery` / `taskDataType_artillery` | 炮火类 | 同上 | 同上 | +| `taskName_general` / `taskDataType_general` | 兜底类 | 无上述特征或冲突回落时使用 | 默认任务名与类型 | + +**效果说明**:只改模板字符串即可改展示;若红方武器组合与期望分类不一致,会落到 `taskName_general`,避免“名不副实”。 ## 4. 快速修改示例(业务常用) @@ -330,7 +467,7 @@ - **联动门控**:`applyMissileLinkage(...)` 必须同时满足: - `enableMissileLinkage=true` - 蓝方导弹数量 `>= minBlueMissileCountForLinkage` -- **目标绑定**:`bindTargetIdsForRedWeapons(...)` 基于蓝方 `equipmentId` 分配 `targetId`,支持“优先匹配 + 绑定率阈值 + 冗余空目标”。 +- **目标绑定**:`bindTargetIdsForRedWeapons(...)` 基于蓝方 `equipmentId` 执行“可行性过滤 + 打分 + 边际收益递减分配 + 回退兜底”。 - **阵位部署**:`prepareDeploymentPools(...)` + `applyWeaponDeployment(...)` 负责区域解析、点位生成与部署赋位。 - **航迹生成**:`applyTrajectoryGeneration(...)` + `chooseTrajectoryStrategy(...)` + `generateRedTrackPoints(...)` 负责红方航迹策略生成。 - **任务命名**:`assignTaskNameByRedWeapons(...)` 仅基于红方最终武器,避免旧版按蓝方 `drawName` 关键字造成误判。 diff --git a/auto-solution-rule/src/main/resources/rules/fire-rule.drl b/auto-solution-rule/src/main/resources/rules/fire-rule.drl index c12e774..af8804a 100644 --- a/auto-solution-rule/src/main/resources/rules/fire-rule.drl +++ b/auto-solution-rule/src/main/resources/rules/fire-rule.drl @@ -130,14 +130,17 @@ function Map buildBusinessConfig() { cfg.put("allowMultiGroup", Boolean.TRUE); // true=允许多组叠加,false=命中首组即停止 cfg.put("enableArmedHelicopterOnAir", Boolean.TRUE); - // ---------- 蓝方类型 -> 红方武器方案(多选映射,可改) ---------- - // 逗号分隔,示例:反坦克火箭,反坦克导弹系统 - // 若为空或写了非法武器名,则该组不触发(允许不命中) - cfg.put("map_air_targets", "防空导弹武器,火力打击无人机,武装直升机"); - cfg.put("map_ground_targets", "迫榴炮,车载迫击炮"); - cfg.put("map_armor_targets", "反坦克火箭,反坦克导弹系统"); - cfg.put("map_artillery_targets", "迫榴炮,车载迫击炮"); - cfg.put("map_missile_targets", "导弹发射车"); + // ---------- 过程驱动整数加分引擎(可改) ---------- + cfg.put("enableRuleScoring", Boolean.TRUE); // true=过程驱动整数加分;false=回退旧白名单 + cfg.put("minScoreToAssign", 1); // 最低入选分(整数) + cfg.put("nearDefenseDistanceMeters", 500); // 近防区距离阈值 + cfg.put("highThreatLevel", 3); // 高威胁阈值 + cfg.put("highTargetCount", 2); // 蓝方数量阈值 + cfg.put("score_type_antiArmor", 1); // 蓝方装甲 -> 反坦克类加分 + cfg.put("score_nearDefense_artillery", 1); // 近防区 -> 迫榴炮类加分 + cfg.put("score_highThreat_missile", 1); // 高威胁 -> 导弹/防空类加分 + cfg.put("score_highCount_artillery", 1); // 蓝方数量高 -> 炮类加分 + cfg.put("score_hasMissile_airDefence", 1); // 蓝方有导弹 -> 防空类加分 // ---------- 数量与参数(可改) ---------- cfg.put("defaultAirNum", 1); @@ -149,25 +152,32 @@ function Map buildBusinessConfig() { cfg.put("blueMissileRangeDefault", 220); // 蓝方导弹范围默认值 cfg.put("minBlueMissileCountForLinkage", 1); // 联动触发门槛 - // ---------- 命中率与动态火力(可改) ---------- + + // ---------- 命中率与动态火力(可改) ---------- cfg.put("hitRateCsv", "防空导弹武器=0.72,火力打击无人机=0.62,武装直升机=0.68,反坦克火箭=0.55,反坦克导弹系统=0.78,迫榴炮=0.45,车载迫击炮=0.43,导弹发射车=0.82"); cfg.put("defaultHitRateFallback", "0.6"); // 兜底命中率 cfg.put("desiredKillProbability", "0.9"); // 期望毁伤置信度 cfg.put("offsetCsvByWeapon", ""); // 显式offset(武器=offset)优先,例:反坦克火箭=1,武装直升机=2 + cfg.put("hitRateThreshold", "0.7"); // 命中率阈值:低于该值触发阶梯增量 + cfg.put("hitRateGapStep1Max", "0.5"); // gap第一档上界(gap=threshold-hitRate) + cfg.put("hitRateGapStep2Max", "1.0"); // gap第二档上界 + cfg.put("hitRateStep1Offset", 1); // 第一档固定增量 + cfg.put("hitRateStep2Offset", 2); // 第二档固定增量 cfg.put("enableDynamicMultiRedPerBlue", Boolean.TRUE); // 按命中率动态决定每个蓝目标需要几个红武器 cfg.put("minRedWeaponsPerBlueTarget", 1); // 每个蓝目标最少分配红武器数量 cfg.put("maxRedWeaponsPerBlueTargetCap", 3); // 每个蓝目标最多分配红武器数量上限 cfg.put("enableRangeSanityCheck", Boolean.TRUE); // 距离-射程合理性校验开关 cfg.put("enableAutoRangeRecommend", Boolean.TRUE); // 射程不足时自动调参 - cfg.put("rangeSafetyMarginMeters", 50); // 射程安全裕量 + cfg.put("rangeSafetyMarginMeters", 50); // 射程安全余量 + //还是简单 - // ---------- 全组件数量匹配(可改) ---------- - // 逻辑:按红方武器 targetId 找到对应蓝方装备(equipmentId),然后覆盖所有“非导弹组件”的数量 + // ---------- 仅导弹组件匹配(可改) ---------- + // 逻辑:按红方武器 targetId 找到对应蓝方装备(equipmentId),仅覆盖“导弹组件”的数量与首参数 cfg.put("enableComponentQuantityMatch", Boolean.TRUE); // 格式示例:蓝穿甲弹->红穿甲弹,蓝火控雷达->红火控雷达;为空则默认 deviceName 一致匹配 cfg.put("componentDeviceNameMappingCsv", ""); - // 跳过覆盖:蓝方组件 deviceName 包含该关键词则不覆盖(默认用来保留导弹联动偏移) - cfg.put("skipMissileComponentsByNameContains", "导弹"); + // 仅匹配:蓝方组件 deviceName 包含该关键词时才匹配 + cfg.put("missileComponentNameContains", "导弹"); // ---------- 任务自动命名模板(可改) ---------- // 任务分类优先级:导弹突击 > 防空压制 > 反装甲打击 > 炮火压制 > 通用打击 @@ -186,6 +196,17 @@ function Map buildBusinessConfig() { cfg.put("enableTargetAutoBind", Boolean.TRUE); // 是否自动给红方武器绑定蓝方目标 cfg.put("minTargetBindRatio", "0.7"); // 最低绑定比例(大部分有目标) cfg.put("allowReserveWithoutTarget", Boolean.TRUE); // 允许少量武器 targetId 为空(火力冗余) + cfg.put("w_target_type", "0.30"); // target分配:类型匹配权重 w_target_type 越大,规则越“看重类型对口”。 + cfg.put("w_target_dist", "0.25"); // target分配:距离权重 w_target_dist 越大,系统越偏向“更近/更容易打到”的目标 射程不足会被直接淘汰,不参与加权计算 + cfg.put("w_target_height", "0.10"); // target分配:高度差权重 作用:w_target_height 越大,系统越偏向“高度层更匹配”的目标(例如空中平台对空中目标、地面平台对地面目标更自然) + cfg.put("w_target_hit", "0.20"); // target分配:命中率权重 w_target_hit 越大,高命中率武器越容易拿到更高分,从而优先绑定目标。 + cfg.put("w_target_threat", "0.15"); // target分配:蓝目标威胁权重 作用:w_target_threat 越大,红武器会更倾向优先打“高威胁蓝目标”,即使距离稍远或类型略次优也可能被拉高排名 + cfg.put("maxEffectiveDistance", 3000); // 超过该距离候选失效 + cfg.put("maxHeightGap", 800); // 超过该高度差候选失效 + cfg.put("targetDecayAlpha", "0.35"); // 边际收益递减系数 + cfg.put("fallbackToNearestTarget", Boolean.TRUE); // 候选失效时回退最近目标 + cfg.put("allowUnassignedRedWeapon", Boolean.TRUE); // 无有效候选时允许红方targetId为空 + //权重怎么用的算法要研究 // ---------- 阵位规则参数(可改) ---------- cfg.put("enablePositionRules", Boolean.TRUE); // 阵位规则总开关 @@ -194,12 +215,54 @@ function Map buildBusinessConfig() { cfg.put("airDeployZonePreference", "combat"); // 飞机优先部署区:combat/defense cfg.put("defensePriorityWeapons", "反坦克导弹系统,反坦克火箭,车载迫击炮,迫榴炮"); // 优先部署防区武器 cfg.put("groundDeployHeight", 20); // 地面武器部署高度 - cfg.put("airDeployHeight", 300); // 空中武器部署高度 + cfg.put("airDeployHeight", 300); // 空中武器部署高度(自动高度关闭或兜底时使用) + cfg.put("enableAutoAirDeployHeight", Boolean.TRUE); // 空中部署高度自动生成开关 + cfg.put("airHeightMin", 50); // 自动高度下限 + cfg.put("airHeightMax", 20000); // 自动高度上限 + cfg.put("airHeightFallback", 300); // 无航迹/无蓝方武器高度时的兜底高度 + cfg.put("airHeightSpeedThreshold", 180); // 速度修正:平均速度≥此值视为“快” + cfg.put("airHeightAdjustFast", 40); // 速度快时额外抬高(米) + cfg.put("airHeightNearDefenseDistance", 800); // 距防区“近”阈值(米) + cfg.put("airHeightFarDefenseDistance", 2500); // 距防区“远”阈值(米) + cfg.put("airHeightAdjustNear", -30); // 近防区高度修正(通常为负,压低) + cfg.put("airHeightAdjustFar", 40); // 远防区高度修正(抬高) + cfg.put("airHeightAdjustMain", 20); // 主机相对基准额外高度 + cfg.put("airHeightAdjustWing", -10); // 僚机相对基准额外高度 + cfg.put("formationDefaultType", "TRIANGLE"); // 默认阵型:TRIANGLE/DIAMOND/LINE/COLUMN/WEDGE + cfg.put("enableAutoFormationSelect", Boolean.TRUE); // 阵型自动选择开关 + cfg.put("formationFastSpeedThreshold", 180); // 自动选阵型:高速阈值 + cfg.put("formationNearDefenseDistance", 800); // 自动选阵型:近防区阈值 + cfg.put("formationFarDefenseDistance", 2500); // 自动选阵型:远防区阈值 + cfg.put("formationHighThreatLevel", 3); // 自动选阵型:高威胁阈值 + cfg.put("formationLargeGroupCount", 6); // 自动选阵型:大编队阈值 + cfg.put("formationRule_near_fast", "WEDGE"); // 近快态势阵型 + cfg.put("formationRule_far_fast", "LINE"); // 远快态势阵型 + cfg.put("formationRule_near_slow", "DIAMOND"); // 近慢态势阵型 + cfg.put("formationRule_high_threat", "DIAMOND"); // 高威胁优先阵型 + cfg.put("formationRule_large_group", "COLUMN"); // 大编队优先阵型 + cfg.put("formationRule_air_majority", "LINE"); // 空中占比高阵型 + cfg.put("formationRule_default", "TRIANGLE"); // 自动选择默认阵型 + cfg.put("formationDefaultSpacingMeters", 120); // 阵型间距兜底(自动计算失败时) + cfg.put("mainWingDistanceDefaultMeters", 100); // 主僚距离兜底(自动计算失败时) + cfg.put("formationHeadingDefaultDeg", 0); // 默认阵型朝向 + cfg.put("formationSpacingMinMeters", 60); // 自动间距下限 + cfg.put("formationSpacingMaxMeters", 220); // 自动间距上限 + cfg.put("defenseScaleMinMeters", 300); // 防区尺度映射下限 + cfg.put("defenseScaleMaxMeters", 3000); // 防区尺度映射上限 + cfg.put("mainWingDistanceMinMeters", 60); // 自动主僚距离下限 + cfg.put("mainWingDistanceMaxMeters", 260); // 自动主僚距离上限 + cfg.put("mainWingDistanceModeFactor_near_fast", "0.90"); // 近快:更紧凑 + cfg.put("mainWingDistanceModeFactor_far_fast", "1.15"); // 远快:更疏开 + cfg.put("mainWingDistanceModeFactor_near_slow", "0.95"); // 近慢:略紧凑 + cfg.put("mainWingDistanceModeFactor_default", "1.00"); // 默认系数 + cfg.put("speedFastThreshold", 180); // 蓝方高速阈值 + cfg.put("distanceNearDefenseThresholdMeters", 800); // 近防区阈值 + cfg.put("distanceFarDefenseThresholdMeters", 2500); // 远防区阈值 // ---------- 航迹规则参数(可改) ---------- cfg.put("enableTrajectoryRules", Boolean.TRUE); // 航迹规则总开关 // 智能 最短的 侧面 干扰 - cfg.put("strategyMode", "auto"); // auto/shortest/flank/interfere + cfg.put("strategyMode", "shortest"); // auto/shortest/flank/interfere cfg.put("enableShortest", Boolean.TRUE); cfg.put("enableFlank", Boolean.TRUE); cfg.put("enableInterfere", Boolean.TRUE); @@ -240,8 +303,8 @@ then end //------------------------------------------------------------------------------- -// 全组件数量匹配:按 redWeapon.targetId 对应蓝方装备,覆盖“非导弹组件”的数量 -rule "全组件数量匹配规则" +// 仅导弹组件匹配:按 redWeapon.targetId 对应蓝方装备,仅覆盖导弹组件的数量与首参数 +rule "导弹组件数量匹配规则" agenda-group "打击任务" salience 53 when @@ -345,6 +408,12 @@ function void configureRedWeaponsByBlue( // 蓝方组件模板(用于测试和参数联动):若蓝方没填组件,给一个合理默认值 buildBlueTestComponents(blueWeapons); + // 过程驱动模式:根据蓝方类型/数量/位置等态势特征评分选武器 + if (readBooleanCfg(cfg, "enableRuleScoring", true)) { + runProcessDrivenSelection(fact, cfg); + return; + } + boolean hasBlueAir = false; boolean hasBlueGround = false; boolean hasBlueArtillery = false; @@ -432,6 +501,329 @@ function void configureRedWeaponsByBlue( bindTargetIdsForRedWeapons(redWeapons, blueWeapons, cfg); } +//------------------------------------------------------------------------------- +// 过程驱动主流程:特征提取 -> 评分选武器 -> 动态分配 +function void runProcessDrivenSelection(FactTask fact, Map cfg) { + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + List blueWeapons = blueTask.getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty()) { + return; + } + List redWeapons = redTask.getTaskWeapons(); + if (redWeapons == null) { + redWeapons = new ArrayList(); + redTask.setTaskWeapons(redWeapons); + } else { + redWeapons.clear(); + } + + List blueFeatures = extractBlueTargetFeatures(blueTask, cfg); + if (blueFeatures == null || blueFeatures.isEmpty()) { + return; + } + List redPool = getRedWeaponPoolByConfig(cfg); + if (redPool == null || redPool.isEmpty()) { + return; + } + + double desiredKill = normalizeProbability(readDoubleCfg(cfg, "desiredKillProbability", 0.9d), 0.9d); + int minAssign = readIntCfg(cfg, "minRedWeaponsPerBlueTarget", 1); + int maxAssign = readIntCfg(cfg, "maxRedWeaponsPerBlueTargetCap", 3); + if (maxAssign <= 0) { + maxAssign = 1; + } + if (minAssign < 0) { + minAssign = 0; + } + if (minAssign > maxAssign) { + minAssign = maxAssign; + } + int minScore = readIntCfg(cfg, "minScoreToAssign", 1); + + for (Object featObj : blueFeatures) { + Map feat = (Map) featObj; + String blueId = String.valueOf(feat.get("blueId")); + Weapon blueWeapon = (Weapon) feat.get("blueWeapon"); + if (blueWeapon == null || isBlank(blueId)) { + continue; + } + + List topNames = pickTopScoredWeapons(feat, redPool, cfg, minScore); + if (topNames == null || topNames.isEmpty()) { + continue; + } + int needCount = computeNeededRedCountFromFeature(feat, cfg, desiredKill); + allocateRedWeaponsForBlueTarget(topNames, needCount, minAssign, maxAssign, blueId, redWeapons, cfg); + } + + if (!redWeapons.isEmpty()) { + applyDefaultHitRateIfAbsent(redWeapons, cfg); + if (containsBlueArtillery(blueWeapons)) { + limitRedArtilleryToShellOnly(redWeapons, (String) cfg.get("shellRangeDefault")); + } + } +} + +function List extractBlueTargetFeatures(Task blueTask, Map cfg) { + List result = new ArrayList(); + if (blueTask == null || blueTask.getTaskWeapons() == null) { + return result; + } + int threat = parseIntSafe(blueTask.getThreatLevel(), 1); + for (Object obj : blueTask.getTaskWeapons()) { + Weapon blue = (Weapon) obj; + if (blue == null || isBlank(blue.getEquipmentId())) { + continue; + } + Map feature = new java.util.HashMap(); + feature.put("blueId", blue.getEquipmentId()); + feature.put("blueWeapon", blue); + feature.put("isAir", Boolean.valueOf(isAirWeapon(blue))); + feature.put("isArmor", Boolean.valueOf(isArmorWeapon(blue))); + feature.put("isArtillery", Boolean.valueOf(isArtilleryWeapon(blue))); + feature.put("isGround", Boolean.valueOf(isGroundWeapon(blue))); + feature.put("hasMissile", Boolean.valueOf(hasMissileComponent(blue))); + int blueNum = blue.getNumber() == null || blue.getNumber() <= 0 ? 1 : blue.getNumber().intValue(); + feature.put("blueNum", Integer.valueOf(blueNum)); + feature.put("threat", Integer.valueOf(threat)); + feature.put("distance", Double.valueOf(computeBlueDistanceToDefenseMeters(blue, blueTask))); + result.add(feature); + } + return result; +} + +function List pickTopScoredWeapons(Map feature, List redPool, Map cfg, int minScoreToAssign) { + List result = new ArrayList(); + if (feature == null || redPool == null || redPool.isEmpty()) { + return result; + } + int maxScore = Integer.MIN_VALUE; + for (Object obj : redPool) { + String redName = String.valueOf(obj); + if (isBlank(redName)) { + continue; + } + int s = scoreRedWeaponByRules(feature, redName, cfg); + if (s > maxScore) { + maxScore = s; + } + } + if (maxScore < minScoreToAssign) { + return result; + } + for (Object obj : redPool) { + String redName = String.valueOf(obj); + if (isBlank(redName)) { + continue; + } + int s = scoreRedWeaponByRules(feature, redName, cfg); + if (s == maxScore) { + addUnique(result, redName); + } + } + return result; +} + +function int scoreRedWeaponByRules(Map feature, String redName, Map cfg) { + if (feature == null || redName == null) { + return 0; + } + int score = 0; + boolean isAir = ((Boolean) feature.get("isAir")).booleanValue(); + boolean isArmor = ((Boolean) feature.get("isArmor")).booleanValue(); + boolean isArtillery = ((Boolean) feature.get("isArtillery")).booleanValue(); + boolean hasMissile = ((Boolean) feature.get("hasMissile")).booleanValue(); + int blueNum = ((Integer) feature.get("blueNum")).intValue(); + int threat = ((Integer) feature.get("threat")).intValue(); + double distance = ((Double) feature.get("distance")).doubleValue(); + + if (isArmor && redName.contains("反坦克")) { + score += readIntCfg(cfg, "score_type_antiArmor", 1); + } + if (isAir && (redName.contains("防空导弹") || redName.contains("无人机") || redName.contains("直升机"))) { + score += readIntCfg(cfg, "score_highThreat_missile", 1); + } + if (isArtillery && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { + score += 1; + } + if (distance <= readIntCfg(cfg, "nearDefenseDistanceMeters", 500) && redName.contains("迫榴炮")) { + score += readIntCfg(cfg, "score_nearDefense_artillery", 1); + } + if (threat >= readIntCfg(cfg, "highThreatLevel", 3) && (redName.contains("导弹") || redName.contains("防空"))) { + score += readIntCfg(cfg, "score_highThreat_missile", 1); + } + if (blueNum >= readIntCfg(cfg, "highTargetCount", 2) && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { + score += readIntCfg(cfg, "score_highCount_artillery", 1); + } + if (hasMissile && (redName.contains("防空导弹") || redName.contains("导弹发射车"))) { + score += readIntCfg(cfg, "score_hasMissile_airDefence", 1); + } + + int estRange = estimateRangeByRedWeaponName(redName); + int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); + if (distance < Double.MAX_VALUE / 2.0d && estRange >= (int) Math.ceil(distance) + margin) { + score += 1; + } + return score; +} + +function void allocateRedWeaponsForBlueTarget(List topNames, int needCount, int minAssign, int maxAssign, String blueId, List redWeapons, Map cfg) { + if (topNames == null || topNames.isEmpty() || isBlank(blueId) || redWeapons == null) { + return; + } + int finalNeed = needCount; + if (finalNeed < minAssign) { + finalNeed = minAssign; + } + if (finalNeed > maxAssign) { + finalNeed = maxAssign; + } + int assigned = 0; + while (assigned < finalNeed) { + for (Object obj : topNames) { + if (assigned >= finalNeed) { + break; + } + String redName = String.valueOf(obj); + Weapon red = createRedWeaponInstance(redName, inferSupportTypeByWeaponName(redName), 1); + red.setTargetId(blueId); + ensureBasicRedComponents(red); + red.setHitRate(Double.valueOf(resolveHitRateByName(redName, cfg))); + redWeapons.add(red); + assigned++; + } + } +} + +function int computeNeededRedCountFromFeature(Map feature, Map cfg, double desiredKill) { + if (feature == null) { + return 1; + } + int blueNum = ((Integer) feature.get("blueNum")).intValue(); + int threat = ((Integer) feature.get("threat")).intValue(); + double distance = ((Double) feature.get("distance")).doubleValue(); + double pBase = normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); + if (((Boolean) feature.get("isArmor")).booleanValue()) { + pBase = pBase + 0.05d; + } + if (((Boolean) feature.get("isAir")).booleanValue()) { + pBase = pBase - 0.05d; + } + if (distance > 1500.0d) { + pBase = pBase - 0.06d; + } + pBase = normalizeProbability(pBase, 0.6d); + int oneTargetNeed = computeRequiredShots(pBase, desiredKill, 1); + int count = oneTargetNeed + Math.max(0, blueNum - 1); + if (threat >= 3) { + count++; + } + return Math.max(1, count); +} + +function double computeBlueDistanceToDefenseMeters(Weapon blueWeapon, Task blueTask) { + if (blueWeapon == null || blueWeapon.getCoordinate() == null || blueTask == null || blueTask.getDefZoneLocation() == null) { + return Double.MAX_VALUE; + } + Coordinate b = blueWeapon.getCoordinate(); + if (b.getLongitude() == null || b.getLatitude() == null) { + return Double.MAX_VALUE; + } + double best = Double.MAX_VALUE; + for (Object obj : blueTask.getDefZoneLocation()) { + Coordinate c = (Coordinate) obj; + if (c == null || c.getLongitude() == null || c.getLatitude() == null) { + continue; + } + double d = approxDistanceMeters( + b.getLongitude().doubleValue(), + b.getLatitude().doubleValue(), + c.getLongitude().doubleValue(), + c.getLatitude().doubleValue() + ); + if (d < best) { + best = d; + } + } + return best; +} + +function int estimateRangeByRedWeaponName(String redName) { + if (redName == null) { + return 800; + } + if (redName.contains("反坦克导弹系统")) { + return 1800; + } + if (redName.contains("导弹发射车")) { + return 2500; + } + if (redName.contains("防空导弹")) { + return 2200; + } + if (redName.contains("武装直升机")) { + return 1500; + } + if (redName.contains("无人机")) { + return 1200; + } + if (redName.contains("迫榴炮") || redName.contains("迫击炮")) { + return 1600; + } + if (redName.contains("反坦克火箭")) { + return 1000; + } + return 900; +} + +function double resolveHitRateByName(String redName, Map cfg) { + Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); + Double p = (Double) hitRateMap.get(redName); + if (p == null) { + p = Double.valueOf(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d)); + } + return normalizeProbability(p.doubleValue(), 0.6d); +} + +function List getRedWeaponPoolByConfig(Map cfg) { + List pool = new ArrayList(); + addUnique(pool, (String) cfg.get("redStrikeDroneName")); + addUnique(pool, (String) cfg.get("redArmedHelicopterName")); + addUnique(pool, (String) cfg.get("redHowitzerName")); + addUnique(pool, (String) cfg.get("redVehicleMortarName")); + addUnique(pool, (String) cfg.get("redAaWeaponName")); + addUnique(pool, (String) cfg.get("redAtRocketName")); + addUnique(pool, (String) cfg.get("redAtMissileSystemName")); + addUnique(pool, (String) cfg.get("redMissileVehicleName")); + return pool; +} + +function Weapon createRedWeaponInstance(String name, String supportType, int number) { + Weapon w = new Weapon(); + w.setName(name); + w.setSupportType(supportType); + w.setNumber(number); + w.setComponents(new ArrayList()); + return w; +} + +function boolean containsBlueArtillery(List blueWeapons) { + if (blueWeapons == null) { + return false; + } + for (Object obj : blueWeapons) { + Weapon w = (Weapon) obj; + if (w != null && isArtilleryWeapon(w)) { + return true; + } + } + return false; +} + function void applyMappedWeapons(List redWeapons, Map cfg, String mapKey, int defaultNum, boolean allowArmedHelicopter) { List mappedNames = parseMappedWeaponNames(cfg, mapKey); if (mappedNames == null || mappedNames.isEmpty()) { @@ -577,130 +969,86 @@ function void bindTargetIdsForRedWeapons(List redWeapons, List blueWeapons, Map if (redWeapons == null || redWeapons.isEmpty() || blueWeapons == null || blueWeapons.isEmpty()) { return; } - - Map pools = extractBlueTargetPools(blueWeapons); Map blueById = indexBlueWeaponsById(blueWeapons); Map assignedCountByBlueId = new java.util.HashMap(); - Map survivalByBlueId = initBlueSurvivalMap(blueById); - double desiredKill = normalizeProbability(readDoubleCfg(cfg, "desiredKillProbability", 0.9d), 0.9d); - int cap = readIntCfg(cfg, "maxRedWeaponsPerBlueTargetCap", 3); - int minPerBlue = readIntCfg(cfg, "minRedWeaponsPerBlueTarget", 1); - if (cap <= 0) { - cap = 1; - } - if (minPerBlue < 0) { - minPerBlue = 0; - } - if (minPerBlue > cap) { - minPerBlue = cap; - } - + double decayAlpha = readDoubleCfg(cfg, "targetDecayAlpha", 0.35d); + boolean fallbackToNearest = readBooleanCfg(cfg, "fallbackToNearestTarget", true); + boolean allowUnassigned = readBooleanCfg(cfg, "allowUnassignedRedWeapon", true); int total = redWeapons.size(); int bound = 0; - // 第一轮:先满足每个蓝目标的最小分配(在cap内) - if (minPerBlue > 0) { - List allBlueIds = (List) pools.get("all"); - if (allBlueIds != null && !allBlueIds.isEmpty()) { - for (Object idObj : allBlueIds) { - String blueId = String.valueOf(idObj); - int need = minPerBlue; - while (need > 0) { - Weapon candidate = pickUnboundRedWeaponForBlue(blueId, redWeapons); - if (candidate == null) { - break; - } - candidate.setTargetId(blueId); - bound++; - incrementAssignedCount(assignedCountByBlueId, blueId); - double p = resolveWeaponHitRate(candidate, cfg); - updateBlueSurvival(survivalByBlueId, blueId, p); - need--; - } - } - } - } - - // 第二轮:按命中率动态分配,优先填补“尚未达到期望毁伤概率”的蓝目标 - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; + // 核心:每把红武器选择“当前边际收益最高”的蓝目标 + for (Object objR : redWeapons) { + Weapon redWeapon = (Weapon) objR; if (redWeapon == null) { continue; } - if (!isBlank(redWeapon.getTargetId())) { - continue; + String bestBlueId = null; + double bestMarginal = -1.0d; + for (Object objB : blueWeapons) { + Weapon blueWeapon = (Weapon) objB; + if (blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { + continue; + } + if (!isPairFeasible(redWeapon, blueWeapon, cfg)) { + continue; + } + double baseScore = computePairScore(redWeapon, blueWeapon, cfg); + Integer countObj = (Integer) assignedCountByBlueId.get(blueWeapon.getEquipmentId()); + int k = countObj == null ? 0 : countObj.intValue(); + double decay = 1.0d / (1.0d + decayAlpha * k); + double marginal = baseScore * decay; + if (marginal > bestMarginal) { + bestMarginal = marginal; + bestBlueId = blueWeapon.getEquipmentId(); + } } - String poolKey = inferBluePoolKeyForRedWeapon(redWeapon); - String targetId = pickBlueTargetByNeed( - pools, - poolKey, - assignedCountByBlueId, - survivalByBlueId, - desiredKill, - cap - ); - if (!isBlank(targetId)) { - redWeapon.setTargetId(targetId); + if (isBlank(bestBlueId) && fallbackToNearest) { + bestBlueId = pickNearestBlueId(redWeapon, blueWeapons); + } + if (isBlank(bestBlueId)) { + if (!allowUnassigned) { + bestBlueId = pickAnyBlueId(blueWeapons); + } + } + if (!isBlank(bestBlueId)) { + redWeapon.setTargetId(bestBlueId); bound++; - incrementAssignedCount(assignedCountByBlueId, targetId); - double p = resolveWeaponHitRate(redWeapon, cfg); - updateBlueSurvival(survivalByBlueId, targetId, p); + incrementAssignedCount(assignedCountByBlueId, bestBlueId); } } double minRatio = readDoubleCfg(cfg, "minTargetBindRatio", 0.7d); boolean allowReserveWithoutTarget = readBooleanCfg(cfg, "allowReserveWithoutTarget", true); - double currentRatio = total <= 0 ? 1.0d : ((double) bound / (double) total); - if (currentRatio >= minRatio && allowReserveWithoutTarget) { - return; - } - - // 第三轮:若绑定率不足,回退全目标池补齐(仍受cap约束) - for (Object obj : redWeapons) { - if (total > 0 && ((double) bound / (double) total) >= minRatio) { - break; - } - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { - continue; - } - String targetId = pickBlueTargetByNeed( - pools, - "all", - assignedCountByBlueId, - survivalByBlueId, - desiredKill, - cap - ); - if (!isBlank(targetId)) { - redWeapon.setTargetId(targetId); - bound++; - incrementAssignedCount(assignedCountByBlueId, targetId); - double p = resolveWeaponHitRate(redWeapon, cfg); - updateBlueSurvival(survivalByBlueId, targetId, p); - } - } - - // 第四轮:若不允许空 targetId,最后尽力补齐 if (!allowReserveWithoutTarget) { for (Object obj : redWeapons) { Weapon redWeapon = (Weapon) obj; if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { continue; } - String targetId = pickBlueTargetByNeed( - pools, - "all", - assignedCountByBlueId, - survivalByBlueId, - desiredKill, - cap - ); - if (!isBlank(targetId)) { - redWeapon.setTargetId(targetId); - incrementAssignedCount(assignedCountByBlueId, targetId); - double p = resolveWeaponHitRate(redWeapon, cfg); - updateBlueSurvival(survivalByBlueId, targetId, p); + String any = pickAnyBlueId(blueWeapons); + if (!isBlank(any)) { + redWeapon.setTargetId(any); + bound++; + } + } + return; + } + // 允许冗余时,只保证最低绑定比例 + if (total > 0 && ((double) bound / (double) total) < minRatio) { + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { + continue; + } + String any = pickAnyBlueId(blueWeapons); + if (isBlank(any)) { + continue; + } + redWeapon.setTargetId(any); + bound++; + if (((double) bound / (double) total) >= minRatio) { + break; } } } @@ -716,7 +1064,23 @@ function void applyHitRateDrivenOffsets(FactTask fact, Map cfg) { } applyDefaultHitRateIfAbsent(redWeapons, cfg); Map explicitOffset = parseNameIntCsv((String) cfg.get("offsetCsvByWeapon")); - double desiredKill = normalizeProbability(readDoubleCfg(cfg, "desiredKillProbability", 0.9d), 0.9d); + double threshold = normalizeProbability(readDoubleCfg(cfg, "hitRateThreshold", 0.7d), 0.7d); + double step1Max = readDoubleCfg(cfg, "hitRateGapStep1Max", 0.5d); + double step2Max = readDoubleCfg(cfg, "hitRateGapStep2Max", 1.0d); + int step1Offset = readIntCfg(cfg, "hitRateStep1Offset", 1); + int step2Offset = readIntCfg(cfg, "hitRateStep2Offset", 2); + if (step1Max < 0.0d) { + step1Max = 0.0d; + } + if (step2Max < step1Max) { + step2Max = step1Max; + } + if (step1Offset < 0) { + step1Offset = 0; + } + if (step2Offset < step1Offset) { + step2Offset = step1Offset; + } for (Object obj : redWeapons) { Weapon redWeapon = (Weapon) obj; if (redWeapon == null) { @@ -729,8 +1093,17 @@ function void applyHitRateDrivenOffsets(FactTask fact, Map cfg) { offset = explicit.intValue(); } else { double pHit = resolveWeaponHitRate(redWeapon, cfg); - int required = computeRequiredShots(pHit, desiredKill, base); - offset = required - base; + double gap = threshold - pHit; + if (gap <= 0.0d) { + offset = 0; + } else if (gap <= step1Max) { + offset = step1Offset; + } else if (gap <= step2Max) { + offset = step2Offset; + } else { + // 超出第二档时按第二档处理,避免火力数量无上限膨胀 + offset = step2Offset; + } } if (offset < 0) { offset = 0; @@ -782,12 +1155,42 @@ function void applyRangeSanityAndRecommend(FactTask fact, Map cfg) { if (currentRange >= minRequired) { continue; } + if (tryReplaceWithBetterRangeWeapon(redWeapon, minRequired, cfg)) { + continue; + } if (autoAdjust) { setWeaponFirstRangeParamAtLeast(redWeapon, minRequired); } } } +function boolean tryReplaceWithBetterRangeWeapon(Weapon redWeapon, int minRequired, Map cfg) { + if (redWeapon == null || redWeapon.getName() == null) { + return false; + } + String current = redWeapon.getName(); + String replacement = null; + if (current.contains("反坦克火箭")) { + replacement = "反坦克导弹系统"; + } else if (current.contains("迫击炮")) { + replacement = "迫榴炮"; + } else if (current.contains("无人机")) { + replacement = "武装直升机"; + } + if (isBlank(replacement)) { + return false; + } + if (estimateRangeByRedWeaponName(replacement) < minRequired) { + return false; + } + redWeapon.setName(replacement); + redWeapon.setSupportType(inferSupportTypeByWeaponName(replacement)); + redWeapon.setComponents(new ArrayList()); + ensureBasicRedComponents(redWeapon); + redWeapon.setHitRate(Double.valueOf(resolveHitRateByName(replacement, cfg))); + return true; +} + function void applyDefaultHitRateIfAbsent(List redWeapons, Map cfg) { if (redWeapons == null || redWeapons.isEmpty()) { return; @@ -967,6 +1370,194 @@ function void incrementAssignedCount(Map assignedCountByBlueId, String blueId) { assignedCountByBlueId.put(blueId, Integer.valueOf(now)); } +function boolean isPairFeasible(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + if (redWeapon == null || blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { + return false; + } + // 类型禁配(最基础约束) + String pool = inferBluePoolKeyForRedWeapon(redWeapon); + if ("air".equals(pool) && !isAirWeapon(blueWeapon)) { + return false; + } + if ("armor".equals(pool) && !isArmorWeapon(blueWeapon)) { + return false; + } + if ("artillery".equals(pool) && !isArtilleryWeapon(blueWeapon) && !isGroundWeapon(blueWeapon)) { + return false; + } + // 距离/高度约束(有坐标时启用) + Coordinate rc = redWeapon.getCoordinate(); + Coordinate bc = blueWeapon.getCoordinate(); + if (isCoordinateUsable(rc) && isCoordinateUsable(bc)) { + double d = approxDistanceMeters( + rc.getLongitude().doubleValue(), + rc.getLatitude().doubleValue(), + bc.getLongitude().doubleValue(), + bc.getLatitude().doubleValue() + ); + int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); + if (d > maxDist) { + return false; + } + int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); + int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); + int maxGap = readIntCfg(cfg, "maxHeightGap", 800); + if (Math.abs(rh - bh) > maxGap) { + return false; + } + int estRange = estimateRangeByRedWeaponName(redWeapon.getName()); + int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); + if (estRange < (int) Math.ceil(d) + margin) { + return false; + } + } + return true; +} + +function double computePairScore(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + double wType = readDoubleCfg(cfg, "w_target_type", 0.30d); + double wDist = readDoubleCfg(cfg, "w_target_dist", 0.25d); + double wHeight = readDoubleCfg(cfg, "w_target_height", 0.10d); + double wHit = readDoubleCfg(cfg, "w_target_hit", 0.20d); + double wThreat = readDoubleCfg(cfg, "w_target_threat", 0.15d); + double typeFit = computeTypeFit(redWeapon, blueWeapon); + double distanceFit = computeDistanceFit(redWeapon, blueWeapon, cfg); + double heightFit = computeHeightFit(redWeapon, blueWeapon, cfg); + double hitContribution = resolveWeaponHitRate(redWeapon, cfg); + double threatWeight = computeBlueThreatWeight(blueWeapon); + return (wType * typeFit) + (wDist * distanceFit) + (wHeight * heightFit) + (wHit * hitContribution) + (wThreat * threatWeight); +} + +function double computeTypeFit(Weapon redWeapon, Weapon blueWeapon) { + String pool = inferBluePoolKeyForRedWeapon(redWeapon); + if ("air".equals(pool) && isAirWeapon(blueWeapon)) { + return 1.0d; + } + if ("armor".equals(pool) && isArmorWeapon(blueWeapon)) { + return 1.0d; + } + if ("artillery".equals(pool) && isArtilleryWeapon(blueWeapon)) { + return 0.9d; + } + if ("missile".equals(pool) && hasMissileComponent(blueWeapon)) { + return 0.9d; + } + if ("ground".equals(pool) && isGroundWeapon(blueWeapon)) { + return 0.7d; + } + return 0.2d; +} + +function double computeDistanceFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); + Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); + if (!isCoordinateUsable(rc) || !isCoordinateUsable(bc)) { + return 0.5d; + } + double d = approxDistanceMeters( + rc.getLongitude().doubleValue(), + rc.getLatitude().doubleValue(), + bc.getLongitude().doubleValue(), + bc.getLatitude().doubleValue() + ); + int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); + if (maxDist <= 0) { + maxDist = 3000; + } + double ratio = d / (double) maxDist; + if (ratio <= 0.3d) { + return 1.0d; + } + if (ratio <= 0.6d) { + return 0.8d; + } + if (ratio <= 1.0d) { + return 0.5d; + } + return 0.0d; +} + +function double computeHeightFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); + Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); + if (rc == null || bc == null) { + return 0.6d; + } + int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); + int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); + int gap = Math.abs(rh - bh); + int maxGap = readIntCfg(cfg, "maxHeightGap", 800); + if (maxGap <= 0) { + maxGap = 800; + } + if (gap >= maxGap) { + return 0.0d; + } + double ratio = (double) gap / (double) maxGap; + return 1.0d - ratio; +} + +function double computeBlueThreatWeight(Weapon blueWeapon) { + if (blueWeapon == null) { + return 0.5d; + } + double t = 0.4d; + if (isAirWeapon(blueWeapon)) { + t += 0.3d; + } + if (isArmorWeapon(blueWeapon)) { + t += 0.2d; + } + if (hasMissileComponent(blueWeapon)) { + t += 0.2d; + } + if (blueWeapon.getNumber() != null && blueWeapon.getNumber().intValue() >= 2) { + t += 0.1d; + } + if (t > 1.0d) { + t = 1.0d; + } + return t; +} + +function String pickNearestBlueId(Weapon redWeapon, List blueWeapons) { + if (redWeapon == null || redWeapon.getCoordinate() == null || !isCoordinateUsable(redWeapon.getCoordinate()) || blueWeapons == null) { + return null; + } + String bestId = null; + double best = Double.MAX_VALUE; + for (Object obj : blueWeapons) { + Weapon b = (Weapon) obj; + if (b == null || isBlank(b.getEquipmentId()) || !isCoordinateUsable(b.getCoordinate())) { + continue; + } + double d = approxDistanceMeters( + redWeapon.getCoordinate().getLongitude().doubleValue(), + redWeapon.getCoordinate().getLatitude().doubleValue(), + b.getCoordinate().getLongitude().doubleValue(), + b.getCoordinate().getLatitude().doubleValue() + ); + if (d < best) { + best = d; + bestId = b.getEquipmentId(); + } + } + return bestId; +} + +function String pickAnyBlueId(List blueWeapons) { + if (blueWeapons == null || blueWeapons.isEmpty()) { + return null; + } + for (Object obj : blueWeapons) { + Weapon b = (Weapon) obj; + if (b != null && !isBlank(b.getEquipmentId())) { + return b.getEquipmentId(); + } + } + return null; +} + function Weapon pickUnboundRedWeaponForBlue(String blueId, List redWeapons) { if (redWeapons == null || redWeapons.isEmpty()) { return null; @@ -1077,7 +1668,7 @@ function void setWeaponFirstRangeParamAtLeast(Weapon weapon, int minRange) { } //------------------------------------------------------------------------------- -// component 映射解析 + 全组件数量覆盖 +// component 映射解析 + 仅导弹组件数量/参数覆盖 function Map parseDeviceNameMapping(String csv) { Map result = new java.util.HashMap(); if (csv == null) { @@ -1129,12 +1720,11 @@ function void applyAllComponentQuantities(FactTask fact, Map cfg) { String mappingCsv = cfg == null ? null : (String) cfg.get("componentDeviceNameMappingCsv"); Map deviceNameMapping = parseDeviceNameMapping(mappingCsv); - String skipKeyword = cfg == null ? null : (String) cfg.get("skipMissileComponentsByNameContains"); - if (skipKeyword != null) { - skipKeyword = skipKeyword.trim(); - if (skipKeyword.equals("")) { - skipKeyword = null; - } + String missileKeyword = cfg == null ? null : (String) cfg.get("missileComponentNameContains"); + if (missileKeyword == null || missileKeyword.trim().equals("")) { + missileKeyword = "导弹"; + } else { + missileKeyword = missileKeyword.trim(); } // 遍历红方每个武器:用 targetId 找蓝方装备(equipmentId) @@ -1182,8 +1772,8 @@ function void applyAllComponentQuantities(FactTask fact, Map cfg) { continue; } - // 跳过导弹组件覆盖,避免覆盖导弹联动偏移逻辑 - if (skipKeyword != null && blueCompName.contains(skipKeyword)) { + // 仅导弹组件参与匹配,非导弹组件保持红方原值 + if (!blueCompName.contains(missileKeyword)) { continue; } @@ -1223,8 +1813,12 @@ function void applyAllComponentQuantities(FactTask fact, Map cfg) { continue; } - // 只覆盖数量(componentParams[0].number) + // 覆盖导弹组件数量(componentParams[0].number) redFirst.setNumber(blueFirst.getNumber()); + // 覆盖导弹组件首参数默认值(如范围米/破坏范围米) + if (!isBlank(blueFirst.getAttDefaultValue())) { + redFirst.setAttDefaultValue(blueFirst.getAttDefaultValue()); + } } } } @@ -1262,33 +1856,530 @@ function void applyWeaponDeployment(FactTask fact, Map cfg, Map runtime) { String airPref = String.valueOf(cfg.get("airDeployZonePreference")); int groundH = readIntCfg(cfg, "groundDeployHeight", 20); int airH = readIntCfg(cfg, "airDeployHeight", 300); + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + String deployMode = resolveDeployModeByBlueState(blueTask, cfg); + Coordinate groundAnchor = pickAnchorByMode(deployMode, combatPoints, defensePoints, cursor); + Coordinate airAnchor = pickAnchorByMode("defense".equalsIgnoreCase(airPref) ? "near_slow" : deployMode, combatPoints, defensePoints, cursor); + String formationType = resolveFormationType(redTask, blueTask, cfg, deployMode); + int spacing = resolveFormationSpacing(redTask, blueTask, cfg); + int headingDeg = resolveFormationHeading(redTask, blueTask, cfg); + int mainWingDistance = resolveMainWingDistance(redTask, blueTask, cfg, deployMode); - for (Object obj : fact.getRedTask().getTaskWeapons()) { + List groundWeapons = new ArrayList(); + List airWeapons = new ArrayList(); + for (Object obj : redTask.getTaskWeapons()) { Weapon redWeapon = (Weapon) obj; if (redWeapon == null) { continue; } - Coordinate selected = null; if (isRedAirWeapon(redWeapon)) { - selected = pickCoordinateByPreference(combatPoints, defensePoints, cursor, airPref); - if (selected != null) { - selected = cloneCoordinateWithHeight(selected, airH); - } - } else if (defensePriorityWeapons.contains(redWeapon.getName())) { - selected = pickCoordinateByPreference(defensePoints, combatPoints, cursor, "defense"); - if (selected != null) { - selected = cloneCoordinateWithHeight(selected, groundH); - } + airWeapons.add(redWeapon); } else { - selected = pickCoordinateByPreference(combatPoints, defensePoints, cursor, "combat"); - if (selected != null) { - selected = cloneCoordinateWithHeight(selected, groundH); - } - } - if (selected != null) { - redWeapon.setCoordinate(selected); + groundWeapons.add(redWeapon); } } + + applyFormationForWeaponGroup(groundWeapons, groundAnchor, formationType, spacing, headingDeg, mainWingDistance, groundH, defensePriorityWeapons, combatPoints, defensePoints, cursor, null, null, null, false); + applyFormationForWeaponGroup(airWeapons, airAnchor, formationType, spacing, headingDeg, mainWingDistance, airH, defensePriorityWeapons, combatPoints, defensePoints, cursor, blueTask, cfg, deployMode, true); +} + +function void applyFormationForWeaponGroup(List weapons, Coordinate anchor, String formationType, int spacing, int headingDeg, int mainWingDistance, int defaultHeight, List defensePriorityWeapons, List combatPoints, List defensePoints, Map cursor, Task blueTask, Map cfg, String deployMode, boolean isAirGroup) { + if (weapons == null || weapons.isEmpty()) { + return; + } + List sortedWeapons = sortWeaponsByFormationRole(weapons); + if (anchor == null) { + for (int i = 0; i < sortedWeapons.size(); i++) { + Weapon w = (Weapon) sortedWeapons.get(i); + if (w == null) { + continue; + } + int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); + Coordinate fallback = null; + if (defensePriorityWeapons != null && defensePriorityWeapons.contains(w.getName())) { + fallback = pickCoordinateByPreference(defensePoints, combatPoints, cursor, "defense"); + } else { + fallback = pickCoordinateByPreference(combatPoints, defensePoints, cursor, "combat"); + } + if (fallback != null) { + w.setCoordinate(cloneCoordinateWithHeight(fallback, h)); + } + } + return; + } + List offsets = buildFormationOffsets(formationType, sortedWeapons.size(), spacing); + for (int i = 0; i < sortedWeapons.size(); i++) { + Weapon w = (Weapon) sortedWeapons.get(i); + if (w == null) { + continue; + } + int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); + Map off = i < offsets.size() ? (Map) offsets.get(i) : null; + double dx = off == null || off.get("dx") == null ? 0.0d : ((Double) off.get("dx")).doubleValue(); + double dy = off == null || off.get("dy") == null ? 0.0d : ((Double) off.get("dy")).doubleValue(); + if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole()) && w.getWingRelativeDistanceMeters() != null && w.getWingRelativeDistanceMeters().intValue() > 0) { + int dist = w.getWingRelativeDistanceMeters().intValue(); + int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); + dx = dist * Math.cos(Math.toRadians(bearing)); + dy = dist * Math.sin(Math.toRadians(bearing)); + } else if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole())) { + int dist = mainWingDistance; + int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); + dx = dist * Math.cos(Math.toRadians(bearing)); + dy = dist * Math.sin(Math.toRadians(bearing)); + } + Coordinate c = moveCoordinateByMeters(anchor, dx, dy, headingDeg, h); + if (c != null) { + w.setCoordinate(c); + if (w.getFormationRole() == null || w.getFormationRole().trim().equals("")) { + w.setFormationRole(i == 0 ? "MAIN" : "WING"); + } + } + } +} + +function String resolveDeployModeByBlueState(Task blueTask, Map cfg) { + double d = computeDefMinDistanceMeters(blueTask); + int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); + int fast = readIntCfg(cfg, "speedFastThreshold", 180); + int near = readIntCfg(cfg, "distanceNearDefenseThresholdMeters", 800); + int far = readIntCfg(cfg, "distanceFarDefenseThresholdMeters", 2500); + if (avgSpeed >= fast && d <= near) { + return "near_fast"; + } + if (avgSpeed >= fast && d >= far) { + return "far_fast"; + } + if (avgSpeed < fast && d <= near) { + return "near_slow"; + } + return "default"; +} + +function Coordinate pickAnchorByMode(String mode, List combatPoints, List defensePoints, Map cursor) { + if ("near_fast".equals(mode)) { + return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_fast"); + } + if ("far_fast".equals(mode)) { + return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "far_fast"); + } + if ("near_slow".equals(mode)) { + return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_slow"); + } + return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "default"); +} + +function String resolveFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { + String fromTask = redTask == null ? null : redTask.getFormationType(); + if (!isBlank(fromTask)) { + return normalizeFormationType(fromTask, cfg); + } + if (readBooleanCfg(cfg, "enableAutoFormationSelect", true)) { + String autoType = autoSelectFormationType(redTask, blueTask, cfg, deployMode); + if (!isBlank(autoType)) { + return normalizeFormationType(autoType, cfg); + } + } + String fromCfg = cfg == null ? null : String.valueOf(cfg.get("formationDefaultType")); + if (isBlank(fromCfg)) { + return "TRIANGLE"; + } + return normalizeFormationType(fromCfg, cfg); +} + +function String autoSelectFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { + int threat = parseIntSafe(blueTask == null ? null : blueTask.getThreatLevel(), 1); + int highThreat = readIntCfg(cfg, "formationHighThreatLevel", 3); + if (threat >= highThreat) { + return String.valueOf(cfg.get("formationRule_high_threat")); + } + if ("near_fast".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_near_fast")); + } + if ("far_fast".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_far_fast")); + } + if ("near_slow".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_near_slow")); + } + int largeGroupCount = readIntCfg(cfg, "formationLargeGroupCount", 6); + int weaponCount = redTask == null || redTask.getTaskWeapons() == null ? 0 : redTask.getTaskWeapons().size(); + if (weaponCount >= largeGroupCount) { + return String.valueOf(cfg.get("formationRule_large_group")); + } + double airRatio = computeRedAirRatio(redTask); + if (airRatio >= 0.5d) { + return String.valueOf(cfg.get("formationRule_air_majority")); + } + return String.valueOf(cfg.get("formationRule_default")); +} + +function double computeRedAirRatio(Task redTask) { + if (redTask == null || redTask.getTaskWeapons() == null || redTask.getTaskWeapons().isEmpty()) { + return 0.0d; + } + int total = 0; + int air = 0; + for (Object obj : redTask.getTaskWeapons()) { + Weapon w = (Weapon) obj; + if (w == null) { + continue; + } + total++; + if (isRedAirWeapon(w)) { + air++; + } + } + if (total <= 0) { + return 0.0d; + } + return (double) air / (double) total; +} + +function String normalizeFormationType(String input, Map cfg) { + String defaultType = cfg == null ? "TRIANGLE" : String.valueOf(cfg.get("formationDefaultType")); + if (isBlank(defaultType)) { + defaultType = "TRIANGLE"; + } + if (isBlank(input)) { + return defaultType.trim().toUpperCase(); + } + String t = input.trim().toUpperCase(); + if ("TRIANGLE".equals(t) || "DIAMOND".equals(t) || "LINE".equals(t) || "COLUMN".equals(t) || "WEDGE".equals(t)) { + return t; + } + return defaultType.trim().toUpperCase(); +} + +function int resolveFormationSpacing(Task redTask, Task blueTask, Map cfg) { + if (redTask != null && redTask.getFormationSpacingMeters() != null && redTask.getFormationSpacingMeters().intValue() > 0) { + return redTask.getFormationSpacingMeters().intValue(); + } + int fallback = readIntCfg(cfg, "formationDefaultSpacingMeters", 120); + double scale = computeDefenseZoneScaleMeters(blueTask); + if (scale <= 0.0d) { + return fallback; + } + int minSpacing = readIntCfg(cfg, "formationSpacingMinMeters", 60); + int maxSpacing = readIntCfg(cfg, "formationSpacingMaxMeters", 220); + int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); + int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); + double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); + return clampInt((int) Math.round(minSpacing + (maxSpacing - minSpacing) * t), minSpacing, maxSpacing); +} + +function int resolveFormationHeading(Task redTask, Task blueTask, Map cfg) { + if (redTask != null && redTask.getFormationHeadingDeg() != null) { + return redTask.getFormationHeadingDeg().intValue(); + } + Integer headingFromTrack = computeHeadingFromBlueTrack(blueTask); + if (headingFromTrack != null) { + return headingFromTrack.intValue(); + } + return readIntCfg(cfg, "formationHeadingDefaultDeg", 0); +} + +function int resolveMainWingDistance(Task redTask, Task blueTask, Map cfg, String deployMode) { + if (redTask != null && redTask.getMainWingDistanceMeters() != null && redTask.getMainWingDistanceMeters().intValue() > 0) { + return redTask.getMainWingDistanceMeters().intValue(); + } + int fallback = readIntCfg(cfg, "mainWingDistanceDefaultMeters", 100); + double scale = computeDefenseZoneScaleMeters(blueTask); + if (scale <= 0.0d) { + return fallback; + } + int minD = readIntCfg(cfg, "mainWingDistanceMinMeters", 60); + int maxD = readIntCfg(cfg, "mainWingDistanceMaxMeters", 260); + int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); + int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); + double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); + double base = minD + (maxD - minD) * t; + String key = "mainWingDistanceModeFactor_default"; + if ("near_fast".equals(deployMode)) { + key = "mainWingDistanceModeFactor_near_fast"; + } else if ("far_fast".equals(deployMode)) { + key = "mainWingDistanceModeFactor_far_fast"; + } else if ("near_slow".equals(deployMode)) { + key = "mainWingDistanceModeFactor_near_slow"; + } + double factor = readDoubleCfg(cfg, key, 1.0d); + int finalDist = (int) Math.round(base * factor); + return clampInt(finalDist, minD, maxD); +} + +function double computeDefenseZoneScaleMeters(Task blueTask) { + if (blueTask == null || blueTask.getDefZoneLocation() == null || blueTask.getDefZoneLocation().size() < 3) { + return -1.0d; + } + List points = blueTask.getDefZoneLocation(); + double maxD = -1.0d; + for (int i = 0; i < points.size(); i++) { + Coordinate a = (Coordinate) points.get(i); + if (a == null || a.getLongitude() == null || a.getLatitude() == null) { + continue; + } + for (int j = i + 1; j < points.size(); j++) { + Coordinate b = (Coordinate) points.get(j); + if (b == null || b.getLongitude() == null || b.getLatitude() == null) { + continue; + } + double d = approxDistanceMeters( + a.getLongitude().doubleValue(), + a.getLatitude().doubleValue(), + b.getLongitude().doubleValue(), + b.getLatitude().doubleValue() + ); + if (d > maxD) { + maxD = d; + } + } + } + return maxD; +} + +function double normalizeByRange(double value, double minV, double maxV) { + if (maxV <= minV) { + return 0.0d; + } + if (value <= minV) { + return 0.0d; + } + if (value >= maxV) { + return 1.0d; + } + return (value - minV) / (maxV - minV); +} + +function int clampInt(int value, int minV, int maxV) { + if (value < minV) { + return minV; + } + if (value > maxV) { + return maxV; + } + return value; +} + +/** 入参武器坐标高度>0 视为已指定部署高度 */ +function int readWeaponHeightIfValid(Weapon w) { + if (w == null || w.getCoordinate() == null || w.getCoordinate().getHeight() == null) { + return -1; + } + int h = w.getCoordinate().getHeight().intValue(); + return h > 0 ? h : -1; +} + +function int resolveBlueBaseHeight(Task blueTask, Map cfg) { + int fallback = readIntCfg(cfg, "airHeightFallback", readIntCfg(cfg, "airDeployHeight", 300)); + if (blueTask != null && blueTask.getTrackPoints() != null && !blueTask.getTrackPoints().isEmpty()) { + TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); + if (tail != null && tail.getHeight() != null && tail.getHeight().intValue() > 0) { + return tail.getHeight().intValue(); + } + } + if (blueTask != null && blueTask.getTaskWeapons() != null) { + int sum = 0; + int cnt = 0; + for (Object o : blueTask.getTaskWeapons()) { + Weapon bw = (Weapon) o; + if (bw == null || bw.getCoordinate() == null || bw.getCoordinate().getHeight() == null) { + continue; + } + int hh = bw.getCoordinate().getHeight().intValue(); + if (hh > 0) { + sum += hh; + cnt++; + } + } + if (cnt > 0) { + return sum / cnt; + } + } + return fallback; +} + +function int resolveRoleHeightAdjust(Weapon w, int indexInFormation, Map cfg) { + int mainAdj = readIntCfg(cfg, "airHeightAdjustMain", 20); + int wingAdj = readIntCfg(cfg, "airHeightAdjustWing", -10); + if (w != null && w.getFormationRole() != null && !w.getFormationRole().trim().equals("")) { + if ("MAIN".equalsIgnoreCase(w.getFormationRole())) { + return mainAdj; + } + if ("WING".equalsIgnoreCase(w.getFormationRole())) { + return wingAdj; + } + } + return indexInFormation == 0 ? mainAdj : wingAdj; +} + +function int computeAutoAirHeight(Weapon w, Task blueTask, Map cfg, int indexInFormation) { + int minH = readIntCfg(cfg, "airHeightMin", 50); + int maxH = readIntCfg(cfg, "airHeightMax", 20000); + int base = resolveBlueBaseHeight(blueTask, cfg); + int speedTh = readIntCfg(cfg, "airHeightSpeedThreshold", 180); + int fastAdj = readIntCfg(cfg, "airHeightAdjustFast", 40); + int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); + int speedAdj = (avgSpeed >= speedTh) ? fastAdj : 0; + double d = computeDefMinDistanceMeters(blueTask); + int nearD = readIntCfg(cfg, "airHeightNearDefenseDistance", 800); + int farD = readIntCfg(cfg, "airHeightFarDefenseDistance", 2500); + int nearAdj = readIntCfg(cfg, "airHeightAdjustNear", -30); + int farAdj = readIntCfg(cfg, "airHeightAdjustFar", 40); + int distAdj = 0; + if (d < Double.MAX_VALUE / 4.0d) { + if (d <= (double) nearD) { + distAdj = nearAdj; + } else if (d >= (double) farD) { + distAdj = farAdj; + } + } + int roleAdj = resolveRoleHeightAdjust(w, indexInFormation, cfg); + int sum = base + speedAdj + distAdj + roleAdj; + return clampInt(sum, minH, maxH); +} + +/** + * 空中武器部署高度:1) 入参已给高度优先 2) 开启自动则混合计算 3) 否则固定 airDeployHeight + * 地面武器:始终使用 defaultHeight(isAirGroup=false) + */ +function int resolveWeaponDeployHeight(Weapon w, Task blueTask, Map cfg, String deployMode, int indexInFormation, int defaultHeight, boolean isAirGroup) { + if (!isAirGroup) { + return defaultHeight; + } + int given = readWeaponHeightIfValid(w); + if (given > 0) { + return given; + } + if (cfg == null || !readBooleanCfg(cfg, "enableAutoAirDeployHeight", true)) { + return defaultHeight; + } + return computeAutoAirHeight(w, blueTask, cfg, indexInFormation); +} + +function Integer computeHeadingFromBlueTrack(Task blueTask) { + if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().size() < 2) { + return null; + } + List points = blueTask.getTrackPoints(); + TrackPoints p2 = (TrackPoints) points.get(points.size() - 1); + TrackPoints p1 = (TrackPoints) points.get(points.size() - 2); + if (p1 == null || p2 == null || p1.getLongitude() == null || p1.getLatitude() == null || p2.getLongitude() == null || p2.getLatitude() == null) { + return null; + } + double dLon = p2.getLongitude().doubleValue() - p1.getLongitude().doubleValue(); + double dLat = p2.getLatitude().doubleValue() - p1.getLatitude().doubleValue(); + if (Math.abs(dLon) < 1e-12 && Math.abs(dLat) < 1e-12) { + return null; + } + double deg = Math.toDegrees(Math.atan2(dLon, dLat)); + int heading = (int) Math.round(deg); + if (heading < 0) { + heading += 360; + } + if (heading >= 360) { + heading = heading % 360; + } + return Integer.valueOf(heading); +} + +function List sortWeaponsByFormationRole(List weapons) { + List mainList = new ArrayList(); + List wingList = new ArrayList(); + List unknownList = new ArrayList(); + for (Object obj : weapons) { + Weapon w = (Weapon) obj; + if (w == null) { + continue; + } + String role = w.getFormationRole(); + if (role != null && "MAIN".equalsIgnoreCase(role)) { + mainList.add(w); + } else if (role != null && "WING".equalsIgnoreCase(role)) { + wingList.add(w); + } else { + unknownList.add(w); + } + } + List result = new ArrayList(); + if (!mainList.isEmpty()) { + result.addAll(mainList); + result.addAll(wingList); + result.addAll(unknownList); + return result; + } + if (!unknownList.isEmpty()) { + result.add(unknownList.get(0)); + for (int i = 1; i < unknownList.size(); i++) { + result.add(unknownList.get(i)); + } + result.addAll(wingList); + return result; + } + result.addAll(wingList); + return result; +} + +function List buildFormationOffsets(String formationType, int size, int spacing) { + List result = new ArrayList(); + if (size <= 0) { + return result; + } + String type = formationType == null ? "TRIANGLE" : formationType.trim().toUpperCase(); + result.add(buildOffset(0.0d, 0.0d)); + for (int i = 1; i < size; i++) { + if ("DIAMOND".equals(type)) { + if (i == 1) { + result.add(buildOffset(-spacing, -spacing)); + } else if (i == 2) { + result.add(buildOffset(spacing, -spacing)); + } else if (i == 3) { + result.add(buildOffset(0.0d, -2.0d * spacing)); + } else { + int row = (i - 4) / 2 + 1; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * spacing * (row + 1), -spacing * (row + 2))); + } + } else if ("LINE".equals(type)) { + int sign = (i % 2 == 0) ? 1 : -1; + int k = (i + 1) / 2; + result.add(buildOffset(sign * k * spacing, 0.0d)); + } else if ("COLUMN".equals(type)) { + result.add(buildOffset(0.0d, -i * spacing)); + } else if ("WEDGE".equals(type)) { + int layer = (i + 1) / 2; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * layer * spacing, -layer * spacing)); + } else { // TRIANGLE/default + int layer = (i + 1) / 2; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * layer * spacing, -layer * spacing)); + } + } + return result; +} + +function Map buildOffset(double dx, double dy) { + Map m = new java.util.HashMap(); + m.put("dx", Double.valueOf(dx)); + m.put("dy", Double.valueOf(dy)); + return m; +} + +function Coordinate moveCoordinateByMeters(Coordinate anchor, double dxMeters, double dyMeters, int headingDeg, int height) { + if (anchor == null || anchor.getLongitude() == null || anchor.getLatitude() == null) { + return null; + } + double rad = Math.toRadians((double) headingDeg); + double rx = (dxMeters * Math.cos(rad)) - (dyMeters * Math.sin(rad)); + double ry = (dxMeters * Math.sin(rad)) + (dyMeters * Math.cos(rad)); + double lat = anchor.getLatitude().doubleValue() + metersToLatDeg(ry); + double lon = anchor.getLongitude().doubleValue() + metersToLonDeg(rx, anchor.getLatitude().doubleValue()); + Coordinate c = new Coordinate(); + c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); + c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); + c.setHeight(height); + return c; } function void applyTrajectoryGeneration(FactTask fact, Map cfg) { diff --git a/auto-solution-rule/src/main/resources/rules/rule.drl b/auto-solution-rule/src/main/resources/rules/rule.drl new file mode 100644 index 0000000..e69de29 From 3e871e2dbda1eeeb7571254501fffe2607a3eb0d Mon Sep 17 00:00:00 2001 From: MHW Date: Tue, 7 Apr 2026 10:02:31 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9Ajava=E4=BB=A3=E7=A0=81=E5=B1=82=E9=9D=A2=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/ultimately/fact/DroolsFact.java | 20 +++++++++++++++++ .../service/impl/FireRuleServiceImpl.java | 22 +++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/fact/DroolsFact.java diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/fact/DroolsFact.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/fact/DroolsFact.java new file mode 100644 index 0000000..815a2e0 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/fact/DroolsFact.java @@ -0,0 +1,20 @@ +package com.solution.rule.domain.ultimately.fact; + +import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; +import lombok.Data; + +import java.util.List; + +@Data +public class DroolsFact { + + //蓝方任务列表 + private FireRuleTaskInputDTO task; + + //红方武器库 + private List redWeapons; + + private FireRuleOutputVO fireRuleOutputVO; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java index d9773f8..7c8971a 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java @@ -9,7 +9,9 @@ import com.solution.rule.domain.simplerulepojo.Task; import com.solution.rule.domain.simplerulepojo.Weapon; import com.solution.rule.domain.simplerulepojo.fact.FactTask; import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO; import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.fact.DroolsFact; import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; import com.solution.rule.domain.vo.ComponentCountVO; import com.solution.rule.domain.vo.PlatformComponentNamesVO; @@ -202,16 +204,28 @@ public class FireRuleServiceImpl implements FireRuleService { if(CollUtil.isEmpty( tasks)){ throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); } + //创建KieSession KieSession kieSession = kieBase.newKieSession(); + //设置Drools全局变量 Map globalParams = new HashMap<>(); kieSession.setGlobal("globalParams", globalParams); + //获取红方武器库 + List redWeapons = task.getRedWeapons(); + //创建返回数据 + FireRuleOutputVO fireRuleOutputVO = new FireRuleOutputVO(); + fireRuleOutputVO.setSourceFile(task.getSourceFile()); + + DroolsFact droolsFact = new DroolsFact(); + droolsFact.setRedWeapons(redWeapons); + +// droolsFact.getFireRuleOutputVO().setRedWeapons(redWeapons); + droolsFact.setFireRuleOutputVO(fireRuleOutputVO); for (FireRuleTaskInputDTO fireRuleTaskInputDTO : tasks) { - - + droolsFact.setTask(fireRuleTaskInputDTO); + kieSession.insert(droolsFact); } - FireRuleOutputVO FireRuleOutputVO = new FireRuleOutputVO(); - return FireRuleOutputVO; + return droolsFact.getFireRuleOutputVO(); } /** From 866fd215f2854ad888c0d7da0f4e37ec13891308 Mon Sep 17 00:00:00 2001 From: MHW Date: Tue, 7 Apr 2026 11:23:27 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9Ajava=E9=9D=99=E6=80=81=E6=96=B9=E6=B3=95=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ultimately/dto/FireRuleInputDTO.java | 12 +- .../dto/FireRuleInputForcePostureDTO.java | 19 + .../dto/FireRuleInputForceSideDTO.java | 26 + .../dto/FireRuleInputRedCircleStyleDTO.java | 20 - .../dto/FireRuleInputRedLeadPayloadDTO.java | 34 - .../dto/FireRuleInputRedLeadPositionDTO.java | 18 - .../dto/FireRuleInputRedWeaponElementDTO.java | 40 +- .../dto/FireRuleInputRedWingItemDTO.java | 17 - .../domain/ultimately/dto/package-info.java | 3 +- .../rule/parser/JsonStreamParser.java | 120 - .../service/impl/FireRuleServiceImpl.java | 26 +- .../com/solution/rule/utils/RuleFunction.java | 34 + .../src/main/resources/legacy/fire-rule.drl | 3500 +++++++++++++++++ .../src/main/resources/rules/rule.drl | 37 + 14 files changed, 3662 insertions(+), 244 deletions(-) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForcePostureDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForceSideDTO.java delete mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java delete mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java delete mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java delete mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java delete mode 100644 auto-solution-rule/src/main/java/com/solution/rule/parser/JsonStreamParser.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java create mode 100644 auto-solution-rule/src/main/resources/legacy/fire-rule.drl diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java index 9c30a96..eca1ac9 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputDTO.java @@ -1,6 +1,7 @@ package com.solution.rule.domain.ultimately.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; @@ -23,7 +24,14 @@ public class FireRuleInputDTO { private List tasks; /** - * 红方侧异构条目列表(武器、场景任务节点、装备、指挥所、防区等) + * 红方装备等条目列表,对应 JSON 键 {@code redWeapons}(当前 {@link FireRuleInputRedWeaponElementDTO} 与装备结构一致) */ - private List redWeapons; + @JsonProperty("equipments") + private List equipments; + + /** + * 阵营与姿态关系列表,对应 JSON 键 {@code ForceSides} + */ + @JsonProperty("ForceSides") + private List forceSides; } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForcePostureDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForcePostureDTO.java new file mode 100644 index 0000000..14d1eab --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForcePostureDTO.java @@ -0,0 +1,19 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 阵营侧一方与其它方的姿态关系项 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputForcePostureDTO { + + @JsonProperty("ObjectHandle") + private String objectHandle; + + @JsonProperty("Type") + private Integer type; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForceSideDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForceSideDTO.java new file mode 100644 index 0000000..5171e87 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputForceSideDTO.java @@ -0,0 +1,26 @@ +package com.solution.rule.domain.ultimately.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 阵营侧(ForceSides 数组中的一项) + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleInputForceSideDTO { + + private String groupType; + + @JsonProperty("Postures") + private List postures; + + @JsonProperty("ObjectHandle") + private String objectHandle; + + @JsonProperty("ForceSideName") + private String forceSideName; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java deleted file mode 100644 index de251a8..0000000 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedCircleStyleDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.solution.rule.domain.ultimately.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -/** - * 防区圆形条目中 isWing 为对象时的样式字段 - */ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class FireRuleInputRedCircleStyleDTO { - - private String outlineWidth; - - private String lineType; - - private String outlineColor; - - private String color; -} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java deleted file mode 100644 index 6acd324..0000000 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPayloadDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.solution.rule.domain.ultimately.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -import java.util.List; - -/** - * redWeapons 条目中 isLead:可能是长机编队参数,也可能是圆形防区参数(字段并集) - */ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class FireRuleInputRedLeadPayloadDTO { - - private String leader; - - private String side; - - private String supportType; - - private List positions; - - private String drawName; - - private String airspaceType; - - private String selectLonLat; - - private String radius; - - private String height; - - private String extrudedHeight; -} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java deleted file mode 100644 index 96be030..0000000 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedLeadPositionDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.solution.rule.domain.ultimately.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -/** - * 长机/圆形等结构中的坐标点(示例中可能为数值或占位字符串) - */ -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class FireRuleInputRedLeadPositionDTO { - - private String longitude; - - private String latitude; - - private String height; -} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java index 1f0b3de..462f7ed 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java @@ -4,44 +4,16 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import java.util.List; import java.util.Map; /** - * 输入 JSON 中 {@code redWeapons} 数组元素并集:武器摘要、红方装备、营指挥所、防区圆形等形态共用此类。 - *

- * {@code isWing} 在 JSON 中可能为僚机数组或圆形样式对象,故使用 {@link Object} 承接;可结合 - * {@link FireRuleInputRedWingItemDTO}、{@link FireRuleInputRedCircleStyleDTO} 在业务层转型。 + * {@code redWeapons} 中红方装备(platform)条目,与 {@code 火力规则输入-无注释.json} 中带 + * {@code SubComponents} 的装备对象字段一致。 */ @Data @JsonIgnoreProperties(ignoreUnknown = true) public class FireRuleInputRedWeaponElementDTO { - private String name; - - @JsonProperty("Name") - private String displayName; - - private String id; - - @JsonProperty("EquipmentID") - private String equipmentId; - - private List components; - - private Object number; - - private String successTargetRad; - - private FireRuleInputRedLeadPayloadDTO isLead; - - private Object isWing; - - /** - * 装备类条目中为 {@code equipment} 等 - */ - private String groupType; - @JsonProperty("SupportType") private String supportType; @@ -59,6 +31,14 @@ public class FireRuleInputRedWeaponElementDTO { private Boolean isDefendImportantPlace; + private String groupType; + + @JsonProperty("EquipmentID") + private String equipmentId; + + @JsonProperty("Name") + private String name; + @JsonProperty("OwnerForceSide") private String ownerForceSide; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java deleted file mode 100644 index be303e3..0000000 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWingItemDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.solution.rule.domain.ultimately.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class FireRuleInputRedWingItemDTO { - - private String name; - - private String distance; - - private String angle; - - private String alt; -} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java index 58083f2..3511969 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/package-info.java @@ -1,7 +1,6 @@ /** * 火力规则输入侧 DTO,与 {@code resources/json/火力规则输入-无注释.json} 对齐。 *

- * {@code redWeapons} 数组元素为并集类型 {@link com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO}, - * 常见形态包括:武器摘要、红方装备(含子组件)、营指挥所、防区圆形等。 + * {@code redWeapons} 中装备项为 {@link com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO}(含 {@code SubComponents})。 */ package com.solution.rule.domain.ultimately.dto; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/parser/JsonStreamParser.java b/auto-solution-rule/src/main/java/com/solution/rule/parser/JsonStreamParser.java deleted file mode 100644 index 7160594..0000000 --- a/auto-solution-rule/src/main/java/com/solution/rule/parser/JsonStreamParser.java +++ /dev/null @@ -1,120 +0,0 @@ -//package com.solution.rule.parser; -// -//import com.fasterxml.jackson.core.JsonParser; -//import com.fasterxml.jackson.core.JsonToken; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import javax.servlet.http.HttpServletRequest; -//import java.io.IOException; -//import java.util.*; -// -//public class JsonStreamParser { -// -// // 核心:解析所有集合 → 内存关联ID → 组装完整数据 -// public List parseAndAssemble(HttpServletRequest request) throws IOException { -// ObjectMapper mapper = new ObjectMapper(); -// try (JsonParser parser = mapper.getFactory().createParser(request.getInputStream())) { -// -// // ========== 步骤1:流式解析,把所有关联集合存到内存 ========== -// String version = null; -// // 存储所有集合:key=集合名(weaponList/weaponParams),value=数据列表 -// Map>> allCollections = new HashMap<>(); -// -// // 解析状态 -// String currentCollection = null; -// Map currentItem = null; -// -// JsonToken token; -// while ((token = parser.nextToken()) != null) { -// switch (token) { -// case START_OBJECT: -// if (currentCollection != null) currentItem = new HashMap<>(); -// break; -// case END_OBJECT: -// if (currentCollection != null && currentItem != null) { -// allCollections.get(currentCollection).add(currentItem); -// currentItem = null; -// } -// break; -// case START_ARRAY: -// currentCollection = parser.getCurrentName(); -// allCollections.putIfAbsent(currentCollection, new ArrayList<>()); -// break; -// case END_ARRAY: -// currentCollection = null; -// break; -// case FIELD_NAME: -// String field = parser.getCurrentName(); -// // 解析版本号 -// if ("version".equals(field) && isInMeta(parser)) { -// version = parser.nextTextValue(); -// break; -// } -// // 解析普通字段 -// if (currentItem != null) { -// parser.nextToken(); -// currentItem.put(field, getValue(parser)); -// } -// break; -// } -// } -// -// // ========== 步骤2:核心!通过ID关联匹配,组装完整数据 ========== -// return assembleFullWeaponData(allCollections); -// } -// } -// -// /** -// * 【核心逻辑】ID关联匹配:武器列表 + 参数列表 → 完整武器 -// */ -// private List assembleFullWeaponData(Map>> allCollections) { -// List result = new ArrayList<>(); -// -// // 1. 获取武器主列表 -// List> weaponList = allCollections.getOrDefault("weaponList", Collections.emptyList()); -// // 2. 获取武器参数列表 -// List> paramList = allCollections.getOrDefault("weaponParams", Collections.emptyList()); -// -// // 3. 构建【ID -> 参数】索引Map(O(1)快速匹配,效率最高) -// Map> paramIndex = new HashMap<>(); -// for (Map param : paramList) { -// Long weaponId = Long.valueOf(param.get("weaponId").toString()); -// paramIndex.put(weaponId, param); -// } -// -// // 4. 遍历武器,通过ID匹配参数,组装完整对象 -// for (Map weapon : weaponList) { -// AssembledWeapon fullWeapon = new AssembledWeapon(); -// Long weaponId = Long.valueOf(weapon.get("id").toString()); -// -// // 填充基础信息 -// fullWeapon.setId(weaponId); -// fullWeapon.setName((String) weapon.get("name")); -// -// // 匹配参数(通过ID) -// Map param = paramIndex.get(weaponId); -// if (param != null) { -// fullWeapon.setDamage(Integer.valueOf(param.get("damage").toString())); -// fullWeapon.setMagazine(Integer.valueOf(param.get("magazine").toString())); -// fullWeapon.setType((String) param.get("type")); -// } -// -// result.add(fullWeapon); -// } -// -// return result; -// } -// -// // ---------------- 工具方法 ---------------- -// private boolean isInMeta(JsonParser parser) { -// return parser.getParsingContext().getParent() != null -// && "meta".equals(parser.getParsingContext().getParent().getCurrentName()); -// } -// -// private Object getValue(JsonParser parser) throws IOException { -// if (parser.getCurrentToken().isNumeric()) return parser.getLongValue(); -// if (parser.getCurrentToken() == JsonToken.VALUE_STRING) return parser.getText(); -// if (parser.getCurrentToken() == JsonToken.VALUE_TRUE) return true; -// if (parser.getCurrentToken() == JsonToken.VALUE_FALSE) return false; -// return null; -// } -//} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java index 7c8971a..1d93c65 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java @@ -9,6 +9,7 @@ import com.solution.rule.domain.simplerulepojo.Task; import com.solution.rule.domain.simplerulepojo.Weapon; import com.solution.rule.domain.simplerulepojo.fact.FactTask; import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleInputForceSideDTO; import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO; import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; import com.solution.rule.domain.ultimately.fact.DroolsFact; @@ -209,8 +210,20 @@ public class FireRuleServiceImpl implements FireRuleService { //设置Drools全局变量 Map globalParams = new HashMap<>(); kieSession.setGlobal("globalParams", globalParams); + kieSession.insert(globalParams); + //获取红方阵营id + String redObjectHandleId = getObjectHandle(task); + if(ObjectUtil.isEmpty(redObjectHandleId)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + //获取所有武器库 + List allWeapons = task.getEquipments(); //获取红方武器库 - List redWeapons = task.getRedWeapons(); + List redWeapons = allWeapons.stream() + .filter(weapon -> redObjectHandleId.equals(weapon.getOwnerForceSide())) + .collect(Collectors.toList()); + + //创建返回数据 FireRuleOutputVO fireRuleOutputVO = new FireRuleOutputVO(); fireRuleOutputVO.setSourceFile(task.getSourceFile()); @@ -259,4 +272,15 @@ public class FireRuleServiceImpl implements FireRuleService { return ruleMapper.findAllBasicPlatformComponents(); } + + /** + * 获取红方阵营id + * @param task + * @return + */ + private String getObjectHandle(FireRuleInputDTO task){ + List forceSides = task.getForceSides(); + List collect = forceSides.stream().filter(f -> "红方".equals(f.getForceSideName())).collect(Collectors.toList()); + return collect.get(0).getObjectHandle(); + } } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java new file mode 100644 index 0000000..f642ef4 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java @@ -0,0 +1,34 @@ +package com.solution.rule.utils; + +import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.fact.DroolsFact; + +import java.util.Map; + +/** + * 规则函数方法 + */ +public class RuleFunction { + + + /** + * 装备匹配 + */ + public static void equipmentRule(DroolsFact task, Map globalParams){ + //空中总分数 + Integer airScore = 0; + //反坦克总分数 + Integer antitankScore = 0; + //远程打击总分数 + Integer remoteScore = 0; + + FireRuleTaskInputDTO blueTask = task.getTask(); + + //权重因子 + Integer weight = (Integer) globalParams.get("weight"); + String drawName = blueTask.getDrawName(); + if("".contains(drawName)){ + + } + } +} diff --git a/auto-solution-rule/src/main/resources/legacy/fire-rule.drl b/auto-solution-rule/src/main/resources/legacy/fire-rule.drl new file mode 100644 index 0000000..af8804a --- /dev/null +++ b/auto-solution-rule/src/main/resources/legacy/fire-rule.drl @@ -0,0 +1,3500 @@ +package rules; + +import com.solution.rule.domain.simplerulepojo.fact.FactTask; +import com.solution.rule.domain.simplerulepojo.Task; +import com.solution.rule.domain.simplerulepojo.Weapon; +import com.solution.rule.domain.simplerulepojo.SubComponents; +import com.solution.rule.domain.simplerulepojo.ComponentParam; +import com.solution.rule.domain.simplerulepojo.Coordinate; +import com.solution.rule.domain.simplerulepojo.TrackPoints; + +import java.util.List; +import java.util.Map; +import java.util.ArrayList; + +global java.util.Map globalParams; + +//------------------------------------------------------------------------------- +rule "任务匹配1" +agenda-group "打击任务" +salience 100 +when +then + // legacy 占位:旧的固定字符串匹配已停用,改由“任务自动匹配规则”统一处理。 +end +//------------------------------------------------------------------------------- +rule "任务匹配2" +agenda-group "打击任务" +salience 100 +when +then + // legacy 占位:旧的固定字符串匹配已停用,改由“任务自动匹配规则”统一处理。 +end +//------------------------------------------------------------------------------- +rule "威胁等级规则" +agenda-group "打击任务" +salience 90 +when + //如果蓝方威胁等级大于等于3,则全局武器数量为3,添加插入导弹发射车辆和防空导弹武器 + $task : FactTask(blueTask.side == "蓝方",blueTask.threatLevel >= "3") + $redTask : FactTask(redTask.side == "红方") +then + //设置平台下组件的数量 + globalParams.put("platNum",3); + //威胁等级大于等于3固定插入导弹发射车辆 + // ========== 调用函数 ========== + threatLevels($redTask, globalParams); +end +//------------------------------------------------------------------------------- +rule "地面类型匹配规则" +agenda-group "打击任务" +salience 80 +when + //如果蓝方武器为地面类型且高度不超过500米,则使用插入空中力量打击 + $task : FactTask(blueTask.side == "蓝方") + $weapons : List() from $task.blueTask.taskWeapons + $weapon : Weapon(supportType == "ground") from $weapons +then + Task redTask = $task.getRedTask(); + List taskWeapons = redTask.getTaskWeapons(); + Weapon weapon = new Weapon(); + weapon.setName("F-16"); + weapon.setNumber((Integer) globalParams.get("platNum")); + weapon.setSupportType("plane"); + taskWeapons.add(weapon); +end +//------------------------------------------------------------------------------- +rule "空中类型匹配规则" +agenda-group "打击任务" +salience 80 +when + //如果蓝方武器为地面类型且高度不超过500米,则使用插入空中力量打击 + $task : FactTask(blueTask.side == "蓝方") + $weapons : List() from $task.blueTask.taskWeapons + $weapon : Weapon(supportType == "overhead") from $weapons +then + Task redTask = $task.getRedTask(); + List taskWeapons = redTask.getTaskWeapons(); + Weapon weapon = new Weapon(); + weapon.setName("F-16"); + weapon.setNumber((Integer) globalParams.get("platNum")); + weapon.setSupportType("plane"); + taskWeapons.add(weapon); +end +//------------------------------------------------------------------------------- +rule "装备组件匹配" +agenda-group "打击任务" +salience 70 +when +then + // legacy 规则已停用:完整武器库逻辑已在 //TODO 下接管。 + // 保留该规则名称便于回滚和历史追踪,不再执行任何动作。 +end +//------------------------------------------------------------------------------- +rule "组件参数匹配" +agenda-group "打击任务" +salience 60 +when +then + // legacy 占位规则:参数处理已并入“红方武器自适应装配规则/导弹联动增强规则”。 +end +//------------------------------------------------------------------------------- +//TODO +//------------------------------------------------------------------------------- +// ========================= 业务可改区(只改这里) ========================= +// 说明: +// 1) 业务人员只改 buildBusinessConfig() 里的值,其他函数不要改。 +// 2) 规则是“严格白名单”,未命中条件时允许不匹配(不新增红方武器)。 + // 3) 可通过开关控制是否启用空中/地面/装甲/导弹联动策略。 + // 4) 业务可直接配置“蓝方类型 -> 红方方案(多选)”,例如坦克可选火箭或导弹系统。 + +function Map buildBusinessConfig() { + Map cfg = new java.util.HashMap(); + + // ---------- 红方完整武器库名称映射(可改) ---------- + cfg.put("redStrikeDroneName", "火力打击无人机"); + cfg.put("redArmedHelicopterName", "武装直升机"); + cfg.put("redHowitzerName", "迫榴炮"); + cfg.put("redVehicleMortarName", "车载迫击炮"); + cfg.put("redAaWeaponName", "防空导弹武器"); + cfg.put("redAtRocketName", "反坦克火箭"); + cfg.put("redAtMissileSystemName", "反坦克导弹系统"); + cfg.put("redMissileVehicleName", "导弹发射车"); + + // ---------- 白名单开关(可改) ---------- + cfg.put("enableAirRule", Boolean.TRUE); // 蓝方空中 -> 红方空中反制组 + cfg.put("enableGroundRule", Boolean.TRUE); // 蓝方地面 -> 红方炮类反制组 + cfg.put("enableArmorRule", Boolean.TRUE); // 蓝方装甲 -> 红方反坦克组 + cfg.put("enableMissileVehicleRule", Boolean.FALSE); // 蓝方导弹 -> 红方导弹发射车(默认关) + cfg.put("enableMissileLinkage", Boolean.TRUE); // 导弹参数联动开关 + cfg.put("allowMultiGroup", Boolean.TRUE); // true=允许多组叠加,false=命中首组即停止 + cfg.put("enableArmedHelicopterOnAir", Boolean.TRUE); + + // ---------- 过程驱动整数加分引擎(可改) ---------- + cfg.put("enableRuleScoring", Boolean.TRUE); // true=过程驱动整数加分;false=回退旧白名单 + cfg.put("minScoreToAssign", 1); // 最低入选分(整数) + cfg.put("nearDefenseDistanceMeters", 500); // 近防区距离阈值 + cfg.put("highThreatLevel", 3); // 高威胁阈值 + cfg.put("highTargetCount", 2); // 蓝方数量阈值 + cfg.put("score_type_antiArmor", 1); // 蓝方装甲 -> 反坦克类加分 + cfg.put("score_nearDefense_artillery", 1); // 近防区 -> 迫榴炮类加分 + cfg.put("score_highThreat_missile", 1); // 高威胁 -> 导弹/防空类加分 + cfg.put("score_highCount_artillery", 1); // 蓝方数量高 -> 炮类加分 + cfg.put("score_hasMissile_airDefence", 1); // 蓝方有导弹 -> 防空类加分 + + // ---------- 数量与参数(可改) ---------- + cfg.put("defaultAirNum", 1); + cfg.put("defaultGroundNum", 1); + cfg.put("defaultMissileVehicleNum", 1); + cfg.put("shellRangeDefault", "1500"); // 炮类单位固定:范围米 + cfg.put("missileCountOffset", 1); // 红方导弹数量 = 蓝方 + offset + cfg.put("missileRangeOffset", 80); // 红方导弹范围增量 + cfg.put("blueMissileRangeDefault", 220); // 蓝方导弹范围默认值 + cfg.put("minBlueMissileCountForLinkage", 1); // 联动触发门槛 + + + // ---------- 命中率与动态火力(可改) ---------- + cfg.put("hitRateCsv", "防空导弹武器=0.72,火力打击无人机=0.62,武装直升机=0.68,反坦克火箭=0.55,反坦克导弹系统=0.78,迫榴炮=0.45,车载迫击炮=0.43,导弹发射车=0.82"); + cfg.put("defaultHitRateFallback", "0.6"); // 兜底命中率 + cfg.put("desiredKillProbability", "0.9"); // 期望毁伤置信度 + cfg.put("offsetCsvByWeapon", ""); // 显式offset(武器=offset)优先,例:反坦克火箭=1,武装直升机=2 + cfg.put("hitRateThreshold", "0.7"); // 命中率阈值:低于该值触发阶梯增量 + cfg.put("hitRateGapStep1Max", "0.5"); // gap第一档上界(gap=threshold-hitRate) + cfg.put("hitRateGapStep2Max", "1.0"); // gap第二档上界 + cfg.put("hitRateStep1Offset", 1); // 第一档固定增量 + cfg.put("hitRateStep2Offset", 2); // 第二档固定增量 + cfg.put("enableDynamicMultiRedPerBlue", Boolean.TRUE); // 按命中率动态决定每个蓝目标需要几个红武器 + cfg.put("minRedWeaponsPerBlueTarget", 1); // 每个蓝目标最少分配红武器数量 + cfg.put("maxRedWeaponsPerBlueTargetCap", 3); // 每个蓝目标最多分配红武器数量上限 + cfg.put("enableRangeSanityCheck", Boolean.TRUE); // 距离-射程合理性校验开关 + cfg.put("enableAutoRangeRecommend", Boolean.TRUE); // 射程不足时自动调参 + cfg.put("rangeSafetyMarginMeters", 50); // 射程安全余量 + //还是简单 + + // ---------- 仅导弹组件匹配(可改) ---------- + // 逻辑:按红方武器 targetId 找到对应蓝方装备(equipmentId),仅覆盖“导弹组件”的数量与首参数 + cfg.put("enableComponentQuantityMatch", Boolean.TRUE); + // 格式示例:蓝穿甲弹->红穿甲弹,蓝火控雷达->红火控雷达;为空则默认 deviceName 一致匹配 + cfg.put("componentDeviceNameMappingCsv", ""); + // 仅匹配:蓝方组件 deviceName 包含该关键词时才匹配 + cfg.put("missileComponentNameContains", "导弹"); + + // ---------- 任务自动命名模板(可改) ---------- + // 任务分类优先级:导弹突击 > 防空压制 > 反装甲打击 > 炮火压制 > 通用打击 + cfg.put("taskName_missile_strike", "导弹突击打击任务"); + cfg.put("taskName_air_defence", "防空压制打击任务"); + cfg.put("taskName_anti_armor", "反装甲打击任务"); + cfg.put("taskName_artillery", "炮火压制打击任务"); + cfg.put("taskName_general", "通用打击任务"); + cfg.put("taskDataType_missile_strike", "missile-strike"); + cfg.put("taskDataType_air_defence", "air-defence"); + cfg.put("taskDataType_anti_armor", "anti-armor"); + cfg.put("taskDataType_artillery", "artillery"); + cfg.put("taskDataType_general", "strike"); + + // ---------- targetId 自动绑定(可改) ---------- + cfg.put("enableTargetAutoBind", Boolean.TRUE); // 是否自动给红方武器绑定蓝方目标 + cfg.put("minTargetBindRatio", "0.7"); // 最低绑定比例(大部分有目标) + cfg.put("allowReserveWithoutTarget", Boolean.TRUE); // 允许少量武器 targetId 为空(火力冗余) + cfg.put("w_target_type", "0.30"); // target分配:类型匹配权重 w_target_type 越大,规则越“看重类型对口”。 + cfg.put("w_target_dist", "0.25"); // target分配:距离权重 w_target_dist 越大,系统越偏向“更近/更容易打到”的目标 射程不足会被直接淘汰,不参与加权计算 + cfg.put("w_target_height", "0.10"); // target分配:高度差权重 作用:w_target_height 越大,系统越偏向“高度层更匹配”的目标(例如空中平台对空中目标、地面平台对地面目标更自然) + cfg.put("w_target_hit", "0.20"); // target分配:命中率权重 w_target_hit 越大,高命中率武器越容易拿到更高分,从而优先绑定目标。 + cfg.put("w_target_threat", "0.15"); // target分配:蓝目标威胁权重 作用:w_target_threat 越大,红武器会更倾向优先打“高威胁蓝目标”,即使距离稍远或类型略次优也可能被拉高排名 + cfg.put("maxEffectiveDistance", 3000); // 超过该距离候选失效 + cfg.put("maxHeightGap", 800); // 超过该高度差候选失效 + cfg.put("targetDecayAlpha", "0.35"); // 边际收益递减系数 + cfg.put("fallbackToNearestTarget", Boolean.TRUE); // 候选失效时回退最近目标 + cfg.put("allowUnassignedRedWeapon", Boolean.TRUE); // 无有效候选时允许红方targetId为空 + //权重怎么用的算法要研究 + + // ---------- 阵位规则参数(可改) ---------- + cfg.put("enablePositionRules", Boolean.TRUE); // 阵位规则总开关 + // 区域来源已切换到 Task 实体字段:warZoneLocation / defZoneLocation(4点经纬度) + cfg.put("fireUnitSpacingMeters", 100); // 火力单元间距(米) + cfg.put("airDeployZonePreference", "combat"); // 飞机优先部署区:combat/defense + cfg.put("defensePriorityWeapons", "反坦克导弹系统,反坦克火箭,车载迫击炮,迫榴炮"); // 优先部署防区武器 + cfg.put("groundDeployHeight", 20); // 地面武器部署高度 + cfg.put("airDeployHeight", 300); // 空中武器部署高度(自动高度关闭或兜底时使用) + cfg.put("enableAutoAirDeployHeight", Boolean.TRUE); // 空中部署高度自动生成开关 + cfg.put("airHeightMin", 50); // 自动高度下限 + cfg.put("airHeightMax", 20000); // 自动高度上限 + cfg.put("airHeightFallback", 300); // 无航迹/无蓝方武器高度时的兜底高度 + cfg.put("airHeightSpeedThreshold", 180); // 速度修正:平均速度≥此值视为“快” + cfg.put("airHeightAdjustFast", 40); // 速度快时额外抬高(米) + cfg.put("airHeightNearDefenseDistance", 800); // 距防区“近”阈值(米) + cfg.put("airHeightFarDefenseDistance", 2500); // 距防区“远”阈值(米) + cfg.put("airHeightAdjustNear", -30); // 近防区高度修正(通常为负,压低) + cfg.put("airHeightAdjustFar", 40); // 远防区高度修正(抬高) + cfg.put("airHeightAdjustMain", 20); // 主机相对基准额外高度 + cfg.put("airHeightAdjustWing", -10); // 僚机相对基准额外高度 + cfg.put("formationDefaultType", "TRIANGLE"); // 默认阵型:TRIANGLE/DIAMOND/LINE/COLUMN/WEDGE + cfg.put("enableAutoFormationSelect", Boolean.TRUE); // 阵型自动选择开关 + cfg.put("formationFastSpeedThreshold", 180); // 自动选阵型:高速阈值 + cfg.put("formationNearDefenseDistance", 800); // 自动选阵型:近防区阈值 + cfg.put("formationFarDefenseDistance", 2500); // 自动选阵型:远防区阈值 + cfg.put("formationHighThreatLevel", 3); // 自动选阵型:高威胁阈值 + cfg.put("formationLargeGroupCount", 6); // 自动选阵型:大编队阈值 + cfg.put("formationRule_near_fast", "WEDGE"); // 近快态势阵型 + cfg.put("formationRule_far_fast", "LINE"); // 远快态势阵型 + cfg.put("formationRule_near_slow", "DIAMOND"); // 近慢态势阵型 + cfg.put("formationRule_high_threat", "DIAMOND"); // 高威胁优先阵型 + cfg.put("formationRule_large_group", "COLUMN"); // 大编队优先阵型 + cfg.put("formationRule_air_majority", "LINE"); // 空中占比高阵型 + cfg.put("formationRule_default", "TRIANGLE"); // 自动选择默认阵型 + cfg.put("formationDefaultSpacingMeters", 120); // 阵型间距兜底(自动计算失败时) + cfg.put("mainWingDistanceDefaultMeters", 100); // 主僚距离兜底(自动计算失败时) + cfg.put("formationHeadingDefaultDeg", 0); // 默认阵型朝向 + cfg.put("formationSpacingMinMeters", 60); // 自动间距下限 + cfg.put("formationSpacingMaxMeters", 220); // 自动间距上限 + cfg.put("defenseScaleMinMeters", 300); // 防区尺度映射下限 + cfg.put("defenseScaleMaxMeters", 3000); // 防区尺度映射上限 + cfg.put("mainWingDistanceMinMeters", 60); // 自动主僚距离下限 + cfg.put("mainWingDistanceMaxMeters", 260); // 自动主僚距离上限 + cfg.put("mainWingDistanceModeFactor_near_fast", "0.90"); // 近快:更紧凑 + cfg.put("mainWingDistanceModeFactor_far_fast", "1.15"); // 远快:更疏开 + cfg.put("mainWingDistanceModeFactor_near_slow", "0.95"); // 近慢:略紧凑 + cfg.put("mainWingDistanceModeFactor_default", "1.00"); // 默认系数 + cfg.put("speedFastThreshold", 180); // 蓝方高速阈值 + cfg.put("distanceNearDefenseThresholdMeters", 800); // 近防区阈值 + cfg.put("distanceFarDefenseThresholdMeters", 2500); // 远防区阈值 + + // ---------- 航迹规则参数(可改) ---------- + cfg.put("enableTrajectoryRules", Boolean.TRUE); // 航迹规则总开关 + // 智能 最短的 侧面 干扰 + cfg.put("strategyMode", "shortest"); // auto/shortest/flank/interfere + cfg.put("enableShortest", Boolean.TRUE); + cfg.put("enableFlank", Boolean.TRUE); + cfg.put("enableInterfere", Boolean.TRUE); + cfg.put("nearDefDistanceMeters", 800); // 近防区阈值 + cfg.put("farDefDistanceMeters", 2500); // 远防区阈值 + cfg.put("fastSpeedThreshold", 180); // 快速阈值 + cfg.put("flankOffsetMeters", 150); // 绕后偏移 + cfg.put("interfereOffsetMeters", 120); // 干扰基础偏移 + cfg.put("interfereZigzagAmplitude", 90); // 干扰锯齿幅度 + cfg.put("keepBlueHeight", Boolean.TRUE); // true=沿用蓝方高度 + cfg.put("redTrackHeightOverride", 200); // keepBlueHeight=false 时生效 + + return cfg; +} + +//------------------------------------------------------------------------------- +rule "红方武器自适应装配规则" +agenda-group "打击任务" +salience 55 +when + // 蓝方与红方任务都存在时触发,做“武器+组件”的基础装配 + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + configureRedWeaponsByBlue($fact, cfg); +end + +//------------------------------------------------------------------------------- +rule "导弹联动增强规则" +agenda-group "打击任务" +salience 54 +when + // 在基础装配后执行:若蓝方挂载导弹,红方空中武器自动增强导弹能力 + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyMissileLinkage($fact, cfg); +end + +//------------------------------------------------------------------------------- +// 仅导弹组件匹配:按 redWeapon.targetId 对应蓝方装备,仅覆盖导弹组件的数量与首参数 +rule "导弹组件数量匹配规则" +agenda-group "打击任务" +salience 53 +when + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyAllComponentQuantities($fact, cfg); +end + +//------------------------------------------------------------------------------- +rule "命中率规则-动态数量与offset" +agenda-group "打击任务" +salience 52 +when + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyHitRateDrivenOffsets($fact, cfg); +end + +//------------------------------------------------------------------------------- +rule "任务自动匹配规则" +agenda-group "打击任务" +salience 50 +when + // 以红方最终武器为主自动生成任务名,保证任务名与武器一致 + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + assignTaskNameByRedWeapons($fact, cfg); +end + +//------------------------------------------------------------------------------- +rule "阵位规则-区域解析与点位生成" +agenda-group "打击任务" +salience 49 +when + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + prepareDeploymentPools($fact, cfg, globalParams); +end + +//------------------------------------------------------------------------------- +rule "阵位规则-武器部署赋位" +agenda-group "打击任务" +salience 48 +when + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyWeaponDeployment($fact, cfg, globalParams); +end + +//------------------------------------------------------------------------------- +rule "射程合理性校验规则" +agenda-group "打击任务" +salience 47 +when + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyRangeSanityAndRecommend($fact, cfg); +end + +//------------------------------------------------------------------------------- +rule "航迹规则-生成红方航迹" +agenda-group "打击任务" +salience 46 +when + // 根据蓝方 trackPoints 生成红方 trackPoints,点数保持一致 + $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") +then + Map cfg = buildBusinessConfig(); + applyTrajectoryGeneration($fact, cfg); +end + +//------------------------------------------------------------------------------- +// 说明:以下函数全部是 DRL function(不是 Java 类方法) +// 目标:让不懂代码的业务同事只改“可调整常量区”即可完成策略调整 + +// 根据蓝方武器结构,按业务映射装配红方武器并写入基础组件 +function void configureRedWeaponsByBlue( + FactTask fact, + Map cfg +) { + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + List blueWeapons = fact.getBlueTask().getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty()) { + return; + } + Task redTask = fact.getRedTask(); + List redWeapons = redTask.getTaskWeapons(); + if (redWeapons == null) { + redWeapons = new ArrayList<>(); + redTask.setTaskWeapons(redWeapons); + } + + // 蓝方组件模板(用于测试和参数联动):若蓝方没填组件,给一个合理默认值 + buildBlueTestComponents(blueWeapons); + + // 过程驱动模式:根据蓝方类型/数量/位置等态势特征评分选武器 + if (readBooleanCfg(cfg, "enableRuleScoring", true)) { + runProcessDrivenSelection(fact, cfg); + return; + } + + boolean hasBlueAir = false; + boolean hasBlueGround = false; + boolean hasBlueArtillery = false; + boolean hasBlueArmor = false; + boolean hasBlueMissile = false; + for (Object obj : blueWeapons) { + Weapon blueWeapon = (Weapon) obj; + if (blueWeapon == null) { + continue; + } + if (isAirWeapon(blueWeapon)) { + hasBlueAir = true; + } + if (isGroundWeapon(blueWeapon)) { + hasBlueGround = true; + } + if (isArtilleryWeapon(blueWeapon)) { + hasBlueArtillery = true; + } + if (isArmorWeapon(blueWeapon)) { + hasBlueArmor = true; + } + if (hasMissileComponent(blueWeapon)) { + hasBlueMissile = true; + } + } + + boolean allowMultiGroup = readBooleanCfg(cfg, "allowMultiGroup", true); + boolean matchedAny = false; + + // 严格白名单-1:空中目标反制组(由 map_air_targets 控制) + if (readBooleanCfg(cfg, "enableAirRule", true) && hasBlueAir && (!matchedAny || allowMultiGroup)) { + int before = redWeapons.size(); + applyMappedWeapons(redWeapons, cfg, "map_air_targets", readIntCfg(cfg, "defaultAirNum", 1), readBooleanCfg(cfg, "enableArmedHelicopterOnAir", true)); + if (redWeapons.size() > before) { + matchedAny = true; + } + } + + // 严格白名单-2:地面目标炮类组(由 map_ground_targets 控制) + if (readBooleanCfg(cfg, "enableGroundRule", true) && hasBlueGround && (!matchedAny || allowMultiGroup)) { + int before = redWeapons.size(); + applyMappedWeapons(redWeapons, cfg, "map_ground_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); + if (redWeapons.size() > before) { + matchedAny = true; + } + } + + // 严格白名单-3:装甲目标反坦克组(由 map_armor_targets 控制) + if (readBooleanCfg(cfg, "enableArmorRule", true) && hasBlueArmor && (!matchedAny || allowMultiGroup)) { + int before = redWeapons.size(); + applyMappedWeapons(redWeapons, cfg, "map_armor_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); + if (redWeapons.size() > before) { + matchedAny = true; + } + } + + // 严格白名单-4:炮类目标反制组(由 map_artillery_targets 控制) + if (hasBlueArtillery && (!matchedAny || allowMultiGroup)) { + int before = redWeapons.size(); + applyMappedWeapons(redWeapons, cfg, "map_artillery_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); + if (redWeapons.size() > before) { + matchedAny = true; + } + } + + // 严格白名单-5:导弹补充组(默认关闭,由 map_missile_targets 控制) + if (readBooleanCfg(cfg, "enableMissileVehicleRule", false) && hasBlueMissile && (!matchedAny || allowMultiGroup)) { + int before = redWeapons.size(); + applyMappedWeapons(redWeapons, cfg, "map_missile_targets", readIntCfg(cfg, "defaultMissileVehicleNum", 1), true); + if (redWeapons.size() > before) { + matchedAny = true; + } + } + + // 炮类限制仅对已匹配策略生效;若本轮未命中白名单,不做任何新增/补齐 + if (matchedAny && hasBlueArtillery) { + limitRedArtilleryToShellOnly(redWeapons, (String) cfg.get("shellRangeDefault")); + } + + // 写入红方武器默认命中率(若入参已给 hitRate,则不覆盖) + applyDefaultHitRateIfAbsent(redWeapons, cfg); + + // 自动绑定红方武器 targetId(来源:蓝方 equipmentId) + bindTargetIdsForRedWeapons(redWeapons, blueWeapons, cfg); +} + +//------------------------------------------------------------------------------- +// 过程驱动主流程:特征提取 -> 评分选武器 -> 动态分配 +function void runProcessDrivenSelection(FactTask fact, Map cfg) { + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + List blueWeapons = blueTask.getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty()) { + return; + } + List redWeapons = redTask.getTaskWeapons(); + if (redWeapons == null) { + redWeapons = new ArrayList(); + redTask.setTaskWeapons(redWeapons); + } else { + redWeapons.clear(); + } + + List blueFeatures = extractBlueTargetFeatures(blueTask, cfg); + if (blueFeatures == null || blueFeatures.isEmpty()) { + return; + } + List redPool = getRedWeaponPoolByConfig(cfg); + if (redPool == null || redPool.isEmpty()) { + return; + } + + double desiredKill = normalizeProbability(readDoubleCfg(cfg, "desiredKillProbability", 0.9d), 0.9d); + int minAssign = readIntCfg(cfg, "minRedWeaponsPerBlueTarget", 1); + int maxAssign = readIntCfg(cfg, "maxRedWeaponsPerBlueTargetCap", 3); + if (maxAssign <= 0) { + maxAssign = 1; + } + if (minAssign < 0) { + minAssign = 0; + } + if (minAssign > maxAssign) { + minAssign = maxAssign; + } + int minScore = readIntCfg(cfg, "minScoreToAssign", 1); + + for (Object featObj : blueFeatures) { + Map feat = (Map) featObj; + String blueId = String.valueOf(feat.get("blueId")); + Weapon blueWeapon = (Weapon) feat.get("blueWeapon"); + if (blueWeapon == null || isBlank(blueId)) { + continue; + } + + List topNames = pickTopScoredWeapons(feat, redPool, cfg, minScore); + if (topNames == null || topNames.isEmpty()) { + continue; + } + int needCount = computeNeededRedCountFromFeature(feat, cfg, desiredKill); + allocateRedWeaponsForBlueTarget(topNames, needCount, minAssign, maxAssign, blueId, redWeapons, cfg); + } + + if (!redWeapons.isEmpty()) { + applyDefaultHitRateIfAbsent(redWeapons, cfg); + if (containsBlueArtillery(blueWeapons)) { + limitRedArtilleryToShellOnly(redWeapons, (String) cfg.get("shellRangeDefault")); + } + } +} + +function List extractBlueTargetFeatures(Task blueTask, Map cfg) { + List result = new ArrayList(); + if (blueTask == null || blueTask.getTaskWeapons() == null) { + return result; + } + int threat = parseIntSafe(blueTask.getThreatLevel(), 1); + for (Object obj : blueTask.getTaskWeapons()) { + Weapon blue = (Weapon) obj; + if (blue == null || isBlank(blue.getEquipmentId())) { + continue; + } + Map feature = new java.util.HashMap(); + feature.put("blueId", blue.getEquipmentId()); + feature.put("blueWeapon", blue); + feature.put("isAir", Boolean.valueOf(isAirWeapon(blue))); + feature.put("isArmor", Boolean.valueOf(isArmorWeapon(blue))); + feature.put("isArtillery", Boolean.valueOf(isArtilleryWeapon(blue))); + feature.put("isGround", Boolean.valueOf(isGroundWeapon(blue))); + feature.put("hasMissile", Boolean.valueOf(hasMissileComponent(blue))); + int blueNum = blue.getNumber() == null || blue.getNumber() <= 0 ? 1 : blue.getNumber().intValue(); + feature.put("blueNum", Integer.valueOf(blueNum)); + feature.put("threat", Integer.valueOf(threat)); + feature.put("distance", Double.valueOf(computeBlueDistanceToDefenseMeters(blue, blueTask))); + result.add(feature); + } + return result; +} + +function List pickTopScoredWeapons(Map feature, List redPool, Map cfg, int minScoreToAssign) { + List result = new ArrayList(); + if (feature == null || redPool == null || redPool.isEmpty()) { + return result; + } + int maxScore = Integer.MIN_VALUE; + for (Object obj : redPool) { + String redName = String.valueOf(obj); + if (isBlank(redName)) { + continue; + } + int s = scoreRedWeaponByRules(feature, redName, cfg); + if (s > maxScore) { + maxScore = s; + } + } + if (maxScore < minScoreToAssign) { + return result; + } + for (Object obj : redPool) { + String redName = String.valueOf(obj); + if (isBlank(redName)) { + continue; + } + int s = scoreRedWeaponByRules(feature, redName, cfg); + if (s == maxScore) { + addUnique(result, redName); + } + } + return result; +} + +function int scoreRedWeaponByRules(Map feature, String redName, Map cfg) { + if (feature == null || redName == null) { + return 0; + } + int score = 0; + boolean isAir = ((Boolean) feature.get("isAir")).booleanValue(); + boolean isArmor = ((Boolean) feature.get("isArmor")).booleanValue(); + boolean isArtillery = ((Boolean) feature.get("isArtillery")).booleanValue(); + boolean hasMissile = ((Boolean) feature.get("hasMissile")).booleanValue(); + int blueNum = ((Integer) feature.get("blueNum")).intValue(); + int threat = ((Integer) feature.get("threat")).intValue(); + double distance = ((Double) feature.get("distance")).doubleValue(); + + if (isArmor && redName.contains("反坦克")) { + score += readIntCfg(cfg, "score_type_antiArmor", 1); + } + if (isAir && (redName.contains("防空导弹") || redName.contains("无人机") || redName.contains("直升机"))) { + score += readIntCfg(cfg, "score_highThreat_missile", 1); + } + if (isArtillery && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { + score += 1; + } + if (distance <= readIntCfg(cfg, "nearDefenseDistanceMeters", 500) && redName.contains("迫榴炮")) { + score += readIntCfg(cfg, "score_nearDefense_artillery", 1); + } + if (threat >= readIntCfg(cfg, "highThreatLevel", 3) && (redName.contains("导弹") || redName.contains("防空"))) { + score += readIntCfg(cfg, "score_highThreat_missile", 1); + } + if (blueNum >= readIntCfg(cfg, "highTargetCount", 2) && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { + score += readIntCfg(cfg, "score_highCount_artillery", 1); + } + if (hasMissile && (redName.contains("防空导弹") || redName.contains("导弹发射车"))) { + score += readIntCfg(cfg, "score_hasMissile_airDefence", 1); + } + + int estRange = estimateRangeByRedWeaponName(redName); + int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); + if (distance < Double.MAX_VALUE / 2.0d && estRange >= (int) Math.ceil(distance) + margin) { + score += 1; + } + return score; +} + +function void allocateRedWeaponsForBlueTarget(List topNames, int needCount, int minAssign, int maxAssign, String blueId, List redWeapons, Map cfg) { + if (topNames == null || topNames.isEmpty() || isBlank(blueId) || redWeapons == null) { + return; + } + int finalNeed = needCount; + if (finalNeed < minAssign) { + finalNeed = minAssign; + } + if (finalNeed > maxAssign) { + finalNeed = maxAssign; + } + int assigned = 0; + while (assigned < finalNeed) { + for (Object obj : topNames) { + if (assigned >= finalNeed) { + break; + } + String redName = String.valueOf(obj); + Weapon red = createRedWeaponInstance(redName, inferSupportTypeByWeaponName(redName), 1); + red.setTargetId(blueId); + ensureBasicRedComponents(red); + red.setHitRate(Double.valueOf(resolveHitRateByName(redName, cfg))); + redWeapons.add(red); + assigned++; + } + } +} + +function int computeNeededRedCountFromFeature(Map feature, Map cfg, double desiredKill) { + if (feature == null) { + return 1; + } + int blueNum = ((Integer) feature.get("blueNum")).intValue(); + int threat = ((Integer) feature.get("threat")).intValue(); + double distance = ((Double) feature.get("distance")).doubleValue(); + double pBase = normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); + if (((Boolean) feature.get("isArmor")).booleanValue()) { + pBase = pBase + 0.05d; + } + if (((Boolean) feature.get("isAir")).booleanValue()) { + pBase = pBase - 0.05d; + } + if (distance > 1500.0d) { + pBase = pBase - 0.06d; + } + pBase = normalizeProbability(pBase, 0.6d); + int oneTargetNeed = computeRequiredShots(pBase, desiredKill, 1); + int count = oneTargetNeed + Math.max(0, blueNum - 1); + if (threat >= 3) { + count++; + } + return Math.max(1, count); +} + +function double computeBlueDistanceToDefenseMeters(Weapon blueWeapon, Task blueTask) { + if (blueWeapon == null || blueWeapon.getCoordinate() == null || blueTask == null || blueTask.getDefZoneLocation() == null) { + return Double.MAX_VALUE; + } + Coordinate b = blueWeapon.getCoordinate(); + if (b.getLongitude() == null || b.getLatitude() == null) { + return Double.MAX_VALUE; + } + double best = Double.MAX_VALUE; + for (Object obj : blueTask.getDefZoneLocation()) { + Coordinate c = (Coordinate) obj; + if (c == null || c.getLongitude() == null || c.getLatitude() == null) { + continue; + } + double d = approxDistanceMeters( + b.getLongitude().doubleValue(), + b.getLatitude().doubleValue(), + c.getLongitude().doubleValue(), + c.getLatitude().doubleValue() + ); + if (d < best) { + best = d; + } + } + return best; +} + +function int estimateRangeByRedWeaponName(String redName) { + if (redName == null) { + return 800; + } + if (redName.contains("反坦克导弹系统")) { + return 1800; + } + if (redName.contains("导弹发射车")) { + return 2500; + } + if (redName.contains("防空导弹")) { + return 2200; + } + if (redName.contains("武装直升机")) { + return 1500; + } + if (redName.contains("无人机")) { + return 1200; + } + if (redName.contains("迫榴炮") || redName.contains("迫击炮")) { + return 1600; + } + if (redName.contains("反坦克火箭")) { + return 1000; + } + return 900; +} + +function double resolveHitRateByName(String redName, Map cfg) { + Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); + Double p = (Double) hitRateMap.get(redName); + if (p == null) { + p = Double.valueOf(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d)); + } + return normalizeProbability(p.doubleValue(), 0.6d); +} + +function List getRedWeaponPoolByConfig(Map cfg) { + List pool = new ArrayList(); + addUnique(pool, (String) cfg.get("redStrikeDroneName")); + addUnique(pool, (String) cfg.get("redArmedHelicopterName")); + addUnique(pool, (String) cfg.get("redHowitzerName")); + addUnique(pool, (String) cfg.get("redVehicleMortarName")); + addUnique(pool, (String) cfg.get("redAaWeaponName")); + addUnique(pool, (String) cfg.get("redAtRocketName")); + addUnique(pool, (String) cfg.get("redAtMissileSystemName")); + addUnique(pool, (String) cfg.get("redMissileVehicleName")); + return pool; +} + +function Weapon createRedWeaponInstance(String name, String supportType, int number) { + Weapon w = new Weapon(); + w.setName(name); + w.setSupportType(supportType); + w.setNumber(number); + w.setComponents(new ArrayList()); + return w; +} + +function boolean containsBlueArtillery(List blueWeapons) { + if (blueWeapons == null) { + return false; + } + for (Object obj : blueWeapons) { + Weapon w = (Weapon) obj; + if (w != null && isArtilleryWeapon(w)) { + return true; + } + } + return false; +} + +function void applyMappedWeapons(List redWeapons, Map cfg, String mapKey, int defaultNum, boolean allowArmedHelicopter) { + List mappedNames = parseMappedWeaponNames(cfg, mapKey); + if (mappedNames == null || mappedNames.isEmpty()) { + return; + } + for (Object obj : mappedNames) { + String weaponName = (String) obj; + if (!allowArmedHelicopter && weaponName != null && weaponName.equals((String) cfg.get("redArmedHelicopterName"))) { + continue; + } + String supportType = inferSupportTypeByWeaponName(weaponName); + Weapon redWeapon = ensureRedWeapon(redWeapons, weaponName, supportType, defaultNum); + ensureBasicRedComponents(redWeapon); + } +} + +function List parseMappedWeaponNames(Map cfg, String mapKey) { + List result = new ArrayList(); + if (cfg == null || mapKey == null) { + return result; + } + Object raw = cfg.get(mapKey); + if (raw == null) { + return result; + } + String text = String.valueOf(raw); + if (text == null || text.trim().equals("")) { + return result; + } + String[] parts = text.split(","); + for (int i = 0; i < parts.length; i++) { + String one = parts[i]; + if (one == null) { + continue; + } + String name = one.trim(); + if (name.equals("")) { + continue; + } + if (isValidRedWeaponNameByConfig(cfg, name) && !containsString(result, name)) { + result.add(name); + } + } + return result; +} + +function List parseCsvList(String text) { + List result = new ArrayList(); + if (text == null || text.trim().equals("")) { + return result; + } + String[] parts = text.split(","); + for (int i = 0; i < parts.length; i++) { + String one = parts[i]; + if (one == null) { + continue; + } + String item = one.trim(); + if (!item.equals("") && !result.contains(item)) { + result.add(item); + } + } + return result; +} + +function boolean isValidRedWeaponNameByConfig(Map cfg, String weaponName) { + if (cfg == null || weaponName == null || weaponName.equals("")) { + return false; + } + return weaponName.equals((String) cfg.get("redStrikeDroneName")) + || weaponName.equals((String) cfg.get("redArmedHelicopterName")) + || weaponName.equals((String) cfg.get("redHowitzerName")) + || weaponName.equals((String) cfg.get("redVehicleMortarName")) + || weaponName.equals((String) cfg.get("redAaWeaponName")) + || weaponName.equals((String) cfg.get("redAtRocketName")) + || weaponName.equals((String) cfg.get("redAtMissileSystemName")) + || weaponName.equals((String) cfg.get("redMissileVehicleName")); +} + +function boolean containsString(List values, String target) { + if (values == null || target == null) { + return false; + } + for (Object obj : values) { + if (obj != null && target.equals(String.valueOf(obj))) { + return true; + } + } + return false; +} + +function String inferSupportTypeByWeaponName(String weaponName) { + if (weaponName == null) { + return "ground"; + } + if (weaponName.contains("无人机") || weaponName.contains("直升机")) { + return "overhead"; + } + if (weaponName.contains("防空导弹")) { + return "antiaircraft"; + } + return "ground"; +} + +// 蓝方若有导弹,红方空中武器补导弹:数量 = 蓝方 + offset,范围略高 +function void applyMissileLinkage( + FactTask fact, + Map cfg +) { + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + List blueWeapons = fact.getBlueTask().getTaskWeapons(); + List redWeapons = fact.getRedTask().getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { + return; + } + + if (!readBooleanCfg(cfg, "enableMissileLinkage", true)) { + return; + } + int blueMissileCount = countBlueMissileNumber(blueWeapons); + if (blueMissileCount < readIntCfg(cfg, "minBlueMissileCountForLinkage", 1)) { + return; + } + int blueMissileRange = readBlueMissileRange(blueWeapons, readIntCfg(cfg, "blueMissileRangeDefault", 220)); + int redMissileTarget = blueMissileCount + readIntCfg(cfg, "missileCountOffset", 1); + int redRangeTarget = blueMissileRange + readIntCfg(cfg, "missileRangeOffset", 80); + + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || !isRedAirWeapon(redWeapon)) { + continue; + } + ensureMissileComponentForRedAirWeapon(redWeapon, redMissileTarget, redRangeTarget); + } +} + +function void bindTargetIdsForRedWeapons(List redWeapons, List blueWeapons, Map cfg) { + if (!readBooleanCfg(cfg, "enableTargetAutoBind", true)) { + return; + } + if (redWeapons == null || redWeapons.isEmpty() || blueWeapons == null || blueWeapons.isEmpty()) { + return; + } + Map blueById = indexBlueWeaponsById(blueWeapons); + Map assignedCountByBlueId = new java.util.HashMap(); + double decayAlpha = readDoubleCfg(cfg, "targetDecayAlpha", 0.35d); + boolean fallbackToNearest = readBooleanCfg(cfg, "fallbackToNearestTarget", true); + boolean allowUnassigned = readBooleanCfg(cfg, "allowUnassignedRedWeapon", true); + int total = redWeapons.size(); + int bound = 0; + + // 核心:每把红武器选择“当前边际收益最高”的蓝目标 + for (Object objR : redWeapons) { + Weapon redWeapon = (Weapon) objR; + if (redWeapon == null) { + continue; + } + String bestBlueId = null; + double bestMarginal = -1.0d; + for (Object objB : blueWeapons) { + Weapon blueWeapon = (Weapon) objB; + if (blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { + continue; + } + if (!isPairFeasible(redWeapon, blueWeapon, cfg)) { + continue; + } + double baseScore = computePairScore(redWeapon, blueWeapon, cfg); + Integer countObj = (Integer) assignedCountByBlueId.get(blueWeapon.getEquipmentId()); + int k = countObj == null ? 0 : countObj.intValue(); + double decay = 1.0d / (1.0d + decayAlpha * k); + double marginal = baseScore * decay; + if (marginal > bestMarginal) { + bestMarginal = marginal; + bestBlueId = blueWeapon.getEquipmentId(); + } + } + if (isBlank(bestBlueId) && fallbackToNearest) { + bestBlueId = pickNearestBlueId(redWeapon, blueWeapons); + } + if (isBlank(bestBlueId)) { + if (!allowUnassigned) { + bestBlueId = pickAnyBlueId(blueWeapons); + } + } + if (!isBlank(bestBlueId)) { + redWeapon.setTargetId(bestBlueId); + bound++; + incrementAssignedCount(assignedCountByBlueId, bestBlueId); + } + } + + double minRatio = readDoubleCfg(cfg, "minTargetBindRatio", 0.7d); + boolean allowReserveWithoutTarget = readBooleanCfg(cfg, "allowReserveWithoutTarget", true); + if (!allowReserveWithoutTarget) { + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { + continue; + } + String any = pickAnyBlueId(blueWeapons); + if (!isBlank(any)) { + redWeapon.setTargetId(any); + bound++; + } + } + return; + } + // 允许冗余时,只保证最低绑定比例 + if (total > 0 && ((double) bound / (double) total) < minRatio) { + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { + continue; + } + String any = pickAnyBlueId(blueWeapons); + if (isBlank(any)) { + continue; + } + redWeapon.setTargetId(any); + bound++; + if (((double) bound / (double) total) >= minRatio) { + break; + } + } + } +} + +function void applyHitRateDrivenOffsets(FactTask fact, Map cfg) { + if (fact == null || fact.getRedTask() == null) { + return; + } + List redWeapons = fact.getRedTask().getTaskWeapons(); + if (redWeapons == null || redWeapons.isEmpty()) { + return; + } + applyDefaultHitRateIfAbsent(redWeapons, cfg); + Map explicitOffset = parseNameIntCsv((String) cfg.get("offsetCsvByWeapon")); + double threshold = normalizeProbability(readDoubleCfg(cfg, "hitRateThreshold", 0.7d), 0.7d); + double step1Max = readDoubleCfg(cfg, "hitRateGapStep1Max", 0.5d); + double step2Max = readDoubleCfg(cfg, "hitRateGapStep2Max", 1.0d); + int step1Offset = readIntCfg(cfg, "hitRateStep1Offset", 1); + int step2Offset = readIntCfg(cfg, "hitRateStep2Offset", 2); + if (step1Max < 0.0d) { + step1Max = 0.0d; + } + if (step2Max < step1Max) { + step2Max = step1Max; + } + if (step1Offset < 0) { + step1Offset = 0; + } + if (step2Offset < step1Offset) { + step2Offset = step1Offset; + } + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null) { + continue; + } + int base = redWeapon.getNumber() == null || redWeapon.getNumber() <= 0 ? 1 : redWeapon.getNumber().intValue(); + Integer explicit = (Integer) explicitOffset.get(redWeapon.getName()); + int offset = 0; + if (explicit != null) { + offset = explicit.intValue(); + } else { + double pHit = resolveWeaponHitRate(redWeapon, cfg); + double gap = threshold - pHit; + if (gap <= 0.0d) { + offset = 0; + } else if (gap <= step1Max) { + offset = step1Offset; + } else if (gap <= step2Max) { + offset = step2Offset; + } else { + // 超出第二档时按第二档处理,避免火力数量无上限膨胀 + offset = step2Offset; + } + } + if (offset < 0) { + offset = 0; + } + redWeapon.setNumber(base + offset); + } +} + +function void applyRangeSanityAndRecommend(FactTask fact, Map cfg) { + if (!readBooleanCfg(cfg, "enableRangeSanityCheck", true)) { + return; + } + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + List blueWeapons = fact.getBlueTask().getTaskWeapons(); + List redWeapons = fact.getRedTask().getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { + return; + } + Map blueById = indexBlueWeaponsById(blueWeapons); + int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); + boolean autoAdjust = readBooleanCfg(cfg, "enableAutoRangeRecommend", true); + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || isBlank(redWeapon.getTargetId())) { + continue; + } + Weapon blueWeapon = (Weapon) blueById.get(redWeapon.getTargetId()); + if (blueWeapon == null) { + continue; + } + Coordinate rc = redWeapon.getCoordinate(); + Coordinate bc = blueWeapon.getCoordinate(); + if (!isCoordinateUsable(rc) || !isCoordinateUsable(bc)) { + continue; + } + int currentRange = readRangeMetersFromWeapon(redWeapon); + if (currentRange <= 0) { + continue; + } + double d = approxDistanceMeters( + rc.getLongitude().doubleValue(), + rc.getLatitude().doubleValue(), + bc.getLongitude().doubleValue(), + bc.getLatitude().doubleValue() + ); + int minRequired = (int) Math.ceil(d) + margin; + if (currentRange >= minRequired) { + continue; + } + if (tryReplaceWithBetterRangeWeapon(redWeapon, minRequired, cfg)) { + continue; + } + if (autoAdjust) { + setWeaponFirstRangeParamAtLeast(redWeapon, minRequired); + } + } +} + +function boolean tryReplaceWithBetterRangeWeapon(Weapon redWeapon, int minRequired, Map cfg) { + if (redWeapon == null || redWeapon.getName() == null) { + return false; + } + String current = redWeapon.getName(); + String replacement = null; + if (current.contains("反坦克火箭")) { + replacement = "反坦克导弹系统"; + } else if (current.contains("迫击炮")) { + replacement = "迫榴炮"; + } else if (current.contains("无人机")) { + replacement = "武装直升机"; + } + if (isBlank(replacement)) { + return false; + } + if (estimateRangeByRedWeaponName(replacement) < minRequired) { + return false; + } + redWeapon.setName(replacement); + redWeapon.setSupportType(inferSupportTypeByWeaponName(replacement)); + redWeapon.setComponents(new ArrayList()); + ensureBasicRedComponents(redWeapon); + redWeapon.setHitRate(Double.valueOf(resolveHitRateByName(replacement, cfg))); + return true; +} + +function void applyDefaultHitRateIfAbsent(List redWeapons, Map cfg) { + if (redWeapons == null || redWeapons.isEmpty()) { + return; + } + Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); + double fallback = normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null) { + continue; + } + if (redWeapon.getHitRate() != null && redWeapon.getHitRate().doubleValue() > 0.0d) { + continue; + } + Double p = (Double) hitRateMap.get(redWeapon.getName()); + if (p == null) { + p = fallback; + } + redWeapon.setHitRate(normalizeProbability(p.doubleValue(), fallback)); + } +} + +function double resolveWeaponHitRate(Weapon redWeapon, Map cfg) { + if (redWeapon != null && redWeapon.getHitRate() != null) { + double p = redWeapon.getHitRate().doubleValue(); + return normalizeProbability(p, 0.6d); + } + Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); + Double fromCfg = redWeapon == null ? null : (Double) hitRateMap.get(redWeapon.getName()); + if (fromCfg != null) { + return normalizeProbability(fromCfg.doubleValue(), 0.6d); + } + return normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); +} + +function int computeRequiredShots(double pHit, double pKill, int fallback) { + double p = normalizeProbability(pHit, 0.6d); + double pk = normalizeProbability(pKill, 0.9d); + if (p >= 0.999d) { + return 1; + } + if (p <= 0.0001d) { + return fallback <= 0 ? 1 : fallback; + } + double up = Math.log(1.0d - pk); + double down = Math.log(1.0d - p); + if (down == 0.0d) { + return fallback <= 0 ? 1 : fallback; + } + int n = (int) Math.ceil(up / down); + if (n <= 0) { + n = 1; + } + return n; +} + +function Map parseNameDoubleCsv(String csv) { + Map result = new java.util.HashMap(); + if (csv == null || csv.trim().equals("")) { + return result; + } + String[] items = csv.split(","); + for (int i = 0; i < items.length; i++) { + String one = items[i]; + if (one == null) { + continue; + } + String text = one.trim(); + if (text.equals("")) { + continue; + } + int idx = text.indexOf("="); + if (idx <= 0 || idx >= text.length() - 1) { + continue; + } + String key = text.substring(0, idx).trim(); + String val = text.substring(idx + 1).trim(); + if (key.equals("") || val.equals("")) { + continue; + } + result.put(key, Double.valueOf(parseDoubleSafe(val, 0.0d))); + } + return result; +} + +function Map parseNameIntCsv(String csv) { + Map result = new java.util.HashMap(); + if (csv == null || csv.trim().equals("")) { + return result; + } + String[] items = csv.split(","); + for (int i = 0; i < items.length; i++) { + String one = items[i]; + if (one == null) { + continue; + } + String text = one.trim(); + if (text.equals("")) { + continue; + } + int idx = text.indexOf("="); + if (idx <= 0 || idx >= text.length() - 1) { + continue; + } + String key = text.substring(0, idx).trim(); + String val = text.substring(idx + 1).trim(); + if (key.equals("") || val.equals("")) { + continue; + } + result.put(key, Integer.valueOf(parseIntSafe(val, 0))); + } + return result; +} + +function double normalizeProbability(double p, double fallback) { + if (Double.isNaN(p) || Double.isInfinite(p)) { + p = fallback; + } + if (p <= 0.0d) { + p = fallback; + } + if (p <= 0.0d) { + p = 0.0001d; + } + if (p >= 1.0d) { + p = 0.999d; + } + return p; +} + +function Map indexBlueWeaponsById(List blueWeapons) { + Map result = new java.util.HashMap(); + if (blueWeapons == null) { + return result; + } + for (Object obj : blueWeapons) { + Weapon w = (Weapon) obj; + if (w == null || isBlank(w.getEquipmentId())) { + continue; + } + result.put(w.getEquipmentId(), w); + } + return result; +} + +function Map initBlueSurvivalMap(Map blueById) { + Map result = new java.util.HashMap(); + if (blueById == null) { + return result; + } + for (Object key : blueById.keySet()) { + result.put(key, Double.valueOf(1.0d)); + } + return result; +} + +function void updateBlueSurvival(Map survivalByBlueId, String blueId, double pHit) { + if (survivalByBlueId == null || isBlank(blueId)) { + return; + } + Double survival = (Double) survivalByBlueId.get(blueId); + if (survival == null) { + survival = Double.valueOf(1.0d); + } + double s = survival.doubleValue(); + double p = normalizeProbability(pHit, 0.6d); + s = s * (1.0d - p); + if (s < 0.0d) { + s = 0.0d; + } + survivalByBlueId.put(blueId, Double.valueOf(s)); +} + +function void incrementAssignedCount(Map assignedCountByBlueId, String blueId) { + Integer old = (Integer) assignedCountByBlueId.get(blueId); + int now = old == null ? 1 : old.intValue() + 1; + assignedCountByBlueId.put(blueId, Integer.valueOf(now)); +} + +function boolean isPairFeasible(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + if (redWeapon == null || blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { + return false; + } + // 类型禁配(最基础约束) + String pool = inferBluePoolKeyForRedWeapon(redWeapon); + if ("air".equals(pool) && !isAirWeapon(blueWeapon)) { + return false; + } + if ("armor".equals(pool) && !isArmorWeapon(blueWeapon)) { + return false; + } + if ("artillery".equals(pool) && !isArtilleryWeapon(blueWeapon) && !isGroundWeapon(blueWeapon)) { + return false; + } + // 距离/高度约束(有坐标时启用) + Coordinate rc = redWeapon.getCoordinate(); + Coordinate bc = blueWeapon.getCoordinate(); + if (isCoordinateUsable(rc) && isCoordinateUsable(bc)) { + double d = approxDistanceMeters( + rc.getLongitude().doubleValue(), + rc.getLatitude().doubleValue(), + bc.getLongitude().doubleValue(), + bc.getLatitude().doubleValue() + ); + int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); + if (d > maxDist) { + return false; + } + int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); + int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); + int maxGap = readIntCfg(cfg, "maxHeightGap", 800); + if (Math.abs(rh - bh) > maxGap) { + return false; + } + int estRange = estimateRangeByRedWeaponName(redWeapon.getName()); + int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); + if (estRange < (int) Math.ceil(d) + margin) { + return false; + } + } + return true; +} + +function double computePairScore(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + double wType = readDoubleCfg(cfg, "w_target_type", 0.30d); + double wDist = readDoubleCfg(cfg, "w_target_dist", 0.25d); + double wHeight = readDoubleCfg(cfg, "w_target_height", 0.10d); + double wHit = readDoubleCfg(cfg, "w_target_hit", 0.20d); + double wThreat = readDoubleCfg(cfg, "w_target_threat", 0.15d); + double typeFit = computeTypeFit(redWeapon, blueWeapon); + double distanceFit = computeDistanceFit(redWeapon, blueWeapon, cfg); + double heightFit = computeHeightFit(redWeapon, blueWeapon, cfg); + double hitContribution = resolveWeaponHitRate(redWeapon, cfg); + double threatWeight = computeBlueThreatWeight(blueWeapon); + return (wType * typeFit) + (wDist * distanceFit) + (wHeight * heightFit) + (wHit * hitContribution) + (wThreat * threatWeight); +} + +function double computeTypeFit(Weapon redWeapon, Weapon blueWeapon) { + String pool = inferBluePoolKeyForRedWeapon(redWeapon); + if ("air".equals(pool) && isAirWeapon(blueWeapon)) { + return 1.0d; + } + if ("armor".equals(pool) && isArmorWeapon(blueWeapon)) { + return 1.0d; + } + if ("artillery".equals(pool) && isArtilleryWeapon(blueWeapon)) { + return 0.9d; + } + if ("missile".equals(pool) && hasMissileComponent(blueWeapon)) { + return 0.9d; + } + if ("ground".equals(pool) && isGroundWeapon(blueWeapon)) { + return 0.7d; + } + return 0.2d; +} + +function double computeDistanceFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); + Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); + if (!isCoordinateUsable(rc) || !isCoordinateUsable(bc)) { + return 0.5d; + } + double d = approxDistanceMeters( + rc.getLongitude().doubleValue(), + rc.getLatitude().doubleValue(), + bc.getLongitude().doubleValue(), + bc.getLatitude().doubleValue() + ); + int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); + if (maxDist <= 0) { + maxDist = 3000; + } + double ratio = d / (double) maxDist; + if (ratio <= 0.3d) { + return 1.0d; + } + if (ratio <= 0.6d) { + return 0.8d; + } + if (ratio <= 1.0d) { + return 0.5d; + } + return 0.0d; +} + +function double computeHeightFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { + Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); + Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); + if (rc == null || bc == null) { + return 0.6d; + } + int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); + int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); + int gap = Math.abs(rh - bh); + int maxGap = readIntCfg(cfg, "maxHeightGap", 800); + if (maxGap <= 0) { + maxGap = 800; + } + if (gap >= maxGap) { + return 0.0d; + } + double ratio = (double) gap / (double) maxGap; + return 1.0d - ratio; +} + +function double computeBlueThreatWeight(Weapon blueWeapon) { + if (blueWeapon == null) { + return 0.5d; + } + double t = 0.4d; + if (isAirWeapon(blueWeapon)) { + t += 0.3d; + } + if (isArmorWeapon(blueWeapon)) { + t += 0.2d; + } + if (hasMissileComponent(blueWeapon)) { + t += 0.2d; + } + if (blueWeapon.getNumber() != null && blueWeapon.getNumber().intValue() >= 2) { + t += 0.1d; + } + if (t > 1.0d) { + t = 1.0d; + } + return t; +} + +function String pickNearestBlueId(Weapon redWeapon, List blueWeapons) { + if (redWeapon == null || redWeapon.getCoordinate() == null || !isCoordinateUsable(redWeapon.getCoordinate()) || blueWeapons == null) { + return null; + } + String bestId = null; + double best = Double.MAX_VALUE; + for (Object obj : blueWeapons) { + Weapon b = (Weapon) obj; + if (b == null || isBlank(b.getEquipmentId()) || !isCoordinateUsable(b.getCoordinate())) { + continue; + } + double d = approxDistanceMeters( + redWeapon.getCoordinate().getLongitude().doubleValue(), + redWeapon.getCoordinate().getLatitude().doubleValue(), + b.getCoordinate().getLongitude().doubleValue(), + b.getCoordinate().getLatitude().doubleValue() + ); + if (d < best) { + best = d; + bestId = b.getEquipmentId(); + } + } + return bestId; +} + +function String pickAnyBlueId(List blueWeapons) { + if (blueWeapons == null || blueWeapons.isEmpty()) { + return null; + } + for (Object obj : blueWeapons) { + Weapon b = (Weapon) obj; + if (b != null && !isBlank(b.getEquipmentId())) { + return b.getEquipmentId(); + } + } + return null; +} + +function Weapon pickUnboundRedWeaponForBlue(String blueId, List redWeapons) { + if (redWeapons == null || redWeapons.isEmpty()) { + return null; + } + for (Object obj : redWeapons) { + Weapon w = (Weapon) obj; + if (w == null || !isBlank(w.getTargetId())) { + continue; + } + return w; + } + return null; +} + +function String pickBlueTargetByNeed(Map pools, String preferredKey, Map assignedCountByBlueId, Map survivalByBlueId, double desiredKill, int cap) { + String best = pickBestBlueIdFromPool((List) pools.get(preferredKey), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); + if (!isBlank(best)) { + return best; + } + if (!"ground".equals(preferredKey)) { + String fromGround = pickBestBlueIdFromPool((List) pools.get("ground"), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); + if (!isBlank(fromGround)) { + return fromGround; + } + } + return pickBestBlueIdFromPool((List) pools.get("all"), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); +} + +function String pickBestBlueIdFromPool(List ids, Map assignedCountByBlueId, Map survivalByBlueId, double desiredKill, int cap) { + if (ids == null || ids.isEmpty()) { + return null; + } + String bestId = null; + double bestNeed = -9999.0d; + int bestAssigned = Integer.MAX_VALUE; + for (Object obj : ids) { + String id = String.valueOf(obj); + if (isBlank(id)) { + continue; + } + Integer assignedObj = (Integer) assignedCountByBlueId.get(id); + int assigned = assignedObj == null ? 0 : assignedObj.intValue(); + if (assigned >= cap) { + continue; + } + Double survivalObj = (Double) survivalByBlueId.get(id); + double survival = survivalObj == null ? 1.0d : survivalObj.doubleValue(); + double achieved = 1.0d - survival; + double need = desiredKill - achieved; + if (need > bestNeed || (Math.abs(need - bestNeed) < 1e-9 && assigned < bestAssigned)) { + bestNeed = need; + bestAssigned = assigned; + bestId = id; + } + } + return bestId; +} + +function boolean isCoordinateUsable(Coordinate c) { + return c != null && c.getLongitude() != null && c.getLatitude() != null; +} + +function int readRangeMetersFromWeapon(Weapon weapon) { + if (weapon == null || weapon.getComponents() == null) { + return -1; + } + for (Object obj : weapon.getComponents()) { + SubComponents comp = (SubComponents) obj; + if (comp == null || comp.getComponentParams() == null || comp.getComponentParams().isEmpty()) { + continue; + } + ComponentParam first = (ComponentParam) comp.getComponentParams().get(0); + if (first == null || first.getAttExplain() == null) { + continue; + } + String explain = first.getAttExplain(); + if (!(explain.contains("范围") || explain.contains("射程"))) { + continue; + } + return parseIntSafe(first.getAttDefaultValue(), -1); + } + return -1; +} + +function void setWeaponFirstRangeParamAtLeast(Weapon weapon, int minRange) { + if (weapon == null || weapon.getComponents() == null || minRange <= 0) { + return; + } + for (Object obj : weapon.getComponents()) { + SubComponents comp = (SubComponents) obj; + if (comp == null || comp.getComponentParams() == null || comp.getComponentParams().isEmpty()) { + continue; + } + ComponentParam first = (ComponentParam) comp.getComponentParams().get(0); + if (first == null || first.getAttExplain() == null) { + continue; + } + String explain = first.getAttExplain(); + if (!(explain.contains("范围") || explain.contains("射程"))) { + continue; + } + int current = parseIntSafe(first.getAttDefaultValue(), 0); + if (current < minRange) { + first.setAttDefaultValue(String.valueOf(minRange)); + } + return; + } +} + +//------------------------------------------------------------------------------- +// component 映射解析 + 仅导弹组件数量/参数覆盖 +function Map parseDeviceNameMapping(String csv) { + Map result = new java.util.HashMap(); + if (csv == null) { + return result; + } + String text = csv.trim(); + if (text.equals("")) { + return result; + } + String[] parts = text.split(","); + for (int i = 0; i < parts.length; i++) { + String one = parts[i]; + if (one == null) { + continue; + } + String item = one.trim(); + if (item.equals("")) { + continue; + } + int idx = item.indexOf("->"); + if (idx <= 0 || idx >= item.length() - 2) { + continue; + } + String left = item.substring(0, idx).trim(); + String right = item.substring(idx + 2).trim(); + if (left.equals("") || right.equals("")) { + continue; + } + result.put(left, right); + } + return result; +} + +function void applyAllComponentQuantities(FactTask fact, Map cfg) { + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + if (!readBooleanCfg(cfg, "enableComponentQuantityMatch", true)) { + return; + } + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + List blueWeapons = blueTask.getTaskWeapons(); + List redWeapons = redTask.getTaskWeapons(); + if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { + return; + } + + String mappingCsv = cfg == null ? null : (String) cfg.get("componentDeviceNameMappingCsv"); + Map deviceNameMapping = parseDeviceNameMapping(mappingCsv); + + String missileKeyword = cfg == null ? null : (String) cfg.get("missileComponentNameContains"); + if (missileKeyword == null || missileKeyword.trim().equals("")) { + missileKeyword = "导弹"; + } else { + missileKeyword = missileKeyword.trim(); + } + + // 遍历红方每个武器:用 targetId 找蓝方装备(equipmentId) + for (Object objR : redWeapons) { + Weapon redWeapon = (Weapon) objR; + if (redWeapon == null) { + continue; + } + String targetId = redWeapon.getTargetId(); + if (isBlank(targetId)) { + // 允许不匹配:targetId 为空直接跳过 + continue; + } + + Weapon blueWeapon = null; + for (Object objB : blueWeapons) { + Weapon w = (Weapon) objB; + if (w == null) { + continue; + } + String eqId = w.getEquipmentId(); + if (eqId != null && eqId.equals(targetId)) { + blueWeapon = w; + break; + } + } + if (blueWeapon == null) { + continue; + } + + List blueComps = blueWeapon.getComponents(); + List redComps = redWeapon.getComponents(); + if (blueComps == null || blueComps.isEmpty() || redComps == null || redComps.isEmpty()) { + continue; + } + + // 用蓝方组件驱动覆盖红方组件数量 + for (Object objBC : blueComps) { + SubComponents blueComp = (SubComponents) objBC; + if (blueComp == null) { + continue; + } + String blueCompName = blueComp.getDeviceName(); + if (isBlank(blueCompName)) { + continue; + } + + // 仅导弹组件参与匹配,非导弹组件保持红方原值 + if (!blueCompName.contains(missileKeyword)) { + continue; + } + + String redCompName = (String) deviceNameMapping.get(blueCompName); + if (redCompName == null || redCompName.trim().equals("")) { + redCompName = blueCompName; + } + + SubComponents redComp = null; + for (Object objRC : redComps) { + SubComponents rc = (SubComponents) objRC; + if (rc == null) { + continue; + } + if (redCompName.equals(rc.getDeviceName())) { + redComp = rc; + break; + } + } + if (redComp == null) { + // 允许不匹配:红方下没有该组件则跳过 + continue; + } + + List blueParams = blueComp.getComponentParams(); + List redParams = redComp.getComponentParams(); + if (blueParams == null || blueParams.isEmpty() || redParams == null || redParams.isEmpty()) { + continue; + } + + ComponentParam blueFirst = (ComponentParam) blueParams.get(0); + ComponentParam redFirst = (ComponentParam) redParams.get(0); + if (blueFirst == null || redFirst == null) { + continue; + } + if (blueFirst.getNumber() == null) { + continue; + } + + // 覆盖导弹组件数量(componentParams[0].number) + redFirst.setNumber(blueFirst.getNumber()); + // 覆盖导弹组件首参数默认值(如范围米/破坏范围米) + if (!isBlank(blueFirst.getAttDefaultValue())) { + redFirst.setAttDefaultValue(blueFirst.getAttDefaultValue()); + } + } + } +} + +function void prepareDeploymentPools(FactTask fact, Map cfg, Map runtime) { + if (!readBooleanCfg(cfg, "enablePositionRules", true)) { + return; + } + if (fact == null || runtime == null) { + return; + } + List combatPolygon = extractZonePolygonFromTask(fact, true); + List defensePolygon = extractZonePolygonFromTask(fact, false); + int spacing = readIntCfg(cfg, "fireUnitSpacingMeters", 100); + List combatPoints = buildGridPointsInPolygon(combatPolygon, spacing, readIntCfg(cfg, "groundDeployHeight", 20)); + List defensePoints = buildGridPointsInPolygon(defensePolygon, spacing, readIntCfg(cfg, "groundDeployHeight", 20)); + runtime.put("deploymentCombatPoints", combatPoints); + runtime.put("deploymentDefensePoints", defensePoints); +} + +function void applyWeaponDeployment(FactTask fact, Map cfg, Map runtime) { + if (!readBooleanCfg(cfg, "enablePositionRules", true)) { + return; + } + if (fact == null || fact.getRedTask() == null || fact.getRedTask().getTaskWeapons() == null || runtime == null) { + return; + } + List combatPoints = (List) runtime.get("deploymentCombatPoints"); + List defensePoints = (List) runtime.get("deploymentDefensePoints"); + if ((combatPoints == null || combatPoints.isEmpty()) && (defensePoints == null || defensePoints.isEmpty())) { + return; + } + Map cursor = new java.util.HashMap(); + List defensePriorityWeapons = parseCsvList((String) cfg.get("defensePriorityWeapons")); + String airPref = String.valueOf(cfg.get("airDeployZonePreference")); + int groundH = readIntCfg(cfg, "groundDeployHeight", 20); + int airH = readIntCfg(cfg, "airDeployHeight", 300); + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + String deployMode = resolveDeployModeByBlueState(blueTask, cfg); + Coordinate groundAnchor = pickAnchorByMode(deployMode, combatPoints, defensePoints, cursor); + Coordinate airAnchor = pickAnchorByMode("defense".equalsIgnoreCase(airPref) ? "near_slow" : deployMode, combatPoints, defensePoints, cursor); + String formationType = resolveFormationType(redTask, blueTask, cfg, deployMode); + int spacing = resolveFormationSpacing(redTask, blueTask, cfg); + int headingDeg = resolveFormationHeading(redTask, blueTask, cfg); + int mainWingDistance = resolveMainWingDistance(redTask, blueTask, cfg, deployMode); + + List groundWeapons = new ArrayList(); + List airWeapons = new ArrayList(); + for (Object obj : redTask.getTaskWeapons()) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null) { + continue; + } + if (isRedAirWeapon(redWeapon)) { + airWeapons.add(redWeapon); + } else { + groundWeapons.add(redWeapon); + } + } + + applyFormationForWeaponGroup(groundWeapons, groundAnchor, formationType, spacing, headingDeg, mainWingDistance, groundH, defensePriorityWeapons, combatPoints, defensePoints, cursor, null, null, null, false); + applyFormationForWeaponGroup(airWeapons, airAnchor, formationType, spacing, headingDeg, mainWingDistance, airH, defensePriorityWeapons, combatPoints, defensePoints, cursor, blueTask, cfg, deployMode, true); +} + +function void applyFormationForWeaponGroup(List weapons, Coordinate anchor, String formationType, int spacing, int headingDeg, int mainWingDistance, int defaultHeight, List defensePriorityWeapons, List combatPoints, List defensePoints, Map cursor, Task blueTask, Map cfg, String deployMode, boolean isAirGroup) { + if (weapons == null || weapons.isEmpty()) { + return; + } + List sortedWeapons = sortWeaponsByFormationRole(weapons); + if (anchor == null) { + for (int i = 0; i < sortedWeapons.size(); i++) { + Weapon w = (Weapon) sortedWeapons.get(i); + if (w == null) { + continue; + } + int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); + Coordinate fallback = null; + if (defensePriorityWeapons != null && defensePriorityWeapons.contains(w.getName())) { + fallback = pickCoordinateByPreference(defensePoints, combatPoints, cursor, "defense"); + } else { + fallback = pickCoordinateByPreference(combatPoints, defensePoints, cursor, "combat"); + } + if (fallback != null) { + w.setCoordinate(cloneCoordinateWithHeight(fallback, h)); + } + } + return; + } + List offsets = buildFormationOffsets(formationType, sortedWeapons.size(), spacing); + for (int i = 0; i < sortedWeapons.size(); i++) { + Weapon w = (Weapon) sortedWeapons.get(i); + if (w == null) { + continue; + } + int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); + Map off = i < offsets.size() ? (Map) offsets.get(i) : null; + double dx = off == null || off.get("dx") == null ? 0.0d : ((Double) off.get("dx")).doubleValue(); + double dy = off == null || off.get("dy") == null ? 0.0d : ((Double) off.get("dy")).doubleValue(); + if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole()) && w.getWingRelativeDistanceMeters() != null && w.getWingRelativeDistanceMeters().intValue() > 0) { + int dist = w.getWingRelativeDistanceMeters().intValue(); + int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); + dx = dist * Math.cos(Math.toRadians(bearing)); + dy = dist * Math.sin(Math.toRadians(bearing)); + } else if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole())) { + int dist = mainWingDistance; + int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); + dx = dist * Math.cos(Math.toRadians(bearing)); + dy = dist * Math.sin(Math.toRadians(bearing)); + } + Coordinate c = moveCoordinateByMeters(anchor, dx, dy, headingDeg, h); + if (c != null) { + w.setCoordinate(c); + if (w.getFormationRole() == null || w.getFormationRole().trim().equals("")) { + w.setFormationRole(i == 0 ? "MAIN" : "WING"); + } + } + } +} + +function String resolveDeployModeByBlueState(Task blueTask, Map cfg) { + double d = computeDefMinDistanceMeters(blueTask); + int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); + int fast = readIntCfg(cfg, "speedFastThreshold", 180); + int near = readIntCfg(cfg, "distanceNearDefenseThresholdMeters", 800); + int far = readIntCfg(cfg, "distanceFarDefenseThresholdMeters", 2500); + if (avgSpeed >= fast && d <= near) { + return "near_fast"; + } + if (avgSpeed >= fast && d >= far) { + return "far_fast"; + } + if (avgSpeed < fast && d <= near) { + return "near_slow"; + } + return "default"; +} + +function Coordinate pickAnchorByMode(String mode, List combatPoints, List defensePoints, Map cursor) { + if ("near_fast".equals(mode)) { + return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_fast"); + } + if ("far_fast".equals(mode)) { + return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "far_fast"); + } + if ("near_slow".equals(mode)) { + return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_slow"); + } + return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "default"); +} + +function String resolveFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { + String fromTask = redTask == null ? null : redTask.getFormationType(); + if (!isBlank(fromTask)) { + return normalizeFormationType(fromTask, cfg); + } + if (readBooleanCfg(cfg, "enableAutoFormationSelect", true)) { + String autoType = autoSelectFormationType(redTask, blueTask, cfg, deployMode); + if (!isBlank(autoType)) { + return normalizeFormationType(autoType, cfg); + } + } + String fromCfg = cfg == null ? null : String.valueOf(cfg.get("formationDefaultType")); + if (isBlank(fromCfg)) { + return "TRIANGLE"; + } + return normalizeFormationType(fromCfg, cfg); +} + +function String autoSelectFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { + int threat = parseIntSafe(blueTask == null ? null : blueTask.getThreatLevel(), 1); + int highThreat = readIntCfg(cfg, "formationHighThreatLevel", 3); + if (threat >= highThreat) { + return String.valueOf(cfg.get("formationRule_high_threat")); + } + if ("near_fast".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_near_fast")); + } + if ("far_fast".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_far_fast")); + } + if ("near_slow".equals(deployMode)) { + return String.valueOf(cfg.get("formationRule_near_slow")); + } + int largeGroupCount = readIntCfg(cfg, "formationLargeGroupCount", 6); + int weaponCount = redTask == null || redTask.getTaskWeapons() == null ? 0 : redTask.getTaskWeapons().size(); + if (weaponCount >= largeGroupCount) { + return String.valueOf(cfg.get("formationRule_large_group")); + } + double airRatio = computeRedAirRatio(redTask); + if (airRatio >= 0.5d) { + return String.valueOf(cfg.get("formationRule_air_majority")); + } + return String.valueOf(cfg.get("formationRule_default")); +} + +function double computeRedAirRatio(Task redTask) { + if (redTask == null || redTask.getTaskWeapons() == null || redTask.getTaskWeapons().isEmpty()) { + return 0.0d; + } + int total = 0; + int air = 0; + for (Object obj : redTask.getTaskWeapons()) { + Weapon w = (Weapon) obj; + if (w == null) { + continue; + } + total++; + if (isRedAirWeapon(w)) { + air++; + } + } + if (total <= 0) { + return 0.0d; + } + return (double) air / (double) total; +} + +function String normalizeFormationType(String input, Map cfg) { + String defaultType = cfg == null ? "TRIANGLE" : String.valueOf(cfg.get("formationDefaultType")); + if (isBlank(defaultType)) { + defaultType = "TRIANGLE"; + } + if (isBlank(input)) { + return defaultType.trim().toUpperCase(); + } + String t = input.trim().toUpperCase(); + if ("TRIANGLE".equals(t) || "DIAMOND".equals(t) || "LINE".equals(t) || "COLUMN".equals(t) || "WEDGE".equals(t)) { + return t; + } + return defaultType.trim().toUpperCase(); +} + +function int resolveFormationSpacing(Task redTask, Task blueTask, Map cfg) { + if (redTask != null && redTask.getFormationSpacingMeters() != null && redTask.getFormationSpacingMeters().intValue() > 0) { + return redTask.getFormationSpacingMeters().intValue(); + } + int fallback = readIntCfg(cfg, "formationDefaultSpacingMeters", 120); + double scale = computeDefenseZoneScaleMeters(blueTask); + if (scale <= 0.0d) { + return fallback; + } + int minSpacing = readIntCfg(cfg, "formationSpacingMinMeters", 60); + int maxSpacing = readIntCfg(cfg, "formationSpacingMaxMeters", 220); + int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); + int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); + double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); + return clampInt((int) Math.round(minSpacing + (maxSpacing - minSpacing) * t), minSpacing, maxSpacing); +} + +function int resolveFormationHeading(Task redTask, Task blueTask, Map cfg) { + if (redTask != null && redTask.getFormationHeadingDeg() != null) { + return redTask.getFormationHeadingDeg().intValue(); + } + Integer headingFromTrack = computeHeadingFromBlueTrack(blueTask); + if (headingFromTrack != null) { + return headingFromTrack.intValue(); + } + return readIntCfg(cfg, "formationHeadingDefaultDeg", 0); +} + +function int resolveMainWingDistance(Task redTask, Task blueTask, Map cfg, String deployMode) { + if (redTask != null && redTask.getMainWingDistanceMeters() != null && redTask.getMainWingDistanceMeters().intValue() > 0) { + return redTask.getMainWingDistanceMeters().intValue(); + } + int fallback = readIntCfg(cfg, "mainWingDistanceDefaultMeters", 100); + double scale = computeDefenseZoneScaleMeters(blueTask); + if (scale <= 0.0d) { + return fallback; + } + int minD = readIntCfg(cfg, "mainWingDistanceMinMeters", 60); + int maxD = readIntCfg(cfg, "mainWingDistanceMaxMeters", 260); + int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); + int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); + double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); + double base = minD + (maxD - minD) * t; + String key = "mainWingDistanceModeFactor_default"; + if ("near_fast".equals(deployMode)) { + key = "mainWingDistanceModeFactor_near_fast"; + } else if ("far_fast".equals(deployMode)) { + key = "mainWingDistanceModeFactor_far_fast"; + } else if ("near_slow".equals(deployMode)) { + key = "mainWingDistanceModeFactor_near_slow"; + } + double factor = readDoubleCfg(cfg, key, 1.0d); + int finalDist = (int) Math.round(base * factor); + return clampInt(finalDist, minD, maxD); +} + +function double computeDefenseZoneScaleMeters(Task blueTask) { + if (blueTask == null || blueTask.getDefZoneLocation() == null || blueTask.getDefZoneLocation().size() < 3) { + return -1.0d; + } + List points = blueTask.getDefZoneLocation(); + double maxD = -1.0d; + for (int i = 0; i < points.size(); i++) { + Coordinate a = (Coordinate) points.get(i); + if (a == null || a.getLongitude() == null || a.getLatitude() == null) { + continue; + } + for (int j = i + 1; j < points.size(); j++) { + Coordinate b = (Coordinate) points.get(j); + if (b == null || b.getLongitude() == null || b.getLatitude() == null) { + continue; + } + double d = approxDistanceMeters( + a.getLongitude().doubleValue(), + a.getLatitude().doubleValue(), + b.getLongitude().doubleValue(), + b.getLatitude().doubleValue() + ); + if (d > maxD) { + maxD = d; + } + } + } + return maxD; +} + +function double normalizeByRange(double value, double minV, double maxV) { + if (maxV <= minV) { + return 0.0d; + } + if (value <= minV) { + return 0.0d; + } + if (value >= maxV) { + return 1.0d; + } + return (value - minV) / (maxV - minV); +} + +function int clampInt(int value, int minV, int maxV) { + if (value < minV) { + return minV; + } + if (value > maxV) { + return maxV; + } + return value; +} + +/** 入参武器坐标高度>0 视为已指定部署高度 */ +function int readWeaponHeightIfValid(Weapon w) { + if (w == null || w.getCoordinate() == null || w.getCoordinate().getHeight() == null) { + return -1; + } + int h = w.getCoordinate().getHeight().intValue(); + return h > 0 ? h : -1; +} + +function int resolveBlueBaseHeight(Task blueTask, Map cfg) { + int fallback = readIntCfg(cfg, "airHeightFallback", readIntCfg(cfg, "airDeployHeight", 300)); + if (blueTask != null && blueTask.getTrackPoints() != null && !blueTask.getTrackPoints().isEmpty()) { + TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); + if (tail != null && tail.getHeight() != null && tail.getHeight().intValue() > 0) { + return tail.getHeight().intValue(); + } + } + if (blueTask != null && blueTask.getTaskWeapons() != null) { + int sum = 0; + int cnt = 0; + for (Object o : blueTask.getTaskWeapons()) { + Weapon bw = (Weapon) o; + if (bw == null || bw.getCoordinate() == null || bw.getCoordinate().getHeight() == null) { + continue; + } + int hh = bw.getCoordinate().getHeight().intValue(); + if (hh > 0) { + sum += hh; + cnt++; + } + } + if (cnt > 0) { + return sum / cnt; + } + } + return fallback; +} + +function int resolveRoleHeightAdjust(Weapon w, int indexInFormation, Map cfg) { + int mainAdj = readIntCfg(cfg, "airHeightAdjustMain", 20); + int wingAdj = readIntCfg(cfg, "airHeightAdjustWing", -10); + if (w != null && w.getFormationRole() != null && !w.getFormationRole().trim().equals("")) { + if ("MAIN".equalsIgnoreCase(w.getFormationRole())) { + return mainAdj; + } + if ("WING".equalsIgnoreCase(w.getFormationRole())) { + return wingAdj; + } + } + return indexInFormation == 0 ? mainAdj : wingAdj; +} + +function int computeAutoAirHeight(Weapon w, Task blueTask, Map cfg, int indexInFormation) { + int minH = readIntCfg(cfg, "airHeightMin", 50); + int maxH = readIntCfg(cfg, "airHeightMax", 20000); + int base = resolveBlueBaseHeight(blueTask, cfg); + int speedTh = readIntCfg(cfg, "airHeightSpeedThreshold", 180); + int fastAdj = readIntCfg(cfg, "airHeightAdjustFast", 40); + int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); + int speedAdj = (avgSpeed >= speedTh) ? fastAdj : 0; + double d = computeDefMinDistanceMeters(blueTask); + int nearD = readIntCfg(cfg, "airHeightNearDefenseDistance", 800); + int farD = readIntCfg(cfg, "airHeightFarDefenseDistance", 2500); + int nearAdj = readIntCfg(cfg, "airHeightAdjustNear", -30); + int farAdj = readIntCfg(cfg, "airHeightAdjustFar", 40); + int distAdj = 0; + if (d < Double.MAX_VALUE / 4.0d) { + if (d <= (double) nearD) { + distAdj = nearAdj; + } else if (d >= (double) farD) { + distAdj = farAdj; + } + } + int roleAdj = resolveRoleHeightAdjust(w, indexInFormation, cfg); + int sum = base + speedAdj + distAdj + roleAdj; + return clampInt(sum, minH, maxH); +} + +/** + * 空中武器部署高度:1) 入参已给高度优先 2) 开启自动则混合计算 3) 否则固定 airDeployHeight + * 地面武器:始终使用 defaultHeight(isAirGroup=false) + */ +function int resolveWeaponDeployHeight(Weapon w, Task blueTask, Map cfg, String deployMode, int indexInFormation, int defaultHeight, boolean isAirGroup) { + if (!isAirGroup) { + return defaultHeight; + } + int given = readWeaponHeightIfValid(w); + if (given > 0) { + return given; + } + if (cfg == null || !readBooleanCfg(cfg, "enableAutoAirDeployHeight", true)) { + return defaultHeight; + } + return computeAutoAirHeight(w, blueTask, cfg, indexInFormation); +} + +function Integer computeHeadingFromBlueTrack(Task blueTask) { + if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().size() < 2) { + return null; + } + List points = blueTask.getTrackPoints(); + TrackPoints p2 = (TrackPoints) points.get(points.size() - 1); + TrackPoints p1 = (TrackPoints) points.get(points.size() - 2); + if (p1 == null || p2 == null || p1.getLongitude() == null || p1.getLatitude() == null || p2.getLongitude() == null || p2.getLatitude() == null) { + return null; + } + double dLon = p2.getLongitude().doubleValue() - p1.getLongitude().doubleValue(); + double dLat = p2.getLatitude().doubleValue() - p1.getLatitude().doubleValue(); + if (Math.abs(dLon) < 1e-12 && Math.abs(dLat) < 1e-12) { + return null; + } + double deg = Math.toDegrees(Math.atan2(dLon, dLat)); + int heading = (int) Math.round(deg); + if (heading < 0) { + heading += 360; + } + if (heading >= 360) { + heading = heading % 360; + } + return Integer.valueOf(heading); +} + +function List sortWeaponsByFormationRole(List weapons) { + List mainList = new ArrayList(); + List wingList = new ArrayList(); + List unknownList = new ArrayList(); + for (Object obj : weapons) { + Weapon w = (Weapon) obj; + if (w == null) { + continue; + } + String role = w.getFormationRole(); + if (role != null && "MAIN".equalsIgnoreCase(role)) { + mainList.add(w); + } else if (role != null && "WING".equalsIgnoreCase(role)) { + wingList.add(w); + } else { + unknownList.add(w); + } + } + List result = new ArrayList(); + if (!mainList.isEmpty()) { + result.addAll(mainList); + result.addAll(wingList); + result.addAll(unknownList); + return result; + } + if (!unknownList.isEmpty()) { + result.add(unknownList.get(0)); + for (int i = 1; i < unknownList.size(); i++) { + result.add(unknownList.get(i)); + } + result.addAll(wingList); + return result; + } + result.addAll(wingList); + return result; +} + +function List buildFormationOffsets(String formationType, int size, int spacing) { + List result = new ArrayList(); + if (size <= 0) { + return result; + } + String type = formationType == null ? "TRIANGLE" : formationType.trim().toUpperCase(); + result.add(buildOffset(0.0d, 0.0d)); + for (int i = 1; i < size; i++) { + if ("DIAMOND".equals(type)) { + if (i == 1) { + result.add(buildOffset(-spacing, -spacing)); + } else if (i == 2) { + result.add(buildOffset(spacing, -spacing)); + } else if (i == 3) { + result.add(buildOffset(0.0d, -2.0d * spacing)); + } else { + int row = (i - 4) / 2 + 1; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * spacing * (row + 1), -spacing * (row + 2))); + } + } else if ("LINE".equals(type)) { + int sign = (i % 2 == 0) ? 1 : -1; + int k = (i + 1) / 2; + result.add(buildOffset(sign * k * spacing, 0.0d)); + } else if ("COLUMN".equals(type)) { + result.add(buildOffset(0.0d, -i * spacing)); + } else if ("WEDGE".equals(type)) { + int layer = (i + 1) / 2; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * layer * spacing, -layer * spacing)); + } else { // TRIANGLE/default + int layer = (i + 1) / 2; + int sign = (i % 2 == 0) ? 1 : -1; + result.add(buildOffset(sign * layer * spacing, -layer * spacing)); + } + } + return result; +} + +function Map buildOffset(double dx, double dy) { + Map m = new java.util.HashMap(); + m.put("dx", Double.valueOf(dx)); + m.put("dy", Double.valueOf(dy)); + return m; +} + +function Coordinate moveCoordinateByMeters(Coordinate anchor, double dxMeters, double dyMeters, int headingDeg, int height) { + if (anchor == null || anchor.getLongitude() == null || anchor.getLatitude() == null) { + return null; + } + double rad = Math.toRadians((double) headingDeg); + double rx = (dxMeters * Math.cos(rad)) - (dyMeters * Math.sin(rad)); + double ry = (dxMeters * Math.sin(rad)) + (dyMeters * Math.cos(rad)); + double lat = anchor.getLatitude().doubleValue() + metersToLatDeg(ry); + double lon = anchor.getLongitude().doubleValue() + metersToLonDeg(rx, anchor.getLatitude().doubleValue()); + Coordinate c = new Coordinate(); + c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); + c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); + c.setHeight(height); + return c; +} + +function void applyTrajectoryGeneration(FactTask fact, Map cfg) { + if (!readBooleanCfg(cfg, "enableTrajectoryRules", true)) { + return; + } + if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { + return; + } + Task blueTask = fact.getBlueTask(); + Task redTask = fact.getRedTask(); + List blueTrack = blueTask.getTrackPoints(); + if (blueTrack == null || blueTrack.isEmpty()) { + return; + } + List defZone = blueTask.getDefZoneLocation(); + if (defZone == null || defZone.size() < 3) { + return; + } + String strategy = chooseTrajectoryStrategy(blueTask, cfg); + Coordinate endPoint = findNearestDefPointToBlueTail(blueTask); + List redTrack = generateRedTrackPoints(blueTrack, strategy, cfg, endPoint); + if (redTrack != null && !redTrack.isEmpty()) { + redTask.setTrackPoints(redTrack); + } +} + +function String chooseTrajectoryStrategy(Task blueTask, Map cfg) { + String mode = String.valueOf(cfg.get("strategyMode")); + if (mode == null || mode.trim().equals("")) { + mode = "auto"; + } + mode = mode.trim().toLowerCase(); + if (!mode.equals("auto")) { + return fallbackToEnabledStrategy(mode, cfg); + } + double defMinDistance = computeDefMinDistanceMeters(blueTask); + int avgSpeed = computeAverageSpeed(blueTask.getTrackPoints()); + int near = readIntCfg(cfg, "nearDefDistanceMeters", 800); + int far = readIntCfg(cfg, "farDefDistanceMeters", 2500); + int fast = readIntCfg(cfg, "fastSpeedThreshold", 180); + String selected = "flank"; + if (avgSpeed >= fast && defMinDistance <= near) { + selected = "shortest"; + } else if (avgSpeed >= fast && defMinDistance >= far) { + selected = "interfere"; + } + return fallbackToEnabledStrategy(selected, cfg); +} + +function String fallbackToEnabledStrategy(String preferred, Map cfg) { + if (isStrategyEnabled(preferred, cfg)) { + return preferred; + } + if (isStrategyEnabled("shortest", cfg)) { + return "shortest"; + } + if (isStrategyEnabled("flank", cfg)) { + return "flank"; + } + if (isStrategyEnabled("interfere", cfg)) { + return "interfere"; + } + return "shortest"; +} + +function boolean isStrategyEnabled(String strategy, Map cfg) { + if (strategy == null) { + return false; + } + if (strategy.equals("shortest")) { + return readBooleanCfg(cfg, "enableShortest", true); + } + if (strategy.equals("flank")) { + return readBooleanCfg(cfg, "enableFlank", true); + } + if (strategy.equals("interfere")) { + return readBooleanCfg(cfg, "enableInterfere", true); + } + return false; +} + +function Coordinate findNearestDefPointToBlueTail(Task blueTask) { + if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().isEmpty() || blueTask.getDefZoneLocation() == null || blueTask.getDefZoneLocation().isEmpty()) { + return null; + } + TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); + if (tail == null || tail.getLongitude() == null || tail.getLatitude() == null) { + return null; + } + Coordinate nearest = null; + double best = Double.MAX_VALUE; + for (Object obj : blueTask.getDefZoneLocation()) { + Coordinate c = (Coordinate) obj; + if (c == null || c.getLongitude() == null || c.getLatitude() == null) { + continue; + } + double d = approxDistanceMeters(tail.getLongitude().doubleValue(), tail.getLatitude().doubleValue(), c.getLongitude().doubleValue(), c.getLatitude().doubleValue()); + if (d < best) { + best = d; + nearest = c; + } + } + return nearest; +} + +function double computeDefMinDistanceMeters(Task blueTask) { + Coordinate nearest = findNearestDefPointToBlueTail(blueTask); + if (nearest == null || blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().isEmpty()) { + return Double.MAX_VALUE; + } + TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); + return approxDistanceMeters( + tail.getLongitude().doubleValue(), + tail.getLatitude().doubleValue(), + nearest.getLongitude().doubleValue(), + nearest.getLatitude().doubleValue() + ); +} + +function int computeAverageSpeed(List trackPoints) { + if (trackPoints == null || trackPoints.isEmpty()) { + return 0; + } + int total = 0; + int count = 0; + for (Object obj : trackPoints) { + TrackPoints p = (TrackPoints) obj; + if (p == null || p.getSpeed() == null) { + continue; + } + total += p.getSpeed(); + count++; + } + if (count <= 0) { + return 0; + } + return total / count; +} + +function List generateRedTrackPoints(List blueTrackPoints, String strategy, Map cfg, Coordinate endPoint) { + List result = new ArrayList(); + if (blueTrackPoints == null || blueTrackPoints.isEmpty()) { + return result; + } + TrackPoints start = (TrackPoints) blueTrackPoints.get(0); + TrackPoints tail = (TrackPoints) blueTrackPoints.get(blueTrackPoints.size() - 1); + if (start == null || start.getLongitude() == null || start.getLatitude() == null) { + return result; + } + double sLon = start.getLongitude().doubleValue(); + double sLat = start.getLatitude().doubleValue(); + double eLon = (endPoint != null && endPoint.getLongitude() != null) ? endPoint.getLongitude().doubleValue() : (tail == null || tail.getLongitude() == null ? sLon : tail.getLongitude().doubleValue()); + double eLat = (endPoint != null && endPoint.getLatitude() != null) ? endPoint.getLatitude().doubleValue() : (tail == null || tail.getLatitude() == null ? sLat : tail.getLatitude().doubleValue()); + double dx = eLon - sLon; + double dy = eLat - sLat; + int n = blueTrackPoints.size(); + int flankOffset = readIntCfg(cfg, "flankOffsetMeters", 150); + int intBase = readIntCfg(cfg, "interfereOffsetMeters", 120); + int intAmp = readIntCfg(cfg, "interfereZigzagAmplitude", 90); + boolean keepBlueHeight = readBooleanCfg(cfg, "keepBlueHeight", true); + int redH = readIntCfg(cfg, "redTrackHeightOverride", 200); + + for (int i = 0; i < n; i++) { + double t = (n <= 1) ? 1.0d : ((double) i / (double) (n - 1)); + double baseLon = sLon + dx * t; + double baseLat = sLat + dy * t; + double offMeters = 0.0d; + if ("flank".equals(strategy)) { + offMeters = flankOffset * Math.sin(Math.PI * t); + } else if ("interfere".equals(strategy)) { + double zig = (i % 2 == 0 ? 1.0d : -1.0d) * intAmp; + offMeters = intBase * Math.sin(2.0d * Math.PI * t) + zig; + } + double latDeg = metersToLatDeg(offMeters); + double lonDeg = metersToLonDeg(offMeters, baseLat); + double norm = Math.sqrt(dx * dx + dy * dy); + if (norm < 1e-10) { + norm = 1e-10; + } + double nx = -dy / norm; + double ny = dx / norm; + double finalLon = baseLon + nx * lonDeg; + double finalLat = baseLat + ny * latDeg; + + TrackPoints blueP = (TrackPoints) blueTrackPoints.get(i); + TrackPoints redP = new TrackPoints(); + redP.setIndex(i); + redP.setLongitude(new java.math.BigDecimal(String.valueOf(finalLon))); + redP.setLatitude(new java.math.BigDecimal(String.valueOf(finalLat))); + redP.setSpeed(blueP == null || blueP.getSpeed() == null ? 0 : blueP.getSpeed()); + if (keepBlueHeight) { + redP.setHeight(blueP == null || blueP.getHeight() == null ? redH : blueP.getHeight()); + } else { + redP.setHeight(redH); + } + result.add(redP); + } + return result; +} + +function double metersToLatDeg(double meters) { + return meters / 111000.0d; +} + +function double metersToLonDeg(double meters, double latitudeDeg) { + double cos = Math.cos(Math.toRadians(latitudeDeg)); + if (Math.abs(cos) < 1e-6) { + cos = 1e-6; + } + return meters / (111000.0d * cos); +} + +function double approxDistanceMeters(double lon1, double lat1, double lon2, double lat2) { + double dx = (lon2 - lon1) * 111000.0d * Math.cos(Math.toRadians((lat1 + lat2) / 2.0d)); + double dy = (lat2 - lat1) * 111000.0d; + return Math.sqrt(dx * dx + dy * dy); +} + +function List extractZonePolygonFromTask(FactTask fact, boolean isCombat) { + // 输入约定:Task.warZoneLocation / defZoneLocation 传入 4 个经纬点(高度可空) + List result = new ArrayList(); + Task blueTask = fact == null ? null : fact.getBlueTask(); + if (blueTask == null) { + return result; + } + List source = isCombat ? blueTask.getWarZoneLocation() : blueTask.getDefZoneLocation(); + if (source == null || source.isEmpty()) { + return result; + } + for (Object oneObj : source) { + Coordinate one = (Coordinate) oneObj; + if (one == null || one.getLongitude() == null || one.getLatitude() == null) { + continue; + } + Coordinate c = new Coordinate(); + c.setLongitude(one.getLongitude()); + c.setLatitude(one.getLatitude()); + c.setHeight(one.getHeight()); + result.add(c); + } + return result; +} + +function List normalizeToCoordinateList(Object raw) { + List result = new ArrayList(); + if (raw == null) { + return result; + } + if (!(raw instanceof List)) { + return result; + } + List values = (List) raw; + for (Object obj : values) { + Coordinate c = toCoordinate(obj); + if (c != null) { + result.add(c); + } + } + return result; +} + +function Coordinate toCoordinate(Object obj) { + if (obj == null) { + return null; + } + if (obj instanceof Coordinate) { + return (Coordinate) obj; + } + if (obj instanceof Map) { + Map m = (Map) obj; + Object lon = m.get("longitude"); + Object lat = m.get("latitude"); + Object h = m.get("height"); + if (lon == null || lat == null) { + return null; + } + Coordinate c = new Coordinate(); + try { + c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); + c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); + c.setHeight(h == null ? 0 : parseIntSafe(String.valueOf(h), 0)); + return c; + } catch (Exception ex) { + return null; + } + } + return null; +} + +function List buildGridPointsInPolygon(List polygon, int spacingMeters, int defaultHeight) { + List points = new ArrayList(); + if (polygon == null || polygon.size() < 3) { + return points; + } + double step = ((double) spacingMeters) / 111000.0d; + if (step <= 0) { + step = 0.0009d; + } + double minLon = 180.0d; + double maxLon = -180.0d; + double minLat = 90.0d; + double maxLat = -90.0d; + for (Object cObj : polygon) { + Coordinate c = (Coordinate) cObj; + if (c == null || c.getLongitude() == null || c.getLatitude() == null) { + continue; + } + double lon = c.getLongitude().doubleValue(); + double lat = c.getLatitude().doubleValue(); + if (lon < minLon) minLon = lon; + if (lon > maxLon) maxLon = lon; + if (lat < minLat) minLat = lat; + if (lat > maxLat) maxLat = lat; + } + for (double lon = minLon; lon <= maxLon; lon += step) { + for (double lat = minLat; lat <= maxLat; lat += step) { + if (isPointInsidePolygon(lon, lat, polygon)) { + Coordinate c = new Coordinate(); + c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); + c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); + c.setHeight(defaultHeight); + points.add(c); + } + } + } + return points; +} + +function boolean isPointInsidePolygon(double x, double y, List polygon) { + if (polygon == null || polygon.size() < 3) { + return false; + } + boolean inside = false; + int n = polygon.size(); + int j = n - 1; + for (int i = 0; i < n; i++) { + Coordinate pi = (Coordinate) polygon.get(i); + Coordinate pj = (Coordinate) polygon.get(j); + if (pi == null || pj == null || pi.getLongitude() == null || pi.getLatitude() == null || pj.getLongitude() == null || pj.getLatitude() == null) { + j = i; + continue; + } + double xi = pi.getLongitude().doubleValue(); + double yi = pi.getLatitude().doubleValue(); + double xj = pj.getLongitude().doubleValue(); + double yj = pj.getLatitude().doubleValue(); + boolean intersect = ((yi > y) != (yj > y)) + && (x < (xj - xi) * (y - yi) / ((yj - yi) == 0 ? 1e-12 : (yj - yi)) + xi); + if (intersect) { + inside = !inside; + } + j = i; + } + return inside; +} + +function Coordinate pickCoordinateByPreference(List first, List second, Map cursor, String key) { + Coordinate c1 = pickCoordinateRoundRobin(first, cursor, "first_" + key); + if (c1 != null) { + return c1; + } + return pickCoordinateRoundRobin(second, cursor, "second_" + key); +} + +function Coordinate pickCoordinateRoundRobin(List values, Map cursor, String key) { + if (values == null || values.isEmpty()) { + return null; + } + Integer idxObj = (Integer) cursor.get(key); + int idx = idxObj == null ? 0 : idxObj.intValue(); + Coordinate value = (Coordinate) values.get(idx % values.size()); + cursor.put(key, idx + 1); + return value; +} + +function Coordinate cloneCoordinateWithHeight(Coordinate source, int height) { + if (source == null) { + return null; + } + Coordinate c = new Coordinate(); + c.setLongitude(source.getLongitude()); + c.setLatitude(source.getLatitude()); + c.setHeight(height); + return c; +} + +function Map extractBlueTargetPools(List blueWeapons) { + Map pools = new java.util.HashMap(); + pools.put("air", new ArrayList()); + pools.put("armor", new ArrayList()); + pools.put("artillery", new ArrayList()); + pools.put("ground", new ArrayList()); + pools.put("missile", new ArrayList()); + pools.put("all", new ArrayList()); + + for (Object obj : blueWeapons) { + Weapon blueWeapon = (Weapon) obj; + if (blueWeapon == null) { + continue; + } + String id = blueWeapon.getEquipmentId(); + if (isBlank(id)) { + continue; + } + addUnique((List) pools.get("all"), id); + if (isAirWeapon(blueWeapon)) { + addUnique((List) pools.get("air"), id); + } + if (isArmorWeapon(blueWeapon)) { + addUnique((List) pools.get("armor"), id); + } + if (isArtilleryWeapon(blueWeapon)) { + addUnique((List) pools.get("artillery"), id); + } + if (isGroundWeapon(blueWeapon)) { + addUnique((List) pools.get("ground"), id); + } + if (hasMissileComponent(blueWeapon)) { + addUnique((List) pools.get("missile"), id); + } + } + return pools; +} + +function String inferBluePoolKeyForRedWeapon(Weapon redWeapon) { + if (redWeapon == null || redWeapon.getName() == null) { + return "ground"; + } + String name = redWeapon.getName(); + if (name.contains("反坦克")) { + return "armor"; + } + if (name.contains("防空导弹") || name.contains("无人机") || name.contains("直升机")) { + return "air"; + } + if (name.contains("迫榴炮") || name.contains("迫击炮")) { + return "artillery"; + } + if (name.contains("导弹发射车")) { + return "missile"; + } + return "ground"; +} + +function String pickTargetIdFromPools(Map pools, Map cursor, String preferredKey) { + String fromPreferred = pickFromSinglePool(pools, cursor, preferredKey); + if (!isBlank(fromPreferred)) { + return fromPreferred; + } + if (!"ground".equals(preferredKey)) { + String fromGround = pickFromSinglePool(pools, cursor, "ground"); + if (!isBlank(fromGround)) { + return fromGround; + } + } + return pickFromSinglePool(pools, cursor, "all"); +} + +function String pickFromSinglePool(Map pools, Map cursor, String poolKey) { + if (pools == null || cursor == null || poolKey == null) { + return null; + } + List ids = (List) pools.get(poolKey); + if (ids == null || ids.isEmpty()) { + return null; + } + Integer idxObj = (Integer) cursor.get(poolKey); + int idx = idxObj == null ? 0 : idxObj.intValue(); + String id = (String) ids.get(idx % ids.size()); + cursor.put(poolKey, idx + 1); + return id; +} + +function void addUnique(List values, String value) { + if (values == null || isBlank(value)) { + return; + } + if (!containsString(values, value)) { + values.add(value); + } +} + +function boolean isBlank(String text) { + return text == null || text.trim().equals(""); +} + +function void assignTaskNameByRedWeapons(FactTask fact, Map cfg) { + if (fact == null || fact.getRedTask() == null) { + return; + } + Task redTask = fact.getRedTask(); + List redWeapons = redTask.getTaskWeapons(); + String category = classifyTaskByRedWeapons(redWeapons); + + // 一致性校验:分类与武器不一致则回落通用打击 + if (!isTaskCategoryConsistent(category, redWeapons)) { + category = "general"; + } + + redTask.setDrawName(resolveTaskNameByCategory(cfg, category)); + redTask.setDataType(resolveTaskDataTypeByCategory(cfg, category)); +} + +function String classifyTaskByRedWeapons(List redWeapons) { + if (redWeapons == null || redWeapons.isEmpty()) { + return "general"; + } + // 符合实际的优先级:导弹突击 > 防空压制 > 反装甲 > 炮火压制 > 通用 + if (hasRedWeaponName(redWeapons, "导弹发射车")) { + return "missile_strike"; + } + if (hasAnyRedWeaponName(redWeapons, "防空导弹武器,火力打击无人机,武装直升机")) { + return "air_defence"; + } + if (hasAnyRedWeaponName(redWeapons, "反坦克火箭,反坦克导弹系统")) { + return "anti_armor"; + } + if (hasAnyRedWeaponName(redWeapons, "迫榴炮,车载迫击炮")) { + return "artillery"; + } + return "general"; +} + +function boolean isTaskCategoryConsistent(String category, List redWeapons) { + if (category == null) { + return false; + } + if (category.equals("missile_strike")) { + return hasRedWeaponName(redWeapons, "导弹发射车"); + } + if (category.equals("air_defence")) { + return hasAnyRedWeaponName(redWeapons, "防空导弹武器,火力打击无人机,武装直升机"); + } + if (category.equals("anti_armor")) { + return hasAnyRedWeaponName(redWeapons, "反坦克火箭,反坦克导弹系统"); + } + if (category.equals("artillery")) { + return hasAnyRedWeaponName(redWeapons, "迫榴炮,车载迫击炮"); + } + return true; +} + +function String resolveTaskNameByCategory(Map cfg, String category) { + if (cfg == null || category == null) { + return "通用打击任务"; + } + if (category.equals("missile_strike")) { + return String.valueOf(cfg.get("taskName_missile_strike")); + } + if (category.equals("air_defence")) { + return String.valueOf(cfg.get("taskName_air_defence")); + } + if (category.equals("anti_armor")) { + return String.valueOf(cfg.get("taskName_anti_armor")); + } + if (category.equals("artillery")) { + return String.valueOf(cfg.get("taskName_artillery")); + } + return String.valueOf(cfg.get("taskName_general")); +} + +function String resolveTaskDataTypeByCategory(Map cfg, String category) { + if (cfg == null || category == null) { + return "strike"; + } + if (category.equals("missile_strike")) { + return String.valueOf(cfg.get("taskDataType_missile_strike")); + } + if (category.equals("air_defence")) { + return String.valueOf(cfg.get("taskDataType_air_defence")); + } + if (category.equals("anti_armor")) { + return String.valueOf(cfg.get("taskDataType_anti_armor")); + } + if (category.equals("artillery")) { + return String.valueOf(cfg.get("taskDataType_artillery")); + } + return String.valueOf(cfg.get("taskDataType_general")); +} + +function boolean hasAnyRedWeaponName(List redWeapons, String commaNames) { + if (redWeapons == null || redWeapons.isEmpty() || commaNames == null || commaNames.equals("")) { + return false; + } + String[] names = commaNames.split(","); + for (int i = 0; i < names.length; i++) { + String one = names[i]; + if (one == null) { + continue; + } + if (hasRedWeaponName(redWeapons, one.trim())) { + return true; + } + } + return false; +} + +function boolean hasRedWeaponName(List redWeapons, String weaponName) { + if (redWeapons == null || redWeapons.isEmpty() || weaponName == null || weaponName.equals("")) { + return false; + } + for (Object obj : redWeapons) { + Weapon w = (Weapon) obj; + if (w != null && w.getName() != null && w.getName().equals(weaponName)) { + return true; + } + } + return false; +} + +// 蓝方组件模板:仅在组件缺失时补齐,作为规则联动测试用 +function void buildBlueTestComponents(List weapons) { + if (weapons == null || weapons.isEmpty()) { + return; + } + for (Object obj : weapons) { + Weapon weapon = (Weapon) obj; + if (weapon == null) { + continue; + } + List components = weapon.getComponents(); + if (components == null) { + components = new ArrayList<>(); + weapon.setComponents(components); + } + if (!components.isEmpty()) { + continue; + } + + // 蓝方主要用于触发规则,模板尽量简洁 + if (isAirWeapon(weapon)) { + components.add(buildComponent("火控雷达", "220", "探测范围米", 1)); + components.add(buildComponent("空空导弹", "220", "破坏范围米", 1)); + } else if (isArtilleryWeapon(weapon)) { + components.add(buildComponent("炮弹", "1200", "范围米", 6)); + } else if (isGroundWeapon(weapon)) { + components.add(buildComponent("机枪", "600", "射程米", 1)); + } + } +} + +// 红方基础组件模板:便于业务人员看懂武器都带了哪些能力 +function void ensureBasicRedComponents(Weapon weapon) { + if (weapon == null) { + return; + } + String name = weapon.getName(); + if (name == null) { + name = ""; + } + if (name.contains("防空导弹")) { + ensureComponent(weapon, "搜索雷达", "260", "探测范围米", 1); + ensureComponent(weapon, "防空导弹", "300", "破坏范围米", 1); + } else if (name.contains("无人机")) { + ensureComponent(weapon, "光电吊舱", "180", "识别范围米", 1); + ensureComponent(weapon, "空地导弹", "260", "破坏范围米", 1); + } else if (name.contains("武装直升机")) { + ensureComponent(weapon, "火控雷达", "220", "探测范围米", 1); + ensureComponent(weapon, "机载导弹", "280", "破坏范围米", 2); + } else if (name.contains("反坦克火箭")) { + ensureComponent(weapon, "火箭弹", "200", "破坏范围米", 4); + } else if (name.contains("反坦克导弹系统")) { + ensureComponent(weapon, "反坦克导弹", "320", "破坏范围米", 2); + ensureComponent(weapon, "激光测距", "180", "测距米", 1); + } else if (name.contains("迫榴炮") || name.contains("迫击炮")) { + ensureComponent(weapon, "炮弹", "1500", "范围米", 8); + } else if (name.contains("导弹发射车")) { + ensureComponent(weapon, "导弹发射架", "260", "破坏范围米", 1); + ensureComponent(weapon, "制导雷达", "240", "探测范围米", 1); + } else { + // 兜底组件,避免出现完全无组件的武器 + ensureComponent(weapon, "火控系统", "100", "作用范围米", 1); + } +} + +// 炮类限制:武器组件只能保留“炮弹”,并固定参数单位“范围米” +function void limitRedArtilleryToShellOnly(List redWeapons, String shellRangeDefault) { + if (redWeapons == null || redWeapons.isEmpty()) { + return; + } + for (Object obj : redWeapons) { + Weapon redWeapon = (Weapon) obj; + if (redWeapon == null || !isArtilleryWeapon(redWeapon)) { + continue; + } + List onlyShell = new ArrayList<>(); + onlyShell.add(buildComponent("炮弹", shellRangeDefault, "范围米", 8)); + redWeapon.setComponents(onlyShell); + } +} + +function Weapon ensureRedWeapon(List redWeapons, String name, String supportType, int number) { + for (Object obj : redWeapons) { + Weapon w = (Weapon) obj; + if (w != null && w.getName() != null && w.getName().equals(name)) { + if (w.getSupportType() == null || w.getSupportType().equals("")) { + w.setSupportType(supportType); + } + if (w.getNumber() == null || w.getNumber() <= 0) { + w.setNumber(number); + } + if (w.getComponents() == null) { + w.setComponents(new ArrayList<>()); + } + return w; + } + } + Weapon w = new Weapon(); + w.setName(name); + w.setSupportType(supportType); + w.setNumber(number); + w.setComponents(new ArrayList<>()); + redWeapons.add(w); + return w; +} + +function void ensureMissileComponentForRedAirWeapon(Weapon redWeapon, int missileNumber, int missileRange) { + List components = redWeapon.getComponents(); + if (components == null) { + components = new ArrayList<>(); + redWeapon.setComponents(components); + } + for (SubComponents c : components) { + if (c != null && c.getDeviceName() != null && c.getDeviceName().contains("导弹")) { + ensureOrUpdateParam(c, String.valueOf(missileRange), "破坏范围米", missileNumber); + return; + } + } + components.add(buildComponent("联动导弹", String.valueOf(missileRange), "破坏范围米", missileNumber)); +} + +function void ensureComponent(Weapon weapon, String deviceName, String value, String unit, int number) { + List components = weapon.getComponents(); + if (components == null) { + components = new ArrayList<>(); + weapon.setComponents(components); + } + for (SubComponents c : components) { + if (c != null && c.getDeviceName() != null && c.getDeviceName().equals(deviceName)) { + ensureOrUpdateParam(c, value, unit, number); + return; + } + } + components.add(buildComponent(deviceName, value, unit, number)); +} + +function SubComponents buildComponent(String deviceName, String value, String unit, int number) { + SubComponents component = new SubComponents(); + component.setDeviceName(deviceName); + List params = new ArrayList<>(); + ComponentParam param = new ComponentParam(); + param.setAttDefaultValue(value); + param.setAttExplain(unit); + param.setNumber(number); + params.add(param); + component.setComponentParams(params); + return component; +} + +function void ensureOrUpdateParam(SubComponents component, String value, String unit, int number) { + List params = component.getComponentParams(); + if (params == null) { + params = new ArrayList<>(); + component.setComponentParams(params); + } + if (params.isEmpty()) { + ComponentParam param = new ComponentParam(); + param.setAttDefaultValue(value); + param.setAttExplain(unit); + param.setNumber(number); + params.add(param); + return; + } + ComponentParam first = params.get(0); + first.setAttDefaultValue(value); + first.setAttExplain(unit); + first.setNumber(number); +} + +function int countBlueMissileNumber(List weapons) { + int total = 0; + for (Object obj : weapons) { + Weapon w = (Weapon) obj; + if (w == null || w.getComponents() == null) { + continue; + } + for (SubComponents c : w.getComponents()) { + if (c == null || c.getDeviceName() == null || !c.getDeviceName().contains("导弹")) { + continue; + } + int n = 1; + if (c.getComponentParams() != null && !c.getComponentParams().isEmpty() && c.getComponentParams().get(0) != null && c.getComponentParams().get(0).getNumber() != null) { + n = c.getComponentParams().get(0).getNumber(); + } + total = total + n; + } + } + return total; +} + +function int readBlueMissileRange(List weapons, int fallback) { + int best = 0; + for (Object obj : weapons) { + Weapon w = (Weapon) obj; + if (w == null || w.getComponents() == null) { + continue; + } + for (SubComponents c : w.getComponents()) { + if (c == null || c.getDeviceName() == null || !c.getDeviceName().contains("导弹")) { + continue; + } + if (c.getComponentParams() == null || c.getComponentParams().isEmpty() || c.getComponentParams().get(0) == null) { + continue; + } + String value = c.getComponentParams().get(0).getAttDefaultValue(); + int parsed = parseIntSafe(value, fallback); + if (parsed > best) { + best = parsed; + } + } + } + if (best <= 0) { + return fallback; + } + return best; +} + +function int parseIntSafe(String text, int fallback) { + if (text == null || text.equals("")) { + return fallback; + } + try { + return Integer.parseInt(text.trim()); + } catch (Exception ex) { + return fallback; + } +} + +function double parseDoubleSafe(String text, double fallback) { + if (text == null || text.equals("")) { + return fallback; + } + try { + return Double.parseDouble(text.trim()); + } catch (Exception ex) { + return fallback; + } +} + +function int readIntCfg(Map cfg, String key, int fallback) { + if (cfg == null || key == null) { + return fallback; + } + Object value = cfg.get(key); + if (value == null) { + return fallback; + } + if (value instanceof Integer) { + return ((Integer) value).intValue(); + } + return parseIntSafe(String.valueOf(value), fallback); +} + +function boolean readBooleanCfg(Map cfg, String key, boolean fallback) { + if (cfg == null || key == null) { + return fallback; + } + Object value = cfg.get(key); + if (value == null) { + return fallback; + } + if (value instanceof Boolean) { + return ((Boolean) value).booleanValue(); + } + String text = String.valueOf(value); + if (text == null) { + return fallback; + } + return "true".equalsIgnoreCase(text.trim()); +} + +function double readDoubleCfg(Map cfg, String key, double fallback) { + if (cfg == null || key == null) { + return fallback; + } + Object value = cfg.get(key); + if (value == null) { + return fallback; + } + try { + return Double.parseDouble(String.valueOf(value).trim()); + } catch (Exception ex) { + return fallback; + } +} + +function boolean isRedAirWeapon(Weapon weapon) { + if (weapon == null) { + return false; + } + String supportType = weapon.getSupportType(); + String name = weapon.getName(); + return (supportType != null && (supportType.equals("overhead") || supportType.equals("plane"))) + || (name != null && (name.contains("无人机") || name.contains("直升机"))); +} + +function boolean isAirWeapon(Weapon weapon) { + if (weapon == null) { + return false; + } + String supportType = weapon.getSupportType(); + String name = weapon.getName(); + return (supportType != null && (supportType.equals("overhead") || supportType.equals("plane"))) + || (name != null && ( + name.contains("直升机") + || name.contains("地空导弹") + || name.contains("单兵防空导弹") + || name.contains("制导导弹") + || name.contains("无人机") + )); +} + +function boolean isGroundWeapon(Weapon weapon) { + if (weapon == null) { + return false; + } + String supportType = weapon.getSupportType(); + String name = weapon.getName(); + return (supportType != null && supportType.equals("ground")) + || (name != null && ( + name.contains("坦克") + || name.contains("装甲车") + || name.contains("迫击炮") + || name.contains("迫榴炮") + || name.contains("车载迫击炮") + || name.contains("导弹发射车") + || name.contains("反坦克") + )); +} + +function boolean isArtilleryWeapon(Weapon weapon) { + if (weapon == null || weapon.getName() == null) { + return false; + } + String name = weapon.getName(); + return name.contains("迫榴炮") + || name.contains("迫击炮") + || name.contains("车载迫击炮") + || name.contains("120mm"); +} + +function boolean isArmorWeapon(Weapon weapon) { + if (weapon == null || weapon.getName() == null) { + return false; + } + String name = weapon.getName(); + return name.contains("主战坦克") + || name.contains("坦克") + || name.contains("装甲车"); +} + +function boolean hasMissileComponent(Weapon weapon) { + if (weapon == null || weapon.getComponents() == null) { + return false; + } + for (SubComponents c : weapon.getComponents()) { + if (c != null && c.getDeviceName() != null && c.getDeviceName().contains("导弹")) { + return true; + } + } + return false; +} + +// ========== legacy 函数区(保留仅供回滚,不参与当前业务规则) ========== +function void matchLauncherComponents( + FactTask blueFact, + FactTask redFact, + String launcherName, + String redPlaneSupportType, + String redMissileVehicleKeyword, + String redMissileVehicleEnKeyword, + int redMoreThanBlueOffset, + int triggerBlueLauncherCount +) { + Task blueTask = blueFact.getBlueTask(); + Task redTask = redFact.getRedTask(); + if (blueTask == null || redTask == null) { + return; + } + + List blueWeapons = blueTask.getTaskWeapons(); + List redWeapons = redTask.getTaskWeapons(); + if (blueWeapons == null || redWeapons == null || redWeapons.isEmpty()) { + return; + } + + int blueLauncherCount = countLauncherComponents(blueWeapons, launcherName); + if (blueLauncherCount <= 0) { + return; + } + + // 规则1:红方若存在 plane 或导弹发射车,则这些武器都需要具备发射架 + List candidateRedWeapons = new ArrayList<>(); + for (Weapon redWeapon : redWeapons) { + if (isRedWeaponNeedLauncher(redWeapon, redPlaneSupportType, redMissileVehicleKeyword, redMissileVehicleEnKeyword)) { + candidateRedWeapons.add(redWeapon); + ensureWeaponHasLauncher(redWeapon, launcherName); + } + } + if (candidateRedWeapons.isEmpty()) { + return; + } + + // 规则2:当蓝方发射架数量达到触发值时,红方发射架数量 = 蓝方 + 可配置偏移量 + if (blueLauncherCount == triggerBlueLauncherCount) { + int targetRedLauncherCount = blueLauncherCount + redMoreThanBlueOffset; + int currentRedLauncherCount = countLauncherComponents(redWeapons, launcherName); + int needAdd = targetRedLauncherCount - currentRedLauncherCount; + if (needAdd > 0) { + Weapon fallbackWeapon = candidateRedWeapons.get(0); + for (int i = 0; i < needAdd; i++) { + addLauncherToWeapon(fallbackWeapon, launcherName); + } + } + } +} + +function boolean isRedWeaponNeedLauncher( + Weapon weapon, + String redPlaneSupportType, + String redMissileVehicleKeyword, + String redMissileVehicleEnKeyword +) { + if (weapon == null) { + return false; + } + String supportType = weapon.getSupportType(); + String weaponName = weapon.getName(); + return (supportType != null && supportType.equals(redPlaneSupportType)) + || (weaponName != null && (weaponName.contains(redMissileVehicleKeyword) || weaponName.contains(redMissileVehicleEnKeyword))); +} + +function void ensureWeaponHasLauncher(Weapon weapon, String launcherName) { + if (weapon == null) { + return; + } + List components = weapon.getComponents(); + if (components == null) { + components = new ArrayList<>(); + weapon.setComponents(components); + } + for (SubComponents component : components) { + if (component != null && component.getDeviceName() != null && component.getDeviceName().contains(launcherName)) { + return; + } + } + addLauncherToWeapon(weapon, launcherName); +} + +function void addLauncherToWeapon(Weapon weapon, String launcherName) { + List components = weapon.getComponents(); + if (components == null) { + components = new ArrayList<>(); + weapon.setComponents(components); + } + SubComponents launcher = new SubComponents(); + launcher.setDeviceName(launcherName); + components.add(launcher); +} + +function int countLauncherComponents(List weapons, String launcherName) { + if (weapons == null || weapons.isEmpty()) { + return 0; + } + int count = 0; + for (Object weaponObj : weapons) { + Weapon weapon = (Weapon) weaponObj; + if (weapon == null || weapon.getComponents() == null) { + continue; + } + for (SubComponents component : weapon.getComponents()) { + if (component != null && component.getDeviceName() != null && component.getDeviceName().contains(launcherName)) { + count++; + } + } + } + return count; +} + +//威胁等级添加武器函数 +function void threatLevels(FactTask redFact, Map params) { + // 创建武器列表 + List weapons = new ArrayList<>(); + + // 创建导弹发射车 + Weapon weapon1 = new Weapon(); + weapon1.setNumber((Integer) params.get("platNum")); + weapon1.setSupportType("ground"); + weapon1.setEquipmentId("1"); + weapon1.setName("missile-launching-vehicle"); + weapon1.setComponents(new ArrayList<>()); + + // 创建防空导弹武器 + Weapon weapon2 = new Weapon(); + weapon2.setNumber((Integer) params.get("platNum")); + weapon2.setSupportType("antiaircraft"); + weapon2.setEquipmentId("2"); + weapon2.setName("Anti-aircraft-missile-weapon"); + weapon2.setComponents(new ArrayList<>()); + + // 添加到列表 + weapons.add(weapon1); + weapons.add(weapon2); + + // 设置到红方任务 + redFact.getRedTask().setTaskWeapons(weapons); +} diff --git a/auto-solution-rule/src/main/resources/rules/rule.drl b/auto-solution-rule/src/main/resources/rules/rule.drl index e69de29..6e911f5 100644 --- a/auto-solution-rule/src/main/resources/rules/rule.drl +++ b/auto-solution-rule/src/main/resources/rules/rule.drl @@ -0,0 +1,37 @@ +package rules; + +import com.solution.rule.domain.ultimately.fact.DroolsFact; +import java.util.Map; + +import com.solution.rule.utils.RuleFunction.equipmentRule; + + +global java.util.Map globalParams; + +function Map buildParam(){ + Map param = new java.util.HashMap(); + //权重因子 + param.put("weight", 1); + //最低入选分数 + param.put("minSelectedScore",1); + //蓝方坦克类 -> 红方反坦克加分 + param.put("tankScore", 1); + //蓝方空中类 -> 红方反空中加分 + param.put("airScore", 2); + //蓝方地面类 -> 红方远程打击加分 + param.put("groundScore", 1); + //蓝方有导弹 -> 红方防空加分 + param.put("missileScore", 1); + //蓝方是空中任务 -> 红方防空加分 + param.put("airTaskScore", 10); + +} + +rule "装备匹配" +salience 100 +when + $fact : DroolsFact(task.side != "") +then + //如何引入Java静态方法? + equipmentRule($fact, globalParams); +end From 72f4caf555662868c6d780be2cfa637c44fe56b8 Mon Sep 17 00:00:00 2001 From: MHW Date: Tue, 7 Apr 2026 14:41:46 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=E8=A3=85=E5=A4=87=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/rule/FireRuleController.java | 10 +- .../config/FireRuleMatchDefaultParams.java | 33 + .../service/impl/FireRuleServiceImpl.java | 30 +- .../FireRuleRedWeaponOutputFillHelper.java | 152 + .../com/solution/rule/utils/RuleFunction.java | 322 +- .../src/main/resources/rules/fire-rule.drl | 3500 ----------------- .../src/main/resources/rules/rule.drl | 85 +- 7 files changed, 583 insertions(+), 3549 deletions(-) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/config/FireRuleMatchDefaultParams.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java delete mode 100644 auto-solution-rule/src/main/resources/rules/fire-rule.drl diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java index 4abef30..56ba729 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java @@ -86,16 +86,12 @@ public class FireRuleController extends BaseController { return success(ruleService.getComponents(platformId)); } - /** - * 开始执行规则匹配 - * @param task 敌方参数 - * @return - */ - @PostMapping("/rule") + + /* @PostMapping("/rule") @ApiOperation("开始执行规则匹配") public AjaxResult execute(@RequestBody Task task){ return success(ruleService.executeTask(task)); - } + }*/ /** diff --git a/auto-solution-rule/src/main/java/com/solution/rule/config/FireRuleMatchDefaultParams.java b/auto-solution-rule/src/main/java/com/solution/rule/config/FireRuleMatchDefaultParams.java new file mode 100644 index 0000000..f4c46c1 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/config/FireRuleMatchDefaultParams.java @@ -0,0 +1,33 @@ +package com.solution.rule.config; + +import java.util.HashMap; +import java.util.Map; + +/** + * 装备匹配规则默认参数,与 {@code resources/rules/rule.drl} 中 {@code buildParam} 键保持一致。 + */ +public final class FireRuleMatchDefaultParams { + + private FireRuleMatchDefaultParams() { + } + + public static Map defaults() { + Map param = new HashMap<>(); + param.put("weight", 1); + param.put("minSelectedScore", 1); + param.put("tankScore", 1); + param.put("airScore", 2); + param.put("groundScore", 1); + param.put("missileScore", 1); + param.put("airTaskScore", 10); + param.put("bluePlatformKeywords_air", "F-16,J-10,F-35"); + param.put("redPreferredWhenBlueAir", "防空,导弹,无人机,直升机,空空"); + param.put("redPreferredWhenGround", "远火,榴弹,炮,火箭"); + param.put("airTaskKeywords", "空中,制空,拦截,空战"); + param.put("groundTaskKeywords", "地面,突击,登陆"); + param.put("tankKeywords", "坦克,装甲"); + param.put("missileKeywords", "导弹,火箭弹,巡航"); + param.put("tieBreak", "equipmentId"); + return param; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java index 1d93c65..313aaca 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java @@ -12,6 +12,7 @@ import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO; import com.solution.rule.domain.ultimately.dto.FireRuleInputForceSideDTO; import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO; import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.config.FireRuleMatchDefaultParams; import com.solution.rule.domain.ultimately.fact.DroolsFact; import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; import com.solution.rule.domain.vo.ComponentCountVO; @@ -27,6 +28,7 @@ import com.solution.rule.strategy.SceneStrategy; import com.solution.rule.strategy.SceneStrategyFactory; import org.kie.api.KieBase; import org.kie.api.runtime.KieSession; +import org.kie.api.runtime.rule.FactHandle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -197,7 +199,7 @@ public class FireRuleServiceImpl implements FireRuleService { * @return */ @Override - public FireRuleOutputVO rule(FireRuleInputDTO task) { + public FireRuleOutputVO rule(FireRuleInputDTO task) { if(ObjectUtil.isEmpty(task)){ throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); } @@ -207,10 +209,9 @@ public class FireRuleServiceImpl implements FireRuleService { } //创建KieSession KieSession kieSession = kieBase.newKieSession(); - //设置Drools全局变量 Map globalParams = new HashMap<>(); +// globalParams.putAll(FireRuleMatchDefaultParams.defaults()); kieSession.setGlobal("globalParams", globalParams); - kieSession.insert(globalParams); //获取红方阵营id String redObjectHandleId = getObjectHandle(task); if(ObjectUtil.isEmpty(redObjectHandleId)){ @@ -229,16 +230,25 @@ public class FireRuleServiceImpl implements FireRuleService { fireRuleOutputVO.setSourceFile(task.getSourceFile()); DroolsFact droolsFact = new DroolsFact(); - droolsFact.setRedWeapons(redWeapons); - -// droolsFact.getFireRuleOutputVO().setRedWeapons(redWeapons); + droolsFact.setRedWeapons(new ArrayList<>(redWeapons)); droolsFact.setFireRuleOutputVO(fireRuleOutputVO); - for (FireRuleTaskInputDTO fireRuleTaskInputDTO : tasks) { - droolsFact.setTask(fireRuleTaskInputDTO); - kieSession.insert(droolsFact); + + FactHandle droolsFactHandle = null; + try { + for (FireRuleTaskInputDTO fireRuleTaskInputDTO : tasks) { + droolsFact.setTask(fireRuleTaskInputDTO); + if (droolsFactHandle == null) { + droolsFactHandle = kieSession.insert(droolsFact); + } else { + kieSession.update(droolsFactHandle, droolsFact); + } + kieSession.fireAllRules(); + } + } finally { + kieSession.dispose(); } - return droolsFact.getFireRuleOutputVO(); + return fireRuleOutputVO; } /** diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java new file mode 100644 index 0000000..a065aa4 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java @@ -0,0 +1,152 @@ +package com.solution.rule.utils; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.solution.rule.domain.ultimately.dto.FireRuleInputRedSubComponentsDTO; +import com.solution.rule.domain.ultimately.vo.FireRuleLauncherConfigurationVO; +import com.solution.rule.domain.ultimately.vo.FireRuleMissionListItemVO; +import com.solution.rule.domain.ultimately.vo.FireRuleMountedWeaponRefVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRedSubComponentsVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponEquipmentVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponSlotVO; +import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskNodeVO; +import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskPayloadVO; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * 将入参中的红方装备 {@code SubComponents}(DTO)转为输出 VO,保持与原始 JSON 结构一致。 + */ +public final class FireRuleRedWeaponOutputFillHelper { + + private static final ObjectMapper MAPPER = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + private FireRuleRedWeaponOutputFillHelper() { + } + + /** + * DTO 与 VO 字段/JsonProperty 对齐,通过 Jackson 树转换实现原样输出。 + */ + public static FireRuleRedSubComponentsVO toOutputSubComponents(FireRuleInputRedSubComponentsDTO src) { + if (src == null) { + return null; + } + return MAPPER.convertValue(src, FireRuleRedSubComponentsVO.class); + } + + /** + * 将输出 redWeapons 单项映射为 Tasks 节点(一个装备 -> 一个任务节点)。 + * + *

字段映射约定:

+ *
    + *
  • drawName = Name + \"打击任务\"
  • + *
  • side = OwnerForceSide(按你的要求直接复制)
  • + *
  • id 优先 EquipmentID,其次 PlatID,最后用 index 兜底
  • + *
  • task.payload.weaponId = EquipmentID
  • + *
  • task.payload.sideId = OwnerForceSide
  • + *
  • missionList:尽量从 SubComponents.weapon[*] 中提取 mountedWeapon/name/number/launcherType
  • + *
+ */ + public static FireRuleSceneTaskNodeVO toTaskNode(FireRuleRedWeaponEquipmentVO redWeapon, int index) { + FireRuleSceneTaskNodeVO node = new FireRuleSceneTaskNodeVO(); + if (redWeapon == null) { + node.setId("redWeaponTask_" + index); + node.setDrawName("打击任务"); + return node; + } + + String name = nz(redWeapon.getName()); + node.setName(name); + node.setDrawName(name + "打击任务"); + node.setId(buildNodeId(redWeapon, index)); + node.setSide(redWeapon.getOwnerForceSide()); + // 按你的要求写死 Tasks 节点的展示字段 + node.setColor("rgb(220, 39, 39)"); + node.setDataType("taskPlane"); + node.setGroupType("tasks"); + node.setShow(true); + node.setIsSelected(false); + node.setSort((long) index); + + FireRuleSceneTaskPayloadVO payload = new FireRuleSceneTaskPayloadVO(); + payload.setName(name); + payload.setWeaponId(redWeapon.getEquipmentId()); + payload.setSideId(redWeapon.getOwnerForceSide()); + payload.setMissionList(buildMissionList(redWeapon)); + node.setTask(payload); + return node; + } + + /** + * 批量转换:redWeapons 有几个就生成几个 Tasks。 + */ + public static List toTaskNodes(List redWeapons) { + if (redWeapons == null || redWeapons.isEmpty()) { + return Collections.emptyList(); + } + List list = new ArrayList<>(redWeapons.size()); + for (int i = 0; i < redWeapons.size(); i++) { + list.add(toTaskNode(redWeapons.get(i), i)); + } + return list; + } + + private static List buildMissionList(FireRuleRedWeaponEquipmentVO redWeapon) { + if (redWeapon == null || redWeapon.getSubComponents() == null || redWeapon.getSubComponents().getWeapon() == null) { + return null; + } + List result = new ArrayList<>(); + for (FireRuleRedWeaponSlotVO slot : redWeapon.getSubComponents().getWeapon()) { + if (slot == null) { + continue; + } + FireRuleLauncherConfigurationVO cfg = slot.getConfiguration(); + FireRuleMountedWeaponRefVO mounted = cfg != null ? cfg.getMountedWeapon() : null; + + FireRuleMissionListItemVO item = new FireRuleMissionListItemVO(); + // label:优先挂载武器名,其次 deviceName + String label = mounted != null ? mounted.getName() : null; + if (isBlank(label)) { + label = slot.getDeviceName(); + } + item.setLabel(label); + item.setNumber(cfg != null ? cfg.getNumber() : null); + item.setValue(mounted != null ? mounted.getName() : null); + item.setLauncherType(extractLauncherType(slot.getTwiceModified())); + result.add(item); + } + return result.isEmpty() ? null : result; + } + + private static String extractLauncherType(Map twiceModified) { + if (twiceModified == null || twiceModified.isEmpty()) { + return null; + } + Object v = twiceModified.get("launcherType"); + return v == null ? null : String.valueOf(v); + } + + private static String buildNodeId(FireRuleRedWeaponEquipmentVO redWeapon, int index) { + String id = nz(redWeapon.getEquipmentId()); + if (!id.isEmpty()) { + return id; + } + id = nz(redWeapon.getPlatId()); + if (!id.isEmpty()) { + return id; + } + return "redWeaponTask_" + index; + } + + private static String nz(String s) { + return s == null ? "" : s; + } + + private static boolean isBlank(String s) { + return s == null || s.trim().isEmpty(); + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java index f642ef4..9c03fe7 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java @@ -1,34 +1,326 @@ package com.solution.rule.utils; +import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO; import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTaskWeaponDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleWeaponComponentDTO; import com.solution.rule.domain.ultimately.fact.DroolsFact; +import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponEquipmentVO; +import com.solution.rule.domain.ultimately.vo.FireRuleTaskInputVO; +import com.solution.rule.domain.ultimately.vo.FireRuleTaskWeaponVO; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** - * 规则函数方法 + * Drools 规则调用的装备匹配逻辑。所有业务词均来自 globalParams(由 rule.drl 的 buildParam 注入),本类不写死中文业务词。 + *

+ * 总分公式(每件候选红装) + *

+ *   score(red) = scoreRuleSlots(...) + scoreLegacyLayer(...)
+ *
+ *   scoreRuleSlots = Σ(i=1..ruleSlotCount)  [ containsAny(blueBlob, blueRuleKeywords_i)
+ *                                         ∧ containsAny(redBlob, redRuleKeywords_i)
+ *                                         ? ruleScore_i * weight : 0 ]
+ *
+ *   scoreLegacyLayer = ①空中平台 + ②空中任务 + ③地面任务 + ④坦克 + ⑤导弹 五段条件之和,每段若满足均为「对应 *Score * weight」
+ *   (五段含义见 scoreLegacyLayer 方法注释与 rule.drl 中各键说明)。
+ * 
+ *

+ * 文本串定义 + *

    + *
  • blueBlob:{@link #buildBlueTextBlob} — 蓝方任务 drawName、dataType、taskWeapons 及组件名拼接成一大串,用于关键词包含判断。
  • + *
  • redBlob:{@link #buildRedTextBlob} — 红装 name、platformType、supportType 拼接。
  • + *
+ *

+ * 选优与输出 + *

    + *
  • 在 redWeapons 池中对每件算 score,取最大值;若并列,{@link #compareRedForTieBreak}(由 tieBreak 参数控制,默认 equipmentId 小者优先)。
  • + *
  • 若 maxScore < minSelectedScore:不追加 fireRuleInputs;仍将当前池映射到 FireRuleOutputVO.redWeapons。
  • + *
  • 否则:池中 remove 选中项;fireRuleInputs 追加一行,drawName += outputDrawNameSuffix,taskWeapons 一条映射自选中红装;redWeapons 为剩余池。
  • + *
*/ -public class RuleFunction { +public final class RuleFunction { + private RuleFunction() { + } /** - * 装备匹配 + * 单轮规则执行:对当前 DroolsFact 的一条蓝方任务,从 redWeapons 中选一件装备并写回输出。 + *

+ * 参数 p(globalParams)中各键含义与运算见 {@link RuleFunction} 类注释及 resources/rules/rule.drl 内 buildParam 行内注释。 */ - public static void equipmentRule(DroolsFact task, Map globalParams){ - //空中总分数 - Integer airScore = 0; - //反坦克总分数 - Integer antitankScore = 0; - //远程打击总分数 - Integer remoteScore = 0; + @SuppressWarnings("rawtypes") + public static void equipmentRule(DroolsFact fact, Map globalParams) { + if (fact == null || fact.getTask() == null) { + return; + } + Map p = castParams(globalParams); + FireRuleTaskInputDTO blue = fact.getTask(); + List pool = fact.getRedWeapons(); + if (pool == null) { + pool = new ArrayList<>(); + fact.setRedWeapons(pool); + } - FireRuleTaskInputDTO blueTask = task.getTask(); + // weight、minSelectedScore:见 rule.drl 注释 + String blueBlob = buildBlueTextBlob(blue); + int weight = readInt(p, "weight", 1); + int minScore = readInt(p, "minSelectedScore", 1); - //权重因子 - Integer weight = (Integer) globalParams.get("weight"); - String drawName = blueTask.getDrawName(); - if("".contains(drawName)){ + int bestIndex = -1; + int bestScore = Integer.MIN_VALUE; + for (int i = 0; i < pool.size(); i++) { + FireRuleInputRedWeaponElementDTO red = pool.get(i); + String redBlob = buildRedTextBlob(red); + int score = scoreRuleSlots(blueBlob, redBlob, p, weight) + + scoreLegacyLayer(blueBlob, redBlob, p, weight); + if (score > bestScore) { + bestScore = score; + bestIndex = i; + } else if (score == bestScore && bestIndex >= 0) { + // 并列:compareRedForTieBreak(a,b)>0 表示当前 best 的 equipmentId 比候选 red 大,应换成更小的 id + if (compareRedForTieBreak(pool.get(bestIndex), red, p) > 0) { + bestIndex = i; + } + } + } + + FireRuleOutputVO out = fact.getFireRuleOutputVO(); + if (out == null) { + out = new FireRuleOutputVO(); + fact.setFireRuleOutputVO(out); + } + + // 未达门槛或池空:不写 fireRuleInputs,仅同步「剩余池」到输出 redWeapons + if (bestIndex < 0 || pool.isEmpty() || bestScore < minScore) { + out.setRedWeapons(convertPoolToEquipmentVoList(pool)); + // Tasks 由最终输出 redWeapons 一一生成(一个装备 -> 一个任务) + out.setTasks(FireRuleRedWeaponOutputFillHelper.toTaskNodes(out.getRedWeapons())); + return; + } + + FireRuleInputRedWeaponElementDTO chosen = pool.remove(bestIndex); + + out.setRedWeapons(convertPoolToEquipmentVoList(pool)); + // Tasks 由最终输出 redWeapons 一一生成(一个装备 -> 一个任务) + out.setTasks(FireRuleRedWeaponOutputFillHelper.toTaskNodes(out.getRedWeapons())); + } + + @SuppressWarnings("unchecked") + private static Map castParams(Map raw) { + return raw == null ? new java.util.HashMap<>() : (Map) raw; + } + + /** + * 蓝方侧用于「关键词包含」判断的合并文本(空格分隔各字段)。 + */ + private static String buildBlueTextBlob(FireRuleTaskInputDTO task) { + StringBuilder sb = new StringBuilder(); + append(sb, task.getDrawName()); + append(sb, task.getDataType()); + if (task.getTaskWeapons() != null) { + for (FireRuleTaskWeaponDTO w : task.getTaskWeapons()) { + if (w == null) { + continue; + } + append(sb, w.getName()); + append(sb, w.getSupportType()); + append(sb, w.getEquipmentId()); + if (w.getComponents() != null) { + for (FireRuleWeaponComponentDTO c : w.getComponents()) { + if (c == null) { + continue; + } + append(sb, c.getDeviceName()); + } + } + } + } + return sb.toString(); + } + + /** + * 红方侧用于「关键词包含」判断的合并文本。 + */ + private static String buildRedTextBlob(FireRuleInputRedWeaponElementDTO red) { + if (red == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + append(sb, red.getName()); + append(sb, red.getPlatformType()); + append(sb, red.getSupportType()); + return sb.toString(); + } + + private static void append(StringBuilder sb, String s) { + if (s != null && !s.isEmpty()) { + sb.append(s).append(' '); } } + + /** + * 规则槽得分:对 i=1..ruleSlotCount,若 blueBlob 命中 blueRuleKeywords_i 且 redBlob 命中 redRuleKeywords_i, + * 则累加 ruleScore_i * weight。关键词为英文逗号分隔,任一词作为子串出现在文本中即命中。 + */ + private static int scoreRuleSlots(String blueBlob, String redBlob, Map p, int weight) { + int n = readInt(p, "ruleSlotCount", 0); + int sum = 0; + for (int i = 1; i <= n; i++) { + String bk = str(p, "blueRuleKeywords_" + i, ""); + String rk = str(p, "redRuleKeywords_" + i, ""); + if (bk.isEmpty() || rk.isEmpty()) { + continue; + } + if (containsAny(blueBlob, bk) && containsAny(redBlob, rk)) { + sum += readInt(p, "ruleScore_" + i, 0) * weight; + } + } + return sum; + } + + /** + * 兼容层得分:五段独立条件,可叠加。每段均为「蓝关键词命中 ∧ 红关键词命中 → 加 对应分数 * weight」。 + *

    + *
  • ① bluePlatformKeywords_air + redPreferredWhenBlueAir → airScore
  • + *
  • ② airTaskKeywords + redPreferredWhenBlueAir → airTaskScore
  • + *
  • ③ groundTaskKeywords + redPreferredWhenGround → groundScore
  • + *
  • ④ tankKeywords + redMatchKeywords_tank → tankScore
  • + *
  • ⑤ missileKeywords + redMatchKeywords_missile → missileScore
  • + *
+ * 键名与 rule.drl 中 param.put 一致。 + */ + private static int scoreLegacyLayer(String blueBlob, String redBlob, Map p, int weight) { + int s = 0; + if (containsAny(blueBlob, str(p, "bluePlatformKeywords_air", "")) + && containsAny(redBlob, str(p, "redPreferredWhenBlueAir", ""))) { + s += readInt(p, "airScore", 0) * weight; + } + if (containsAny(blueBlob, str(p, "airTaskKeywords", "")) + && containsAny(redBlob, str(p, "redPreferredWhenBlueAir", ""))) { + s += readInt(p, "airTaskScore", 0) * weight; + } + if (containsAny(blueBlob, str(p, "groundTaskKeywords", "")) + && containsAny(redBlob, str(p, "redPreferredWhenGround", ""))) { + s += readInt(p, "groundScore", 0) * weight; + } + if (containsAny(blueBlob, str(p, "tankKeywords", "")) + && containsAny(redBlob, str(p, "redMatchKeywords_tank", ""))) { + s += readInt(p, "tankScore", 0) * weight; + } + if (containsAny(blueBlob, str(p, "missileKeywords", "")) + && containsAny(redBlob, str(p, "redMatchKeywords_missile", ""))) { + s += readInt(p, "missileScore", 0) * weight; + } + return s; + } + + /** + * 并列时比较两件红装:tieBreak=equipmentId 时返回 id 字典序比较结果(>0 表示 a 的 id 大于 b,应选 b)。 + */ + private static int compareRedForTieBreak( + FireRuleInputRedWeaponElementDTO a, + FireRuleInputRedWeaponElementDTO b, + Map p) { + if (a == null) { + return b == null ? 0 : 1; + } + if (b == null) { + return -1; + } + String mode = str(p, "tieBreak", "equipmentId"); + if ("equipmentId".equals(mode)) { + String ida = nz(a.getEquipmentId()); + String idb = nz(b.getEquipmentId()); + return ida.compareTo(idb); + } + return 0; + } + + /** + * commaKeywords:英文逗号分隔;若 text 包含其中任一词(trim 后非空)则命中。 + */ + private static boolean containsAny(String text, String commaKeywords) { + if (text == null || text.isEmpty() || commaKeywords == null || commaKeywords.isEmpty()) { + return false; + } + for (String part : commaKeywords.split(",")) { + String k = part.trim(); + if (!k.isEmpty() && text.contains(k)) { + return true; + } + } + return false; + } + + private static String str(Map p, String key, String def) { + Object v = p.get(key); + return v == null ? def : String.valueOf(v); + } + + private static int readInt(Map p, String key, int def) { + Object v = p.get(key); + if (v == null) { + return def; + } + if (v instanceof Number) { + return ((Number) v).intValue(); + } + try { + return Integer.parseInt(String.valueOf(v).trim()); + } catch (NumberFormatException e) { + return def; + } + } + + private static String nz(String s) { + return s == null ? "" : s; + } + + private static FireRuleTaskWeaponVO toTaskWeaponVo(FireRuleInputRedWeaponElementDTO r) { + FireRuleTaskWeaponVO w = new FireRuleTaskWeaponVO(); + if (r != null) { + w.setEquipmentId(r.getEquipmentId()); + w.setName(r.getName()); + w.setSupportType(r.getSupportType()); + } + return w; + } + + private static List convertPoolToEquipmentVoList( + List pool) { + List list = new ArrayList<>(); + if (pool == null) { + return list; + } + for (FireRuleInputRedWeaponElementDTO e : pool) { + list.add(toRedEquipmentVo(e)); + } + return list; + } + + private static FireRuleRedWeaponEquipmentVO toRedEquipmentVo(FireRuleInputRedWeaponElementDTO src) { + if (src == null) { + return null; + } + FireRuleRedWeaponEquipmentVO vo = new FireRuleRedWeaponEquipmentVO(); + vo.setSupportType(src.getSupportType()); + vo.setTroopsDetail(src.getTroopsDetail()); + vo.setPlatformType(src.getPlatformType()); + vo.setIsStrikeTarget(src.getIsStrikeTarget()); + vo.setIsReconTarget(src.getIsReconTarget()); + vo.setIsInterferenceTarget(src.getIsInterferenceTarget()); + vo.setIsDefendImportantPlace(src.getIsDefendImportantPlace()); + vo.setGroupType(src.getGroupType()); + vo.setEquipmentId(src.getEquipmentId()); + vo.setName(src.getName()); + vo.setOwnerForceSide(src.getOwnerForceSide()); + vo.setPlatId(src.getPlatId()); + vo.setSubComponents(FireRuleRedWeaponOutputFillHelper.toOutputSubComponents(src.getSubComponents())); + return vo; + } } diff --git a/auto-solution-rule/src/main/resources/rules/fire-rule.drl b/auto-solution-rule/src/main/resources/rules/fire-rule.drl deleted file mode 100644 index af8804a..0000000 --- a/auto-solution-rule/src/main/resources/rules/fire-rule.drl +++ /dev/null @@ -1,3500 +0,0 @@ -package rules; - -import com.solution.rule.domain.simplerulepojo.fact.FactTask; -import com.solution.rule.domain.simplerulepojo.Task; -import com.solution.rule.domain.simplerulepojo.Weapon; -import com.solution.rule.domain.simplerulepojo.SubComponents; -import com.solution.rule.domain.simplerulepojo.ComponentParam; -import com.solution.rule.domain.simplerulepojo.Coordinate; -import com.solution.rule.domain.simplerulepojo.TrackPoints; - -import java.util.List; -import java.util.Map; -import java.util.ArrayList; - -global java.util.Map globalParams; - -//------------------------------------------------------------------------------- -rule "任务匹配1" -agenda-group "打击任务" -salience 100 -when -then - // legacy 占位:旧的固定字符串匹配已停用,改由“任务自动匹配规则”统一处理。 -end -//------------------------------------------------------------------------------- -rule "任务匹配2" -agenda-group "打击任务" -salience 100 -when -then - // legacy 占位:旧的固定字符串匹配已停用,改由“任务自动匹配规则”统一处理。 -end -//------------------------------------------------------------------------------- -rule "威胁等级规则" -agenda-group "打击任务" -salience 90 -when - //如果蓝方威胁等级大于等于3,则全局武器数量为3,添加插入导弹发射车辆和防空导弹武器 - $task : FactTask(blueTask.side == "蓝方",blueTask.threatLevel >= "3") - $redTask : FactTask(redTask.side == "红方") -then - //设置平台下组件的数量 - globalParams.put("platNum",3); - //威胁等级大于等于3固定插入导弹发射车辆 - // ========== 调用函数 ========== - threatLevels($redTask, globalParams); -end -//------------------------------------------------------------------------------- -rule "地面类型匹配规则" -agenda-group "打击任务" -salience 80 -when - //如果蓝方武器为地面类型且高度不超过500米,则使用插入空中力量打击 - $task : FactTask(blueTask.side == "蓝方") - $weapons : List() from $task.blueTask.taskWeapons - $weapon : Weapon(supportType == "ground") from $weapons -then - Task redTask = $task.getRedTask(); - List taskWeapons = redTask.getTaskWeapons(); - Weapon weapon = new Weapon(); - weapon.setName("F-16"); - weapon.setNumber((Integer) globalParams.get("platNum")); - weapon.setSupportType("plane"); - taskWeapons.add(weapon); -end -//------------------------------------------------------------------------------- -rule "空中类型匹配规则" -agenda-group "打击任务" -salience 80 -when - //如果蓝方武器为地面类型且高度不超过500米,则使用插入空中力量打击 - $task : FactTask(blueTask.side == "蓝方") - $weapons : List() from $task.blueTask.taskWeapons - $weapon : Weapon(supportType == "overhead") from $weapons -then - Task redTask = $task.getRedTask(); - List taskWeapons = redTask.getTaskWeapons(); - Weapon weapon = new Weapon(); - weapon.setName("F-16"); - weapon.setNumber((Integer) globalParams.get("platNum")); - weapon.setSupportType("plane"); - taskWeapons.add(weapon); -end -//------------------------------------------------------------------------------- -rule "装备组件匹配" -agenda-group "打击任务" -salience 70 -when -then - // legacy 规则已停用:完整武器库逻辑已在 //TODO 下接管。 - // 保留该规则名称便于回滚和历史追踪,不再执行任何动作。 -end -//------------------------------------------------------------------------------- -rule "组件参数匹配" -agenda-group "打击任务" -salience 60 -when -then - // legacy 占位规则:参数处理已并入“红方武器自适应装配规则/导弹联动增强规则”。 -end -//------------------------------------------------------------------------------- -//TODO -//------------------------------------------------------------------------------- -// ========================= 业务可改区(只改这里) ========================= -// 说明: -// 1) 业务人员只改 buildBusinessConfig() 里的值,其他函数不要改。 -// 2) 规则是“严格白名单”,未命中条件时允许不匹配(不新增红方武器)。 - // 3) 可通过开关控制是否启用空中/地面/装甲/导弹联动策略。 - // 4) 业务可直接配置“蓝方类型 -> 红方方案(多选)”,例如坦克可选火箭或导弹系统。 - -function Map buildBusinessConfig() { - Map cfg = new java.util.HashMap(); - - // ---------- 红方完整武器库名称映射(可改) ---------- - cfg.put("redStrikeDroneName", "火力打击无人机"); - cfg.put("redArmedHelicopterName", "武装直升机"); - cfg.put("redHowitzerName", "迫榴炮"); - cfg.put("redVehicleMortarName", "车载迫击炮"); - cfg.put("redAaWeaponName", "防空导弹武器"); - cfg.put("redAtRocketName", "反坦克火箭"); - cfg.put("redAtMissileSystemName", "反坦克导弹系统"); - cfg.put("redMissileVehicleName", "导弹发射车"); - - // ---------- 白名单开关(可改) ---------- - cfg.put("enableAirRule", Boolean.TRUE); // 蓝方空中 -> 红方空中反制组 - cfg.put("enableGroundRule", Boolean.TRUE); // 蓝方地面 -> 红方炮类反制组 - cfg.put("enableArmorRule", Boolean.TRUE); // 蓝方装甲 -> 红方反坦克组 - cfg.put("enableMissileVehicleRule", Boolean.FALSE); // 蓝方导弹 -> 红方导弹发射车(默认关) - cfg.put("enableMissileLinkage", Boolean.TRUE); // 导弹参数联动开关 - cfg.put("allowMultiGroup", Boolean.TRUE); // true=允许多组叠加,false=命中首组即停止 - cfg.put("enableArmedHelicopterOnAir", Boolean.TRUE); - - // ---------- 过程驱动整数加分引擎(可改) ---------- - cfg.put("enableRuleScoring", Boolean.TRUE); // true=过程驱动整数加分;false=回退旧白名单 - cfg.put("minScoreToAssign", 1); // 最低入选分(整数) - cfg.put("nearDefenseDistanceMeters", 500); // 近防区距离阈值 - cfg.put("highThreatLevel", 3); // 高威胁阈值 - cfg.put("highTargetCount", 2); // 蓝方数量阈值 - cfg.put("score_type_antiArmor", 1); // 蓝方装甲 -> 反坦克类加分 - cfg.put("score_nearDefense_artillery", 1); // 近防区 -> 迫榴炮类加分 - cfg.put("score_highThreat_missile", 1); // 高威胁 -> 导弹/防空类加分 - cfg.put("score_highCount_artillery", 1); // 蓝方数量高 -> 炮类加分 - cfg.put("score_hasMissile_airDefence", 1); // 蓝方有导弹 -> 防空类加分 - - // ---------- 数量与参数(可改) ---------- - cfg.put("defaultAirNum", 1); - cfg.put("defaultGroundNum", 1); - cfg.put("defaultMissileVehicleNum", 1); - cfg.put("shellRangeDefault", "1500"); // 炮类单位固定:范围米 - cfg.put("missileCountOffset", 1); // 红方导弹数量 = 蓝方 + offset - cfg.put("missileRangeOffset", 80); // 红方导弹范围增量 - cfg.put("blueMissileRangeDefault", 220); // 蓝方导弹范围默认值 - cfg.put("minBlueMissileCountForLinkage", 1); // 联动触发门槛 - - - // ---------- 命中率与动态火力(可改) ---------- - cfg.put("hitRateCsv", "防空导弹武器=0.72,火力打击无人机=0.62,武装直升机=0.68,反坦克火箭=0.55,反坦克导弹系统=0.78,迫榴炮=0.45,车载迫击炮=0.43,导弹发射车=0.82"); - cfg.put("defaultHitRateFallback", "0.6"); // 兜底命中率 - cfg.put("desiredKillProbability", "0.9"); // 期望毁伤置信度 - cfg.put("offsetCsvByWeapon", ""); // 显式offset(武器=offset)优先,例:反坦克火箭=1,武装直升机=2 - cfg.put("hitRateThreshold", "0.7"); // 命中率阈值:低于该值触发阶梯增量 - cfg.put("hitRateGapStep1Max", "0.5"); // gap第一档上界(gap=threshold-hitRate) - cfg.put("hitRateGapStep2Max", "1.0"); // gap第二档上界 - cfg.put("hitRateStep1Offset", 1); // 第一档固定增量 - cfg.put("hitRateStep2Offset", 2); // 第二档固定增量 - cfg.put("enableDynamicMultiRedPerBlue", Boolean.TRUE); // 按命中率动态决定每个蓝目标需要几个红武器 - cfg.put("minRedWeaponsPerBlueTarget", 1); // 每个蓝目标最少分配红武器数量 - cfg.put("maxRedWeaponsPerBlueTargetCap", 3); // 每个蓝目标最多分配红武器数量上限 - cfg.put("enableRangeSanityCheck", Boolean.TRUE); // 距离-射程合理性校验开关 - cfg.put("enableAutoRangeRecommend", Boolean.TRUE); // 射程不足时自动调参 - cfg.put("rangeSafetyMarginMeters", 50); // 射程安全余量 - //还是简单 - - // ---------- 仅导弹组件匹配(可改) ---------- - // 逻辑:按红方武器 targetId 找到对应蓝方装备(equipmentId),仅覆盖“导弹组件”的数量与首参数 - cfg.put("enableComponentQuantityMatch", Boolean.TRUE); - // 格式示例:蓝穿甲弹->红穿甲弹,蓝火控雷达->红火控雷达;为空则默认 deviceName 一致匹配 - cfg.put("componentDeviceNameMappingCsv", ""); - // 仅匹配:蓝方组件 deviceName 包含该关键词时才匹配 - cfg.put("missileComponentNameContains", "导弹"); - - // ---------- 任务自动命名模板(可改) ---------- - // 任务分类优先级:导弹突击 > 防空压制 > 反装甲打击 > 炮火压制 > 通用打击 - cfg.put("taskName_missile_strike", "导弹突击打击任务"); - cfg.put("taskName_air_defence", "防空压制打击任务"); - cfg.put("taskName_anti_armor", "反装甲打击任务"); - cfg.put("taskName_artillery", "炮火压制打击任务"); - cfg.put("taskName_general", "通用打击任务"); - cfg.put("taskDataType_missile_strike", "missile-strike"); - cfg.put("taskDataType_air_defence", "air-defence"); - cfg.put("taskDataType_anti_armor", "anti-armor"); - cfg.put("taskDataType_artillery", "artillery"); - cfg.put("taskDataType_general", "strike"); - - // ---------- targetId 自动绑定(可改) ---------- - cfg.put("enableTargetAutoBind", Boolean.TRUE); // 是否自动给红方武器绑定蓝方目标 - cfg.put("minTargetBindRatio", "0.7"); // 最低绑定比例(大部分有目标) - cfg.put("allowReserveWithoutTarget", Boolean.TRUE); // 允许少量武器 targetId 为空(火力冗余) - cfg.put("w_target_type", "0.30"); // target分配:类型匹配权重 w_target_type 越大,规则越“看重类型对口”。 - cfg.put("w_target_dist", "0.25"); // target分配:距离权重 w_target_dist 越大,系统越偏向“更近/更容易打到”的目标 射程不足会被直接淘汰,不参与加权计算 - cfg.put("w_target_height", "0.10"); // target分配:高度差权重 作用:w_target_height 越大,系统越偏向“高度层更匹配”的目标(例如空中平台对空中目标、地面平台对地面目标更自然) - cfg.put("w_target_hit", "0.20"); // target分配:命中率权重 w_target_hit 越大,高命中率武器越容易拿到更高分,从而优先绑定目标。 - cfg.put("w_target_threat", "0.15"); // target分配:蓝目标威胁权重 作用:w_target_threat 越大,红武器会更倾向优先打“高威胁蓝目标”,即使距离稍远或类型略次优也可能被拉高排名 - cfg.put("maxEffectiveDistance", 3000); // 超过该距离候选失效 - cfg.put("maxHeightGap", 800); // 超过该高度差候选失效 - cfg.put("targetDecayAlpha", "0.35"); // 边际收益递减系数 - cfg.put("fallbackToNearestTarget", Boolean.TRUE); // 候选失效时回退最近目标 - cfg.put("allowUnassignedRedWeapon", Boolean.TRUE); // 无有效候选时允许红方targetId为空 - //权重怎么用的算法要研究 - - // ---------- 阵位规则参数(可改) ---------- - cfg.put("enablePositionRules", Boolean.TRUE); // 阵位规则总开关 - // 区域来源已切换到 Task 实体字段:warZoneLocation / defZoneLocation(4点经纬度) - cfg.put("fireUnitSpacingMeters", 100); // 火力单元间距(米) - cfg.put("airDeployZonePreference", "combat"); // 飞机优先部署区:combat/defense - cfg.put("defensePriorityWeapons", "反坦克导弹系统,反坦克火箭,车载迫击炮,迫榴炮"); // 优先部署防区武器 - cfg.put("groundDeployHeight", 20); // 地面武器部署高度 - cfg.put("airDeployHeight", 300); // 空中武器部署高度(自动高度关闭或兜底时使用) - cfg.put("enableAutoAirDeployHeight", Boolean.TRUE); // 空中部署高度自动生成开关 - cfg.put("airHeightMin", 50); // 自动高度下限 - cfg.put("airHeightMax", 20000); // 自动高度上限 - cfg.put("airHeightFallback", 300); // 无航迹/无蓝方武器高度时的兜底高度 - cfg.put("airHeightSpeedThreshold", 180); // 速度修正:平均速度≥此值视为“快” - cfg.put("airHeightAdjustFast", 40); // 速度快时额外抬高(米) - cfg.put("airHeightNearDefenseDistance", 800); // 距防区“近”阈值(米) - cfg.put("airHeightFarDefenseDistance", 2500); // 距防区“远”阈值(米) - cfg.put("airHeightAdjustNear", -30); // 近防区高度修正(通常为负,压低) - cfg.put("airHeightAdjustFar", 40); // 远防区高度修正(抬高) - cfg.put("airHeightAdjustMain", 20); // 主机相对基准额外高度 - cfg.put("airHeightAdjustWing", -10); // 僚机相对基准额外高度 - cfg.put("formationDefaultType", "TRIANGLE"); // 默认阵型:TRIANGLE/DIAMOND/LINE/COLUMN/WEDGE - cfg.put("enableAutoFormationSelect", Boolean.TRUE); // 阵型自动选择开关 - cfg.put("formationFastSpeedThreshold", 180); // 自动选阵型:高速阈值 - cfg.put("formationNearDefenseDistance", 800); // 自动选阵型:近防区阈值 - cfg.put("formationFarDefenseDistance", 2500); // 自动选阵型:远防区阈值 - cfg.put("formationHighThreatLevel", 3); // 自动选阵型:高威胁阈值 - cfg.put("formationLargeGroupCount", 6); // 自动选阵型:大编队阈值 - cfg.put("formationRule_near_fast", "WEDGE"); // 近快态势阵型 - cfg.put("formationRule_far_fast", "LINE"); // 远快态势阵型 - cfg.put("formationRule_near_slow", "DIAMOND"); // 近慢态势阵型 - cfg.put("formationRule_high_threat", "DIAMOND"); // 高威胁优先阵型 - cfg.put("formationRule_large_group", "COLUMN"); // 大编队优先阵型 - cfg.put("formationRule_air_majority", "LINE"); // 空中占比高阵型 - cfg.put("formationRule_default", "TRIANGLE"); // 自动选择默认阵型 - cfg.put("formationDefaultSpacingMeters", 120); // 阵型间距兜底(自动计算失败时) - cfg.put("mainWingDistanceDefaultMeters", 100); // 主僚距离兜底(自动计算失败时) - cfg.put("formationHeadingDefaultDeg", 0); // 默认阵型朝向 - cfg.put("formationSpacingMinMeters", 60); // 自动间距下限 - cfg.put("formationSpacingMaxMeters", 220); // 自动间距上限 - cfg.put("defenseScaleMinMeters", 300); // 防区尺度映射下限 - cfg.put("defenseScaleMaxMeters", 3000); // 防区尺度映射上限 - cfg.put("mainWingDistanceMinMeters", 60); // 自动主僚距离下限 - cfg.put("mainWingDistanceMaxMeters", 260); // 自动主僚距离上限 - cfg.put("mainWingDistanceModeFactor_near_fast", "0.90"); // 近快:更紧凑 - cfg.put("mainWingDistanceModeFactor_far_fast", "1.15"); // 远快:更疏开 - cfg.put("mainWingDistanceModeFactor_near_slow", "0.95"); // 近慢:略紧凑 - cfg.put("mainWingDistanceModeFactor_default", "1.00"); // 默认系数 - cfg.put("speedFastThreshold", 180); // 蓝方高速阈值 - cfg.put("distanceNearDefenseThresholdMeters", 800); // 近防区阈值 - cfg.put("distanceFarDefenseThresholdMeters", 2500); // 远防区阈值 - - // ---------- 航迹规则参数(可改) ---------- - cfg.put("enableTrajectoryRules", Boolean.TRUE); // 航迹规则总开关 - // 智能 最短的 侧面 干扰 - cfg.put("strategyMode", "shortest"); // auto/shortest/flank/interfere - cfg.put("enableShortest", Boolean.TRUE); - cfg.put("enableFlank", Boolean.TRUE); - cfg.put("enableInterfere", Boolean.TRUE); - cfg.put("nearDefDistanceMeters", 800); // 近防区阈值 - cfg.put("farDefDistanceMeters", 2500); // 远防区阈值 - cfg.put("fastSpeedThreshold", 180); // 快速阈值 - cfg.put("flankOffsetMeters", 150); // 绕后偏移 - cfg.put("interfereOffsetMeters", 120); // 干扰基础偏移 - cfg.put("interfereZigzagAmplitude", 90); // 干扰锯齿幅度 - cfg.put("keepBlueHeight", Boolean.TRUE); // true=沿用蓝方高度 - cfg.put("redTrackHeightOverride", 200); // keepBlueHeight=false 时生效 - - return cfg; -} - -//------------------------------------------------------------------------------- -rule "红方武器自适应装配规则" -agenda-group "打击任务" -salience 55 -when - // 蓝方与红方任务都存在时触发,做“武器+组件”的基础装配 - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - configureRedWeaponsByBlue($fact, cfg); -end - -//------------------------------------------------------------------------------- -rule "导弹联动增强规则" -agenda-group "打击任务" -salience 54 -when - // 在基础装配后执行:若蓝方挂载导弹,红方空中武器自动增强导弹能力 - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyMissileLinkage($fact, cfg); -end - -//------------------------------------------------------------------------------- -// 仅导弹组件匹配:按 redWeapon.targetId 对应蓝方装备,仅覆盖导弹组件的数量与首参数 -rule "导弹组件数量匹配规则" -agenda-group "打击任务" -salience 53 -when - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyAllComponentQuantities($fact, cfg); -end - -//------------------------------------------------------------------------------- -rule "命中率规则-动态数量与offset" -agenda-group "打击任务" -salience 52 -when - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyHitRateDrivenOffsets($fact, cfg); -end - -//------------------------------------------------------------------------------- -rule "任务自动匹配规则" -agenda-group "打击任务" -salience 50 -when - // 以红方最终武器为主自动生成任务名,保证任务名与武器一致 - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - assignTaskNameByRedWeapons($fact, cfg); -end - -//------------------------------------------------------------------------------- -rule "阵位规则-区域解析与点位生成" -agenda-group "打击任务" -salience 49 -when - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - prepareDeploymentPools($fact, cfg, globalParams); -end - -//------------------------------------------------------------------------------- -rule "阵位规则-武器部署赋位" -agenda-group "打击任务" -salience 48 -when - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyWeaponDeployment($fact, cfg, globalParams); -end - -//------------------------------------------------------------------------------- -rule "射程合理性校验规则" -agenda-group "打击任务" -salience 47 -when - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyRangeSanityAndRecommend($fact, cfg); -end - -//------------------------------------------------------------------------------- -rule "航迹规则-生成红方航迹" -agenda-group "打击任务" -salience 46 -when - // 根据蓝方 trackPoints 生成红方 trackPoints,点数保持一致 - $fact : FactTask(blueTask.side == "蓝方", redTask.side == "红方") -then - Map cfg = buildBusinessConfig(); - applyTrajectoryGeneration($fact, cfg); -end - -//------------------------------------------------------------------------------- -// 说明:以下函数全部是 DRL function(不是 Java 类方法) -// 目标:让不懂代码的业务同事只改“可调整常量区”即可完成策略调整 - -// 根据蓝方武器结构,按业务映射装配红方武器并写入基础组件 -function void configureRedWeaponsByBlue( - FactTask fact, - Map cfg -) { - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - List blueWeapons = fact.getBlueTask().getTaskWeapons(); - if (blueWeapons == null || blueWeapons.isEmpty()) { - return; - } - Task redTask = fact.getRedTask(); - List redWeapons = redTask.getTaskWeapons(); - if (redWeapons == null) { - redWeapons = new ArrayList<>(); - redTask.setTaskWeapons(redWeapons); - } - - // 蓝方组件模板(用于测试和参数联动):若蓝方没填组件,给一个合理默认值 - buildBlueTestComponents(blueWeapons); - - // 过程驱动模式:根据蓝方类型/数量/位置等态势特征评分选武器 - if (readBooleanCfg(cfg, "enableRuleScoring", true)) { - runProcessDrivenSelection(fact, cfg); - return; - } - - boolean hasBlueAir = false; - boolean hasBlueGround = false; - boolean hasBlueArtillery = false; - boolean hasBlueArmor = false; - boolean hasBlueMissile = false; - for (Object obj : blueWeapons) { - Weapon blueWeapon = (Weapon) obj; - if (blueWeapon == null) { - continue; - } - if (isAirWeapon(blueWeapon)) { - hasBlueAir = true; - } - if (isGroundWeapon(blueWeapon)) { - hasBlueGround = true; - } - if (isArtilleryWeapon(blueWeapon)) { - hasBlueArtillery = true; - } - if (isArmorWeapon(blueWeapon)) { - hasBlueArmor = true; - } - if (hasMissileComponent(blueWeapon)) { - hasBlueMissile = true; - } - } - - boolean allowMultiGroup = readBooleanCfg(cfg, "allowMultiGroup", true); - boolean matchedAny = false; - - // 严格白名单-1:空中目标反制组(由 map_air_targets 控制) - if (readBooleanCfg(cfg, "enableAirRule", true) && hasBlueAir && (!matchedAny || allowMultiGroup)) { - int before = redWeapons.size(); - applyMappedWeapons(redWeapons, cfg, "map_air_targets", readIntCfg(cfg, "defaultAirNum", 1), readBooleanCfg(cfg, "enableArmedHelicopterOnAir", true)); - if (redWeapons.size() > before) { - matchedAny = true; - } - } - - // 严格白名单-2:地面目标炮类组(由 map_ground_targets 控制) - if (readBooleanCfg(cfg, "enableGroundRule", true) && hasBlueGround && (!matchedAny || allowMultiGroup)) { - int before = redWeapons.size(); - applyMappedWeapons(redWeapons, cfg, "map_ground_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); - if (redWeapons.size() > before) { - matchedAny = true; - } - } - - // 严格白名单-3:装甲目标反坦克组(由 map_armor_targets 控制) - if (readBooleanCfg(cfg, "enableArmorRule", true) && hasBlueArmor && (!matchedAny || allowMultiGroup)) { - int before = redWeapons.size(); - applyMappedWeapons(redWeapons, cfg, "map_armor_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); - if (redWeapons.size() > before) { - matchedAny = true; - } - } - - // 严格白名单-4:炮类目标反制组(由 map_artillery_targets 控制) - if (hasBlueArtillery && (!matchedAny || allowMultiGroup)) { - int before = redWeapons.size(); - applyMappedWeapons(redWeapons, cfg, "map_artillery_targets", readIntCfg(cfg, "defaultGroundNum", 1), true); - if (redWeapons.size() > before) { - matchedAny = true; - } - } - - // 严格白名单-5:导弹补充组(默认关闭,由 map_missile_targets 控制) - if (readBooleanCfg(cfg, "enableMissileVehicleRule", false) && hasBlueMissile && (!matchedAny || allowMultiGroup)) { - int before = redWeapons.size(); - applyMappedWeapons(redWeapons, cfg, "map_missile_targets", readIntCfg(cfg, "defaultMissileVehicleNum", 1), true); - if (redWeapons.size() > before) { - matchedAny = true; - } - } - - // 炮类限制仅对已匹配策略生效;若本轮未命中白名单,不做任何新增/补齐 - if (matchedAny && hasBlueArtillery) { - limitRedArtilleryToShellOnly(redWeapons, (String) cfg.get("shellRangeDefault")); - } - - // 写入红方武器默认命中率(若入参已给 hitRate,则不覆盖) - applyDefaultHitRateIfAbsent(redWeapons, cfg); - - // 自动绑定红方武器 targetId(来源:蓝方 equipmentId) - bindTargetIdsForRedWeapons(redWeapons, blueWeapons, cfg); -} - -//------------------------------------------------------------------------------- -// 过程驱动主流程:特征提取 -> 评分选武器 -> 动态分配 -function void runProcessDrivenSelection(FactTask fact, Map cfg) { - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - Task blueTask = fact.getBlueTask(); - Task redTask = fact.getRedTask(); - List blueWeapons = blueTask.getTaskWeapons(); - if (blueWeapons == null || blueWeapons.isEmpty()) { - return; - } - List redWeapons = redTask.getTaskWeapons(); - if (redWeapons == null) { - redWeapons = new ArrayList(); - redTask.setTaskWeapons(redWeapons); - } else { - redWeapons.clear(); - } - - List blueFeatures = extractBlueTargetFeatures(blueTask, cfg); - if (blueFeatures == null || blueFeatures.isEmpty()) { - return; - } - List redPool = getRedWeaponPoolByConfig(cfg); - if (redPool == null || redPool.isEmpty()) { - return; - } - - double desiredKill = normalizeProbability(readDoubleCfg(cfg, "desiredKillProbability", 0.9d), 0.9d); - int minAssign = readIntCfg(cfg, "minRedWeaponsPerBlueTarget", 1); - int maxAssign = readIntCfg(cfg, "maxRedWeaponsPerBlueTargetCap", 3); - if (maxAssign <= 0) { - maxAssign = 1; - } - if (minAssign < 0) { - minAssign = 0; - } - if (minAssign > maxAssign) { - minAssign = maxAssign; - } - int minScore = readIntCfg(cfg, "minScoreToAssign", 1); - - for (Object featObj : blueFeatures) { - Map feat = (Map) featObj; - String blueId = String.valueOf(feat.get("blueId")); - Weapon blueWeapon = (Weapon) feat.get("blueWeapon"); - if (blueWeapon == null || isBlank(blueId)) { - continue; - } - - List topNames = pickTopScoredWeapons(feat, redPool, cfg, minScore); - if (topNames == null || topNames.isEmpty()) { - continue; - } - int needCount = computeNeededRedCountFromFeature(feat, cfg, desiredKill); - allocateRedWeaponsForBlueTarget(topNames, needCount, minAssign, maxAssign, blueId, redWeapons, cfg); - } - - if (!redWeapons.isEmpty()) { - applyDefaultHitRateIfAbsent(redWeapons, cfg); - if (containsBlueArtillery(blueWeapons)) { - limitRedArtilleryToShellOnly(redWeapons, (String) cfg.get("shellRangeDefault")); - } - } -} - -function List extractBlueTargetFeatures(Task blueTask, Map cfg) { - List result = new ArrayList(); - if (blueTask == null || blueTask.getTaskWeapons() == null) { - return result; - } - int threat = parseIntSafe(blueTask.getThreatLevel(), 1); - for (Object obj : blueTask.getTaskWeapons()) { - Weapon blue = (Weapon) obj; - if (blue == null || isBlank(blue.getEquipmentId())) { - continue; - } - Map feature = new java.util.HashMap(); - feature.put("blueId", blue.getEquipmentId()); - feature.put("blueWeapon", blue); - feature.put("isAir", Boolean.valueOf(isAirWeapon(blue))); - feature.put("isArmor", Boolean.valueOf(isArmorWeapon(blue))); - feature.put("isArtillery", Boolean.valueOf(isArtilleryWeapon(blue))); - feature.put("isGround", Boolean.valueOf(isGroundWeapon(blue))); - feature.put("hasMissile", Boolean.valueOf(hasMissileComponent(blue))); - int blueNum = blue.getNumber() == null || blue.getNumber() <= 0 ? 1 : blue.getNumber().intValue(); - feature.put("blueNum", Integer.valueOf(blueNum)); - feature.put("threat", Integer.valueOf(threat)); - feature.put("distance", Double.valueOf(computeBlueDistanceToDefenseMeters(blue, blueTask))); - result.add(feature); - } - return result; -} - -function List pickTopScoredWeapons(Map feature, List redPool, Map cfg, int minScoreToAssign) { - List result = new ArrayList(); - if (feature == null || redPool == null || redPool.isEmpty()) { - return result; - } - int maxScore = Integer.MIN_VALUE; - for (Object obj : redPool) { - String redName = String.valueOf(obj); - if (isBlank(redName)) { - continue; - } - int s = scoreRedWeaponByRules(feature, redName, cfg); - if (s > maxScore) { - maxScore = s; - } - } - if (maxScore < minScoreToAssign) { - return result; - } - for (Object obj : redPool) { - String redName = String.valueOf(obj); - if (isBlank(redName)) { - continue; - } - int s = scoreRedWeaponByRules(feature, redName, cfg); - if (s == maxScore) { - addUnique(result, redName); - } - } - return result; -} - -function int scoreRedWeaponByRules(Map feature, String redName, Map cfg) { - if (feature == null || redName == null) { - return 0; - } - int score = 0; - boolean isAir = ((Boolean) feature.get("isAir")).booleanValue(); - boolean isArmor = ((Boolean) feature.get("isArmor")).booleanValue(); - boolean isArtillery = ((Boolean) feature.get("isArtillery")).booleanValue(); - boolean hasMissile = ((Boolean) feature.get("hasMissile")).booleanValue(); - int blueNum = ((Integer) feature.get("blueNum")).intValue(); - int threat = ((Integer) feature.get("threat")).intValue(); - double distance = ((Double) feature.get("distance")).doubleValue(); - - if (isArmor && redName.contains("反坦克")) { - score += readIntCfg(cfg, "score_type_antiArmor", 1); - } - if (isAir && (redName.contains("防空导弹") || redName.contains("无人机") || redName.contains("直升机"))) { - score += readIntCfg(cfg, "score_highThreat_missile", 1); - } - if (isArtillery && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { - score += 1; - } - if (distance <= readIntCfg(cfg, "nearDefenseDistanceMeters", 500) && redName.contains("迫榴炮")) { - score += readIntCfg(cfg, "score_nearDefense_artillery", 1); - } - if (threat >= readIntCfg(cfg, "highThreatLevel", 3) && (redName.contains("导弹") || redName.contains("防空"))) { - score += readIntCfg(cfg, "score_highThreat_missile", 1); - } - if (blueNum >= readIntCfg(cfg, "highTargetCount", 2) && (redName.contains("迫榴炮") || redName.contains("迫击炮"))) { - score += readIntCfg(cfg, "score_highCount_artillery", 1); - } - if (hasMissile && (redName.contains("防空导弹") || redName.contains("导弹发射车"))) { - score += readIntCfg(cfg, "score_hasMissile_airDefence", 1); - } - - int estRange = estimateRangeByRedWeaponName(redName); - int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); - if (distance < Double.MAX_VALUE / 2.0d && estRange >= (int) Math.ceil(distance) + margin) { - score += 1; - } - return score; -} - -function void allocateRedWeaponsForBlueTarget(List topNames, int needCount, int minAssign, int maxAssign, String blueId, List redWeapons, Map cfg) { - if (topNames == null || topNames.isEmpty() || isBlank(blueId) || redWeapons == null) { - return; - } - int finalNeed = needCount; - if (finalNeed < minAssign) { - finalNeed = minAssign; - } - if (finalNeed > maxAssign) { - finalNeed = maxAssign; - } - int assigned = 0; - while (assigned < finalNeed) { - for (Object obj : topNames) { - if (assigned >= finalNeed) { - break; - } - String redName = String.valueOf(obj); - Weapon red = createRedWeaponInstance(redName, inferSupportTypeByWeaponName(redName), 1); - red.setTargetId(blueId); - ensureBasicRedComponents(red); - red.setHitRate(Double.valueOf(resolveHitRateByName(redName, cfg))); - redWeapons.add(red); - assigned++; - } - } -} - -function int computeNeededRedCountFromFeature(Map feature, Map cfg, double desiredKill) { - if (feature == null) { - return 1; - } - int blueNum = ((Integer) feature.get("blueNum")).intValue(); - int threat = ((Integer) feature.get("threat")).intValue(); - double distance = ((Double) feature.get("distance")).doubleValue(); - double pBase = normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); - if (((Boolean) feature.get("isArmor")).booleanValue()) { - pBase = pBase + 0.05d; - } - if (((Boolean) feature.get("isAir")).booleanValue()) { - pBase = pBase - 0.05d; - } - if (distance > 1500.0d) { - pBase = pBase - 0.06d; - } - pBase = normalizeProbability(pBase, 0.6d); - int oneTargetNeed = computeRequiredShots(pBase, desiredKill, 1); - int count = oneTargetNeed + Math.max(0, blueNum - 1); - if (threat >= 3) { - count++; - } - return Math.max(1, count); -} - -function double computeBlueDistanceToDefenseMeters(Weapon blueWeapon, Task blueTask) { - if (blueWeapon == null || blueWeapon.getCoordinate() == null || blueTask == null || blueTask.getDefZoneLocation() == null) { - return Double.MAX_VALUE; - } - Coordinate b = blueWeapon.getCoordinate(); - if (b.getLongitude() == null || b.getLatitude() == null) { - return Double.MAX_VALUE; - } - double best = Double.MAX_VALUE; - for (Object obj : blueTask.getDefZoneLocation()) { - Coordinate c = (Coordinate) obj; - if (c == null || c.getLongitude() == null || c.getLatitude() == null) { - continue; - } - double d = approxDistanceMeters( - b.getLongitude().doubleValue(), - b.getLatitude().doubleValue(), - c.getLongitude().doubleValue(), - c.getLatitude().doubleValue() - ); - if (d < best) { - best = d; - } - } - return best; -} - -function int estimateRangeByRedWeaponName(String redName) { - if (redName == null) { - return 800; - } - if (redName.contains("反坦克导弹系统")) { - return 1800; - } - if (redName.contains("导弹发射车")) { - return 2500; - } - if (redName.contains("防空导弹")) { - return 2200; - } - if (redName.contains("武装直升机")) { - return 1500; - } - if (redName.contains("无人机")) { - return 1200; - } - if (redName.contains("迫榴炮") || redName.contains("迫击炮")) { - return 1600; - } - if (redName.contains("反坦克火箭")) { - return 1000; - } - return 900; -} - -function double resolveHitRateByName(String redName, Map cfg) { - Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); - Double p = (Double) hitRateMap.get(redName); - if (p == null) { - p = Double.valueOf(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d)); - } - return normalizeProbability(p.doubleValue(), 0.6d); -} - -function List getRedWeaponPoolByConfig(Map cfg) { - List pool = new ArrayList(); - addUnique(pool, (String) cfg.get("redStrikeDroneName")); - addUnique(pool, (String) cfg.get("redArmedHelicopterName")); - addUnique(pool, (String) cfg.get("redHowitzerName")); - addUnique(pool, (String) cfg.get("redVehicleMortarName")); - addUnique(pool, (String) cfg.get("redAaWeaponName")); - addUnique(pool, (String) cfg.get("redAtRocketName")); - addUnique(pool, (String) cfg.get("redAtMissileSystemName")); - addUnique(pool, (String) cfg.get("redMissileVehicleName")); - return pool; -} - -function Weapon createRedWeaponInstance(String name, String supportType, int number) { - Weapon w = new Weapon(); - w.setName(name); - w.setSupportType(supportType); - w.setNumber(number); - w.setComponents(new ArrayList()); - return w; -} - -function boolean containsBlueArtillery(List blueWeapons) { - if (blueWeapons == null) { - return false; - } - for (Object obj : blueWeapons) { - Weapon w = (Weapon) obj; - if (w != null && isArtilleryWeapon(w)) { - return true; - } - } - return false; -} - -function void applyMappedWeapons(List redWeapons, Map cfg, String mapKey, int defaultNum, boolean allowArmedHelicopter) { - List mappedNames = parseMappedWeaponNames(cfg, mapKey); - if (mappedNames == null || mappedNames.isEmpty()) { - return; - } - for (Object obj : mappedNames) { - String weaponName = (String) obj; - if (!allowArmedHelicopter && weaponName != null && weaponName.equals((String) cfg.get("redArmedHelicopterName"))) { - continue; - } - String supportType = inferSupportTypeByWeaponName(weaponName); - Weapon redWeapon = ensureRedWeapon(redWeapons, weaponName, supportType, defaultNum); - ensureBasicRedComponents(redWeapon); - } -} - -function List parseMappedWeaponNames(Map cfg, String mapKey) { - List result = new ArrayList(); - if (cfg == null || mapKey == null) { - return result; - } - Object raw = cfg.get(mapKey); - if (raw == null) { - return result; - } - String text = String.valueOf(raw); - if (text == null || text.trim().equals("")) { - return result; - } - String[] parts = text.split(","); - for (int i = 0; i < parts.length; i++) { - String one = parts[i]; - if (one == null) { - continue; - } - String name = one.trim(); - if (name.equals("")) { - continue; - } - if (isValidRedWeaponNameByConfig(cfg, name) && !containsString(result, name)) { - result.add(name); - } - } - return result; -} - -function List parseCsvList(String text) { - List result = new ArrayList(); - if (text == null || text.trim().equals("")) { - return result; - } - String[] parts = text.split(","); - for (int i = 0; i < parts.length; i++) { - String one = parts[i]; - if (one == null) { - continue; - } - String item = one.trim(); - if (!item.equals("") && !result.contains(item)) { - result.add(item); - } - } - return result; -} - -function boolean isValidRedWeaponNameByConfig(Map cfg, String weaponName) { - if (cfg == null || weaponName == null || weaponName.equals("")) { - return false; - } - return weaponName.equals((String) cfg.get("redStrikeDroneName")) - || weaponName.equals((String) cfg.get("redArmedHelicopterName")) - || weaponName.equals((String) cfg.get("redHowitzerName")) - || weaponName.equals((String) cfg.get("redVehicleMortarName")) - || weaponName.equals((String) cfg.get("redAaWeaponName")) - || weaponName.equals((String) cfg.get("redAtRocketName")) - || weaponName.equals((String) cfg.get("redAtMissileSystemName")) - || weaponName.equals((String) cfg.get("redMissileVehicleName")); -} - -function boolean containsString(List values, String target) { - if (values == null || target == null) { - return false; - } - for (Object obj : values) { - if (obj != null && target.equals(String.valueOf(obj))) { - return true; - } - } - return false; -} - -function String inferSupportTypeByWeaponName(String weaponName) { - if (weaponName == null) { - return "ground"; - } - if (weaponName.contains("无人机") || weaponName.contains("直升机")) { - return "overhead"; - } - if (weaponName.contains("防空导弹")) { - return "antiaircraft"; - } - return "ground"; -} - -// 蓝方若有导弹,红方空中武器补导弹:数量 = 蓝方 + offset,范围略高 -function void applyMissileLinkage( - FactTask fact, - Map cfg -) { - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - List blueWeapons = fact.getBlueTask().getTaskWeapons(); - List redWeapons = fact.getRedTask().getTaskWeapons(); - if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { - return; - } - - if (!readBooleanCfg(cfg, "enableMissileLinkage", true)) { - return; - } - int blueMissileCount = countBlueMissileNumber(blueWeapons); - if (blueMissileCount < readIntCfg(cfg, "minBlueMissileCountForLinkage", 1)) { - return; - } - int blueMissileRange = readBlueMissileRange(blueWeapons, readIntCfg(cfg, "blueMissileRangeDefault", 220)); - int redMissileTarget = blueMissileCount + readIntCfg(cfg, "missileCountOffset", 1); - int redRangeTarget = blueMissileRange + readIntCfg(cfg, "missileRangeOffset", 80); - - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || !isRedAirWeapon(redWeapon)) { - continue; - } - ensureMissileComponentForRedAirWeapon(redWeapon, redMissileTarget, redRangeTarget); - } -} - -function void bindTargetIdsForRedWeapons(List redWeapons, List blueWeapons, Map cfg) { - if (!readBooleanCfg(cfg, "enableTargetAutoBind", true)) { - return; - } - if (redWeapons == null || redWeapons.isEmpty() || blueWeapons == null || blueWeapons.isEmpty()) { - return; - } - Map blueById = indexBlueWeaponsById(blueWeapons); - Map assignedCountByBlueId = new java.util.HashMap(); - double decayAlpha = readDoubleCfg(cfg, "targetDecayAlpha", 0.35d); - boolean fallbackToNearest = readBooleanCfg(cfg, "fallbackToNearestTarget", true); - boolean allowUnassigned = readBooleanCfg(cfg, "allowUnassignedRedWeapon", true); - int total = redWeapons.size(); - int bound = 0; - - // 核心:每把红武器选择“当前边际收益最高”的蓝目标 - for (Object objR : redWeapons) { - Weapon redWeapon = (Weapon) objR; - if (redWeapon == null) { - continue; - } - String bestBlueId = null; - double bestMarginal = -1.0d; - for (Object objB : blueWeapons) { - Weapon blueWeapon = (Weapon) objB; - if (blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { - continue; - } - if (!isPairFeasible(redWeapon, blueWeapon, cfg)) { - continue; - } - double baseScore = computePairScore(redWeapon, blueWeapon, cfg); - Integer countObj = (Integer) assignedCountByBlueId.get(blueWeapon.getEquipmentId()); - int k = countObj == null ? 0 : countObj.intValue(); - double decay = 1.0d / (1.0d + decayAlpha * k); - double marginal = baseScore * decay; - if (marginal > bestMarginal) { - bestMarginal = marginal; - bestBlueId = blueWeapon.getEquipmentId(); - } - } - if (isBlank(bestBlueId) && fallbackToNearest) { - bestBlueId = pickNearestBlueId(redWeapon, blueWeapons); - } - if (isBlank(bestBlueId)) { - if (!allowUnassigned) { - bestBlueId = pickAnyBlueId(blueWeapons); - } - } - if (!isBlank(bestBlueId)) { - redWeapon.setTargetId(bestBlueId); - bound++; - incrementAssignedCount(assignedCountByBlueId, bestBlueId); - } - } - - double minRatio = readDoubleCfg(cfg, "minTargetBindRatio", 0.7d); - boolean allowReserveWithoutTarget = readBooleanCfg(cfg, "allowReserveWithoutTarget", true); - if (!allowReserveWithoutTarget) { - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { - continue; - } - String any = pickAnyBlueId(blueWeapons); - if (!isBlank(any)) { - redWeapon.setTargetId(any); - bound++; - } - } - return; - } - // 允许冗余时,只保证最低绑定比例 - if (total > 0 && ((double) bound / (double) total) < minRatio) { - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || !isBlank(redWeapon.getTargetId())) { - continue; - } - String any = pickAnyBlueId(blueWeapons); - if (isBlank(any)) { - continue; - } - redWeapon.setTargetId(any); - bound++; - if (((double) bound / (double) total) >= minRatio) { - break; - } - } - } -} - -function void applyHitRateDrivenOffsets(FactTask fact, Map cfg) { - if (fact == null || fact.getRedTask() == null) { - return; - } - List redWeapons = fact.getRedTask().getTaskWeapons(); - if (redWeapons == null || redWeapons.isEmpty()) { - return; - } - applyDefaultHitRateIfAbsent(redWeapons, cfg); - Map explicitOffset = parseNameIntCsv((String) cfg.get("offsetCsvByWeapon")); - double threshold = normalizeProbability(readDoubleCfg(cfg, "hitRateThreshold", 0.7d), 0.7d); - double step1Max = readDoubleCfg(cfg, "hitRateGapStep1Max", 0.5d); - double step2Max = readDoubleCfg(cfg, "hitRateGapStep2Max", 1.0d); - int step1Offset = readIntCfg(cfg, "hitRateStep1Offset", 1); - int step2Offset = readIntCfg(cfg, "hitRateStep2Offset", 2); - if (step1Max < 0.0d) { - step1Max = 0.0d; - } - if (step2Max < step1Max) { - step2Max = step1Max; - } - if (step1Offset < 0) { - step1Offset = 0; - } - if (step2Offset < step1Offset) { - step2Offset = step1Offset; - } - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null) { - continue; - } - int base = redWeapon.getNumber() == null || redWeapon.getNumber() <= 0 ? 1 : redWeapon.getNumber().intValue(); - Integer explicit = (Integer) explicitOffset.get(redWeapon.getName()); - int offset = 0; - if (explicit != null) { - offset = explicit.intValue(); - } else { - double pHit = resolveWeaponHitRate(redWeapon, cfg); - double gap = threshold - pHit; - if (gap <= 0.0d) { - offset = 0; - } else if (gap <= step1Max) { - offset = step1Offset; - } else if (gap <= step2Max) { - offset = step2Offset; - } else { - // 超出第二档时按第二档处理,避免火力数量无上限膨胀 - offset = step2Offset; - } - } - if (offset < 0) { - offset = 0; - } - redWeapon.setNumber(base + offset); - } -} - -function void applyRangeSanityAndRecommend(FactTask fact, Map cfg) { - if (!readBooleanCfg(cfg, "enableRangeSanityCheck", true)) { - return; - } - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - List blueWeapons = fact.getBlueTask().getTaskWeapons(); - List redWeapons = fact.getRedTask().getTaskWeapons(); - if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { - return; - } - Map blueById = indexBlueWeaponsById(blueWeapons); - int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); - boolean autoAdjust = readBooleanCfg(cfg, "enableAutoRangeRecommend", true); - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || isBlank(redWeapon.getTargetId())) { - continue; - } - Weapon blueWeapon = (Weapon) blueById.get(redWeapon.getTargetId()); - if (blueWeapon == null) { - continue; - } - Coordinate rc = redWeapon.getCoordinate(); - Coordinate bc = blueWeapon.getCoordinate(); - if (!isCoordinateUsable(rc) || !isCoordinateUsable(bc)) { - continue; - } - int currentRange = readRangeMetersFromWeapon(redWeapon); - if (currentRange <= 0) { - continue; - } - double d = approxDistanceMeters( - rc.getLongitude().doubleValue(), - rc.getLatitude().doubleValue(), - bc.getLongitude().doubleValue(), - bc.getLatitude().doubleValue() - ); - int minRequired = (int) Math.ceil(d) + margin; - if (currentRange >= minRequired) { - continue; - } - if (tryReplaceWithBetterRangeWeapon(redWeapon, minRequired, cfg)) { - continue; - } - if (autoAdjust) { - setWeaponFirstRangeParamAtLeast(redWeapon, minRequired); - } - } -} - -function boolean tryReplaceWithBetterRangeWeapon(Weapon redWeapon, int minRequired, Map cfg) { - if (redWeapon == null || redWeapon.getName() == null) { - return false; - } - String current = redWeapon.getName(); - String replacement = null; - if (current.contains("反坦克火箭")) { - replacement = "反坦克导弹系统"; - } else if (current.contains("迫击炮")) { - replacement = "迫榴炮"; - } else if (current.contains("无人机")) { - replacement = "武装直升机"; - } - if (isBlank(replacement)) { - return false; - } - if (estimateRangeByRedWeaponName(replacement) < minRequired) { - return false; - } - redWeapon.setName(replacement); - redWeapon.setSupportType(inferSupportTypeByWeaponName(replacement)); - redWeapon.setComponents(new ArrayList()); - ensureBasicRedComponents(redWeapon); - redWeapon.setHitRate(Double.valueOf(resolveHitRateByName(replacement, cfg))); - return true; -} - -function void applyDefaultHitRateIfAbsent(List redWeapons, Map cfg) { - if (redWeapons == null || redWeapons.isEmpty()) { - return; - } - Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); - double fallback = normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null) { - continue; - } - if (redWeapon.getHitRate() != null && redWeapon.getHitRate().doubleValue() > 0.0d) { - continue; - } - Double p = (Double) hitRateMap.get(redWeapon.getName()); - if (p == null) { - p = fallback; - } - redWeapon.setHitRate(normalizeProbability(p.doubleValue(), fallback)); - } -} - -function double resolveWeaponHitRate(Weapon redWeapon, Map cfg) { - if (redWeapon != null && redWeapon.getHitRate() != null) { - double p = redWeapon.getHitRate().doubleValue(); - return normalizeProbability(p, 0.6d); - } - Map hitRateMap = parseNameDoubleCsv((String) cfg.get("hitRateCsv")); - Double fromCfg = redWeapon == null ? null : (Double) hitRateMap.get(redWeapon.getName()); - if (fromCfg != null) { - return normalizeProbability(fromCfg.doubleValue(), 0.6d); - } - return normalizeProbability(readDoubleCfg(cfg, "defaultHitRateFallback", 0.6d), 0.6d); -} - -function int computeRequiredShots(double pHit, double pKill, int fallback) { - double p = normalizeProbability(pHit, 0.6d); - double pk = normalizeProbability(pKill, 0.9d); - if (p >= 0.999d) { - return 1; - } - if (p <= 0.0001d) { - return fallback <= 0 ? 1 : fallback; - } - double up = Math.log(1.0d - pk); - double down = Math.log(1.0d - p); - if (down == 0.0d) { - return fallback <= 0 ? 1 : fallback; - } - int n = (int) Math.ceil(up / down); - if (n <= 0) { - n = 1; - } - return n; -} - -function Map parseNameDoubleCsv(String csv) { - Map result = new java.util.HashMap(); - if (csv == null || csv.trim().equals("")) { - return result; - } - String[] items = csv.split(","); - for (int i = 0; i < items.length; i++) { - String one = items[i]; - if (one == null) { - continue; - } - String text = one.trim(); - if (text.equals("")) { - continue; - } - int idx = text.indexOf("="); - if (idx <= 0 || idx >= text.length() - 1) { - continue; - } - String key = text.substring(0, idx).trim(); - String val = text.substring(idx + 1).trim(); - if (key.equals("") || val.equals("")) { - continue; - } - result.put(key, Double.valueOf(parseDoubleSafe(val, 0.0d))); - } - return result; -} - -function Map parseNameIntCsv(String csv) { - Map result = new java.util.HashMap(); - if (csv == null || csv.trim().equals("")) { - return result; - } - String[] items = csv.split(","); - for (int i = 0; i < items.length; i++) { - String one = items[i]; - if (one == null) { - continue; - } - String text = one.trim(); - if (text.equals("")) { - continue; - } - int idx = text.indexOf("="); - if (idx <= 0 || idx >= text.length() - 1) { - continue; - } - String key = text.substring(0, idx).trim(); - String val = text.substring(idx + 1).trim(); - if (key.equals("") || val.equals("")) { - continue; - } - result.put(key, Integer.valueOf(parseIntSafe(val, 0))); - } - return result; -} - -function double normalizeProbability(double p, double fallback) { - if (Double.isNaN(p) || Double.isInfinite(p)) { - p = fallback; - } - if (p <= 0.0d) { - p = fallback; - } - if (p <= 0.0d) { - p = 0.0001d; - } - if (p >= 1.0d) { - p = 0.999d; - } - return p; -} - -function Map indexBlueWeaponsById(List blueWeapons) { - Map result = new java.util.HashMap(); - if (blueWeapons == null) { - return result; - } - for (Object obj : blueWeapons) { - Weapon w = (Weapon) obj; - if (w == null || isBlank(w.getEquipmentId())) { - continue; - } - result.put(w.getEquipmentId(), w); - } - return result; -} - -function Map initBlueSurvivalMap(Map blueById) { - Map result = new java.util.HashMap(); - if (blueById == null) { - return result; - } - for (Object key : blueById.keySet()) { - result.put(key, Double.valueOf(1.0d)); - } - return result; -} - -function void updateBlueSurvival(Map survivalByBlueId, String blueId, double pHit) { - if (survivalByBlueId == null || isBlank(blueId)) { - return; - } - Double survival = (Double) survivalByBlueId.get(blueId); - if (survival == null) { - survival = Double.valueOf(1.0d); - } - double s = survival.doubleValue(); - double p = normalizeProbability(pHit, 0.6d); - s = s * (1.0d - p); - if (s < 0.0d) { - s = 0.0d; - } - survivalByBlueId.put(blueId, Double.valueOf(s)); -} - -function void incrementAssignedCount(Map assignedCountByBlueId, String blueId) { - Integer old = (Integer) assignedCountByBlueId.get(blueId); - int now = old == null ? 1 : old.intValue() + 1; - assignedCountByBlueId.put(blueId, Integer.valueOf(now)); -} - -function boolean isPairFeasible(Weapon redWeapon, Weapon blueWeapon, Map cfg) { - if (redWeapon == null || blueWeapon == null || isBlank(blueWeapon.getEquipmentId())) { - return false; - } - // 类型禁配(最基础约束) - String pool = inferBluePoolKeyForRedWeapon(redWeapon); - if ("air".equals(pool) && !isAirWeapon(blueWeapon)) { - return false; - } - if ("armor".equals(pool) && !isArmorWeapon(blueWeapon)) { - return false; - } - if ("artillery".equals(pool) && !isArtilleryWeapon(blueWeapon) && !isGroundWeapon(blueWeapon)) { - return false; - } - // 距离/高度约束(有坐标时启用) - Coordinate rc = redWeapon.getCoordinate(); - Coordinate bc = blueWeapon.getCoordinate(); - if (isCoordinateUsable(rc) && isCoordinateUsable(bc)) { - double d = approxDistanceMeters( - rc.getLongitude().doubleValue(), - rc.getLatitude().doubleValue(), - bc.getLongitude().doubleValue(), - bc.getLatitude().doubleValue() - ); - int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); - if (d > maxDist) { - return false; - } - int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); - int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); - int maxGap = readIntCfg(cfg, "maxHeightGap", 800); - if (Math.abs(rh - bh) > maxGap) { - return false; - } - int estRange = estimateRangeByRedWeaponName(redWeapon.getName()); - int margin = readIntCfg(cfg, "rangeSafetyMarginMeters", 50); - if (estRange < (int) Math.ceil(d) + margin) { - return false; - } - } - return true; -} - -function double computePairScore(Weapon redWeapon, Weapon blueWeapon, Map cfg) { - double wType = readDoubleCfg(cfg, "w_target_type", 0.30d); - double wDist = readDoubleCfg(cfg, "w_target_dist", 0.25d); - double wHeight = readDoubleCfg(cfg, "w_target_height", 0.10d); - double wHit = readDoubleCfg(cfg, "w_target_hit", 0.20d); - double wThreat = readDoubleCfg(cfg, "w_target_threat", 0.15d); - double typeFit = computeTypeFit(redWeapon, blueWeapon); - double distanceFit = computeDistanceFit(redWeapon, blueWeapon, cfg); - double heightFit = computeHeightFit(redWeapon, blueWeapon, cfg); - double hitContribution = resolveWeaponHitRate(redWeapon, cfg); - double threatWeight = computeBlueThreatWeight(blueWeapon); - return (wType * typeFit) + (wDist * distanceFit) + (wHeight * heightFit) + (wHit * hitContribution) + (wThreat * threatWeight); -} - -function double computeTypeFit(Weapon redWeapon, Weapon blueWeapon) { - String pool = inferBluePoolKeyForRedWeapon(redWeapon); - if ("air".equals(pool) && isAirWeapon(blueWeapon)) { - return 1.0d; - } - if ("armor".equals(pool) && isArmorWeapon(blueWeapon)) { - return 1.0d; - } - if ("artillery".equals(pool) && isArtilleryWeapon(blueWeapon)) { - return 0.9d; - } - if ("missile".equals(pool) && hasMissileComponent(blueWeapon)) { - return 0.9d; - } - if ("ground".equals(pool) && isGroundWeapon(blueWeapon)) { - return 0.7d; - } - return 0.2d; -} - -function double computeDistanceFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { - Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); - Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); - if (!isCoordinateUsable(rc) || !isCoordinateUsable(bc)) { - return 0.5d; - } - double d = approxDistanceMeters( - rc.getLongitude().doubleValue(), - rc.getLatitude().doubleValue(), - bc.getLongitude().doubleValue(), - bc.getLatitude().doubleValue() - ); - int maxDist = readIntCfg(cfg, "maxEffectiveDistance", 3000); - if (maxDist <= 0) { - maxDist = 3000; - } - double ratio = d / (double) maxDist; - if (ratio <= 0.3d) { - return 1.0d; - } - if (ratio <= 0.6d) { - return 0.8d; - } - if (ratio <= 1.0d) { - return 0.5d; - } - return 0.0d; -} - -function double computeHeightFit(Weapon redWeapon, Weapon blueWeapon, Map cfg) { - Coordinate rc = redWeapon == null ? null : redWeapon.getCoordinate(); - Coordinate bc = blueWeapon == null ? null : blueWeapon.getCoordinate(); - if (rc == null || bc == null) { - return 0.6d; - } - int rh = rc.getHeight() == null ? 0 : rc.getHeight().intValue(); - int bh = bc.getHeight() == null ? 0 : bc.getHeight().intValue(); - int gap = Math.abs(rh - bh); - int maxGap = readIntCfg(cfg, "maxHeightGap", 800); - if (maxGap <= 0) { - maxGap = 800; - } - if (gap >= maxGap) { - return 0.0d; - } - double ratio = (double) gap / (double) maxGap; - return 1.0d - ratio; -} - -function double computeBlueThreatWeight(Weapon blueWeapon) { - if (blueWeapon == null) { - return 0.5d; - } - double t = 0.4d; - if (isAirWeapon(blueWeapon)) { - t += 0.3d; - } - if (isArmorWeapon(blueWeapon)) { - t += 0.2d; - } - if (hasMissileComponent(blueWeapon)) { - t += 0.2d; - } - if (blueWeapon.getNumber() != null && blueWeapon.getNumber().intValue() >= 2) { - t += 0.1d; - } - if (t > 1.0d) { - t = 1.0d; - } - return t; -} - -function String pickNearestBlueId(Weapon redWeapon, List blueWeapons) { - if (redWeapon == null || redWeapon.getCoordinate() == null || !isCoordinateUsable(redWeapon.getCoordinate()) || blueWeapons == null) { - return null; - } - String bestId = null; - double best = Double.MAX_VALUE; - for (Object obj : blueWeapons) { - Weapon b = (Weapon) obj; - if (b == null || isBlank(b.getEquipmentId()) || !isCoordinateUsable(b.getCoordinate())) { - continue; - } - double d = approxDistanceMeters( - redWeapon.getCoordinate().getLongitude().doubleValue(), - redWeapon.getCoordinate().getLatitude().doubleValue(), - b.getCoordinate().getLongitude().doubleValue(), - b.getCoordinate().getLatitude().doubleValue() - ); - if (d < best) { - best = d; - bestId = b.getEquipmentId(); - } - } - return bestId; -} - -function String pickAnyBlueId(List blueWeapons) { - if (blueWeapons == null || blueWeapons.isEmpty()) { - return null; - } - for (Object obj : blueWeapons) { - Weapon b = (Weapon) obj; - if (b != null && !isBlank(b.getEquipmentId())) { - return b.getEquipmentId(); - } - } - return null; -} - -function Weapon pickUnboundRedWeaponForBlue(String blueId, List redWeapons) { - if (redWeapons == null || redWeapons.isEmpty()) { - return null; - } - for (Object obj : redWeapons) { - Weapon w = (Weapon) obj; - if (w == null || !isBlank(w.getTargetId())) { - continue; - } - return w; - } - return null; -} - -function String pickBlueTargetByNeed(Map pools, String preferredKey, Map assignedCountByBlueId, Map survivalByBlueId, double desiredKill, int cap) { - String best = pickBestBlueIdFromPool((List) pools.get(preferredKey), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); - if (!isBlank(best)) { - return best; - } - if (!"ground".equals(preferredKey)) { - String fromGround = pickBestBlueIdFromPool((List) pools.get("ground"), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); - if (!isBlank(fromGround)) { - return fromGround; - } - } - return pickBestBlueIdFromPool((List) pools.get("all"), assignedCountByBlueId, survivalByBlueId, desiredKill, cap); -} - -function String pickBestBlueIdFromPool(List ids, Map assignedCountByBlueId, Map survivalByBlueId, double desiredKill, int cap) { - if (ids == null || ids.isEmpty()) { - return null; - } - String bestId = null; - double bestNeed = -9999.0d; - int bestAssigned = Integer.MAX_VALUE; - for (Object obj : ids) { - String id = String.valueOf(obj); - if (isBlank(id)) { - continue; - } - Integer assignedObj = (Integer) assignedCountByBlueId.get(id); - int assigned = assignedObj == null ? 0 : assignedObj.intValue(); - if (assigned >= cap) { - continue; - } - Double survivalObj = (Double) survivalByBlueId.get(id); - double survival = survivalObj == null ? 1.0d : survivalObj.doubleValue(); - double achieved = 1.0d - survival; - double need = desiredKill - achieved; - if (need > bestNeed || (Math.abs(need - bestNeed) < 1e-9 && assigned < bestAssigned)) { - bestNeed = need; - bestAssigned = assigned; - bestId = id; - } - } - return bestId; -} - -function boolean isCoordinateUsable(Coordinate c) { - return c != null && c.getLongitude() != null && c.getLatitude() != null; -} - -function int readRangeMetersFromWeapon(Weapon weapon) { - if (weapon == null || weapon.getComponents() == null) { - return -1; - } - for (Object obj : weapon.getComponents()) { - SubComponents comp = (SubComponents) obj; - if (comp == null || comp.getComponentParams() == null || comp.getComponentParams().isEmpty()) { - continue; - } - ComponentParam first = (ComponentParam) comp.getComponentParams().get(0); - if (first == null || first.getAttExplain() == null) { - continue; - } - String explain = first.getAttExplain(); - if (!(explain.contains("范围") || explain.contains("射程"))) { - continue; - } - return parseIntSafe(first.getAttDefaultValue(), -1); - } - return -1; -} - -function void setWeaponFirstRangeParamAtLeast(Weapon weapon, int minRange) { - if (weapon == null || weapon.getComponents() == null || minRange <= 0) { - return; - } - for (Object obj : weapon.getComponents()) { - SubComponents comp = (SubComponents) obj; - if (comp == null || comp.getComponentParams() == null || comp.getComponentParams().isEmpty()) { - continue; - } - ComponentParam first = (ComponentParam) comp.getComponentParams().get(0); - if (first == null || first.getAttExplain() == null) { - continue; - } - String explain = first.getAttExplain(); - if (!(explain.contains("范围") || explain.contains("射程"))) { - continue; - } - int current = parseIntSafe(first.getAttDefaultValue(), 0); - if (current < minRange) { - first.setAttDefaultValue(String.valueOf(minRange)); - } - return; - } -} - -//------------------------------------------------------------------------------- -// component 映射解析 + 仅导弹组件数量/参数覆盖 -function Map parseDeviceNameMapping(String csv) { - Map result = new java.util.HashMap(); - if (csv == null) { - return result; - } - String text = csv.trim(); - if (text.equals("")) { - return result; - } - String[] parts = text.split(","); - for (int i = 0; i < parts.length; i++) { - String one = parts[i]; - if (one == null) { - continue; - } - String item = one.trim(); - if (item.equals("")) { - continue; - } - int idx = item.indexOf("->"); - if (idx <= 0 || idx >= item.length() - 2) { - continue; - } - String left = item.substring(0, idx).trim(); - String right = item.substring(idx + 2).trim(); - if (left.equals("") || right.equals("")) { - continue; - } - result.put(left, right); - } - return result; -} - -function void applyAllComponentQuantities(FactTask fact, Map cfg) { - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - if (!readBooleanCfg(cfg, "enableComponentQuantityMatch", true)) { - return; - } - Task blueTask = fact.getBlueTask(); - Task redTask = fact.getRedTask(); - List blueWeapons = blueTask.getTaskWeapons(); - List redWeapons = redTask.getTaskWeapons(); - if (blueWeapons == null || blueWeapons.isEmpty() || redWeapons == null || redWeapons.isEmpty()) { - return; - } - - String mappingCsv = cfg == null ? null : (String) cfg.get("componentDeviceNameMappingCsv"); - Map deviceNameMapping = parseDeviceNameMapping(mappingCsv); - - String missileKeyword = cfg == null ? null : (String) cfg.get("missileComponentNameContains"); - if (missileKeyword == null || missileKeyword.trim().equals("")) { - missileKeyword = "导弹"; - } else { - missileKeyword = missileKeyword.trim(); - } - - // 遍历红方每个武器:用 targetId 找蓝方装备(equipmentId) - for (Object objR : redWeapons) { - Weapon redWeapon = (Weapon) objR; - if (redWeapon == null) { - continue; - } - String targetId = redWeapon.getTargetId(); - if (isBlank(targetId)) { - // 允许不匹配:targetId 为空直接跳过 - continue; - } - - Weapon blueWeapon = null; - for (Object objB : blueWeapons) { - Weapon w = (Weapon) objB; - if (w == null) { - continue; - } - String eqId = w.getEquipmentId(); - if (eqId != null && eqId.equals(targetId)) { - blueWeapon = w; - break; - } - } - if (blueWeapon == null) { - continue; - } - - List blueComps = blueWeapon.getComponents(); - List redComps = redWeapon.getComponents(); - if (blueComps == null || blueComps.isEmpty() || redComps == null || redComps.isEmpty()) { - continue; - } - - // 用蓝方组件驱动覆盖红方组件数量 - for (Object objBC : blueComps) { - SubComponents blueComp = (SubComponents) objBC; - if (blueComp == null) { - continue; - } - String blueCompName = blueComp.getDeviceName(); - if (isBlank(blueCompName)) { - continue; - } - - // 仅导弹组件参与匹配,非导弹组件保持红方原值 - if (!blueCompName.contains(missileKeyword)) { - continue; - } - - String redCompName = (String) deviceNameMapping.get(blueCompName); - if (redCompName == null || redCompName.trim().equals("")) { - redCompName = blueCompName; - } - - SubComponents redComp = null; - for (Object objRC : redComps) { - SubComponents rc = (SubComponents) objRC; - if (rc == null) { - continue; - } - if (redCompName.equals(rc.getDeviceName())) { - redComp = rc; - break; - } - } - if (redComp == null) { - // 允许不匹配:红方下没有该组件则跳过 - continue; - } - - List blueParams = blueComp.getComponentParams(); - List redParams = redComp.getComponentParams(); - if (blueParams == null || blueParams.isEmpty() || redParams == null || redParams.isEmpty()) { - continue; - } - - ComponentParam blueFirst = (ComponentParam) blueParams.get(0); - ComponentParam redFirst = (ComponentParam) redParams.get(0); - if (blueFirst == null || redFirst == null) { - continue; - } - if (blueFirst.getNumber() == null) { - continue; - } - - // 覆盖导弹组件数量(componentParams[0].number) - redFirst.setNumber(blueFirst.getNumber()); - // 覆盖导弹组件首参数默认值(如范围米/破坏范围米) - if (!isBlank(blueFirst.getAttDefaultValue())) { - redFirst.setAttDefaultValue(blueFirst.getAttDefaultValue()); - } - } - } -} - -function void prepareDeploymentPools(FactTask fact, Map cfg, Map runtime) { - if (!readBooleanCfg(cfg, "enablePositionRules", true)) { - return; - } - if (fact == null || runtime == null) { - return; - } - List combatPolygon = extractZonePolygonFromTask(fact, true); - List defensePolygon = extractZonePolygonFromTask(fact, false); - int spacing = readIntCfg(cfg, "fireUnitSpacingMeters", 100); - List combatPoints = buildGridPointsInPolygon(combatPolygon, spacing, readIntCfg(cfg, "groundDeployHeight", 20)); - List defensePoints = buildGridPointsInPolygon(defensePolygon, spacing, readIntCfg(cfg, "groundDeployHeight", 20)); - runtime.put("deploymentCombatPoints", combatPoints); - runtime.put("deploymentDefensePoints", defensePoints); -} - -function void applyWeaponDeployment(FactTask fact, Map cfg, Map runtime) { - if (!readBooleanCfg(cfg, "enablePositionRules", true)) { - return; - } - if (fact == null || fact.getRedTask() == null || fact.getRedTask().getTaskWeapons() == null || runtime == null) { - return; - } - List combatPoints = (List) runtime.get("deploymentCombatPoints"); - List defensePoints = (List) runtime.get("deploymentDefensePoints"); - if ((combatPoints == null || combatPoints.isEmpty()) && (defensePoints == null || defensePoints.isEmpty())) { - return; - } - Map cursor = new java.util.HashMap(); - List defensePriorityWeapons = parseCsvList((String) cfg.get("defensePriorityWeapons")); - String airPref = String.valueOf(cfg.get("airDeployZonePreference")); - int groundH = readIntCfg(cfg, "groundDeployHeight", 20); - int airH = readIntCfg(cfg, "airDeployHeight", 300); - Task blueTask = fact.getBlueTask(); - Task redTask = fact.getRedTask(); - String deployMode = resolveDeployModeByBlueState(blueTask, cfg); - Coordinate groundAnchor = pickAnchorByMode(deployMode, combatPoints, defensePoints, cursor); - Coordinate airAnchor = pickAnchorByMode("defense".equalsIgnoreCase(airPref) ? "near_slow" : deployMode, combatPoints, defensePoints, cursor); - String formationType = resolveFormationType(redTask, blueTask, cfg, deployMode); - int spacing = resolveFormationSpacing(redTask, blueTask, cfg); - int headingDeg = resolveFormationHeading(redTask, blueTask, cfg); - int mainWingDistance = resolveMainWingDistance(redTask, blueTask, cfg, deployMode); - - List groundWeapons = new ArrayList(); - List airWeapons = new ArrayList(); - for (Object obj : redTask.getTaskWeapons()) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null) { - continue; - } - if (isRedAirWeapon(redWeapon)) { - airWeapons.add(redWeapon); - } else { - groundWeapons.add(redWeapon); - } - } - - applyFormationForWeaponGroup(groundWeapons, groundAnchor, formationType, spacing, headingDeg, mainWingDistance, groundH, defensePriorityWeapons, combatPoints, defensePoints, cursor, null, null, null, false); - applyFormationForWeaponGroup(airWeapons, airAnchor, formationType, spacing, headingDeg, mainWingDistance, airH, defensePriorityWeapons, combatPoints, defensePoints, cursor, blueTask, cfg, deployMode, true); -} - -function void applyFormationForWeaponGroup(List weapons, Coordinate anchor, String formationType, int spacing, int headingDeg, int mainWingDistance, int defaultHeight, List defensePriorityWeapons, List combatPoints, List defensePoints, Map cursor, Task blueTask, Map cfg, String deployMode, boolean isAirGroup) { - if (weapons == null || weapons.isEmpty()) { - return; - } - List sortedWeapons = sortWeaponsByFormationRole(weapons); - if (anchor == null) { - for (int i = 0; i < sortedWeapons.size(); i++) { - Weapon w = (Weapon) sortedWeapons.get(i); - if (w == null) { - continue; - } - int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); - Coordinate fallback = null; - if (defensePriorityWeapons != null && defensePriorityWeapons.contains(w.getName())) { - fallback = pickCoordinateByPreference(defensePoints, combatPoints, cursor, "defense"); - } else { - fallback = pickCoordinateByPreference(combatPoints, defensePoints, cursor, "combat"); - } - if (fallback != null) { - w.setCoordinate(cloneCoordinateWithHeight(fallback, h)); - } - } - return; - } - List offsets = buildFormationOffsets(formationType, sortedWeapons.size(), spacing); - for (int i = 0; i < sortedWeapons.size(); i++) { - Weapon w = (Weapon) sortedWeapons.get(i); - if (w == null) { - continue; - } - int h = resolveWeaponDeployHeight(w, blueTask, cfg, deployMode, i, defaultHeight, isAirGroup); - Map off = i < offsets.size() ? (Map) offsets.get(i) : null; - double dx = off == null || off.get("dx") == null ? 0.0d : ((Double) off.get("dx")).doubleValue(); - double dy = off == null || off.get("dy") == null ? 0.0d : ((Double) off.get("dy")).doubleValue(); - if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole()) && w.getWingRelativeDistanceMeters() != null && w.getWingRelativeDistanceMeters().intValue() > 0) { - int dist = w.getWingRelativeDistanceMeters().intValue(); - int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); - dx = dist * Math.cos(Math.toRadians(bearing)); - dy = dist * Math.sin(Math.toRadians(bearing)); - } else if (w.getFormationRole() != null && "WING".equalsIgnoreCase(w.getFormationRole())) { - int dist = mainWingDistance; - int bearing = w.getWingRelativeBearingDeg() == null ? (i % 2 == 0 ? 45 : -45) : w.getWingRelativeBearingDeg().intValue(); - dx = dist * Math.cos(Math.toRadians(bearing)); - dy = dist * Math.sin(Math.toRadians(bearing)); - } - Coordinate c = moveCoordinateByMeters(anchor, dx, dy, headingDeg, h); - if (c != null) { - w.setCoordinate(c); - if (w.getFormationRole() == null || w.getFormationRole().trim().equals("")) { - w.setFormationRole(i == 0 ? "MAIN" : "WING"); - } - } - } -} - -function String resolveDeployModeByBlueState(Task blueTask, Map cfg) { - double d = computeDefMinDistanceMeters(blueTask); - int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); - int fast = readIntCfg(cfg, "speedFastThreshold", 180); - int near = readIntCfg(cfg, "distanceNearDefenseThresholdMeters", 800); - int far = readIntCfg(cfg, "distanceFarDefenseThresholdMeters", 2500); - if (avgSpeed >= fast && d <= near) { - return "near_fast"; - } - if (avgSpeed >= fast && d >= far) { - return "far_fast"; - } - if (avgSpeed < fast && d <= near) { - return "near_slow"; - } - return "default"; -} - -function Coordinate pickAnchorByMode(String mode, List combatPoints, List defensePoints, Map cursor) { - if ("near_fast".equals(mode)) { - return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_fast"); - } - if ("far_fast".equals(mode)) { - return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "far_fast"); - } - if ("near_slow".equals(mode)) { - return pickCoordinateByPreference(defensePoints, combatPoints, cursor, "near_slow"); - } - return pickCoordinateByPreference(combatPoints, defensePoints, cursor, "default"); -} - -function String resolveFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { - String fromTask = redTask == null ? null : redTask.getFormationType(); - if (!isBlank(fromTask)) { - return normalizeFormationType(fromTask, cfg); - } - if (readBooleanCfg(cfg, "enableAutoFormationSelect", true)) { - String autoType = autoSelectFormationType(redTask, blueTask, cfg, deployMode); - if (!isBlank(autoType)) { - return normalizeFormationType(autoType, cfg); - } - } - String fromCfg = cfg == null ? null : String.valueOf(cfg.get("formationDefaultType")); - if (isBlank(fromCfg)) { - return "TRIANGLE"; - } - return normalizeFormationType(fromCfg, cfg); -} - -function String autoSelectFormationType(Task redTask, Task blueTask, Map cfg, String deployMode) { - int threat = parseIntSafe(blueTask == null ? null : blueTask.getThreatLevel(), 1); - int highThreat = readIntCfg(cfg, "formationHighThreatLevel", 3); - if (threat >= highThreat) { - return String.valueOf(cfg.get("formationRule_high_threat")); - } - if ("near_fast".equals(deployMode)) { - return String.valueOf(cfg.get("formationRule_near_fast")); - } - if ("far_fast".equals(deployMode)) { - return String.valueOf(cfg.get("formationRule_far_fast")); - } - if ("near_slow".equals(deployMode)) { - return String.valueOf(cfg.get("formationRule_near_slow")); - } - int largeGroupCount = readIntCfg(cfg, "formationLargeGroupCount", 6); - int weaponCount = redTask == null || redTask.getTaskWeapons() == null ? 0 : redTask.getTaskWeapons().size(); - if (weaponCount >= largeGroupCount) { - return String.valueOf(cfg.get("formationRule_large_group")); - } - double airRatio = computeRedAirRatio(redTask); - if (airRatio >= 0.5d) { - return String.valueOf(cfg.get("formationRule_air_majority")); - } - return String.valueOf(cfg.get("formationRule_default")); -} - -function double computeRedAirRatio(Task redTask) { - if (redTask == null || redTask.getTaskWeapons() == null || redTask.getTaskWeapons().isEmpty()) { - return 0.0d; - } - int total = 0; - int air = 0; - for (Object obj : redTask.getTaskWeapons()) { - Weapon w = (Weapon) obj; - if (w == null) { - continue; - } - total++; - if (isRedAirWeapon(w)) { - air++; - } - } - if (total <= 0) { - return 0.0d; - } - return (double) air / (double) total; -} - -function String normalizeFormationType(String input, Map cfg) { - String defaultType = cfg == null ? "TRIANGLE" : String.valueOf(cfg.get("formationDefaultType")); - if (isBlank(defaultType)) { - defaultType = "TRIANGLE"; - } - if (isBlank(input)) { - return defaultType.trim().toUpperCase(); - } - String t = input.trim().toUpperCase(); - if ("TRIANGLE".equals(t) || "DIAMOND".equals(t) || "LINE".equals(t) || "COLUMN".equals(t) || "WEDGE".equals(t)) { - return t; - } - return defaultType.trim().toUpperCase(); -} - -function int resolveFormationSpacing(Task redTask, Task blueTask, Map cfg) { - if (redTask != null && redTask.getFormationSpacingMeters() != null && redTask.getFormationSpacingMeters().intValue() > 0) { - return redTask.getFormationSpacingMeters().intValue(); - } - int fallback = readIntCfg(cfg, "formationDefaultSpacingMeters", 120); - double scale = computeDefenseZoneScaleMeters(blueTask); - if (scale <= 0.0d) { - return fallback; - } - int minSpacing = readIntCfg(cfg, "formationSpacingMinMeters", 60); - int maxSpacing = readIntCfg(cfg, "formationSpacingMaxMeters", 220); - int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); - int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); - double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); - return clampInt((int) Math.round(minSpacing + (maxSpacing - minSpacing) * t), minSpacing, maxSpacing); -} - -function int resolveFormationHeading(Task redTask, Task blueTask, Map cfg) { - if (redTask != null && redTask.getFormationHeadingDeg() != null) { - return redTask.getFormationHeadingDeg().intValue(); - } - Integer headingFromTrack = computeHeadingFromBlueTrack(blueTask); - if (headingFromTrack != null) { - return headingFromTrack.intValue(); - } - return readIntCfg(cfg, "formationHeadingDefaultDeg", 0); -} - -function int resolveMainWingDistance(Task redTask, Task blueTask, Map cfg, String deployMode) { - if (redTask != null && redTask.getMainWingDistanceMeters() != null && redTask.getMainWingDistanceMeters().intValue() > 0) { - return redTask.getMainWingDistanceMeters().intValue(); - } - int fallback = readIntCfg(cfg, "mainWingDistanceDefaultMeters", 100); - double scale = computeDefenseZoneScaleMeters(blueTask); - if (scale <= 0.0d) { - return fallback; - } - int minD = readIntCfg(cfg, "mainWingDistanceMinMeters", 60); - int maxD = readIntCfg(cfg, "mainWingDistanceMaxMeters", 260); - int scaleMin = readIntCfg(cfg, "defenseScaleMinMeters", 300); - int scaleMax = readIntCfg(cfg, "defenseScaleMaxMeters", 3000); - double t = normalizeByRange(scale, (double) scaleMin, (double) scaleMax); - double base = minD + (maxD - minD) * t; - String key = "mainWingDistanceModeFactor_default"; - if ("near_fast".equals(deployMode)) { - key = "mainWingDistanceModeFactor_near_fast"; - } else if ("far_fast".equals(deployMode)) { - key = "mainWingDistanceModeFactor_far_fast"; - } else if ("near_slow".equals(deployMode)) { - key = "mainWingDistanceModeFactor_near_slow"; - } - double factor = readDoubleCfg(cfg, key, 1.0d); - int finalDist = (int) Math.round(base * factor); - return clampInt(finalDist, minD, maxD); -} - -function double computeDefenseZoneScaleMeters(Task blueTask) { - if (blueTask == null || blueTask.getDefZoneLocation() == null || blueTask.getDefZoneLocation().size() < 3) { - return -1.0d; - } - List points = blueTask.getDefZoneLocation(); - double maxD = -1.0d; - for (int i = 0; i < points.size(); i++) { - Coordinate a = (Coordinate) points.get(i); - if (a == null || a.getLongitude() == null || a.getLatitude() == null) { - continue; - } - for (int j = i + 1; j < points.size(); j++) { - Coordinate b = (Coordinate) points.get(j); - if (b == null || b.getLongitude() == null || b.getLatitude() == null) { - continue; - } - double d = approxDistanceMeters( - a.getLongitude().doubleValue(), - a.getLatitude().doubleValue(), - b.getLongitude().doubleValue(), - b.getLatitude().doubleValue() - ); - if (d > maxD) { - maxD = d; - } - } - } - return maxD; -} - -function double normalizeByRange(double value, double minV, double maxV) { - if (maxV <= minV) { - return 0.0d; - } - if (value <= minV) { - return 0.0d; - } - if (value >= maxV) { - return 1.0d; - } - return (value - minV) / (maxV - minV); -} - -function int clampInt(int value, int minV, int maxV) { - if (value < minV) { - return minV; - } - if (value > maxV) { - return maxV; - } - return value; -} - -/** 入参武器坐标高度>0 视为已指定部署高度 */ -function int readWeaponHeightIfValid(Weapon w) { - if (w == null || w.getCoordinate() == null || w.getCoordinate().getHeight() == null) { - return -1; - } - int h = w.getCoordinate().getHeight().intValue(); - return h > 0 ? h : -1; -} - -function int resolveBlueBaseHeight(Task blueTask, Map cfg) { - int fallback = readIntCfg(cfg, "airHeightFallback", readIntCfg(cfg, "airDeployHeight", 300)); - if (blueTask != null && blueTask.getTrackPoints() != null && !blueTask.getTrackPoints().isEmpty()) { - TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); - if (tail != null && tail.getHeight() != null && tail.getHeight().intValue() > 0) { - return tail.getHeight().intValue(); - } - } - if (blueTask != null && blueTask.getTaskWeapons() != null) { - int sum = 0; - int cnt = 0; - for (Object o : blueTask.getTaskWeapons()) { - Weapon bw = (Weapon) o; - if (bw == null || bw.getCoordinate() == null || bw.getCoordinate().getHeight() == null) { - continue; - } - int hh = bw.getCoordinate().getHeight().intValue(); - if (hh > 0) { - sum += hh; - cnt++; - } - } - if (cnt > 0) { - return sum / cnt; - } - } - return fallback; -} - -function int resolveRoleHeightAdjust(Weapon w, int indexInFormation, Map cfg) { - int mainAdj = readIntCfg(cfg, "airHeightAdjustMain", 20); - int wingAdj = readIntCfg(cfg, "airHeightAdjustWing", -10); - if (w != null && w.getFormationRole() != null && !w.getFormationRole().trim().equals("")) { - if ("MAIN".equalsIgnoreCase(w.getFormationRole())) { - return mainAdj; - } - if ("WING".equalsIgnoreCase(w.getFormationRole())) { - return wingAdj; - } - } - return indexInFormation == 0 ? mainAdj : wingAdj; -} - -function int computeAutoAirHeight(Weapon w, Task blueTask, Map cfg, int indexInFormation) { - int minH = readIntCfg(cfg, "airHeightMin", 50); - int maxH = readIntCfg(cfg, "airHeightMax", 20000); - int base = resolveBlueBaseHeight(blueTask, cfg); - int speedTh = readIntCfg(cfg, "airHeightSpeedThreshold", 180); - int fastAdj = readIntCfg(cfg, "airHeightAdjustFast", 40); - int avgSpeed = computeAverageSpeed(blueTask == null ? null : blueTask.getTrackPoints()); - int speedAdj = (avgSpeed >= speedTh) ? fastAdj : 0; - double d = computeDefMinDistanceMeters(blueTask); - int nearD = readIntCfg(cfg, "airHeightNearDefenseDistance", 800); - int farD = readIntCfg(cfg, "airHeightFarDefenseDistance", 2500); - int nearAdj = readIntCfg(cfg, "airHeightAdjustNear", -30); - int farAdj = readIntCfg(cfg, "airHeightAdjustFar", 40); - int distAdj = 0; - if (d < Double.MAX_VALUE / 4.0d) { - if (d <= (double) nearD) { - distAdj = nearAdj; - } else if (d >= (double) farD) { - distAdj = farAdj; - } - } - int roleAdj = resolveRoleHeightAdjust(w, indexInFormation, cfg); - int sum = base + speedAdj + distAdj + roleAdj; - return clampInt(sum, minH, maxH); -} - -/** - * 空中武器部署高度:1) 入参已给高度优先 2) 开启自动则混合计算 3) 否则固定 airDeployHeight - * 地面武器:始终使用 defaultHeight(isAirGroup=false) - */ -function int resolveWeaponDeployHeight(Weapon w, Task blueTask, Map cfg, String deployMode, int indexInFormation, int defaultHeight, boolean isAirGroup) { - if (!isAirGroup) { - return defaultHeight; - } - int given = readWeaponHeightIfValid(w); - if (given > 0) { - return given; - } - if (cfg == null || !readBooleanCfg(cfg, "enableAutoAirDeployHeight", true)) { - return defaultHeight; - } - return computeAutoAirHeight(w, blueTask, cfg, indexInFormation); -} - -function Integer computeHeadingFromBlueTrack(Task blueTask) { - if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().size() < 2) { - return null; - } - List points = blueTask.getTrackPoints(); - TrackPoints p2 = (TrackPoints) points.get(points.size() - 1); - TrackPoints p1 = (TrackPoints) points.get(points.size() - 2); - if (p1 == null || p2 == null || p1.getLongitude() == null || p1.getLatitude() == null || p2.getLongitude() == null || p2.getLatitude() == null) { - return null; - } - double dLon = p2.getLongitude().doubleValue() - p1.getLongitude().doubleValue(); - double dLat = p2.getLatitude().doubleValue() - p1.getLatitude().doubleValue(); - if (Math.abs(dLon) < 1e-12 && Math.abs(dLat) < 1e-12) { - return null; - } - double deg = Math.toDegrees(Math.atan2(dLon, dLat)); - int heading = (int) Math.round(deg); - if (heading < 0) { - heading += 360; - } - if (heading >= 360) { - heading = heading % 360; - } - return Integer.valueOf(heading); -} - -function List sortWeaponsByFormationRole(List weapons) { - List mainList = new ArrayList(); - List wingList = new ArrayList(); - List unknownList = new ArrayList(); - for (Object obj : weapons) { - Weapon w = (Weapon) obj; - if (w == null) { - continue; - } - String role = w.getFormationRole(); - if (role != null && "MAIN".equalsIgnoreCase(role)) { - mainList.add(w); - } else if (role != null && "WING".equalsIgnoreCase(role)) { - wingList.add(w); - } else { - unknownList.add(w); - } - } - List result = new ArrayList(); - if (!mainList.isEmpty()) { - result.addAll(mainList); - result.addAll(wingList); - result.addAll(unknownList); - return result; - } - if (!unknownList.isEmpty()) { - result.add(unknownList.get(0)); - for (int i = 1; i < unknownList.size(); i++) { - result.add(unknownList.get(i)); - } - result.addAll(wingList); - return result; - } - result.addAll(wingList); - return result; -} - -function List buildFormationOffsets(String formationType, int size, int spacing) { - List result = new ArrayList(); - if (size <= 0) { - return result; - } - String type = formationType == null ? "TRIANGLE" : formationType.trim().toUpperCase(); - result.add(buildOffset(0.0d, 0.0d)); - for (int i = 1; i < size; i++) { - if ("DIAMOND".equals(type)) { - if (i == 1) { - result.add(buildOffset(-spacing, -spacing)); - } else if (i == 2) { - result.add(buildOffset(spacing, -spacing)); - } else if (i == 3) { - result.add(buildOffset(0.0d, -2.0d * spacing)); - } else { - int row = (i - 4) / 2 + 1; - int sign = (i % 2 == 0) ? 1 : -1; - result.add(buildOffset(sign * spacing * (row + 1), -spacing * (row + 2))); - } - } else if ("LINE".equals(type)) { - int sign = (i % 2 == 0) ? 1 : -1; - int k = (i + 1) / 2; - result.add(buildOffset(sign * k * spacing, 0.0d)); - } else if ("COLUMN".equals(type)) { - result.add(buildOffset(0.0d, -i * spacing)); - } else if ("WEDGE".equals(type)) { - int layer = (i + 1) / 2; - int sign = (i % 2 == 0) ? 1 : -1; - result.add(buildOffset(sign * layer * spacing, -layer * spacing)); - } else { // TRIANGLE/default - int layer = (i + 1) / 2; - int sign = (i % 2 == 0) ? 1 : -1; - result.add(buildOffset(sign * layer * spacing, -layer * spacing)); - } - } - return result; -} - -function Map buildOffset(double dx, double dy) { - Map m = new java.util.HashMap(); - m.put("dx", Double.valueOf(dx)); - m.put("dy", Double.valueOf(dy)); - return m; -} - -function Coordinate moveCoordinateByMeters(Coordinate anchor, double dxMeters, double dyMeters, int headingDeg, int height) { - if (anchor == null || anchor.getLongitude() == null || anchor.getLatitude() == null) { - return null; - } - double rad = Math.toRadians((double) headingDeg); - double rx = (dxMeters * Math.cos(rad)) - (dyMeters * Math.sin(rad)); - double ry = (dxMeters * Math.sin(rad)) + (dyMeters * Math.cos(rad)); - double lat = anchor.getLatitude().doubleValue() + metersToLatDeg(ry); - double lon = anchor.getLongitude().doubleValue() + metersToLonDeg(rx, anchor.getLatitude().doubleValue()); - Coordinate c = new Coordinate(); - c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); - c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); - c.setHeight(height); - return c; -} - -function void applyTrajectoryGeneration(FactTask fact, Map cfg) { - if (!readBooleanCfg(cfg, "enableTrajectoryRules", true)) { - return; - } - if (fact == null || fact.getBlueTask() == null || fact.getRedTask() == null) { - return; - } - Task blueTask = fact.getBlueTask(); - Task redTask = fact.getRedTask(); - List blueTrack = blueTask.getTrackPoints(); - if (blueTrack == null || blueTrack.isEmpty()) { - return; - } - List defZone = blueTask.getDefZoneLocation(); - if (defZone == null || defZone.size() < 3) { - return; - } - String strategy = chooseTrajectoryStrategy(blueTask, cfg); - Coordinate endPoint = findNearestDefPointToBlueTail(blueTask); - List redTrack = generateRedTrackPoints(blueTrack, strategy, cfg, endPoint); - if (redTrack != null && !redTrack.isEmpty()) { - redTask.setTrackPoints(redTrack); - } -} - -function String chooseTrajectoryStrategy(Task blueTask, Map cfg) { - String mode = String.valueOf(cfg.get("strategyMode")); - if (mode == null || mode.trim().equals("")) { - mode = "auto"; - } - mode = mode.trim().toLowerCase(); - if (!mode.equals("auto")) { - return fallbackToEnabledStrategy(mode, cfg); - } - double defMinDistance = computeDefMinDistanceMeters(blueTask); - int avgSpeed = computeAverageSpeed(blueTask.getTrackPoints()); - int near = readIntCfg(cfg, "nearDefDistanceMeters", 800); - int far = readIntCfg(cfg, "farDefDistanceMeters", 2500); - int fast = readIntCfg(cfg, "fastSpeedThreshold", 180); - String selected = "flank"; - if (avgSpeed >= fast && defMinDistance <= near) { - selected = "shortest"; - } else if (avgSpeed >= fast && defMinDistance >= far) { - selected = "interfere"; - } - return fallbackToEnabledStrategy(selected, cfg); -} - -function String fallbackToEnabledStrategy(String preferred, Map cfg) { - if (isStrategyEnabled(preferred, cfg)) { - return preferred; - } - if (isStrategyEnabled("shortest", cfg)) { - return "shortest"; - } - if (isStrategyEnabled("flank", cfg)) { - return "flank"; - } - if (isStrategyEnabled("interfere", cfg)) { - return "interfere"; - } - return "shortest"; -} - -function boolean isStrategyEnabled(String strategy, Map cfg) { - if (strategy == null) { - return false; - } - if (strategy.equals("shortest")) { - return readBooleanCfg(cfg, "enableShortest", true); - } - if (strategy.equals("flank")) { - return readBooleanCfg(cfg, "enableFlank", true); - } - if (strategy.equals("interfere")) { - return readBooleanCfg(cfg, "enableInterfere", true); - } - return false; -} - -function Coordinate findNearestDefPointToBlueTail(Task blueTask) { - if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().isEmpty() || blueTask.getDefZoneLocation() == null || blueTask.getDefZoneLocation().isEmpty()) { - return null; - } - TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); - if (tail == null || tail.getLongitude() == null || tail.getLatitude() == null) { - return null; - } - Coordinate nearest = null; - double best = Double.MAX_VALUE; - for (Object obj : blueTask.getDefZoneLocation()) { - Coordinate c = (Coordinate) obj; - if (c == null || c.getLongitude() == null || c.getLatitude() == null) { - continue; - } - double d = approxDistanceMeters(tail.getLongitude().doubleValue(), tail.getLatitude().doubleValue(), c.getLongitude().doubleValue(), c.getLatitude().doubleValue()); - if (d < best) { - best = d; - nearest = c; - } - } - return nearest; -} - -function double computeDefMinDistanceMeters(Task blueTask) { - Coordinate nearest = findNearestDefPointToBlueTail(blueTask); - if (nearest == null || blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().isEmpty()) { - return Double.MAX_VALUE; - } - TrackPoints tail = (TrackPoints) blueTask.getTrackPoints().get(blueTask.getTrackPoints().size() - 1); - return approxDistanceMeters( - tail.getLongitude().doubleValue(), - tail.getLatitude().doubleValue(), - nearest.getLongitude().doubleValue(), - nearest.getLatitude().doubleValue() - ); -} - -function int computeAverageSpeed(List trackPoints) { - if (trackPoints == null || trackPoints.isEmpty()) { - return 0; - } - int total = 0; - int count = 0; - for (Object obj : trackPoints) { - TrackPoints p = (TrackPoints) obj; - if (p == null || p.getSpeed() == null) { - continue; - } - total += p.getSpeed(); - count++; - } - if (count <= 0) { - return 0; - } - return total / count; -} - -function List generateRedTrackPoints(List blueTrackPoints, String strategy, Map cfg, Coordinate endPoint) { - List result = new ArrayList(); - if (blueTrackPoints == null || blueTrackPoints.isEmpty()) { - return result; - } - TrackPoints start = (TrackPoints) blueTrackPoints.get(0); - TrackPoints tail = (TrackPoints) blueTrackPoints.get(blueTrackPoints.size() - 1); - if (start == null || start.getLongitude() == null || start.getLatitude() == null) { - return result; - } - double sLon = start.getLongitude().doubleValue(); - double sLat = start.getLatitude().doubleValue(); - double eLon = (endPoint != null && endPoint.getLongitude() != null) ? endPoint.getLongitude().doubleValue() : (tail == null || tail.getLongitude() == null ? sLon : tail.getLongitude().doubleValue()); - double eLat = (endPoint != null && endPoint.getLatitude() != null) ? endPoint.getLatitude().doubleValue() : (tail == null || tail.getLatitude() == null ? sLat : tail.getLatitude().doubleValue()); - double dx = eLon - sLon; - double dy = eLat - sLat; - int n = blueTrackPoints.size(); - int flankOffset = readIntCfg(cfg, "flankOffsetMeters", 150); - int intBase = readIntCfg(cfg, "interfereOffsetMeters", 120); - int intAmp = readIntCfg(cfg, "interfereZigzagAmplitude", 90); - boolean keepBlueHeight = readBooleanCfg(cfg, "keepBlueHeight", true); - int redH = readIntCfg(cfg, "redTrackHeightOverride", 200); - - for (int i = 0; i < n; i++) { - double t = (n <= 1) ? 1.0d : ((double) i / (double) (n - 1)); - double baseLon = sLon + dx * t; - double baseLat = sLat + dy * t; - double offMeters = 0.0d; - if ("flank".equals(strategy)) { - offMeters = flankOffset * Math.sin(Math.PI * t); - } else if ("interfere".equals(strategy)) { - double zig = (i % 2 == 0 ? 1.0d : -1.0d) * intAmp; - offMeters = intBase * Math.sin(2.0d * Math.PI * t) + zig; - } - double latDeg = metersToLatDeg(offMeters); - double lonDeg = metersToLonDeg(offMeters, baseLat); - double norm = Math.sqrt(dx * dx + dy * dy); - if (norm < 1e-10) { - norm = 1e-10; - } - double nx = -dy / norm; - double ny = dx / norm; - double finalLon = baseLon + nx * lonDeg; - double finalLat = baseLat + ny * latDeg; - - TrackPoints blueP = (TrackPoints) blueTrackPoints.get(i); - TrackPoints redP = new TrackPoints(); - redP.setIndex(i); - redP.setLongitude(new java.math.BigDecimal(String.valueOf(finalLon))); - redP.setLatitude(new java.math.BigDecimal(String.valueOf(finalLat))); - redP.setSpeed(blueP == null || blueP.getSpeed() == null ? 0 : blueP.getSpeed()); - if (keepBlueHeight) { - redP.setHeight(blueP == null || blueP.getHeight() == null ? redH : blueP.getHeight()); - } else { - redP.setHeight(redH); - } - result.add(redP); - } - return result; -} - -function double metersToLatDeg(double meters) { - return meters / 111000.0d; -} - -function double metersToLonDeg(double meters, double latitudeDeg) { - double cos = Math.cos(Math.toRadians(latitudeDeg)); - if (Math.abs(cos) < 1e-6) { - cos = 1e-6; - } - return meters / (111000.0d * cos); -} - -function double approxDistanceMeters(double lon1, double lat1, double lon2, double lat2) { - double dx = (lon2 - lon1) * 111000.0d * Math.cos(Math.toRadians((lat1 + lat2) / 2.0d)); - double dy = (lat2 - lat1) * 111000.0d; - return Math.sqrt(dx * dx + dy * dy); -} - -function List extractZonePolygonFromTask(FactTask fact, boolean isCombat) { - // 输入约定:Task.warZoneLocation / defZoneLocation 传入 4 个经纬点(高度可空) - List result = new ArrayList(); - Task blueTask = fact == null ? null : fact.getBlueTask(); - if (blueTask == null) { - return result; - } - List source = isCombat ? blueTask.getWarZoneLocation() : blueTask.getDefZoneLocation(); - if (source == null || source.isEmpty()) { - return result; - } - for (Object oneObj : source) { - Coordinate one = (Coordinate) oneObj; - if (one == null || one.getLongitude() == null || one.getLatitude() == null) { - continue; - } - Coordinate c = new Coordinate(); - c.setLongitude(one.getLongitude()); - c.setLatitude(one.getLatitude()); - c.setHeight(one.getHeight()); - result.add(c); - } - return result; -} - -function List normalizeToCoordinateList(Object raw) { - List result = new ArrayList(); - if (raw == null) { - return result; - } - if (!(raw instanceof List)) { - return result; - } - List values = (List) raw; - for (Object obj : values) { - Coordinate c = toCoordinate(obj); - if (c != null) { - result.add(c); - } - } - return result; -} - -function Coordinate toCoordinate(Object obj) { - if (obj == null) { - return null; - } - if (obj instanceof Coordinate) { - return (Coordinate) obj; - } - if (obj instanceof Map) { - Map m = (Map) obj; - Object lon = m.get("longitude"); - Object lat = m.get("latitude"); - Object h = m.get("height"); - if (lon == null || lat == null) { - return null; - } - Coordinate c = new Coordinate(); - try { - c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); - c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); - c.setHeight(h == null ? 0 : parseIntSafe(String.valueOf(h), 0)); - return c; - } catch (Exception ex) { - return null; - } - } - return null; -} - -function List buildGridPointsInPolygon(List polygon, int spacingMeters, int defaultHeight) { - List points = new ArrayList(); - if (polygon == null || polygon.size() < 3) { - return points; - } - double step = ((double) spacingMeters) / 111000.0d; - if (step <= 0) { - step = 0.0009d; - } - double minLon = 180.0d; - double maxLon = -180.0d; - double minLat = 90.0d; - double maxLat = -90.0d; - for (Object cObj : polygon) { - Coordinate c = (Coordinate) cObj; - if (c == null || c.getLongitude() == null || c.getLatitude() == null) { - continue; - } - double lon = c.getLongitude().doubleValue(); - double lat = c.getLatitude().doubleValue(); - if (lon < minLon) minLon = lon; - if (lon > maxLon) maxLon = lon; - if (lat < minLat) minLat = lat; - if (lat > maxLat) maxLat = lat; - } - for (double lon = minLon; lon <= maxLon; lon += step) { - for (double lat = minLat; lat <= maxLat; lat += step) { - if (isPointInsidePolygon(lon, lat, polygon)) { - Coordinate c = new Coordinate(); - c.setLongitude(new java.math.BigDecimal(String.valueOf(lon))); - c.setLatitude(new java.math.BigDecimal(String.valueOf(lat))); - c.setHeight(defaultHeight); - points.add(c); - } - } - } - return points; -} - -function boolean isPointInsidePolygon(double x, double y, List polygon) { - if (polygon == null || polygon.size() < 3) { - return false; - } - boolean inside = false; - int n = polygon.size(); - int j = n - 1; - for (int i = 0; i < n; i++) { - Coordinate pi = (Coordinate) polygon.get(i); - Coordinate pj = (Coordinate) polygon.get(j); - if (pi == null || pj == null || pi.getLongitude() == null || pi.getLatitude() == null || pj.getLongitude() == null || pj.getLatitude() == null) { - j = i; - continue; - } - double xi = pi.getLongitude().doubleValue(); - double yi = pi.getLatitude().doubleValue(); - double xj = pj.getLongitude().doubleValue(); - double yj = pj.getLatitude().doubleValue(); - boolean intersect = ((yi > y) != (yj > y)) - && (x < (xj - xi) * (y - yi) / ((yj - yi) == 0 ? 1e-12 : (yj - yi)) + xi); - if (intersect) { - inside = !inside; - } - j = i; - } - return inside; -} - -function Coordinate pickCoordinateByPreference(List first, List second, Map cursor, String key) { - Coordinate c1 = pickCoordinateRoundRobin(first, cursor, "first_" + key); - if (c1 != null) { - return c1; - } - return pickCoordinateRoundRobin(second, cursor, "second_" + key); -} - -function Coordinate pickCoordinateRoundRobin(List values, Map cursor, String key) { - if (values == null || values.isEmpty()) { - return null; - } - Integer idxObj = (Integer) cursor.get(key); - int idx = idxObj == null ? 0 : idxObj.intValue(); - Coordinate value = (Coordinate) values.get(idx % values.size()); - cursor.put(key, idx + 1); - return value; -} - -function Coordinate cloneCoordinateWithHeight(Coordinate source, int height) { - if (source == null) { - return null; - } - Coordinate c = new Coordinate(); - c.setLongitude(source.getLongitude()); - c.setLatitude(source.getLatitude()); - c.setHeight(height); - return c; -} - -function Map extractBlueTargetPools(List blueWeapons) { - Map pools = new java.util.HashMap(); - pools.put("air", new ArrayList()); - pools.put("armor", new ArrayList()); - pools.put("artillery", new ArrayList()); - pools.put("ground", new ArrayList()); - pools.put("missile", new ArrayList()); - pools.put("all", new ArrayList()); - - for (Object obj : blueWeapons) { - Weapon blueWeapon = (Weapon) obj; - if (blueWeapon == null) { - continue; - } - String id = blueWeapon.getEquipmentId(); - if (isBlank(id)) { - continue; - } - addUnique((List) pools.get("all"), id); - if (isAirWeapon(blueWeapon)) { - addUnique((List) pools.get("air"), id); - } - if (isArmorWeapon(blueWeapon)) { - addUnique((List) pools.get("armor"), id); - } - if (isArtilleryWeapon(blueWeapon)) { - addUnique((List) pools.get("artillery"), id); - } - if (isGroundWeapon(blueWeapon)) { - addUnique((List) pools.get("ground"), id); - } - if (hasMissileComponent(blueWeapon)) { - addUnique((List) pools.get("missile"), id); - } - } - return pools; -} - -function String inferBluePoolKeyForRedWeapon(Weapon redWeapon) { - if (redWeapon == null || redWeapon.getName() == null) { - return "ground"; - } - String name = redWeapon.getName(); - if (name.contains("反坦克")) { - return "armor"; - } - if (name.contains("防空导弹") || name.contains("无人机") || name.contains("直升机")) { - return "air"; - } - if (name.contains("迫榴炮") || name.contains("迫击炮")) { - return "artillery"; - } - if (name.contains("导弹发射车")) { - return "missile"; - } - return "ground"; -} - -function String pickTargetIdFromPools(Map pools, Map cursor, String preferredKey) { - String fromPreferred = pickFromSinglePool(pools, cursor, preferredKey); - if (!isBlank(fromPreferred)) { - return fromPreferred; - } - if (!"ground".equals(preferredKey)) { - String fromGround = pickFromSinglePool(pools, cursor, "ground"); - if (!isBlank(fromGround)) { - return fromGround; - } - } - return pickFromSinglePool(pools, cursor, "all"); -} - -function String pickFromSinglePool(Map pools, Map cursor, String poolKey) { - if (pools == null || cursor == null || poolKey == null) { - return null; - } - List ids = (List) pools.get(poolKey); - if (ids == null || ids.isEmpty()) { - return null; - } - Integer idxObj = (Integer) cursor.get(poolKey); - int idx = idxObj == null ? 0 : idxObj.intValue(); - String id = (String) ids.get(idx % ids.size()); - cursor.put(poolKey, idx + 1); - return id; -} - -function void addUnique(List values, String value) { - if (values == null || isBlank(value)) { - return; - } - if (!containsString(values, value)) { - values.add(value); - } -} - -function boolean isBlank(String text) { - return text == null || text.trim().equals(""); -} - -function void assignTaskNameByRedWeapons(FactTask fact, Map cfg) { - if (fact == null || fact.getRedTask() == null) { - return; - } - Task redTask = fact.getRedTask(); - List redWeapons = redTask.getTaskWeapons(); - String category = classifyTaskByRedWeapons(redWeapons); - - // 一致性校验:分类与武器不一致则回落通用打击 - if (!isTaskCategoryConsistent(category, redWeapons)) { - category = "general"; - } - - redTask.setDrawName(resolveTaskNameByCategory(cfg, category)); - redTask.setDataType(resolveTaskDataTypeByCategory(cfg, category)); -} - -function String classifyTaskByRedWeapons(List redWeapons) { - if (redWeapons == null || redWeapons.isEmpty()) { - return "general"; - } - // 符合实际的优先级:导弹突击 > 防空压制 > 反装甲 > 炮火压制 > 通用 - if (hasRedWeaponName(redWeapons, "导弹发射车")) { - return "missile_strike"; - } - if (hasAnyRedWeaponName(redWeapons, "防空导弹武器,火力打击无人机,武装直升机")) { - return "air_defence"; - } - if (hasAnyRedWeaponName(redWeapons, "反坦克火箭,反坦克导弹系统")) { - return "anti_armor"; - } - if (hasAnyRedWeaponName(redWeapons, "迫榴炮,车载迫击炮")) { - return "artillery"; - } - return "general"; -} - -function boolean isTaskCategoryConsistent(String category, List redWeapons) { - if (category == null) { - return false; - } - if (category.equals("missile_strike")) { - return hasRedWeaponName(redWeapons, "导弹发射车"); - } - if (category.equals("air_defence")) { - return hasAnyRedWeaponName(redWeapons, "防空导弹武器,火力打击无人机,武装直升机"); - } - if (category.equals("anti_armor")) { - return hasAnyRedWeaponName(redWeapons, "反坦克火箭,反坦克导弹系统"); - } - if (category.equals("artillery")) { - return hasAnyRedWeaponName(redWeapons, "迫榴炮,车载迫击炮"); - } - return true; -} - -function String resolveTaskNameByCategory(Map cfg, String category) { - if (cfg == null || category == null) { - return "通用打击任务"; - } - if (category.equals("missile_strike")) { - return String.valueOf(cfg.get("taskName_missile_strike")); - } - if (category.equals("air_defence")) { - return String.valueOf(cfg.get("taskName_air_defence")); - } - if (category.equals("anti_armor")) { - return String.valueOf(cfg.get("taskName_anti_armor")); - } - if (category.equals("artillery")) { - return String.valueOf(cfg.get("taskName_artillery")); - } - return String.valueOf(cfg.get("taskName_general")); -} - -function String resolveTaskDataTypeByCategory(Map cfg, String category) { - if (cfg == null || category == null) { - return "strike"; - } - if (category.equals("missile_strike")) { - return String.valueOf(cfg.get("taskDataType_missile_strike")); - } - if (category.equals("air_defence")) { - return String.valueOf(cfg.get("taskDataType_air_defence")); - } - if (category.equals("anti_armor")) { - return String.valueOf(cfg.get("taskDataType_anti_armor")); - } - if (category.equals("artillery")) { - return String.valueOf(cfg.get("taskDataType_artillery")); - } - return String.valueOf(cfg.get("taskDataType_general")); -} - -function boolean hasAnyRedWeaponName(List redWeapons, String commaNames) { - if (redWeapons == null || redWeapons.isEmpty() || commaNames == null || commaNames.equals("")) { - return false; - } - String[] names = commaNames.split(","); - for (int i = 0; i < names.length; i++) { - String one = names[i]; - if (one == null) { - continue; - } - if (hasRedWeaponName(redWeapons, one.trim())) { - return true; - } - } - return false; -} - -function boolean hasRedWeaponName(List redWeapons, String weaponName) { - if (redWeapons == null || redWeapons.isEmpty() || weaponName == null || weaponName.equals("")) { - return false; - } - for (Object obj : redWeapons) { - Weapon w = (Weapon) obj; - if (w != null && w.getName() != null && w.getName().equals(weaponName)) { - return true; - } - } - return false; -} - -// 蓝方组件模板:仅在组件缺失时补齐,作为规则联动测试用 -function void buildBlueTestComponents(List weapons) { - if (weapons == null || weapons.isEmpty()) { - return; - } - for (Object obj : weapons) { - Weapon weapon = (Weapon) obj; - if (weapon == null) { - continue; - } - List components = weapon.getComponents(); - if (components == null) { - components = new ArrayList<>(); - weapon.setComponents(components); - } - if (!components.isEmpty()) { - continue; - } - - // 蓝方主要用于触发规则,模板尽量简洁 - if (isAirWeapon(weapon)) { - components.add(buildComponent("火控雷达", "220", "探测范围米", 1)); - components.add(buildComponent("空空导弹", "220", "破坏范围米", 1)); - } else if (isArtilleryWeapon(weapon)) { - components.add(buildComponent("炮弹", "1200", "范围米", 6)); - } else if (isGroundWeapon(weapon)) { - components.add(buildComponent("机枪", "600", "射程米", 1)); - } - } -} - -// 红方基础组件模板:便于业务人员看懂武器都带了哪些能力 -function void ensureBasicRedComponents(Weapon weapon) { - if (weapon == null) { - return; - } - String name = weapon.getName(); - if (name == null) { - name = ""; - } - if (name.contains("防空导弹")) { - ensureComponent(weapon, "搜索雷达", "260", "探测范围米", 1); - ensureComponent(weapon, "防空导弹", "300", "破坏范围米", 1); - } else if (name.contains("无人机")) { - ensureComponent(weapon, "光电吊舱", "180", "识别范围米", 1); - ensureComponent(weapon, "空地导弹", "260", "破坏范围米", 1); - } else if (name.contains("武装直升机")) { - ensureComponent(weapon, "火控雷达", "220", "探测范围米", 1); - ensureComponent(weapon, "机载导弹", "280", "破坏范围米", 2); - } else if (name.contains("反坦克火箭")) { - ensureComponent(weapon, "火箭弹", "200", "破坏范围米", 4); - } else if (name.contains("反坦克导弹系统")) { - ensureComponent(weapon, "反坦克导弹", "320", "破坏范围米", 2); - ensureComponent(weapon, "激光测距", "180", "测距米", 1); - } else if (name.contains("迫榴炮") || name.contains("迫击炮")) { - ensureComponent(weapon, "炮弹", "1500", "范围米", 8); - } else if (name.contains("导弹发射车")) { - ensureComponent(weapon, "导弹发射架", "260", "破坏范围米", 1); - ensureComponent(weapon, "制导雷达", "240", "探测范围米", 1); - } else { - // 兜底组件,避免出现完全无组件的武器 - ensureComponent(weapon, "火控系统", "100", "作用范围米", 1); - } -} - -// 炮类限制:武器组件只能保留“炮弹”,并固定参数单位“范围米” -function void limitRedArtilleryToShellOnly(List redWeapons, String shellRangeDefault) { - if (redWeapons == null || redWeapons.isEmpty()) { - return; - } - for (Object obj : redWeapons) { - Weapon redWeapon = (Weapon) obj; - if (redWeapon == null || !isArtilleryWeapon(redWeapon)) { - continue; - } - List onlyShell = new ArrayList<>(); - onlyShell.add(buildComponent("炮弹", shellRangeDefault, "范围米", 8)); - redWeapon.setComponents(onlyShell); - } -} - -function Weapon ensureRedWeapon(List redWeapons, String name, String supportType, int number) { - for (Object obj : redWeapons) { - Weapon w = (Weapon) obj; - if (w != null && w.getName() != null && w.getName().equals(name)) { - if (w.getSupportType() == null || w.getSupportType().equals("")) { - w.setSupportType(supportType); - } - if (w.getNumber() == null || w.getNumber() <= 0) { - w.setNumber(number); - } - if (w.getComponents() == null) { - w.setComponents(new ArrayList<>()); - } - return w; - } - } - Weapon w = new Weapon(); - w.setName(name); - w.setSupportType(supportType); - w.setNumber(number); - w.setComponents(new ArrayList<>()); - redWeapons.add(w); - return w; -} - -function void ensureMissileComponentForRedAirWeapon(Weapon redWeapon, int missileNumber, int missileRange) { - List components = redWeapon.getComponents(); - if (components == null) { - components = new ArrayList<>(); - redWeapon.setComponents(components); - } - for (SubComponents c : components) { - if (c != null && c.getDeviceName() != null && c.getDeviceName().contains("导弹")) { - ensureOrUpdateParam(c, String.valueOf(missileRange), "破坏范围米", missileNumber); - return; - } - } - components.add(buildComponent("联动导弹", String.valueOf(missileRange), "破坏范围米", missileNumber)); -} - -function void ensureComponent(Weapon weapon, String deviceName, String value, String unit, int number) { - List components = weapon.getComponents(); - if (components == null) { - components = new ArrayList<>(); - weapon.setComponents(components); - } - for (SubComponents c : components) { - if (c != null && c.getDeviceName() != null && c.getDeviceName().equals(deviceName)) { - ensureOrUpdateParam(c, value, unit, number); - return; - } - } - components.add(buildComponent(deviceName, value, unit, number)); -} - -function SubComponents buildComponent(String deviceName, String value, String unit, int number) { - SubComponents component = new SubComponents(); - component.setDeviceName(deviceName); - List params = new ArrayList<>(); - ComponentParam param = new ComponentParam(); - param.setAttDefaultValue(value); - param.setAttExplain(unit); - param.setNumber(number); - params.add(param); - component.setComponentParams(params); - return component; -} - -function void ensureOrUpdateParam(SubComponents component, String value, String unit, int number) { - List params = component.getComponentParams(); - if (params == null) { - params = new ArrayList<>(); - component.setComponentParams(params); - } - if (params.isEmpty()) { - ComponentParam param = new ComponentParam(); - param.setAttDefaultValue(value); - param.setAttExplain(unit); - param.setNumber(number); - params.add(param); - return; - } - ComponentParam first = params.get(0); - first.setAttDefaultValue(value); - first.setAttExplain(unit); - first.setNumber(number); -} - -function int countBlueMissileNumber(List weapons) { - int total = 0; - for (Object obj : weapons) { - Weapon w = (Weapon) obj; - if (w == null || w.getComponents() == null) { - continue; - } - for (SubComponents c : w.getComponents()) { - if (c == null || c.getDeviceName() == null || !c.getDeviceName().contains("导弹")) { - continue; - } - int n = 1; - if (c.getComponentParams() != null && !c.getComponentParams().isEmpty() && c.getComponentParams().get(0) != null && c.getComponentParams().get(0).getNumber() != null) { - n = c.getComponentParams().get(0).getNumber(); - } - total = total + n; - } - } - return total; -} - -function int readBlueMissileRange(List weapons, int fallback) { - int best = 0; - for (Object obj : weapons) { - Weapon w = (Weapon) obj; - if (w == null || w.getComponents() == null) { - continue; - } - for (SubComponents c : w.getComponents()) { - if (c == null || c.getDeviceName() == null || !c.getDeviceName().contains("导弹")) { - continue; - } - if (c.getComponentParams() == null || c.getComponentParams().isEmpty() || c.getComponentParams().get(0) == null) { - continue; - } - String value = c.getComponentParams().get(0).getAttDefaultValue(); - int parsed = parseIntSafe(value, fallback); - if (parsed > best) { - best = parsed; - } - } - } - if (best <= 0) { - return fallback; - } - return best; -} - -function int parseIntSafe(String text, int fallback) { - if (text == null || text.equals("")) { - return fallback; - } - try { - return Integer.parseInt(text.trim()); - } catch (Exception ex) { - return fallback; - } -} - -function double parseDoubleSafe(String text, double fallback) { - if (text == null || text.equals("")) { - return fallback; - } - try { - return Double.parseDouble(text.trim()); - } catch (Exception ex) { - return fallback; - } -} - -function int readIntCfg(Map cfg, String key, int fallback) { - if (cfg == null || key == null) { - return fallback; - } - Object value = cfg.get(key); - if (value == null) { - return fallback; - } - if (value instanceof Integer) { - return ((Integer) value).intValue(); - } - return parseIntSafe(String.valueOf(value), fallback); -} - -function boolean readBooleanCfg(Map cfg, String key, boolean fallback) { - if (cfg == null || key == null) { - return fallback; - } - Object value = cfg.get(key); - if (value == null) { - return fallback; - } - if (value instanceof Boolean) { - return ((Boolean) value).booleanValue(); - } - String text = String.valueOf(value); - if (text == null) { - return fallback; - } - return "true".equalsIgnoreCase(text.trim()); -} - -function double readDoubleCfg(Map cfg, String key, double fallback) { - if (cfg == null || key == null) { - return fallback; - } - Object value = cfg.get(key); - if (value == null) { - return fallback; - } - try { - return Double.parseDouble(String.valueOf(value).trim()); - } catch (Exception ex) { - return fallback; - } -} - -function boolean isRedAirWeapon(Weapon weapon) { - if (weapon == null) { - return false; - } - String supportType = weapon.getSupportType(); - String name = weapon.getName(); - return (supportType != null && (supportType.equals("overhead") || supportType.equals("plane"))) - || (name != null && (name.contains("无人机") || name.contains("直升机"))); -} - -function boolean isAirWeapon(Weapon weapon) { - if (weapon == null) { - return false; - } - String supportType = weapon.getSupportType(); - String name = weapon.getName(); - return (supportType != null && (supportType.equals("overhead") || supportType.equals("plane"))) - || (name != null && ( - name.contains("直升机") - || name.contains("地空导弹") - || name.contains("单兵防空导弹") - || name.contains("制导导弹") - || name.contains("无人机") - )); -} - -function boolean isGroundWeapon(Weapon weapon) { - if (weapon == null) { - return false; - } - String supportType = weapon.getSupportType(); - String name = weapon.getName(); - return (supportType != null && supportType.equals("ground")) - || (name != null && ( - name.contains("坦克") - || name.contains("装甲车") - || name.contains("迫击炮") - || name.contains("迫榴炮") - || name.contains("车载迫击炮") - || name.contains("导弹发射车") - || name.contains("反坦克") - )); -} - -function boolean isArtilleryWeapon(Weapon weapon) { - if (weapon == null || weapon.getName() == null) { - return false; - } - String name = weapon.getName(); - return name.contains("迫榴炮") - || name.contains("迫击炮") - || name.contains("车载迫击炮") - || name.contains("120mm"); -} - -function boolean isArmorWeapon(Weapon weapon) { - if (weapon == null || weapon.getName() == null) { - return false; - } - String name = weapon.getName(); - return name.contains("主战坦克") - || name.contains("坦克") - || name.contains("装甲车"); -} - -function boolean hasMissileComponent(Weapon weapon) { - if (weapon == null || weapon.getComponents() == null) { - return false; - } - for (SubComponents c : weapon.getComponents()) { - if (c != null && c.getDeviceName() != null && c.getDeviceName().contains("导弹")) { - return true; - } - } - return false; -} - -// ========== legacy 函数区(保留仅供回滚,不参与当前业务规则) ========== -function void matchLauncherComponents( - FactTask blueFact, - FactTask redFact, - String launcherName, - String redPlaneSupportType, - String redMissileVehicleKeyword, - String redMissileVehicleEnKeyword, - int redMoreThanBlueOffset, - int triggerBlueLauncherCount -) { - Task blueTask = blueFact.getBlueTask(); - Task redTask = redFact.getRedTask(); - if (blueTask == null || redTask == null) { - return; - } - - List blueWeapons = blueTask.getTaskWeapons(); - List redWeapons = redTask.getTaskWeapons(); - if (blueWeapons == null || redWeapons == null || redWeapons.isEmpty()) { - return; - } - - int blueLauncherCount = countLauncherComponents(blueWeapons, launcherName); - if (blueLauncherCount <= 0) { - return; - } - - // 规则1:红方若存在 plane 或导弹发射车,则这些武器都需要具备发射架 - List candidateRedWeapons = new ArrayList<>(); - for (Weapon redWeapon : redWeapons) { - if (isRedWeaponNeedLauncher(redWeapon, redPlaneSupportType, redMissileVehicleKeyword, redMissileVehicleEnKeyword)) { - candidateRedWeapons.add(redWeapon); - ensureWeaponHasLauncher(redWeapon, launcherName); - } - } - if (candidateRedWeapons.isEmpty()) { - return; - } - - // 规则2:当蓝方发射架数量达到触发值时,红方发射架数量 = 蓝方 + 可配置偏移量 - if (blueLauncherCount == triggerBlueLauncherCount) { - int targetRedLauncherCount = blueLauncherCount + redMoreThanBlueOffset; - int currentRedLauncherCount = countLauncherComponents(redWeapons, launcherName); - int needAdd = targetRedLauncherCount - currentRedLauncherCount; - if (needAdd > 0) { - Weapon fallbackWeapon = candidateRedWeapons.get(0); - for (int i = 0; i < needAdd; i++) { - addLauncherToWeapon(fallbackWeapon, launcherName); - } - } - } -} - -function boolean isRedWeaponNeedLauncher( - Weapon weapon, - String redPlaneSupportType, - String redMissileVehicleKeyword, - String redMissileVehicleEnKeyword -) { - if (weapon == null) { - return false; - } - String supportType = weapon.getSupportType(); - String weaponName = weapon.getName(); - return (supportType != null && supportType.equals(redPlaneSupportType)) - || (weaponName != null && (weaponName.contains(redMissileVehicleKeyword) || weaponName.contains(redMissileVehicleEnKeyword))); -} - -function void ensureWeaponHasLauncher(Weapon weapon, String launcherName) { - if (weapon == null) { - return; - } - List components = weapon.getComponents(); - if (components == null) { - components = new ArrayList<>(); - weapon.setComponents(components); - } - for (SubComponents component : components) { - if (component != null && component.getDeviceName() != null && component.getDeviceName().contains(launcherName)) { - return; - } - } - addLauncherToWeapon(weapon, launcherName); -} - -function void addLauncherToWeapon(Weapon weapon, String launcherName) { - List components = weapon.getComponents(); - if (components == null) { - components = new ArrayList<>(); - weapon.setComponents(components); - } - SubComponents launcher = new SubComponents(); - launcher.setDeviceName(launcherName); - components.add(launcher); -} - -function int countLauncherComponents(List weapons, String launcherName) { - if (weapons == null || weapons.isEmpty()) { - return 0; - } - int count = 0; - for (Object weaponObj : weapons) { - Weapon weapon = (Weapon) weaponObj; - if (weapon == null || weapon.getComponents() == null) { - continue; - } - for (SubComponents component : weapon.getComponents()) { - if (component != null && component.getDeviceName() != null && component.getDeviceName().contains(launcherName)) { - count++; - } - } - } - return count; -} - -//威胁等级添加武器函数 -function void threatLevels(FactTask redFact, Map params) { - // 创建武器列表 - List weapons = new ArrayList<>(); - - // 创建导弹发射车 - Weapon weapon1 = new Weapon(); - weapon1.setNumber((Integer) params.get("platNum")); - weapon1.setSupportType("ground"); - weapon1.setEquipmentId("1"); - weapon1.setName("missile-launching-vehicle"); - weapon1.setComponents(new ArrayList<>()); - - // 创建防空导弹武器 - Weapon weapon2 = new Weapon(); - weapon2.setNumber((Integer) params.get("platNum")); - weapon2.setSupportType("antiaircraft"); - weapon2.setEquipmentId("2"); - weapon2.setName("Anti-aircraft-missile-weapon"); - weapon2.setComponents(new ArrayList<>()); - - // 添加到列表 - weapons.add(weapon1); - weapons.add(weapon2); - - // 设置到红方任务 - redFact.getRedTask().setTaskWeapons(weapons); -} diff --git a/auto-solution-rule/src/main/resources/rules/rule.drl b/auto-solution-rule/src/main/resources/rules/rule.drl index 6e911f5..17619c5 100644 --- a/auto-solution-rule/src/main/resources/rules/rule.drl +++ b/auto-solution-rule/src/main/resources/rules/rule.drl @@ -3,35 +3,86 @@ package rules; import com.solution.rule.domain.ultimately.fact.DroolsFact; import java.util.Map; -import com.solution.rule.utils.RuleFunction.equipmentRule; +import static com.solution.rule.utils.RuleFunction.equipmentRule; global java.util.Map globalParams; +/** + * 构建装备匹配所需的全部可调参数(会 merge 进 globalParams,覆盖 Java 侧同名默认值)。 + * + * ========== 总体运算逻辑(与 RuleFunction.equipmentRule 一致)========== + * 1)先拼「蓝方文本串」blueBlob:任务 drawName、dataType、taskWeapons 下各武器的 name/supportType/equipmentId、组件 deviceName。 + * 2)对每个红方装备拼「红方文本串」redBlob:name、platform_type、SupportType。 + * 3)每件红装得分 score = 规则槽得分(scoreRuleSlots) + 兼容层得分(scoreLegacyLayer),均为整数。 + * - 规则槽:对 i=1..ruleSlotCount,若 blueBlob 命中 blueRuleKeywords_i 且 redBlob 命中 redRuleKeywords_i, + * 则加上 ruleScore_i * weight。 + * - 兼容层:多组「蓝关键词 + 红关键词 + 对应分数」,见下方各键说明;每组条件同时满足则加上 对应Score * weight。 + * 4)在池中取 score 最大者;若多人并列,由 tieBreak 决定(见 tieBreak)。 + * 5)若 maxScore < minSelectedScore,视为未匹配:不往 fireRuleInputs 追加行,redWeapons 输出仍为当前池。 + * 6)若匹配成功:从池中 remove 该件;fireRuleInputs 追加一行,drawName 后接 outputDrawNameSuffix;taskWeapons 填选中红装映射。 + * + * 关键词格式:英文逗号分隔,子串包含即算命中(contains),不要求整词匹配。 + */ function Map buildParam(){ Map param = new java.util.HashMap(); - //权重因子 - param.put("weight", 1); - //最低入选分数 - param.put("minSelectedScore",1); - //蓝方坦克类 -> 红方反坦克加分 - param.put("tankScore", 1); - //蓝方空中类 -> 红方反空中加分 - param.put("airScore", 2); - //蓝方地面类 -> 红方远程打击加分 - param.put("groundScore", 1); - //蓝方有导弹 -> 红方防空加分 - param.put("missileScore", 1); - //蓝方是空中任务 -> 红方防空加分 - param.put("airTaskScore", 10); + // ---------- 全局倍率与门槛 ---------- + // weight:对上述所有「基础分数」的统一乘数(规则槽的 ruleScore_i、兼容层的 *Score 都会乘 weight)。 + param.put("weight", 1); + // minSelectedScore:单件红装总分达到该值及以上才会被选中并写入 fireRuleInputs;否则本任务视为未匹配到装备。 + param.put("minSelectedScore", 1); + // tieBreak:并列最高分时的决胜方式。当前实现仅支持 "equipmentId":装备 ID 字典序更小的优先。 + param.put("tieBreak", "equipmentId"); + // outputDrawNameSuffix:匹配成功写入 fireRuleInputs 时,在蓝方原 drawName 后面拼接的后缀(如「打击任务」)。 + param.put("outputDrawNameSuffix", "打击任务"); + + // ---------- 规则槽(可配置条数,便于只改本文件而不改 Java)---------- + // ruleSlotCount:启用几条槽规则;第 i 条使用 blueRuleKeywords_i、redRuleKeywords_i、ruleScore_i。 + param.put("ruleSlotCount", 3); + // 槽1:蓝方文本中出现任一子串 且 红方文本中出现任一子串 → 加 ruleScore_1 * weight。 + param.put("blueRuleKeywords_1", "F-16,F-35"); + param.put("redRuleKeywords_1", "防空,导弹,无人机"); + param.put("ruleScore_1", 5); + param.put("blueRuleKeywords_2", "坦克,装甲"); + param.put("redRuleKeywords_2", "反坦克"); + param.put("ruleScore_2", 4); + param.put("blueRuleKeywords_3", "地面,突击"); + param.put("redRuleKeywords_3", "远火,榴弹,炮"); + param.put("ruleScore_3", 2); + + // ---------- 兼容层:按「场景关键词」配对加分(与 RuleFunction.scoreLegacyLayer 一一对应)---------- + // 以下每组均为:蓝方文本命中第一列关键词 且 红方文本命中第二列关键词 → 加 第三列分数 * weight。 + // + // ① 空中平台类:蓝方像「对空/机型」且红方像对空装备 → + airScore * weight + param.put("bluePlatformKeywords_air", "F-16,J-10,F-35"); + param.put("redPreferredWhenBlueAir", "防空,导弹,无人机,直升机,空空"); + param.put("airScore", 2); + // ② 任务文案像空中任务 且 红方偏好对空 → + airTaskScore * weight(可与①叠加) + param.put("airTaskKeywords", "空中,制空,拦截,空战"); + param.put("airTaskScore", 10); + // ③ 任务文案像地面任务 且 红方偏好地面火力 → + groundScore * weight + param.put("groundTaskKeywords", "地面,突击,登陆"); + param.put("redPreferredWhenGround", "远火,榴弹,炮,火箭"); + param.put("groundScore", 1); + // ④ 蓝方像坦克/装甲目标 且 红方文本命中 redMatchKeywords_tank → + tankScore * weight + param.put("tankKeywords", "坦克,装甲"); + param.put("redMatchKeywords_tank", "反坦克"); + param.put("tankScore", 1); + // ⑤ 蓝方像导弹类 且 红方文本命中 redMatchKeywords_missile → + missileScore * weight + param.put("missileKeywords", "导弹,火箭弹,巡航"); + param.put("redMatchKeywords_missile", "防空,导弹,导弹发射"); + param.put("missileScore", 1); + + return param; } rule "装备匹配" salience 100 when - $fact : DroolsFact(task.side != "") + $fact : DroolsFact(task != null) then - //如何引入Java静态方法? + // 以本文件 buildParam 为真源覆盖同名键,再执行 Java 侧匹配逻辑 + globalParams.putAll(buildParam()); equipmentRule($fact, globalParams); end From 2fafd931cc99626e128f8ac00f04f27dfa4b7075 Mon Sep 17 00:00:00 2001 From: MHW Date: Tue, 7 Apr 2026 17:04:13 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=E8=A3=85=E5=A4=87=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E7=9B=AE=E6=A0=87=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E9=98=B5=E4=BD=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0=EF=BC=88=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E7=BB=86=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/FireRuleInputRedWeaponElementDTO.java | 2 + .../ultimately/dto/FireRuleTaskInputDTO.java | 5 + .../vo/FireRuleRedWeaponEquipmentVO.java | 2 + .../FireRuleRedWeaponOutputFillHelper.java | 538 ++++++++++++++++++ .../com/solution/rule/utils/RuleFunction.java | 138 ++++- .../src/main/resources/rules/rule.drl | 93 +++ 6 files changed, 777 insertions(+), 1 deletion(-) diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java index 462f7ed..f7c7f51 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleInputRedWeaponElementDTO.java @@ -30,6 +30,8 @@ public class FireRuleInputRedWeaponElementDTO { private Boolean isInterferenceTarget; private Boolean isDefendImportantPlace; + //命中率 + private Double successTargetRad; private String groupType; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java index 965faa5..eeb8764 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/dto/FireRuleTaskInputDTO.java @@ -32,6 +32,11 @@ public class FireRuleTaskInputDTO { */ private String side; + /** + * 蓝方任务装备命中率 + */ + private Double successTargetRad; + /** * 航迹所属实体或阵营标识 */ diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java index 47c4548..77269ac 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java @@ -29,6 +29,8 @@ public class FireRuleRedWeaponEquipmentVO { private Boolean isInterferenceTarget; private Boolean isDefendImportantPlace; + //命中率 + private Double successTargetRad; private String groupType; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java index a065aa4..7c8776e 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java @@ -3,19 +3,32 @@ package com.solution.rule.utils; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.solution.rule.domain.ultimately.dto.FireRuleInputRedSubComponentsDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleCoordinateDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTrackPointDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleTaskWeaponDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleWeaponComponentDTO; +import com.solution.rule.domain.ultimately.dto.FireRuleComponentParamDTO; import com.solution.rule.domain.ultimately.vo.FireRuleLauncherConfigurationVO; +import com.solution.rule.domain.ultimately.vo.FireRuleExecuteBlockVO; +import com.solution.rule.domain.ultimately.vo.FireRuleExecuteTargetItemVO; import com.solution.rule.domain.ultimately.vo.FireRuleMissionListItemVO; import com.solution.rule.domain.ultimately.vo.FireRuleMountedWeaponRefVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedSubComponentsVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponEquipmentVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRedPlatformSlotVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponSlotVO; import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskNodeVO; import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskPayloadVO; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 将入参中的红方装备 {@code SubComponents}(DTO)转为输出 VO,保持与原始 JSON 结构一致。 @@ -95,6 +108,325 @@ public final class FireRuleRedWeaponOutputFillHelper { return list; } + /** + * 阵位填充:写入每个 redWeapon 的 SubComponents.platform[].positions = [lon,lat,height]。 + * 混合模式:蓝方武器坐标中心为锚点 + 航迹方位偏移 + 编队偏移 + 作战区约束。 + */ + @SuppressWarnings("rawtypes") + public static void fillPlatformPositions(List redWeapons, FireRuleTaskInputDTO blueTask, Map params) { + if (redWeapons == null || redWeapons.isEmpty() || blueTask == null) { + return; + } + Coord anchor = computeBlueAnchor(blueTask); + if (anchor == null) { + return; + } + double bearingDeg = computeTrackBearingDeg(blueTask, str(params, "trackPointDirectionMode", "head2next"), + readDouble(params, "fallbackBearingDeg", 0d)); + + double minKm = readDouble(params, "deployDistanceKmMin", 8d); + double maxKm = readDouble(params, "deployDistanceKmMax", 30d); + double defKm = readDouble(params, "deployDistanceKmDefault", 15d); + String formation = str(params, "formationType", "line"); + double spacingM = readDouble(params, "formationSpacingMeters", 300d); + double headingOffset = readDouble(params, "formationHeadingOffsetDeg", 15d); + double minInterM = readDouble(params, "minInterPlatformDistanceMeters", 80d); + if (spacingM < minInterM) { + spacingM = minInterM; + } + double defaultHeight = readDouble(params, "defaultDeployHeight", 30d); + double followRatio = readDouble(params, "heightFollowBlueRatio", 0d); + boolean clamp = Boolean.parseBoolean(String.valueOf(params.getOrDefault("enableWarZoneClamp", true))); + List warZone = toWarZonePolygon(blueTask.getWarZoneLocation()); + Map distanceByPlatform = parseDistanceByPlatformCsv(str(params, "distanceByPlatformCsv", "")); + + for (FireRuleRedWeaponEquipmentVO red : redWeapons) { + if (red == null || red.getSubComponents() == null || red.getSubComponents().getPlatform() == null) { + continue; + } + double distKm = resolveDeployDistanceKm(red, distanceByPlatform, defKm); + distKm = clampDouble(distKm, minKm, maxKm); + + List platforms = red.getSubComponents().getPlatform(); + for (int i = 0; i < platforms.size(); i++) { + FireRuleRedPlatformSlotVO slot = platforms.get(i); + if (slot == null) { + continue; + } + double extraBearing = formationBearingOffsetDeg(formation, i, headingOffset); + double extraMeters = formationOffsetMeters(formation, i, spacingM); + Coord c = moveByMeters(anchor, distKm * 1000d + extraMeters, bearingDeg + extraBearing); + + if (clamp && warZone.size() >= 3 && !isPointInPolygon(c, warZone)) { + c = projectInsidePolygon(c, anchor, warZone); + } + + double h = defaultHeight; + if (anchor.height != null) { + h = defaultHeight + anchor.height * followRatio; + } + slot.setPositions(asPosition(c.lon, c.lat, h)); + } + } + } + + /** + * 目标分配:为每个红方 Tasks 节点写入 task.execute[0].targetList[*].targetId。\n + * targetId 来源:当前蓝方任务 {@link FireRuleTaskInputDTO#getTaskWeapons()} 下每条武器的 equipmentId。\n + * 允许多个红方装备指向同一个蓝方目标(不做去重占用)。\n + * 参数来自 rule.drl buildParam:\n + * - executeTypeDefault\n + * - targetPickMode: roundRobin/random\n + * - minTargetsPerRed / maxTargetsPerRedCap\n + * - radToTargetsCsv\n + * - rangeParseRegex / rangeUnit / minRangeToAllowAssignKm\n + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void assignTargetsToTasks(List tasks, + List redWeapons, + FireRuleTaskInputDTO blueTask, + Map params) { + if (tasks == null || tasks.isEmpty() || blueTask == null) { + return; + } + List candidates = extractBlueTargetEquipmentIds(blueTask, params); + if (candidates.isEmpty()) { + return; + } + + String executeType = str(params, "executeTypeDefault", "assault"); + String pickMode = str(params, "targetPickMode", "roundRobin"); + + for (int i = 0; i < tasks.size(); i++) { + FireRuleSceneTaskNodeVO node = tasks.get(i); + if (node == null) { + continue; + } + if (node.getTask() == null) { + node.setTask(new FireRuleSceneTaskPayloadVO()); + } + FireRuleSceneTaskPayloadVO payload = node.getTask(); + Double redHitRate = resolveRedWeaponHitRate(payload.getWeaponId(), redWeapons); + int targetsPerRed = resolveTargetsPerRed(redHitRate, params); + + FireRuleExecuteBlockVO block = new FireRuleExecuteBlockVO(); + block.setType(executeType); + + List targetList = new ArrayList<>(); + for (int k = 0; k < targetsPerRed; k++) { + String blueEquipmentId = pickBlueTargetId(candidates, pickMode, i, k, node, blueTask); + if (isBlank(blueEquipmentId)) { + continue; + } + FireRuleExecuteTargetItemVO item = new FireRuleExecuteTargetItemVO(); + item.setId(UUID.randomUUID().toString()); + item.setTargetId(blueEquipmentId); + // weaponId:可填红方装备的 equipmentId(若无则留空) + item.setWeaponId(payload.getWeaponId()); + targetList.add(item); + } + block.setTargetList(targetList.isEmpty() ? null : targetList); + + List execute = new ArrayList<>(); + execute.add(block); + payload.setExecute(execute); + } + } + + private static Double resolveRedWeaponHitRate(String weaponId, List redWeapons) { + if (isBlank(weaponId) || redWeapons == null || redWeapons.isEmpty()) { + return null; + } + for (FireRuleRedWeaponEquipmentVO w : redWeapons) { + if (w != null && weaponId.equals(w.getEquipmentId())) { + return w.getSuccessTargetRad(); + } + } + return null; + } + + private static String pickBlueTargetId(List candidates, String pickMode, int taskIndex, int innerIndex, + FireRuleSceneTaskNodeVO node, FireRuleTaskInputDTO blueTask) { + if (candidates == null || candidates.isEmpty()) { + return null; + } + if ("random".equalsIgnoreCase(pickMode)) { + // 伪随机但稳定:基于 redTask.id + blueTask.id + innerIndex 做 hash + String seed = nz(node != null ? node.getId() : "") + "|" + nz(blueTask.getId()) + "|" + innerIndex; + int h = Math.abs(seed.hashCode()); + return candidates.get(h % candidates.size()); + } + // 默认 roundRobin:按 Tasks 序号与目标序号轮询 + int idx = Math.abs(taskIndex + innerIndex) % candidates.size(); + return candidates.get(idx); + } + + private static int resolveTargetsPerRed(Double successTargetRad, Map params) { + int min = readInt(params, "minTargetsPerRed", 1); + int max = readInt(params, "maxTargetsPerRedCap", 3); + if (max <= 0) { + max = 1; + } + if (min < 0) { + min = 0; + } + if (min > max) { + min = max; + } + + int byRad = parseRadToTargets(successTargetRad, str(params, "radToTargetsCsv", "")); + int v = byRad > 0 ? byRad : min; + if (v < min) { + v = min; + } + if (v > max) { + v = max; + } + return v; + } + + private static int parseRadToTargets(Double rad, String csv) { + if (rad == null || csv == null || csv.trim().isEmpty()) { + return 0; + } + double r = rad.doubleValue(); + // 允许无序输入:找所有 threshold<=r 的最大 threshold 对应的 targets + double bestTh = -1; + int bestTargets = 0; + for (String part : csv.split(",")) { + String p = part.trim(); + if (p.isEmpty() || !p.contains(":")) { + continue; + } + String[] kv = p.split(":"); + if (kv.length != 2) { + continue; + } + try { + double th = Double.parseDouble(kv[0].trim()); + int t = Integer.parseInt(kv[1].trim()); + if (r >= th && th > bestTh) { + bestTh = th; + bestTargets = t; + } + } catch (Exception ignore) { + } + } + return bestTargets; + } + + private static List extractBlueTargetEquipmentIds(FireRuleTaskInputDTO blueTask, Map params) { + List all = new ArrayList<>(); + if (blueTask == null || blueTask.getTaskWeapons() == null) { + return all; + } + + // 射程过滤参数 + String regex = str(params, "rangeParseRegex", "(\\d+(?:\\.\\d+)?)"); + String unit = str(params, "rangeUnit", "km"); + double minKm = readDouble(params, "minRangeToAllowAssignKm", 0d); + Pattern pattern = safePattern(regex); + + for (FireRuleTaskWeaponDTO w : blueTask.getTaskWeapons()) { + if (w == null || isBlank(w.getEquipmentId())) { + continue; + } + Double km = tryParseRangeKm(w, pattern, unit); + if (km != null && km.doubleValue() < minKm) { + continue; + } + all.add(w.getEquipmentId()); + } + return all; + } + + private static Double tryParseRangeKm(FireRuleTaskWeaponDTO w, Pattern pattern, String unit) { + if (w == null || w.getComponents() == null || w.getComponents().isEmpty() || pattern == null) { + return null; + } + for (FireRuleWeaponComponentDTO c : w.getComponents()) { + if (c == null || c.getComponentParams() == null) { + continue; + } + for (FireRuleComponentParamDTO p : c.getComponentParams()) { + if (p == null) { + continue; + } + Double km = parseNumberToKm(p.getAttDefaultValue(), pattern, unit); + if (km != null) { + return km; + } + km = parseNumberToKm(p.getAttExplain(), pattern, unit); + if (km != null) { + return km; + } + } + } + return null; + } + + private static Double parseNumberToKm(String text, Pattern pattern, String unit) { + if (text == null || text.trim().isEmpty() || pattern == null) { + return null; + } + Matcher m = pattern.matcher(text); + if (!m.find()) { + return null; + } + try { + double v = Double.parseDouble(m.group(1)); + if ("m".equalsIgnoreCase(unit)) { + return v / 1000.0d; + } + return v; + } catch (Exception e) { + return null; + } + } + + private static Pattern safePattern(String regex) { + try { + return Pattern.compile(regex); + } catch (Exception e) { + return null; + } + } + + private static double readDouble(Map params, String key, double def) { + Object v = params != null ? params.get(key) : null; + if (v == null) { + return def; + } + if (v instanceof Number) { + return ((Number) v).doubleValue(); + } + try { + return Double.parseDouble(String.valueOf(v).trim()); + } catch (Exception e) { + return def; + } + } + + private static int readInt(Map params, String key, int def) { + Object v = params != null ? params.get(key) : null; + if (v == null) { + return def; + } + if (v instanceof Number) { + return ((Number) v).intValue(); + } + try { + return Integer.parseInt(String.valueOf(v).trim()); + } catch (Exception e) { + return def; + } + } + + private static String str(Map params, String key, String def) { + Object v = params != null ? params.get(key) : null; + return v == null ? def : String.valueOf(v); + } + private static List buildMissionList(FireRuleRedWeaponEquipmentVO redWeapon) { if (redWeapon == null || redWeapon.getSubComponents() == null || redWeapon.getSubComponents().getWeapon() == null) { return null; @@ -149,4 +481,210 @@ public final class FireRuleRedWeaponOutputFillHelper { private static boolean isBlank(String s) { return s == null || s.trim().isEmpty(); } + + // ------------------ 阵位几何辅助 ------------------ + private static class Coord { + final double lon; + final double lat; + final Double height; + Coord(double lon, double lat, Double height) { + this.lon = lon; + this.lat = lat; + this.height = height; + } + } + + private static Coord computeBlueAnchor(FireRuleTaskInputDTO blueTask) { + if (blueTask == null || blueTask.getTaskWeapons() == null || blueTask.getTaskWeapons().isEmpty()) { + return null; + } + double sumLon = 0d, sumLat = 0d, sumH = 0d; + int count = 0, hc = 0; + for (FireRuleTaskWeaponDTO w : blueTask.getTaskWeapons()) { + if (w == null || w.getCoordinate() == null || w.getCoordinate().getLongitude() == null || w.getCoordinate().getLatitude() == null) { + continue; + } + sumLon += w.getCoordinate().getLongitude(); + sumLat += w.getCoordinate().getLatitude(); + count++; + if (w.getCoordinate().getHeight() != null) { + sumH += w.getCoordinate().getHeight(); + hc++; + } + } + if (count == 0) { + return null; + } + return new Coord(sumLon / count, sumLat / count, hc > 0 ? sumH / hc : null); + } + + private static double computeTrackBearingDeg(FireRuleTaskInputDTO blueTask, String mode, double fallbackDeg) { + if (blueTask == null || blueTask.getTrackPoints() == null || blueTask.getTrackPoints().size() < 2) { + return fallbackDeg; + } + FireRuleTrackPointDTO a; + FireRuleTrackPointDTO b; + if ("tail2prev".equalsIgnoreCase(mode)) { + int n = blueTask.getTrackPoints().size(); + a = blueTask.getTrackPoints().get(n - 2); + b = blueTask.getTrackPoints().get(n - 1); + } else { + a = blueTask.getTrackPoints().get(0); + b = blueTask.getTrackPoints().get(1); + } + if (a == null || b == null || a.getLongitude() == null || a.getLatitude() == null || b.getLongitude() == null || b.getLatitude() == null) { + return fallbackDeg; + } + return bearingDeg(a.getLongitude(), a.getLatitude(), b.getLongitude(), b.getLatitude()); + } + + private static List toWarZonePolygon(List warZone) { + List list = new ArrayList<>(); + if (warZone == null) { + return list; + } + for (FireRuleCoordinateDTO c : warZone) { + if (c != null && c.getLongitude() != null && c.getLatitude() != null) { + list.add(new Coord(c.getLongitude(), c.getLatitude(), c.getHeight())); + } + } + return list; + } + + private static Map parseDistanceByPlatformCsv(String csv) { + Map map = new HashMap<>(); + if (isBlank(csv)) { + return map; + } + for (String part : csv.split(",")) { + String p = part.trim(); + if (!p.contains(":")) { + continue; + } + String[] kv = p.split(":"); + if (kv.length != 2) { + continue; + } + try { + map.put(kv[0].trim(), Double.parseDouble(kv[1].trim())); + } catch (Exception ignore) { + } + } + return map; + } + + private static double resolveDeployDistanceKm(FireRuleRedWeaponEquipmentVO red, Map byPlatform, double defKm) { + String name = red != null ? nz(red.getName()) : ""; + String platform = red != null ? nz(red.getPlatformType()) : ""; + for (Map.Entry e : byPlatform.entrySet()) { + String k = e.getKey(); + if (!isBlank(k) && (name.contains(k) || platform.contains(k))) { + return e.getValue(); + } + } + return defKm; + } + + private static double formationBearingOffsetDeg(String formation, int index, double headingOffset) { + if ("line".equalsIgnoreCase(formation)) { + return 90d; + } + if ("wedge".equalsIgnoreCase(formation)) { + return (index % 2 == 0 ? 1 : -1) * headingOffset; + } + if ("circle".equalsIgnoreCase(formation)) { + return index * 45d; + } + return 0d; + } + + private static double formationOffsetMeters(String formation, int index, double spacingM) { + if ("line".equalsIgnoreCase(formation)) { + return (index - 0.5d) * spacingM; + } + if ("wedge".equalsIgnoreCase(formation)) { + return (index + 1) * spacingM * 0.5d; + } + if ("circle".equalsIgnoreCase(formation)) { + return spacingM; + } + return index * spacingM; + } + + private static Coord moveByMeters(Coord anchor, double meters, double bearingDeg) { + double R = 6378137.0d; + double brng = Math.toRadians(bearingDeg); + double lat1 = Math.toRadians(anchor.lat); + double lon1 = Math.toRadians(anchor.lon); + double dR = meters / R; + double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dR) + Math.cos(lat1) * Math.sin(dR) * Math.cos(brng)); + double lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dR) * Math.cos(lat1), + Math.cos(dR) - Math.sin(lat1) * Math.sin(lat2)); + return new Coord(Math.toDegrees(lon2), Math.toDegrees(lat2), anchor.height); + } + + private static double bearingDeg(double lon1, double lat1, double lon2, double lat2) { + double phi1 = Math.toRadians(lat1); + double phi2 = Math.toRadians(lat2); + double dLon = Math.toRadians(lon2 - lon1); + double y = Math.sin(dLon) * Math.cos(phi2); + double x = Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(dLon); + double brng = Math.toDegrees(Math.atan2(y, x)); + return (brng + 360d) % 360d; + } + + private static boolean isPointInPolygon(Coord p, List poly) { + boolean inside = false; + for (int i = 0, j = poly.size() - 1; i < poly.size(); j = i++) { + double xi = poly.get(i).lon, yi = poly.get(i).lat; + double xj = poly.get(j).lon, yj = poly.get(j).lat; + boolean intersect = ((yi > p.lat) != (yj > p.lat)) + && (p.lon < (xj - xi) * (p.lat - yi) / (yj - yi + 1e-12) + xi); + if (intersect) { + inside = !inside; + } + } + return inside; + } + + private static Coord projectInsidePolygon(Coord out, Coord anchor, List poly) { + if (isPointInPolygon(out, poly)) { + return out; + } + // 二分逼近:沿 anchor -> out 连线回退到多边形内部 + Coord in = anchor; + if (!isPointInPolygon(in, poly)) { + // anchor 不在区内时,退化为原点不处理 + return out; + } + Coord lo = in; + Coord hi = out; + for (int i = 0; i < 24; i++) { + Coord mid = new Coord((lo.lon + hi.lon) / 2d, (lo.lat + hi.lat) / 2d, out.height); + if (isPointInPolygon(mid, poly)) { + lo = mid; + } else { + hi = mid; + } + } + return lo; + } + + private static List asPosition(double lon, double lat, double height) { + List p = new ArrayList<>(3); + p.add(lon); + p.add(lat); + p.add(height); + return p; + } + + private static double clampDouble(double v, double min, double max) { + if (v < min) { + return min; + } + if (v > max) { + return max; + } + return v; + } } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java index 9c03fe7..90cb5c8 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java @@ -11,8 +11,10 @@ import com.solution.rule.domain.ultimately.vo.FireRuleTaskInputVO; import com.solution.rule.domain.ultimately.vo.FireRuleTaskWeaponVO; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * Drools 规则调用的装备匹配逻辑。所有业务词均来自 globalParams(由 rule.drl 的 buildParam 注入),本类不写死中文业务词。 @@ -103,13 +105,126 @@ public final class RuleFunction { return; } - FireRuleInputRedWeaponElementDTO chosen = pool.remove(bestIndex); + pool.remove(bestIndex); out.setRedWeapons(convertPoolToEquipmentVoList(pool)); // Tasks 由最终输出 redWeapons 一一生成(一个装备 -> 一个任务) out.setTasks(FireRuleRedWeaponOutputFillHelper.toTaskNodes(out.getRedWeapons())); } + /** + * 目标规则:显式为 Tasks 填 targetId,并按红方命中率不足时补拿装备(出池,带上限)。 + */ + @SuppressWarnings("rawtypes") + public static void target(DroolsFact fact, Map globalParams){ + if (fact == null || fact.getTask() == null || fact.getFireRuleOutputVO() == null) { + return; + } + Map p = castParams(globalParams); + FireRuleTaskInputDTO blue = fact.getTask(); + FireRuleOutputVO out = fact.getFireRuleOutputVO(); + List pool = fact.getRedWeapons(); + if (pool == null) { + pool = new ArrayList<>(); + fact.setRedWeapons(pool); + } + if (out.getRedWeapons() == null) { + out.setRedWeapons(convertPoolToEquipmentVoList(pool)); + } + if (out.getTasks() == null || out.getTasks().size() != out.getRedWeapons().size()) { + out.setTasks(FireRuleRedWeaponOutputFillHelper.toTaskNodes(out.getRedWeapons())); + } + + double threshold = readDouble(p, "redHitRateThreshold", 0.6d); + int maxExtra = readInt(p, "maxExtraWeaponsPerTask", 2); + int maxRounds = readInt(p, "maxSupplementRounds", 5); + int extraMinScore = readInt(p, "extraPickMinScore", 1); + int weight = readInt(p, "weight", 1); + String blueBlob = buildBlueTextBlob(blue); + + if (maxExtra > 0 && maxRounds > 0 && !pool.isEmpty()) { + Set selectedIds = new HashSet<>(); + for (FireRuleRedWeaponEquipmentVO w : out.getRedWeapons()) { + if (w != null && !isBlank(w.getEquipmentId())) { + selectedIds.add(w.getEquipmentId()); + } + } + + int extraCount = 0; + int rounds = 0; + while (rounds < maxRounds && extraCount < maxExtra && !pool.isEmpty()) { + rounds++; + boolean needExtra = false; + for (FireRuleRedWeaponEquipmentVO w : out.getRedWeapons()) { + Double rad = w != null ? w.getSuccessTargetRad() : null; + if (rad == null || rad.doubleValue() < threshold) { + needExtra = true; + break; + } + } + if (!needExtra) { + break; + } + + int bestIdx = -1; + int bestScore = Integer.MIN_VALUE; + for (int i = 0; i < pool.size(); i++) { + FireRuleInputRedWeaponElementDTO red = pool.get(i); + if (red == null) { + continue; + } + if (!isBlank(red.getEquipmentId()) && selectedIds.contains(red.getEquipmentId())) { + continue; + } + String redBlob = buildRedTextBlob(red); + int s = scoreRuleSlots(blueBlob, redBlob, p, weight) + + scoreLegacyLayer(blueBlob, redBlob, p, weight); + if (s > bestScore) { + bestScore = s; + bestIdx = i; + } else if (s == bestScore && bestIdx >= 0) { + if (compareRedForTieBreak(pool.get(bestIdx), red, p) > 0) { + bestIdx = i; + } + } + } + if (bestIdx < 0 || bestScore < extraMinScore) { + break; + } + FireRuleInputRedWeaponElementDTO extra = pool.remove(bestIdx); + FireRuleRedWeaponEquipmentVO vo = toRedEquipmentVo(extra); + out.getRedWeapons().add(vo); + if (!isBlank(vo.getEquipmentId())) { + selectedIds.add(vo.getEquipmentId()); + } + extraCount++; + } + } + + out.setTasks(FireRuleRedWeaponOutputFillHelper.toTaskNodes(out.getRedWeapons())); + FireRuleRedWeaponOutputFillHelper.assignTargetsToTasks(out.getTasks(), out.getRedWeapons(), blue, p); + } + + /** + * 阵位规则:根据蓝方武器 coordinate + trackPoints + warZone 计算红方平台 positions。 + */ + @SuppressWarnings("rawtypes") + public static void position(DroolsFact fact, Map globalParams) { + if (fact == null || fact.getTask() == null || fact.getFireRuleOutputVO() == null) { + return; + } + Map p = castParams(globalParams); + boolean enabled = Boolean.parseBoolean(String.valueOf(p.getOrDefault("positionRuleEnabled", true))); + if (!enabled) { + return; + } + FireRuleOutputVO out = fact.getFireRuleOutputVO(); + if (out.getRedWeapons() == null || out.getRedWeapons().isEmpty()) { + return; + } + FireRuleRedWeaponOutputFillHelper.fillPlatformPositions(out.getRedWeapons(), fact.getTask(), p); + } + @SuppressWarnings("unchecked") private static Map castParams(Map raw) { return raw == null ? new java.util.HashMap<>() : (Map) raw; @@ -277,10 +392,29 @@ public final class RuleFunction { } } + private static double readDouble(Map p, String key, double def) { + Object v = p.get(key); + if (v == null) { + return def; + } + if (v instanceof Number) { + return ((Number) v).doubleValue(); + } + try { + return Double.parseDouble(String.valueOf(v).trim()); + } catch (NumberFormatException e) { + return def; + } + } + private static String nz(String s) { return s == null ? "" : s; } + private static boolean isBlank(String s) { + return s == null || s.trim().isEmpty(); + } + private static FireRuleTaskWeaponVO toTaskWeaponVo(FireRuleInputRedWeaponElementDTO r) { FireRuleTaskWeaponVO w = new FireRuleTaskWeaponVO(); if (r != null) { @@ -315,6 +449,7 @@ public final class RuleFunction { vo.setIsReconTarget(src.getIsReconTarget()); vo.setIsInterferenceTarget(src.getIsInterferenceTarget()); vo.setIsDefendImportantPlace(src.getIsDefendImportantPlace()); + vo.setSuccessTargetRad(src.getSuccessTargetRad()); vo.setGroupType(src.getGroupType()); vo.setEquipmentId(src.getEquipmentId()); vo.setName(src.getName()); @@ -323,4 +458,5 @@ public final class RuleFunction { vo.setSubComponents(FireRuleRedWeaponOutputFillHelper.toOutputSubComponents(src.getSubComponents())); return vo; } + } diff --git a/auto-solution-rule/src/main/resources/rules/rule.drl b/auto-solution-rule/src/main/resources/rules/rule.drl index 17619c5..0ac479b 100644 --- a/auto-solution-rule/src/main/resources/rules/rule.drl +++ b/auto-solution-rule/src/main/resources/rules/rule.drl @@ -4,6 +4,8 @@ import com.solution.rule.domain.ultimately.fact.DroolsFact; import java.util.Map; import static com.solution.rule.utils.RuleFunction.equipmentRule; +import static com.solution.rule.utils.RuleFunction.target; +import static com.solution.rule.utils.RuleFunction.position; global java.util.Map globalParams; @@ -74,6 +76,77 @@ function Map buildParam(){ param.put("redMatchKeywords_missile", "防空,导弹,导弹发射"); param.put("missileScore", 1); + // ===================== 目标分配参数(写入 Tasks.task.execute) ===================== + // executeTypeDefault:生成 execute[0] 的类型字段 + param.put("executeTypeDefault", "assault"); + // targetPickMode:roundRobin(稳定轮询) / random(伪随机但同输入稳定) + param.put("targetPickMode", "roundRobin"); + // minTargetsPerRed / maxTargetsPerRedCap:每个红方任务最少/最多分配的目标数 + param.put("minTargetsPerRed", 1); + param.put("maxTargetsPerRedCap", 3); + // radToTargetsCsv:successTargetRad(命中率) -> 每红装目标数 的映射(阈值:目标数),按阈值从大到小匹配 + // 例:0.8:1,0.5:2,0.2:3 表示 successTargetRad>=0.8 分1个;>=0.5 分2个;>=0.2 分3个 + param.put("radToTargetsCsv", "0.8:1,0.5:2,0.2:3"); + // rangeParseRegex:从 attDefaultValue/attExplain 中提取射程数值的正则(取第1个数字) + param.put("rangeParseRegex", "(\\\\d+(?:\\\\.\\\\d+)?)"); + // rangeUnit:提取数值的单位,km/m(二选一) + param.put("rangeUnit", "km"); + // minRangeToAllowAssignKm:若解析到的蓝方射程小于该值,则该蓝方装备不参与被分配(无法解析则忽略此过滤) + param.put("minRangeToAllowAssignKm", 0); + + // ===================== 低命中率补拿装备参数 ===================== + // redHitRateThreshold:红方装备命中率阈值(低于该值时触发补拿) + param.put("redHitRateThreshold", 0.6); + // maxExtraWeaponsPerTask:每条蓝方任务最多补拿几件红装 + param.put("maxExtraWeaponsPerTask", 2); + // maxSupplementRounds:补拿循环最大轮次(防死循环) + param.put("maxSupplementRounds", 2); + // extraPickMinScore:补拿时红装最低匹配分 + param.put("extraPickMinScore", 1); + + // ===================== 阵位规则参数(写入 SubComponents.platform[].positions) ===================== + // positionRuleEnabled:是否启用阵位规则。true=执行阵位生成;false=跳过,不改 platform.positions。 + param.put("positionRuleEnabled", true); + // positionAnchorMode:锚点模式。当前实现使用 hybrid(蓝方 taskWeapons.coordinate 的中心点作为主锚点)。 + param.put("positionAnchorMode", "hybrid"); + // trackPointDirectionMode:航向计算模式。 + // - head2next:取 trackPoints[0] -> trackPoints[1] 作为方向(默认) + // - tail2prev:取倒数第二个 -> 最后一个点作为方向 + param.put("trackPointDirectionMode", "head2next"); + // fallbackBearingDeg:当 trackPoints 缺失或无法计算方位时,使用该默认方位角(度,0-360)。 + param.put("fallbackBearingDeg", 0); + // deployDistanceKmMin:部署距离下限(km)。最终距离不会小于该值。 + param.put("deployDistanceKmMin", 8); + // deployDistanceKmMax:部署距离上限(km)。最终距离不会大于该值。 + param.put("deployDistanceKmMax", 30); + // deployDistanceKmDefault:默认部署距离(km)。 + // 当 distanceByPlatformCsv 未命中任何关键词时,使用该值。 + param.put("deployDistanceKmDefault", 15); + // distanceByPlatformCsv:按“关键词”覆盖部署距离(km),不写死具体类型,完全由业务配置。 + // 格式:关键词:距离,关键词:距离(示例:防空:18,反坦克:10,迫击炮:8) + // 匹配范围:红方装备 Name / Platform_type 文本包含关键词即命中。 + // 优先级:命中后覆盖 deployDistanceKmDefault;但最终仍受 deployDistanceKmMin 与 deployDistanceKmMax 约束。 + param.put("distanceByPlatformCsv", ""); + // formationType:编队样式,可选 line / wedge / circle。 + param.put("formationType", "line"); + // formationSpacingMeters:编队间距(米),影响同一红装下 platform[] 点位离散程度。 + // 说明:Java 侧会与 minInterPlatformDistanceMeters 比较,取更大值,避免平台重叠过近。 + param.put("formationSpacingMeters", 300); + // formationHeadingOffsetDeg:编队相对主航向的偏转角(度),主要用于 wedge/circle 的分散方向。 + param.put("formationHeadingOffsetDeg", 15); + // defaultDeployHeight:默认部署高度(米),用于 positions 第3位高度值基线。 + param.put("defaultDeployHeight", 30); + // heightFollowBlueRatio:高度跟随蓝方比例(>=0)。 + // 计算方式:高度 = defaultDeployHeight + 蓝方锚点平均高度 * heightFollowBlueRatio。 + // 0 表示不跟随蓝方高度,仅使用默认高度。 + param.put("heightFollowBlueRatio", 0.0); + // enableWarZoneClamp:是否启用作战区约束。true=超出 warZoneLocation 时回拉到区内。 + param.put("enableWarZoneClamp", true); + // warZoneClampMode:作战区约束模式。当前实现使用 nearestInside(沿锚点到目标点方向二分回拉到区内)。 + param.put("warZoneClampMode", "nearestInside"); + // minInterPlatformDistanceMeters:平台最小间距(米)下限,用于抑制平台点位过度重叠。 + param.put("minInterPlatformDistanceMeters", 80); + return param; } @@ -86,3 +159,23 @@ then globalParams.putAll(buildParam()); equipmentRule($fact, globalParams); end + +rule "目标匹配" +salience 90 +when + $fact : DroolsFact(task != null) +then + // 显式目标分配规则:填充 Tasks.task.execute.targetList[*].targetId + globalParams.putAll(buildParam()); + target($fact, globalParams); +end + +rule "阵位匹配" +salience 80 +when + $fact : DroolsFact(task != null) +then + // 显式阵位规则:填充 redWeapons.SubComponents.platform[].positions + globalParams.putAll(buildParam()); + position($fact, globalParams); +end From 6add28fdfb94576cbfeb860d3c9842e1c838966d Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 10:22:53 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=E8=A3=85=E5=A4=87=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E7=9B=AE=E6=A0=87=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=EF=BC=8C=E9=98=B5=E4=BD=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=E3=80=81=E8=88=AA=E8=BF=B9=E8=A7=84=E5=88=99=E3=80=90=E5=88=9D?= =?UTF-8?q?=E7=89=88=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/FireRuleExecuteTargetItemVO.java | 2 + .../ultimately/vo/FireRuleOutputVO.java | 51 +-- .../vo/FireRuleRedWeaponEquipmentVO.java | 8 - .../vo/FireRuleRouteTrackPointVO.java | 17 + .../ultimately/vo/FireRuleTrackParamVO.java | 41 ++ .../ultimately/vo/FireRuleTrackRouteVO.java | 28 ++ .../FireRuleRedWeaponOutputFillHelper.java | 397 ++++++++++++++++++ .../com/solution/rule/utils/RuleFunction.java | 20 + .../main/resources/json/new火力规则输出.json | 392 +++++++++++++++++ .../src/main/resources/rules/rule.drl | 39 ++ auto-solution-system/Dockerfile | 4 + 11 files changed, 967 insertions(+), 32 deletions(-) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRouteTrackPointVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackParamVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackRouteVO.java create mode 100644 auto-solution-rule/src/main/resources/json/new火力规则输出.json create mode 100644 auto-solution-system/Dockerfile diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java index b337bc8..b1bbba1 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleExecuteTargetItemVO.java @@ -45,6 +45,8 @@ public class FireRuleExecuteTargetItemVO { private String cruiseRouteId; + private String moveRouteId; + private List cruiseRouteOffset; private String fireType; diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java index 38071b0..7235676 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleOutputVO.java @@ -1,42 +1,45 @@ package com.solution.rule.domain.ultimately.vo; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; -/** - * 火力规则输出根文档(与 {@code 火力规则输出.json} 字段一一对应)。 - */ @Data @JsonIgnoreProperties(ignoreUnknown = true) public class FireRuleOutputVO { - - /** - * 来源场景文件名 - */ private String sourceFile; - - /** - * 火力规则任务列表(可含防区等输出字段) - */ private List fireRuleInputs; - - /** - * 场景任务节点列表 - */ @JsonProperty("Tasks") private List tasks; + @JsonProperty("TrackParam") + private FireRuleTrackParamVO trackParam; - /** - * 编组列表 - */ - @JsonProperty("Groups") - private List groups; + @JsonIgnore + public List getGroups() { + return trackParam == null ? null : trackParam.getGroups(); + } - /** - * 红方装备列表 - */ - private List redWeapons; + @JsonIgnore + public void setGroups(List groups) { + if (trackParam == null) { + trackParam = new FireRuleTrackParamVO(); + } + trackParam.setGroups(groups); + } + + @JsonIgnore + public List getRedWeapons() { + return trackParam == null ? null : trackParam.getRedWeapons(); + } + + @JsonIgnore + public void setRedWeapons(List redWeapons) { + if (trackParam == null) { + trackParam = new FireRuleTrackParamVO(); + } + trackParam.setRedWeapons(redWeapons); + } } diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java index 77269ac..8b721e1 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRedWeaponEquipmentVO.java @@ -6,9 +6,6 @@ import lombok.Data; import java.util.Map; -/** - * 火力规则输出中 redWeapons 数组的单项(红方装备/平台) - */ @Data @JsonIgnoreProperties(ignoreUnknown = true) public class FireRuleRedWeaponEquipmentVO { @@ -23,15 +20,10 @@ public class FireRuleRedWeaponEquipmentVO { private String platformType; private Boolean isStrikeTarget; - private Boolean isReconTarget; - private Boolean isInterferenceTarget; - private Boolean isDefendImportantPlace; - //命中率 private Double successTargetRad; - private String groupType; @JsonProperty("EquipmentID") diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRouteTrackPointVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRouteTrackPointVO.java new file mode 100644 index 0000000..71fa4fc --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleRouteTrackPointVO.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleRouteTrackPointVO { + private String index; + private String longitude; + private String latitude; + private String height; + private String speed; + private String psia; + private Integer time; + private String active; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackParamVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackParamVO.java new file mode 100644 index 0000000..2e99efb --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackParamVO.java @@ -0,0 +1,41 @@ +package com.solution.rule.domain.ultimately.vo; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FireRuleTrackParamVO { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + private Map routeMap = new LinkedHashMap<>(); + + @JsonProperty("Groups") + private List groups; + + @JsonProperty("redWeapons") + private List redWeapons; + + @JsonAnySetter + public void putRoute(String key, JsonNode value) { + if ("Groups".equals(key) || "redWeapons".equals(key) || value == null) { + return; + } + routeMap.put(key, MAPPER.convertValue(value, FireRuleTrackRouteVO.class)); + } + + @JsonAnyGetter + public Map getRouteMap() { + return routeMap; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackRouteVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackRouteVO.java new file mode 100644 index 0000000..6ea6d9c --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/ultimately/vo/FireRuleTrackRouteVO.java @@ -0,0 +1,28 @@ +package com.solution.rule.domain.ultimately.vo; + +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 FireRuleTrackRouteVO { + private String name; + @JsonProperty("StartTime") + private Integer startTime; + @JsonProperty("EndTime") + private Integer endTime; + @JsonProperty("TrackType") + private String trackType; + @JsonProperty("HeightType") + private String heightType; + private String seaType; + @JsonProperty("TrackPoints") + private List trackPoints; + @JsonProperty("Color") + private String color; + @JsonProperty("PointCount") + private Integer pointCount; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java index 7c8776e..18be66b 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/FireRuleRedWeaponOutputFillHelper.java @@ -18,8 +18,12 @@ import com.solution.rule.domain.ultimately.vo.FireRuleRedSubComponentsVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponEquipmentVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedPlatformSlotVO; import com.solution.rule.domain.ultimately.vo.FireRuleRedWeaponSlotVO; +import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO; +import com.solution.rule.domain.ultimately.vo.FireRuleRouteTrackPointVO; import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskNodeVO; import com.solution.rule.domain.ultimately.vo.FireRuleSceneTaskPayloadVO; +import com.solution.rule.domain.ultimately.vo.FireRuleTrackParamVO; +import com.solution.rule.domain.ultimately.vo.FireRuleTrackRouteVO; import java.util.ArrayList; import java.util.Collections; @@ -170,6 +174,399 @@ public final class FireRuleRedWeaponOutputFillHelper { } } + /** + * 航迹规则:按蓝方 trackPoints 生成 {@link FireRuleTrackParamVO#routeMap} 条目(JSON 顶层 key=航迹 id), + * 并将同一 id 写入对应红方任务 {@code execute[0].targetList[*].moveRouteId}。多蓝方任务循环时 merge,不覆盖已有 id。 + */ + @SuppressWarnings("rawtypes") + public static void fillTrackParamAndBindMoveRoute(FireRuleOutputVO out, FireRuleTaskInputDTO blueTask, Map params) { + if (out == null || blueTask == null || out.getTasks() == null || out.getTasks().isEmpty()) { + return; + } + ensureTrackParam(out); + List tasks = out.getTasks(); + List reds = out.getRedWeapons(); + if (reds == null) { + reds = Collections.emptyList(); + } + List warPoly = toWarZonePolygon(blueTask.getWarZoneLocation()); + Coord blueAnchor = computeBlueAnchor(blueTask); + Coord clampAnchor = resolveClampAnchor(blueAnchor, warPoly); + boolean zoneClamp = Boolean.parseBoolean(String.valueOf(params.getOrDefault("enableTrackWarZoneClamp", true))); + + String dirMode = str(params, "trackPointDirectionMode", "head2next"); + double fallbackBrg = readDouble(params, "trackFallbackBearingDeg", readDouble(params, "fallbackBearingDeg", 0d)); + double mainBearing = computeTrackBearingDeg(blueTask, dirMode, fallbackBrg); + + String algo = str(params, "trackRouteAlgorithm", "followBlue"); + String nameSuffix = str(params, "trackRouteNameSuffix", "航迹"); + String groundType = str(params, "trackGroundTrackType", "routeLineGround"); + String blueIdSeg = sanitizeRouteIdSegment(nz(blueTask.getId())); + + for (int i = 0; i < tasks.size(); i++) { + FireRuleSceneTaskNodeVO node = tasks.get(i); + if (node == null) { + continue; + } + FireRuleRedWeaponEquipmentVO red = i < reds.size() ? reds.get(i) : null; + List nodes = extractSortedBlueTrackNodes(blueTask); + if (nodes.isEmpty()) { + continue; + } + List transformed = applyTrackRouteAlgorithm(nodes, algo, params, mainBearing, i); + int extraMax = readInt(params, "trackExtraNodesMax", 0); + if (extraMax > 0) { + transformed = injectExtraTrackNodes(transformed, extraMax); + } + if (zoneClamp && warPoly.size() >= 3) { + transformed = clampTrackNodesToWarZone(transformed, warPoly, clampAnchor); + } + boolean air = resolveAirTrack(blueTask, red, params); + String routeName = nz(node.getDrawName()) + nameSuffix; + String routeId = buildUniqueRouteId(out.getTrackParam().getRouteMap(), blueIdSeg, sanitizeRouteIdSegment(nz(node.getId())), i); + + FireRuleTrackRouteVO route = buildTrackRouteVo(transformed, routeName, air, groundType); + out.getTrackParam().getRouteMap().put(routeId, route); + bindMoveRouteIdToFirstExecute(node, routeId); + } + } + + private static void ensureTrackParam(FireRuleOutputVO out) { + if (out.getTrackParam() == null) { + out.setTrackParam(new FireRuleTrackParamVO()); + } + } + + private static String buildUniqueRouteId(Map existing, String blueSeg, String nodeSeg, int index) { + String base = "route_" + blueSeg + "_" + nodeSeg + "_" + index; + if (existing == null || !existing.containsKey(base)) { + return base; + } + int k = 1; + while (existing.containsKey(base + "_" + k)) { + k++; + } + return base + "_" + k; + } + + private static void bindMoveRouteIdToFirstExecute(FireRuleSceneTaskNodeVO node, String routeId) { + if (node == null || isBlank(routeId)) { + return; + } + FireRuleSceneTaskPayloadVO payload = node.getTask(); + if (payload == null || payload.getExecute() == null || payload.getExecute().isEmpty()) { + return; + } + FireRuleExecuteBlockVO block = payload.getExecute().get(0); + if (block == null || block.getTargetList() == null) { + return; + } + for (FireRuleExecuteTargetItemVO item : block.getTargetList()) { + if (item != null) { + item.setMoveRouteId(routeId); + } + } + } + + private static FireRuleTrackRouteVO buildTrackRouteVo(List nodes, String name, boolean air, String groundType) { + FireRuleTrackRouteVO vo = new FireRuleTrackRouteVO(); + vo.setName(name); + vo.setStartTime(null); + vo.setEndTime(null); + vo.setTrackType(air ? "routeLineAir" : groundType); + vo.setHeightType("msl"); + vo.setSeaType("seaLevel"); + List pts = new ArrayList<>(nodes.size()); + for (int j = 0; j < nodes.size(); j++) { + TrackNode tn = nodes.get(j); + FireRuleRouteTrackPointVO p = new FireRuleRouteTrackPointVO(); + p.setIndex(String.valueOf(j + 1)); + p.setLongitude(formatCoordNumber(tn.coord.lon)); + p.setLatitude(formatCoordNumber(tn.coord.lat)); + p.setHeight(tn.coord.height != null ? formatCoordNumber(tn.coord.height) : "0"); + p.setSpeed(tn.speed != null ? formatCoordNumber(tn.speed) : null); + pts.add(p); + } + vo.setTrackPoints(pts); + vo.setPointCount(pts.size()); + return vo; + } + + private static String formatCoordNumber(double v) { + return String.valueOf(v); + } + + private static boolean resolveAirTrack(FireRuleTaskInputDTO blue, FireRuleRedWeaponEquipmentVO red, Map params) { + String dt = blue != null ? nz(blue.getDataType()) : ""; + if (csvContainsAny(str(params, "trackAirDataTypeCsv", ""), dt, false)) { + return true; + } + String blob = nz(blue != null ? blue.getDrawName() : ""); + if (red != null) { + blob += " " + nz(red.getName()) + " " + nz(red.getPlatformType()); + } + return csvContainsAny(str(params, "trackAirKeywordsCsv", ""), blob, false); + } + + private static boolean csvContainsAny(String csv, String text, boolean tokenAsEquals) { + if (isBlank(csv) || text == null) { + return false; + } + String t = text.toLowerCase(); + for (String part : csv.split(",")) { + String k = part.trim(); + if (k.isEmpty()) { + continue; + } + if (tokenAsEquals) { + if (t.equalsIgnoreCase(k)) { + return true; + } + } else if (text.contains(k) || t.contains(k.toLowerCase())) { + return true; + } + } + return false; + } + + private static String sanitizeRouteIdSegment(String raw) { + if (raw == null || raw.isEmpty()) { + return "x"; + } + String s = raw.replaceAll("[^a-zA-Z0-9_-]", "_"); + return s.isEmpty() ? "x" : s; + } + + private static class TrackNode { + Coord coord; + Double speed; + TrackNode(Coord coord, Double speed) { + this.coord = coord; + this.speed = speed; + } + } + + private static List extractSortedBlueTrackNodes(FireRuleTaskInputDTO blueTask) { + List list = new ArrayList<>(); + if (blueTask == null || blueTask.getTrackPoints() == null) { + return list; + } + List pts = new ArrayList<>(blueTask.getTrackPoints()); + pts.sort((a, b) -> { + int ia = a != null && a.getIndex() != null ? a.getIndex() : 0; + int ib = b != null && b.getIndex() != null ? b.getIndex() : 0; + return Integer.compare(ia, ib); + }); + for (FireRuleTrackPointDTO p : pts) { + if (p == null || p.getLongitude() == null || p.getLatitude() == null) { + continue; + } + list.add(new TrackNode(new Coord(p.getLongitude(), p.getLatitude(), p.getHeight()), p.getSpeed())); + } + return list; + } + + private static List applyTrackRouteAlgorithm(List nodes, String algo, Map params, double mainBearing, int taskIndex) { + if (nodes == null || nodes.isEmpty()) { + return nodes; + } + String a = algo == null ? "followBlue" : algo.trim(); + if ("shortestPath".equalsIgnoreCase(a)) { + return applyShortestPath(nodes, params); + } + if ("flank".equalsIgnoreCase(a)) { + return applyFlank(nodes, params, taskIndex); + } + if ("jam".equalsIgnoreCase(a)) { + return applyJam(nodes, params, mainBearing); + } + return copyTrackNodes(nodes); + } + + private static List copyTrackNodes(List nodes) { + List out = new ArrayList<>(nodes.size()); + for (TrackNode n : nodes) { + out.add(new TrackNode(new Coord(n.coord.lon, n.coord.lat, n.coord.height), n.speed)); + } + return out; + } + + private static List applyShortestPath(List nodes, Map params) { + int segN = readInt(params, "trackShortPathSegments", 3); + if (segN < 1) { + segN = 1; + } + List out = new ArrayList<>(); + for (int i = 0; i < nodes.size(); i++) { + if (i == 0) { + out.add(copyNode(nodes.get(i))); + continue; + } + Coord a = nodes.get(i - 1).coord; + Coord b = nodes.get(i).coord; + Double spPrev = nodes.get(i - 1).speed; + Double spNext = nodes.get(i).speed; + for (int s = 1; s < segN; s++) { + double t = (double) s / (double) segN; + double lon = a.lon + (b.lon - a.lon) * t; + double lat = a.lat + (b.lat - a.lat) * t; + Double h = null; + if (a.height != null && b.height != null) { + h = a.height + (b.height - a.height) * t; + } else if (b.height != null) { + h = b.height; + } else { + h = a.height; + } + Double spd = null; + if (spPrev != null && spNext != null) { + spd = spPrev + (spNext - spPrev) * t; + } else if (spNext != null) { + spd = spNext; + } else { + spd = spPrev; + } + out.add(new TrackNode(new Coord(lon, lat, h), spd)); + } + out.add(copyNode(nodes.get(i))); + } + return out; + } + + private static TrackNode copyNode(TrackNode n) { + return new TrackNode(new Coord(n.coord.lon, n.coord.lat, n.coord.height), n.speed); + } + + private static List applyFlank(List nodes, Map params, int taskIndex) { + double offsetM = readDouble(params, "trackFlankOffsetMeters", 800d); + String sideMode = str(params, "trackFlankSideMode", "alternate"); + List out = new ArrayList<>(nodes.size()); + for (int i = 0; i < nodes.size(); i++) { + Coord c = nodes.get(i).coord; + double brg; + if (i < nodes.size() - 1) { + Coord nxt = nodes.get(i + 1).coord; + brg = bearingDeg(c.lon, c.lat, nxt.lon, nxt.lat); + } else if (i > 0) { + Coord prev = nodes.get(i - 1).coord; + brg = bearingDeg(prev.lon, prev.lat, c.lon, c.lat); + } else { + brg = 0d; + } + int sign = flankSign(sideMode, i, taskIndex); + Coord moved = moveByMeters(c, sign * offsetM, brg + 90d); + out.add(new TrackNode(moved, nodes.get(i).speed)); + } + return out; + } + + private static int flankSign(String mode, int pointIndex, int taskIndex) { + if ("left".equalsIgnoreCase(mode)) { + return 1; + } + if ("right".equalsIgnoreCase(mode)) { + return -1; + } + return (pointIndex + taskIndex) % 2 == 0 ? 1 : -1; + } + + private static List applyJam(List nodes, Map params, double mainBearing) { + double wobble = readDouble(params, "trackJamWobbleMeters", 400d); + double periods = readDouble(params, "trackJamSegments", 4d); + if (periods < 0.5d) { + periods = 0.5d; + } + int n = nodes.size(); + List out = new ArrayList<>(n); + for (int i = 0; i < n; i++) { + double frac = n <= 1 ? 0d : (double) i / (double) (n - 1); + double lateral = wobble * Math.sin(2d * Math.PI * periods * frac); + Coord c = moveByMeters(nodes.get(i).coord, lateral, mainBearing + 90d); + out.add(new TrackNode(c, nodes.get(i).speed)); + } + return out; + } + + private static List injectExtraTrackNodes(List nodes, int extraMax) { + if (nodes == null || nodes.size() < 2 || extraMax <= 0) { + return nodes; + } + int segs = nodes.size() - 1; + List perSeg = new ArrayList<>(Collections.nCopies(segs, 0)); + int base = extraMax / segs; + int rem = extraMax % segs; + for (int s = 0; s < segs; s++) { + perSeg.set(s, base + (s < rem ? 1 : 0)); + } + List out = new ArrayList<>(); + for (int i = 0; i < nodes.size(); i++) { + out.add(copyNode(nodes.get(i))); + if (i >= nodes.size() - 1) { + break; + } + int ins = perSeg.get(i); + Coord a = nodes.get(i).coord; + Coord b = nodes.get(i + 1).coord; + Double sa = nodes.get(i).speed; + Double sb = nodes.get(i + 1).speed; + for (int k = 1; k <= ins; k++) { + double t = (double) k / (double) (ins + 1); + double lon = a.lon + (b.lon - a.lon) * t; + double lat = a.lat + (b.lat - a.lat) * t; + Double h = null; + if (a.height != null && b.height != null) { + h = a.height + (b.height - a.height) * t; + } else if (b.height != null) { + h = b.height; + } else { + h = a.height; + } + Double spd = null; + if (sa != null && sb != null) { + spd = sa + (sb - sa) * t; + } else if (sb != null) { + spd = sb; + } else { + spd = sa; + } + out.add(new TrackNode(new Coord(lon, lat, h), spd)); + } + } + return out; + } + + private static List clampTrackNodesToWarZone(List nodes, List poly, Coord anchor) { + List out = new ArrayList<>(nodes.size()); + for (TrackNode n : nodes) { + Coord c = n.coord; + if (!isPointInPolygon(c, poly)) { + c = projectInsidePolygon(c, anchor, poly); + } + out.add(new TrackNode(c, n.speed)); + } + return out; + } + + private static Coord resolveClampAnchor(Coord blueAnchor, List poly) { + if (poly.size() >= 3) { + if (blueAnchor != null && isPointInPolygon(blueAnchor, poly)) { + return blueAnchor; + } + return polygonCentroid(poly); + } + return blueAnchor != null ? blueAnchor : new Coord(0d, 0d, null); + } + + private static Coord polygonCentroid(List poly) { + double sx = 0, sy = 0; + for (Coord c : poly) { + sx += c.lon; + sy += c.lat; + } + int n = poly.size(); + return new Coord(sx / n, sy / n, null); + } + /** * 目标分配:为每个红方 Tasks 节点写入 task.execute[0].targetList[*].targetId。\n * targetId 来源:当前蓝方任务 {@link FireRuleTaskInputDTO#getTaskWeapons()} 下每条武器的 equipmentId。\n diff --git a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java index 90cb5c8..4074a9f 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/utils/RuleFunction.java @@ -225,6 +225,26 @@ public final class RuleFunction { FireRuleRedWeaponOutputFillHelper.fillPlatformPositions(out.getRedWeapons(), fact.getTask(), p); } + /** + * 航迹规则:根据蓝方 trackPoints 与作战区生成 TrackParam 航迹,并绑定 execute.targetList.moveRouteId。 + */ + @SuppressWarnings("rawtypes") + public static void trackRoute(DroolsFact fact, Map globalParams) { + if (fact == null || fact.getTask() == null || fact.getFireRuleOutputVO() == null) { + return; + } + Map p = castParams(globalParams); + boolean enabled = Boolean.parseBoolean(String.valueOf(p.getOrDefault("trackRuleEnabled", true))); + if (!enabled) { + return; + } + FireRuleOutputVO out = fact.getFireRuleOutputVO(); + if (out.getTasks() == null || out.getTasks().isEmpty()) { + return; + } + FireRuleRedWeaponOutputFillHelper.fillTrackParamAndBindMoveRoute(out, fact.getTask(), p); + } + @SuppressWarnings("unchecked") private static Map castParams(Map raw) { return raw == null ? new java.util.HashMap<>() : (Map) raw; diff --git a/auto-solution-rule/src/main/resources/json/new火力规则输出.json b/auto-solution-rule/src/main/resources/json/new火力规则输出.json new file mode 100644 index 0000000..dca6702 --- /dev/null +++ b/auto-solution-rule/src/main/resources/json/new火力规则输出.json @@ -0,0 +1,392 @@ +{ + "sourceFile": "区域防空31111_2026-04-02 15_29_03.json", + "fireRuleInputs": [ + { + "taskWeapons": [ + { + "equipmentId": "40b341f6-d60a-4a29-b84d-2973a3065124", + "name": "导弹", + "supportType": "2001", + "components": [ + { + "deviceId": "81c7e7da-cb7b-4435-bba3-1648e946d2b2", + "deviceName": "导弹机动组件", + "componentParams": [ + { + "uuid": "b47f34c2-3cba-4be3-a1d5-be0a986dff6f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + }, + { + "deviceId": "4cf26cd0-bd5b-4d4c-a2eb-bca6184be5a1", + "deviceName": "导弹平台", + "componentParams": [ + { + "uuid": "32beea38-ffc2-445a-9687-e9bdb087727f", + "attDefaultValue": "", + "attExplain": "", + "number": 1 + } + ] + } + ], + "coordinate": { + "longitude": 124.74107151788, + "latitude": 26.74143394432, + "height": -498.06469972014 + }, + "number": 10, + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1" + } + ], + "targetId": "0c058874-0c12-4902-8fd0-2cde015965e1", + "warZoneLocation": [ + { + "longitude": 122.18971775079, + "latitude": 28.64177652916, + "height": -99.95248993318 + }, + { + "longitude": 127.22874089381, + "latitude": 28.54075963352, + "height": -1063.0224849918 + }, + { + "longitude": 127.99831970891, + "latitude": 23.81306022325, + "height": -5900.62524601637 + }, + { + "longitude": 120.14866648107, + "latitude": 23.90272134296, + "height": -22.17614107099 + } + ], + "defZoneLocation": [] + } + ], + "TrackParam": { + "routeLine_220e5b3c-270d-4006-87f0-a0ab4b22deda": { + "name": "F-22航线1", + "StartTime": 0, + "EndTime": 1657, + "TrackType": "routeLineAir", + "HeightType": "msl", + "seaType": "seaLevel", + "TrackPoints": [ + { + "index": "1", + "longitude": "124.69258218394617", + "latitude": "27.801527639000142", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "2", + "longitude": "122.9223606765063", + "latitude": "27.585793910609084", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "3", + "longitude": "121.59995205693548", + "latitude": "27.41556157737817", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "4", + "longitude": "121.00161216798338", + "latitude": "27.07354384591234", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "5", + "longitude": "121.0190476615353", + "latitude": "26.599336790536423", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "6", + "longitude": "121.67869100949231", + "latitude": "26.183061747705537", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "7", + "longitude": "123.7900051477299", + "latitude": "25.733670416880216", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + }, + { + "index": "8", + "longitude": "125.47545066085917", + "latitude": "26.136857380879235", + "height": "6000", + "speed": "600", + "psia": "0", + "time": 0, + "active": "null" + } + ], + "Color": "rgb(4,161,246)", + "PointCount": 8 + }, + "Groups": [ + { + "allAngle": 0, + "drawName": "J15编组1", + "editPermission": [], + "groupType": "addGroup", + "id": "5dea9ff7-5e45-4f8e-a67f-3ff4187c39ed", + "idKey": "id", + "isSelected": false, + "isShow": false, + "leader": "7a16c098-ceec-4c4d-8a24-8f44976a90ca", + "name": "addGroup", + "parentId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_batFormation", + "permission": [ + "14bc8ff9-3c93-4218-b01a-e144add196f9" + ], + "show": false, + "sort": 1774271497726, + "wingmanData": [ + { + "alt": 40, + "angle": "50", + "distance": 100, + "key": 0, + "name": "9aa9e5aa-9273-4c27-88e1-e582ff561685" + } + ] + } + ], + "redWeapons": [ + { + "SupportType": "car", + "TroopsDetail": {}, + "Platform_type": "HQ-9发射车", + "isStrikeTarget": false, + "isReconTarget": false, + "isInterferenceTarget": false, + "isDefendImportantPlace": false, + "groupType": "equipment", + "EquipmentID": "b3c6de29-2b27-4500-a9ce-95d0bebc5cb9", + "Name": "HQ-9发射车--5", + "OwnerForceSide": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "PlatID": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_equipmentPlane", + "SubComponents": { + "communication": [ + { + "ObjectHandle": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "arithmetic": { + "id": "66cd29fdce08f520f1d9bf0e", + "name": "短波电台" + }, + "device": { + "id": "5e0e5b064f1fae2ee9fa1000", + "name": "3MHZ通信电台", + "refId": "5e0e5b064f1fae2ee9fa1000" + }, + "deviceId": "0b700ca6-290e-422a-b4e3-73b222809938", + "deviceName": "3MHZ通信电台", + "employLabel": false, + "facilityName": "3MHZ通信电台", + "soleId": "3ed86636-a33a-41ac-aff2-0627eb1f9b28", + "twiceModified": {}, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "motorized_assembly": [ + { + "ObjectHandle": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "arithmetic": {}, + "device": {}, + "deviceId": "55915bc4-c825-43c4-93eb-6a76ab345e42", + "deviceName": "", + "soleId": "83ea5d33-90f4-4fd8-9121-eced6c7a44ea", + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ], + "platform": [ + { + "ObjectHandle": "04a96dbc-837a-48be-8c04-e4f53586c47e", + "arithmetic": { + "id": "68876d0fd41989f086e905b8", + "name": "通用发射车算法" + }, + "device": { + "id": "68876d2dd41989f086e905b9", + "name": "发射车平台", + "refId": "68876d2dd41989f086e905b9" + }, + "deviceId": "164c75ec-6db5-48f9-8285-a7e726fd2a11", + "deviceName": "发射车平台", + "employLabel": false, + "facilityName": "发射车平台", + "soleId": "87905d6b-857a-4c5a-a922-5e2d191588d4", + "twiceModified": {}, + "zLists": [], + "TrackParamId": "", + "positions": [ + 119.28585462691, + 25.67974332623, + 34.28352933882 + ] + } + ], + "weapon": [ + { + "ObjectHandle": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "arithmetic": { + "id": "669dd6356bc286bd64e5d66c", + "name": "发射架算法" + }, + "codedQueue": "weapon.launcher", + "configuration": { + "classifyName": "导弹平台", + "isMount": 1, + "mountedWeapon": { + "_id": "68f681794ddde62a52c7e569", + "name": "HQ-9" + }, + "number": 4 + }, + "device": { + "id": "67ff279dafa7ea5aaa3a1236", + "name": "通用发射架", + "refId": "b9665788-9437-40fb-8a24-eff3d4d3b529" + }, + "deviceId": "4e910ccf-d937-4a93-9b68-116167eda202", + "deviceName": "通用发射架", + "employLabel": false, + "facilityName": "通用发射架", + "serialNumber": "launcher", + "soleId": "4e575d4d-2f36-436b-9939-0b96cde96b89", + "twiceModified": { + "launcherType": "sam" + }, + "zLists": [], + "ParentPlat": "04a96dbc-837a-48be-8c04-e4f53586c47e" + } + ] + } + } + ] + }, + "Tasks": [ + { + "color": "rgb(220,39,39)", + "dataType": "taskPlane", + "drawName": "HQ-9发射车--3打击任务", + "groupType": "tasks", + "id": "41d3c5ce-3fda-4dee-a38f-fd3ae7e15e69", + "idKey": "id", + "isSelected": false, + "name": "HQ-9发射车--3打击任务", + "parentId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831_taskPlane", + "permission": [ + "14bc8ff9-3c93-4218-b01a-e144add196f9", + "56a96b1b-14a8-4daf-a2d0-47c7faa4b831" + ], + "show": true, + "side": "红方", + "sort": 1774271151846, + "task": { + "at_time": "180", + "attackId": "267c5d87-bf36-42f2-b0a8-09c608d94b62", + "color": "rgb(220,39,39)", + "departureAirport": "", + "execute": [ + { + "targetList": [ + { + "ID": "fbddc49c-f7b0-4d07-8000-1b5a2633c461", + "arrayPositionId": 4, + "arrayPositionIdBak": "", + "at_time": { + "timeUp": true, + "value": 180 + }, + "attackType": "", + "boost": "", + "bootTime": "", + "companion": "", + "cruiseRouteId": "routeLine_f01be820-33ca-4843-8354-3f93a9986fe3", + "cruiseRouteOffset": [ + { + "UpOrDown": true, + "value": 0 + }, + { + "BeforeOrAfter": true, + "value": 0 + }, + { + "LeftOrRight": true, + "value": 0 + } + ], + "moveRouteId": "routeLine_de092f0b-d8a3-4382-8e46-398efae3649c", + "fireType": "absolute", + "strategy": [], + "targetId": "dd20d7d9-7ce8-4531-aa0c-0b2056e7fbcd", + "times_interval": 1, + "weaponId": "HQ-9", + "weaponRelease": "", + "weaponType": "", + "weaponUseCount": 3 + } + ], + "type": "assault" + } + ], + "landAirport": "", + "missionList": [ + { + "label": "HQ-9(4)", + "launcherType": "sam", + "number": 4, + "value": "HQ-9" + } + ], + "name": "HQ-9发射车--3打击任务", + "side": "红方", + "sideId": "56a96b1b-14a8-4daf-a2d0-47c7faa4b831", + "speed": 600, + "type": "assault", + "weaponId": "" + } + } + ] +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/rules/rule.drl b/auto-solution-rule/src/main/resources/rules/rule.drl index 0ac479b..b059f40 100644 --- a/auto-solution-rule/src/main/resources/rules/rule.drl +++ b/auto-solution-rule/src/main/resources/rules/rule.drl @@ -6,6 +6,7 @@ import java.util.Map; import static com.solution.rule.utils.RuleFunction.equipmentRule; import static com.solution.rule.utils.RuleFunction.target; import static com.solution.rule.utils.RuleFunction.position; +import static com.solution.rule.utils.RuleFunction.trackRoute; global java.util.Map globalParams; @@ -147,6 +148,34 @@ function Map buildParam(){ // minInterPlatformDistanceMeters:平台最小间距(米)下限,用于抑制平台点位过度重叠。 param.put("minInterPlatformDistanceMeters", 80); + // ===================== 航迹规则参数(写入 TrackParam 动态 key + execute.targetList.moveRouteId) ===================== + // trackRuleEnabled:是否启用航迹生成与 moveRouteId 绑定。 + param.put("trackRuleEnabled", true); + // trackRouteAlgorithm:航迹变形算法。followBlue(默认) / shortestPath / flank / jam + param.put("trackRouteAlgorithm", "followBlue"); + // trackRouteNameSuffix:航迹名称 = 红方任务 drawName + 此后缀(默认「航迹」→ 如 xxx打击任务航迹) + param.put("trackRouteNameSuffix", "航迹"); + // trackAirDataTypeCsv:蓝方 dataType 命中任一子串(忽略大小写)则 TrackType=routeLineAir + param.put("trackAirDataTypeCsv", "taskPlane,air,plane,flight"); + // trackAirKeywordsCsv:蓝方 drawName 或红方 name/platformType 命中任一子串则视为飞行航迹 + param.put("trackAirKeywordsCsv", "机,飞,空,J-,F-,无人机,直升机"); + // trackGroundTrackType:非飞行类时 TrackType 取值(可先占位,后续再接地面路网) + param.put("trackGroundTrackType", "routeLineGround"); + // 航迹侧向算法复用上方「阵位规则」中的 trackPointDirectionMode(head2next / tail2prev);缺省回退见 trackFallbackBearingDeg + param.put("trackFallbackBearingDeg", 0); + // enableTrackWarZoneClamp:航迹点是否约束在 warZoneLocation 多边形内 + param.put("enableTrackWarZoneClamp", true); + // trackExtraNodesMax:在蓝方航迹点基础上最多额外插入的点数(0=与蓝方点数持平;>0 时在中段均匀插值) + param.put("trackExtraNodesMax", 0); + // shortestPath:相邻两点间直线插值分段数(>=1),越大折线越平滑(非真实路网最短路径) + param.put("trackShortPathSegments", 3); + // flank:侧向偏移距离(米);trackFlankSideMode:alternate / left / right + param.put("trackFlankOffsetMeters", 800); + param.put("trackFlankSideMode", "alternate"); + // jam:正弦扰动振幅(米)、沿航迹起伏周期数(越大摆动越密) + param.put("trackJamWobbleMeters", 400); + param.put("trackJamSegments", 4); + return param; } @@ -179,3 +208,13 @@ then globalParams.putAll(buildParam()); position($fact, globalParams); end + +rule "航迹匹配" +salience 70 +when + $fact : DroolsFact(task != null) +then + // 显式航迹规则:填充 TrackParam 下各航迹 id,并绑定 execute[0].targetList[*].moveRouteId + globalParams.putAll(buildParam()); + trackRoute($fact, globalParams); +end diff --git a/auto-solution-system/Dockerfile b/auto-solution-system/Dockerfile new file mode 100644 index 0000000..9fd6682 --- /dev/null +++ b/auto-solution-system/Dockerfile @@ -0,0 +1,4 @@ +FROM ubuntu:latest +LABEL authors="admin" + +ENTRYPOINT ["top", "-b"] \ No newline at end of file From 78e5833514b69019a772b8b5d2593dc527fd929e Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 15:13:10 +0800 Subject: [PATCH 07/11] docker --- .dockerignore | 9 + .env.example | 15 + .gitignore | 4 + Dockerfile | 18 + .../src/main/resources/application-docker.yml | 23 + auto-solution-system/Dockerfile | 8 +- docker-compose.yml | 94 ++ docker/README.md | 52 + docker/mysql/init/.gitkeep | 0 docker/mysql/init/README.md | 30 + .../_localhost-2026_04_09_10_53_40-dump.sql | 1413 +++++++++++++++++ 11 files changed, 1662 insertions(+), 4 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 auto-solution-admin/src/main/resources/application-docker.yml create mode 100644 docker-compose.yml create mode 100644 docker/README.md create mode 100644 docker/mysql/init/.gitkeep create mode 100644 docker/mysql/init/README.md create mode 100644 docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dbea581 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +**/target/ +**/.git/ +**/.idea/ +**/*.iml +**/.vscode/ +**/node_modules/ +**/*.log +**/.DS_Store +**/uploadPath/ diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..1092d27 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# 复制为 .env 后 docker compose 会自动加载 +# copy .env.example .env + +MYSQL_ROOT_PASSWORD=1234 +MYSQL_DATABASE=autosolution_db +MYSQL_PORT=3307 + +REDIS_PASSWORD=123456 +REDIS_PORT=6379 + +APP_PORT=1777 +APP_IMAGE_TAG=latest + +# JVM 可选 +# JAVA_OPTS=-Xms512m -Xmx1024m diff --git a/.gitignore b/.gitignore index 9e71bd7..b00e37d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,10 @@ dist/ nbdist/ .nb-gradle/ +###################################################################### +# Docker / local secrets +.env + ###################################################################### # Others *.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bb84118 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +# 运行已打包的 JAR(不依赖源码目录) +# 要求构建上下文中存在 solution-admin.jar +# 构建:docker build -t auto-solution-admin:latest . + +FROM eclipse-temurin:8-jre-jammy +LABEL org.opencontainers.image.title="auto-solution-admin" + +WORKDIR /app +RUN mkdir -p /app/uploadPath + +COPY solution-admin.jar /app/app.jar + +ENV TZ=Asia/Shanghai \ + JAVA_OPTS="-Xms512m -Xmx1024m" + +EXPOSE 8080 + +ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar --spring.profiles.active=druid,docker"] diff --git a/auto-solution-admin/src/main/resources/application-docker.yml b/auto-solution-admin/src/main/resources/application-docker.yml new file mode 100644 index 0000000..470815e --- /dev/null +++ b/auto-solution-admin/src/main/resources/application-docker.yml @@ -0,0 +1,23 @@ +# Docker / docker-compose 环境:与 application.yml 的 druid 配置叠加使用 +# 启动:-Dspring.profiles.active=druid,docker +spring: + devtools: + restart: + enabled: false + redis: + host: ${REDIS_HOST:redis} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD:} + database: ${REDIS_DB:0} + datasource: + druid: + master: + url: jdbc:mysql://${MYSQL_HOST:mysql}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:autosolution_db}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 + username: ${MYSQL_USER:root} + password: ${MYSQL_PASSWORD:root} + +server: + port: ${SERVER_PORT:8080} + +solution: + profile: ${SOLUTION_UPLOAD_PATH:/app/uploadPath} diff --git a/auto-solution-system/Dockerfile b/auto-solution-system/Dockerfile index 9fd6682..45784ef 100644 --- a/auto-solution-system/Dockerfile +++ b/auto-solution-system/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:latest -LABEL authors="admin" - -ENTRYPOINT ["top", "-b"] \ No newline at end of file +# 已废弃:请在仓库根目录使用 Dockerfile 与 docker-compose.yml 构建镜像。 +# Deprecated — use the Dockerfile at the repository root. +FROM alpine:3.19 +RUN echo "ERROR: build from repo root (../Dockerfile). See docker/README.md" >&2 && exit 1 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0b613b4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,94 @@ +# 若依后端 + MySQL 8 + Redis 7 +# 使用:1) 将 SQL 放入 docker/mysql/init/(见该目录 README) +# 2) 复制 .env.example 为 .env 并按需修改密码 +# 3) docker compose up -d --build +# +# 应用访问:http://localhost:1777(容器内 8080 映射到宿主机 1777) + +services: + mysql: + image: mysql:8.0 + container_name: autosolution-mysql + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + MYSQL_DATABASE: ${MYSQL_DATABASE:-autosolution_db} + TZ: Asia/Shanghai + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --default-authentication-plugin=mysql_native_password + ports: + - "${MYSQL_PORT:-3307}:3306" + volumes: + - mysql_data:/var/lib/mysql + - ./docker/mysql/init:/docker-entrypoint-initdb.d:ro + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 40s + + redis: + image: redis:7-alpine + container_name: autosolution-redis + restart: unless-stopped + environment: + REDIS_PASSWORD: ${REDIS_PASSWORD:-} + entrypoint: ["/bin/sh", "-c"] + command: + - | + if [ -n "$$REDIS_PASSWORD" ]; then + exec redis-server --appendonly yes --requirepass "$$REDIS_PASSWORD" + else + exec redis-server --appendonly yes + fi + ports: + - "${REDIS_PORT:-6379}:6379" + volumes: + - redis_data:/data + healthcheck: + test: + [ + "CMD-SHELL", + 'if [ -n "$$REDIS_PASSWORD" ]; then redis-cli -a "$$REDIS_PASSWORD" ping | grep -q PONG; else redis-cli ping | grep -q PONG; fi', + ] + interval: 5s + timeout: 3s + retries: 5 + + app: + # 运行已构建好的应用镜像(推荐:在有网络的机器上 docker build,然后 docker save/load 到 CentOS) + # 如需在本机从 Dockerfile 构建,请在另一份 compose 文件中加入 build 配置,或临时手动 docker build。 + image: auto-solution-admin:${APP_IMAGE_TAG:-latest} + container_name: autosolution-app + restart: unless-stopped + depends_on: + mysql: + condition: service_healthy + redis: + condition: service_healthy + environment: + MYSQL_HOST: mysql + MYSQL_PORT: "3306" + MYSQL_DATABASE: ${MYSQL_DATABASE:-autosolution_db} + MYSQL_USER: root + MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + REDIS_HOST: redis + REDIS_PORT: "6379" + REDIS_PASSWORD: ${REDIS_PASSWORD:-} + REDIS_DB: "0" + SERVER_PORT: "8080" + SOLUTION_UPLOAD_PATH: /app/uploadPath + TZ: Asia/Shanghai + JAVA_OPTS: ${JAVA_OPTS:--Xms512m -Xmx1024m} + ports: + - "${APP_PORT:-1777}:8080" + volumes: + - app_upload:/app/uploadPath + +volumes: + mysql_data: + redis_data: + app_upload: diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..3e42163 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,52 @@ +# Docker 部署说明 + +## 前置条件 + +- 安装 [Docker Desktop](https://www.docker.com/products/docker-desktop/)(Windows 需开启 WSL2)。 +- 项目根目录:`auto-solution`(与 `Dockerfile`、`docker-compose.yml` 同级)。 + +## 快速开始 + +1. **准备数据库脚本**(首次必做) + 将 SQL 放到 `docker/mysql/init/`,详见 [mysql/init/README.md](mysql/init/README.md)。 + +2. **环境变量(可选)** + + ```bash + copy .env.example .env + ``` + + 按需修改 `MYSQL_ROOT_PASSWORD`、`REDIS_PASSWORD` 等;若 Redis 设密码,需在 `.env` 中填写 `REDIS_PASSWORD`,并与应用一致。 + +3. **构建并启动** + + ```bash + docker compose build + docker compose up -d + ``` + +4. **访问** + + - 后端:(默认映射,可在 `.env` 改 `APP_PORT`) + - MySQL:宿主机端口默认 `3307`(避免与本机 3306 冲突) + - Redis:宿主机端口默认 `6379`(与容器内端口一致,可通过 `.env` 中 `REDIS_PORT` 修改) + +## 仅构建应用镜像 + +```bash +docker build -t auto-solution-admin:latest . +``` + +## 配置说明 + +- 容器内使用 Spring 配置:`druid` + `docker`,见 `auto-solution-admin/src/main/resources/application-docker.yml`。 +- 数据源与 Redis 主机名在 Compose 中为 `mysql`、`redis`,勿改服务名除非同步改配置。 + +## 上传文件 + +附件目录使用数据卷 `app_upload`,持久化在 Docker volume `autosolution_app_upload`(名称前缀随项目目录可能略有不同)。 + +## 常见问题 + +- **应用连不上库**:确认 MySQL 健康检查已通过;`init` SQL 是否已执行(空库首次启动才会执行)。 +- **Redis 认证失败**:本仓库 `application.yml` 里开发环境 Redis 带密码;Compose 中 Redis 默认无密码。若需密码,在 `.env` 设置 `REDIS_PASSWORD`,并确保与 `application-docker.yml` 中 `REDIS_PASSWORD` 环境变量一致(已支持 `${REDIS_PASSWORD}`)。 diff --git a/docker/mysql/init/.gitkeep b/docker/mysql/init/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docker/mysql/init/README.md b/docker/mysql/init/README.md new file mode 100644 index 0000000..9eb1ee4 --- /dev/null +++ b/docker/mysql/init/README.md @@ -0,0 +1,30 @@ +# MySQL 首次初始化 SQL + +MySQL 官方镜像会在**数据目录为空**时,按文件名顺序执行本目录下: + +- `*.sql` +- `*.sql.gz` +- `*.sh` + +## 你需要做的事 + +1. 从本机现有库导出(示例): + + ```bash + mysqldump -uroot -p --databases autosolution_db --single-transaction --quick > docker/mysql/init/01-autosolution_db.sql + ``` + +2. 或放入若依官方 `ry_*.sql` 与 Quartz 等脚本,**按依赖顺序**命名前缀(如 `01-`、`02-`)。 + +3. 若容器/卷里已经有数据,这些脚本**不会再次执行**。需要重新初始化时: + + ```bash + docker compose down -v + docker compose up -d + ``` + + 注意:`-v` 会删除 `mysql_data` 卷,请确认无重要数据。 + +## 字符集 + +`docker-compose.yml` 中 MySQL 已配置 `utf8mb4`,导入脚本建议同为 UTF-8。 diff --git a/docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql b/docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql new file mode 100644 index 0000000..2e8ed01 --- /dev/null +++ b/docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql @@ -0,0 +1,1413 @@ +-- MySQL dump 10.13 Distrib 8.0.34, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: autosolution_db +-- ------------------------------------------------------ +-- Server version 8.0.34 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `afsim_scenario` +-- + +DROP TABLE IF EXISTS `afsim_scenario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `afsim_scenario` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `scenario_path` varchar(255) DEFAULT NULL, + `communication_graph` longtext COMMENT '用于存储场景中的通讯关系', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='场景配置表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `afsim_scenario` +-- + +LOCK TABLES `afsim_scenario` WRITE; +/*!40000 ALTER TABLE `afsim_scenario` DISABLE KEYS */; +INSERT INTO `afsim_scenario` (`id`, `name`, `description`, `scenario_path`, `communication_graph`) VALUES (1,'s1','一个简单的初级场景,用于描述位置关系','D:/work/scenarios/afsim-scenarios','{\"nodes\":[{\"id\":0,\"key\":\"mmtxg7x4_pladl9bs\",\"type\":\"scenario\",\"name\":\"red_commander\",\"platformId\":3,\"components\":[{\"id\":72,\"name\":\"com\",\"type\":\"comm\",\"description\":\"指挥官通信器\",\"platformId\":3,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方指挥官\",\"order\":0,\"position\":{\"x\":-320,\"y\":280},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"7372de0b-c329-44b9-bed8-309c8a4e8026\",\"source\":\"mmtxg7x4_pladl9bs\",\"sourceName\":\"red_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mmtxgi8p_a84ugty5\",\"targetName\":\"red_nebo_m_3\"},{\"id\":0,\"key\":\"8d778d1b-834e-4552-b2de-58d06ac30025\",\"source\":\"mmtxg7x4_pladl9bs\",\"sourceName\":\"red_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mmtxggns_q1faakn1\",\"targetName\":\"red_nebo_m_2\"},{\"id\":0,\"key\":\"333a7baf-776b-4661-8f00-1413cfe68854\",\"source\":\"mmtxg7x4_pladl9bs\",\"sourceName\":\"red_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mmtxgfh3_u0eu9i4r\",\"targetName\":\"red_nebo_m_1\"},{\"id\":0,\"key\":\"06c260aa-76ff-4cf7-a1af-c0c6209aa9b1\",\"source\":\"mmtxg7x4_pladl9bs\",\"sourceName\":\"red_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mmtxg9mv_5eqg6lvl\",\"targetName\":\"red_buk_m3\"},{\"id\":0,\"key\":\"3b496b09-1cfa-4f3a-81c8-8f561760a96b\",\"source\":\"mmtxg7x4_pladl9bs\",\"sourceName\":\"red_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mmtxgcy9_9bya305v\",\"targetName\":\"red_s400\"}]},{\"id\":0,\"key\":\"mmtxg9mv_5eqg6lvl\",\"type\":\"scenario\",\"name\":\"red_buk_m3\",\"platformId\":9,\"components\":[{\"id\":77,\"name\":\"com\",\"type\":\"comm\",\"description\":\"防空导弹通信\",\"platformId\":9,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方Buk-M3防空系统\",\"order\":0,\"position\":{\"x\":480,\"y\":220},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mmtxgcy9_9bya305v\",\"type\":\"scenario\",\"name\":\"red_s400\",\"platformId\":8,\"components\":[{\"id\":76,\"name\":\"com\",\"type\":\"comm\",\"description\":\"防空导弹通信\",\"platformId\":8,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方S-400防空系统\",\"order\":0,\"position\":{\"x\":480,\"y\":500},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mmtxgfh3_u0eu9i4r\",\"type\":\"scenario\",\"name\":\"red_nebo_m_1\",\"platformId\":5,\"components\":[{\"id\":73,\"name\":\"com\",\"type\":\"comm\",\"description\":\"雷达通信\",\"platformId\":5,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方Nebo-M雷达1\",\"order\":0,\"position\":{\"x\":140,\"y\":120},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mmtxggns_q1faakn1\",\"type\":\"scenario\",\"name\":\"red_nebo_m_2\",\"platformId\":6,\"components\":[{\"id\":74,\"name\":\"com\",\"type\":\"comm\",\"description\":\"雷达通信\",\"platformId\":6,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方Nebo-M雷达2\",\"order\":0,\"position\":{\"x\":140,\"y\":340},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mmtxgi8p_a84ugty5\",\"type\":\"scenario\",\"name\":\"red_nebo_m_3\",\"platformId\":7,\"components\":[{\"id\":75,\"name\":\"com\",\"type\":\"comm\",\"description\":\"雷达通信\",\"platformId\":7,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"红方Nebo-M雷达3\",\"order\":0,\"position\":{\"x\":100,\"y\":600},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"5cb84aed-c9f5-4361-8bff-f9a8cbd87c96\",\"type\":\"edge\",\"sourcePort\":\"out-72\",\"source\":{\"cell\":\"mmtxg7x4_pladl9bs\",\"port\":\"out-72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mmtxgi8p_a84ugty5\",\"port\":\"out-75\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"targetPort\":\"out-75\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5482510000000184}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"577dcbfb-58d3-49eb-9b25-f1ade0b69f93\",\"type\":\"edge\",\"sourcePort\":\"out-72\",\"source\":{\"cell\":\"mmtxg7x4_pladl9bs\",\"port\":\"out-72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mmtxggns_q1faakn1\",\"port\":\"out-74\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"targetPort\":\"out-74\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5482510000000184}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a306a8dc-ed08-4852-b82a-b517d14b394c\",\"type\":\"edge\",\"sourcePort\":\"out-72\",\"source\":{\"cell\":\"mmtxg7x4_pladl9bs\",\"port\":\"out-72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mmtxgfh3_u0eu9i4r\",\"port\":\"out-73\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"targetPort\":\"out-73\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5482510000000184}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"7a272565-13b2-4862-8d53-b6b342ed16d8\",\"type\":\"edge\",\"sourcePort\":\"out-72\",\"source\":{\"cell\":\"mmtxg7x4_pladl9bs\",\"port\":\"out-72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mmtxg9mv_5eqg6lvl\",\"port\":\"in-77\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-77\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5482510000000184}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"af9d9437-0ccb-416f-928e-6bbe75dea659\",\"type\":\"edge\",\"sourcePort\":\"out-72\",\"source\":{\"cell\":\"mmtxg7x4_pladl9bs\",\"port\":\"out-72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mmtxgcy9_9bya305v\",\"port\":\"in-76\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-76\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5482510000000184}},\"router\":{},\"connector\":null}]}'),(2,'Position_deployment','直升机进入空降场景,部署场地','D:/work/scenarios/afsim-scenarios','{\"nodes\":[{\"id\":0,\"key\":\"mn301qol_lkw9l1pf\",\"type\":\"scenario\",\"name\":\"01_cmd_comm_1\",\"platformId\":40,\"components\":[{\"id\":83,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":40,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"指挥车\",\"order\":0,\"position\":{\"x\":420,\"y\":300},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"61cc9418-0caf-4acd-b178-aab96cdf0672\",\"source\":\"mn301qol_lkw9l1pf\",\"sourceName\":\"01_cmd_comm_1\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn301sxp_p3knatd2\",\"targetName\":\"01_jam_type_1\"},{\"id\":0,\"key\":\"b35b79b0-5aa4-49a6-a728-57032ac8446b\",\"source\":\"mn301qol_lkw9l1pf\",\"sourceName\":\"01_cmd_comm_1\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn301v50_y1kvlkdg\",\"targetName\":\"01_jam_type_2\"},{\"id\":0,\"key\":\"78c0f468-347f-4159-8402-bd4430b454d0\",\"source\":\"mn301qol_lkw9l1pf\",\"sourceName\":\"01_cmd_comm_1\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn301zd7_89s9wgii\",\"targetName\":\"01_sensor_type_1\"},{\"id\":0,\"key\":\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\",\"source\":\"mn301qol_lkw9l1pf\",\"sourceName\":\"01_cmd_comm_1\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn3021tw_6sf8eu5e\",\"targetName\":\"01_sensor_type_2\"}]},{\"id\":0,\"key\":\"mn301sxp_p3knatd2\",\"type\":\"scenario\",\"name\":\"01_jam_type_1\",\"platformId\":38,\"components\":[{\"id\":81,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":38,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"干扰车1\",\"order\":0,\"position\":{\"x\":900,\"y\":140},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mn301v50_y1kvlkdg\",\"type\":\"scenario\",\"name\":\"01_jam_type_2\",\"platformId\":39,\"components\":[{\"id\":82,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":39,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"干扰车2\",\"order\":0,\"position\":{\"x\":900,\"y\":340},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mn301zd7_89s9wgii\",\"type\":\"scenario\",\"name\":\"01_sensor_type_1\",\"platformId\":36,\"components\":[{\"id\":79,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":36,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"雷达车1\",\"order\":0,\"position\":{\"x\":880,\"y\":560},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mn3021tw_6sf8eu5e\",\"type\":\"scenario\",\"name\":\"01_sensor_type_2\",\"platformId\":37,\"components\":[{\"id\":80,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":37,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"group\":null,\"description\":\"雷达车2\",\"order\":0,\"position\":{\"x\":900,\"y\":760},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mn8a9n26_jh0325by\",\"type\":\"scenario\",\"name\":\"Chief_Commander\",\"platformId\":42,\"components\":[{\"id\":84,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":42,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"总指挥官\",\"order\":0,\"position\":{\"x\":-200,\"y\":300},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"f69b897a-8d83-4467-9ff7-ea179c7c4121\",\"source\":\"mn8a9n26_jh0325by\",\"sourceName\":\"Chief_Commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn301qol_lkw9l1pf\",\"targetName\":\"01_cmd_comm_1\"},{\"id\":0,\"key\":\"990c919a-b783-46ea-aa23-5bee9e045e1e\",\"source\":\"mn8a9n26_jh0325by\",\"sourceName\":\"Chief_Commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn8bdy6i_lmilaxbh\",\"targetName\":\"Loitering_commander\"},{\"id\":0,\"key\":\"f2715340-e173-4876-945e-48e2b7d05406\",\"source\":\"mn8a9n26_jh0325by\",\"sourceName\":\"Chief_Commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn8cwue1_cf4bqkqa\",\"targetName\":\"howitzer_commander\"}]},{\"id\":0,\"key\":\"mn8bdy6i_lmilaxbh\",\"type\":\"scenario\",\"name\":\"Loitering_commander\",\"platformId\":43,\"components\":[{\"id\":85,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":43,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"巡飞弹指挥官\",\"order\":0,\"position\":{\"x\":420,\"y\":640},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b597e6a8-9c52-4c74-8c7b-0171470e490f\",\"source\":\"mn8bdy6i_lmilaxbh\",\"sourceName\":\"Loitering_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn8be6tl_378a1qwc\",\"targetName\":\"Loiter2\"},{\"id\":0,\"key\":\"eed98ac3-75a2-4ecf-96e7-b18478349aad\",\"source\":\"mn8bdy6i_lmilaxbh\",\"sourceName\":\"Loitering_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn8be5c0_d8br5lfd\",\"targetName\":\"Loiter1\"},{\"id\":0,\"key\":\"d4dc8ee1-64f4-4d64-86ae-4d513e6a470c\",\"source\":\"mn8bdy6i_lmilaxbh\",\"sourceName\":\"Loitering_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mne9c4ja_qv0fvdri\",\"targetName\":\"Loiter2\"}]},{\"id\":0,\"key\":\"mn8be5c0_d8br5lfd\",\"type\":\"scenario\",\"name\":\"Loiter1\",\"platformId\":44,\"components\":[{\"id\":86,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":44,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"巡飞弹1\",\"order\":0,\"position\":{\"x\":760,\"y\":1100},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mn8cwue1_cf4bqkqa\",\"type\":\"scenario\",\"name\":\"howitzer_commander\",\"platformId\":47,\"components\":[{\"id\":89,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":47,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"迫击榴弹炮指挥官\",\"order\":0,\"position\":{\"x\":420,\"y\":20},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"07e092c5-03a7-472c-a496-4b8cd085a75a\",\"source\":\"mn8cwue1_cf4bqkqa\",\"sourceName\":\"howitzer_commander\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"mn8cww3c_wn0kgfk3\",\"targetName\":\"howitzer\"}]},{\"id\":0,\"key\":\"mn8cww3c_wn0kgfk3\",\"type\":\"scenario\",\"name\":\"howitzer\",\"platformId\":46,\"components\":[{\"id\":88,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":46,\"num\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"迫击榴弹炮\",\"order\":0,\"position\":{\"x\":900,\"y\":-120},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"mne9c4ja_qv0fvdri\",\"type\":\"scenario\",\"name\":\"Loiter2\",\"platformId\":45,\"components\":[{\"id\":87,\"name\":\"radio\",\"type\":\"comm\",\"description\":\"通讯设备\",\"platformId\":45,\"num\":null,\"platformParams\":null}],\"template\":0,\"templateType\":null,\"category\":null,\"multiable\":false,\"group\":null,\"description\":\"巡飞弹2\",\"order\":0,\"position\":{\"x\":740,\"y\":1280},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"9a2fd7b8-64b8-4197-bf1e-7141a70f1f53\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301sxp_p3knatd2\",\"port\":\"in-81\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-81\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"56f3f3ef-522b-4cf8-997a-4caea95b4ea3\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301v50_y1kvlkdg\",\"port\":\"in-82\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-82\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"74f960e4-7912-45ca-b6cf-848cd1752974\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301zd7_89s9wgii\",\"port\":\"in-79\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-79\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"429f6828-dab2-4ccf-8db6-4988f4ad9227\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn3021tw_6sf8eu5e\",\"port\":\"in-80\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-80\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"44aeb7b5-0f15-44ae-acc5-52cc9e95cc57\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"in-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-83\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"8eda5cb5-8ca8-49f7-a78d-7d76624b33ce\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8bdy6i_lmilaxbh\",\"port\":\"in-85\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-85\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b6b075dc-7d93-43dd-a68d-b00443fdfd03\",\"type\":\"edge\",\"sourcePort\":\"out-85\",\"source\":{\"cell\":\"mn8bdy6i_lmilaxbh\",\"port\":\"out-85\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8be5c0_d8br5lfd\",\"port\":\"in-86\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-86\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"1e484b2f-310a-45d8-b375-71e80df9a8f9\",\"type\":\"edge\",\"sourcePort\":\"out-89\",\"source\":{\"cell\":\"mn8cwue1_cf4bqkqa\",\"port\":\"out-89\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8cww3c_wn0kgfk3\",\"port\":\"in-88\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-88\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a4d6dc17-de2b-481e-a163-cf4e01152221\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8cwue1_cf4bqkqa\",\"port\":\"in-89\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-89\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.35770000000000074}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"35c3cb4d-210b-49ca-9ae8-a54b7cbaf42a\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301sxp_p3knatd2\",\"port\":\"in-81\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-81\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b76fdc0b-d22c-4493-ba08-4da45a69552e\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301v50_y1kvlkdg\",\"port\":\"in-82\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-82\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"70b1bd82-e11d-402c-bf15-40c17d41fa5d\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301zd7_89s9wgii\",\"port\":\"in-79\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-79\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f02a7da4-8684-45d2-8ccb-c68d3790554d\",\"type\":\"edge\",\"sourcePort\":\"out-83\",\"source\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"out-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn3021tw_6sf8eu5e\",\"port\":\"in-80\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-80\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"14f7227b-390a-4b3a-a23d-09181c17a48f\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn301qol_lkw9l1pf\",\"port\":\"in-83\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-83\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ddda7779-8792-4484-992c-6434d89ccc4a\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8bdy6i_lmilaxbh\",\"port\":\"in-85\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-85\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ad2506df-b1f8-4116-abd1-6d2e68c59461\",\"type\":\"edge\",\"sourcePort\":\"out-85\",\"source\":{\"cell\":\"mn8bdy6i_lmilaxbh\",\"port\":\"out-85\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8be5c0_d8br5lfd\",\"port\":\"in-86\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-86\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f8cca0fa-f285-4737-af79-3d1abfcccc10\",\"type\":\"edge\",\"sourcePort\":\"out-89\",\"source\":{\"cell\":\"mn8cwue1_cf4bqkqa\",\"port\":\"out-89\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8cww3c_wn0kgfk3\",\"port\":\"in-88\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-88\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a24223d3-78ec-40d0-b894-24be50e29ea5\",\"type\":\"edge\",\"sourcePort\":\"out-84\",\"source\":{\"cell\":\"mn8a9n26_jh0325by\",\"port\":\"out-84\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mn8cwue1_cf4bqkqa\",\"port\":\"in-89\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-89\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2993999999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"d4dc8ee1-64f4-4d64-86ae-4d513e6a470c\",\"type\":\"edge\",\"sourcePort\":\"out-85\",\"source\":{\"cell\":\"mn8bdy6i_lmilaxbh\",\"port\":\"out-85\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\"},\"target\":{\"cell\":\"mne9c4ja_qv0fvdri\",\"port\":\"in-87\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\"},\"targetPort\":\"in-87\",\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.033299999999999275}},\"router\":{},\"connector\":null}]}'); +/*!40000 ALTER TABLE `afsim_scenario` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `algorithm` +-- + +DROP TABLE IF EXISTS `algorithm`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `algorithm` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(255) NOT NULL COMMENT '算法名称', + `type` varchar(100) NOT NULL COMMENT '算法类型', + `code_path` varchar(500) DEFAULT NULL COMMENT '算法代码路径', + `description` text COMMENT '算法描述', + `algo_config` text COMMENT '算法配置(JSON格式)', + `algo_config_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '算法配置(JSON格式)', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='算法基础信息表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `algorithm` +-- + +LOCK TABLES `algorithm` WRITE; +/*!40000 ALTER TABLE `algorithm` DISABLE KEYS */; +INSERT INTO `algorithm` (`id`, `name`, `type`, `code_path`, `description`, `algo_config`, `algo_config_list`, `create_time`, `update_time`) VALUES (1,'测试133333333','offense','/home/test.pth','测试ddd','参数1+参数2+参数2','[{\"name\":\"参数1\",\"operation\":\"+\"},{\"name\":\"参数2\",\"operation\":\"+\"},{\"name\":\"参数2\",\"operation\":null}]','2026-02-09 16:15:22','2026-02-09 21:01:24'),(3,'3333','formation','33','33','333',NULL,'2026-02-09 17:54:37','2026-02-09 18:03:12'),(6,'66666','defense','66666','66666','66666',NULL,'2026-02-09 19:47:23','2026-02-09 19:47:23'),(7,'77777','defense','77777','77777','77777',NULL,'2026-02-09 19:47:30','2026-02-09 19:47:30'),(8,'888888','offense','888888','888888','888888',NULL,'2026-02-09 19:47:40','2026-02-09 19:47:40'),(9,'999999','formation','999999','999999','999999',NULL,'2026-02-09 19:48:35','2026-02-09 19:48:35'),(10,'100000','offense','100000','100000','100000',NULL,'2026-02-09 19:48:44','2026-02-09 19:48:44'),(11,'1100000','offense','1100000','1100000','1100000',NULL,'2026-02-09 19:49:03','2026-02-09 19:49:03'),(12,'ddd','defense','ddd','ddd','ddd',NULL,'2026-02-09 19:51:27','2026-02-09 19:51:27'); +/*!40000 ALTER TABLE `algorithm` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `algorithm_param` +-- + +DROP TABLE IF EXISTS `algorithm_param`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `algorithm_param` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `algorithm_id` bigint NOT NULL COMMENT '关联的算法ID', + `param_name` varchar(255) NOT NULL COMMENT '参数名称', + `default_value` varchar(500) DEFAULT NULL COMMENT '参数默认值', + `description` text COMMENT '参数描述', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='算法参数配置表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `algorithm_param` +-- + +LOCK TABLES `algorithm_param` WRITE; +/*!40000 ALTER TABLE `algorithm_param` DISABLE KEYS */; +INSERT INTO `algorithm_param` (`id`, `algorithm_id`, `param_name`, `default_value`, `description`, `create_time`, `update_time`) VALUES (2,1,'参数1','333','参数1描述','2026-02-09 21:06:14','2026-02-09 21:06:14'),(4,3,'33','33','33','2026-02-09 18:03:12','2026-02-09 18:03:12'),(5,3,'dd','dd','dd','2026-02-09 18:03:12','2026-02-09 18:03:12'),(8,6,'66666','33555555','33','2026-02-09 19:47:23','2026-02-09 19:47:23'),(9,7,'66666','33555555','33','2026-02-09 19:47:30','2026-02-09 19:47:30'),(10,8,'888888','33555555','33','2026-02-09 19:47:40','2026-02-09 19:47:40'),(11,9,'999999',NULL,NULL,'2026-02-09 19:48:35','2026-02-09 19:48:35'),(12,10,'100000',NULL,NULL,'2026-02-09 19:48:44','2026-02-09 19:48:44'),(13,11,'1100000',NULL,NULL,'2026-02-09 19:49:03','2026-02-09 19:49:03'),(14,12,'ddd',NULL,NULL,'2026-02-09 19:51:27','2026-02-09 19:51:27'),(15,1,'参数2','444','参数2描述','2026-02-09 21:06:14','2026-02-09 21:06:14'); +/*!40000 ALTER TABLE `algorithm_param` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `behaviortree` +-- + +DROP TABLE IF EXISTS `behaviortree`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `behaviortree` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '行为树ID (主键)', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '行为树名称', + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '行为树描述', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + `english_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `graph` longblob COMMENT '储存行为树的节点关系图', + `xml_content` text, + `platform_id` int DEFAULT NULL COMMENT '具体的行为树挂载的平台', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `name` (`name`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=235 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='行为树主表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `behaviortree` +-- + +LOCK TABLES `behaviortree` WRITE; +/*!40000 ALTER TABLE `behaviortree` DISABLE KEYS */; +INSERT INTO `behaviortree` (`id`, `name`, `description`, `created_at`, `updated_at`, `english_name`, `graph`, `xml_content`, `platform_id`) VALUES (197,'行为树0',NULL,'2026-03-11 16:00:00','2026-03-14 08:11:51','tree1',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"condition_mmmtumi4_vdtjzd4b\",\"type\":\"task\",\"template\":121,\"templateType\":\"condition\",\"name\":\"检查雷达雷针朝向1\",\"category\":\"condition\",\"description\":\"判断当前雷达雷针朝向是否与初始朝向一致\",\"position\":{\"x\":960,\"y\":920},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"order\":1},{\"id\":0,\"key\":\"action_mmmtup2x_43ah8rnh\",\"type\":\"task\",\"template\":126,\"templateType\":\"node\",\"name\":\"追击节点1\",\"category\":\"action\",\"description\":\"朝敌方战机飞行\",\"position\":{\"x\":400,\"y\":640},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"order\":1},{\"id\":0,\"key\":\"condition_mmmtv6ch_hv8tyxso\",\"type\":\"task\",\"template\":115,\"templateType\":\"condition\",\"name\":\"检查是否在范围内0\",\"category\":\"condition\",\"description\":\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\",\"position\":{\"x\":60,\"y\":660},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":65,\"templateId\":115,\"paramKey\":\"range\",\"dataType\":\"double\",\"defaultValue\":\"5000\",\"description\":\"防护范围\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":66,\"templateId\":115,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"sam_radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[],\"order\":0},{\"id\":0,\"key\":\"condition_mmmtw5k1_1b3v1fc2\",\"type\":\"task\",\"template\":115,\"templateType\":\"condition\",\"name\":\"检查是否在范围内0\",\"category\":\"condition\",\"description\":\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\",\"position\":{\"x\":580,\"y\":940},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":65,\"templateId\":115,\"paramKey\":\"range\",\"dataType\":\"double\",\"defaultValue\":6000,\"description\":\"防护范围\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":66,\"templateId\":115,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"sam_radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[],\"order\":0},{\"id\":0,\"key\":\"parallel_mmmv7zso_p3kvu6la\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点2\",\"category\":\"parallel\",\"description\":\"中间节点,他的子节点会并行执行\",\"position\":{\"x\":780,\"y\":660},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b2f3e4c5-503a-46cc-85a2-d411694e6802\",\"source\":\"parallel_mmmv7zso_p3kvu6la\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmmtw5k1_1b3v1fc2\",\"targetName\":\"检查是否在范围内\"},{\"id\":0,\"key\":\"dee57993-9321-4494-ac8b-6fc9326d2c5f\",\"source\":\"parallel_mmmv7zso_p3kvu6la\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmmtumi4_vdtjzd4b\",\"targetName\":\"检查雷达雷针朝向\"}],\"order\":2},{\"id\":0,\"key\":\"select_mmmv80ws_50iqlqt4\",\"type\":\"task\",\"template\":3,\"templateType\":\"node\",\"name\":\"选择节点0\",\"category\":\"select\",\"description\":\"中间节点,执行到这里只会选择其中一个节点执行\",\"position\":{\"x\":200,\"y\":420},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"02600e1c-5cf9-474d-a9f5-a2f7d1dfd521\",\"source\":\"select_mmmv80ws_50iqlqt4\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmmtv6ch_hv8tyxso\",\"targetName\":\"检查是否在范围内\"},{\"id\":0,\"key\":\"bd7aead3-2ec9-496b-bfc8-4f27414d7442\",\"source\":\"select_mmmv80ws_50iqlqt4\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmmtup2x_43ah8rnh\",\"targetName\":\"追击节点\"},{\"id\":0,\"key\":\"d3fb6e24-db66-46b6-af43-1127acd6d861\",\"source\":\"select_mmmv80ws_50iqlqt4\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mmmv7zso_p3kvu6la\",\"targetName\":\"并行节点\"}],\"order\":0},{\"id\":0,\"key\":\"root_mmn33z2i_jmtvgkli\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"position\":{\"x\":380,\"y\":160},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"224f3f42-17f5-49fc-a0e0-583b4db07341\",\"source\":\"root_mmn33z2i_jmtvgkli\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"select_mmmv80ws_50iqlqt4\",\"targetName\":\"选择节点0\"}],\"order\":0}],\"edges\":[{\"id\":0,\"key\":\"2455a039-e496-4918-9024-9fef39341646\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmmv80ws_50iqlqt4\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mmmtv6ch_hv8tyxso\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"644e4314-ba78-43d8-9283-06a1b2a3e32b\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmmv80ws_50iqlqt4\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmmtup2x_43ah8rnh\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"110edb52-b1b9-46a8-91f2-9281ac7dbf62\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmmv80ws_50iqlqt4\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mmmv7zso_p3kvu6la\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ff4e86b8-eb2a-4dec-a48a-e6f1ce28b0f0\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmmv7zso_p3kvu6la\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mmmtw5k1_1b3v1fc2\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"97dd256c-fa91-4326-b6af-24ff0a39b648\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmmv7zso_p3kvu6la\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mmmtumi4_vdtjzd4b\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a29c551d-b521-40ed-baed-aa433f1f53af\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmn33z2i_jmtvgkli\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"select_mmmv80ws_50iqlqt4\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.308609999999986}},\"router\":{},\"connector\":null}]}',NULL),(198,'行为树2',NULL,'2026-03-13 07:50:42','2026-03-14 07:53:54','tree222',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mmoli4gs_nd20tx0z\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":460,\"y\":180},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"1e08db00-7128-4ffc-8a14-8f52b8e38b08\",\"source\":\"root_mmoli4gs_nd20tx0z\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"select_mmolj67y_r2gobhbr\",\"targetName\":\"选择节点\"},{\"id\":0,\"key\":\"c834c378-e335-42ef-99da-6090af3cc569\",\"source\":\"root_mmoli4gs_nd20tx0z\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mmoli67o_9iao0f3x\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mmoli67o_9iao0f3x\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":220,\"y\":400},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b6071366-46b0-46b3-81fd-81daba0a795d\",\"source\":\"parallel_mmoli67o_9iao0f3x\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmoli98i_un0skvye\",\"targetName\":\"检查是否在范围内\"},{\"id\":0,\"key\":\"b513dc23-61de-43de-a492-a91f03033b91\",\"source\":\"parallel_mmoli67o_9iao0f3x\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmolifit_ig73vkdw\",\"targetName\":\"转向目标\"}]},{\"id\":0,\"key\":\"condition_mmoli98i_un0skvye\",\"type\":\"task\",\"template\":115,\"templateType\":\"condition\",\"name\":\"检查是否在范围内\",\"category\":\"condition\",\"description\":\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\",\"order\":0,\"position\":{\"x\":120,\"y\":680},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":65,\"templateId\":115,\"paramKey\":\"range\",\"dataType\":\"double\",\"defaultValue\":\"5000\",\"description\":\"防护范围\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":66,\"templateId\":115,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"sam_radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"condition_mmolic5v_oqy69lys\",\"type\":\"task\",\"template\":121,\"templateType\":\"condition\",\"name\":\"检查雷达雷针朝向\",\"category\":\"condition\",\"description\":\"判断当前雷达雷针朝向是否与初始朝向一致\",\"order\":1,\"position\":{\"x\":1040,\"y\":680},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmolifit_ig73vkdw\",\"type\":\"task\",\"template\":119,\"templateType\":\"node\",\"name\":\"转向目标\",\"category\":\"action\",\"description\":\"攻击类型的平台,需要调整飞机的水平指向,把车头或者机头的方向指向敌人\",\"order\":1,\"position\":{\"x\":440,\"y\":660},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"condition_mmolil0c_htw9qqxf\",\"type\":\"task\",\"template\":115,\"templateType\":\"condition\",\"name\":\"检查是否在范围内\",\"category\":\"condition\",\"description\":\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\",\"order\":0,\"position\":{\"x\":740,\"y\":680},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":65,\"templateId\":115,\"paramKey\":\"range\",\"dataType\":\"double\",\"defaultValue\":\"5000\",\"description\":\"防护范围\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":66,\"templateId\":115,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"sam_radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"select_mmolj67y_r2gobhbr\",\"type\":\"task\",\"template\":3,\"templateType\":\"node\",\"name\":\"选择节点\",\"category\":\"select\",\"description\":\"中间节点,执行到这里只会选择其中一个节点执行\",\"order\":1,\"position\":{\"x\":780,\"y\":400},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"2b2ae64f-5e1d-48e6-af92-1a068f2349b9\",\"source\":\"select_mmolj67y_r2gobhbr\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmolil0c_htw9qqxf\",\"targetName\":\"检查是否在范围内\"},{\"id\":0,\"key\":\"bd7c260b-694c-409c-93a7-19e5d4dd99c8\",\"source\":\"select_mmolj67y_r2gobhbr\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmolic5v_oqy69lys\",\"targetName\":\"检查雷达雷针朝向\"},{\"id\":0,\"key\":\"15957ce8-f351-4095-948a-a5e304446ea6\",\"source\":\"select_mmolj67y_r2gobhbr\",\"sourceName\":\"选择节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmoljebo_qla64ev4\",\"targetName\":\"追击节点\"}]},{\"id\":0,\"key\":\"action_mmoljebo_qla64ev4\",\"type\":\"task\",\"template\":126,\"templateType\":\"node\",\"name\":\"追击节点\",\"category\":\"action\",\"description\":\"朝敌方战机飞行\",\"order\":2,\"position\":{\"x\":1340,\"y\":680},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"b6071366-46b0-46b3-81fd-81daba0a795d\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmoli67o_9iao0f3x\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmoli98i_un0skvye\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.07040000000000146}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b513dc23-61de-43de-a492-a91f03033b91\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmoli67o_9iao0f3x\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmolifit_ig73vkdw\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5069400000000023}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"1e08db00-7128-4ffc-8a14-8f52b8e38b08\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmoli4gs_nd20tx0z\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"select_mmolj67y_r2gobhbr\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.8154899999999979}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"2b2ae64f-5e1d-48e6-af92-1a068f2349b9\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmolj67y_r2gobhbr\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmolil0c_htw9qqxf\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.13248999999999797}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"bd7c260b-694c-409c-93a7-19e5d4dd99c8\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmolj67y_r2gobhbr\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmolic5v_oqy69lys\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.9575299999999989}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"15957ce8-f351-4095-948a-a5e304446ea6\",\"type\":\"edge\",\"source\":{\"cell\":\"select_mmolj67y_r2gobhbr\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmoljebo_qla64ev4\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.949239999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"c834c378-e335-42ef-99da-6090af3cc569\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmoli4gs_nd20tx0z\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"parallel_mmoli67o_9iao0f3x\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.1493399999999965}},\"router\":{},\"connector\":null}]}',NULL),(199,'预警雷达行为树1',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','radar1',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mmpzpu5s_nf6s11cl\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":540,\"y\":240},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"1e607f23-6b82-4351-bb55-d1c833bc7d64\",\"source\":\"root_mmpzpu5s_nf6s11cl\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmpzqijl_ohk44qrd\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"condition_mmpzq2fu_h1pf2t2v\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"order\":0,\"position\":{\"x\":280,\"y\":660},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"Radar_Start\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"sequence_mmpzqijl_ohk44qrd\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":0,\"position\":{\"x\":540,\"y\":460},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\",\"source\":\"sequence_mmpzqijl_ohk44qrd\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmpzq2fu_h1pf2t2v\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"91023fd8-2737-4692-8fb9-14e220a556ed\",\"source\":\"sequence_mmpzqijl_ohk44qrd\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmpzqpd5_zpari9yz\",\"targetName\":\"开火\"},{\"id\":0,\"key\":\"5355df2c-6529-48b3-95d2-0b42aa9481eb\",\"source\":\"sequence_mmpzqijl_ohk44qrd\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq4hveh_2dyinsju\",\"targetName\":\"打开雷达\"}]},{\"id\":0,\"key\":\"action_mmq4hveh_2dyinsju\",\"type\":\"task\",\"template\":118,\"templateType\":\"node\",\"name\":\"打开雷达\",\"category\":\"action\",\"description\":\"雷达开始工作\",\"order\":0,\"position\":{\"x\":760,\"y\":680},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":70,\"templateId\":118,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"cc1d6a2d-94c2-4268-b6ac-895c458c18ab\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmpzpu5s_nf6s11cl\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"sequence_mmpzqijl_ohk44qrd\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.3747400000000016}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"2f89b4bb-77c3-4168-a127-3b3c02abd1ae\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzqijl_ohk44qrd\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmpzq2fu_h1pf2t2v\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.3747400000000016}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"aedc76ed-767b-4acd-b44f-876781f3f698\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzqijl_ohk44qrd\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmq4hveh_2dyinsju\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.3747400000000016}},\"router\":{},\"connector\":null}]}',5),(200,'预警雷达行为树2',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','radar2',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mmpznh0o_sdwhm0bp\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":520,\"y\":120},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"24518193-c4c1-4822-a42e-2036b41aa59d\",\"source\":\"root_mmpznh0o_sdwhm0bp\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmpznm8h_wyrse9wy\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"sequence_mmpznm8h_wyrse9wy\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":0,\"position\":{\"x\":500,\"y\":360},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"2e7f131d-c11d-49f9-a835-a7513bee26dc\",\"source\":\"sequence_mmpznm8h_wyrse9wy\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmpznry2_rk7uu4cw\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"a5404bf9-d994-438c-895e-ca0b8578da52\",\"source\":\"sequence_mmpznm8h_wyrse9wy\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmpznuco_lpqk4e6h\",\"targetName\":\"打开雷达\"}]},{\"id\":0,\"key\":\"condition_mmpznry2_rk7uu4cw\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"order\":0,\"position\":{\"x\":228,\"y\":699},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"Radar_Start\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"action_mmpznuco_lpqk4e6h\",\"type\":\"task\",\"template\":118,\"templateType\":\"node\",\"name\":\"打开雷达\",\"category\":\"action\",\"description\":\"雷达开始工作\",\"order\":1,\"position\":{\"x\":700,\"y\":720},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":70,\"templateId\":118,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"74128850-7305-471e-afaf-2d32141afe32\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmpznh0o_sdwhm0bp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"sequence_mmpznm8h_wyrse9wy\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14157999999999993}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"634b2add-2f43-46ed-b096-ea5d3256863b\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpznm8h_wyrse9wy\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmpznry2_rk7uu4cw\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14157999999999993}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"4efb8485-c020-441f-9a0b-847ace071992\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpznm8h_wyrse9wy\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmpznuco_lpqk4e6h\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14157999999999993}},\"router\":{},\"connector\":null}]}',6),(201,'预警雷达行为树3',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','radar3',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mmpzor5s_g38ziljv\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":540,\"y\":-20},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\",\"source\":\"root_mmpzor5s_g38ziljv\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmpzowpc_1biuz6zn\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"sequence_mmpzowpc_1biuz6zn\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":0,\"position\":{\"x\":520,\"y\":240},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\",\"source\":\"sequence_mmpzowpc_1biuz6zn\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmpzozt5_xxbxbn7l\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"f9deb620-ea85-417d-bdff-3c2cea828821\",\"source\":\"sequence_mmpzowpc_1biuz6zn\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmpzp4wh_buba6q1d\",\"targetName\":\"打开雷达\"}]},{\"id\":0,\"key\":\"condition_mmpzozt5_xxbxbn7l\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"order\":0,\"position\":{\"x\":280,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"Radar_Start\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"action_mmpzp4wh_buba6q1d\",\"type\":\"task\",\"template\":118,\"templateType\":\"node\",\"name\":\"打开雷达\",\"category\":\"action\",\"description\":\"雷达开始工作\",\"order\":1,\"position\":{\"x\":740,\"y\":520},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":70,\"templateId\":118,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"ccbfa5a8-32aa-435b-a7f4-0f1883f09c4d\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmpzor5s_g38ziljv\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"sequence_mmpzowpc_1biuz6zn\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.8082299999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ee232884-84cb-4258-8b3a-57672055f6ab\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzowpc_1biuz6zn\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmpzozt5_xxbxbn7l\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.8082299999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ca962651-ef03-4a0d-833a-6e45cc6bf4c7\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzowpc_1biuz6zn\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmpzp4wh_buba6q1d\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.8082299999999996}},\"router\":{},\"connector\":null}]}',7),(202,'防空火炮行为树(远)',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','1111',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"condition_mmpzmovr_wrwzo1kr\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"order\":0,\"position\":{\"x\":220,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq387u5_lqo2dj5g\",\"type\":\"task\",\"template\":117,\"templateType\":\"node\",\"name\":\"开火\",\"category\":\"action\",\"description\":\"对敌人进行火力打击,需要指定武器名称,齐射数量\",\"order\":2,\"position\":{\"x\":920,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":68,\"templateId\":117,\"paramKey\":\"salvo_size\",\"dataType\":\"int\",\"defaultValue\":\"2\",\"description\":\"齐射数量\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":69,\"templateId\":117,\"paramKey\":\"weaponName\",\"dataType\":\"string\",\"defaultValue\":\"naval_sam\",\"description\":\"发射的武器名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"sequence_mmrfqkf7_4ako7i6v\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"group\":\"control\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":0,\"position\":{\"x\":500,\"y\":400},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b01d84e0-a65c-4330-841c-90f04a0e25ab\",\"source\":\"sequence_mmrfqkf7_4ako7i6v\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmpzmovr_wrwzo1kr\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"257a8dab-cca4-4ee6-84fb-b991c8fa2127\",\"source\":\"sequence_mmrfqkf7_4ako7i6v\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq387u5_lqo2dj5g\",\"targetName\":\"开火\"},{\"id\":0,\"key\":\"8d0d3a53-7b23-45ca-809c-4b967e147a49\",\"source\":\"sequence_mmrfqkf7_4ako7i6v\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmrfqz4d_efcwtkw9\",\"targetName\":\"打开雷达\"}]},{\"id\":0,\"key\":\"root_mmrfqrqb_2g4wptft\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":560,\"y\":200},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"49cee644-181f-43bd-821a-9bc460021e94\",\"source\":\"root_mmrfqrqb_2g4wptft\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmrfqkf7_4ako7i6v\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"action_mmrfqz4d_efcwtkw9\",\"type\":\"task\",\"template\":118,\"templateType\":\"node\",\"name\":\"打开雷达\",\"category\":\"action\",\"group\":\"action\",\"description\":\"雷达开始工作\",\"order\":1,\"position\":{\"x\":560,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":70,\"templateId\":118,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"49cee644-181f-43bd-821a-9bc460021e94\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmrfqrqb_2g4wptft\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"sequence_mmrfqkf7_4ako7i6v\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.39933999999999653}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b01d84e0-a65c-4330-841c-90f04a0e25ab\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrfqkf7_4ako7i6v\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mmpzmovr_wrwzo1kr\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5243799999999974}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"257a8dab-cca4-4ee6-84fb-b991c8fa2127\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrfqkf7_4ako7i6v\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq387u5_lqo2dj5g\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.682739999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"8d0d3a53-7b23-45ca-809c-4b967e147a49\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrfqkf7_4ako7i6v\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmrfqz4d_efcwtkw9\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5078699999999989}},\"router\":{},\"connector\":null}]}',8),(203,'防空火炮行为树(中)',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','2222',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mmpzrh0o_tn40029a\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":500,\"y\":300},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\",\"source\":\"root_mmpzrh0o_tn40029a\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmpzrknm_1g6p5874\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"sequence_mmpzrknm_1g6p5874\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":0,\"position\":{\"x\":520,\"y\":520},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\",\"source\":\"sequence_mmpzrknm_1g6p5874\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmpzrsw8_vtl8b7b4\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\",\"source\":\"sequence_mmpzrknm_1g6p5874\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmpzrwm0_voybvz4c\",\"targetName\":\"开火\"},{\"id\":0,\"key\":\"9d6c0167-9f8e-4850-b928-a2394ef03515\",\"source\":\"sequence_mmpzrknm_1g6p5874\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq36b31_jlzyf3gx\",\"targetName\":\"开火\"},{\"id\":0,\"key\":\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\",\"source\":\"sequence_mmpzrknm_1g6p5874\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmrfp1i3_svby7o21\",\"targetName\":\"打开雷达\"}]},{\"id\":0,\"key\":\"condition_mmpzrsw8_vtl8b7b4\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"order\":0,\"position\":{\"x\":240,\"y\":780},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq36b31_jlzyf3gx\",\"type\":\"task\",\"template\":117,\"templateType\":\"node\",\"name\":\"开火\",\"category\":\"action\",\"description\":\"对敌人进行火力打击,需要指定武器名称,齐射数量\",\"order\":2,\"position\":{\"x\":960,\"y\":800},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":68,\"templateId\":117,\"paramKey\":\"salvo_size\",\"dataType\":\"int\",\"defaultValue\":\"2\",\"description\":\"齐射数量\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":69,\"templateId\":117,\"paramKey\":\"weaponName\",\"dataType\":\"string\",\"defaultValue\":\"range_radar_missile\",\"description\":\"发射的武器名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]},{\"id\":0,\"key\":\"action_mmrfp1i3_svby7o21\",\"type\":\"task\",\"template\":118,\"templateType\":\"node\",\"name\":\"打开雷达\",\"category\":\"action\",\"group\":\"action\",\"description\":\"雷达开始工作\",\"order\":1,\"position\":{\"x\":580,\"y\":780},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":70,\"templateId\":118,\"paramKey\":\"radar_name\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"雷达名称\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"386e7959-e46b-4778-94d7-1f8b11d942ff\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmpzrh0o_tn40029a\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"sequence_mmpzrknm_1g6p5874\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6992900000000009}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"ada64233-2d55-41e3-b622-82c2e98123d0\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzrknm_1g6p5874\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"condition_mmpzrsw8_vtl8b7b4\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6992900000000009}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"2e676053-fca8-4809-b04c-6d99ce5b508e\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzrknm_1g6p5874\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"target\":{\"cell\":\"action_mmq36b31_jlzyf3gx\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6992900000000009}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"724d9751-fc9b-4dbf-837b-2ec3ca566027\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmpzrknm_1g6p5874\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmrfp1i3_svby7o21\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6992900000000009}},\"router\":{},\"connector\":null}]}',9),(206,'指挥官行为树',NULL,'2026-03-14 00:00:00','2026-03-14 00:00:00','command',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"action_mmq09mbk_vrrhejtz\",\"type\":\"task\",\"template\":197,\"templateType\":\"node\",\"name\":\"发送地面展开命令\",\"category\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":-460,\"y\":600},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq0a8r4_xdf3k3vv\",\"type\":\"task\",\"template\":194,\"templateType\":\"node\",\"name\":\"发送雷达控制\",\"category\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":20,\"y\":1220},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq0be5t_nk0kw8pv\",\"type\":\"task\",\"template\":199,\"templateType\":\"node\",\"name\":\"雷达目标分配\",\"category\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":-340,\"y\":1220},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq2xbpk_zrtx4wn0\",\"type\":\"task\",\"template\":195,\"templateType\":\"node\",\"name\":\"目标分配\",\"category\":\"action\",\"description\":\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\",\"order\":1,\"position\":{\"x\":640,\"y\":1220},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"condition_mmq2z6hq_crlt7nw9\",\"type\":\"task\",\"template\":198,\"templateType\":\"node\",\"name\":\"火力打击评估\",\"category\":\"condition\",\"description\":\"根据之前的节点时间判断,说明师父要进行开火\",\"order\":0,\"position\":{\"x\":1000,\"y\":1500},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq2zhg4_4qsobl1c\",\"type\":\"task\",\"template\":192,\"templateType\":\"node\",\"name\":\"发送开火指令\",\"category\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":1300,\"y\":1500},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmq31lo4_uryzls2g\",\"type\":\"task\",\"template\":200,\"templateType\":\"node\",\"name\":\"情报信息融合分析\",\"category\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":-600,\"y\":980},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mmr62klc_ut21cm40\",\"type\":\"task\",\"template\":193,\"templateType\":\"node\",\"name\":\"进行火力规则计算\",\"category\":\"action\",\"group\":\"action\",\"description\":\"计算每一个单位的发射时间和发射的武器数量和使用的武器名称\",\"order\":0,\"position\":{\"x\":340,\"y\":1220},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"sequence_mmrl327u_uxbkoas8\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"group\":\"control\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":2,\"position\":{\"x\":980,\"y\":1220},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"22b0f2c6-8188-40cb-a591-d1381f582a34\",\"source\":\"sequence_mmrl327u_uxbkoas8\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mmq2z6hq_crlt7nw9\",\"targetName\":\"满足开火条件\"},{\"id\":0,\"key\":\"93acab3d-3f68-4fa4-96ab-4bc5b0e9f268\",\"source\":\"sequence_mmrl327u_uxbkoas8\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq2zhg4_4qsobl1c\",\"targetName\":\"发送开火指令\"}]},{\"id\":0,\"key\":\"sequence_mmrl3pbu_6tb3zmmw\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"group\":\"control\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":2,\"position\":{\"x\":540,\"y\":980},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"50b671f5-6f14-4ea8-a1e4-3af989ec4def\",\"source\":\"sequence_mmrl3pbu_6tb3zmmw\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmr62klc_ut21cm40\",\"targetName\":\"进行火力规则计算\"},{\"id\":0,\"key\":\"41d4466c-267d-4b45-9277-a1bb1de76172\",\"source\":\"sequence_mmrl3pbu_6tb3zmmw\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq2xbpk_zrtx4wn0\",\"targetName\":\"目标分配\"},{\"id\":0,\"key\":\"3a713d52-e7ee-4715-98e4-5f3069e6c6bd\",\"source\":\"sequence_mmrl3pbu_6tb3zmmw\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmrl327u_uxbkoas8\",\"targetName\":\"顺序节点\"},{\"id\":0,\"key\":\"31dfee62-da47-422e-a0e5-d368cb09bc8b\",\"source\":\"sequence_mmrl3pbu_6tb3zmmw\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq0kr01_af2qksvs\",\"targetName\":\"火力打击评估\"}]},{\"id\":0,\"key\":\"sequence_mmrl535g_9l7g7ptp\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"group\":\"control\",\"description\":\"中间节点,执行到这里会自动添加\",\"order\":1,\"position\":{\"x\":-260,\"y\":1060},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"73a24769-0c28-4f94-bc13-10cf1fae983d\",\"source\":\"sequence_mmrl535g_9l7g7ptp\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq0a8r4_xdf3k3vv\",\"targetName\":\"发送雷达控制\"},{\"id\":0,\"key\":\"bde559b8-4e35-4000-a5f0-e34aca8964c8\",\"source\":\"sequence_mmrl535g_9l7g7ptp\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq0be5t_nk0kw8pv\",\"targetName\":\"雷达目标分配\"}]},{\"id\":0,\"key\":\"parallel_mmrl5k0y_jzjjt2ry\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":-60,\"y\":660},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"7a547427-46c6-4437-a143-d55ddd4b363f\",\"source\":\"parallel_mmrl5k0y_jzjjt2ry\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq31lo4_uryzls2g\",\"targetName\":\"情报信息融合分析\"},{\"id\":0,\"key\":\"cdac6e2d-4caf-4bbd-8dea-fccd40d87966\",\"source\":\"parallel_mmrl5k0y_jzjjt2ry\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmrl535g_9l7g7ptp\",\"targetName\":\"顺序节点\"},{\"id\":0,\"key\":\"42b457f7-83c8-4b07-88a8-7065638b95d1\",\"source\":\"parallel_mmrl5k0y_jzjjt2ry\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mmrl3pbu_6tb3zmmw\",\"targetName\":\"顺序节点\"}]},{\"id\":0,\"key\":\"root_mmrl5zdv_pseu75pq\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":-420,\"y\":380},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"42372da6-15e0-45da-af15-b14138073924\",\"source\":\"root_mmrl5zdv_pseu75pq\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mmq09mbk_vrrhejtz\",\"targetName\":\"发送地面展开命令\"},{\"id\":0,\"key\":\"af8ebb77-9bae-4d92-a32c-96e16284ad8d\",\"source\":\"root_mmrl5zdv_pseu75pq\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mmrl5k0y_jzjjt2ry\",\"targetName\":\"并行节点\"}]}],\"edges\":[{\"id\":0,\"key\":\"5d935b77-cea0-45e1-9285-4b5e46108914\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl327u_uxbkoas8\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mmq2z6hq_crlt7nw9\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"286f42fa-074c-4dca-b0b2-b5ac7591cb68\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl327u_uxbkoas8\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq2zhg4_4qsobl1c\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b4a9be7e-e494-4e98-a3a8-d2b36e0ae0ca\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl3pbu_6tb3zmmw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmr62klc_ut21cm40\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"0c4be57f-4780-4a65-a578-9b4113fffab6\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl3pbu_6tb3zmmw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq2xbpk_zrtx4wn0\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"761761d9-f0d9-45a9-8a99-5cfcdfbf84c1\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl3pbu_6tb3zmmw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"sequence_mmrl327u_uxbkoas8\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"edea3d24-d243-453a-952a-bff6e0db835a\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl535g_9l7g7ptp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq0a8r4_xdf3k3vv\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"290288b5-bd0e-44d1-b20f-b21ccaa9f369\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mmrl535g_9l7g7ptp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq0be5t_nk0kw8pv\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"5c4a9393-4f54-4718-96fd-d41cf4d86d4d\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmrl5k0y_jzjjt2ry\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq31lo4_uryzls2g\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"68b1adcd-ac63-488a-a491-8c31174fd74c\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmrl5k0y_jzjjt2ry\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"sequence_mmrl535g_9l7g7ptp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"9ae028ec-19c2-4e8f-a537-306bc3871218\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mmrl5k0y_jzjjt2ry\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"sequence_mmrl3pbu_6tb3zmmw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"801e2fc8-1df2-485a-8501-71bcb58aec6f\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmrl5zdv_pseu75pq\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mmq09mbk_vrrhejtz\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"54202cf4-80fc-4b0f-ab49-b2d3e3422f7a\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mmrl5zdv_pseu75pq\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mmrl5k0y_jzjjt2ry\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5721840000000084}},\"router\":{},\"connector\":null}]}',3),(209,'指挥官行为树(部署节点)',NULL,'2026-03-23 00:00:00','2026-03-23 00:00:00','111111111111111111',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vy6u1_y7yg6lor\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":460,\"y\":140},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"27ed3b4f-fe4d-4789-b1f6-06205a987442\",\"source\":\"root_mn2vy6u1_y7yg6lor\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn2wv8f5_ce4h95s1\",\"targetName\":\"并行节点\"},{\"id\":0,\"key\":\"cbc25526-a022-41fe-9651-bac2431373c1\",\"source\":\"root_mn2vy6u1_y7yg6lor\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn45ytis_jqfgl0mm\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"action_mn2ww53l_p3e8caee\",\"type\":\"task\",\"template\":216,\"templateType\":\"node\",\"name\":\"判断是否为指挥官\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":-280,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"parallel_mn45ytis_jqfgl0mm\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":640,\"y\":320},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"4d79676a-ecfa-464e-884c-a27ce63c9ccf\",\"source\":\"parallel_mn45ytis_jqfgl0mm\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2ww53l_p3e8caee\",\"targetName\":\"IS_CMD\"},{\"id\":0,\"key\":\"eccbad90-b7f6-4584-8cd3-4996acfd8673\",\"source\":\"parallel_mn45ytis_jqfgl0mm\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn45yw90_049wbuhu\",\"targetName\":\"判断是否集结\"},{\"id\":0,\"key\":\"93c439a7-e0ba-44a7-ad1a-ce1423f17e8c\",\"source\":\"parallel_mn45ytis_jqfgl0mm\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn45yyj0_1u3ra7qe\",\"targetName\":\"判断是否收到目标消息\"},{\"id\":0,\"key\":\"631d362e-1437-402f-aa16-6f85720fc2d9\",\"source\":\"parallel_mn45ytis_jqfgl0mm\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8apbdx_fi0zj6vw\",\"targetName\":\"发送集结指令\"}]},{\"id\":0,\"key\":\"condition_mn45yw90_049wbuhu\",\"type\":\"task\",\"template\":229,\"templateType\":\"node\",\"name\":\"判断是否集结\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":440,\"y\":580},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"38e5db2b-47ef-40c7-9315-72856e0869ef\",\"source\":\"condition_mn45yw90_049wbuhu\",\"sourceName\":\"判断是否集结\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2ww6dn_fz4b4ni4\",\"targetName\":\"CMD_DAP\"},{\"id\":0,\"key\":\"a2756ae5-2f8e-4763-b4dc-807419300826\",\"source\":\"condition_mn45yw90_049wbuhu\",\"sourceName\":\"判断是否集结\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8almym_m794mnvf\",\"targetName\":\"发送阵位分配命令\"}]},{\"id\":0,\"key\":\"condition_mn45yyj0_1u3ra7qe\",\"type\":\"task\",\"template\":230,\"templateType\":\"node\",\"name\":\"判断是否收到目标消息\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"还没开发\",\"order\":2,\"position\":{\"x\":820,\"y\":580},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"01855984-8e55-4465-940e-89cc0897d6ed\",\"source\":\"condition_mn45yyj0_1u3ra7qe\",\"sourceName\":\"判断是否收到目标消息\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2ww8jh_3z4o9z1z\",\"targetName\":\"CMD_TA\"},{\"id\":0,\"key\":\"2e2b829b-f021-4fcc-b208-42ae64766b07\",\"source\":\"condition_mn45yyj0_1u3ra7qe\",\"sourceName\":\"判断是否收到目标消息\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8at9dy_9vwsfzmn\",\"targetName\":\"雷达目标分配\"}]},{\"id\":0,\"key\":\"action_mn8almym_m794mnvf\",\"type\":\"task\",\"template\":232,\"templateType\":\"node\",\"name\":\"发送阵位分配命令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"multiable\":true,\"order\":0,\"position\":{\"x\":440,\"y\":720},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"01_sensor_type_1\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"23:55:41.61n\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"120:59:59.09e\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"01_sensor_type_2\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"23:55:41.61n\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"120:59:59.09e\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"01_jam_type_1\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":2},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"23:55:41.61n\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":2},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"120:59:59.09e\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":2},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"01_jam_type_2\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":3},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"23:55:41.61n\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":3},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"120:59:59.09e\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":3}],\"variables\":[]},{\"id\":0,\"key\":\"action_mn8apbdx_fi0zj6vw\",\"type\":\"task\",\"template\":204,\"templateType\":\"node\",\"name\":\"发送集结指令\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"multiable\":false,\"order\":0,\"position\":{\"x\":60,\"y\":560},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":81,\"templateId\":204,\"paramKey\":\"lat\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":82,\"templateId\":204,\"paramKey\":\"lon\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]},{\"id\":0,\"key\":\"action_mn8at9dy_9vwsfzmn\",\"type\":\"task\",\"template\":199,\"templateType\":\"node\",\"name\":\"雷达目标分配\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"multiable\":false,\"order\":0,\"position\":{\"x\":820,\"y\":720},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"9d61d119-3bdd-4983-b47f-8afd353d4bd0\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn2vy6u1_y7yg6lor\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn45ytis_jqfgl0mm\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.943801999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"931b84eb-b9c1-44ff-b774-6d235cef0d37\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn45ytis_jqfgl0mm\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2ww53l_p3e8caee\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.943801999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"c53d7745-c96a-4f26-9011-1c7d8cdf4bc9\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn45ytis_jqfgl0mm\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn45yw90_049wbuhu\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.943801999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"78ded46b-f198-445d-96cc-9dc2878f9919\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn45ytis_jqfgl0mm\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn45yyj0_1u3ra7qe\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.943801999999996}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"631d362e-1437-402f-aa16-6f85720fc2d9\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn45ytis_jqfgl0mm\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8apbdx_fi0zj6vw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.60275}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a2756ae5-2f8e-4763-b4dc-807419300826\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn45yw90_049wbuhu\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8almym_m794mnvf\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5277999999999884}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"2e2b829b-f021-4fcc-b208-42ae64766b07\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn45yyj0_1u3ra7qe\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8at9dy_9vwsfzmn\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.7144499999999971}},\"router\":{},\"connector\":null}]}',40),(211,'干扰武器行为树1',NULL,'2026-03-23 00:00:00','2026-03-23 00:00:00','222',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vy9ih_myh6sluz\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":520,\"y\":140},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"35af956a-2eb2-467e-8cd9-678c16ed152a\",\"source\":\"root_mn2vy9ih_myh6sluz\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn2wtqn7_00wp747d\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn2wtqn7_00wp747d\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":520,\"y\":340},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"9aefce90-80f1-42ca-a138-0affa14d7230\",\"source\":\"parallel_mn2wtqn7_00wp747d\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wwy7e_43mjie3t\",\"targetName\":\"JAM_RCH\"},{\"id\":0,\"key\":\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\",\"source\":\"parallel_mn2wtqn7_00wp747d\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wwz19_3tjlgj02\",\"targetName\":\"JAM_JAM\"},{\"id\":0,\"key\":\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\",\"source\":\"parallel_mn2wtqn7_00wp747d\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wx00h_37ll63ly\",\"targetName\":\"JAM_AAO\"},{\"id\":0,\"key\":\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\",\"source\":\"parallel_mn2wtqn7_00wp747d\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wx169_cshuzgei\",\"targetName\":\"JAM_FD\"}]},{\"id\":0,\"key\":\"action_mn2wwy7e_43mjie3t\",\"type\":\"task\",\"template\":219,\"templateType\":\"node\",\"name\":\"JAM_RCH\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":120,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wwz19_3tjlgj02\",\"type\":\"task\",\"template\":220,\"templateType\":\"node\",\"name\":\"JAM_JAM\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":460,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wx00h_37ll63ly\",\"type\":\"task\",\"template\":221,\"templateType\":\"node\",\"name\":\"JAM_AAO\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":2,\"position\":{\"x\":740,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wx169_cshuzgei\",\"type\":\"task\",\"template\":222,\"templateType\":\"node\",\"name\":\"JAM_FD\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":3,\"position\":{\"x\":1000,\"y\":600},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"d89b9b69-a62c-491b-a962-52f386c85c67\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn2vy9ih_myh6sluz\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn2wtqn7_00wp747d\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6908499999999768}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"69e8218a-68e9-4cc3-b8fb-fc1630504361\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wtqn7_00wp747d\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wwy7e_43mjie3t\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6908499999999768}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"90584e83-58c3-462c-ba48-0a652457cd90\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wtqn7_00wp747d\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wwz19_3tjlgj02\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6908499999999768}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b377186f-aa4e-4a8c-b832-aada2376d0d6\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wtqn7_00wp747d\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wx00h_37ll63ly\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6908499999999768}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f2e3c5eb-d1c8-4cdd-9816-c15a7b400007\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wtqn7_00wp747d\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wx169_cshuzgei\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6908499999999768}},\"router\":{},\"connector\":null}]}',38),(212,'干扰武器行为树2',NULL,'2026-03-23 00:00:00','2026-03-23 00:00:00','333',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vydll_5t3s8zx4\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":420,\"y\":240},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"ba576f59-6489-4fe5-a636-b515ed84f472\",\"source\":\"root_mn2vydll_5t3s8zx4\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn2wum3e_jdcyf4ig\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn2wum3e_jdcyf4ig\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":420,\"y\":420},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"cf9caa07-1735-4364-9c7b-6fc925a2b8e9\",\"source\":\"parallel_mn2wum3e_jdcyf4ig\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wywma_lct2qhyr\",\"targetName\":\"JAM_RCH\"},{\"id\":0,\"key\":\"d32cbaec-b6fa-4e25-982f-10497e9eaded\",\"source\":\"parallel_mn2wum3e_jdcyf4ig\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wyxk1_nudj21w1\",\"targetName\":\"JAM_JAM\"},{\"id\":0,\"key\":\"573c150f-1f30-4492-ac49-4479adcea175\",\"source\":\"parallel_mn2wum3e_jdcyf4ig\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wyyou_1dsk7kjw\",\"targetName\":\"JAM_AAO\"},{\"id\":0,\"key\":\"a24a0b13-eb21-4a67-8f71-b912c0b0b8f5\",\"source\":\"parallel_mn2wum3e_jdcyf4ig\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wyzw1_oskcpuf4\",\"targetName\":\"JAM_FD\"}]},{\"id\":0,\"key\":\"action_mn2wywma_lct2qhyr\",\"type\":\"task\",\"template\":219,\"templateType\":\"node\",\"name\":\"JAM_RCH\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":200,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wyxk1_nudj21w1\",\"type\":\"task\",\"template\":220,\"templateType\":\"node\",\"name\":\"JAM_JAM\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":480,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wyyou_1dsk7kjw\",\"type\":\"task\",\"template\":221,\"templateType\":\"node\",\"name\":\"JAM_AAO\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":2,\"position\":{\"x\":740,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2wyzw1_oskcpuf4\",\"type\":\"task\",\"template\":222,\"templateType\":\"node\",\"name\":\"JAM_FD\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":3,\"position\":{\"x\":1000,\"y\":600},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"bac94984-25e7-43f3-954f-56d185f6050c\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn2vydll_5t3s8zx4\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn2wum3e_jdcyf4ig\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6740840000000317}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"cf9caa07-1735-4364-9c7b-6fc925a2b8e9\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wum3e_jdcyf4ig\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wywma_lct2qhyr\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5911500000000233}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"d32cbaec-b6fa-4e25-982f-10497e9eaded\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wum3e_jdcyf4ig\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wyxk1_nudj21w1\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14120000000006985}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"573c150f-1f30-4492-ac49-4479adcea175\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wum3e_jdcyf4ig\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wyyou_1dsk7kjw\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.29125}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a24a0b13-eb21-4a67-8f71-b912c0b0b8f5\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wum3e_jdcyf4ig\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wyzw1_oskcpuf4\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.08295000000006984}},\"router\":{},\"connector\":null}]}',39),(213,'雷达行为树1',NULL,'2026-03-23 00:00:00','2026-03-23 00:00:00','44',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vygyb_t67z8o5s\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":420,\"y\":200},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"65f8fbcc-9a01-4a73-ab50-20e7e38e6536\",\"source\":\"root_mn2vygyb_t67z8o5s\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn2wuskh_ix0xd9l6\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn2wuskh_ix0xd9l6\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":400,\"y\":380},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b2b3aa73-4a51-4901-ba0a-99e17ff2aac6\",\"source\":\"parallel_mn2wuskh_ix0xd9l6\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2wzx5g_8y336r6z\",\"targetName\":\"SEN_RCH\"},{\"id\":0,\"key\":\"4a323b53-c154-45fd-97f1-d8551a8d6ce2\",\"source\":\"parallel_mn2wuskh_ix0xd9l6\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2x00gp_9ohm4udy\",\"targetName\":\"SENSOR_AAO\"},{\"id\":0,\"key\":\"71a858b6-961d-4725-bd27-feab52a1986d\",\"source\":\"parallel_mn2wuskh_ix0xd9l6\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2x02nt_h2t2cfef\",\"targetName\":\"SENSOR_FD\"}]},{\"id\":0,\"key\":\"action_mn2wzx5g_8y336r6z\",\"type\":\"task\",\"template\":223,\"templateType\":\"node\",\"name\":\"SEN_RCH\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":140,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2x00gp_9ohm4udy\",\"type\":\"task\",\"template\":224,\"templateType\":\"node\",\"name\":\"SENSOR_AAO\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":460,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2x02nt_h2t2cfef\",\"type\":\"task\",\"template\":225,\"templateType\":\"node\",\"name\":\"SENSOR_FD\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":2,\"position\":{\"x\":760,\"y\":580},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"35670f3d-f798-467f-aa9c-68c4eb465358\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn2vygyb_t67z8o5s\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn2wuskh_ix0xd9l6\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.41588500000000933}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b2b3aa73-4a51-4901-ba0a-99e17ff2aac6\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuskh_ix0xd9l6\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2wzx5g_8y336r6z\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.833}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"4a323b53-c154-45fd-97f1-d8551a8d6ce2\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuskh_ix0xd9l6\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2x00gp_9ohm4udy\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.49140000000002326}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"71a858b6-961d-4725-bd27-feab52a1986d\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuskh_ix0xd9l6\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2x02nt_h2t2cfef\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.05809999999997672}},\"router\":{},\"connector\":null}]}',36),(222,'雷达行为树2',NULL,'2026-03-23 00:00:00','2026-03-23 00:00:00','222',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vyl9d_zo1s5vip\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":460,\"y\":200},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"07084f60-1519-4bca-b24c-bf652517052a\",\"source\":\"root_mn2vyl9d_zo1s5vip\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn2wuz7m_6hvp0uyc\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn2wuz7m_6hvp0uyc\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"order\":0,\"position\":{\"x\":460,\"y\":360},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"fd1b3c15-e50d-4e5b-93c5-3e133349d30d\",\"source\":\"parallel_mn2wuz7m_6hvp0uyc\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2x0nwc_vcj8ncs5\",\"targetName\":\"SEN_RCH\"},{\"id\":0,\"key\":\"4f8b1c04-f54e-498b-9681-9687ce6b5ec0\",\"source\":\"parallel_mn2wuz7m_6hvp0uyc\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2x0p3u_vtj7onvh\",\"targetName\":\"SENSOR_AAO\"},{\"id\":0,\"key\":\"f8b80cf0-9664-4e35-9f30-bb33003e94e0\",\"source\":\"parallel_mn2wuz7m_6hvp0uyc\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn2x0rf7_b9yjvf56\",\"targetName\":\"SENSOR_FD\"}]},{\"id\":0,\"key\":\"action_mn2x0nwc_vcj8ncs5\",\"type\":\"task\",\"template\":223,\"templateType\":\"node\",\"name\":\"SEN_RCH\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":0,\"position\":{\"x\":180,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2x0p3u_vtj7onvh\",\"type\":\"task\",\"template\":224,\"templateType\":\"node\",\"name\":\"SENSOR_AAO\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":1,\"position\":{\"x\":480,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mn2x0rf7_b9yjvf56\",\"type\":\"task\",\"template\":225,\"templateType\":\"node\",\"name\":\"SENSOR_FD\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"order\":2,\"position\":{\"x\":780,\"y\":540},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"b9c9ea37-6adc-47c4-9e3f-36f7e63475fe\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn2vyl9d_zo1s5vip\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn2wuz7m_6hvp0uyc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.2076840000000084}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"fd1b3c15-e50d-4e5b-93c5-3e133349d30d\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuz7m_6hvp0uyc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2x0nwc_vcj8ncs5\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.133}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"4f8b1c04-f54e-498b-9681-9687ce6b5ec0\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuz7m_6hvp0uyc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2x0p3u_vtj7onvh\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.45815000000002326}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f8b80cf0-9664-4e35-9f30-bb33003e94e0\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn2wuz7m_6hvp0uyc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn2x0rf7_b9yjvf56\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5415}},\"router\":{},\"connector\":null}]}',37),(223,'直升机行为树',NULL,'2026-03-23 00:00:00','2026-03-25 00:00:00','333asdf',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn2vyoqs_n6fm60yf\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"order\":0,\"position\":{\"x\":360,\"y\":220},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\",\"source\":\"root_mn2vyoqs_n6fm60yf\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn5r8nqk_h2ff1e5q\",\"targetName\":\"发送阵位分配命令\"},{\"id\":0,\"key\":\"9cda2e3c-0085-4b29-9fd8-db0f48358983\",\"source\":\"root_mn2vyoqs_n6fm60yf\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn5w0rw2_20uznhe3\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"action_mn79kn1g_x8x8t2mh\",\"type\":\"task\",\"template\":232,\"templateType\":\"node\",\"name\":\"发送阵位分配命令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"order\":0,\"position\":{\"x\":279,\"y\":525},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"target_platform\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lat\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\"},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lon\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\"}],\"variables\":[]}],\"edges\":[]}',41),(225,'总指挥官',NULL,'2026-03-27 00:00:00','2026-03-27 02:28:24','totalcommander',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn89tw9c_5f86ox9z\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":540,\"y\":200},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\",\"source\":\"root_mn89tw9c_5f86ox9z\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn89tys0_foba6n39\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn89tys0_foba6n39\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"multiable\":false,\"order\":0,\"position\":{\"x\":520,\"y\":400},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"9fba60be-d22c-4045-82d9-6fe2b32251c1\",\"source\":\"parallel_mn89tys0_foba6n39\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn89xozd_vmnafn6u\",\"targetName\":\"是否到指定时间\"},{\"id\":0,\"key\":\"82c73cdf-f314-4f62-9011-7e879dfc279c\",\"source\":\"parallel_mn89tys0_foba6n39\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn89xt5c_sxgkv6vf\",\"targetName\":\"是否到指定时间\"},{\"id\":0,\"key\":\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\",\"source\":\"parallel_mn89tys0_foba6n39\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn89xuwr_rl2gnsez\",\"targetName\":\"是否到指定时间\"}]},{\"id\":0,\"key\":\"condition_mn89xozd_vmnafn6u\",\"type\":\"task\",\"template\":2322,\"templateType\":\"node\",\"name\":\"是否到指定时间\",\"category\":\"condition\",\"group\":\"condition\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":200,\"y\":560},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":78,\"templateId\":2322,\"paramKey\":\"reach_time\",\"dataType\":\"string\",\"defaultValue\":\"300\",\"description\":\"时间\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"bb1ed101-66bd-403e-9a27-9bc6534f67c2\",\"source\":\"condition_mn89xozd_vmnafn6u\",\"sourceName\":\"是否到指定时间\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8a3dlb_8rqsjduh\",\"targetName\":\"发送通用指令\"}]},{\"id\":0,\"key\":\"condition_mn89xt5c_sxgkv6vf\",\"type\":\"task\",\"template\":2322,\"templateType\":\"node\",\"name\":\"是否到指定时间\",\"category\":\"condition\",\"group\":\"condition\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":560,\"y\":560},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":78,\"templateId\":2322,\"paramKey\":\"reach_time\",\"dataType\":\"string\",\"defaultValue\":\"600\",\"description\":\"时间\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"dc020169-ddd1-4bfd-a544-71895f90e950\",\"source\":\"condition_mn89xt5c_sxgkv6vf\",\"sourceName\":\"是否到指定时间\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8a3uz3_nk9qe3pp\",\"targetName\":\"发送通用指令\"}]},{\"id\":0,\"key\":\"condition_mn89xuwr_rl2gnsez\",\"type\":\"task\",\"template\":2322,\"templateType\":\"node\",\"name\":\"是否到指定时间\",\"category\":\"condition\",\"group\":\"condition\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":920,\"y\":560},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":78,\"templateId\":2322,\"paramKey\":\"reach_time\",\"dataType\":\"string\",\"defaultValue\":\"1000\",\"description\":\"时间\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"82670dac-6979-45c9-9009-f3638b3d9643\",\"source\":\"condition_mn89xuwr_rl2gnsez\",\"sourceName\":\"是否到指定时间\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8a3x95_2f4s0tfp\",\"targetName\":\"发送通用指令\"}]},{\"id\":0,\"key\":\"action_mn8a3dlb_8rqsjduh\",\"type\":\"task\",\"template\":100,\"templateType\":\"node\",\"name\":\"发送通用指令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":180,\"y\":760},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":79,\"templateId\":100,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"radar\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":80,\"templateId\":100,\"paramKey\":\"command\",\"dataType\":\"string\",\"defaultValue\":\"fire\",\"description\":\"接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]},{\"id\":0,\"key\":\"action_mn8a3uz3_nk9qe3pp\",\"type\":\"task\",\"template\":100,\"templateType\":\"node\",\"name\":\"发送通用指令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":560,\"y\":760},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":79,\"templateId\":100,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"radar2\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":80,\"templateId\":100,\"paramKey\":\"command\",\"dataType\":\"string\",\"defaultValue\":\"巡飞弹命令\",\"description\":\"接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]},{\"id\":0,\"key\":\"action_mn8a3x95_2f4s0tfp\",\"type\":\"task\",\"template\":100,\"templateType\":\"node\",\"name\":\"发送通用指令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"multiable\":false,\"order\":0,\"position\":{\"x\":940,\"y\":760},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":79,\"templateId\":100,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"radar3\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":80,\"templateId\":100,\"paramKey\":\"command\",\"dataType\":\"string\",\"defaultValue\":\"区域指令\",\"description\":\"接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"275c0213-b8a7-4440-907d-568e02840a03\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn89tw9c_5f86ox9z\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn89tys0_foba6n39\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"09a5411d-d897-47c6-a687-5f118fec00a1\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn89tys0_foba6n39\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn89xozd_vmnafn6u\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"c72cb05d-3eb5-4060-b966-b15a89ab11b1\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn89tys0_foba6n39\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn89xt5c_sxgkv6vf\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"277222ec-5576-4ca4-8a33-39e083458644\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn89tys0_foba6n39\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn89xuwr_rl2gnsez\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"97f5641e-368a-42ab-8073-fd532170ed92\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn89xozd_vmnafn6u\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8a3dlb_8rqsjduh\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"e35b3841-cf39-4e76-82c4-b2444e89de2a\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn89xt5c_sxgkv6vf\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8a3uz3_nk9qe3pp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"c02f660e-98d2-49a0-9ae4-54715efe2bb6\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn89xuwr_rl2gnsez\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8a3x95_2f4s0tfp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5479680000000008}},\"router\":{},\"connector\":null}]}',42),(226,'巡飞弹指挥官行为树',NULL,'2026-03-27 00:00:00','2026-03-31 05:54:15','asdktree',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"sequence_mn8bhhe0_rzn33yxj\",\"type\":\"task\",\"template\":4,\"templateType\":\"node\",\"name\":\"顺序节点\",\"category\":\"sequence\",\"group\":\"control\",\"description\":\"中间节点,执行到这里会自动添加\",\"multiable\":false,\"order\":0,\"position\":{\"x\":120,\"y\":660},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"f6769acc-c48c-4841-812f-eac3cefbf0bb\",\"source\":\"sequence_mn8bhhe0_rzn33yxj\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8bhx6g_10q9xcer\",\"targetName\":\"发送集结指令\"},{\"id\":0,\"key\":\"4fdace5d-4612-4973-b0fa-e973c10dde51\",\"source\":\"sequence_mn8bhhe0_rzn33yxj\",\"sourceName\":\"顺序节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8bicag_wccrzt4r\",\"targetName\":\"判断是否集结\"}]},{\"id\":0,\"key\":\"action_mn8bhx6g_10q9xcer\",\"type\":\"task\",\"template\":204,\"templateType\":\"node\",\"name\":\"发送集结指令\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"multiable\":false,\"order\":0,\"position\":{\"x\":0,\"y\":860},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":81,\"templateId\":204,\"paramKey\":\"lat\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":82,\"templateId\":204,\"paramKey\":\"lon\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]},{\"id\":0,\"key\":\"condition_mn8bicag_wccrzt4r\",\"type\":\"task\",\"template\":229,\"templateType\":\"node\",\"name\":\"判断是否集结\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"还没开发\",\"multiable\":false,\"order\":0,\"position\":{\"x\":340,\"y\":880},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b81f4a1c-bcd5-4acb-888b-b167915d0d4d\",\"source\":\"condition_mn8bicag_wccrzt4r\",\"sourceName\":\"判断是否集结\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8bit16_4pv5646e\",\"targetName\":\"发送阵位分配命令\"}]},{\"id\":0,\"key\":\"action_mn8bit16_4pv5646e\",\"type\":\"task\",\"template\":232,\"templateType\":\"node\",\"name\":\"发送阵位分配命令\",\"category\":\"action\",\"group\":\"action\",\"description\":null,\"multiable\":true,\"order\":0,\"position\":{\"x\":340,\"y\":1060},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"Loiter1\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":73,\"templateId\":232,\"paramKey\":\"platforms\",\"dataType\":\"string\",\"defaultValue\":\"Loiter2\",\"description\":\"接受消息的平台\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":74,\"templateId\":232,\"paramKey\":\"lats\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":75,\"templateId\":232,\"paramKey\":\"lons\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":1}],\"variables\":[]},{\"id\":0,\"key\":\"root_mn8bj8qw_p3vg6zxf\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":460,\"y\":380},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"c4f2092f-fe97-46b4-868d-46eb2d5267ea\",\"source\":\"root_mn8bj8qw_p3vg6zxf\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn8bjm7z_j589geng\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mn8bjm7z_j589geng\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"multiable\":false,\"order\":0,\"position\":{\"x\":440,\"y\":520},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"60cf4bf3-b2f2-46c7-ac83-800ccde4a02e\",\"source\":\"parallel_mn8bjm7z_j589geng\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"sequence_mn8bhhe0_rzn33yxj\",\"targetName\":\"顺序节点\"},{\"id\":0,\"key\":\"7c8b76b0-bbf3-483e-8db6-bd08cf5f09e9\",\"source\":\"parallel_mn8bjm7z_j589geng\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8bju53_pwcwzy3v\",\"targetName\":\"检查是否抵达指定位置\"}]},{\"id\":0,\"key\":\"condition_mn8bju53_pwcwzy3v\",\"type\":\"task\",\"template\":123,\"templateType\":\"condition\",\"name\":\"检查是否抵达指定位置\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"判断当前位置是否抵达指定位置\",\"multiable\":false,\"order\":0,\"position\":{\"x\":700,\"y\":720},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"bdbaf582-985a-4d6a-99f9-1d6c60419ee4\",\"source\":\"condition_mn8bju53_pwcwzy3v\",\"sourceName\":\"检查是否抵达指定位置\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8bkkhv_ppndou5p\",\"targetName\":\"发送阵位分配命令\"},{\"id\":0,\"key\":\"bf64ab32-db90-4146-91a8-ae161e7e213b\",\"source\":\"condition_mn8bju53_pwcwzy3v\",\"sourceName\":\"检查是否抵达指定位置\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8c7p0w_w9coici5\",\"targetName\":\"发送开火指令\"}]},{\"id\":0,\"key\":\"action_mn8c7p0w_w9coici5\",\"type\":\"task\",\"template\":192,\"templateType\":\"node\",\"name\":\"发送开火指令\",\"category\":\"action\",\"group\":\"action\",\"description\":\"还没开发\",\"multiable\":false,\"order\":0,\"position\":{\"x\":720,\"y\":860},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"3347d2e9-9eab-41e0-afef-473c27df4c40\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mn8bhhe0_rzn33yxj\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8bhx6g_10q9xcer\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"7cf5e810-682a-4c79-9746-838708d60246\",\"type\":\"edge\",\"source\":{\"cell\":\"sequence_mn8bhhe0_rzn33yxj\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8bicag_wccrzt4r\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"60571adc-edea-4ebd-ba14-abce66ef2879\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8bicag_wccrzt4r\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8bit16_4pv5646e\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"83557747-d1f4-4b8a-9e09-b514000279cc\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn8bj8qw_p3vg6zxf\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn8bjm7z_j589geng\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"e4201734-6bc0-49c5-973f-bae3fe94a875\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn8bjm7z_j589geng\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"sequence_mn8bhhe0_rzn33yxj\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"1c516438-5768-4df7-93e0-c8f1bf9574fc\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn8bjm7z_j589geng\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8bju53_pwcwzy3v\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6660349999999998}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"bf64ab32-db90-4146-91a8-ae161e7e213b\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8bju53_pwcwzy3v\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8c7p0w_w9coici5\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14995000000000072}},\"router\":{},\"connector\":null}]}',43),(227,'巡飞弹1行为树',NULL,'2026-03-27 00:00:00','2026-03-31 05:54:41','tree111',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn8canav_6p1y1juz\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":429,\"y\":258},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"77552120-32c5-4e2b-9b09-f77dd38238b0\",\"source\":\"root_mn8canav_6p1y1juz\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8cat0o_xfdd2u40\",\"targetName\":\"检查是否抵达指定位置\"}]},{\"id\":0,\"key\":\"condition_mn8cat0o_xfdd2u40\",\"type\":\"task\",\"template\":123,\"templateType\":\"condition\",\"name\":\"检查是否抵达指定位置\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"判断当前位置是否抵达指定位置\",\"multiable\":false,\"order\":0,\"position\":{\"x\":420,\"y\":460},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":83,\"templateId\":123,\"paramKey\":\"lat\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":84,\"templateId\":123,\"paramKey\":\"lon\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b6afdbbb-76a4-4710-a36b-15243f0afcf1\",\"source\":\"condition_mn8cat0o_xfdd2u40\",\"sourceName\":\"检查是否抵达指定位置\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8cazpc_4x2qy10j\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"97c88eeb-f4bb-4afa-becb-1427ad720c81\",\"source\":\"condition_mn8cat0o_xfdd2u40\",\"sourceName\":\"检查是否抵达指定位置\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mn8cc0hu_4eqs6j6w\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"action_mn8cb6z3_2bdyejpn\",\"type\":\"task\",\"template\":125,\"templateType\":\"node\",\"name\":\"巡逻节点\",\"category\":\"action\",\"group\":\"action\",\"description\":\"开始巡逻\",\"multiable\":false,\"order\":0,\"position\":{\"x\":200,\"y\":1060},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"parallel_mn8cc0hu_4eqs6j6w\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"multiable\":false,\"order\":0,\"position\":{\"x\":400,\"y\":660},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"d31bb980-d68f-4c29-b484-4cc3ed674410\",\"source\":\"parallel_mn8cc0hu_4eqs6j6w\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8cc4rr_e7adcbhc\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"54c6f903-1555-4cf0-83fa-183d1a69f96f\",\"source\":\"parallel_mn8cc0hu_4eqs6j6w\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8ccagp_t43qljyu\",\"targetName\":\"等待上级命令\"}]},{\"id\":0,\"key\":\"condition_mn8cc4rr_e7adcbhc\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"multiable\":false,\"order\":0,\"position\":{\"x\":200,\"y\":920},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"b588cc5e-e3d3-472f-9751-84984fa0e8d2\",\"source\":\"condition_mn8cc4rr_e7adcbhc\",\"sourceName\":\"等待上级命令\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8cb6z3_2bdyejpn\",\"targetName\":\"巡逻节点\"}]},{\"id\":0,\"key\":\"condition_mn8ccagp_t43qljyu\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"multiable\":false,\"order\":0,\"position\":{\"x\":600,\"y\":920},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"85bd1100-4683-4b24-823a-c6d6a1781103\",\"source\":\"condition_mn8ccagp_t43qljyu\",\"sourceName\":\"等待上级命令\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8ccrgu_oofy4mqh\",\"targetName\":\"开火\"}]},{\"id\":0,\"key\":\"action_mn8ccrgu_oofy4mqh\",\"type\":\"task\",\"template\":117,\"templateType\":\"node\",\"name\":\"开火\",\"category\":\"action\",\"group\":\"action\",\"description\":\"对敌人进行火力打击,需要指定武器名称,齐射数量\",\"multiable\":false,\"order\":0,\"position\":{\"x\":600,\"y\":1060},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":68,\"templateId\":117,\"paramKey\":\"salvo_size\",\"dataType\":\"int\",\"defaultValue\":\"2\",\"description\":\"齐射数量\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":69,\"templateId\":117,\"paramKey\":\"weaponName\",\"dataType\":\"string\",\"defaultValue\":\"sam\",\"description\":\"发射的武器名称\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"97c88eeb-f4bb-4afa-becb-1427ad720c81\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8cat0o_xfdd2u40\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mn8cc0hu_4eqs6j6w\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.9069500000000044}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"d31bb980-d68f-4c29-b484-4cc3ed674410\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn8cc0hu_4eqs6j6w\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8cc4rr_e7adcbhc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.12365000000000145}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"54c6f903-1555-4cf0-83fa-183d1a69f96f\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mn8cc0hu_4eqs6j6w\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8ccagp_t43qljyu\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.557}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"b588cc5e-e3d3-472f-9751-84984fa0e8d2\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8cc4rr_e7adcbhc\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8cb6z3_2bdyejpn\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.5653500000000058}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"85bd1100-4683-4b24-823a-c6d6a1781103\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8ccagp_t43qljyu\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8ccrgu_oofy4mqh\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.7239500000000043}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"77552120-32c5-4e2b-9b09-f77dd38238b0\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn8canav_6p1y1juz\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8cat0o_xfdd2u40\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.4325}},\"router\":{},\"connector\":null}]}',44),(229,'榴弹炮行为树',NULL,'2026-03-27 00:00:00','2026-03-31 05:54:51','tree123',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mn8fnaej_alu7cn72\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":749,\"y\":273},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"36cea9dd-abd0-4875-a946-cbfe55fff532\",\"source\":\"root_mn8fnaej_alu7cn72\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mn8fne76_ogi0qriz\",\"targetName\":\"等待上级命令\"}]},{\"id\":0,\"key\":\"condition_mn8fne76_ogi0qriz\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"multiable\":false,\"order\":0,\"position\":{\"x\":760,\"y\":440},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"f459d6ac-622a-4011-8072-ae08492553c9\",\"source\":\"condition_mn8fne76_ogi0qriz\",\"sourceName\":\"等待上级命令\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mn8fnjwa_bliopru5\",\"targetName\":\"开火\"}]},{\"id\":0,\"key\":\"action_mn8fnjwa_bliopru5\",\"type\":\"task\",\"template\":117,\"templateType\":\"node\",\"name\":\"开火\",\"category\":\"action\",\"group\":\"action\",\"description\":\"对敌人进行火力打击,需要指定武器名称,齐射数量\",\"multiable\":false,\"order\":0,\"position\":{\"x\":760,\"y\":620},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":68,\"templateId\":117,\"paramKey\":\"salvo_size\",\"dataType\":\"int\",\"defaultValue\":\"2\",\"description\":\"齐射数量\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":69,\"templateId\":117,\"paramKey\":\"weaponName\",\"dataType\":\"string\",\"defaultValue\":\"sam\",\"description\":\"发射的武器名称\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"36cea9dd-abd0-4875-a946-cbfe55fff532\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mn8fnaej_alu7cn72\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mn8fne76_ogi0qriz\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14983499999999914}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f459d6ac-622a-4011-8072-ae08492553c9\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mn8fne76_ogi0qriz\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mn8fnjwa_bliopru5\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.21654999999999927}},\"router\":{},\"connector\":null}]}',46),(231,'榴弹炮指挥官',NULL,'2026-03-31 00:00:00','2026-03-31 00:00:00','asdfasdf',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mne7ee0r_3t7528et\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":520,\"y\":220},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"9609b1ae-c7c1-4b81-b098-716109ac8ab3\",\"source\":\"root_mne7ee0r_3t7528et\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mne7efaa_cmirjfis\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mne7efaa_cmirjfis\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"multiable\":false,\"order\":0,\"position\":{\"x\":520,\"y\":440},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"9609b1ae-c7c1-4b81-b098-716109ac8ab3\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mne7ee0r_3t7528et\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mne7efaa_cmirjfis\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.6916369999999997}},\"router\":{},\"connector\":null}]}',47),(232,'巡飞弹2行为树',NULL,'2026-03-31 00:00:00','2026-03-31 07:27:49','tree11123',NULL,'{\"nodes\":[{\"id\":0,\"key\":\"root_mne7fyos_pr1fr9ra\",\"type\":\"task\",\"template\":0,\"templateType\":\"node\",\"name\":\"根节点\",\"category\":\"root\",\"group\":\"control\",\"description\":\"根节点\",\"multiable\":false,\"order\":0,\"position\":{\"x\":454,\"y\":238},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\",\"source\":\"root_mne7fyos_pr1fr9ra\",\"sourceName\":\"根节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mne7g54i_lkd8jz6u\",\"targetName\":\"检查是否抵达指定位置\"}]},{\"id\":0,\"key\":\"condition_mne7g54i_lkd8jz6u\",\"type\":\"task\",\"template\":123,\"templateType\":\"condition\",\"name\":\"检查是否抵达指定位置\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"判断当前位置是否抵达指定位置\",\"multiable\":false,\"order\":0,\"position\":{\"x\":460,\"y\":400},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":83,\"templateId\":123,\"paramKey\":\"lat\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"纬度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":84,\"templateId\":123,\"paramKey\":\"lon\",\"dataType\":\"string\",\"defaultValue\":\"0\",\"description\":\"经度\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"e3b18e80-9b1f-4113-9d6a-19598f8a16e6\",\"source\":\"condition_mne7g54i_lkd8jz6u\",\"sourceName\":\"检查是否抵达指定位置\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"parallel_mne7guh8_h50766ta\",\"targetName\":\"并行节点\"}]},{\"id\":0,\"key\":\"parallel_mne7guh8_h50766ta\",\"type\":\"task\",\"template\":2,\"templateType\":\"node\",\"name\":\"并行节点\",\"category\":\"parallel\",\"group\":\"control\",\"description\":\"中间节点,他的子节点会并行执行\",\"multiable\":false,\"order\":0,\"position\":{\"x\":460,\"y\":580},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"3ff38991-47d7-4669-bbf8-46d19524ee1f\",\"source\":\"parallel_mne7guh8_h50766ta\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mne7h6zf_tuzq4mb1\",\"targetName\":\"等待上级命令\"},{\"id\":0,\"key\":\"e3500d69-ca62-4d3b-aace-23cccb37f5e3\",\"source\":\"parallel_mne7guh8_h50766ta\",\"sourceName\":\"并行节点\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"condition_mne7h96s_8ldfhucj\",\"targetName\":\"等待上级命令\"}]},{\"id\":0,\"key\":\"condition_mne7h6zf_tuzq4mb1\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"multiable\":false,\"order\":0,\"position\":{\"x\":160,\"y\":760},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"f2c95a79-cf02-4946-9010-40831266a474\",\"source\":\"condition_mne7h6zf_tuzq4mb1\",\"sourceName\":\"等待上级命令\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mne7hikh_c1lsf2dp\",\"targetName\":\"巡逻节点\"}]},{\"id\":0,\"key\":\"condition_mne7h96s_8ldfhucj\",\"type\":\"task\",\"template\":120,\"templateType\":\"node\",\"name\":\"等待上级命令\",\"category\":\"condition\",\"group\":\"condition\",\"description\":\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\",\"multiable\":false,\"order\":0,\"position\":{\"x\":700,\"y\":760},\"width\":250,\"height\":60,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":71,\"templateId\":120,\"paramKey\":\"should_task\",\"dataType\":\"string\",\"defaultValue\":\"FIRE\",\"description\":\"等待接受的命令\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[],\"edges\":[{\"id\":0,\"key\":\"966f5c3e-30c8-4054-9053-f1a725626014\",\"source\":\"condition_mne7h96s_8ldfhucj\",\"sourceName\":\"等待上级命令\",\"connector\":{},\"router\":{},\"attrs\":{},\"target\":\"action_mne7hmzq_54vm2j3a\",\"targetName\":\"开火\"}]},{\"id\":0,\"key\":\"action_mne7hikh_c1lsf2dp\",\"type\":\"task\",\"template\":125,\"templateType\":\"node\",\"name\":\"巡逻节点\",\"category\":\"action\",\"group\":\"action\",\"description\":\"开始巡逻\",\"multiable\":false,\"order\":0,\"position\":{\"x\":140,\"y\":940},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[],\"variables\":[]},{\"id\":0,\"key\":\"action_mne7hmzq_54vm2j3a\",\"type\":\"task\",\"template\":117,\"templateType\":\"node\",\"name\":\"开火\",\"category\":\"action\",\"group\":\"action\",\"description\":\"对敌人进行火力打击,需要指定武器名称,齐射数量\",\"multiable\":false,\"order\":0,\"position\":{\"x\":700,\"y\":960},\"width\":250,\"height\":120,\"inputs\":null,\"outputs\":null,\"parameters\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":68,\"templateId\":117,\"paramKey\":\"salvo_size\",\"dataType\":\"int\",\"defaultValue\":\"2\",\"description\":\"齐射数量\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0},{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"id\":69,\"templateId\":117,\"paramKey\":\"weaponName\",\"dataType\":\"string\",\"defaultValue\":\"sam\",\"description\":\"发射的武器名称\",\"templateType\":\"NodeTemplate\",\"groupIndex\":0}],\"variables\":[]}],\"edges\":[{\"id\":0,\"key\":\"e94655e9-b929-443a-a0d4-53a31da064c8\",\"type\":\"edge\",\"source\":{\"cell\":\"root_mne7fyos_pr1fr9ra\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mne7g54i_lkd8jz6u\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.0404690000000046}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"a4fbc763-d15e-487f-8b06-22475c408d65\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mne7g54i_lkd8jz6u\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"parallel_mne7guh8_h50766ta\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#5da0df\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.0404690000000046}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"3ff38991-47d7-4669-bbf8-46d19524ee1f\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mne7guh8_h50766ta\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mne7h6zf_tuzq4mb1\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.14070000000000438}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"e3500d69-ca62-4d3b-aace-23cccb37f5e3\",\"type\":\"edge\",\"source\":{\"cell\":\"parallel_mne7guh8_h50766ta\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"condition_mne7h96s_8ldfhucj\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\"\",\"strokeDashoffset\":0,\"sourceMarker\":null,\"style\":{\"animation\":\"\"}},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.8741000000000059}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"f2c95a79-cf02-4946-9010-40831266a474\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mne7h6zf_tuzq4mb1\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mne7hikh_c1lsf2dp\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.3576000000000058}},\"router\":{},\"connector\":null},{\"id\":0,\"key\":\"966f5c3e-30c8-4054-9053-f1a725626014\",\"type\":\"edge\",\"source\":{\"cell\":\"condition_mne7h96s_8ldfhucj\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\"},\"target\":{\"cell\":\"action_mne7hmzq_54vm2j3a\",\"selector\":\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\"},\"attrs\":{\"lines\":{\"connection\":true,\"strokeLinejoin\":\"round\"},\"wrap\":{\"strokeWidth\":10},\"line\":{\"stroke\":\"#3b82f6\",\"strokeWidth\":2,\"targetMarker\":null,\"strokeDasharray\":\" \",\"strokeDashoffset\":0,\"sourceMarker\":null},\"marker\":{\"fill\":\"#5da0df\",\"atConnectionRatio\":0.42435000000000583}},\"router\":{},\"connector\":null}]}',NULL),(233,'行为树asdf',NULL,'2026-03-31 07:28:05','2026-03-31 07:28:05','asdfsadf',NULL,'{\"nodes\":[],\"edges\":[]}',NULL),(234,'行为树2342',NULL,'2026-03-31 07:29:05','2026-03-31 07:29:05','twert',NULL,'{\"nodes\":[],\"edges\":[]}',NULL); +/*!40000 ALTER TABLE `behaviortree` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `bh_node_command` +-- + +DROP TABLE IF EXISTS `bh_node_command`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `bh_node_command` ( + `id` int NOT NULL AUTO_INCREMENT, + `command` varchar(255) DEFAULT NULL COMMENT '使用的命令', + `chinese_name` varchar(255) DEFAULT NULL COMMENT '命令的对应的中文,显示在用户界面', + `description` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='行为树节点用到的命令\r\n'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `bh_node_command` +-- + +LOCK TABLES `bh_node_command` WRITE; +/*!40000 ALTER TABLE `bh_node_command` DISABLE KEYS */; +INSERT INTO `bh_node_command` (`id`, `command`, `chinese_name`, `description`) VALUES (1,'FIRE','开火','发送开火指令'),(2,'INVESTIGATE','侦查',NULL),(3,'JAMMER','干扰',NULL),(4,'FORMATION','阵位分配',NULL),(5,'ASSEMBLY','集结',NULL); +/*!40000 ALTER TABLE `bh_node_command` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `gen_table` +-- + +DROP TABLE IF EXISTS `gen_table`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `gen_table` ( + `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `tpl_web_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '前端模板类型(element-ui模版 element-plus模版)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成业务表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `gen_table` +-- + +LOCK TABLES `gen_table` WRITE; +/*!40000 ALTER TABLE `gen_table` DISABLE KEYS */; +/*!40000 ALTER TABLE `gen_table` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `gen_table_column` +-- + +DROP TABLE IF EXISTS `gen_table_column`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `gen_table_column` ( + `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型', + `sort` int DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成业务表字段'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `gen_table_column` +-- + +LOCK TABLES `gen_table_column` WRITE; +/*!40000 ALTER TABLE `gen_table_column` DISABLE KEYS */; +/*!40000 ALTER TABLE `gen_table_column` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nodeconnection` +-- + +DROP TABLE IF EXISTS `nodeconnection`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nodeconnection` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '连接ID (主键)', + `tree_id` int DEFAULT NULL, + `parent_node_id` int NOT NULL COMMENT '父节点 (外键: TreeInstanceNode.id)', + `child_node_id` int NOT NULL COMMENT '子节点 (外键: TreeInstanceNode.id)', + `order_index` int NOT NULL COMMENT '子节点在父节点下的执行顺序 (对于 Sequence/Selector 等很重要)', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_parent_child` (`parent_node_id`,`child_node_id`) USING BTREE, + KEY `child_node_id` (`child_node_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1249 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='节点连接表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nodeconnection` +-- + +LOCK TABLES `nodeconnection` WRITE; +/*!40000 ALTER TABLE `nodeconnection` DISABLE KEYS */; +INSERT INTO `nodeconnection` (`id`, `tree_id`, `parent_node_id`, `child_node_id`, `order_index`) VALUES (66,197,108,105,0),(67,197,108,104,1),(68,197,108,107,2),(69,197,107,106,0),(70,197,107,103,1),(71,197,109,108,0),(72,198,111,112,0),(73,198,111,114,1),(74,198,110,116,1),(75,198,116,115,0),(76,198,116,113,1),(77,198,116,117,2),(78,198,110,111,0),(591,NULL,645,646,0),(592,NULL,646,653,0),(593,NULL,646,654,1),(594,NULL,653,647,0),(595,NULL,653,648,1),(596,NULL,653,649,2),(597,NULL,654,650,1),(598,NULL,654,651,2),(599,NULL,654,652,0),(637,NULL,655,664,0),(638,NULL,655,665,1),(639,NULL,662,666,0),(640,NULL,664,656,0),(641,NULL,664,657,1),(642,NULL,664,658,2),(643,NULL,665,661,0),(644,NULL,665,659,1),(645,NULL,665,660,2),(646,NULL,666,663,0),(647,NULL,666,655,1),(651,NULL,352,353,0),(652,NULL,353,354,0),(653,NULL,353,355,1),(654,NULL,632,633,0),(655,NULL,633,634,0),(656,NULL,633,635,1),(657,NULL,486,484,0),(658,NULL,486,485,2),(659,NULL,486,488,1),(660,NULL,487,486,0),(661,NULL,504,505,0),(662,NULL,505,506,0),(663,NULL,505,507,2),(664,NULL,505,508,1),(665,NULL,627,623,0),(666,NULL,627,624,1),(667,NULL,628,622,1),(668,NULL,628,626,0),(669,NULL,628,627,2),(670,NULL,629,620,1),(671,NULL,629,621,0),(672,NULL,630,625,0),(673,NULL,630,628,2),(674,NULL,630,629,1),(675,NULL,631,619,0),(676,NULL,631,630,0),(802,NULL,688,689,0),(803,NULL,689,690,0),(804,NULL,689,691,1),(805,NULL,689,692,2),(942,NULL,368,370,0),(943,NULL,370,369,0),(944,NULL,370,371,0),(971,NULL,745,749,0),(972,NULL,749,746,0),(973,NULL,749,752,1),(974,NULL,749,753,2),(975,NULL,752,747,1),(976,NULL,752,750,0),(977,NULL,753,748,1),(978,NULL,753,751,0),(979,NULL,717,718,0),(980,NULL,718,719,0),(981,NULL,718,720,1),(982,NULL,718,721,2),(983,NULL,718,722,3),(984,NULL,729,730,0),(985,NULL,730,731,0),(986,NULL,730,732,1),(987,NULL,730,733,2),(988,NULL,730,734,3),(989,NULL,735,736,0),(990,NULL,736,737,0),(991,NULL,736,738,1),(992,NULL,736,739,2),(993,NULL,740,741,0),(994,NULL,741,742,0),(995,NULL,741,743,1),(996,NULL,741,744,2),(999,NULL,757,758,0),(1000,NULL,757,759,1),(1001,NULL,757,760,2),(1003,NULL,757,763,0),(1004,NULL,757,764,1),(1005,NULL,757,765,2),(1011,NULL,761,762,0),(1042,NULL,766,767,0),(1043,NULL,767,768,0),(1044,NULL,767,769,1),(1045,NULL,767,770,2),(1054,NULL,771,772,0),(1055,NULL,772,773,0),(1056,NULL,772,774,1),(1057,NULL,772,775,2),(1066,NULL,776,777,0),(1067,NULL,777,778,0),(1068,NULL,777,779,1),(1069,NULL,777,780,2),(1078,NULL,781,782,0),(1079,NULL,782,790,0),(1080,NULL,782,786,0),(1081,NULL,786,787,0),(1082,NULL,786,788,1),(1083,NULL,786,789,2),(1084,NULL,790,783,0),(1085,NULL,790,784,1),(1086,NULL,790,785,2),(1117,225,831,832,0),(1118,225,832,833,0),(1119,225,832,834,0),(1120,225,832,835,0),(1121,225,833,836,0),(1122,225,834,837,0),(1123,225,835,838,0),(1150,209,870,872,0),(1151,209,872,871,0),(1152,209,872,873,1),(1153,209,872,874,2),(1154,209,872,876,0),(1155,209,873,875,0),(1156,209,874,877,0),(1206,226,934,935,0),(1207,226,934,936,0),(1208,226,936,937,0),(1209,226,938,939,0),(1210,226,939,934,0),(1211,226,939,940,0),(1212,226,940,941,0),(1225,227,958,960,0),(1226,227,960,961,0),(1227,227,960,962,0),(1228,227,961,959,0),(1229,227,962,963,0),(1230,227,957,958,0),(1231,229,965,966,0),(1232,229,966,967,0),(1233,231,968,969,0),(1243,232,982,983,0),(1244,232,983,984,0),(1245,232,984,985,0),(1246,232,984,986,0),(1247,232,985,987,0),(1248,232,986,988,0); +/*!40000 ALTER TABLE `nodeconnection` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nodeparameter` +-- + +DROP TABLE IF EXISTS `nodeparameter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nodeparameter` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '节点参数ID (主键)', + `tree_id` int DEFAULT NULL, + `node_instance_id` int NOT NULL COMMENT '关联到哪个节点实例 (外键: TreeInstanceNode.id)', + `param_def_id` int NOT NULL COMMENT '关联到哪个参数定义 (外键: TemplateParameterDef.id)', + `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '节点实例设置的具体参数值 (覆盖模板默认值)', + `group_index` int DEFAULT '0', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_instance_param` (`node_instance_id`,`param_def_id`) USING BTREE, + KEY `param_def_id` (`param_def_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=411 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='节点参数表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nodeparameter` +-- + +LOCK TABLES `nodeparameter` WRITE; +/*!40000 ALTER TABLE `nodeparameter` DISABLE KEYS */; +INSERT INTO `nodeparameter` (`id`, `tree_id`, `node_instance_id`, `param_def_id`, `value`, `group_index`) VALUES (66,197,105,65,'5000',0),(67,197,105,66,'sam_radar',0),(68,197,106,65,'6000',0),(69,197,106,66,'sam_radar',0),(70,198,112,65,'5000',0),(71,198,112,66,'sam_radar',0),(72,198,115,65,'5000',0),(73,198,115,66,'sam_radar',0),(130,200,354,71,'Radar_Start',0),(131,200,355,70,'radar',0),(138,199,369,71,'Radar_Start',0),(139,199,371,70,'radar',0),(151,202,484,71,'FIRE',0),(152,202,485,68,'2',0),(153,202,485,69,'naval_sam',0),(154,202,488,70,'radar',0),(167,203,506,71,'FIRE',0),(168,203,507,68,'2',0),(169,203,507,69,'range_radar_missile',0),(170,203,508,70,'radar',0),(171,201,634,71,'Radar_Start',0),(172,201,635,70,'radar',0),(245,223,794,73,'1,2,3,4',0),(246,223,794,74,'11,22,33,44',0),(247,223,794,75,'111,222,333,444',0),(281,225,833,78,'300',0),(282,225,834,78,'600',0),(283,225,835,78,'1000',0),(284,225,836,79,'radar',0),(285,225,836,80,'fire',0),(286,225,837,79,'radar2',0),(287,225,837,80,'巡飞弹命令',0),(288,225,838,79,'radar3',0),(289,225,838,80,'区域指令',0),(308,209,875,73,'01_sensor_type_1,01_sensor_type_2,01_jam_type_1,01_jam_type_2',0),(309,209,875,74,'23:55:41.61n,23:55:41.61n,23:55:41.61n,23:55:41.61n',1),(310,209,875,75,'120:59:59.09e,120:59:59.09e,120:59:59.09e,120:59:59.09e',2),(311,209,876,81,'0',0),(312,209,876,82,'0',0),(369,226,935,81,'0',0),(370,226,935,82,'0',0),(371,226,937,73,'Loiter1,Loiter2',0),(372,226,937,74,'0,0',1),(373,226,937,75,'0,0',2),(386,227,958,83,'0',0),(387,227,958,84,'0',0),(388,227,961,71,'FIRE',0),(389,227,962,71,'FIRE',0),(390,227,963,68,'2',0),(391,227,963,69,'sam',0),(392,229,966,71,'FIRE',0),(393,229,967,68,'2',0),(394,229,967,69,'sam',0),(405,232,983,83,'0',0),(406,232,983,84,'0',0),(407,232,985,71,'FIRE',0),(408,232,986,71,'FIRE',0),(409,232,988,68,'2',0),(410,232,988,69,'sam',0); +/*!40000 ALTER TABLE `nodeparameter` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nodetemplate` +-- + +DROP TABLE IF EXISTS `nodetemplate`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nodetemplate` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '节点模板ID (主键)', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '节点类型: "Selector", "Sequence", "Action", "Condition", "Decorator" 等', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '模板名称, 例如: "MoveToTarget", "IsTargetVisible"', + `logic_handler` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '对应的逻辑执行代码/脚本/函数名', + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '模板描述', + `english_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'afsim 中转换的节点名', + `templete_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'node' COMMENT '模版类型,节点模版或者条件判断,例如“node”,precondition“', + `is_multiable` int DEFAULT '0' COMMENT '判断这个参数是填入一份还是填入多份', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `name` (`name`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2324 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='节点模板表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nodetemplate` +-- + +LOCK TABLES `nodetemplate` WRITE; +/*!40000 ALTER TABLE `nodetemplate` DISABLE KEYS */; +INSERT INTO `nodetemplate` (`id`, `type`, `name`, `logic_handler`, `description`, `english_name`, `templete_type`, `is_multiable`) VALUES (0,'root','根节点',NULL,'根节点',NULL,'node',0),(1,'action','测试执行节点',NULL,'没啥含义就是显示内容',NULL,'node',0),(2,'parallel','并行节点',NULL,'中间节点,他的子节点会并行执行',NULL,'node',0),(3,'select','选择节点',NULL,'中间节点,执行到这里只会选择其中一个节点执行',NULL,'node',0),(4,'sequence','顺序节点',NULL,'中间节点,执行到这里会自动添加',NULL,'node',0),(100,'action','发送通用指令','advanced_behavior ${node_name} script_variables end_script_variables on_init end_on_init on_message end_on_message precondition return true; end_precondition execute return Success(); end_execute end_advanced_behavioradvanced_behavior ${node_name} script_variables end_script_variables on_init end_on_init on_message end_on_message precondition return true; end_precondition execute return Success(); end_execute end_advanced_behavior',NULL,'send_command','node',0),(115,'condition','检查是否在范围内','advanced_behavior ${node_name}\n script_variables\n // double range = 50000; // weapon maximum engagement range in meters\n // string radar_name = \"sam_radar\";\n ${script_variables}\n\n end_script_variables\n \n on_init\n end_on_init\n \n on_message\n \n end_on_message\n \n precondition\n // check if there are any targets in master track list\n if(PLATFORM.MasterTrackList().Count() > 0&& PLATFORM.MasterTrackList().Entry(0).Target().IsValid()){\n double real_range = PLATFORM.GroundRangeTo(PLATFORM.MasterTrackList().Entry(0).Target());\n if(real_range 0){\n WsfWeapon weap = PLATFORM.Weapon(weaponName);\n\n if(weap.IsValid() && weap.QuantityRemaining()>0){\n writeln(weaponName,weap.QuantityRemaining());\n return true;\n\n }\n }\n return false;\n end_precondition\n \n execute\n return Success();\n\n end_execute\n \nend_advanced_behavior\n','判断敌人是否仍旧存活,并且本平台的子弹数量足够进行一轮炮弹发射','check_isCanfire','condition',0),(117,'action','开火','advanced_behavior ${node_name}\n script_variables\n // int salvo_size = 1; // number of missiles to fire\n // string weaponName = \"sam\";\n ${script_variables}\n\n end_script_variables\n \n on_init\n end_on_init\n \n on_message\n end_on_message\n \n precondition\n return true;\n end_precondition\n \n execute\n if(!PLATFORM.MasterTrackList().Empty())\n {\n PLATFORM.Weapon(weaponName).FireSalvo(PLATFORM.MasterTrackList().TrackEntry(0), salvo_size);\n }\n return Success();\n\n end_execute\n \nend_advanced_behavior\n','对敌人进行火力打击,需要指定武器名称,齐射数量','start_fire','node',0),(118,'action','打开雷达','advanced_behavior ${node_name}\n script_variables\n // string radar_name = \"sam_radar\";\n ${script_variables}\n\n end_script_variables\n \n on_init\n end_on_init\n \n on_message\n end_on_message\n \n precondition\n return true;\n end_precondition\n \n execute\n // turn on the SAM radar sensor\n if(PLATFORM.Sensor(radar_name)){\n PLATFORM.Sensor(radar_name).TurnOn();\n return Success();\n }\n else{\n return Failure();\n }\n end_execute\n \nend_advanced_behavior\n','雷达开始工作','start_radar','node',0),(119,'action','转向目标','advanced_behavior ${node_name}\n script_variables\n end_script_variables\n \n on_init\n end_on_init\n \n on_message\n end_on_message\n \n precondition\n return true;\n end_precondition\n \n execute\n // turn platform toward the nearest tracked target\n double bearing = PLATFORM.TrueBearingTo(PLATFORM.MasterTrackList().Entry(0));\n PLATFORM.SetHeading(bearing);\n return Success();\n end_execute\n \nend_advanced_behavior','攻击类型的平台,需要调整飞机的水平指向,把车头或者机头的方向指向敌人','turn_to_target','node',0),(120,'condition','等待上级命令','\nadvanced_behavior ${node_name}\n script_variables\n int tag = 0; // flag to ensure this node executes only once \n string receive_task = \"\"; // task received from control message \n // string should_task = \"FIRE\";\n ${script_variables}\n end_script_variables\n \n on_init\n \n end_on_init\n \n on_message\n type WSF_CONTROL_MESSAGE\n script\n WsfControlMessage msg=(WsfControlMessage)MESSAGE;\n receive_task=msg.AuxDataString(\"task\");\n end_script\n end_on_message\n \n \n precondition\n if(receive_task == should_task && tag==0){\n tag = 1;\n }\n if (tag==0){\n return false;\n }else{\n return true;\n }\n\n end_precondition\n \n execute\n return Success();\n\n end_execute\n \nend_advanced_behavior','等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型','wait_for_command','node',0),(121,'condition','检查雷达雷针朝向','\nadvanced_behavior ${node_name}\n script_variables\n double heading=0;\n \n end_script_variables\n \n on_init\n heading=PLATFORM.Heading();\n end_on_init\n \n on_message\n \n end_on_message\n \n \n precondition\n \n if (heading!=PLATFORM.Heading())\n return true;\n return false;\n end_precondition\n \n execute\n return Success();\n end_execute\n \nend_advanced_behavior','判断当前雷达雷针朝向是否与初始朝向一致','is_radar_ant','condition',0),(122,'action','恢复原始朝向','advanced_behavior ${node_name}\n script_variables\n double heading=0;\n end_script_variables\n \n on_init\n heading=PLATFORM.Heading();\n end_on_init\n \n on_message\n end_on_message\n \n \n \n \n execute\n PLATFORM.SetHeading(heading);\n return Success();\n end_execute\n \nend_advanced_behavior','恢复到雷达雷针原始朝向','radar_ant_pos','node',0),(123,'condition','检查是否抵达指定位置','advanced_behavior ${node_name}\n script_variables\n double range=0;\n ${script_variables} \n\n bool flag=false;\n WsfGeoPoint points= WsfGeoPoint();\n end_script_variables\n \n \n \n on_init\n points= WsfGeoPoint.Construct(\"34:16:59.52n 80:54:24.91w\");\n end_on_init\n \n on_message\n \n end_on_message\n precondition\n if(range>points.GroundRangeTo(PLATFORM.Location()) || flag){\n flag=true;\n return true;\n } \n return false;\n end_precondition\n execute \n return Success();\n end_execute\n \nend_advanced_behavior','判断当前位置是否抵达指定位置','is_reach','condition',0),(124,'action','朝指定位置飞行','advanced_behavior ${node_name}\n script_variables\n WsfGeoPoint points= WsfGeoPoint();\n \n end_script_variables\n \n on_init\n points= WsfGeoPoint.Construct(\"34:16:59.52n 80:54:24.91w 10000000000\");\n \n end_on_init\n \n on_message\n end_on_message\n \n execute\n\n PLATFORM.GoToLocation(points);\n return Success();\n end_execute\n \nend_advanced_behavior','飞往指定位置','specified','node',0),(125,'action','巡逻节点','route route_shape_8\n navigation \n label start \n offset 0 0 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset 100 100 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset 200 0 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset 100 -100 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset 0 0 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset -100 100 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset -200 0 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset -100 -100 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n offset 0 0 km speed 1950 kts altitude 3500 ft msl \n radial_acceleration 2 g \n goto start \n end_navigation \nend_route \n\n\nadvanced_behavior ${node_name} \n script_variables \n bool routeStarted = false; \n end_script_variables \n \n on_init \n routeStarted = false; \n end_on_init \n \n on_message \n \n end_on_message \n\n execute \n if (!routeStarted) {\n \n PLATFORM.FollowRoute(\"route_shape_8\", 0); \n routeStarted = true; \n }\n\n if (PLATFORM.RoutePointIndex())\n routeStarted = false;\n return Success(); \n end_execute \n \nend_advanced_behavior \n','开始巡逻','patrol','node',0),(126,'action','追击节点','advanced_behavior ${node_name}\n script_variables\n \n end_script_variables\n \n on_init\n\n end_on_init\n \n on_message\n end_on_message\n \n precondition\n if(PLATFORM.MasterTrackList().Count())\n return true;\n return false; \n end_precondition\n \n execute \n WsfTrack firstTrack = PLATFORM.MasterTrackList().TrackEntry(0);\n WsfGeoPoint coord = firstTrack.CurrentLocation(); \n PLATFORM.GoToLocation(coord);\n return Success();\n end_execute\n \nend_advanced_behavior','朝敌方战机飞行','pursuit','node',0),(192,'action','发送开火指令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n PLATFORM.Comment(\"send_fire_command\");\n\n WsfControlMessage msg = WsfControlMessage();\n msg.SetAuxData(\"task\",\"FIRE\");\n WsfPlatformList plat=PLATFORM.Subordinates();\n foreach(WsfPlatform P in plat)\n PLATFORM.Comm(\"com\").SendMessage(msg,P.Name(),\"com\");\n return Success(); \n end_execute \nend_advanced_behavior','还没开发','send_fire_command','node',0),(193,'action','进行火力规则计算','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','calculate_fire_rules','node',0),(194,'action','发送雷达控制','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n WsfControlMessage msg = WsfControlMessage();\n msg.SetAuxData(\"task\",\"Radar_Start\");\n WsfPlatformList plat=PLATFORM.Subordinates();\n foreach(WsfPlatform P in plat)\n PLATFORM.Comm(\"com\").SendMessage(msg,P.Name(),\"com\");\n return Success(); \n end_execute \nend_advanced_behavior','还没开发','send_radar_command','node',0),(195,'action','目标分配','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','target_assign','node',0),(196,'action','火力打击评估','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','fire_estimate','node',0),(197,'action','发送地面展开命令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','send_land_command','node',0),(198,'condition','满足开火条件','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n if(TIME_NOW > 600){Success();}\n else{return Failure();}\n return Success(); \n end_execute \nend_advanced_behavior','还没开发','satisfy_fire_condition','node',0),(199,'action','雷达目标分配','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','radar_assign','node',1),(200,'action','情报信息融合分析','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(201,'action','发送空降指令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','issue_airdrop_command','node',0),(203,'action','发送组网指令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','send_networking_order','node',0),(204,'action','发送集结指令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','send_assembly_order','node',0),(205,'action','侦查任务决策分配','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','assign_recon_mission_decision','node',0),(206,'action','进行任务干扰','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','conduct_mission_jamming','node',0),(207,'action','规划路径','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(208,'action','上报干扰结果','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(209,'action','上报侦查结果','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(212,'action','组网','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(213,'action','情报信息融合分析_copy123141','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','Information_integration8','node',0),(214,'action','发送命令','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','SET_CMD','node',0),(216,'action','IS_CMD','advanced_behavior ${node_name}\nscript_variables\n \n \n bool key=false;\n end_script_variables\n \n on_init\n \n end_on_init\n \n on_message\n type WSF_CONTROL_MESSAGE\n script\n WsfControlMessage msg=(WsfControlMessage)MESSAGE;\n \n # receive_task=msg.AuxDataString(\"task\");\n end_script\n end_on_message\n \n \n precondition\n return true;\n end_precondition\n \n execute\n \n if(PLATFORM.Subordinates().Count()>0)\n return Success();\n return Failure();\n end_execute\nend_advanced_behavior','还没开发','IS_CMD','node',0),(217,'action','CMD_DAP','advanced_behavior ${node_name}\n script_variables\n string points=\"24:03:14.35n 121:01:28.26e\"; // Points\n bool key=true; // on\n WsfGeoPoint point;\n bool reachedAssemblyPoint = false;\n bool formationDeployed = false;\n bool sentPointsMessage = false;\n double formationInterval = 1000.0; // 1000 meters between platforms\n end_script_variables\n \n on_init\n point=WsfGeoPoint.Construct(points);\n end_on_init\n \n on_message\n type WSF_CONTROL_MESSAGE\n script\n WsfControlMessage msg=(WsfControlMessage)MESSAGE;\n # receive_task=msg.AuxDataString(\"task\");\n end_script\n end_on_message\n \n precondition\n return true;\n end_precondition\n \n execute\n \n int subCount = PLATFORM.Subordinates().Count();\n writeln(\"CMD_DAP: Subordinates count = \", subCount);\n \n if(subCount > 0 && !sentPointsMessage) {\n WsfControlMessage msg = WsfControlMessage();\n msg.SetAuxData(\"task\",\"points\");\n msg.SetAuxData(\"points\",points);\n foreach(WsfPlatform plat in PLATFORM.Subordinates()){\n writeln(\"CMD_DAP: Sending to \", plat.Name(), \" via radio\");\n PLATFORM.Comm(\"radio\").SendMessage(msg, plat.Name(), \"radio\"); \n }\n sentPointsMessage = true;\n }\n \n writeln(\"CMD_DAP: Current position: \", PLATFORM.Location().ToString());\n writeln(\"CMD_DAP: Distance to assembly point: \", PLATFORM.DownRangeTo(point));\n \n if(key){\n if(PLATFORM.DownRangeTo(point)<300){\n key=false;\n reachedAssemblyPoint = true;\n writeln(\"CMD_DAP: Reached assembly point\");\n }\n PLATFORM.GoToLocation(point);\n return Running();\n }\n else if(reachedAssemblyPoint && !formationDeployed && PLATFORM.Subordinates().Count() > 0){\n // Deploy formation positions to subordinates\n writeln(\"CMD_DAP: Triggering formation deployment for \", PLATFORM.Subordinates().Count(), \" subordinates\");\n int formationIndex = 0;\n foreach(WsfPlatform sub in PLATFORM.Subordinates()){\n WsfGeoPoint formationPos = PLATFORM.Location();\n \n // Calculate formation position based on index\n // Formation pattern: diamond shape around commander\n double heading = PLATFORM.Heading();\n double offsetDistance = formationInterval;\n \n // Formation positions relative to commander\n if(formationIndex == 0){\n // Front position\n formationPos.Extrapolate(heading, offsetDistance);\n } else if(formationIndex == 1){\n // Right flank position\n formationPos.Extrapolate(heading + 90, offsetDistance);\n } else if(formationIndex == 2){\n // Left flank position\n formationPos.Extrapolate(heading - 90, offsetDistance);\n } else if(formationIndex == 3){\n // Rear position\n formationPos.Extrapolate(heading + 180, offsetDistance * 1.5);\n } else {\n // Additional platforms in rear\n formationPos.Extrapolate(heading + 180, offsetDistance * (1.5 + (formationIndex - 4) * 0.5));\n }\n \n WsfControlMessage fdMsg = WsfControlMessage();\n fdMsg.SetAuxData(\"task\", \"formation\");\n fdMsg.SetAuxData(\"formation_pos\", formationPos.ToString());\n \n writeln(\"CMD_DAP: Sending formation position to \", sub.Name(), \" at distance \", PLATFORM.GroundRangeTo(formationPos));\n PLATFORM.Comm(\"radio\").SendMessage(fdMsg, sub.Name(), \"radio\");\n \n formationIndex += 1;\n }\n \n formationDeployed = true;\n writeln(\"CMD_DAP: Formation deployment completed\");\n return Success();\n }\n else\n return Success(); \n \n \n end_execute\nend_advanced_behavior','还没开发','CMD_DAP','node',0),(218,'action','CMD_TA','advanced_behavior ${node_name}\n script_variables\n bool key=true;\n bool assignmentDone = false;\n double lastAssignmentTime = 0.0;\n double assignmentInterval = 10.0;\n int jammerIdx = 0;\n int jammerCount = 0;\n end_script_variables\n \n on_init\n \n end_on_init\n \n on_message\n type WSF_CONTROL_MESSAGE\n script\n WsfControlMessage msg=(WsfControlMessage)MESSAGE;\n end_script\n end_on_message\n \n precondition\n return true;\n end_precondition\n \n execute\n double currentTime = TIME_NOW;\n if(!assignmentDone || (currentTime - lastAssignmentTime >= assignmentInterval)){\n writeln(\"CMD_TA: Starting target assignment at T=\", TIME_NOW);\n \n int enemyCount = 0;\n jammerCount = 0;\n \n foreach(WsfPlatform sub in PLATFORM.Subordinates()){\n bool hasJammer = false;\n for(int i=0; i=platNum && key && !has_sent){\n writeln(\"SET_CMD: Found \", PLATFORM.Subordinates().Count(), \" subordinates\");\n \n // Send message to all subordinates with current platform as commander\n WsfControlMessage msg = WsfControlMessage();\n msg.SetAuxData(\"task\",flag);\n msg.SetAuxData(flag,PLATFORM.Name());\n \n foreach(WsfPlatform plat in PLATFORM.Subordinates()){\n writeln(\"SET_CMD: Sending message to \", plat.Name(), \" type=\", plat.Type());\n PLATFORM.CommEntry(PLATFORM.CommCount()-1).SendMessage(\n msg,plat.Name(),plat.CommEntry(plat.CommCount()-1).Name()); \n }\n has_sent = true;\n }\n \n if(has_sent)\n return Success();\n else\n return Running();\n\n end_execute \nend_advanced_behavior','还没开发','SET_CMD','node',0),(229,'condition','判断是否集结','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','is_assembled','node',0),(230,'condition','判断是否收到目标消息','advanced_behavior ${node_name}\n script_variables \n end_script_variables \n on_init \n end_on_init \n on_message \n end_on_message \n precondition \n return true; \n end_precondition \n execute \n return Success(); \n end_execute \nend_advanced_behavior','还没开发','is_received_target_information','node',0),(232,'action','发送阵位分配命令','\nadvanced_behavior ${node_name}\nscript_variables \n ${script_variables}\nend_script_variables\nexecute \n Array platforms_array = platforms.Split(\",\");\n Array lons_array = lons.Split(\",\");\n Array lats_array = lats.Split(\",\");\n //The lengths of the above three variables are the same\n\n int size= platforms_array.Size();\n for(int num = 0; num =10.15.7','1','用户不存在/密码错误','2026-02-07 20:19:26'),(101,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:20:22'),(102,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:21:14'),(103,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:21:53'),(104,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:21:59'),(105,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','密码输入错误5次,帐户锁定10分钟','2026-02-07 20:22:43'),(106,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:32:56'),(107,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:34:33'),(108,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','1','用户不存在/密码错误','2026-02-07 20:35:04'),(109,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-07 20:37:00'),(110,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-07 20:41:55'),(111,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 15:33:33'),(112,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 18:42:26'),(113,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 20:10:28'),(114,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 20:15:23'),(115,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 20:26:53'),(116,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-08 20:27:14'),(117,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 11:11:54'),(118,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 14:20:14'),(119,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 14:31:53'),(120,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 14:57:59'),(121,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 19:45:35'),(122,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 19:54:43'),(123,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-02-09 21:09:03'),(124,'admin','127.0.0.1','内网IP','Chrome 144','Mac OS >=10.15.7','0','登录成功','2026-03-06 18:42:00'),(125,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','1','用户不存在/密码错误','2026-03-12 01:25:34'),(126,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','1','用户不存在/密码错误','2026-03-12 01:25:34'),(127,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-12 01:25:39'),(128,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-12 10:44:52'),(129,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-12 13:37:24'),(130,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-12 14:12:37'),(131,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-12 16:35:49'),(132,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-13 10:34:40'),(133,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-13 11:15:38'),(134,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-13 11:31:25'),(135,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-13 15:48:24'),(136,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 02:48:35'),(137,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 05:50:21'),(138,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 07:08:12'),(139,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 09:23:32'),(140,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 10:26:41'),(141,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 11:57:05'),(142,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-14 13:16:38'),(143,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-15 02:27:36'),(144,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-15 05:53:31'),(145,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-15 07:29:13'),(146,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-15 07:53:26'),(147,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-15 08:59:17'),(148,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-15 10:00:00'),(149,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-15 10:48:12'),(150,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-15 11:22:31'),(151,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-16 02:20:57'),(152,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-16 02:50:31'),(153,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-16 05:38:11'),(154,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-16 07:03:02'),(155,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-16 07:15:48'),(156,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-16 09:07:02'),(157,'admin','127.0.0.1','内网IP','Chrome 145','Windows10','0','登录成功','2026-03-17 01:21:35'),(158,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-22 05:38:56'),(159,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-22 08:13:00'),(160,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 01:11:55'),(161,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 01:54:55'),(162,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 03:55:39'),(163,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-23 06:00:04'),(164,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 06:00:22'),(165,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 07:49:51'),(166,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-23 09:44:24'),(167,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-24 03:08:40'),(168,'admin','127.0.0.1','内网IP','Firefox 148.0','Windows >=10','0','登录成功','2026-03-24 05:17:02'),(169,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-03-24 05:18:01'),(170,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-25 02:53:58'),(171,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-25 02:54:08'),(172,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-25 03:54:19'),(173,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-25 06:01:45'),(174,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-25 08:01:13'),(175,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-25 09:12:22'),(176,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-25 10:15:06'),(177,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-26 08:08:16'),(178,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-26 08:57:57'),(179,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-26 12:42:13'),(180,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-26 15:37:46'),(181,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-26 15:38:08'),(182,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-27 01:25:39'),(183,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-27 01:25:47'),(184,'admin','127.0.0.1','内网IP','Firefox 149.0','Windows >=10','0','登录成功','2026-03-27 03:14:20'),(185,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-03-27 03:23:10'),(186,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-03-27 05:00:00'),(187,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-27 05:30:02'),(188,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 01:18:10'),(189,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 01:24:34'),(190,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 02:06:15'),(191,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 03:12:10'),(192,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 05:40:19'),(193,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 06:33:47'),(194,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 07:23:40'),(195,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 07:23:47'),(196,'admin','127.0.0.1','内网IP','Edge 146','Windows >=10','0','登录成功','2026-03-31 07:23:52'),(197,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-01 08:56:35'),(198,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-07 13:41:36'),(199,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-07 15:13:54'),(200,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-07 16:48:40'),(201,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-07 18:21:37'),(202,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-09 09:37:42'),(203,'admin','127.0.0.1','内网IP','Chrome 146','Windows10','0','登录成功','2026-04-09 10:21:19'); +/*!40000 ALTER TABLE `sys_logininfor` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_menu` +-- + +DROP TABLE IF EXISTS `sys_menu`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_menu` ( + `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `parent_id` bigint DEFAULT '0' COMMENT '父菜单ID', + `order_num` int DEFAULT '0' COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径', + `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数', + `route_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由名称', + `is_frame` int DEFAULT '1' COMMENT '是否为外链(0是 1否)', + `is_cache` int DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='菜单权限表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_menu` +-- + +LOCK TABLES `sys_menu` WRITE; +/*!40000 ALTER TABLE `sys_menu` DISABLE KEYS */; +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1,'系统管理',0,1,'system',NULL,'','',1,0,'M','0','0','','system','admin','2025-09-22 09:33:04','',NULL,'系统管理目录'),(2,'系统监控',0,2,'monitor',NULL,'','',1,0,'M','0','0','','monitor','admin','2025-09-22 09:33:04','',NULL,'系统监控目录'),(3,'系统工具',0,3,'tool',NULL,'','',1,0,'M','0','0','','tool','admin','2025-09-22 09:33:04','',NULL,'系统工具目录'),(4,'若依官网',0,4,'http://ruoyi.vip',NULL,'','',0,0,'M','0','0','','guide','admin','2025-09-22 09:33:04','',NULL,'若依官网地址'),(100,'用户管理',1,1,'user','system/user/index','','',1,0,'C','0','0','system:user:list','user','admin','2025-09-22 09:33:04','',NULL,'用户管理菜单'),(101,'角色管理',1,2,'role','system/role/index','','',1,0,'C','0','0','system:role:list','peoples','admin','2025-09-22 09:33:04','',NULL,'角色管理菜单'),(102,'菜单管理',1,3,'menu','system/menu/index','','',1,0,'C','0','0','system:menu:list','tree-table','admin','2025-09-22 09:33:04','',NULL,'菜单管理菜单'),(103,'部门管理',1,4,'dept','system/dept/index','','',1,0,'C','0','0','system:dept:list','tree','admin','2025-09-22 09:33:04','',NULL,'部门管理菜单'),(104,'岗位管理',1,5,'post','system/post/index','','',1,0,'C','0','0','system:post:list','post','admin','2025-09-22 09:33:04','',NULL,'岗位管理菜单'),(105,'字典管理',1,6,'dict','system/dict/index','','',1,0,'C','0','0','system:dict:list','dict','admin','2025-09-22 09:33:04','',NULL,'字典管理菜单'),(106,'参数设置',1,7,'config','system/config/index','','',1,0,'C','0','0','system:config:list','edit','admin','2025-09-22 09:33:04','',NULL,'参数设置菜单'),(107,'通知公告',1,8,'notice','system/notice/index','','',1,0,'C','0','0','system:notice:list','message','admin','2025-09-22 09:33:04','',NULL,'通知公告菜单'),(108,'日志管理',1,9,'log','','','',1,0,'M','0','0','','log','admin','2025-09-22 09:33:04','',NULL,'日志管理菜单'),(109,'在线用户',2,1,'online','monitor/online/index','','',1,0,'C','0','0','monitor:online:list','online','admin','2025-09-22 09:33:04','',NULL,'在线用户菜单'),(110,'定时任务',2,2,'job','monitor/job/index','','',1,0,'C','0','0','monitor:job:list','job','admin','2025-09-22 09:33:04','',NULL,'定时任务菜单'),(111,'数据监控',2,3,'druid','monitor/druid/index','','',1,0,'C','0','0','monitor:druid:list','druid','admin','2025-09-22 09:33:04','',NULL,'数据监控菜单'),(112,'服务监控',2,4,'server','monitor/server/index','','',1,0,'C','0','0','monitor:server:list','server','admin','2025-09-22 09:33:04','',NULL,'服务监控菜单'),(113,'缓存监控',2,5,'cache','monitor/cache/index','','',1,0,'C','0','0','monitor:cache:list','redis','admin','2025-09-22 09:33:04','',NULL,'缓存监控菜单'),(114,'缓存列表',2,6,'cacheList','monitor/cache/list','','',1,0,'C','0','0','monitor:cache:list','redis-list','admin','2025-09-22 09:33:04','',NULL,'缓存列表菜单'),(115,'表单构建',3,1,'build','tool/build/index','','',1,0,'C','0','0','tool:build:list','build','admin','2025-09-22 09:33:04','',NULL,'表单构建菜单'),(116,'代码生成',3,2,'gen','tool/gen/index','','',1,0,'C','0','0','tool:gen:list','code','admin','2025-09-22 09:33:04','',NULL,'代码生成菜单'),(117,'系统接口',3,3,'swagger','tool/swagger/index','','',1,0,'C','0','0','tool:swagger:list','swagger','admin','2025-09-22 09:33:04','',NULL,'系统接口菜单'),(500,'操作日志',108,1,'operlog','monitor/operlog/index','','',1,0,'C','0','0','monitor:operlog:list','form','admin','2025-09-22 09:33:04','',NULL,'操作日志菜单'),(501,'登录日志',108,2,'logininfor','monitor/logininfor/index','','',1,0,'C','0','0','monitor:logininfor:list','logininfor','admin','2025-09-22 09:33:04','',NULL,'登录日志菜单'),(1000,'用户查询',100,1,'','','','',1,0,'F','0','0','system:user:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1001,'用户新增',100,2,'','','','',1,0,'F','0','0','system:user:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1002,'用户修改',100,3,'','','','',1,0,'F','0','0','system:user:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1003,'用户删除',100,4,'','','','',1,0,'F','0','0','system:user:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1004,'用户导出',100,5,'','','','',1,0,'F','0','0','system:user:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1005,'用户导入',100,6,'','','','',1,0,'F','0','0','system:user:import','#','admin','2025-09-22 09:33:04','',NULL,''),(1006,'重置密码',100,7,'','','','',1,0,'F','0','0','system:user:resetPwd','#','admin','2025-09-22 09:33:04','',NULL,''),(1007,'角色查询',101,1,'','','','',1,0,'F','0','0','system:role:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1008,'角色新增',101,2,'','','','',1,0,'F','0','0','system:role:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1009,'角色修改',101,3,'','','','',1,0,'F','0','0','system:role:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1010,'角色删除',101,4,'','','','',1,0,'F','0','0','system:role:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1011,'角色导出',101,5,'','','','',1,0,'F','0','0','system:role:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1012,'菜单查询',102,1,'','','','',1,0,'F','0','0','system:menu:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1013,'菜单新增',102,2,'','','','',1,0,'F','0','0','system:menu:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1014,'菜单修改',102,3,'','','','',1,0,'F','0','0','system:menu:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1015,'菜单删除',102,4,'','','','',1,0,'F','0','0','system:menu:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1016,'部门查询',103,1,'','','','',1,0,'F','0','0','system:dept:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1017,'部门新增',103,2,'','','','',1,0,'F','0','0','system:dept:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1018,'部门修改',103,3,'','','','',1,0,'F','0','0','system:dept:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1019,'部门删除',103,4,'','','','',1,0,'F','0','0','system:dept:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1020,'岗位查询',104,1,'','','','',1,0,'F','0','0','system:post:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1021,'岗位新增',104,2,'','','','',1,0,'F','0','0','system:post:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1022,'岗位修改',104,3,'','','','',1,0,'F','0','0','system:post:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1023,'岗位删除',104,4,'','','','',1,0,'F','0','0','system:post:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1024,'岗位导出',104,5,'','','','',1,0,'F','0','0','system:post:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1025,'字典查询',105,1,'#','','','',1,0,'F','0','0','system:dict:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1026,'字典新增',105,2,'#','','','',1,0,'F','0','0','system:dict:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1027,'字典修改',105,3,'#','','','',1,0,'F','0','0','system:dict:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1028,'字典删除',105,4,'#','','','',1,0,'F','0','0','system:dict:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1029,'字典导出',105,5,'#','','','',1,0,'F','0','0','system:dict:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1030,'参数查询',106,1,'#','','','',1,0,'F','0','0','system:config:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1031,'参数新增',106,2,'#','','','',1,0,'F','0','0','system:config:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1032,'参数修改',106,3,'#','','','',1,0,'F','0','0','system:config:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1033,'参数删除',106,4,'#','','','',1,0,'F','0','0','system:config:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1034,'参数导出',106,5,'#','','','',1,0,'F','0','0','system:config:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1035,'公告查询',107,1,'#','','','',1,0,'F','0','0','system:notice:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1036,'公告新增',107,2,'#','','','',1,0,'F','0','0','system:notice:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1037,'公告修改',107,3,'#','','','',1,0,'F','0','0','system:notice:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1038,'公告删除',107,4,'#','','','',1,0,'F','0','0','system:notice:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1039,'操作查询',500,1,'#','','','',1,0,'F','0','0','monitor:operlog:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1040,'操作删除',500,2,'#','','','',1,0,'F','0','0','monitor:operlog:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1041,'日志导出',500,3,'#','','','',1,0,'F','0','0','monitor:operlog:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1042,'登录查询',501,1,'#','','','',1,0,'F','0','0','monitor:logininfor:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1043,'登录删除',501,2,'#','','','',1,0,'F','0','0','monitor:logininfor:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1044,'日志导出',501,3,'#','','','',1,0,'F','0','0','monitor:logininfor:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1045,'账户解锁',501,4,'#','','','',1,0,'F','0','0','monitor:logininfor:unlock','#','admin','2025-09-22 09:33:04','',NULL,''),(1046,'在线查询',109,1,'#','','','',1,0,'F','0','0','monitor:online:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1047,'批量强退',109,2,'#','','','',1,0,'F','0','0','monitor:online:batchLogout','#','admin','2025-09-22 09:33:04','',NULL,''),(1048,'单条强退',109,3,'#','','','',1,0,'F','0','0','monitor:online:forceLogout','#','admin','2025-09-22 09:33:04','',NULL,''),(1049,'任务查询',110,1,'#','','','',1,0,'F','0','0','monitor:job:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1050,'任务新增',110,2,'#','','','',1,0,'F','0','0','monitor:job:add','#','admin','2025-09-22 09:33:04','',NULL,''),(1051,'任务修改',110,3,'#','','','',1,0,'F','0','0','monitor:job:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1052,'任务删除',110,4,'#','','','',1,0,'F','0','0','monitor:job:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1053,'状态修改',110,5,'#','','','',1,0,'F','0','0','monitor:job:changeStatus','#','admin','2025-09-22 09:33:04','',NULL,''),(1054,'任务导出',110,6,'#','','','',1,0,'F','0','0','monitor:job:export','#','admin','2025-09-22 09:33:04','',NULL,''),(1055,'生成查询',116,1,'#','','','',1,0,'F','0','0','tool:gen:query','#','admin','2025-09-22 09:33:04','',NULL,''),(1056,'生成修改',116,2,'#','','','',1,0,'F','0','0','tool:gen:edit','#','admin','2025-09-22 09:33:04','',NULL,''),(1057,'生成删除',116,3,'#','','','',1,0,'F','0','0','tool:gen:remove','#','admin','2025-09-22 09:33:04','',NULL,''),(1058,'导入代码',116,4,'#','','','',1,0,'F','0','0','tool:gen:import','#','admin','2025-09-22 09:33:04','',NULL,''),(1059,'预览代码',116,5,'#','','','',1,0,'F','0','0','tool:gen:preview','#','admin','2025-09-22 09:33:04','',NULL,''),(1060,'生成代码',116,6,'#','','','',1,0,'F','0','0','tool:gen:code','#','admin','2025-09-22 09:33:04','',NULL,''); +/*!40000 ALTER TABLE `sys_menu` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_notice` +-- + +DROP TABLE IF EXISTS `sys_notice`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_notice` ( + `notice_id` int NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` longblob COMMENT '公告内容', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='通知公告表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_notice` +-- + +LOCK TABLES `sys_notice` WRITE; +/*!40000 ALTER TABLE `sys_notice` DISABLE KEYS */; +INSERT INTO `sys_notice` (`notice_id`, `notice_title`, `notice_type`, `notice_content`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1,'温馨提醒:2018-07-01 若依新版本发布啦','2',_binary '新版本内容','0','admin','2025-09-22 09:33:05','',NULL,'管理员'),(2,'维护通知:2018-07-01 若依系统凌晨维护','1',_binary '维护内容','0','admin','2025-09-22 09:33:05','',NULL,'管理员'); +/*!40000 ALTER TABLE `sys_notice` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_oper_log` +-- + +DROP TABLE IF EXISTS `sys_oper_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '模块标题', + `business_type` int DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求方式', + `operator_type` int DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '返回参数', + `status` int DEFAULT '0' COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '错误消息', + `oper_time` datetime DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint DEFAULT '0' COMMENT '消耗时间', + PRIMARY KEY (`oper_id`) USING BTREE, + KEY `idx_sys_oper_log_bt` (`business_type`) USING BTREE, + KEY `idx_sys_oper_log_s` (`status`) USING BTREE, + KEY `idx_sys_oper_log_ot` (`oper_time`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=397 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='操作日志记录'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_oper_log` +-- + +LOCK TABLES `sys_oper_log` WRITE; +/*!40000 ALTER TABLE `sys_oper_log` DISABLE KEYS */; +INSERT INTO `sys_oper_log` (`oper_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (100,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"params\":{}} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1','2026-02-08 16:02:33',50),(101,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"params\":{}} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1','2026-02-08 16:05:48',14),(102,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"params\":{}} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1','2026-02-08 16:05:54',10),(103,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"params\":{}} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree\n### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1','2026-02-08 16:06:14',11),(104,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":200,\\\"height\\\":100,\\\"settings\\\":[],\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldj3w0l_vkjq3afn\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldj3w0l_ky1ur158\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 17:16:36',36),(105,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldj3w0l_vkjq3afn\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldj3w0l_ky1ur158\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"status\\\":null,\\\"template\\\":3,\\\"type\\\":\\\"select\\\",\\\"name\\\":\\\"选择节点\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":760,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldkj9wy_828x8618\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldkj9wy_jxuelsa0\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"conn','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 17:56:48',10),(106,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-23\",\"description\":\"测试行为树,第一个 (复制)\",\"englishName\":\"test_tree_copy_20251223_112418_850\",\"id\":189,\"name\":\"test1_copy_20251223_112418_850\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldksbm4_c1j0vsti\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":247,\\\"y\\\":263},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldksbm4_d5glaht8\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldksbm4_pvbh7438\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 18:03:35',13),(107,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"status\\\":null,\\\"template\\\":3,\\\"type\\\":\\\"select\\\",\\\"name\\\":\\\"选择节点\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":760,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldkj9wy_828x8618\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldkj9wy_jxuelsa0\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"d381c0cd-de72-4b4c-a6ba-832465b3caed\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWid','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 20:48:52',37),(108,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"status\\\":null,\\\"template\\\":3,\\\"type\\\":\\\"select\\\",\\\"name\\\":\\\"选择节点\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":760,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"var__mldkj9wy_828x8618\\\",\\\"name\\\":\\\"范围\\\",\\\"value\\\":\\\"1000\\\",\\\"defaults\\\":\\\"1000\\\",\\\"unit\\\":\\\"KM\\\"},{\\\"key\\\":\\\"var__mldkj9wy_jxuelsa0\\\",\\\"name\\\":\\\"武器名称\\\",\\\"value\\\":\\\"地对空导弹\\\",\\\"defaults\\\":\\\"地对空导弹\\\",\\\"unit\\\":\\\"个\\\"}]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"0f546721-95b5-4f22-bf74-7bace17aca35\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strok','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 20:49:05',8),(109,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"selector\\\":\\\"> foreignobject:nth-','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 20:56:45',10),(110,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":13,\\\"name\\\":\\\"地对地开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":600,\\\"y\\\":480},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 21:32:47',32),(111,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":13,\\\"name\\\":\\\"地对地开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":600,\\\"y\\\":480},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 21:34:00',11),(112,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/193','127.0.0.1','内网IP','[193] ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.deleteBehaviortreeByIds-Inline\n### The error occurred while setting parameters\n### SQL: delete from behaviortree where id in ( ? )\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n; Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)','2026-02-08 21:43:10',92),(113,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/192','127.0.0.1','内网IP','[192] ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.deleteBehaviortreeByIds-Inline\n### The error occurred while setting parameters\n### SQL: delete from behaviortree where id in ( ? )\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n; Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)','2026-02-08 21:43:25',9),(114,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/193','127.0.0.1','内网IP','[193] ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.deleteBehaviortreeByIds-Inline\n### The error occurred while setting parameters\n### SQL: delete from behaviortree where id in ( ? )\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n; Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)','2026-02-08 21:48:57',11),(115,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/193','127.0.0.1','内网IP','[193] ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.deleteBehaviortreeByIds-Inline\n### The error occurred while setting parameters\n### SQL: delete from behaviortree where id in ( ? )\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n; Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)','2026-02-08 21:49:00',7),(116,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/193','127.0.0.1','内网IP','[193] ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.deleteBehaviortreeByIds-Inline\n### The error occurred while setting parameters\n### SQL: delete from behaviortree where id in ( ? )\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)\n; Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`wb_decision_tree`.`treenodeinstance`, CONSTRAINT `treenodeinstance_ibfk_1` FOREIGN KEY (`tree_id`) REFERENCES `behaviortree` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT)','2026-02-08 21:49:02',7),(117,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"3333\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":13,\\\"name\\\":\\\"地对地开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":600,\\\"y\\\":480},\\\"width\\\":250,\\\"height\\\":120,\\\"in','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 21:49:53',10),(118,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树1\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"3333\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1a833265-cae5-4771-a85d-d4dced39bcb0\\\",\\\"source\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 21:50:14',11),(119,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"3333\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1a833265-cae5-4771-a85d-d4dced39bcb0\\\",\\\"source\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:04:23',14),(120,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"3333\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1a833265-cae5-4771-a85d-d4dced39bcb0\\\",\\\"source\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:09:38',14),(121,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"status\\\":null,\\\"template\\\":191,\\\"type\\\":\\\"root\\\",\\\"name\\\":\\\"根节点\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":259,\\\"y\\\":148},\\\"width\\\":250,\\\"height\\\":120,\\\"settings\\\":[],\\\"inputs\\\":\\\"33\\\",\\\"outputs\\\":\\\"34\\\",\\\"parameters\\\":{},\\\"variables\\\":[{\\\"key\\\":\\\"variable_mldqn0ro_bc9rnvuf\\\",\\\"name\\\":\\\"3\\\",\\\"value\\\":\\\"4\\\",\\\"defaults\\\":null,\\\"unit\\\":\\\"4\\\"}],\\\"edges\\\":[{\\\"key\\\":\\\"4b0af0c2-7b1e-412a-82e8-89a2500b8adb\\\",\\\"sourceKey\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"targetKey\\\":\\\"select_mldkj9wy_gvkmu3db\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"85cd3297-ec33-41ae-b29a-ea00c7d928c9\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"35dddb81-8461-4c04-88f2-078bff484f7b\\\",\\\"source\\\":\\\"root_mldj3w0l_e7p1m99p\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mlds8snh_77bi97g5\\\",\\\"targetName\\\":\\\"地对地开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":\\\"333333\\\",\\\"position\\\":{\\\"x\\\":649,\\\"y\\\":197},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":\\\"333ddd\\\",\\\"outputs\\\":\\\"33\\\",\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"3333333\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1a833265-cae5-4771-a85d-d4dced39bcb0\\\",\\\"source\\\":\\\"precondition_mldqyy7m_rpossu7r\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"t','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:09:53',10),(122,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-26\",\"description\":\"防空导弹行为树333\",\"englishName\":\"defence_air_tree\",\"id\":2,\"name\":\"战斗行为树23333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldtl91w_gtogsv7p\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":412,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:10:06',11),(123,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-26\",\"description\":\"防空导弹行为树333dddd\",\"englishName\":\"defence_air_tree\",\"id\":2,\"name\":\"战斗行为树23333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldtl91w_gtogsv7p\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":412,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:11:56',9),(124,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-26\",\"description\":\"防空导弹行为树333dddd\",\"englishName\":\"defence_air_tree\",\"id\":2,\"name\":\"战斗行为树23333eeeeee\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldtl91w_gtogsv7p\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":412,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:12:28',8),(125,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"description\":\"ddddd\",\"name\":\"eeeeee\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLException: Field \'english_name\' doesn\'t have a default value\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree ( name, description, xml_content ) values ( ?, ?, ? )\n### Cause: java.sql.SQLException: Field \'english_name\' doesn\'t have a default value\n; Field \'english_name\' doesn\'t have a default value; nested exception is java.sql.SQLException: Field \'english_name\' doesn\'t have a default value','2026-02-08 22:22:17',7),(126,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"description\":\"dddd\",\"id\":0,\"name\":\"行为树ddd\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ',NULL,1,'\n### Error updating database. Cause: java.sql.SQLException: Field \'english_name\' doesn\'t have a default value\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/BehaviortreeMapper.xml]\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\n### The error occurred while setting parameters\n### SQL: insert into behaviortree ( name, description, xml_content ) values ( ?, ?, ? )\n### Cause: java.sql.SQLException: Field \'english_name\' doesn\'t have a default value\n; Field \'english_name\' doesn\'t have a default value; nested exception is java.sql.SQLException: Field \'english_name\' doesn\'t have a default value','2026-02-08 22:24:25',9),(127,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"dddd\",\"id\":194,\"name\":\"行为树ddd\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:28:20',12),(128,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-02-08\",\"englishName\":\"dddd\",\"id\":194,\"name\":\"行为树ddd\",\"params\":{},\"updatedAt\":\"2026-02-08\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldu92do_069tptgv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":354,\\\"y\\\":83},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:28:33',8),(129,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-02-08\",\"englishName\":\"dddd\",\"id\":194,\"name\":\"行为树dddddsdsds\",\"params\":{},\"updatedAt\":\"2026-02-08\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mldu92do_069tptgv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":354,\\\"y\\\":83},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-08 22:28:38',8),(130,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:20:59',52),(131,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:21:27',25),(132,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:22:09',31119),(133,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:22:25',13127),(134,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:22:54',5193),(135,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:23:55',1506),(136,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:24:20',6601),(137,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro',NULL,1,'\n### Error updating database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \'desciption\' in \'field list\'\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/TreenodeinstanceMapper.xml]\n### The error may involve com.solution.system.mapper.TreenodeinstanceMapper.insertTreenodeinstance-Inline\n### The error occurred while setting parameters\n### SQL: insert into treenodeinstance ( template_id, instance_name, is_root, desciption ) values ( ?, ?, ?, ? )\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \'desciption\' in \'field list\'\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \'desciption\' in \'field list\'','2026-02-09 14:27:02',25610),(138,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro',NULL,1,'\n### Error updating database. Cause: java.sql.SQLException: Field \'tree_id\' doesn\'t have a default value\n### The error may exist in file [/Users/zlin/Datas/development/workspace/intellij/kernelstudio/works/auto-solution/auto-solution-behaviour/target/classes/mapper/system/TreenodeinstanceMapper.xml]\n### The error may involve com.solution.system.mapper.TreenodeinstanceMapper.insertTreenodeinstance-Inline\n### The error occurred while setting parameters\n### SQL: insert into treenodeinstance ( template_id, instance_name, is_root ) values ( ?, ?, ? )\n### Cause: java.sql.SQLException: Field \'tree_id\' doesn\'t have a default value\n; Field \'tree_id\' doesn\'t have a default value; nested exception is java.sql.SQLException: Field \'tree_id\' doesn\'t have a default value','2026-02-09 14:27:47',6398),(139,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:29:21',21638),(140,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:30:12',23505),(141,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ea62e4c2-fa39-43fd-970a-84491c59b4f9\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:34:35',19581),(142,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ea62e4c2-fa39-43fd-970a-84491c59b4f9\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:36:00',61),(143,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"21d7a43e-80ca-4661-b239-af39b303d146\\\",\\\"source\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":670,\\\"y\\\":372},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ea62e4c2-fa39-43fd-970a-84491c59b4f9\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mles9dq8_8tjm6lp0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mles9rc2_pij18tgj\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:36:29',11345),(144,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:36:42',30),(145,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:37:04',38),(146,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:37:40',15004),(147,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:39:28',6363),(148,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:46:09',30898),(149,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"stro','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:47:48',20881),(150,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:48:13',11034),(151,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:48:32',62),(152,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:49:28',29971),(153,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":260},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 14:50:44',4022),(154,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-23\",\"description\":\"测试行为树,第一个 (复制)\",\"englishName\":\"test_tree_copy_20251223_112300_063\",\"id\":187,\"name\":\"测试复制的行为树_20251223_112300_063\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mletu6w7_puip2zf8\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":301,\\\"y\\\":213},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:04:48',62),(155,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":660,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"014869e5-2c0c-4010-a561-0a90b84650dc\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"targetName\\\":\\\"飞向某个点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":11,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"飞向某个点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"平台飞到某个点\\\",\\\"position\\\":{\\\"x\\\":1000,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1fe1ffc4-9bca-458d-8537-ae59ee4e3cc7\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:05:20',77),(156,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":660,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"014869e5-2c0c-4010-a561-0a90b84650dc\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"targetName\\\":\\\"飞向某个点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":11,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"飞向某个点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"平台飞到某个点\\\",\\\"position\\\":{\\\"x\\\":1000,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1fe1ffc4-9bca-458d-8537-ae59ee4e3cc7\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:05:58',158),(157,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"lll\",\"id\":195,\"name\":\"行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mletxhfu_x61yuhnf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":316,\\\"y\\\":198},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:30',15),(158,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/190','127.0.0.1','内网IP','[190] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:46',11),(159,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/191','127.0.0.1','内网IP','[191] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:48',8),(160,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/192','127.0.0.1','内网IP','[192] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:50',7),(161,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/193','127.0.0.1','内网IP','[193] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:52',7),(162,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/194','127.0.0.1','内网IP','[194] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:53',11),(163,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/195','127.0.0.1','内网IP','[195] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:07:55',7),(164,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":160,\\\"height\\\":100,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":600,\\\"y\\\":160},\\\"width\\\":160,\\\"height\\\":100,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"014869e5-2c0c-4010-a561-0a90b84650dc\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"targetName\\\":\\\"飞向某个点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"dcc02099-6596-49a9-bcf3-2ddf9336b71d\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mleuln8k_ms19axe6\\\",\\\"targetName\\\":\\\"发送消息\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mleulj0l_6o1epy47\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":55,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"到达(测试版)\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"指定飞机到达某个地点','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:27:03',120),(165,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":160,\\\"height\\\":100,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":42,\\\"templateType\\\":\\\"precondition\\\",\\\"name\\\":\\\"轨迹有无判断\\\",\\\"category\\\":\\\"precondition\\\",\\\"description\\\":null,\\\"position\\\":{\\\"x\\\":600,\\\"y\\\":160},\\\"width\\\":160,\\\"height\\\":100,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":50,\\\"templateId\\\":42,\\\"paramKey\\\":\\\"track_processor_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"dddddd\\\",\\\"description\\\":\\\"轨迹处理器的名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"014869e5-2c0c-4010-a561-0a90b84650dc\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mletunsn_rdsljrqo\\\",\\\"targetName\\\":\\\"飞向某个点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"dcc02099-6596-49a9-bcf3-2ddf9336b71d\\\",\\\"source\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"sourceName\\\":\\\"轨迹有无判断\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mleuln8k_ms19axe6\\\",\\\"targetName\\\":\\\"发送消息\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mleulj0l_6o1epy47\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":55,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"到达(测试版)\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"指定飞机到达某个地点','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 15:33:12',126),(166,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"ddddd\",\"id\":196,\"name\":\"行为树dd\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":318,\\\"y\\\":103},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2a0999fe-32f8-435b-aa06-cb095064e9bb\\\",\\\"source\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":3,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"选择节点\\\",\\\"category\\\":\\\"select\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":786,\\\"y\\\":157},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2a0999fe-32f8-435b-aa06-cb095064e9bb\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":\\\"classic\\\",\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.41253799999999957}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 16:21:53',43),(167,'规则',3,'com.solution.web.controller.algo.AlgorithmController.remove()','DELETE',1,'admin','研发部门','/api/algo/algorithm/2','127.0.0.1','内网IP','[2] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 17:49:14',30),(168,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"1\",\"description\":\"参数名称\",\"id\":1,\"paramName\":\"参数1\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试1\",\"type\":\"test1\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 17:50:03',38),(169,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"1\",\"description\":\"参数名称\",\"id\":1,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"333\",\"id\":0,\"paramName\":\"333\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试1\",\"type\":\"test1\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 17:50:51',21),(170,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"333\",\"algorithmParamList\":[{\"algorithmId\":3,\"defaultValue\":\"33\",\"description\":\"33\",\"id\":0,\"paramName\":\"33\"},{\"algorithmId\":3,\"defaultValue\":\"dd\",\"description\":\"dd\",\"id\":0,\"paramName\":\"dd\"}],\"codePath\":\"33\",\"description\":\"33\",\"id\":3,\"name\":\"3333\",\"type\":\"333\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 17:54:37',20),(171,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"1\",\"description\":\"参数名称\",\"id\":1,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"333\",\"id\":2,\"paramName\":\"333\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试1\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 18:03:06',24),(172,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"333\",\"algorithmParamList\":[{\"algorithmId\":3,\"defaultValue\":\"33\",\"description\":\"33\",\"id\":4,\"paramName\":\"33\"},{\"algorithmId\":3,\"defaultValue\":\"dd\",\"description\":\"dd\",\"id\":5,\"paramName\":\"dd\"}],\"codePath\":\"33\",\"description\":\"33\",\"id\":3,\"name\":\"3333\",\"type\":\"formation\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 18:03:12',20),(173,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"333\",\"id\":2,\"paramName\":\"333\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试1\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 18:05:06',19),(174,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"3333333333333333\",\"algorithmParamList\":[{\"algorithmId\":4,\"defaultValue\":\"33\",\"description\":\"33\",\"id\":0,\"paramName\":\"33\"}],\"codePath\":\"3333\",\"description\":\"333333333333\",\"id\":4,\"name\":\"3333\",\"type\":\"defense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:46:59',51),(175,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"555555\",\"algorithmParamList\":[{\"algorithmId\":5,\"defaultValue\":\"33555555\",\"description\":\"33\",\"id\":0,\"paramName\":\"55555533\"}],\"codePath\":\"555555\",\"description\":\"555555\",\"id\":5,\"name\":\"555555\",\"type\":\"defense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:47:09',17),(176,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"66666\",\"algorithmParamList\":[{\"algorithmId\":6,\"defaultValue\":\"33555555\",\"description\":\"33\",\"id\":0,\"paramName\":\"66666\"}],\"codePath\":\"66666\",\"description\":\"66666\",\"id\":6,\"name\":\"66666\",\"type\":\"defense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:47:23',18),(177,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"77777\",\"algorithmParamList\":[{\"algorithmId\":7,\"defaultValue\":\"33555555\",\"description\":\"33\",\"id\":0,\"paramName\":\"66666\"}],\"codePath\":\"77777\",\"description\":\"77777\",\"id\":7,\"name\":\"77777\",\"type\":\"defense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:47:30',16),(178,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"888888\",\"algorithmParamList\":[{\"algorithmId\":8,\"defaultValue\":\"33555555\",\"description\":\"33\",\"id\":0,\"paramName\":\"888888\"}],\"codePath\":\"888888\",\"description\":\"888888\",\"id\":8,\"name\":\"888888\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:47:40',16),(179,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"999999\",\"algorithmParamList\":[{\"algorithmId\":9,\"id\":0,\"paramName\":\"999999\"}],\"codePath\":\"999999\",\"description\":\"999999\",\"id\":9,\"name\":\"999999\",\"type\":\"formation\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:48:35',18),(180,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"100000\",\"algorithmParamList\":[{\"algorithmId\":10,\"id\":0,\"paramName\":\"100000\"}],\"codePath\":\"100000\",\"description\":\"100000\",\"id\":10,\"name\":\"100000\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:48:44',19),(181,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"1100000\",\"algorithmParamList\":[{\"algorithmId\":11,\"id\":0,\"paramName\":\"1100000\"}],\"codePath\":\"1100000\",\"description\":\"1100000\",\"id\":11,\"name\":\"1100000\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:49:03',30),(182,'规则',1,'com.solution.web.controller.algo.AlgorithmController.add()','POST',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"ddd\",\"algorithmParamList\":[{\"algorithmId\":12,\"id\":0,\"paramName\":\"ddd\"}],\"codePath\":\"ddd\",\"description\":\"ddd\",\"id\":12,\"name\":\"ddd\",\"type\":\"defense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:51:27',18),(183,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"333\",\"id\":2,\"paramName\":\"333\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试1333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:52:44',18),(184,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"333\",\"id\":2,\"paramName\":\"333\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:52:47',24),(185,'规则',3,'com.solution.web.controller.algo.AlgorithmController.remove()','DELETE',1,'admin','研发部门','/api/algo/algorithm/5','127.0.0.1','内网IP','[5] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 19:53:00',19),(186,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"dddd\",\"algoConfigList\":[],\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"参数1描述\",\"id\":2,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"444\",\"description\":\"参数2描述\",\"id\":0,\"paramName\":\"参数2\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 20:18:58',45),(187,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"\",\"algoConfigList\":[],\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"参数1描述\",\"id\":2,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"444\",\"description\":\"参数2描述\",\"id\":15,\"paramName\":\"参数2\"}],\"codePath\":\"/home/test.pth\",\"description\":\"\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 20:19:44',37),(188,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"\",\"algoConfigList\":[],\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"参数1描述\",\"id\":2,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"444\",\"description\":\"参数2描述\",\"id\":15,\"paramName\":\"参数2\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 20:19:54',24),(189,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"参数1+参数2+参数2\",\"algoConfigList\":[{\"name\":\"参数1\",\"operation\":\"+\"},{\"name\":\"参数2\",\"operation\":\"+\"},{\"name\":\"参数2\"}],\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"参数1描述\",\"id\":2,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"444\",\"description\":\"参数2描述\",\"id\":15,\"paramName\":\"参数2\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 21:01:24',7605),(190,'规则',3,'com.solution.web.controller.algo.AlgorithmController.remove()','DELETE',1,'admin','研发部门','/api/algo/algorithm/4','127.0.0.1','内网IP','[4] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 21:02:42',20),(191,'规则',2,'com.solution.web.controller.algo.AlgorithmController.edit()','PUT',1,'admin','研发部门','/api/algo/algorithm','127.0.0.1','内网IP','{\"algoConfig\":\"参数1+参数2+参数2\",\"algoConfigList\":[{\"name\":\"参数1\",\"operation\":\"+\"},{\"name\":\"参数2\",\"operation\":\"+\"},{\"name\":\"参数2\"}],\"algorithmParamList\":[{\"algorithmId\":1,\"defaultValue\":\"333\",\"description\":\"参数1描述\",\"id\":2,\"paramName\":\"参数1\"},{\"algorithmId\":1,\"defaultValue\":\"444\",\"description\":\"参数2描述\",\"id\":15,\"paramName\":\"参数2\"}],\"codePath\":\"/home/test.pth\",\"description\":\"测试ddd\",\"id\":1,\"name\":\"测试133333333\",\"type\":\"offense\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 21:06:14',36),(192,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-02-09\",\"englishName\":\"ddddd\",\"id\":196,\"name\":\"行为树dd\",\"params\":{},\"updatedAt\":\"2026-02-09\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":318,\\\"y\\\":103},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2a0999fe-32f8-435b-aa06-cb095064e9bb\\\",\\\"source\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":3,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"选择节点\\\",\\\"category\\\":\\\"select\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":786,\\\"y\\\":157},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"37acf977-7f24-4a34-8639-ab0a43e02bf0\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlewl5g2_zkdvebx0\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mlewl7zc_kd3hwbb7\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":\\\"classic\\\",\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.5210689999999996}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 21:09:30',88),(193,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4ea06014-8025-42a2-a699-b1870d175bd9\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":3,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"选择节点\\\",\\\"category\\\":\\\"select\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":660,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"4ea06014-8025-42a2-a699-b1870d175bd9\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":\\\"classic\\\",\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0},\\\"marker\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-02-09 21:09:52',56),(194,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-12-23\",\"description\":\"测试行为树,第一个 (复制)\",\"englishName\":\"test_tree_copy_20251223_112352_329\",\"id\":188,\"name\":\"测试复制的行为树_20251223_112352_329\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmerm5yo_ltmbsm89\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":325,\\\"y\\\":216},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9d69a328-8b35-443b-a7df-086259029e95\\\",\\\"source\\\":\\\"root_mmerm5yo_ltmbsm89\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mmermd9k_sl7smg4j\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mmermd9k_sl7smg4j\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":3,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"选择节点\\\",\\\"category\\\":\\\"select\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":780,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9d69a328-8b35-443b-a7df-086259029e95\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mmerm5yo_ltmbsm89\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"select_mmermd9k_sl7smg4j\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":\\\"classic\\\",\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.4997290000000012}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-06 18:42:26',92),(195,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2025-10-19\",\"description\":\"战斗行为树1\",\"englishName\":\"combat_behavior_1\",\"id\":1,\"name\":\"战斗行为树133333333\",\"params\":{},\"updatedAt\":\"2026-01-07\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":268,\\\"y\\\":149},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fcafe29a-e8e9-40ff-bf7f-b9e219495016\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"precondition_mlet5hst_p5mtx2sr\\\",\\\"targetName\\\":\\\"轨迹有无判断\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4ea06014-8025-42a2-a699-b1870d175bd9\\\",\\\"source\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":3,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"选择节点\\\",\\\"category\\\":\\\"select\\\",\\\"description\\\":\\\"中间节点,执行到这里只会选择其中一个节点执行\\\",\\\"position\\\":{\\\"x\\\":660,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6e41f4e5-49a0-4d03-b382-7e0670260a0c\\\",\\\"source\\\":\\\"select_mlf6vkwy_gt8anfyw\\\",\\\"sourceName\\\":\\\"选择节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmernch2_1382ithd\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmernch2_1382ithd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"position\\\":{\\\"x\\\":880,\\\"y\\\":440},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"06d81ff9-ab68-4d8d-a613-6b737abe80d1\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mlesukv1_dh51wc9u\\\",\\\"selector\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-06 18:43:44',71),(196,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/1','127.0.0.1','内网IP','[1] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:01',16),(197,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/2','127.0.0.1','内网IP','[2] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:04',12),(198,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/3','127.0.0.1','内网IP','[3] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:05',10),(199,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/4','127.0.0.1','内网IP','[4] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:07',9),(200,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/5','127.0.0.1','内网IP','[5] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:08',10),(201,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/187','127.0.0.1','内网IP','[187] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:10',11),(202,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/188','127.0.0.1','内网IP','[188] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:11',11),(203,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/189','127.0.0.1','内网IP','[189] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:12',13),(204,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/196','127.0.0.1','内网IP','[196] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:40:14',12),(205,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 01:43:55',30),(206,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":340,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":780,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmm','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 10:09:03',291),(207,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":340,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":780,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmm','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 10:09:28',275),(208,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":340,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":780,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmm','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 10:11:41',255),(209,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":320,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1cf9352e-a477-4cfb-933a-c7b49212eb76\\\",\\\"source\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mmmv80ws_50iqlqt4\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 10:46:23',373),(210,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点0\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":320,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1cf9352e-a477-4cfb-933a-c7b49212eb76\\\",\\\"source\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mmmv80ws_50iqlqt4\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 13:38:02',371),(211,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":191,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点0\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"position\\\":{\\\"x\\\":320,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1cf9352e-a477-4cfb-933a-c7b49212eb76\\\",\\\"source\\\":\\\"root_mmmt10tc_8hgkm6zq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mmmv80ws_50iqlqt4\\\",\\\"targetName\\\":\\\"选择节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 14:26:26',464),(212,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"p','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 14:27:05',1025),(213,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"p','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-12 14:27:05',334),(214,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"order\\\":0},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-13 11:37:28',392),(215,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"order\\\":0},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-13 11:37:29',350),(216,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"order\\\":0},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-13 11:38:03',646),(217,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-12\",\"englishName\":\"tree1\",\"id\":197,\"name\":\"行为树0\",\"params\":{},\"updatedAt\":\"2026-03-12\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtumi4_vdtjzd4b\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":121,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查雷达雷针朝向1\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前雷达雷针朝向是否与初始朝向一致\\\",\\\"position\\\":{\\\"x\\\":960,\\\"y\\\":920},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmmtup2x_43ah8rnh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":126,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"追击节点1\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"朝敌方战机飞行\\\",\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"order\\\":1},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtv6ch_hv8tyxso\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"order\\\":0},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmmtw5k1_1b3v1fc2\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内0\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":940},\\\"width\\\":250,\\\"height\\\":120,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-13 11:38:29',322),(218,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree222\",\"id\":198,\"name\":\"行为树2\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmoli4gs_nd20tx0z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e08db00-7128-4ffc-8a14-8f52b8e38b08\\\",\\\"source\\\":\\\"root_mmoli4gs_nd20tx0z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"select_mmolj67y_r2gobhbr\\\",\\\"targetName\\\":\\\"选择节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"c834c378-e335-42ef-99da-6090af3cc569\\\",\\\"source\\\":\\\"root_mmoli4gs_nd20tx0z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mmoli67o_9iao0f3x\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmoli67o_9iao0f3x\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"b6071366-46b0-46b3-81fd-81daba0a795d\\\",\\\"source\\\":\\\"parallel_mmoli67o_9iao0f3x\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmoli98i_un0skvye\\\",\\\"targetName\\\":\\\"检查是否在范围内\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b513dc23-61de-43de-a492-a91f03033b91\\\",\\\"source\\\":\\\"parallel_mmoli67o_9iao0f3x\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmolifit_ig73vkdw\\\",\\\"targetName\\\":\\\"转向目标\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmoli98i_un0skvye\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"i','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-13 15:50:42',710),(219,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"radar1\",\"id\":199,\"name\":\"雷达行为树1\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:08:34',44),(220,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"radar2\",\"id\":200,\"name\":\"雷达行为树2\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:08:47',18),(221,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"radar3\",\"id\":201,\"name\":\"雷达行为树3\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:09:02',184),(222,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:09:12',30),(223,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar2\",\"id\":200,\"name\":\"预警雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:09:16',25),(224,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:09:20',24),(225,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:09:54',11),(226,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:10:11',12),(227,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"33333\",\"id\":204,\"name\":\"防空火炮行为树(近)\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:10:22',10),(228,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"33333\",\"id\":0,\"name\":\"防空火炮行为树(近)\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ',NULL,1,'\r\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'防空火炮行为树(近)\' for key \'behaviortree.name\'\r\n### The error may exist in file [E:\\work\\auto-solution\\auto-solution-behaviour\\target\\classes\\mapper\\system\\BehaviortreeMapper.xml]\r\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\r\n### The error occurred while setting parameters\r\n### SQL: insert into behaviortree ( name, english_name, xml_content ) values ( ?, ?, ? )\r\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'防空火炮行为树(近)\' for key \'behaviortree.name\'\n; Duplicate entry \'防空火炮行为树(近)\' for key \'behaviortree.name\'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'防空火炮行为树(近)\' for key \'behaviortree.name\'','2026-03-14 07:10:24',68),(229,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:10:43',12),(230,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8480e43d-715a-402a-9db1-536c03149b6d\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"7db3db31-70af-48fd-a409-f08b42cbe654\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":118,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"打开雷达\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"雷达开始工作\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":720,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":70,\\\"templateId\\\":118,\\\"paramKey\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:12:22',112),(231,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar2\",\"id\":200,\"name\":\"预警雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"24518193-c4c1-4822-a42e-2036b41aa59d\\\",\\\"source\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2e7f131d-c11d-49f9-a835-a7513bee26dc\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"a5404bf9-d994-438c-895e-ca0b8578da52\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpznuco_lpqk4e6h\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":228,\\\"y\\\":699},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:13:29',138),(232,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":-20},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\\\",\\\"source\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f9deb620-ea85-417d-bdff-3c2cea828821\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzp4wh_buba6q1d\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:14:20',148),(233,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:15:26',204),(234,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":780},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:16:18',120),(235,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmq08d69_4vy0laz7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:29:38',38),(236,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmq08d69_4vy0laz7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":320,\\\"y\\\":820},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:31:02',53),(237,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmq08d69_4vy0laz7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":380,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-20,\\\"y\\\":1140},\\\"width\\\":25','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:33:44',126),(238,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmq08d69_4vy0laz7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"98479a49-525b-458f-abcb-9a4dba031925\\\",\\\"source\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"targetName\\\":\\\"发送地面展开命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9946ca76-b4cc-4823-9e1f-a30d578b9572\\\",\\\"source\\\":\\\"sequence_mmq08ic9_cpyqazzr\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":100,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"sou','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:44:05',167),(239,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmq08d69_4vy0laz7\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":100,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":380,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"te','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:49:11',169),(240,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":100,\\\"y\\\":640},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":380,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-20,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templa','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 07:52:15',153),(241,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":380,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-20,\\\"y\\\":1140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:08:44',307),(242,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/204','127.0.0.1','内网IP','[204] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:09:23',17),(243,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":780},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:09:31',213),(244,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8480e43d-715a-402a-9db1-536c03149b6d\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"7db3db31-70af-48fd-a409-f08b42cbe654\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":118,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"打开雷达\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"雷达开始工作\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":720,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":70,\\\"templateId\\\":118,\\\"paramKey\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:09:37',179),(245,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8480e43d-715a-402a-9db1-536c03149b6d\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"7db3db31-70af-48fd-a409-f08b42cbe654\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":118,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"打开雷达\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"雷达开始工作\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":720,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":70,\\\"templateId\\\":118,\\\"paramKey\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:09:42',173),(246,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:10:02',227),(247,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-200,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:44:07',387),(248,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-200,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:45:00',201),(249,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-200,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:46:34',218),(250,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-200,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:46:48',423),(251,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-200,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"type\\\":\\\"task\\\",\\\"templ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:47:04',463),(252,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:47:44',322),(253,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:51:25',471),(254,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:51:26',116),(255,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:52:07',123),(256,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:52:11',109),(257,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8480e43d-715a-402a-9db1-536c03149b6d\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"7db3db31-70af-48fd-a409-f08b42cbe654\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"targetName\\\":\\\"打开雷达\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"05cb0d0f-1c33-4055-9250-995e5268cee9\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":117,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"对敌人进行火力打击,需要指定武器名称,齐射数量\\\",\\\"order\\\":0,\\\"pos','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:52:54',96),(258,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8480e43d-715a-402a-9db1-536c03149b6d\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"7db3db31-70af-48fd-a409-f08b42cbe654\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzmtlb_l37axl24\\\",\\\"targetName\\\":\\\"打开雷达\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"05cb0d0f-1c33-4055-9250-995e5268cee9\\\",\\\"source\\\":\\\"root_mmpzmmyn_diyqshgq\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":240,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":117,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"对敌人进行火力打击,需要指定武器名称,齐射数量\\\",\\\"order\\\":0,\\\"pos','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 08:52:55',98),(259,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:28:33',180),(260,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar2\",\"id\":200,\"name\":\"预警雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"24518193-c4c1-4822-a42e-2036b41aa59d\\\",\\\"source\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2e7f131d-c11d-49f9-a835-a7513bee26dc\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"a5404bf9-d994-438c-895e-ca0b8578da52\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpznuco_lpqk4e6h\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":228,\\\"y\\\":699},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:28:38',198),(261,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":-20},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\\\",\\\"source\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f9deb620-ea85-417d-bdff-3c2cea828821\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzp4wh_buba6q1d\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:28:53',249),(262,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":-20},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\\\",\\\"source\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f9deb620-ea85-417d-bdff-3c2cea828821\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzp4wh_buba6q1d\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:28:55',1472),(263,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:29:03',196),(264,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:29:04',213),(265,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequence_mmpzq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:29:04',229),(266,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-14 09:39:34',337),(267,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"Radar_Start\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequenc','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:27:53',154),(268,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar2\",\"id\":200,\"name\":\"预警雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"24518193-c4c1-4822-a42e-2036b41aa59d\\\",\\\"source\\\":\\\"root_mmpznh0o_sdwhm0bp\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2e7f131d-c11d-49f9-a835-a7513bee26dc\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"a5404bf9-d994-438c-895e-ca0b8578da52\\\",\\\"source\\\":\\\"sequence_mmpznm8h_wyrse9wy\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpznuco_lpqk4e6h\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpznry2_rk7uu4cw\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":228,\\\"y\\\":699},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:27:58',111),(269,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":-20},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\\\",\\\"source\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f9deb620-ea85-417d-bdff-3c2cea828821\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzp4wh_buba6q1d\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:28:06',95),(270,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"Radar_Start\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequenc','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:28:49',106),(271,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"Radar_Start\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequenc','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:28:49',106),(272,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar1\",\"id\":199,\"name\":\"预警雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"1e607f23-6b82-4351-bb55-d1c833bc7d64\\\",\\\"source\\\":\\\"root_mmpzpu5s_nf6s11cl\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"Radar_Start\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"63b1d95c-0e2b-4ced-a33b-bfcc8f03e9a9\\\",\\\"source\\\":\\\"sequence_mmpzqijl_ohk44qrd\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzq2fu_h1pf2t2v\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"91023fd8-2737-4692-8fb9-14e220a556ed\\\",\\\"source\\\":\\\"sequenc','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 02:28:49',109),(273,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:00:24',229),(274,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:07:32',275),(275,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:07:36',223),(276,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:09:28',268),(277,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":60,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descri','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:09:47',303),(278,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":100,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descr','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:09:58',260),(279,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descr','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:14:49',259),(280,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 03:16:40',99),(281,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmrfp1i3_svby7o21\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"cond','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:29:49',216),(282,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":117,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"对敌人进行火力打击,需要指定武器名称,齐射数量\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":68,\\\"templateId\\\":117,\\\"paramKey\\\":\\\"salvo_size\\\",\\\"dataType\\\":\\\"int\\\",\\\"defaultValue\\\":\\\"2\\\",\\\"description\\\":\\\"齐射数量\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":69,\\\"templateId\\\":117,\\\"paramKey\\\":\\\"weaponName\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"naval_sam\\\",\\\"description\\\":\\\"发射的武器名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmrfqkf7_4ako7i6v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:31:12',210),(283,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"1111\",\"id\":202,\"name\":\"防空火炮行为树(远)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzmovr_wrwzo1kr\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":220,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq387u5_lqo2dj5g\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":117,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"开火\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"对敌人进行火力打击,需要指定武器名称,齐射数量\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":920,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":68,\\\"templateId\\\":117,\\\"paramKey\\\":\\\"salvo_size\\\",\\\"dataType\\\":\\\"int\\\",\\\"defaultValue\\\":\\\"2\\\",\\\"description\\\":\\\"齐射数量\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":69,\\\"templateId\\\":117,\\\"paramKey\\\":\\\"weaponName\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"naval_sam\\\",\\\"description\\\":\\\"发射的武器名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmrfqkf7_4ako7i6v\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:31:26',187),(284,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmrfp1i3_svby7o21\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"cond','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:31:39',198),(285,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmrfp1i3_svby7o21\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"cond','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:31:40',185),(286,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmrfp1i3_svby7o21\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"cond','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:31:50',178),(287,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"2222\",\"id\":203,\"name\":\"防空火炮行为树(中)\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":500,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"bbd782ce-16d2-4ba7-929e-d9c0e2d44e49\\\",\\\"source\\\":\\\"root_mmpzrh0o_tn40029a\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":520},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6ec8b239-e122-4846-8a5d-d0ecfec768e5\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzrsw8_vtl8b7b4\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f6a27f17-73f3-41ce-8d56-91f77ddb9573\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzrwm0_voybvz4c\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9d6c0167-9f8e-4850-b928-a2394ef03515\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq36b31_jlzyf3gx\\\",\\\"targetName\\\":\\\"开火\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8e3ef092-7e66-4b7a-abd7-a055a4cca888\\\",\\\"source\\\":\\\"sequence_mmpzrknm_1g6p5874\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmrfp1i3_svby7o21\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"cond','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:32:03',191),(288,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"11111111111111111111\",\"id\":207,\"name\":\"行为树11111\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:51:24',15),(289,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descr','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:52:48',369),(290,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"asdfasdf\",\"id\":208,\"name\":\"行为树fadfasdf\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:53:41',12),(291,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/207','127.0.0.1','内网IP','[207] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:54:49',17),(292,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/208','127.0.0.1','内网IP','[208] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 07:54:51',20),(293,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":580,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"8855235e-57ea-4d07-aec3-eba6cafd6ce5\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0c6r7_iu08z4de\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0fd5525d-7f98-4bec-afaf-ab5c4ad4e172\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmq0cdux_x9gg5h30\\\",\\\"targetName\\\":\\\"顺序节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"094f32f9-07dc-4b12-9b54-25227ce6f560\\\",\\\"source\\\":\\\"parallel_mmq09r29_33edkx1d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmq31lo4_uryzls2g\\\",\\\"targetName\\\":\\\"情报信息融合分析\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":140,\\\"y\\\":1100},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"descr','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 10:00:44',316),(294,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0kr01_af2qksvs\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":196,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"后续评估。。。。(暂定)\\\",\\\"order\\\":3,\\\"position\\\":{\\\"x\\\":1300,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"满足开火条件\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 10:03:20',367),(295,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0kr01_af2qksvs\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":196,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"后续评估。。。。(暂定)\\\",\\\"order\\\":3,\\\"position\\\":{\\\"x\\\":1500,\\\"y\\\":1200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"满足开火条件\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 10:11:27',374),(296,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0kr01_af2qksvs\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":196,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"后续评估。。。。(暂定)\\\",\\\"order\\\":3,\\\"position\\\":{\\\"x\\\":1500,\\\"y\\\":1200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"满足开火条件\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 10:48:21',378),(297,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0kr01_af2qksvs\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":196,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"后续评估。。。。(暂定)\\\",\\\"order\\\":3,\\\"position\\\":{\\\"x\\\":1500,\\\"y\\\":1200},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 11:22:48',367),(298,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-160,\\\"y\\\":680},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"根据之前的节点时间判断,说明师父要进行开火\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":1000,\\\"y\\\":1500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2zhg4_4qsobl1c\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":192,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送开火指令\\\",\\\"category\\\":\\\"action\\\",\\\"descrip','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 11:22:57',361),(299,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-460,\\\"y\\\":600},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"根据之前的节点时间判断,说明师父要进行开火\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":1000,\\\"y\\\":1500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2zhg4_4qsobl1c\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":192,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送开火指令\\\",\\\"category\\\":\\\"action\\\",\\\"descrip','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 11:46:21',354),(300,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"command\",\"id\":206,\"name\":\"指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq09mbk_vrrhejtz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":197,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送地面展开命令\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-460,\\\"y\\\":600},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0a8r4_xdf3k3vv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":194,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送雷达控制\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":20,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq0be5t_nk0kw8pv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":199,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"雷达目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-340,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2xbpk_zrtx4wn0\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":195,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"目标分配\\\",\\\"category\\\":\\\"action\\\",\\\"description\\\":\\\"火力规则的计算影响的是现在威胁单位一共有多少,我方一共有多少可以被控制的执行单位,火力单位,然后把我们的火炮和对应的目标进行分配起来\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":1220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmq2z6hq_crlt7nw9\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":198,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"火力打击评估\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"根据之前的节点时间判断,说明师父要进行开火\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":1000,\\\"y\\\":1500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mmq2zhg4_4qsobl1c\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":192,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送开火指令\\\",\\\"category\\\":\\\"action\\\",\\\"descrip','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-15 11:54:38',239),(301,'行为树主',1,'com.solution.scene.controller.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mmslhyw8_2m148m1i\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_nebo_m_2\\\",\\\"platformId\\\":2,\\\"components\\\":[{\\\"id\\\":3,\\\"name\\\":\\\"sam2\\\",\\\"type\\\":\\\"weapon\\\",\\\"description\\\":\\\"地对空导弹第二种\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":4,\\\"name\\\":\\\"aam3\\\",\\\"type\\\":\\\"weapon\\\",\\\"description\\\":\\\"空对空导弹(测试版)\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":8,\\\"name\\\":\\\"comm2\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯处理器2\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":9,\\\"name\\\":\\\"comm1\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯处理器1\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":14,\\\"name\\\":\\\"command_and_control_system_comm\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"蓝方指挥控制系统\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":15,\\\"name\\\":\\\"communication_system_comm\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"蓝方通信系统\\\",\\\"platformId\\\":2,\\\"num\\\":null},{\\\"id\\\":16,\\\"name\\\":\\\"intelligence_system_comm\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"蓝方情报系统\\\",\\\"platformId\\\":2,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"歼击机\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":100,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":265,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f145b4f5-fc49-4718-a37a-d348b708dbb8\\\",\\\"source\\\":\\\"mmslhyw8_2m148m1i\\\",\\\"sourceName\\\":\\\"red_nebo_m_2\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmsli2bt_q8398pg8\\\",\\\"targetName\\\":\\\"blue_commander\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mmsli2bt_q8398pg8\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"blue_commander\\\",\\\"platformId\\\":4,\\\"components\\\":[{\\\"id\\\":20,\\\"name\\\":\\\"nebo_m_radar\\\",\\\"type\\\":\\\"radar\\\",\\\"description\\\":\\\"红方Nebo-M相控阵雷达\\\",\\\"platformId\\\":4,\\\"num\\\":null},{\\\"id\\\":21,\\\"name\\\":\\\"communication_system_comm\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"雷达通信系统\\\",\\\"platformId\\\":4,\\\"num\\\":null},{\\\"id\\\":22,\\\"name\\\":\\\"data_link_system_comm\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"雷达数据链系统\\\",\\\"platformId\\\":4,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-16 03:00:59',20),(302,'行为树主',1,'com.solution.scene.controller.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mmssl132_24h2ausw\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_buk_m3\\\",\\\"platformId\\\":9,\\\"components\\\":[{\\\"id\\\":77,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"防空导弹通信\\\",\\\"platformId\\\":9,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方Buk-M3防空系统\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mmssl2e8_hn8f0n3l\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_commander\\\",\\\"platformId\\\":3,\\\"components\\\":[{\\\"id\\\":72,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"指挥官通信器\\\",\\\"platformId\\\":3,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方指挥官\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":560,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9a72ab77-cffb-47e7-96ae-6c0839ce6219\\\",\\\"source\\\":\\\"mmssl2e8_hn8f0n3l\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmssl132_24h2ausw\\\",\\\"targetName\\\":\\\"red_buk_m3\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"1dcef284-4e4f-4c05-8f29-229bd5f29f3f\\\",\\\"source\\\":\\\"mmssl2e8_hn8f0n3l\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmssl8i7_6yr8cf9z\\\",\\\"targetName\\\":\\\"red_s400\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b7041fae-9f5c-4036-9384-8998d15b1d15\\\",\\\"source\\\":\\\"mmssl2e8_hn8f0n3l\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmsslgan_edgbotkc\\\",\\\"targetName\\\":\\\"red_nebo_m_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"6abeb286-896c-4626-855a-dfc061183261\\\",\\\"source\\\":\\\"mmssl2e8_hn8f0n3l\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmsslhke_jvhd8y5r\\\",\\\"targetName\\\":\\\"red_nebo_m_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"57eb007d-b367-4606-b9d4-b3694679fed6\\\",\\\"source\\\":\\\"mmssl2e8_','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-16 06:19:18',84),(303,'行为树主',1,'com.solution.scene.controller.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_commander\\\",\\\"platformId\\\":3,\\\"components\\\":[{\\\"id\\\":72,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"指挥官通信器\\\",\\\"platformId\\\":3,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方指挥官\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":620,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"7372de0b-c329-44b9-bed8-309c8a4e8026\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgi8p_a84ugty5\\\",\\\"targetName\\\":\\\"red_nebo_m_3\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8d778d1b-834e-4552-b2de-58d06ac30025\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxggns_q1faakn1\\\",\\\"targetName\\\":\\\"red_nebo_m_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"333a7baf-776b-4661-8f00-1413cfe68854\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgfh3_u0eu9i4r\\\",\\\"targetName\\\":\\\"red_nebo_m_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"06c260aa-76ff-4cf7-a1af-c0c6209aa9b1\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxg9mv_5eqg6lvl\\\",\\\"targetName\\\":\\\"red_buk_m3\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"3b496b09-1cfa-4f3a-81c8-8f561760a96b\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgcy9_9bya305v\\\",\\\"targetName\\\":\\\"red_s400\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mmtxg9mv_5eqg6lvl\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_buk_m3\\\",\\\"platformId\\\":9,\\\"components\\\":[{\\\"id\\\":77,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"防空导弹通信\\\",\\\"platformId\\\":9,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方Bu','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-17 01:23:01',30),(304,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-14\",\"englishName\":\"radar3\",\"id\":201,\"name\":\"预警雷达行为树3\",\"params\":{},\"updatedAt\":\"2026-03-14\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":-20},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"da2f0eb3-c945-45eb-82e2-e9bfe3c88eef\\\",\\\"source\\\":\\\"root_mmpzor5s_g38ziljv\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"a5062c95-93e9-409f-82d8-ffc166d6f3d5\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f9deb620-ea85-417d-bdff-3c2cea828821\\\",\\\"source\\\":\\\"sequence_mmpzowpc_1biuz6zn\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mmpzp4wh_buba6q1d\\\",\\\"targetName\\\":\\\"打开雷达\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mmpzozt5_xxbxbn7l\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":280,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-22 05:39:14',148),(305,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"行为树111\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 01:12:12',56),(306,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"111111111111111111\",\"id\":0,\"name\":\"行为树111\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"80b62952-7754-494d-91b5-a0843fa3f4f5\\\",\\\"source\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mn2hr67y_f02gc2nl\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn2hqqbq_vbp6yzr1\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":200,\\\"y\\\":480},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"c108be70-203c-49cc-83ba-a50fc20e5a14\\\",\\\"source\\\":\\\"condition_mn2hqqbq_vbp6yzr1\\\",\\\"sourceName\\\":\\\"检查是否在范围内\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2hrbqi_j58liywv\\\",\\\"targetName\\\":\\\"检查雷达雷针朝向\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn2hr67y_f02gc2nl\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\"',NULL,1,'\r\n### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'行为树111\' for key \'behaviortree.name\'\r\n### The error may exist in file [E:\\work\\auto-solution\\auto-solution-behaviour\\target\\classes\\mapper\\system\\BehaviortreeMapper.xml]\r\n### The error may involve com.solution.system.mapper.BehaviortreeMapper.insertBehaviortree-Inline\r\n### The error occurred while setting parameters\r\n### SQL: insert into behaviortree ( name, english_name, xml_content ) values ( ?, ?, ? )\r\n### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'行为树111\' for key \'behaviortree.name\'\n; Duplicate entry \'行为树111\' for key \'behaviortree.name\'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry \'行为树111\' for key \'behaviortree.name\'','2026-03-23 01:13:43',63),(307,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"行为树111\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":621,\\\"y\\\":447},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"0c24b14e-f7f2-42b2-b143-412e77d47e20\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"targetName\\\":\\\"检查是否在范围内\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0c8ccfec-cb02-4c29-b40a-ad53d9d6dd26\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2ht3qg_cwebfuaq\\\",\\\"targetName\\\":\\\"满足开火条件\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":488,\\\"y\\\":669},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 01:14:34',231),(308,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"行为树111\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"e1d7c7ab-c4c5-4070-8938-d5990b1dfeac\\\",\\\"source\\\":\\\"root_mn2hqlpg_19betm0f\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"targetName\\\":\\\"顺序节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":621,\\\"y\\\":447},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"0c24b14e-f7f2-42b2-b143-412e77d47e20\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"targetName\\\":\\\"检查是否在范围内\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0c8ccfec-cb02-4c29-b40a-ad53d9d6dd26\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2ht3qg_cwebfuaq\\\",\\\"targetName\\\":\\\"满足开火条件\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":488,\\\"y\\\":669},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 01:14:38',247),(309,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"行为树111\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":620,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"0c24b14e-f7f2-42b2-b143-412e77d47e20\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"targetName\\\":\\\"检查是否在范围内\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0c8ccfec-cb02-4c29-b40a-ad53d9d6dd26\\\",\\\"source\\\":\\\"sequence_mn2hstyf_f280dlbp\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn2ht3qg_cwebfuaq\\\",\\\"targetName\\\":\\\"满足开火条件\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn2hswmh_iwvzkkjz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":115,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否在范围内\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"需要指定距离平台距离目标的范围,比如是否进入打击范围,是否进入任务区范围,判断是否进行攻击\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":488,\\\"y\\\":669},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":65,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"range\\\",\\\"dataType\\\":\\\"double\\\",\\\"defaultValue\\\":\\\"5000\\\",\\\"description\\\":\\\"防护范围\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":66,\\\"templateId\\\":115,\\\"paramKey\\\":\\\"radar_name\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"sam_radar\\\",\\\"description\\\":\\\"雷达名称\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"14cb5a44-d9dd-4979-a35f-0dc4c361351c\\\",\\\"source\\\":\\\"condi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 01:58:21',201),(310,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:01',51),(311,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":120},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:04',31),(312,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333\",\"id\":212,\"name\":\"干扰武器行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:09',30),(313,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"44\",\"id\":213,\"name\":\"雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:14',33),(314,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":222,\"name\":\"雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":440,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:20',31),(315,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":440,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 07:50:24',33),(316,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:09:15',31),(317,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:02',41),(318,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333\",\"id\":212,\"name\":\"干扰武器行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ba576f59-6489-4fe5-a636-b515ed84f472\\\",\\\"source\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":440,\\\"y\\\":420},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ba576f59-6489-4fe5-a636-b515ed84f472\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.7166040000000503}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:18',44),(319,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"44\",\"id\":213,\"name\":\"雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"65f8fbcc-9a01-4a73-ab50-20e7e38e6536\\\",\\\"source\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"65f8fbcc-9a01-4a73-ab50-20e7e38e6536\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.9249709999999032}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:23',43),(320,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":222,\"name\":\"雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"07084f60-1519-4bca-b24c-bf652517052a\\\",\\\"source\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"07084f60-1519-4bca-b24c-bf652517052a\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.016586000000010245}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:33',47),(321,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.2665799999999581}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:46',45),(322,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.14982999999995808}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:49',49),(323,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.8166039999999338}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:15:56',47),(324,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61aad48c-3ec5-43c1-baa2-9b1698bbf3aa\\\",\\\"source\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"targetName\\\":\\\"IS_CMD\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"84e5e2dc-d22a-44c7-acbf-fbbc83cbb7f1\\\",\\\"source\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2ww6dn_fz4b4ni4\\\",\\\"targetName\\\":\\\"CMD_DAP\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"0a1d245c-5fdc-47ec-9afc-3807fc2dad34\\\",\\\"source\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"targetName\\\":\\\"CMD_TA\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"IS_CMD\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:16:47',90),(325,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9aefce90-80f1-42ca-a138-0affa14d7230\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwy7e_43mjie3t\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwz19_3tjlgj02\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx00h_37ll63ly\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx169_cshuzgei\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:17:39',110),(326,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9aefce90-80f1-42ca-a138-0affa14d7230\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwy7e_43mjie3t\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwz19_3tjlgj02\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx00h_37ll63ly\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx169_cshuzgei\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:18:09',104),(327,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9aefce90-80f1-42ca-a138-0affa14d7230\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwy7e_43mjie3t\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwz19_3tjlgj02\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx00h_37ll63ly\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx169_cshuzgei\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:18:14',106),(328,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9aefce90-80f1-42ca-a138-0affa14d7230\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwy7e_43mjie3t\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwz19_3tjlgj02\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx00h_37ll63ly\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx169_cshuzgei\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:18:20',103),(329,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":211,\"name\":\"干扰武器行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"35af956a-2eb2-467e-8cd9-678c16ed152a\\\",\\\"source\\\":\\\"root_mn2vy9ih_myh6sluz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":340},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9aefce90-80f1-42ca-a138-0affa14d7230\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwy7e_43mjie3t\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ca3470f7-7372-4cc1-8a9f-80821d3c1387\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wwz19_3tjlgj02\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"fa313a3d-7457-4ea3-83d8-d2e82e0af59e\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx00h_37ll63ly\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d92c146c-31e0-4aeb-b3c3-5560ac95e0a6\\\",\\\"source\\\":\\\"parallel_mn2wtqn7_00wp747d\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wx169_cshuzgei\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:18:24',108),(330,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333\",\"id\":212,\"name\":\"干扰武器行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ba576f59-6489-4fe5-a636-b515ed84f472\\\",\\\"source\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":420},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"cf9caa07-1735-4364-9c7b-6fc925a2b8e9\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wywma_lct2qhyr\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d32cbaec-b6fa-4e25-982f-10497e9eaded\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyxk1_nudj21w1\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"573c150f-1f30-4492-ac49-4479adcea175\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyyou_1dsk7kjw\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"a24a0b13-eb21-4a67-8f71-b912c0b0b8f5\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyzw1_oskcpuf4\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:19:03',110),(331,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333\",\"id\":212,\"name\":\"干扰武器行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":240},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"ba576f59-6489-4fe5-a636-b515ed84f472\\\",\\\"source\\\":\\\"root_mn2vydll_5t3s8zx4\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":420},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"cf9caa07-1735-4364-9c7b-6fc925a2b8e9\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wywma_lct2qhyr\\\",\\\"targetName\\\":\\\"JAM_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"d32cbaec-b6fa-4e25-982f-10497e9eaded\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyxk1_nudj21w1\\\",\\\"targetName\\\":\\\"JAM_JAM\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"573c150f-1f30-4492-ac49-4479adcea175\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyyou_1dsk7kjw\\\",\\\"targetName\\\":\\\"JAM_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"a24a0b13-eb21-4a67-8f71-b912c0b0b8f5\\\",\\\"source\\\":\\\"parallel_mn2wum3e_jdcyf4ig\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wyzw1_oskcpuf4\\\",\\\"ta','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:19:09',105),(332,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"44\",\"id\":213,\"name\":\"雷达行为树1\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"65f8fbcc-9a01-4a73-ab50-20e7e38e6536\\\",\\\"source\\\":\\\"root_mn2vygyb_t67z8o5s\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":400,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"b2b3aa73-4a51-4901-ba0a-99e17ff2aac6\\\",\\\"source\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2wzx5g_8y336r6z\\\",\\\"targetName\\\":\\\"SEN_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4a323b53-c154-45fd-97f1-d8551a8d6ce2\\\",\\\"source\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2x00gp_9ohm4udy\\\",\\\"targetName\\\":\\\"SENSOR_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"71a858b6-961d-4725-bd27-feab52a1986d\\\",\\\"source\\\":\\\"parallel_mn2wuskh_ix0xd9l6\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2x02nt_h2t2cfef\\\",\\\"targetName\\\":\\\"SENSOR_FD\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2wzx5g_8y336r6z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":223,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"SEN_RCH\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:19:48',93),(333,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"222\",\"id\":222,\"name\":\"雷达行为树2\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"07084f60-1519-4bca-b24c-bf652517052a\\\",\\\"source\\\":\\\"root_mn2vyl9d_zo1s5vip\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"fd1b3c15-e50d-4e5b-93c5-3e133349d30d\\\",\\\"source\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2x0nwc_vcj8ncs5\\\",\\\"targetName\\\":\\\"SEN_RCH\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4f8b1c04-f54e-498b-9681-9687ce6b5ec0\\\",\\\"source\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2x0p3u_vtj7onvh\\\",\\\"targetName\\\":\\\"SENSOR_AAO\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"f8b80cf0-9664-4e35-9f30-bb33003e94e0\\\",\\\"source\\\":\\\"parallel_mn2wuz7m_6hvp0uyc\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2x0rf7_b9yjvf56\\\",\\\"targetName\\\":\\\"SENSOR_FD\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2x0nwc_vcj8ncs5\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":223,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"SEN_RCH\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 08:20:19',89),(334,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-23 09:45:16',63),(335,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"IS_CMD\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":160,\\\"y\\\":480},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww6dn_fz4b4ni4\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":217,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_DAP\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":1,\\\"position\\\":{\\\"x\\\":440,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":218,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_TA\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":860,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-24 05:18:42',183),(336,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.8999099999999999}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 08:01:35',112),(337,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.6747600000000002}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 08:01:43',73),(338,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"d41543c4-1e2f-4a67-8a9c-9b2ea3960565\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.6166399999999999}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 09:12:29',62),(339,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"d4582e49-6dca-4b09-9fc3-330b389e45bc\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.2832800000000002}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 09:21:11',50),(340,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"940c8e68-e5e4-4d6c-be4e-68e83f4d2856\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.4999699999988079}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 09:41:33',48),(341,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":180},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":231,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"940c8e68-e5e4-4d6c-be4e-68e83f4d2856\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#5da0df\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.7920699999984354}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 09:48:12',56),(342,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":160},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9cda2e3c-0085-4b29-9fd8-db0f48358983\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":360},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"2b3f93b7-7230-4c57-a2eb-966c888859ee\\\",\\\"source\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn5w105m_t0xr25ud\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"904b5271-7526-4c2e-9a85-7fc233ecf97f\\\",\\\"source\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5w1l0c_9b3lhafy\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn5w105m_t0xr25ud\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-25 10:16:02',128),(343,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":360,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9cda2e3c-0085-4b29-9fd8-db0f48358983\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn76yo05_6ygtl6wh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":232,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":320,\\\"y\\\":380},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":73,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"target_platform\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":null,\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":74,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":null,\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":75,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"\\\",\\\"description\\\":\\\" \\\",\\\"templateType\\\":\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-26 08:10:05',91),(344,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"333asdf\",\"id\":223,\"name\":\"直升机行为树\",\"params\":{},\"updatedAt\":\"2026-03-25\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":360,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"6f37a29a-75ea-4a3f-be3b-b6815e23ec9e\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn5r8nqk_h2ff1e5q\\\",\\\"targetName\\\":\\\"发送阵位分配命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"9cda2e3c-0085-4b29-9fd8-db0f48358983\\\",\\\"source\\\":\\\"root_mn2vyoqs_n6fm60yf\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn5w0rw2_20uznhe3\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn79kn1g_x8x8t2mh\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":232,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送阵位分配命令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":null,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":279,\\\"y\\\":525},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":73,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"target_platform\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"radar\\\",\\\"description\\\":\\\"接受消息的平台\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":74,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\"},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":75,\\\"templateId\\\":232,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-26 09:22:29',73),(345,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_commander\\\",\\\"platformId\\\":3,\\\"components\\\":[{\\\"id\\\":72,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"指挥官通信器\\\",\\\"platformId\\\":3,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方指挥官\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-320,\\\"y\\\":280},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"7372de0b-c329-44b9-bed8-309c8a4e8026\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgi8p_a84ugty5\\\",\\\"targetName\\\":\\\"red_nebo_m_3\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"8d778d1b-834e-4552-b2de-58d06ac30025\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxggns_q1faakn1\\\",\\\"targetName\\\":\\\"red_nebo_m_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"333a7baf-776b-4661-8f00-1413cfe68854\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgfh3_u0eu9i4r\\\",\\\"targetName\\\":\\\"red_nebo_m_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"06c260aa-76ff-4cf7-a1af-c0c6209aa9b1\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxg9mv_5eqg6lvl\\\",\\\"targetName\\\":\\\"red_buk_m3\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"3b496b09-1cfa-4f3a-81c8-8f561760a96b\\\",\\\"source\\\":\\\"mmtxg7x4_pladl9bs\\\",\\\"sourceName\\\":\\\"red_commander\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mmtxgcy9_9bya305v\\\",\\\"targetName\\\":\\\"red_s400\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mmtxg9mv_5eqg6lvl\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"red_buk_m3\\\",\\\"platformId\\\":9,\\\"components\\\":[{\\\"id\\\":77,\\\"name\\\":\\\"com\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"防空导弹通信\\\",\\\"platformId\\\":9,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"红方B','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:12:53',57),(346,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:17:20',20),(347,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.34803800000000046}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:19:09',60),(348,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:20:42',161),(349,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:23:16',172),(350,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:25:21',290),(351,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:25:41',293),(352,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:27:03',287),(353,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"totalcommander\",\"id\":225,\"name\":\"总指挥官\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":540,\\\"y\\\":200},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"5c3d794f-f7c9-4336-add2-6e8288f86d2e\\\",\\\"source\\\":\\\"root_mn89tw9c_5f86ox9z\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9fba60be-d22c-4045-82d9-6fe2b32251c1\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"82c73cdf-f314-4f62-9011-7e879dfc279c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xt5c_sxgkv6vf\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ad4d07e0-bb14-4fd7-bf8f-05f6ad4a2c9c\\\",\\\"source\\\":\\\"parallel_mn89tys0_foba6n39\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn89xuwr_rl2gnsez\\\",\\\"targetName\\\":\\\"是否到指定时间\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn89xozd_vmnafn6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2322,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"是否到指定时间\\\",\\\"category\\\":\\\"conditi','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:28:03',293),(354,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:29:45',24),(355,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"判断是否为指挥官\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-140,\\\"y\\\":500},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":218,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_TA\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":860,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":320},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:41:21',209),(356,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"判断是否为指挥官\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-240,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":218,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_TA\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":860,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":320},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:42:29',269),(357,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"判断是否为指挥官\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-240,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":218,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_TA\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":860,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":320},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:43:18',262),(358,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"判断是否为指挥官\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-240,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww8jh_3z4o9z1z\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":218,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"CMD_TA\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":2,\\\"position\\\":{\\\"x\\\":860,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":320},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\"','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:43:59',291),(359,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-23\",\"englishName\":\"111111111111111111\",\"id\":209,\"name\":\"指挥官行为树(部署节点)\",\"params\":{},\"updatedAt\":\"2026-03-23\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"27ed3b4f-fe4d-4789-b1f6-06205a987442\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn2wv8f5_ce4h95s1\\\",\\\"targetName\\\":\\\"并行节点\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"cbc25526-a022-41fe-9651-bac2431373c1\\\",\\\"source\\\":\\\"root_mn2vy6u1_y7yg6lor\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":216,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"判断是否为指挥官\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":-280,\\\"y\\\":540},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":640,\\\"y\\\":320},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"4d79676a-ecfa-464e-884c-a27ce63c9ccf\\\",\\\"source\\\":\\\"parallel_mn45ytis_jqfgl0mm\\\",\\\"sourceName\\\":\\\"并行节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn2ww53l_p3e8caee\\\",\\\"targetName\\\":\\\"IS_CMD\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"eccbad90-b7f6-4584-8cd3-4996acfd8673\\\",\\\"source\\\":\\\"parallel_mn45ytis_jq','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 02:46:52',168),(360,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:01:28',25),(361,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":480,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:01:35',23),(362,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:02:58',8),(363,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree111\",\"id\":227,\"name\":\"巡飞弹1行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:03:15',9),(364,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree2\",\"id\":228,\"name\":\"巡飞弹2行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:03:27',12),(365,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:06:36',172),(366,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:07:43',188),(367,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:11:46',199),(368,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:13:16',192),(369,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:14:38',182),(370,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:23:40',197),(371,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:24:00',203),(372,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"asdktree\",\"id\":226,\"name\":\"巡飞弹指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":120,\\\"y\\\":660},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f6769acc-c48c-4841-812f-eac3cefbf0bb\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"targetName\\\":\\\"发送集结指令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"4fdace5d-4612-4973-b0fa-e973c10dde51\\\",\\\"source\\\":\\\"sequence_mn8bhhe0_rzn33yxj\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"targetName\\\":\\\"判断是否集结\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8bhx6g_10q9xcer\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":204,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"发送集结指令\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"还没开发\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":0,\\\"y\\\":860},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":81,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":82,\\\"templateId\\\":204,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8bicag_wccrzt4r\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":229,\\\"templateType\\\":\\\"nod','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:24:15',163),(373,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree111\",\"id\":227,\"name\":\"巡飞弹1行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn8canav_6p1y1juz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":429,\\\"y\\\":258},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"sequence_mn8caprr_oeiqugbo\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":4,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"顺序节点\\\",\\\"category\\\":\\\"sequence\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,执行到这里会自动添加\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"71ec696a-8366-498c-8385-5d0df93f8f36\\\",\\\"source\\\":\\\"sequence_mn8caprr_oeiqugbo\\\",\\\"sourceName\\\":\\\"顺序节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":360,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:28:09',151),(374,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree111\",\"id\":227,\"name\":\"巡飞弹1行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn8canav_6p1y1juz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":429,\\\"y\\\":258},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"77552120-32c5-4e2b-9b09-f77dd38238b0\\\",\\\"source\\\":\\\"root_mn8canav_6p1y1juz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":360,\\\"y\\\":580},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"b6afdbbb-76a4-4710-a36b-15243f0afcf1\\\",\\\"source\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"sourceName\\\":\\\"检查是否抵达指定位置\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8cazpc_4x2qy10j\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"97c88eeb-f4bb-4afa-becb-1427ad720c81\\\",\\\"source\\\":\\\"condition_m','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:28:17',164),(375,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree111\",\"id\":227,\"name\":\"巡飞弹1行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn8canav_6p1y1juz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":429,\\\"y\\\":258},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"77552120-32c5-4e2b-9b09-f77dd38238b0\\\",\\\"source\\\":\\\"root_mn8canav_6p1y1juz\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":460},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"b6afdbbb-76a4-4710-a36b-15243f0afcf1\\\",\\\"source\\\":\\\"condition_mn8cat0o_xfdd2u40\\\",\\\"sourceName\\\":\\\"检查是否抵达指定位置\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8cazpc_4x2qy10j\\\",\\\"targetName\\\":\\\"等待上级命令\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"97c88eeb-f4bb-4afa-becb-1427ad720c81\\\",\\\"source\\\":\\\"condition_m','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:28:56',157),(376,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/228','127.0.0.1','内网IP','[228] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:29:08',12),(377,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree123\",\"id\":229,\"name\":\"榴弹炮行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:33:49',12),(378,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree12334\",\"id\":230,\"name\":\"榴弹炮指挥官行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:34:11',8),(379,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree12334\",\"id\":230,\"name\":\"榴弹炮指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn8cr3ls_gmu44lsg\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":637,\\\"y\\\":218},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:39:14',24),(380,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 03:43:59',26),(381,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree123\",\"id\":229,\"name\":\"榴弹炮行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mn8fnaej_alu7cn72\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":749,\\\"y\\\":273},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"36cea9dd-abd0-4875-a946-cbfe55fff532\\\",\\\"source\\\":\\\"root_mn8fnaej_alu7cn72\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mn8fne76_ogi0qriz\\\",\\\"targetName\\\":\\\"等待上级命令\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mn8fne76_ogi0qriz\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":120,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"等待上级命令\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"等待接受命令,一般位于行为树的开始节点之后的第一个节点,用于判断后续的任务是否执行,需要指定任务的类型\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":760,\\\"y\\\":440},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":71,\\\"templateId\\\":120,\\\"paramKey\\\":\\\"should_task\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"FIRE\\\",\\\"description\\\":\\\"等待接受的命令\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"f459d6ac-622a-4011-8072-ae08492553c9\\\",\\\"source\\\":\\\"condition_mn8fne76_ogi0qriz\\\",\\\"sourceName\\\":\\\"等待上级命令\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"action_mn8fnjwa_bliopru5\\\",\\\"targetName\\\":\\\"开火\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"action_mn8fnjwa_bliopru5\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":117,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"开火\\\",\\\"category\\\":\\\"action\\\",\\\"group\\\":\\\"action\\\",\\\"description\\\":\\\"对敌人进行火力打击,需要指定武器名称,齐射数量\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":760,\\\"y\\\":620},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 05:00:36',111),(382,'行为树主',3,'com.solution.web.controller.behaviour.BehaviortreeController.remove()','DELETE',1,'admin','研发部门','/api/system/behaviortree/230','127.0.0.1','内网IP','[230] ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 05:01:20',14),(383,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-27\",\"englishName\":\"tree12334\",\"id\":230,\"name\":\"榴弹炮指挥官行为树\",\"params\":{},\"updatedAt\":\"2026-03-27\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作失败\",\"code\":500}',0,NULL,'2026-03-27 05:01:22',23),(384,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-27 05:01:35',34),(385,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"asdfasdf\",\"id\":231,\"name\":\"行为树asdf\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 03:13:08',36),(386,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"asdfasdf\",\"id\":231,\"name\":\"榴弹炮指挥官\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:55:42',37),(387,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"asdfasdf\",\"id\":231,\"name\":\"榴弹炮指挥官\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mne7ee0r_3t7528et\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":220},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9609b1ae-c7c1-4b81-b098-716109ac8ab3\\\",\\\"source\\\":\\\"root_mne7ee0r_3t7528et\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mne7efaa_cmirjfis\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mne7efaa_cmirjfis\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"并行节点\\\",\\\"category\\\":\\\"parallel\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"中间节点,他的子节点会并行执行\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":520,\\\"y\\\":440},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"9609b1ae-c7c1-4b81-b098-716109ac8ab3\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mne7ee0r_3t7528et\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"parallel_mne7efaa_cmirjfis\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(1)\\\"},\\\"attrs\\\":{\\\"lines\\\":{\\\"connection\\\":true,\\\"strokeLinejoin\\\":\\\"round\\\"},\\\"wrap\\\":{\\\"strokeWidth\\\":10},\\\"line\\\":{\\\"stroke\\\":\\\"#3b82f6\\\",\\\"strokeWidth\\\":2,\\\"targetMarker\\\":null,\\\"strokeDasharray\\\":\\\" \\\",\\\"strokeDashoffset\\\":0,\\\"sourceMarker\\\":null},\\\"marker\\\":{\\\"fill\\\":\\\"#5da0df\\\",\\\"atConnectionRatio\\\":0.6916369999999997}},\\\"router\\\":{},\\\"connector\\\":null}]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:56:04',60),(388,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"tree11123\",\"id\":232,\"name\":\"巡飞弹2行为树\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:56:59',14),(389,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"tree11123\",\"id\":232,\"name\":\"巡飞弹2行为树\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":454,\\\"y\\\":238},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\\\",\\\"source\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[]}],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\\\",\\\"type\\\":\\\"edge\\\",\\\"source\\\":{\\\"cell\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"selector\\\":\\\"> foreignobject:nth-child(1) > body:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3)\\\"},\\\"target\\\":{\\\"cell\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"se','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:57:48',79),(390,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"tree11123\",\"id\":232,\"name\":\"巡飞弹2行为树\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":454,\\\"y\\\":238},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\\\",\\\"source\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"e3b18e80-9b1f-4113-9d6a-19598f8a16e6\\\",\\\"source\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"sourceName\\\":\\\"检查是否抵达指定位置\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:57:58',124),(391,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"tree11123\",\"id\":232,\"name\":\"巡飞弹2行为树\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":454,\\\"y\\\":238},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\\\",\\\"source\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"e3b18e80-9b1f-4113-9d6a-19598f8a16e6\\\",\\\"source\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"sourceName\\\":\\\"检查是否抵达指定位置\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:58:37',246),(392,'行为树主',2,'com.solution.web.controller.behaviour.BehaviortreeController.edit()','PUT',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"createdAt\":\"2026-03-31\",\"englishName\":\"tree11123\",\"id\":232,\"name\":\"巡飞弹2行为树\",\"params\":{},\"updatedAt\":\"2026-03-31\",\"xmlContent\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":0,\\\"templateType\\\":\\\"node\\\",\\\"name\\\":\\\"根节点\\\",\\\"category\\\":\\\"root\\\",\\\"group\\\":\\\"control\\\",\\\"description\\\":\\\"根节点\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":454,\\\"y\\\":238},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"3f736a96-a697-4eeb-a5f1-eb0eb5684cbe\\\",\\\"source\\\":\\\"root_mne7fyos_pr1fr9ra\\\",\\\"sourceName\\\":\\\"根节点\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"targetName\\\":\\\"检查是否抵达指定位置\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":123,\\\"templateType\\\":\\\"condition\\\",\\\"name\\\":\\\"检查是否抵达指定位置\\\",\\\"category\\\":\\\"condition\\\",\\\"group\\\":\\\"condition\\\",\\\"description\\\":\\\"判断当前位置是否抵达指定位置\\\",\\\"multiable\\\":false,\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":460,\\\"y\\\":400},\\\"width\\\":250,\\\"height\\\":60,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":83,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lat\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"纬度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0},{\\\"createBy\\\":null,\\\"createTime\\\":null,\\\"updateBy\\\":null,\\\"updateTime\\\":null,\\\"remark\\\":null,\\\"id\\\":84,\\\"templateId\\\":123,\\\"paramKey\\\":\\\"lon\\\",\\\"dataType\\\":\\\"string\\\",\\\"defaultValue\\\":\\\"0\\\",\\\"description\\\":\\\"经度\\\",\\\"templateType\\\":\\\"NodeTemplate\\\",\\\"groupIndex\\\":0}],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"e3b18e80-9b1f-4113-9d6a-19598f8a16e6\\\",\\\"source\\\":\\\"condition_mne7g54i_lkd8jz6u\\\",\\\"sourceName\\\":\\\"检查是否抵达指定位置\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"targetName\\\":\\\"并行节点\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"parallel_mne7guh8_h50766ta\\\",\\\"type\\\":\\\"task\\\",\\\"template\\\":2,','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 05:59:04',265),(393,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 06:50:03',124),(394,'行为树主',1,'com.solution.web.controller.scene.SceneController.saveSceneConfig()','POST',1,'admin','研发部门','/api/system/scene/saveSceneConfig','127.0.0.1','内网IP','{\"communicationGraph\":\"{\\\"nodes\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_cmd_comm_1\\\",\\\"platformId\\\":40,\\\"components\\\":[{\\\"id\\\":83,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":40,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"指挥车\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":420,\\\"y\\\":300},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[],\\\"edges\\\":[{\\\"id\\\":0,\\\"key\\\":\\\"61cc9418-0caf-4acd-b178-aab96cdf0672\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301sxp_p3knatd2\\\",\\\"targetName\\\":\\\"01_jam_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"b35b79b0-5aa4-49a6-a728-57032ac8446b\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"targetName\\\":\\\"01_jam_type_2\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"78c0f468-347f-4159-8402-bd4430b454d0\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn301zd7_89s9wgii\\\",\\\"targetName\\\":\\\"01_sensor_type_1\\\"},{\\\"id\\\":0,\\\"key\\\":\\\"ef7c460f-c913-4ea1-a35a-7711e7af90cd\\\",\\\"source\\\":\\\"mn301qol_lkw9l1pf\\\",\\\"sourceName\\\":\\\"01_cmd_comm_1\\\",\\\"connector\\\":{},\\\"router\\\":{},\\\"attrs\\\":{},\\\"target\\\":\\\"mn3021tw_6sf8eu5e\\\",\\\"targetName\\\":\\\"01_sensor_type_2\\\"}]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301sxp_p3knatd2\\\",\\\"type\\\":\\\"scenario\\\",\\\"name\\\":\\\"01_jam_type_1\\\",\\\"platformId\\\":38,\\\"components\\\":[{\\\"id\\\":81,\\\"name\\\":\\\"radio\\\",\\\"type\\\":\\\"comm\\\",\\\"description\\\":\\\"通讯设备\\\",\\\"platformId\\\":38,\\\"num\\\":null}],\\\"template\\\":0,\\\"templateType\\\":null,\\\"category\\\":null,\\\"group\\\":null,\\\"description\\\":\\\"干扰车1\\\",\\\"order\\\":0,\\\"position\\\":{\\\"x\\\":900,\\\"y\\\":140},\\\"width\\\":250,\\\"height\\\":120,\\\"inputs\\\":null,\\\"outputs\\\":null,\\\"parameters\\\":[],\\\"variables\\\":[]},{\\\"id\\\":0,\\\"key\\\":\\\"mn301v50_y1kvlkdg\\\",\\\"type\\\":\\\"scenario\\\",\\\"na','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 06:50:17',85),(395,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"asdfsadf\",\"id\":233,\"name\":\"行为树asdf\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 07:28:05',22),(396,'行为树主',1,'com.solution.web.controller.behaviour.BehaviortreeController.add()','POST',1,'admin','研发部门','/api/system/behaviortree','127.0.0.1','内网IP','{\"englishName\":\"twert\",\"id\":234,\"name\":\"行为树2342\",\"params\":{},\"xmlContent\":\"{\\\"nodes\\\":[],\\\"edges\\\":[]}\"} ','{\"msg\":\"操作成功\",\"code\":200}',0,NULL,'2026-03-31 07:29:06',11); +/*!40000 ALTER TABLE `sys_oper_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_post` +-- + +DROP TABLE IF EXISTS `sys_post`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_post` ( + `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `post_sort` int NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='岗位信息表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_post` +-- + +LOCK TABLES `sys_post` WRITE; +/*!40000 ALTER TABLE `sys_post` DISABLE KEYS */; +INSERT INTO `sys_post` (`post_id`, `post_code`, `post_name`, `post_sort`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1,'ceo','董事长',1,'0','admin','2025-09-22 09:33:04','',NULL,''),(2,'se','项目经理',2,'0','admin','2025-09-22 09:33:04','',NULL,''),(3,'hr','人力资源',3,'0','admin','2025-09-22 09:33:04','',NULL,''),(4,'user','普通员工',4,'0','admin','2025-09-22 09:33:04','',NULL,''); +/*!40000 ALTER TABLE `sys_post` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_role` +-- + +DROP TABLE IF EXISTS `sys_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_role` ( + `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串', + `role_sort` int NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) DEFAULT '1' COMMENT '部门树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色信息表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_role` +-- + +LOCK TABLES `sys_role` WRITE; +/*!40000 ALTER TABLE `sys_role` DISABLE KEYS */; +INSERT INTO `sys_role` (`role_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1,'超级管理员','admin',1,'1',1,1,'0','0','admin','2025-09-22 09:33:04','',NULL,'超级管理员'),(2,'普通角色','common',2,'2',1,1,'0','0','admin','2025-09-22 09:33:04','',NULL,'普通角色'); +/*!40000 ALTER TABLE `sys_role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_role_dept` +-- + +DROP TABLE IF EXISTS `sys_role_dept`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `dept_id` bigint NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`,`dept_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和部门关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_role_dept` +-- + +LOCK TABLES `sys_role_dept` WRITE; +/*!40000 ALTER TABLE `sys_role_dept` DISABLE KEYS */; +INSERT INTO `sys_role_dept` (`role_id`, `dept_id`) VALUES (2,100),(2,101),(2,105); +/*!40000 ALTER TABLE `sys_role_dept` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_role_menu` +-- + +DROP TABLE IF EXISTS `sys_role_menu`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='角色和菜单关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_role_menu` +-- + +LOCK TABLES `sys_role_menu` WRITE; +/*!40000 ALTER TABLE `sys_role_menu` DISABLE KEYS */; +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (2,1),(2,2),(2,3),(2,4),(2,100),(2,101),(2,102),(2,103),(2,104),(2,105),(2,106),(2,107),(2,108),(2,109),(2,110),(2,111),(2,112),(2,113),(2,114),(2,115),(2,116),(2,117),(2,500),(2,501),(2,1000),(2,1001),(2,1002),(2,1003),(2,1004),(2,1005),(2,1006),(2,1007),(2,1008),(2,1009),(2,1010),(2,1011),(2,1012),(2,1013),(2,1014),(2,1015),(2,1016),(2,1017),(2,1018),(2,1019),(2,1020),(2,1021),(2,1022),(2,1023),(2,1024),(2,1025),(2,1026),(2,1027),(2,1028),(2,1029),(2,1030),(2,1031),(2,1032),(2,1033),(2,1034),(2,1035),(2,1036),(2,1037),(2,1038),(2,1039),(2,1040),(2,1041),(2,1042),(2,1043),(2,1044),(2,1045),(2,1046),(2,1047),(2,1048),(2,1049),(2,1050),(2,1051),(2,1052),(2,1053),(2,1054),(2,1055),(2,1056),(2,1057),(2,1058),(2,1059),(2,1060); +/*!40000 ALTER TABLE `sys_role_menu` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_user` +-- + +DROP TABLE IF EXISTS `sys_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_user` ( + `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `dept_id` bigint DEFAULT NULL COMMENT '部门ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称', + `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '00' COMMENT '用户类型(00系统用户)', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '账号状态(0正常 1停用)', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime DEFAULT NULL COMMENT '最后登录时间', + `pwd_update_date` datetime DEFAULT NULL COMMENT '密码最后更新时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_user` +-- + +LOCK TABLES `sys_user` WRITE; +/*!40000 ALTER TABLE `sys_user` DISABLE KEYS */; +INSERT INTO `sys_user` (`user_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `pwd_update_date`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1,103,'admin','若依','00','ry@163.com','15888888888','1','','$2a$10$ezo3lTX8j7Sh14xnyHNPde68wjz41HOFCU3AlaUg9RRx6OrjlKh/a','0','0','127.0.0.1','2026-04-09 10:21:16','2025-09-22 09:33:04','admin','2025-09-22 09:33:04','',NULL,'管理员'),(2,105,'ry','若依','00','ry@qq.com','15666666666','1','','$2a$10$ezo3lTX8j7Sh14xnyHNPde68wjz41HOFCU3AlaUg9RRx6OrjlKh/a','0','0','127.0.0.1','2025-09-22 09:33:04','2025-09-22 09:33:04','admin','2025-09-22 09:33:04','',NULL,'测试员'); +/*!40000 ALTER TABLE `sys_user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_user_post` +-- + +DROP TABLE IF EXISTS `sys_user_post`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_user_post` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `post_id` bigint NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`,`post_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户与岗位关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_user_post` +-- + +LOCK TABLES `sys_user_post` WRITE; +/*!40000 ALTER TABLE `sys_user_post` DISABLE KEYS */; +INSERT INTO `sys_user_post` (`user_id`, `post_id`) VALUES (1,1),(2,2); +/*!40000 ALTER TABLE `sys_user_post` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sys_user_role` +-- + +DROP TABLE IF EXISTS `sys_user_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sys_user_role` ( + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户和角色关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sys_user_role` +-- + +LOCK TABLES `sys_user_role` WRITE; +/*!40000 ALTER TABLE `sys_user_role` DISABLE KEYS */; +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1,1),(2,2); +/*!40000 ALTER TABLE `sys_user_role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `templateparameterdef` +-- + +DROP TABLE IF EXISTS `templateparameterdef`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `templateparameterdef` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '参数定义ID (主键)', + `template_id` int NOT NULL COMMENT '关联到哪个节点模板 (外键: NodeTemplate.id)', + `param_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '参数键名, 例如: "target_name", "speed"', + `data_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '参数数据类型, 例如: "float", "int", "string", "bool"', + `default_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '默认值', + `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '参数描述', + `template_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'NodeTemplate' COMMENT '判断参数模版是节点的参数模版还是条件的参数模版', + PRIMARY KEY (`id`) USING BTREE, + KEY `template_id` (`template_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='模板参数定义表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `templateparameterdef` +-- + +LOCK TABLES `templateparameterdef` WRITE; +/*!40000 ALTER TABLE `templateparameterdef` DISABLE KEYS */; +INSERT INTO `templateparameterdef` (`id`, `template_id`, `param_key`, `data_type`, `default_value`, `description`, `template_type`) VALUES (65,115,'range','double','5000','防护范围','NodeTemplate'),(66,115,'radar_name','string','sam_radar','雷达名称','NodeTemplate'),(67,116,'weaponName','string','sam','武器名称,用来判断当前武器数量','NodeTemplate'),(68,117,'salvo_size','int','2','齐射数量','NodeTemplate'),(69,117,'weaponName','string','sam','发射的武器名称','NodeTemplate'),(70,118,'radar_name','string','sam_radar','雷达名称','NodeTemplate'),(71,120,'should_task','string','FIRE','等待接受的命令','NodeTemplate'),(73,232,'platforms','string','radar','接受消息的平台','NodeTemplate'),(74,232,'lats','string','0','纬度','NodeTemplate'),(75,232,'lons','string','0','经度','NodeTemplate'),(78,2322,'reach_time','string','0','时间','NodeTemplate'),(79,100,'platforms','string','radar','接受消息的平台','NodeTemplate'),(80,100,'command','string','fire','接受的命令','NodeTemplate'),(81,204,'lat','string','0','纬度','NodeTemplate'),(82,204,'lon','string','0','经度','NodeTemplate'),(83,123,'lat','string','0','纬度','NodeTemplate'),(84,123,'lon','string','0','经度','NodeTemplate'),(85,199,'platform','string','','接受平台','NodeTemplate'),(86,199,'target','string','','雷达分配的目标','NodeTemplate'); +/*!40000 ALTER TABLE `templateparameterdef` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `treenodeinstance` +-- + +DROP TABLE IF EXISTS `treenodeinstance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `treenodeinstance` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '节点实例ID (主键)', + `tree_id` int NOT NULL COMMENT '属于哪棵行为树 (外键: BehaviorTree.id)', + `template_id` int NOT NULL COMMENT '引用哪个节点模板 (外键: NodeTemplate.id)', + `instance_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '节点的显示名称 (可能与模板名称不同, 用于区分实例)', + `is_root` tinyint NOT NULL DEFAULT '0' COMMENT '判断当前节点是否为根节点,默认情况下是非根节点', + `precondition_templete_id` int DEFAULT NULL COMMENT '节点执行的判断条件对应的模版id', + `node_value` text COMMENT '用来存储在节点上的参数值', + `is_extern` int DEFAULT '0' COMMENT '判断这个变量是不是外部变量,如果是外部变量,用户不可填写,前端不会展示,默认不是外部变量,0表示不是,1表示是外部变量', + PRIMARY KEY (`id`) USING BTREE, + KEY `tree_id` (`tree_id`) USING BTREE, + KEY `template_id` (`template_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=989 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='行为树实例节点表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `treenodeinstance` +-- + +LOCK TABLES `treenodeinstance` WRITE; +/*!40000 ALTER TABLE `treenodeinstance` DISABLE KEYS */; +INSERT INTO `treenodeinstance` (`id`, `tree_id`, `template_id`, `instance_name`, `is_root`, `precondition_templete_id`, `node_value`, `is_extern`) VALUES (3,187,191,'根节点',1,NULL,NULL,0),(10,195,191,'根节点',1,NULL,NULL,0),(21,196,191,'根节点',1,NULL,NULL,0),(22,196,3,'选择节点',0,NULL,NULL,0),(25,188,191,'根节点',1,NULL,NULL,0),(26,188,3,'选择节点',0,NULL,NULL,0),(27,1,191,'根节点',1,NULL,NULL,0),(28,1,3,'选择节点',0,NULL,NULL,0),(29,1,2,'并行节点',0,NULL,NULL,0),(103,197,121,'检查雷达雷针朝向1',0,NULL,NULL,0),(104,197,126,'追击节点1',0,NULL,NULL,0),(105,197,115,'检查是否在范围内0',0,NULL,NULL,0),(106,197,115,'检查是否在范围内0',0,NULL,NULL,0),(107,197,2,'并行节点2',0,NULL,NULL,0),(108,197,3,'选择节点0',0,NULL,NULL,0),(109,197,0,'根节点',1,NULL,NULL,0),(110,198,0,'根节点',1,NULL,NULL,0),(111,198,2,'并行节点',0,NULL,NULL,0),(112,198,115,'检查是否在范围内',0,NULL,NULL,0),(113,198,121,'检查雷达雷针朝向',0,NULL,NULL,0),(114,198,119,'转向目标',0,NULL,NULL,0),(115,198,115,'检查是否在范围内',0,NULL,NULL,0),(116,198,3,'选择节点',0,NULL,NULL,0),(117,198,126,'追击节点',0,NULL,NULL,0),(352,200,0,'根节点',1,NULL,NULL,0),(353,200,4,'顺序节点',0,NULL,NULL,0),(354,200,120,'等待上级命令',0,NULL,NULL,0),(355,200,118,'打开雷达',0,NULL,NULL,0),(368,199,0,'根节点',1,NULL,NULL,0),(369,199,120,'等待上级命令',0,NULL,NULL,0),(370,199,4,'顺序节点',0,NULL,NULL,0),(371,199,118,'打开雷达',0,NULL,NULL,0),(484,202,120,'等待上级命令',0,NULL,NULL,0),(485,202,117,'开火',0,NULL,NULL,0),(486,202,4,'顺序节点',0,NULL,NULL,0),(487,202,0,'根节点',1,NULL,NULL,0),(488,202,118,'打开雷达',0,NULL,NULL,0),(504,203,0,'根节点',1,NULL,NULL,0),(505,203,4,'顺序节点',0,NULL,NULL,0),(506,203,120,'等待上级命令',0,NULL,NULL,0),(507,203,117,'开火',0,NULL,NULL,0),(508,203,118,'打开雷达',0,NULL,NULL,0),(619,206,197,'发送地面展开命令',0,NULL,NULL,0),(620,206,194,'发送雷达控制',0,NULL,NULL,0),(621,206,199,'雷达目标分配',0,NULL,NULL,0),(622,206,195,'目标分配',0,NULL,NULL,0),(623,206,198,'火力打击评估',0,NULL,NULL,0),(624,206,192,'发送开火指令',0,NULL,NULL,0),(625,206,200,'情报信息融合分析',0,NULL,NULL,0),(626,206,193,'进行火力规则计算',0,NULL,NULL,0),(627,206,4,'顺序节点',0,NULL,NULL,0),(628,206,4,'顺序节点',0,NULL,NULL,0),(629,206,4,'顺序节点',0,NULL,NULL,0),(630,206,2,'并行节点',0,NULL,NULL,0),(631,206,0,'根节点',1,NULL,NULL,0),(632,201,0,'根节点',1,NULL,NULL,0),(633,201,4,'顺序节点',0,NULL,NULL,0),(634,201,120,'等待上级命令',0,NULL,NULL,0),(635,201,118,'打开雷达',0,NULL,NULL,0),(717,211,0,'根节点',1,NULL,NULL,0),(718,211,2,'并行节点',0,NULL,NULL,0),(719,211,219,'JAM_RCH',0,NULL,NULL,0),(720,211,220,'JAM_JAM',0,NULL,NULL,0),(721,211,221,'JAM_AAO',0,NULL,NULL,0),(722,211,222,'JAM_FD',0,NULL,NULL,0),(729,212,0,'根节点',1,NULL,NULL,0),(730,212,2,'并行节点',0,NULL,NULL,0),(731,212,219,'JAM_RCH',0,NULL,NULL,0),(732,212,220,'JAM_JAM',0,NULL,NULL,0),(733,212,221,'JAM_AAO',0,NULL,NULL,0),(734,212,222,'JAM_FD',0,NULL,NULL,0),(735,213,0,'根节点',1,NULL,NULL,0),(736,213,2,'并行节点',0,NULL,NULL,0),(737,213,223,'SEN_RCH',0,NULL,NULL,0),(738,213,224,'SENSOR_AAO',0,NULL,NULL,0),(739,213,225,'SENSOR_FD',0,NULL,NULL,0),(740,222,0,'根节点',1,NULL,NULL,0),(741,222,2,'并行节点',0,NULL,NULL,0),(742,222,223,'SEN_RCH',0,NULL,NULL,0),(743,222,224,'SENSOR_AAO',0,NULL,NULL,0),(744,222,225,'SENSOR_FD',0,NULL,NULL,0),(793,223,0,'根节点',1,NULL,NULL,0),(794,223,232,'发送阵位分配命令',0,NULL,NULL,0),(831,225,0,'根节点',1,NULL,NULL,0),(832,225,2,'并行节点',0,NULL,NULL,0),(833,225,2322,'是否到指定时间',0,NULL,NULL,0),(834,225,2322,'是否到指定时间',0,NULL,NULL,0),(835,225,2322,'是否到指定时间',0,NULL,NULL,0),(836,225,100,'发送通用指令',0,NULL,NULL,0),(837,225,100,'发送通用指令',0,NULL,NULL,0),(838,225,100,'发送通用指令',0,NULL,NULL,0),(870,209,0,'根节点',1,NULL,NULL,0),(871,209,216,'判断是否为指挥官',0,NULL,NULL,0),(872,209,2,'并行节点',0,NULL,NULL,0),(873,209,229,'判断是否集结',0,NULL,NULL,0),(874,209,230,'判断是否收到目标消息',0,NULL,NULL,0),(875,209,232,'发送阵位分配命令',0,NULL,NULL,0),(876,209,204,'发送集结指令',0,NULL,NULL,0),(877,209,199,'雷达目标分配',0,NULL,NULL,0),(934,226,4,'顺序节点',0,NULL,NULL,0),(935,226,204,'发送集结指令',0,NULL,NULL,0),(936,226,229,'判断是否集结',0,NULL,NULL,0),(937,226,232,'发送阵位分配命令',0,NULL,NULL,0),(938,226,0,'根节点',1,NULL,NULL,0),(939,226,2,'并行节点',0,NULL,NULL,0),(940,226,123,'检查是否抵达指定位置',0,NULL,NULL,0),(941,226,192,'发送开火指令',0,NULL,NULL,0),(957,227,0,'根节点',1,NULL,NULL,0),(958,227,123,'检查是否抵达指定位置',0,NULL,NULL,0),(959,227,125,'巡逻节点',0,NULL,NULL,0),(960,227,2,'并行节点',0,NULL,NULL,0),(961,227,120,'等待上级命令',0,NULL,NULL,0),(962,227,120,'等待上级命令',0,NULL,NULL,0),(963,227,117,'开火',0,NULL,NULL,0),(965,229,0,'根节点',1,NULL,NULL,0),(966,229,120,'等待上级命令',0,NULL,NULL,0),(967,229,117,'开火',0,NULL,NULL,0),(968,231,0,'根节点',1,NULL,NULL,0),(969,231,2,'并行节点',0,NULL,NULL,0),(982,232,0,'根节点',1,NULL,NULL,0),(983,232,123,'检查是否抵达指定位置',0,NULL,NULL,0),(984,232,2,'并行节点',0,NULL,NULL,0),(985,232,120,'等待上级命令',0,NULL,NULL,0),(986,232,120,'等待上级命令',0,NULL,NULL,0),(987,232,125,'巡逻节点',0,NULL,NULL,0),(988,232,117,'开火',0,NULL,NULL,0); +/*!40000 ALTER TABLE `treenodeinstance` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `zt_platform_type` +-- + +DROP TABLE IF EXISTS `zt_platform_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `zt_platform_type` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', + `zt_platform_type` varchar(255) DEFAULT NULL COMMENT '智唐的json 提供的平台名称', + `sk_platform_type` varchar(255) DEFAULT NULL COMMENT '对应的南航对应的平台名', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `zt_platform_type` +-- + +LOCK TABLES `zt_platform_type` WRITE; +/*!40000 ALTER TABLE `zt_platform_type` DISABLE KEYS */; +INSERT INTO `zt_platform_type` (`id`, `zt_platform_type`, `sk_platform_type`) VALUES (1,'空射诱饵','WSF_PLATFORM'),(2,'AGM-158C','WSF_PLATFORM'),(3,'HQ-9发射车','WSF_PLATFORM'),(4,'导弹','WSF_PLATFORM'),(5,'导航干扰车','WSF_PLATFORM'),(6,'指挥所','WSF_PLATFORM'),(7,'J-15','WSF_PLATFORM'),(8,'HQ-9','WSF_PLATFORM'),(9,'F-16','WSF_PLATFORM'),(10,'610','WSF_PLATFORM'),(11,'制导雷达车','WSF_PLATFORM'),(12,'反辐射导弹','WSF_PLATFORM'),(13,'鹰击-91反辐射型','WSF_PLATFORM'),(14,'E-2D','WSF_PLATFORM'),(15,'311-1','WSF_PLATFORM'),(16,'HB-1','WSF_PLATFORM'),(17,'BGM109','WSF_PLATFORM'),(18,'舷外诱饵','WSF_PLATFORM'),(19,'EA-18G','WSF_PLATFORM'),(20,'阿利伯克级驱逐舰','WSF_PLATFORM'); +/*!40000 ALTER TABLE `zt_platform_type` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-09 10:53:41 From a65d296421d60bd6a18e3377cb3e8295c11b4e76 Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 15:36:28 +0800 Subject: [PATCH 08/11] sql --- Dockerfile | 2 +- docker/mysql/init/quartz.sql | 174 ++++++++ docker/mysql/init/ry_20250522.sql | 704 ++++++++++++++++++++++++++++++ 3 files changed, 879 insertions(+), 1 deletion(-) create mode 100644 docker/mysql/init/quartz.sql create mode 100644 docker/mysql/init/ry_20250522.sql diff --git a/Dockerfile b/Dockerfile index bb84118..6f31ca3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # 要求构建上下文中存在 solution-admin.jar # 构建:docker build -t auto-solution-admin:latest . -FROM eclipse-temurin:8-jre-jammy +FROM eclipse-temurin:11-jre-jammy LABEL org.opencontainers.image.title="auto-solution-admin" WORKDIR /app diff --git a/docker/mysql/init/quartz.sql b/docker/mysql/init/quartz.sql new file mode 100644 index 0000000..cee613b --- /dev/null +++ b/docker/mysql/init/quartz.sql @@ -0,0 +1,174 @@ +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +-- ---------------------------- +-- 1、存储每一个已配置的 jobDetail 的详细信息 +-- ---------------------------- +create table QRTZ_JOB_DETAILS ( + sched_name varchar(120) not null comment '调度名称', + job_name varchar(200) not null comment '任务名称', + job_group varchar(200) not null comment '任务组名', + description varchar(250) null comment '相关介绍', + job_class_name varchar(250) not null comment '执行任务类名称', + is_durable varchar(1) not null comment '是否持久化', + is_nonconcurrent varchar(1) not null comment '是否并发', + is_update_data varchar(1) not null comment '是否更新数据', + requests_recovery varchar(1) not null comment '是否接受恢复执行', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, job_name, job_group) +) engine=innodb comment = '任务详细信息表'; + +-- ---------------------------- +-- 2、 存储已配置的 Trigger 的信息 +-- ---------------------------- +create table QRTZ_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment '触发器的名字', + trigger_group varchar(200) not null comment '触发器所属组的名字', + job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键', + job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键', + description varchar(250) null comment '相关介绍', + next_fire_time bigint(13) null comment '上一次触发时间(毫秒)', + prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)', + priority integer null comment '优先级', + trigger_state varchar(16) not null comment '触发器状态', + trigger_type varchar(8) not null comment '触发器的类型', + start_time bigint(13) not null comment '开始时间', + end_time bigint(13) null comment '结束时间', + calendar_name varchar(200) null comment '日程表名称', + misfire_instr smallint(2) null comment '补偿执行的策略', + job_data blob null comment '存放持久化job对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group) +) engine=innodb comment = '触发器详细信息表'; + +-- ---------------------------- +-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数 +-- ---------------------------- +create table QRTZ_SIMPLE_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + repeat_count bigint(7) not null comment '重复的次数统计', + repeat_interval bigint(12) not null comment '重复的间隔时间', + times_triggered bigint(10) not null comment '已经触发的次数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '简单触发器的信息表'; + +-- ---------------------------- +-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息 +-- ---------------------------- +create table QRTZ_CRON_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + cron_expression varchar(200) not null comment 'cron表达式', + time_zone_id varchar(80) comment '时区', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Cron类型的触发器表'; + +-- ---------------------------- +-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候) +-- ---------------------------- +create table QRTZ_BLOB_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + blob_data blob null comment '存放持久化Trigger对象', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = 'Blob类型的触发器表'; + +-- ---------------------------- +-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围 +-- ---------------------------- +create table QRTZ_CALENDARS ( + sched_name varchar(120) not null comment '调度名称', + calendar_name varchar(200) not null comment '日历名称', + calendar blob not null comment '存放持久化calendar对象', + primary key (sched_name, calendar_name) +) engine=innodb comment = '日历信息表'; + +-- ---------------------------- +-- 7、 存储已暂停的 Trigger 组的信息 +-- ---------------------------- +create table QRTZ_PAUSED_TRIGGER_GRPS ( + sched_name varchar(120) not null comment '调度名称', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + primary key (sched_name, trigger_group) +) engine=innodb comment = '暂停的触发器表'; + +-- ---------------------------- +-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息 +-- ---------------------------- +create table QRTZ_FIRED_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + entry_id varchar(95) not null comment '调度器实例id', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + instance_name varchar(200) not null comment '调度器实例名', + fired_time bigint(13) not null comment '触发的时间', + sched_time bigint(13) not null comment '定时器制定的时间', + priority integer not null comment '优先级', + state varchar(16) not null comment '状态', + job_name varchar(200) null comment '任务名称', + job_group varchar(200) null comment '任务组名', + is_nonconcurrent varchar(1) null comment '是否并发', + requests_recovery varchar(1) null comment '是否接受恢复执行', + primary key (sched_name, entry_id) +) engine=innodb comment = '已触发的触发器表'; + +-- ---------------------------- +-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例 +-- ---------------------------- +create table QRTZ_SCHEDULER_STATE ( + sched_name varchar(120) not null comment '调度名称', + instance_name varchar(200) not null comment '实例名称', + last_checkin_time bigint(13) not null comment '上次检查时间', + checkin_interval bigint(13) not null comment '检查间隔时间', + primary key (sched_name, instance_name) +) engine=innodb comment = '调度器状态表'; + +-- ---------------------------- +-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁) +-- ---------------------------- +create table QRTZ_LOCKS ( + sched_name varchar(120) not null comment '调度名称', + lock_name varchar(40) not null comment '悲观锁名称', + primary key (sched_name, lock_name) +) engine=innodb comment = '存储的悲观锁信息表'; + +-- ---------------------------- +-- 11、 Quartz集群实现同步机制的行锁表 +-- ---------------------------- +create table QRTZ_SIMPROP_TRIGGERS ( + sched_name varchar(120) not null comment '调度名称', + trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键', + trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键', + str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数', + str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数', + str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数', + int_prop_1 int null comment 'int类型的trigger的第一个参数', + int_prop_2 int null comment 'int类型的trigger的第二个参数', + long_prop_1 bigint null comment 'long类型的trigger的第一个参数', + long_prop_2 bigint null comment 'long类型的trigger的第二个参数', + dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数', + dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数', + bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数', + bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数', + primary key (sched_name, trigger_name, trigger_group), + foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group) +) engine=innodb comment = '同步机制的行锁表'; + +commit; \ No newline at end of file diff --git a/docker/mysql/init/ry_20250522.sql b/docker/mysql/init/ry_20250522.sql new file mode 100644 index 0000000..20e3827 --- /dev/null +++ b/docker/mysql/init/ry_20250522.sql @@ -0,0 +1,704 @@ +-- ---------------------------- +-- 1、部门表 +-- ---------------------------- +drop table if exists sys_dept; +create table sys_dept ( + dept_id bigint(20) not null auto_increment comment '部门id', + parent_id bigint(20) default 0 comment '父部门id', + ancestors varchar(50) default '' comment '祖级列表', + dept_name varchar(30) default '' comment '部门名称', + order_num int(4) default 0 comment '显示顺序', + leader varchar(20) default null comment '负责人', + phone varchar(11) default null comment '联系电话', + email varchar(50) default null comment '邮箱', + status char(1) default '0' comment '部门状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (dept_id) +) engine=innodb auto_increment=200 comment = '部门表'; + +-- ---------------------------- +-- 初始化-部门表数据 +-- ---------------------------- +insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); +insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null); + + +-- ---------------------------- +-- 2、用户信息表 +-- ---------------------------- +drop table if exists sys_user; +create table sys_user ( + user_id bigint(20) not null auto_increment comment '用户ID', + dept_id bigint(20) default null comment '部门ID', + user_name varchar(30) not null comment '用户账号', + nick_name varchar(30) not null comment '用户昵称', + user_type varchar(2) default '00' comment '用户类型(00系统用户)', + email varchar(50) default '' comment '用户邮箱', + phonenumber varchar(11) default '' comment '手机号码', + sex char(1) default '0' comment '用户性别(0男 1女 2未知)', + avatar varchar(100) default '' comment '头像地址', + password varchar(100) default '' comment '密码', + status char(1) default '0' comment '账号状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + login_ip varchar(128) default '' comment '最后登录IP', + login_date datetime comment '最后登录时间', + pwd_update_date datetime comment '密码最后更新时间', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (user_id) +) engine=innodb auto_increment=100 comment = '用户信息表'; + +-- ---------------------------- +-- 初始化-用户信息表数据 +-- ---------------------------- +insert into sys_user values(1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '管理员'); +insert into sys_user values(2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '测试员'); + + +-- ---------------------------- +-- 3、岗位信息表 +-- ---------------------------- +drop table if exists sys_post; +create table sys_post +( + post_id bigint(20) not null auto_increment comment '岗位ID', + post_code varchar(64) not null comment '岗位编码', + post_name varchar(50) not null comment '岗位名称', + post_sort int(4) not null comment '显示顺序', + status char(1) not null comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (post_id) +) engine=innodb comment = '岗位信息表'; + +-- ---------------------------- +-- 初始化-岗位信息表数据 +-- ---------------------------- +insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, ''); +insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 4、角色信息表 +-- ---------------------------- +drop table if exists sys_role; +create table sys_role ( + role_id bigint(20) not null auto_increment comment '角色ID', + role_name varchar(30) not null comment '角色名称', + role_key varchar(100) not null comment '角色权限字符串', + role_sort int(4) not null comment '显示顺序', + data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', + dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', + status char(1) not null comment '角色状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (role_id) +) engine=innodb auto_increment=100 comment = '角色信息表'; + +-- ---------------------------- +-- 初始化-角色信息表数据 +-- ---------------------------- +insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员'); +insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色'); + + +-- ---------------------------- +-- 5、菜单权限表 +-- ---------------------------- +drop table if exists sys_menu; +create table sys_menu ( + menu_id bigint(20) not null auto_increment comment '菜单ID', + menu_name varchar(50) not null comment '菜单名称', + parent_id bigint(20) default 0 comment '父菜单ID', + order_num int(4) default 0 comment '显示顺序', + path varchar(200) default '' comment '路由地址', + component varchar(255) default null comment '组件路径', + query varchar(255) default null comment '路由参数', + route_name varchar(50) default '' comment '路由名称', + is_frame int(1) default 1 comment '是否为外链(0是 1否)', + is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)', + menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)', + visible char(1) default 0 comment '菜单状态(0显示 1隐藏)', + status char(1) default 0 comment '菜单状态(0正常 1停用)', + perms varchar(100) default null comment '权限标识', + icon varchar(100) default '#' comment '菜单图标', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注', + primary key (menu_id) +) engine=innodb auto_increment=2000 comment = '菜单权限表'; + +-- ---------------------------- +-- 初始化-菜单信息表数据 +-- ---------------------------- +-- 一级菜单 +insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录'); +insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录'); +insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录'); +insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址'); +-- 二级菜单 +insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单'); +insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单'); +insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单'); +insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单'); +insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单'); +insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单'); +insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单'); +insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', sysdate(), '', null, '通知公告菜单'); +insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', sysdate(), '', null, '日志管理菜单'); +insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', sysdate(), '', null, '在线用户菜单'); +insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单'); +insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单'); +insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单'); +insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单'); +insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', sysdate(), '', null, '缓存列表菜单'); +insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单'); +insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单'); +insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单'); +-- 三级菜单 +insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单'); +insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单'); +-- 用户管理按钮 +insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, ''); +-- 角色管理按钮 +insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, ''); +-- 菜单管理按钮 +insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, ''); +-- 部门管理按钮 +insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, ''); +-- 岗位管理按钮 +insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, ''); +-- 字典管理按钮 +insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, ''); +-- 参数设置按钮 +insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, ''); +-- 通知公告按钮 +insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, ''); +-- 操作日志按钮 +insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, ''); +-- 登录日志按钮 +insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, ''); +-- 在线用户按钮 +insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, ''); +-- 定时任务按钮 +insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, ''); +-- 代码生成按钮 +insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 6、用户和角色关联表 用户N-1角色 +-- ---------------------------- +drop table if exists sys_user_role; +create table sys_user_role ( + user_id bigint(20) not null comment '用户ID', + role_id bigint(20) not null comment '角色ID', + primary key(user_id, role_id) +) engine=innodb comment = '用户和角色关联表'; + +-- ---------------------------- +-- 初始化-用户和角色关联表数据 +-- ---------------------------- +insert into sys_user_role values ('1', '1'); +insert into sys_user_role values ('2', '2'); + + +-- ---------------------------- +-- 7、角色和菜单关联表 角色1-N菜单 +-- ---------------------------- +drop table if exists sys_role_menu; +create table sys_role_menu ( + role_id bigint(20) not null comment '角色ID', + menu_id bigint(20) not null comment '菜单ID', + primary key(role_id, menu_id) +) engine=innodb comment = '角色和菜单关联表'; + +-- ---------------------------- +-- 初始化-角色和菜单关联表数据 +-- ---------------------------- +insert into sys_role_menu values ('2', '1'); +insert into sys_role_menu values ('2', '2'); +insert into sys_role_menu values ('2', '3'); +insert into sys_role_menu values ('2', '4'); +insert into sys_role_menu values ('2', '100'); +insert into sys_role_menu values ('2', '101'); +insert into sys_role_menu values ('2', '102'); +insert into sys_role_menu values ('2', '103'); +insert into sys_role_menu values ('2', '104'); +insert into sys_role_menu values ('2', '105'); +insert into sys_role_menu values ('2', '106'); +insert into sys_role_menu values ('2', '107'); +insert into sys_role_menu values ('2', '108'); +insert into sys_role_menu values ('2', '109'); +insert into sys_role_menu values ('2', '110'); +insert into sys_role_menu values ('2', '111'); +insert into sys_role_menu values ('2', '112'); +insert into sys_role_menu values ('2', '113'); +insert into sys_role_menu values ('2', '114'); +insert into sys_role_menu values ('2', '115'); +insert into sys_role_menu values ('2', '116'); +insert into sys_role_menu values ('2', '117'); +insert into sys_role_menu values ('2', '500'); +insert into sys_role_menu values ('2', '501'); +insert into sys_role_menu values ('2', '1000'); +insert into sys_role_menu values ('2', '1001'); +insert into sys_role_menu values ('2', '1002'); +insert into sys_role_menu values ('2', '1003'); +insert into sys_role_menu values ('2', '1004'); +insert into sys_role_menu values ('2', '1005'); +insert into sys_role_menu values ('2', '1006'); +insert into sys_role_menu values ('2', '1007'); +insert into sys_role_menu values ('2', '1008'); +insert into sys_role_menu values ('2', '1009'); +insert into sys_role_menu values ('2', '1010'); +insert into sys_role_menu values ('2', '1011'); +insert into sys_role_menu values ('2', '1012'); +insert into sys_role_menu values ('2', '1013'); +insert into sys_role_menu values ('2', '1014'); +insert into sys_role_menu values ('2', '1015'); +insert into sys_role_menu values ('2', '1016'); +insert into sys_role_menu values ('2', '1017'); +insert into sys_role_menu values ('2', '1018'); +insert into sys_role_menu values ('2', '1019'); +insert into sys_role_menu values ('2', '1020'); +insert into sys_role_menu values ('2', '1021'); +insert into sys_role_menu values ('2', '1022'); +insert into sys_role_menu values ('2', '1023'); +insert into sys_role_menu values ('2', '1024'); +insert into sys_role_menu values ('2', '1025'); +insert into sys_role_menu values ('2', '1026'); +insert into sys_role_menu values ('2', '1027'); +insert into sys_role_menu values ('2', '1028'); +insert into sys_role_menu values ('2', '1029'); +insert into sys_role_menu values ('2', '1030'); +insert into sys_role_menu values ('2', '1031'); +insert into sys_role_menu values ('2', '1032'); +insert into sys_role_menu values ('2', '1033'); +insert into sys_role_menu values ('2', '1034'); +insert into sys_role_menu values ('2', '1035'); +insert into sys_role_menu values ('2', '1036'); +insert into sys_role_menu values ('2', '1037'); +insert into sys_role_menu values ('2', '1038'); +insert into sys_role_menu values ('2', '1039'); +insert into sys_role_menu values ('2', '1040'); +insert into sys_role_menu values ('2', '1041'); +insert into sys_role_menu values ('2', '1042'); +insert into sys_role_menu values ('2', '1043'); +insert into sys_role_menu values ('2', '1044'); +insert into sys_role_menu values ('2', '1045'); +insert into sys_role_menu values ('2', '1046'); +insert into sys_role_menu values ('2', '1047'); +insert into sys_role_menu values ('2', '1048'); +insert into sys_role_menu values ('2', '1049'); +insert into sys_role_menu values ('2', '1050'); +insert into sys_role_menu values ('2', '1051'); +insert into sys_role_menu values ('2', '1052'); +insert into sys_role_menu values ('2', '1053'); +insert into sys_role_menu values ('2', '1054'); +insert into sys_role_menu values ('2', '1055'); +insert into sys_role_menu values ('2', '1056'); +insert into sys_role_menu values ('2', '1057'); +insert into sys_role_menu values ('2', '1058'); +insert into sys_role_menu values ('2', '1059'); +insert into sys_role_menu values ('2', '1060'); + +-- ---------------------------- +-- 8、角色和部门关联表 角色1-N部门 +-- ---------------------------- +drop table if exists sys_role_dept; +create table sys_role_dept ( + role_id bigint(20) not null comment '角色ID', + dept_id bigint(20) not null comment '部门ID', + primary key(role_id, dept_id) +) engine=innodb comment = '角色和部门关联表'; + +-- ---------------------------- +-- 初始化-角色和部门关联表数据 +-- ---------------------------- +insert into sys_role_dept values ('2', '100'); +insert into sys_role_dept values ('2', '101'); +insert into sys_role_dept values ('2', '105'); + + +-- ---------------------------- +-- 9、用户与岗位关联表 用户1-N岗位 +-- ---------------------------- +drop table if exists sys_user_post; +create table sys_user_post +( + user_id bigint(20) not null comment '用户ID', + post_id bigint(20) not null comment '岗位ID', + primary key (user_id, post_id) +) engine=innodb comment = '用户与岗位关联表'; + +-- ---------------------------- +-- 初始化-用户与岗位关联表数据 +-- ---------------------------- +insert into sys_user_post values ('1', '1'); +insert into sys_user_post values ('2', '2'); + + +-- ---------------------------- +-- 10、操作日志记录 +-- ---------------------------- +drop table if exists sys_oper_log; +create table sys_oper_log ( + oper_id bigint(20) not null auto_increment comment '日志主键', + title varchar(50) default '' comment '模块标题', + business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)', + method varchar(200) default '' comment '方法名称', + request_method varchar(10) default '' comment '请求方式', + operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)', + oper_name varchar(50) default '' comment '操作人员', + dept_name varchar(50) default '' comment '部门名称', + oper_url varchar(255) default '' comment '请求URL', + oper_ip varchar(128) default '' comment '主机地址', + oper_location varchar(255) default '' comment '操作地点', + oper_param varchar(2000) default '' comment '请求参数', + json_result varchar(2000) default '' comment '返回参数', + status int(1) default 0 comment '操作状态(0正常 1异常)', + error_msg varchar(2000) default '' comment '错误消息', + oper_time datetime comment '操作时间', + cost_time bigint(20) default 0 comment '消耗时间', + primary key (oper_id), + key idx_sys_oper_log_bt (business_type), + key idx_sys_oper_log_s (status), + key idx_sys_oper_log_ot (oper_time) +) engine=innodb auto_increment=100 comment = '操作日志记录'; + + +-- ---------------------------- +-- 11、字典类型表 +-- ---------------------------- +drop table if exists sys_dict_type; +create table sys_dict_type +( + dict_id bigint(20) not null auto_increment comment '字典主键', + dict_name varchar(100) default '' comment '字典名称', + dict_type varchar(100) default '' comment '字典类型', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_id), + unique (dict_type) +) engine=innodb auto_increment=100 comment = '字典类型表'; + +insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表'); +insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表'); +insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表'); +insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表'); +insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表'); +insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表'); +insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表'); +insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表'); +insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); +insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); + + +-- ---------------------------- +-- 12、字典数据表 +-- ---------------------------- +drop table if exists sys_dict_data; +create table sys_dict_data +( + dict_code bigint(20) not null auto_increment comment '字典编码', + dict_sort int(4) default 0 comment '字典排序', + dict_label varchar(100) default '' comment '字典标签', + dict_value varchar(100) default '' comment '字典键值', + dict_type varchar(100) default '' comment '字典类型', + css_class varchar(100) default null comment '样式属性(其他样式扩展)', + list_class varchar(100) default null comment '表格回显样式', + is_default char(1) default 'N' comment '是否默认(Y是 N否)', + status char(1) default '0' comment '状态(0正常 1停用)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_code) +) engine=innodb auto_increment=100 comment = '字典数据表'; + +insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男'); +insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女'); +insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知'); +insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单'); +insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单'); +insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组'); +insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组'); +insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是'); +insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否'); +insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知'); +insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); +insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); +insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作'); +insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); +insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); +insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); +insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); +insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); +insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); +insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); +insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); +insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); +insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); + + +-- ---------------------------- +-- 13、参数配置表 +-- ---------------------------- +drop table if exists sys_config; +create table sys_config ( + config_id int(5) not null auto_increment comment '参数主键', + config_name varchar(100) default '' comment '参数名称', + config_key varchar(100) default '' comment '参数键名', + config_value varchar(500) default '' comment '参数键值', + config_type char(1) default 'N' comment '系统内置(Y是 N否)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (config_id) +) engine=innodb auto_increment=100 comment = '参数配置表'; + +insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' ); +insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)'); +insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); +insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); +insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', sysdate(), '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框'); +insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', sysdate(), '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框'); + + +-- ---------------------------- +-- 14、系统访问记录 +-- ---------------------------- +drop table if exists sys_logininfor; +create table sys_logininfor ( + info_id bigint(20) not null auto_increment comment '访问ID', + user_name varchar(50) default '' comment '用户账号', + ipaddr varchar(128) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', + browser varchar(50) default '' comment '浏览器类型', + os varchar(50) default '' comment '操作系统', + status char(1) default '0' comment '登录状态(0成功 1失败)', + msg varchar(255) default '' comment '提示消息', + login_time datetime comment '访问时间', + primary key (info_id), + key idx_sys_logininfor_s (status), + key idx_sys_logininfor_lt (login_time) +) engine=innodb auto_increment=100 comment = '系统访问记录'; + + +-- ---------------------------- +-- 15、定时任务调度表 +-- ---------------------------- +drop table if exists sys_job; +create table sys_job ( + job_id bigint(20) not null auto_increment comment '任务ID', + job_name varchar(64) default '' comment '任务名称', + job_group varchar(64) default 'DEFAULT' comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + cron_expression varchar(255) default '' comment 'cron执行表达式', + misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)', + status char(1) default '0' comment '状态(0正常 1暂停)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注信息', + primary key (job_id, job_name, job_group) +) engine=innodb auto_increment=100 comment = '定时任务调度表'; + +insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); +insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, ''); + + +-- ---------------------------- +-- 16、定时任务调度日志表 +-- ---------------------------- +drop table if exists sys_job_log; +create table sys_job_log ( + job_log_id bigint(20) not null auto_increment comment '任务日志ID', + job_name varchar(64) not null comment '任务名称', + job_group varchar(64) not null comment '任务组名', + invoke_target varchar(500) not null comment '调用目标字符串', + job_message varchar(500) comment '日志信息', + status char(1) default '0' comment '执行状态(0正常 1失败)', + exception_info varchar(2000) default '' comment '异常信息', + create_time datetime comment '创建时间', + primary key (job_log_id) +) engine=innodb comment = '定时任务调度日志表'; + + +-- ---------------------------- +-- 17、通知公告表 +-- ---------------------------- +drop table if exists sys_notice; +create table sys_notice ( + notice_id int(4) not null auto_increment comment '公告ID', + notice_title varchar(50) not null comment '公告标题', + notice_type char(1) not null comment '公告类型(1通知 2公告)', + notice_content longblob default null comment '公告内容', + status char(1) default '0' comment '公告状态(0正常 1关闭)', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(255) default null comment '备注', + primary key (notice_id) +) engine=innodb auto_increment=10 comment = '通知公告表'; + +-- ---------------------------- +-- 初始化-公告信息表数据 +-- ---------------------------- +insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员'); +insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员'); + + +-- ---------------------------- +-- 18、代码生成业务表 +-- ---------------------------- +drop table if exists gen_table; +create table gen_table ( + table_id bigint(20) not null auto_increment comment '编号', + table_name varchar(200) default '' comment '表名称', + table_comment varchar(500) default '' comment '表描述', + sub_table_name varchar(64) default null comment '关联子表的表名', + sub_table_fk_name varchar(64) default null comment '子表关联的外键名', + class_name varchar(100) default '' comment '实体类名称', + tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)', + tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)', + package_name varchar(100) comment '生成包路径', + module_name varchar(30) comment '生成模块名', + business_name varchar(30) comment '生成业务名', + function_name varchar(50) comment '生成功能名', + function_author varchar(50) comment '生成功能作者', + gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)', + gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)', + options varchar(1000) comment '其它生成选项', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (table_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表'; + + +-- ---------------------------- +-- 19、代码生成业务表字段 +-- ---------------------------- +drop table if exists gen_table_column; +create table gen_table_column ( + column_id bigint(20) not null auto_increment comment '编号', + table_id bigint(20) comment '归属表编号', + column_name varchar(200) comment '列名称', + column_comment varchar(500) comment '列描述', + column_type varchar(100) comment '列类型', + java_type varchar(500) comment 'JAVA类型', + java_field varchar(200) comment 'JAVA字段名', + is_pk char(1) comment '是否主键(1是)', + is_increment char(1) comment '是否自增(1是)', + is_required char(1) comment '是否必填(1是)', + is_insert char(1) comment '是否为插入字段(1是)', + is_edit char(1) comment '是否编辑字段(1是)', + is_list char(1) comment '是否列表字段(1是)', + is_query char(1) comment '是否查询字段(1是)', + query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)', + html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + dict_type varchar(200) default '' comment '字典类型', + sort int comment '排序', + create_by varchar(64) default '' comment '创建者', + create_time datetime comment '创建时间', + update_by varchar(64) default '' comment '更新者', + update_time datetime comment '更新时间', + primary key (column_id) +) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; \ No newline at end of file From 230116bdd7d54e3c2dad978d49207d141f69202b Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 15:40:49 +0800 Subject: [PATCH 09/11] sql --- docker/mysql/init/00-create-db.sql | 2 ++ docker/mysql/init/{quartz.sql => 01-ruoyi-table.sql.sql} | 0 docker/mysql/init/{ry_20250522.sql => 02-ruoyi-extra.sql.sql} | 0 ...{_localhost-2026_04_09_10_53_40-dump.sql => 03-data.sql.sql} | 0 4 files changed, 2 insertions(+) create mode 100644 docker/mysql/init/00-create-db.sql rename docker/mysql/init/{quartz.sql => 01-ruoyi-table.sql.sql} (100%) rename docker/mysql/init/{ry_20250522.sql => 02-ruoyi-extra.sql.sql} (100%) rename docker/mysql/init/{_localhost-2026_04_09_10_53_40-dump.sql => 03-data.sql.sql} (100%) diff --git a/docker/mysql/init/00-create-db.sql b/docker/mysql/init/00-create-db.sql new file mode 100644 index 0000000..4fbbd66 --- /dev/null +++ b/docker/mysql/init/00-create-db.sql @@ -0,0 +1,2 @@ +CREATE DATABASE IF NOT EXISTS autosolution_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE autosolution_db; \ No newline at end of file diff --git a/docker/mysql/init/quartz.sql b/docker/mysql/init/01-ruoyi-table.sql.sql similarity index 100% rename from docker/mysql/init/quartz.sql rename to docker/mysql/init/01-ruoyi-table.sql.sql diff --git a/docker/mysql/init/ry_20250522.sql b/docker/mysql/init/02-ruoyi-extra.sql.sql similarity index 100% rename from docker/mysql/init/ry_20250522.sql rename to docker/mysql/init/02-ruoyi-extra.sql.sql diff --git a/docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql b/docker/mysql/init/03-data.sql.sql similarity index 100% rename from docker/mysql/init/_localhost-2026_04_09_10_53_40-dump.sql rename to docker/mysql/init/03-data.sql.sql From 08030c77c2cb55742caa47646bb2cbcba9b0c40d Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 16:06:40 +0800 Subject: [PATCH 10/11] =?UTF-8?q?sql=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 +- .../init/{02-ruoyi-extra.sql.sql => 01-ruoyi-extra.sql.sql} | 0 .../init/{01-ruoyi-table.sql.sql => 02-ruoyi-table.sql.sql} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename docker/mysql/init/{02-ruoyi-extra.sql.sql => 01-ruoyi-extra.sql.sql} (100%) rename docker/mysql/init/{01-ruoyi-table.sql.sql => 02-ruoyi-table.sql.sql} (100%) diff --git a/.env.example b/.env.example index 1092d27..3e881ac 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,7 @@ # 复制为 .env 后 docker compose 会自动加载 # copy .env.example .env -MYSQL_ROOT_PASSWORD=1234 +MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=autosolution_db MYSQL_PORT=3307 diff --git a/docker/mysql/init/02-ruoyi-extra.sql.sql b/docker/mysql/init/01-ruoyi-extra.sql.sql similarity index 100% rename from docker/mysql/init/02-ruoyi-extra.sql.sql rename to docker/mysql/init/01-ruoyi-extra.sql.sql diff --git a/docker/mysql/init/01-ruoyi-table.sql.sql b/docker/mysql/init/02-ruoyi-table.sql.sql similarity index 100% rename from docker/mysql/init/01-ruoyi-table.sql.sql rename to docker/mysql/init/02-ruoyi-table.sql.sql From 8a0dfb1ab89d3b4a00d0d8b8142f4ebdbd58d9bc Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 9 Apr 2026 16:10:15 +0800 Subject: [PATCH 11/11] =?UTF-8?q?sql=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0b613b4..287a58f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,11 @@ services: - mysql_data:/var/lib/mysql - ./docker/mysql/init:/docker-entrypoint-initdb.d:ro healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] + test: + [ + "CMD-SHELL", + "mysql -h 127.0.0.1 -uroot -p$${MYSQL_ROOT_PASSWORD:-root} -Nse \"SELECT 1 FROM information_schema.tables WHERE table_schema='$${MYSQL_DATABASE:-autosolution_db}' AND table_name='sys_config' LIMIT 1\" | grep -q 1", + ] interval: 10s timeout: 5s retries: 10