From 99c100f2aca534137ee77cd6a298b3960e288524 Mon Sep 17 00:00:00 2001 From: MHW Date: Fri, 13 Mar 2026 14:36:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?26-03-13-14=EF=BC=9A36=EF=BC=9A=E7=81=AB?= =?UTF-8?q?=E5=8A=9B=E8=A7=84=E5=88=99=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto-solution-admin/pom.xml | 6 + .../web/controller/rule/RuleController.java | 56 +++++++ .../src/main/resources/application-druid.yml | 6 +- .../src/main/resources/application.yml | 8 +- auto-solution-common/pom.xml | 6 + .../common/constant/ExceptionConstants.java | 16 ++ .../constant/PlatformAndModuleConstants.java | 9 + auto-solution-rule/pom.xml | 39 +++++ .../rule/domain/FireRuleExecuteDTO.java | 17 ++ .../rule/domain/PlatformComponent.java | 32 ++++ .../com/solution/rule/domain/RuleParam.java | 22 +++ .../solution/rule/domain/dto/RequestDTO.java | 22 +++ .../rule/domain/dto/WeaponModelDTO.java | 23 +++ .../rule/domain/vo/ComponentCountVO.java | 16 ++ .../domain/vo/PlatformComponentNamesVO.java | 17 ++ .../domain/vo/PlatformWeaponAggregateVO.java | 22 +++ .../rule/domain/vo/WeaponModelVO.java | 18 ++ .../com/solution/rule/enums/SceneType.java | 39 +++++ .../handler/AbstractRuleChainHandler.java | 43 +++++ .../rule/handler/RuleChainHandler.java | 47 ++++++ .../rule/handler/WarplaneHandler.java | 80 +++++++++ .../rule/mapper/ModelDetailMapper.java | 9 + .../com/solution/rule/mapper/RuleMapper.java | 34 ++++ .../solution/rule/service/RuleService.java | 36 ++++ .../rule/service/impl/RuleServiceImpl.java | 156 ++++++++++++++++++ .../rule/strategy/AirborneStrategy.java | 44 +++++ .../rule/strategy/DefenseStrategy.java | 44 +++++ .../solution/rule/strategy/SceneStrategy.java | 15 ++ .../rule/strategy/SceneStrategyFactory.java | 45 +++++ .../main/resources/mapper/rule/RuleMapper.xml | 66 ++++++++ pom.xml | 8 + 31 files changed, 997 insertions(+), 4 deletions(-) create mode 100644 auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java create mode 100644 auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java create mode 100644 auto-solution-common/src/main/java/com/solution/common/constant/PlatformAndModuleConstants.java create mode 100644 auto-solution-rule/pom.xml create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/FireRuleExecuteDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/enums/SceneType.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java create mode 100644 auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml diff --git a/auto-solution-admin/pom.xml b/auto-solution-admin/pom.xml index 62008f0..58545c6 100644 --- a/auto-solution-admin/pom.xml +++ b/auto-solution-admin/pom.xml @@ -70,6 +70,12 @@ com.solution solution-algo + + + com.solution + solution-rule + + diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java new file mode 100644 index 0000000..93aebf4 --- /dev/null +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java @@ -0,0 +1,56 @@ +package com.solution.web.controller.rule; + +import com.solution.common.core.controller.BaseController; +import com.solution.common.core.domain.AjaxResult; +import com.solution.rule.domain.FireRuleExecuteDTO; +import com.solution.rule.service.RuleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + + +@Api("火力规则") +@RestController +@RequestMapping("/api/system/firerule") +public class RuleController extends BaseController { + + + @Autowired + private RuleService ruleService; + + + /** + * 开始执行规则匹配 + * @param fireRuleExecuteDTO 敌方参数 + * @return + */ + @PostMapping("/start") + @ApiOperation("开始执行规则匹配") + public AjaxResult execute(@RequestBody FireRuleExecuteDTO fireRuleExecuteDTO){ + return success(ruleService.execute(fireRuleExecuteDTO)); + } + + /** + * 获取所有武器平台和组件 + * @return + */ + @GetMapping("/weapon") + @ApiOperation("获取所有武器平台和组件") + public AjaxResult getPlatformComponentNames(){ + return success(ruleService.getPlatformComponentNames()); + } + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + @GetMapping("/comm") + @ApiOperation("获取通信组件的所有平台和组件") + public AjaxResult getCommPlatformComponentNames(Integer scenarioId){ + return success(ruleService.getCommPlatformComponentNames(scenarioId)); + } + +} diff --git a/auto-solution-admin/src/main/resources/application-druid.yml b/auto-solution-admin/src/main/resources/application-druid.yml index 341f014..d9bbb1f 100644 --- a/auto-solution-admin/src/main/resources/application-druid.yml +++ b/auto-solution-admin/src/main/resources/application-druid.yml @@ -6,9 +6,11 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://192.168.166.71:3306/behaviortreedb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://192.168.166.71:3306/behaviortreedb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/autosolution_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: 123456 +# password: 123456 + password: 1234 # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/auto-solution-admin/src/main/resources/application.yml b/auto-solution-admin/src/main/resources/application.yml index 821bd48..282410e 100644 --- a/auto-solution-admin/src/main/resources/application.yml +++ b/auto-solution-admin/src/main/resources/application.yml @@ -67,13 +67,15 @@ spring: # redis 配置 redis: # 地址 - host: 192.168.166.71 +# host: 192.168.166.71 + host: 127.0.0.1 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 - password: +# password: + password: 123456 # 连接超时时间 timeout: 10s lettuce: @@ -104,6 +106,8 @@ mybatis: mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml + configuration: + map-underscore-to-camel-case: true # PageHelper分页插件 pagehelper: diff --git a/auto-solution-common/pom.xml b/auto-solution-common/pom.xml index ed8a034..0b387a9 100644 --- a/auto-solution-common/pom.xml +++ b/auto-solution-common/pom.xml @@ -113,6 +113,12 @@ javax.servlet-api + + cn.hutool + hutool-all + 5.8.25 + + \ No newline at end of file diff --git a/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java b/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java new file mode 100644 index 0000000..56add30 --- /dev/null +++ b/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java @@ -0,0 +1,16 @@ +package com.solution.common.constant; + +/** + * 火力规则常量 + */ +public class ExceptionConstants { + + public static final String PARAMETER_EXCEPTION = "参数异常"; + + public static final String RESULT_EXCEPTION = "结果异常"; + + public static final String NOT_FOUND_CARRIAGE_CHAIN_HANDLER = "not found carriage chain handler!"; + + public static final String NOT_FOUND_F22_COMPONENT = "未找到 F-22 组件"; + +} diff --git a/auto-solution-common/src/main/java/com/solution/common/constant/PlatformAndModuleConstants.java b/auto-solution-common/src/main/java/com/solution/common/constant/PlatformAndModuleConstants.java new file mode 100644 index 0000000..26181cf --- /dev/null +++ b/auto-solution-common/src/main/java/com/solution/common/constant/PlatformAndModuleConstants.java @@ -0,0 +1,9 @@ +package com.solution.common.constant; + + +public class PlatformAndModuleConstants { + + public static final String RED_NEBO_M_1 = "red_nebo_m_1"; + + public static final String RED_NEBO_M_2 = "red_nebo_m_2"; +} diff --git a/auto-solution-rule/pom.xml b/auto-solution-rule/pom.xml new file mode 100644 index 0000000..33757b0 --- /dev/null +++ b/auto-solution-rule/pom.xml @@ -0,0 +1,39 @@ + + + + solution + com.solution + 3.9.1 + + + 4.0.0 + + solution-rule + + + rule模块 + + + + + + + com.solution + solution-common + + + + org.projectlombok + lombok + + + + io.springfox + springfox-boot-starter + + + + + \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/FireRuleExecuteDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/FireRuleExecuteDTO.java new file mode 100644 index 0000000..da1803f --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/FireRuleExecuteDTO.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain; + +import com.solution.rule.domain.dto.WeaponModelDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class FireRuleExecuteDTO { + + @ApiModelProperty("场景类型") + private Integer sceneType; + + @ApiModelProperty("武器模型数据") + private List weaponModelDTOs; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java new file mode 100644 index 0000000..dd66e3a --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java @@ -0,0 +1,32 @@ +package com.solution.rule.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 平台挂载的组件实体类 + * 对应表 platform_component + */ +@Data +@ApiModel(value = "平台组件对象", description = "平台所挂载的武器、雷达、通信等组件") +public class PlatformComponent { + + @ApiModelProperty(value = "组件ID,主键自增") + private Integer id; + + @ApiModelProperty(value = "组件名称(具体型号)") + private String name; + + @ApiModelProperty(value = "组件类型:weapon(武器)、radar(雷达)、comm(通信)") + private String type; + + @ApiModelProperty(value = "组件描述信息") + private String description; + + @ApiModelProperty(value = "所属平台ID,关联platform表") + private Integer platformId; + + @ApiModelProperty(value = "组件数量") + private Long num; +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java new file mode 100644 index 0000000..8506678 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain; + +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.domain.vo.WeaponModelVO; +import lombok.Data; + +import java.util.List; + + +@Data +public class RuleParam { + + private List resultWeapons; + + private WeaponModelVO weaponModelVO; + + private List weaponModelDTOList; + + private List databaseWeapons; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java new file mode 100644 index 0000000..f2cdeeb --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain.dto; + +import lombok.Data; + +/** + * 规则请求参数 + */ +@Data +public class RequestDTO { + + //编队数量 + private Long formationNum; + + //武装直升机数量 + private Long gunshipNum; + + //无人机数量 + private Long droneNum; + + //单兵武器数量 + private Long singleWeaponNum; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java new file mode 100644 index 0000000..1ec2fff --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java @@ -0,0 +1,23 @@ +package com.solution.rule.domain.dto; + +import com.solution.rule.domain.PlatformComponent; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class WeaponModelDTO { + + @ApiModelProperty("平台id") + private Integer id; + + @ApiModelProperty("平台名称") + private String name; + + @ApiModelProperty("平台描述") + private String description; + + @ApiModelProperty("平台组件") + private List components; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java new file mode 100644 index 0000000..9bb1f80 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java @@ -0,0 +1,16 @@ +package com.solution.rule.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +// 组件计数VO +@Data +@ApiModel("组件计数信息") +public class ComponentCountVO { + @ApiModelProperty("组件名称") + private String componentName; + + @ApiModelProperty("组件数量") + private Long count; +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java new file mode 100644 index 0000000..cd9e6c9 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java @@ -0,0 +1,17 @@ +package com.solution.rule.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("平台组件名称聚合") +public class PlatformComponentNamesVO { + @ApiModelProperty("平台名称") + private String platformName; + + @ApiModelProperty("该平台下的组件名称列表(去重)") + private List componentNames; +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java new file mode 100644 index 0000000..4c09576 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java @@ -0,0 +1,22 @@ +package com.solution.rule.domain.vo; + +import com.solution.rule.domain.PlatformComponent; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +// 平台武器聚合VO +@Data +@ApiModel("平台武器聚合信息") +public class PlatformWeaponAggregateVO { + @ApiModelProperty("平台名称") + private String platformName; + + @ApiModelProperty("该平台下的组件列表") + private List components; + + @ApiModelProperty("返回数据库数据") + private List componentCountVOS; +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java new file mode 100644 index 0000000..528f709 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java @@ -0,0 +1,18 @@ +package com.solution.rule.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class WeaponModelVO { + + @ApiModelProperty("平台名称") + private String platformName; + + @ApiModelProperty("组件名称") + private String componentName; + + @ApiModelProperty("组件数量") + private Long count; + +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/enums/SceneType.java b/auto-solution-rule/src/main/java/com/solution/rule/enums/SceneType.java new file mode 100644 index 0000000..142a69f --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/enums/SceneType.java @@ -0,0 +1,39 @@ +package com.solution.rule.enums; + +public enum SceneType { + + DEFENSE(0, "防御"), + AIRBORNE(1, "空降"); + + private final int code; + private final String description; + + SceneType(int code, String description) { + this.code = code; + this.description = description; + } + + public int getCode() { + return code; + } + + public String getDescription() { + return description; + } + + + /** + * 根据数字编码获取对应的枚举 + * @param code 前端传递的数字 + * @return 枚举实例 + * @throws IllegalArgumentException 如果找不到对应枚举 + */ + public static SceneType fromCode(int code) { + for (SceneType type : values()) { + if (type.code == code) { + return type; + } + } + throw new IllegalArgumentException("未知的场景类型编码: " + code); + } +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java b/auto-solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java new file mode 100644 index 0000000..9d5c2e3 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java @@ -0,0 +1,43 @@ +package com.solution.rule.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.solution.rule.domain.RuleParam; + +/** + * 规则链抽象类 + */ +public abstract class AbstractRuleChainHandler { + + + private AbstractRuleChainHandler nextHandler; + + + /** + * 执行过滤方法 + * @param ruleParam + * @return + */ + public abstract RuleParam doHandler(RuleParam ruleParam); + + + /** + * 执行下一个处理器 + * @param ruleParam + * @return + */ + public RuleParam doNextHandler(RuleParam ruleParam){ + if(ObjectUtil.isEmpty(nextHandler) || ObjectUtil.isNotEmpty(ruleParam)){ + return ruleParam; + } + return nextHandler.doHandler(ruleParam); + } + + /** + * 设置下游handler + * @param nextHandler + */ + public void setNextHandler(AbstractRuleChainHandler nextHandler) { + this.nextHandler = nextHandler; + } + +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java b/auto-solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java new file mode 100644 index 0000000..42a5d33 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java @@ -0,0 +1,47 @@ +package com.solution.rule.handler; + + +import cn.hutool.core.collection.CollUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.rule.domain.RuleParam; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; + +/** + * 封装规则处理链 + */ +@Component +public class RuleChainHandler { + + @Resource + private List chainHandlers; + + private AbstractRuleChainHandler firstHandler; + + /** + * 组装处理链 + */ + @PostConstruct + private void constructChain(){ + if (CollUtil.isEmpty(chainHandlers)) { + throw new RuntimeException(ExceptionConstants.NOT_FOUND_CARRIAGE_CHAIN_HANDLER); + } + this.firstHandler = chainHandlers.get(0); + for (int i = 0; i < chainHandlers.size(); i++) { + if(i == (chainHandlers.size() - 1)){ + chainHandlers.get(i).setNextHandler(null); + }else { + chainHandlers.get(i).setNextHandler(chainHandlers.get(i + 1)); + } + } + + } + + public RuleParam findRuleParam(RuleParam ruleParam){ + return firstHandler.doHandler(ruleParam); + } + +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java b/auto-solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java new file mode 100644 index 0000000..759102f --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java @@ -0,0 +1,80 @@ +package com.solution.rule.handler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.common.constant.PlatformAndModuleConstants; +import com.solution.rule.domain.PlatformComponent; +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 战斗机处理链 + * 规则:针对 F22 平台,后端返回的组件数量比前端传递的大1, + * 如果数据库中 F22 平台所有组件总数小于前端数量+1,则返回该总数。 + */ +@Component +public class WarplaneHandler extends AbstractRuleChainHandler { + + // 组件数量增量常量 + private static final long COMPONENT_COUNT_INCREMENT = 1; + + @Override + public RuleParam doHandler(RuleParam ruleParam) { + // 1. 参数校验 + if (ObjectUtil.isEmpty(ruleParam) || CollUtil.isEmpty(ruleParam.getWeaponModelDTOList())) { + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + + List dtoList = ruleParam.getWeaponModelDTOList(); + List databaseWeapons = ruleParam.getDatabaseWeapons(); + + List resultWeapons = new ArrayList<>(); + + //TODO获取所有组件以及count + + Iterator iterator = dtoList.iterator(); + while (iterator.hasNext()) { + WeaponModelDTO dto = iterator.next(); + if(PlatformAndModuleConstants.RED_NEBO_M_1.equals(dto.getName())){ + List components = dto.getComponents(); + List componentList = new ArrayList<>(); + + //遍历前端数据的组件 + for (PlatformComponent component : components) { + //遍历数据库数据 + for (ComponentCountVO databaseWeapon : databaseWeapons) { + if(component.getName().equals(databaseWeapon.getComponentName())){ + PlatformComponent component1 = new PlatformComponent(); + component1.setName(databaseWeapon.getComponentName()); + if(databaseWeapon.getCount() > component.getNum()){ + component1.setNum(component.getNum() + COMPONENT_COUNT_INCREMENT); + }else { + component1.setNum(databaseWeapon.getCount()); + } + //TODO 补充基本信息 暂未完成 + componentList.add(component1); + } + } + } + PlatformWeaponAggregateVO platformVO = new PlatformWeaponAggregateVO(); + platformVO.setPlatformName(dto.getName()); + platformVO.setComponents(componentList); + resultWeapons.add(platformVO); + iterator.remove(); + } + } + ruleParam.setResultWeapons(resultWeapons); + return ruleParam; + +// return super.doNextHandler(ruleParam); + } + +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java b/auto-solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java new file mode 100644 index 0000000..903bf51 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java @@ -0,0 +1,9 @@ +package com.solution.rule.mapper; + +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ModelDetailMapper { + + +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java b/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java new file mode 100644 index 0000000..0f4f2ac --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java @@ -0,0 +1,34 @@ +package com.solution.rule.mapper; + +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformComponentNamesVO; +import com.solution.rule.domain.vo.WeaponModelVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface RuleMapper { + + /** + * 获取所有武器平台和组件 + * @return + */ + List getWeapon(); + + List getPlatformComponentNames(); + + /** + * 获取所有组件以及数量 + * @return + */ + List getModuleAndCount(); + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + List getCommPlatformComponentNames(Integer scenarioId); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java b/auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java new file mode 100644 index 0000000..580366f --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java @@ -0,0 +1,36 @@ +package com.solution.rule.service; + +import com.solution.rule.domain.FireRuleExecuteDTO; +import com.solution.rule.domain.dto.RequestDTO; +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.PlatformComponentNamesVO; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.domain.vo.WeaponModelVO; + +import java.util.HashMap; +import java.util.List; + +public interface RuleService { + + /** + * 开始执行规则匹配 + * @param fireRuleExecuteDTO + * @return + */ + List execute(FireRuleExecuteDTO fireRuleExecuteDTO); + + List getWeapon(); + + /** + * 获取所有武器平台和组件 + * @return + */ + List getPlatformComponentNames(); + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + List getCommPlatformComponentNames(Integer scenarioId); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java new file mode 100644 index 0000000..ab3d925 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java @@ -0,0 +1,156 @@ +package com.solution.rule.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.rule.domain.FireRuleExecuteDTO; +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformComponentNamesVO; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.domain.vo.WeaponModelVO; +import com.solution.rule.mapper.RuleMapper; +import com.solution.rule.service.RuleService; +import com.solution.rule.strategy.SceneStrategy; +import com.solution.rule.strategy.SceneStrategyFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class RuleServiceImpl implements RuleService { + + private static final long COMPONENT_QUANTITY_THRESHOLD = 1; + + @Autowired + private SceneStrategyFactory strategyFactory; + + @Autowired + private RuleMapper ruleMapper; + + /* @Override + public WeaponModelVO execute(Integer sceneType, WeaponModelDTO weaponModelDTO) { + if(ObjectUtil.isNull(sceneType) || ObjectUtil.isEmpty(weaponModelDTO)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + //TODO 查数据库获取我方装备 + List weapon = this.getWeapon(); + + SceneStrategy strategy = strategyFactory.getStrategy(sceneType); + WeaponModelVO result = strategy.execute(weaponModelDTO); + if(ObjectUtil.isEmpty(result)){ + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + return result; + }*/ + + + @Override + public List execute(FireRuleExecuteDTO fireRuleExecuteDTO) { + if(ObjectUtil.isEmpty(fireRuleExecuteDTO)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + List weaponModelDTOs = fireRuleExecuteDTO.getWeaponModelDTOs(); + Integer sceneType = fireRuleExecuteDTO.getSceneType(); + // 查数据库获取我方装备 + List weapon = this.getModuleAndCount(); + + // 创建RuleParam并设置数据 + RuleParam ruleParam = new RuleParam(); + ruleParam.setWeaponModelDTOList(weaponModelDTOs); + ruleParam.setDatabaseWeapons(weapon); + + // 执行策略 + SceneStrategy strategy = strategyFactory.getStrategy(sceneType); + List result = strategy.execute(ruleParam); + + return result; + } + + @Override + public List getWeapon() { + List flatList = ruleMapper.getWeapon(); + if (CollUtil.isEmpty(flatList)) { + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + + Map> groupByPlatform = flatList.stream() + .collect(Collectors.groupingBy(WeaponModelVO::getPlatformName)); + + List result = new ArrayList<>(); + for (Map.Entry> entry : groupByPlatform.entrySet()) { + PlatformWeaponAggregateVO platformVO = new PlatformWeaponAggregateVO(); + platformVO.setPlatformName(entry.getKey()); + + List components = entry.getValue().stream() + .map(item -> { + ComponentCountVO comp = new ComponentCountVO(); + comp.setComponentName(item.getComponentName()); + comp.setCount(item.getCount()); + return comp; + }) + .collect(Collectors.toList()); + platformVO.setComponentCountVOS(components); + + result.add(platformVO); + } + + return result; + } + + + /** + * 获取所有武器平台和组件 + * @return + */ + @Override + public List getPlatformComponentNames() { + List flatList = ruleMapper.getPlatformComponentNames(); + if (CollUtil.isEmpty(flatList)) { + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + + + Map> groupByPlatform = flatList.stream() + .collect(Collectors.groupingBy( + WeaponModelVO::getPlatformName, + Collectors.mapping(WeaponModelVO::getComponentName, Collectors.toList()) + )); + + return groupByPlatform.entrySet().stream() + .map(entry -> { + PlatformComponentNamesVO vo = new PlatformComponentNamesVO(); + vo.setPlatformName(entry.getKey()); + vo.setComponentNames(entry.getValue()); + return vo; + }) + .collect(Collectors.toList()); + } + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + @Override + public List getCommPlatformComponentNames(Integer scenarioId) { + return ruleMapper.getCommPlatformComponentNames(scenarioId); + } + + /** + * 获取所有组件以及数量 + * @return + */ + private List getModuleAndCount(){ + List componentCountVOS = ruleMapper.getModuleAndCount(); + if(CollUtil.isEmpty(componentCountVOS)){ + return new ArrayList<>(); + } + return componentCountVOS; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java b/auto-solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java new file mode 100644 index 0000000..e09879c --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java @@ -0,0 +1,44 @@ +package com.solution.rule.strategy; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.enums.SceneType; +import com.solution.rule.handler.RuleChainHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Component +public class AirborneStrategy implements SceneStrategy{ + + + @Autowired + private RuleChainHandler ruleChainHandler; + /** + * 空降场景处理 + * @param ruleParam + * @return + */ + + + @Override + public List execute(RuleParam ruleParam) { + if(ObjectUtil.isEmpty(ruleParam) || CollUtil.isEmpty(ruleParam.getWeaponModelDTOList())){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + + ruleParam = ruleChainHandler.findRuleParam(ruleParam); + + return ruleParam.getResultWeapons(); + } + + @Override + public SceneType getSceneType() { + return SceneType.AIRBORNE; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java b/auto-solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java new file mode 100644 index 0000000..e649442 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java @@ -0,0 +1,44 @@ +package com.solution.rule.strategy; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.enums.SceneType; +import com.solution.rule.handler.RuleChainHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class DefenseStrategy implements SceneStrategy{ + + + @Autowired + private RuleChainHandler ruleChainHandler; + /** + * 防御场景处理 + * @param + * @return + */ + + + @Override + public List execute(RuleParam ruleParam) { + if(ObjectUtil.isEmpty(ruleParam) || CollUtil.isEmpty(ruleParam.getWeaponModelDTOList())){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + + ruleParam = ruleChainHandler.findRuleParam(ruleParam); + + + return ruleParam.getResultWeapons(); + } + + @Override + public SceneType getSceneType() { + return SceneType.DEFENSE; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java b/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java new file mode 100644 index 0000000..b6c9bb1 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java @@ -0,0 +1,15 @@ +package com.solution.rule.strategy; + +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.enums.SceneType; + +import java.util.HashMap; +import java.util.List; + +public interface SceneStrategy { + + List execute(RuleParam ruleParam); + + SceneType getSceneType(); +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java b/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java new file mode 100644 index 0000000..beb935a --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java @@ -0,0 +1,45 @@ +package com.solution.rule.strategy; + +import com.solution.rule.enums.SceneType; +import com.solution.rule.strategy.SceneStrategy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +@Component +public class SceneStrategyFactory { + + @Autowired + private List strategyList; + + private final Map strategyMap = new EnumMap<>(SceneType.class); + + @PostConstruct + public void init() { + for (SceneStrategy strategy : strategyList) { + SceneType type = strategy.getSceneType(); + if (strategyMap.containsKey(type)) { + throw new IllegalStateException("重复的场景类型: " + type); + } + strategyMap.put(type, strategy); + } + } + + /** + * 根据前端传递的数字编码获取对应的策略 + * @param code 前端传递的数字 + * @return 策略实现 + * @throws IllegalArgumentException 如果编码无效或策略未注册 + */ + public SceneStrategy getStrategy(int code) { + SceneType type = SceneType.fromCode(code); + SceneStrategy strategy = strategyMap.get(type); + if (strategy == null) { + throw new IllegalArgumentException("未找到编码 " + code + " 对应的策略实现"); + } + return strategy; + } +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml b/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml new file mode 100644 index 0000000..541b652 --- /dev/null +++ b/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8640467..e906dd3 100644 --- a/pom.xml +++ b/pom.xml @@ -231,6 +231,13 @@ ${solution.version} + + + com.solution + solution-rule + ${solution.version} + + @@ -244,6 +251,7 @@ auto-solution-quartz auto-solution-generator auto-solution-common + auto-solution-rule pom From dde470c9dad5acc64bb4803137c98b1ac153baa2 Mon Sep 17 00:00:00 2001 From: MHW Date: Fri, 13 Mar 2026 14:52:29 +0800 Subject: [PATCH 2/4] =?UTF-8?q?26-03-13-14=EF=BC=9A36=EF=BC=9A=E7=81=AB?= =?UTF-8?q?=E5=8A=9B=E8=A7=84=E5=88=99=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?-=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- solution-rule/pom.xml | 39 ------- .../rule/domain/PlatformComponent.java | 32 ----- .../com/solution/rule/domain/RuleParam.java | 14 --- .../solution/rule/domain/dto/RequestDTO.java | 22 ---- .../rule/domain/dto/WeaponModelDTO.java | 23 ---- .../rule/domain/vo/ComponentCountVO.java | 16 --- .../domain/vo/PlatformComponentNamesVO.java | 17 --- .../domain/vo/PlatformWeaponAggregateVO.java | 18 --- .../rule/domain/vo/WeaponModelVO.java | 19 --- .../com/solution/rule/enums/SceneType.java | 39 ------- .../handler/AbstractRuleChainHandler.java | 43 ------- .../rule/handler/RuleChainHandler.java | 47 -------- .../rule/handler/WarplaneHandler.java | 36 ------ .../rule/mapper/ModelDetailMapper.java | 9 -- .../com/solution/rule/mapper/RuleMapper.java | 19 --- .../solution/rule/service/RuleService.java | 29 ----- .../rule/service/impl/RuleServiceImpl.java | 109 ------------------ .../rule/strategy/AirborneStrategy.java | 43 ------- .../rule/strategy/DefenseStrategy.java | 42 ------- .../solution/rule/strategy/SceneStrategy.java | 15 --- .../rule/strategy/SceneStrategyFactory.java | 45 -------- .../main/resources/mapper/rule/RuleMapper.xml | 37 ------ 22 files changed, 713 deletions(-) delete mode 100644 solution-rule/pom.xml delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/enums/SceneType.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/service/RuleService.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java delete mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java delete mode 100644 solution-rule/src/main/resources/mapper/rule/RuleMapper.xml diff --git a/solution-rule/pom.xml b/solution-rule/pom.xml deleted file mode 100644 index 33757b0..0000000 --- a/solution-rule/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - solution - com.solution - 3.9.1 - - - 4.0.0 - - solution-rule - - - rule模块 - - - - - - - com.solution - solution-common - - - - org.projectlombok - lombok - - - - io.springfox - springfox-boot-starter - - - - - \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java b/solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java deleted file mode 100644 index dd66e3a..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.solution.rule.domain; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 平台挂载的组件实体类 - * 对应表 platform_component - */ -@Data -@ApiModel(value = "平台组件对象", description = "平台所挂载的武器、雷达、通信等组件") -public class PlatformComponent { - - @ApiModelProperty(value = "组件ID,主键自增") - private Integer id; - - @ApiModelProperty(value = "组件名称(具体型号)") - private String name; - - @ApiModelProperty(value = "组件类型:weapon(武器)、radar(雷达)、comm(通信)") - private String type; - - @ApiModelProperty(value = "组件描述信息") - private String description; - - @ApiModelProperty(value = "所属平台ID,关联platform表") - private Integer platformId; - - @ApiModelProperty(value = "组件数量") - private Long num; -} \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java b/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java deleted file mode 100644 index f437c75..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.solution.rule.domain; - -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import lombok.Data; - - -@Data -public class RuleParam { - - private WeaponModelVO weaponModelVO; - - private WeaponModelDTO weaponModelDTO; -} diff --git a/solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java b/solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java deleted file mode 100644 index f2cdeeb..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.solution.rule.domain.dto; - -import lombok.Data; - -/** - * 规则请求参数 - */ -@Data -public class RequestDTO { - - //编队数量 - private Long formationNum; - - //武装直升机数量 - private Long gunshipNum; - - //无人机数量 - private Long droneNum; - - //单兵武器数量 - private Long singleWeaponNum; -} diff --git a/solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java b/solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java deleted file mode 100644 index 1ec2fff..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.solution.rule.domain.dto; - -import com.solution.rule.domain.PlatformComponent; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -public class WeaponModelDTO { - - @ApiModelProperty("平台id") - private Integer id; - - @ApiModelProperty("平台名称") - private String name; - - @ApiModelProperty("平台描述") - private String description; - - @ApiModelProperty("平台组件") - private List components; -} diff --git a/solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java b/solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java deleted file mode 100644 index 9bb1f80..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.solution.rule.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -// 组件计数VO -@Data -@ApiModel("组件计数信息") -public class ComponentCountVO { - @ApiModelProperty("组件名称") - private String componentName; - - @ApiModelProperty("组件数量") - private Long count; -} \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java b/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java deleted file mode 100644 index cd9e6c9..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.solution.rule.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel("平台组件名称聚合") -public class PlatformComponentNamesVO { - @ApiModelProperty("平台名称") - private String platformName; - - @ApiModelProperty("该平台下的组件名称列表(去重)") - private List componentNames; -} \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java b/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java deleted file mode 100644 index f602600..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.solution.rule.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -// 平台武器聚合VO -@Data -@ApiModel("平台武器聚合信息") -public class PlatformWeaponAggregateVO { - @ApiModelProperty("平台名称") - private String platformName; - - @ApiModelProperty("该平台下的组件列表") - private List components; -} \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java b/solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java deleted file mode 100644 index 8388741..0000000 --- a/solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.solution.rule.domain.vo; - -import com.solution.rule.domain.dto.WeaponModelDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -public class WeaponModelVO { - - @ApiModelProperty("平台名称") - private String platformName; - - @ApiModelProperty("组件名称") - private String componentName; - - @ApiModelProperty("组件数量") - private Long count; - -} diff --git a/solution-rule/src/main/java/com/solution/rule/enums/SceneType.java b/solution-rule/src/main/java/com/solution/rule/enums/SceneType.java deleted file mode 100644 index 142a69f..0000000 --- a/solution-rule/src/main/java/com/solution/rule/enums/SceneType.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.solution.rule.enums; - -public enum SceneType { - - DEFENSE(0, "防御"), - AIRBORNE(1, "空降"); - - private final int code; - private final String description; - - SceneType(int code, String description) { - this.code = code; - this.description = description; - } - - public int getCode() { - return code; - } - - public String getDescription() { - return description; - } - - - /** - * 根据数字编码获取对应的枚举 - * @param code 前端传递的数字 - * @return 枚举实例 - * @throws IllegalArgumentException 如果找不到对应枚举 - */ - public static SceneType fromCode(int code) { - for (SceneType type : values()) { - if (type.code == code) { - return type; - } - } - throw new IllegalArgumentException("未知的场景类型编码: " + code); - } -} \ No newline at end of file diff --git a/solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java deleted file mode 100644 index 9d5c2e3..0000000 --- a/solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.solution.rule.handler; - -import cn.hutool.core.util.ObjectUtil; -import com.solution.rule.domain.RuleParam; - -/** - * 规则链抽象类 - */ -public abstract class AbstractRuleChainHandler { - - - private AbstractRuleChainHandler nextHandler; - - - /** - * 执行过滤方法 - * @param ruleParam - * @return - */ - public abstract RuleParam doHandler(RuleParam ruleParam); - - - /** - * 执行下一个处理器 - * @param ruleParam - * @return - */ - public RuleParam doNextHandler(RuleParam ruleParam){ - if(ObjectUtil.isEmpty(nextHandler) || ObjectUtil.isNotEmpty(ruleParam)){ - return ruleParam; - } - return nextHandler.doHandler(ruleParam); - } - - /** - * 设置下游handler - * @param nextHandler - */ - public void setNextHandler(AbstractRuleChainHandler nextHandler) { - this.nextHandler = nextHandler; - } - -} diff --git a/solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java deleted file mode 100644 index 42a5d33..0000000 --- a/solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.solution.rule.handler; - - -import cn.hutool.core.collection.CollUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.rule.domain.RuleParam; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.List; - -/** - * 封装规则处理链 - */ -@Component -public class RuleChainHandler { - - @Resource - private List chainHandlers; - - private AbstractRuleChainHandler firstHandler; - - /** - * 组装处理链 - */ - @PostConstruct - private void constructChain(){ - if (CollUtil.isEmpty(chainHandlers)) { - throw new RuntimeException(ExceptionConstants.NOT_FOUND_CARRIAGE_CHAIN_HANDLER); - } - this.firstHandler = chainHandlers.get(0); - for (int i = 0; i < chainHandlers.size(); i++) { - if(i == (chainHandlers.size() - 1)){ - chainHandlers.get(i).setNextHandler(null); - }else { - chainHandlers.get(i).setNextHandler(chainHandlers.get(i + 1)); - } - } - - } - - public RuleParam findRuleParam(RuleParam ruleParam){ - return firstHandler.doHandler(ruleParam); - } - -} diff --git a/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java deleted file mode 100644 index 7896673..0000000 --- a/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.solution.rule.handler; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.common.constant.PlatformAndModuleConstants; -import com.solution.rule.domain.PlatformComponent; -import com.solution.rule.domain.RuleParam; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 战斗机处理链 - */ -@Component -public class WarplaneHandler extends AbstractRuleChainHandler{ - - @Override - public RuleParam doHandler(RuleParam ruleParam) { - if(ObjectUtil.isEmpty(ruleParam) || ObjectUtil.isEmpty(ruleParam.getWeaponModelDTO())){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - WeaponModelDTO weaponModelDTO = ruleParam.getWeaponModelDTO(); - List platformComponents = weaponModelDTO.getComponents().stream() - .filter(component -> PlatformAndModuleConstants.F22.equals(component.getName())) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(platformComponents)) { - throw new RuntimeException(ExceptionConstants.NOT_FOUND_F22_COMPONENT); - } - return null; - } -} diff --git a/solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java b/solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java deleted file mode 100644 index 903bf51..0000000 --- a/solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.solution.rule.mapper; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ModelDetailMapper { - - -} diff --git a/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java b/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java deleted file mode 100644 index 2208c46..0000000 --- a/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.solution.rule.mapper; - -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface RuleMapper { - - /** - * 获取所有武器平台和组件 - * @return - */ - List getWeapon(); - - List getPlatformComponentNames(); -} diff --git a/solution-rule/src/main/java/com/solution/rule/service/RuleService.java b/solution-rule/src/main/java/com/solution/rule/service/RuleService.java deleted file mode 100644 index 694da7d..0000000 --- a/solution-rule/src/main/java/com/solution/rule/service/RuleService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.solution.rule.service; - -import com.solution.rule.domain.dto.RequestDTO; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.PlatformComponentNamesVO; -import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; -import com.solution.rule.domain.vo.WeaponModelVO; - -import java.util.HashMap; -import java.util.List; - -public interface RuleService { - - /** - * 开始执行规则匹配 - * @param sceneType - * @param weaponModelDTO - * @return - */ - WeaponModelVO execute(Integer sceneType, WeaponModelDTO weaponModelDTO); - - List getWeapon(); - - /** - * 获取所有武器平台和组件 - * @return - */ - List getPlatformComponentNames(); -} diff --git a/solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java b/solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java deleted file mode 100644 index 1dd9545..0000000 --- a/solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.solution.rule.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.ComponentCountVO; -import com.solution.rule.domain.vo.PlatformComponentNamesVO; -import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; -import com.solution.rule.domain.vo.WeaponModelVO; -import com.solution.rule.mapper.RuleMapper; -import com.solution.rule.service.RuleService; -import com.solution.rule.strategy.SceneStrategy; -import com.solution.rule.strategy.SceneStrategyFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -public class RuleServiceImpl implements RuleService { - - @Autowired - private SceneStrategyFactory strategyFactory; - - @Autowired - private RuleMapper ruleMapper; - - @Override - public WeaponModelVO execute(Integer sceneType, WeaponModelDTO weaponModelDTO) { - if(ObjectUtil.isNull(sceneType) || ObjectUtil.isEmpty(weaponModelDTO)){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - //TODO 查数据库获取我方装备 - List weapon = this.getWeapon(); - - SceneStrategy strategy = strategyFactory.getStrategy(sceneType); - WeaponModelVO result = strategy.execute(weaponModelDTO); - if(ObjectUtil.isEmpty(result)){ - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - return result; - } - - - - @Override - public List getWeapon() { - List flatList = ruleMapper.getWeapon(); - if (CollUtil.isEmpty(flatList)) { - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - - Map> groupByPlatform = flatList.stream() - .collect(Collectors.groupingBy(WeaponModelVO::getPlatformName)); - - List result = new ArrayList<>(); - for (Map.Entry> entry : groupByPlatform.entrySet()) { - PlatformWeaponAggregateVO platformVO = new PlatformWeaponAggregateVO(); - platformVO.setPlatformName(entry.getKey()); - - List components = entry.getValue().stream() - .map(item -> { - ComponentCountVO comp = new ComponentCountVO(); - comp.setComponentName(item.getComponentName()); - comp.setCount(item.getCount()); - return comp; - }) - .collect(Collectors.toList()); - platformVO.setComponents(components); - - result.add(platformVO); - } - - return result; - } - - - /** - * 获取所有武器平台和组件 - * @return - */ - @Override - public List getPlatformComponentNames() { - List flatList = ruleMapper.getPlatformComponentNames(); - if (CollUtil.isEmpty(flatList)) { - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - - - Map> groupByPlatform = flatList.stream() - .collect(Collectors.groupingBy( - WeaponModelVO::getPlatformName, - Collectors.mapping(WeaponModelVO::getComponentName, Collectors.toList()) - )); - - return groupByPlatform.entrySet().stream() - .map(entry -> { - PlatformComponentNamesVO vo = new PlatformComponentNamesVO(); - vo.setPlatformName(entry.getKey()); - vo.setComponentNames(entry.getValue()); - return vo; - }) - .collect(Collectors.toList()); - } -} diff --git a/solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java b/solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java deleted file mode 100644 index 6540140..0000000 --- a/solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.solution.rule.strategy; - -import cn.hutool.core.util.ObjectUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.rule.domain.RuleParam; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import com.solution.rule.enums.SceneType; -import com.solution.rule.handler.RuleChainHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - - -@Component -public class AirborneStrategy implements SceneStrategy{ - - - @Autowired - private RuleChainHandler ruleChainHandler; - /** - * 空降场景处理 - * @param weaponModelDTO - * @return - */ - @Override - public WeaponModelVO execute(WeaponModelDTO weaponModelDTO) { - if(ObjectUtil.isEmpty(weaponModelDTO)){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - RuleParam ruleParam = new RuleParam(); - ruleParam.setWeaponModelDTO(weaponModelDTO); - ruleParam = ruleChainHandler.findRuleParam(ruleParam); - if(ObjectUtil.isEmpty(ruleParam.getWeaponModelVO())){ - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - return ruleParam.getWeaponModelVO(); - } - - @Override - public SceneType getSceneType() { - return SceneType.AIRBORNE; - } -} diff --git a/solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java b/solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java deleted file mode 100644 index e063702..0000000 --- a/solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.solution.rule.strategy; - -import cn.hutool.core.util.ObjectUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.rule.domain.RuleParam; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import com.solution.rule.enums.SceneType; -import com.solution.rule.handler.RuleChainHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class DefenseStrategy implements SceneStrategy{ - - - @Autowired - private RuleChainHandler ruleChainHandler; - /** - * 防御场景处理 - * @param weaponModelDTO - * @return - */ - @Override - public WeaponModelVO execute(WeaponModelDTO weaponModelDTO) { - if(ObjectUtil.isEmpty(weaponModelDTO)){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - RuleParam ruleParam = new RuleParam(); - ruleParam.setWeaponModelDTO(weaponModelDTO); - ruleParam = ruleChainHandler.findRuleParam(ruleParam); - if(ObjectUtil.isEmpty(ruleParam.getWeaponModelVO())){ - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - return ruleParam.getWeaponModelVO(); - } - - @Override - public SceneType getSceneType() { - return SceneType.DEFENSE; - } -} diff --git a/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java b/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java deleted file mode 100644 index 1e30b37..0000000 --- a/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.solution.rule.strategy; - -import com.solution.rule.domain.dto.RequestDTO; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.WeaponModelVO; -import com.solution.rule.enums.SceneType; - -import java.util.HashMap; - -public interface SceneStrategy { - - WeaponModelVO execute(WeaponModelDTO weaponModelDTO); - - SceneType getSceneType(); -} diff --git a/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java b/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java deleted file mode 100644 index beb935a..0000000 --- a/solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.solution.rule.strategy; - -import com.solution.rule.enums.SceneType; -import com.solution.rule.strategy.SceneStrategy; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; - -@Component -public class SceneStrategyFactory { - - @Autowired - private List strategyList; - - private final Map strategyMap = new EnumMap<>(SceneType.class); - - @PostConstruct - public void init() { - for (SceneStrategy strategy : strategyList) { - SceneType type = strategy.getSceneType(); - if (strategyMap.containsKey(type)) { - throw new IllegalStateException("重复的场景类型: " + type); - } - strategyMap.put(type, strategy); - } - } - - /** - * 根据前端传递的数字编码获取对应的策略 - * @param code 前端传递的数字 - * @return 策略实现 - * @throws IllegalArgumentException 如果编码无效或策略未注册 - */ - public SceneStrategy getStrategy(int code) { - SceneType type = SceneType.fromCode(code); - SceneStrategy strategy = strategyMap.get(type); - if (strategy == null) { - throw new IllegalArgumentException("未找到编码 " + code + " 对应的策略实现"); - } - return strategy; - } -} \ No newline at end of file diff --git a/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml b/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml deleted file mode 100644 index 38d7dc5..0000000 --- a/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file From d9a55d0c95cfc9c9a9990b58d3ee5479318dc58b Mon Sep 17 00:00:00 2001 From: MHW Date: Sat, 14 Mar 2026 11:17:55 +0800 Subject: [PATCH 3/4] =?UTF-8?q?26-03-14-11=EF=BC=9A17=EF=BC=9A=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E6=A0=91-=E4=BF=9D=E5=AD=98=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behaviour/BehaviortreeController.java | 13 ++++ .../web/controller/rule/RuleController.java | 1 - .../web/core/BehaviortreeProcessor.java | 1 + .../solution/system/domain/AfsimScenario.java | 64 +++++++++++++++++++ .../system/mapper/BehaviortreeMapper.java | 9 +++ .../system/service/IBehaviortreeService.java | 9 +++ .../service/impl/BehaviortreeServiceImpl.java | 17 +++++ .../mapper/system/BehaviortreeMapper.xml | 5 ++ .../common/constant/ExceptionConstants.java | 2 + 9 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 auto-solution-behaviour/src/main/java/com/solution/system/domain/AfsimScenario.java diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java index 9f3f2a8..2cef53c 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/behaviour/BehaviortreeController.java @@ -3,6 +3,7 @@ package com.solution.web.controller.behaviour; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.solution.system.domain.AfsimScenario; import com.solution.web.core.BehaviortreeProcessor; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -114,4 +115,16 @@ public class BehaviortreeController extends BaseController { return toAjax(behaviortreeService.deleteBehaviortreeByIds(ids)); } + + + /** + * 保存场景配置 + */ + @ApiOperation("保存场景配置") + @PostMapping("/saveSceneConfig") + @Log(title = "行为树主", businessType = BusinessType.INSERT) + public AjaxResult saveSceneConfig(@RequestBody AfsimScenario afsimScenario) + { + return toAjax(behaviortreeService.insert(afsimScenario)); + } } diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java index 93aebf4..c662afa 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java @@ -52,5 +52,4 @@ public class RuleController extends BaseController { public AjaxResult getCommPlatformComponentNames(Integer scenarioId){ return success(ruleService.getCommPlatformComponentNames(scenarioId)); } - } diff --git a/auto-solution-admin/src/main/java/com/solution/web/core/BehaviortreeProcessor.java b/auto-solution-admin/src/main/java/com/solution/web/core/BehaviortreeProcessor.java index b857905..1f3017c 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/core/BehaviortreeProcessor.java +++ b/auto-solution-admin/src/main/java/com/solution/web/core/BehaviortreeProcessor.java @@ -157,4 +157,5 @@ public class BehaviortreeProcessor { return instance; } + } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/domain/AfsimScenario.java b/auto-solution-behaviour/src/main/java/com/solution/system/domain/AfsimScenario.java new file mode 100644 index 0000000..b44dc08 --- /dev/null +++ b/auto-solution-behaviour/src/main/java/com/solution/system/domain/AfsimScenario.java @@ -0,0 +1,64 @@ +package com.solution.system.domain; + +/** + * 场景配置表 + * 对应表 afsim_scenario + */ +public class AfsimScenario { + private Integer id; + private String name; + private String description; + private String scenarioPath; + private String communicationGraph; // 用于存储场景中的通讯关系 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getScenarioPath() { + return scenarioPath; + } + + public void setScenarioPath(String scenarioPath) { + this.scenarioPath = scenarioPath; + } + + public String getCommunicationGraph() { + return communicationGraph; + } + + public void setCommunicationGraph(String communicationGraph) { + this.communicationGraph = communicationGraph; + } + + @Override + public String toString() { + return "AfsimScenario{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", scenarioPath='" + scenarioPath + '\'' + + ", communicationGraph='" + communicationGraph + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/mapper/BehaviortreeMapper.java b/auto-solution-behaviour/src/main/java/com/solution/system/mapper/BehaviortreeMapper.java index 95defef..6609ca1 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/mapper/BehaviortreeMapper.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/mapper/BehaviortreeMapper.java @@ -1,6 +1,8 @@ package com.solution.system.mapper; import java.util.List; + +import com.solution.system.domain.AfsimScenario; import com.solution.system.domain.Behaviortree; /** @@ -58,4 +60,11 @@ public interface BehaviortreeMapper * @return 结果 */ public int deleteBehaviortreeByIds(Long[] ids); + + /** + * 保存场景配置 + * @param afsimScenario + * @return + */ + int insert(AfsimScenario afsimScenario); } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java b/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java index fb94314..c6958da 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/service/IBehaviortreeService.java @@ -1,6 +1,8 @@ package com.solution.system.service; import java.util.List; + +import com.solution.system.domain.AfsimScenario; import com.solution.system.domain.Behaviortree; /** @@ -58,4 +60,11 @@ public interface IBehaviortreeService * @return 结果 */ public int deleteBehaviortreeById(Long id); + + /** + * 保存场景配置 + * @param afsimScenario + * @return + */ + int insert(AfsimScenario afsimScenario); } diff --git a/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java b/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java index 307bb3a..dc2705c 100644 --- a/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java +++ b/auto-solution-behaviour/src/main/java/com/solution/system/service/impl/BehaviortreeServiceImpl.java @@ -1,6 +1,10 @@ package com.solution.system.service.impl; import java.util.List; + +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.system.domain.AfsimScenario; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.solution.system.mapper.BehaviortreeMapper; @@ -90,4 +94,17 @@ public class BehaviortreeServiceImpl implements IBehaviortreeService { return behaviortreeMapper.deleteBehaviortreeById(id); } + + /** + * 保存场景配置 + * @param afsimScenario + * @return + */ + @Override + public int insert(AfsimScenario afsimScenario) { + if(ObjectUtil.isEmpty(afsimScenario) || ObjectUtil.isEmpty(afsimScenario.getCommunicationGraph())){ + throw new RuntimeException(ExceptionConstants.SCENE_CONFIG_NOT_NULL); + } + return behaviortreeMapper.insert(afsimScenario); + } } diff --git a/auto-solution-behaviour/src/main/resources/mapper/system/BehaviortreeMapper.xml b/auto-solution-behaviour/src/main/resources/mapper/system/BehaviortreeMapper.xml index 54c7b3b..260da7b 100644 --- a/auto-solution-behaviour/src/main/resources/mapper/system/BehaviortreeMapper.xml +++ b/auto-solution-behaviour/src/main/resources/mapper/system/BehaviortreeMapper.xml @@ -55,6 +55,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + INSERT INTO afsim_scenario (name, description, scenario_path, communication_graph) + VALUES (#{name}, #{description}, #{scenarioPath}, #{communicationGraph}) + + update behaviortree diff --git a/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java b/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java index 56add30..7299a1e 100644 --- a/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java +++ b/auto-solution-common/src/main/java/com/solution/common/constant/ExceptionConstants.java @@ -13,4 +13,6 @@ public class ExceptionConstants { public static final String NOT_FOUND_F22_COMPONENT = "未找到 F-22 组件"; + public static final String SCENE_CONFIG_NOT_NULL = "场景配置不能为空"; + } From c1c67e826b2cf35c981b615d6abb33e5557bc149 Mon Sep 17 00:00:00 2001 From: MHW Date: Sat, 14 Mar 2026 14:30:52 +0800 Subject: [PATCH 4/4] =?UTF-8?q?26-03-14-14:30=20=E8=A7=84=E5=88=99CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/rule/FireRuleController.java | 55 ++++++ .../web/controller/rule/RuleController.java | 80 +++++---- ...lgorithmMapper.xml => FireRuleService.xml} | 0 ...meterdefMapper.xml => FireRuleService.xml} | 0 ...GenTableMapper.xml => FireRuleService.xml} | 0 .../java/com/solution/rule/domain/Rule.java | 37 +++++ .../solution/rule/mapper/FireRuleMapper.java | 35 ++++ .../com/solution/rule/mapper/RuleMapper.java | 42 ++--- ...{RuleService.java => FireRuleService.java} | 6 +- .../solution/rule/service/IRuleService.java | 36 ++++ .../service/impl/FireRuleServiceImpl.java | 156 ++++++++++++++++++ .../rule/service/impl/RuleServiceImpl.java | 150 +++-------------- .../resources/mapper/rule/FireRuleService.xml | 66 ++++++++ .../main/resources/mapper/rule/RuleMapper.xml | 133 +++++++++------ 14 files changed, 556 insertions(+), 240 deletions(-) create mode 100644 auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java rename auto-solution-algo/src/main/resources/mapper/algo/{AlgorithmMapper.xml => FireRuleService.xml} (100%) rename auto-solution-behaviour/src/main/resources/mapper/system/{TemplateparameterdefMapper.xml => FireRuleService.xml} (100%) rename auto-solution-generator/src/main/resources/mapper/generator/{GenTableMapper.xml => FireRuleService.xml} (100%) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/domain/Rule.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/mapper/FireRuleMapper.java rename auto-solution-rule/src/main/java/com/solution/rule/service/{RuleService.java => FireRuleService.java} (79%) create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/IRuleService.java create mode 100644 auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java create mode 100644 auto-solution-rule/src/main/resources/mapper/rule/FireRuleService.xml 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 new file mode 100644 index 0000000..9ab473c --- /dev/null +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/FireRuleController.java @@ -0,0 +1,55 @@ +package com.solution.web.controller.rule; + +import com.solution.common.core.controller.BaseController; +import com.solution.common.core.domain.AjaxResult; +import com.solution.rule.domain.FireRuleExecuteDTO; +import com.solution.rule.service.FireRuleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + + +@Api("火力规则") +@RestController +@RequestMapping("/api/system/firerule") +public class FireRuleController extends BaseController { + + + @Autowired + private FireRuleService ruleService; + + + /** + * 开始执行规则匹配 + * @param fireRuleExecuteDTO 敌方参数 + * @return + */ + @PostMapping("/start") + @ApiOperation("开始执行规则匹配") + public AjaxResult execute(@RequestBody FireRuleExecuteDTO fireRuleExecuteDTO){ + return success(ruleService.execute(fireRuleExecuteDTO)); + } + + /** + * 获取所有武器平台和组件 + * @return + */ + @GetMapping("/weapon") + @ApiOperation("获取所有武器平台和组件") + public AjaxResult getPlatformComponentNames(){ + return success(ruleService.getPlatformComponentNames()); + } + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + @GetMapping("/comm") + @ApiOperation("获取通信组件的所有平台和组件") + public AjaxResult getCommPlatformComponentNames(Integer scenarioId){ + return success(ruleService.getCommPlatformComponentNames(scenarioId)); + } +} diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java index c662afa..a7ef814 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java @@ -1,55 +1,65 @@ package com.solution.web.controller.rule; +import com.solution.common.annotation.Log; import com.solution.common.core.controller.BaseController; import com.solution.common.core.domain.AjaxResult; -import com.solution.rule.domain.FireRuleExecuteDTO; -import com.solution.rule.service.RuleService; +import com.solution.common.core.page.TableDataInfo; +import com.solution.common.enums.BusinessType; +import com.solution.rule.domain.Rule; +import com.solution.rule.service.IRuleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.util.List; - -@Api("火力规则") +@Api("红蓝对抗规则管理") @RestController -@RequestMapping("/api/system/firerule") +@RequestMapping("/api/system/rule") public class RuleController extends BaseController { - @Autowired - private RuleService ruleService; + private IRuleService ruleService; - - /** - * 开始执行规则匹配 - * @param fireRuleExecuteDTO 敌方参数 - * @return - */ - @PostMapping("/start") - @ApiOperation("开始执行规则匹配") - public AjaxResult execute(@RequestBody FireRuleExecuteDTO fireRuleExecuteDTO){ - return success(ruleService.execute(fireRuleExecuteDTO)); + @PreAuthorize("@ss.hasPermi('system:rule:list')") + @GetMapping("/list") + @ApiOperation("查询规则列表") + public TableDataInfo list(Rule rule) { + startPage(); + List list = ruleService.selectRuleList(rule); + return getDataTable(list); } - /** - * 获取所有武器平台和组件 - * @return - */ - @GetMapping("/weapon") - @ApiOperation("获取所有武器平台和组件") - public AjaxResult getPlatformComponentNames(){ - return success(ruleService.getPlatformComponentNames()); + @PreAuthorize("@ss.hasPermi('system:rule:query')") + @GetMapping("/{id}") + @ApiOperation("获取规则详情") + public AjaxResult getInfo(@PathVariable Integer id) { + return success(ruleService.selectRuleById(id)); } - /** - * 获取通信组件的所有平台和组件 - * @param scenarioId - * @return - */ - @GetMapping("/comm") - @ApiOperation("获取通信组件的所有平台和组件") - public AjaxResult getCommPlatformComponentNames(Integer scenarioId){ - return success(ruleService.getCommPlatformComponentNames(scenarioId)); + @PreAuthorize("@ss.hasPermi('system:rule:add')") + @Log(title = "规则管理", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("新增规则") + public AjaxResult add(@RequestBody Rule rule) { + return toAjax(ruleService.insertRule(rule)); } -} + + @PreAuthorize("@ss.hasPermi('system:rule:edit')") + @Log(title = "规则管理", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改规则") + public AjaxResult edit(@RequestBody Rule rule) { + return toAjax(ruleService.updateRule(rule)); + } + + @PreAuthorize("@ss.hasPermi('system:rule:remove')") + @Log(title = "规则管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @ApiOperation("删除规则") + public AjaxResult remove(@PathVariable Integer[] ids) { + return toAjax(ruleService.deleteRuleByIds(ids)); + } +} \ No newline at end of file diff --git a/auto-solution-algo/src/main/resources/mapper/algo/AlgorithmMapper.xml b/auto-solution-algo/src/main/resources/mapper/algo/FireRuleService.xml similarity index 100% rename from auto-solution-algo/src/main/resources/mapper/algo/AlgorithmMapper.xml rename to auto-solution-algo/src/main/resources/mapper/algo/FireRuleService.xml diff --git a/auto-solution-behaviour/src/main/resources/mapper/system/TemplateparameterdefMapper.xml b/auto-solution-behaviour/src/main/resources/mapper/system/FireRuleService.xml similarity index 100% rename from auto-solution-behaviour/src/main/resources/mapper/system/TemplateparameterdefMapper.xml rename to auto-solution-behaviour/src/main/resources/mapper/system/FireRuleService.xml diff --git a/auto-solution-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/auto-solution-generator/src/main/resources/mapper/generator/FireRuleService.xml similarity index 100% rename from auto-solution-generator/src/main/resources/mapper/generator/GenTableMapper.xml rename to auto-solution-generator/src/main/resources/mapper/generator/FireRuleService.xml diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/Rule.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/Rule.java new file mode 100644 index 0000000..0df5018 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/Rule.java @@ -0,0 +1,37 @@ +package com.solution.rule.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.util.Date; + +@Data +@ApiModel("红蓝对抗规则") +public class Rule { + @ApiModelProperty("规则ID") + private Integer id; + + @ApiModelProperty("规则名称") + private String name; + + @ApiModelProperty("场景类型:0-防御,1-空降,null表示通用") + private Integer sceneType; + + @ApiModelProperty("触发条件(JSON格式)") + private String conditions; + + @ApiModelProperty("响应动作(JSON格式)") + private String actions; + + @ApiModelProperty("优先级(数值越小优先级越高)") + private Integer priority; + + @ApiModelProperty("是否启用(0禁用,1启用)") + private Boolean enabled; + + @ApiModelProperty("创建时间") + private Date createdTime; + + @ApiModelProperty("更新时间") + private Date updatedTime; +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/mapper/FireRuleMapper.java b/auto-solution-rule/src/main/java/com/solution/rule/mapper/FireRuleMapper.java new file mode 100644 index 0000000..12f4a74 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/mapper/FireRuleMapper.java @@ -0,0 +1,35 @@ +package com.solution.rule.mapper; + +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformComponentNamesVO; +import com.solution.rule.domain.vo.WeaponModelVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface FireRuleMapper { + + /** + * 获取所有武器平台和组件 + * @return + */ + List getWeapon(); + + List getPlatformComponentNames(); + + /** + * 获取所有组件以及数量 + * @return + */ + List getModuleAndCount(); + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + List getCommPlatformComponentNames(Integer scenarioId); + + +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java b/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java index 0f4f2ac..d540b94 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java @@ -1,34 +1,38 @@ package com.solution.rule.mapper; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.ComponentCountVO; -import com.solution.rule.domain.vo.PlatformComponentNamesVO; -import com.solution.rule.domain.vo.WeaponModelVO; -import org.apache.ibatis.annotations.Mapper; +import com.solution.rule.domain.Rule; +import org.apache.ibatis.annotations.Param; import java.util.List; -@Mapper public interface RuleMapper { + /** + * 根据ID查询规则 + */ + Rule selectRuleById(Integer id); /** - * 获取所有武器平台和组件 - * @return + * 查询规则列表(支持分页) */ - List getWeapon(); - - List getPlatformComponentNames(); + List selectRuleList(Rule rule); /** - * 获取所有组件以及数量 - * @return + * 新增规则 */ - List getModuleAndCount(); + int insertRule(Rule rule); /** - * 获取通信组件的所有平台和组件 - * @param scenarioId - * @return + * 修改规则 */ - List getCommPlatformComponentNames(Integer scenarioId); -} + int updateRule(Rule rule); + + /** + * 删除规则 + */ + int deleteRuleById(Integer id); + + /** + * 批量删除规则 + */ + int deleteRuleByIds(@Param("ids")Integer[] ids); +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java b/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java similarity index 79% rename from auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java rename to auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java index 580366f..1993655 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/RuleService.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java @@ -1,16 +1,12 @@ package com.solution.rule.service; import com.solution.rule.domain.FireRuleExecuteDTO; -import com.solution.rule.domain.dto.RequestDTO; -import com.solution.rule.domain.dto.WeaponModelDTO; import com.solution.rule.domain.vo.PlatformComponentNamesVO; import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; -import com.solution.rule.domain.vo.WeaponModelVO; -import java.util.HashMap; import java.util.List; -public interface RuleService { +public interface FireRuleService { /** * 开始执行规则匹配 diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/IRuleService.java b/auto-solution-rule/src/main/java/com/solution/rule/service/IRuleService.java new file mode 100644 index 0000000..fdd1c11 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/IRuleService.java @@ -0,0 +1,36 @@ +package com.solution.rule.service; + +import com.solution.rule.domain.Rule; +import java.util.List; + +public interface IRuleService { + /** + * 根据ID查询规则 + */ + Rule selectRuleById(Integer id); + + /** + * 查询规则列表 + */ + List selectRuleList(Rule rule); + + /** + * 新增规则 + */ + int insertRule(Rule rule); + + /** + * 修改规则 + */ + int updateRule(Rule rule); + + /** + * 删除规则 + */ + int deleteRuleById(Integer id); + + /** + * 批量删除规则 + */ + int deleteRuleByIds(Integer[] ids); +} \ 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 new file mode 100644 index 0000000..0554f36 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/FireRuleServiceImpl.java @@ -0,0 +1,156 @@ +package com.solution.rule.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.solution.common.constant.ExceptionConstants; +import com.solution.rule.domain.FireRuleExecuteDTO; +import com.solution.rule.domain.RuleParam; +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.ComponentCountVO; +import com.solution.rule.domain.vo.PlatformComponentNamesVO; +import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; +import com.solution.rule.domain.vo.WeaponModelVO; +import com.solution.rule.mapper.FireRuleMapper; +import com.solution.rule.service.FireRuleService; +import com.solution.rule.strategy.SceneStrategy; +import com.solution.rule.strategy.SceneStrategyFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class FireRuleServiceImpl implements FireRuleService { + + private static final long COMPONENT_QUANTITY_THRESHOLD = 1; + + @Autowired + private SceneStrategyFactory strategyFactory; + + @Autowired + private FireRuleMapper ruleMapper; + + /* @Override + public WeaponModelVO execute(Integer sceneType, WeaponModelDTO weaponModelDTO) { + if(ObjectUtil.isNull(sceneType) || ObjectUtil.isEmpty(weaponModelDTO)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + //TODO 查数据库获取我方装备 + List weapon = this.getWeapon(); + + SceneStrategy strategy = strategyFactory.getStrategy(sceneType); + WeaponModelVO result = strategy.execute(weaponModelDTO); + if(ObjectUtil.isEmpty(result)){ + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + return result; + }*/ + + + @Override + public List execute(FireRuleExecuteDTO fireRuleExecuteDTO) { + if(ObjectUtil.isEmpty(fireRuleExecuteDTO)){ + throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); + } + List weaponModelDTOs = fireRuleExecuteDTO.getWeaponModelDTOs(); + Integer sceneType = fireRuleExecuteDTO.getSceneType(); + // 查数据库获取我方装备 + List weapon = this.getModuleAndCount(); + + // 创建RuleParam并设置数据 + RuleParam ruleParam = new RuleParam(); + ruleParam.setWeaponModelDTOList(weaponModelDTOs); + ruleParam.setDatabaseWeapons(weapon); + + // 执行策略 + SceneStrategy strategy = strategyFactory.getStrategy(sceneType); + List result = strategy.execute(ruleParam); + + return result; + } + + @Override + public List getWeapon() { + List flatList = ruleMapper.getWeapon(); + if (CollUtil.isEmpty(flatList)) { + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + + Map> groupByPlatform = flatList.stream() + .collect(Collectors.groupingBy(WeaponModelVO::getPlatformName)); + + List result = new ArrayList<>(); + for (Map.Entry> entry : groupByPlatform.entrySet()) { + PlatformWeaponAggregateVO platformVO = new PlatformWeaponAggregateVO(); + platformVO.setPlatformName(entry.getKey()); + + List components = entry.getValue().stream() + .map(item -> { + ComponentCountVO comp = new ComponentCountVO(); + comp.setComponentName(item.getComponentName()); + comp.setCount(item.getCount()); + return comp; + }) + .collect(Collectors.toList()); + platformVO.setComponentCountVOS(components); + + result.add(platformVO); + } + + return result; + } + + + /** + * 获取所有武器平台和组件 + * @return + */ + @Override + public List getPlatformComponentNames() { + List flatList = ruleMapper.getPlatformComponentNames(); + if (CollUtil.isEmpty(flatList)) { + throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); + } + + + Map> groupByPlatform = flatList.stream() + .collect(Collectors.groupingBy( + WeaponModelVO::getPlatformName, + Collectors.mapping(WeaponModelVO::getComponentName, Collectors.toList()) + )); + + return groupByPlatform.entrySet().stream() + .map(entry -> { + PlatformComponentNamesVO vo = new PlatformComponentNamesVO(); + vo.setPlatformName(entry.getKey()); + vo.setComponentNames(entry.getValue()); + return vo; + }) + .collect(Collectors.toList()); + } + + /** + * 获取通信组件的所有平台和组件 + * @param scenarioId + * @return + */ + @Override + public List getCommPlatformComponentNames(Integer scenarioId) { + return ruleMapper.getCommPlatformComponentNames(scenarioId); + } + + /** + * 获取所有组件以及数量 + * @return + */ + private List getModuleAndCount(){ + List componentCountVOS = ruleMapper.getModuleAndCount(); + if(CollUtil.isEmpty(componentCountVOS)){ + return new ArrayList<>(); + } + return componentCountVOS; + } +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java index ab3d925..d9f7c95 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java @@ -1,156 +1,46 @@ package com.solution.rule.service.impl; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.solution.common.constant.ExceptionConstants; -import com.solution.rule.domain.FireRuleExecuteDTO; -import com.solution.rule.domain.RuleParam; -import com.solution.rule.domain.dto.WeaponModelDTO; -import com.solution.rule.domain.vo.ComponentCountVO; -import com.solution.rule.domain.vo.PlatformComponentNamesVO; -import com.solution.rule.domain.vo.PlatformWeaponAggregateVO; -import com.solution.rule.domain.vo.WeaponModelVO; +import com.solution.rule.domain.Rule; import com.solution.rule.mapper.RuleMapper; -import com.solution.rule.service.RuleService; -import com.solution.rule.strategy.SceneStrategy; -import com.solution.rule.strategy.SceneStrategyFactory; +import com.solution.rule.service.IRuleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Service -public class RuleServiceImpl implements RuleService { - - private static final long COMPONENT_QUANTITY_THRESHOLD = 1; - - @Autowired - private SceneStrategyFactory strategyFactory; +public class RuleServiceImpl implements IRuleService { @Autowired private RuleMapper ruleMapper; - /* @Override - public WeaponModelVO execute(Integer sceneType, WeaponModelDTO weaponModelDTO) { - if(ObjectUtil.isNull(sceneType) || ObjectUtil.isEmpty(weaponModelDTO)){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - //TODO 查数据库获取我方装备 - List weapon = this.getWeapon(); - - SceneStrategy strategy = strategyFactory.getStrategy(sceneType); - WeaponModelVO result = strategy.execute(weaponModelDTO); - if(ObjectUtil.isEmpty(result)){ - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - return result; - }*/ - - @Override - public List execute(FireRuleExecuteDTO fireRuleExecuteDTO) { - if(ObjectUtil.isEmpty(fireRuleExecuteDTO)){ - throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION); - } - List weaponModelDTOs = fireRuleExecuteDTO.getWeaponModelDTOs(); - Integer sceneType = fireRuleExecuteDTO.getSceneType(); - // 查数据库获取我方装备 - List weapon = this.getModuleAndCount(); - - // 创建RuleParam并设置数据 - RuleParam ruleParam = new RuleParam(); - ruleParam.setWeaponModelDTOList(weaponModelDTOs); - ruleParam.setDatabaseWeapons(weapon); - - // 执行策略 - SceneStrategy strategy = strategyFactory.getStrategy(sceneType); - List result = strategy.execute(ruleParam); - - return result; + public Rule selectRuleById(Integer id) { + return ruleMapper.selectRuleById(id); } @Override - public List getWeapon() { - List flatList = ruleMapper.getWeapon(); - if (CollUtil.isEmpty(flatList)) { - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - - Map> groupByPlatform = flatList.stream() - .collect(Collectors.groupingBy(WeaponModelVO::getPlatformName)); - - List result = new ArrayList<>(); - for (Map.Entry> entry : groupByPlatform.entrySet()) { - PlatformWeaponAggregateVO platformVO = new PlatformWeaponAggregateVO(); - platformVO.setPlatformName(entry.getKey()); - - List components = entry.getValue().stream() - .map(item -> { - ComponentCountVO comp = new ComponentCountVO(); - comp.setComponentName(item.getComponentName()); - comp.setCount(item.getCount()); - return comp; - }) - .collect(Collectors.toList()); - platformVO.setComponentCountVOS(components); - - result.add(platformVO); - } - - return result; + public List selectRuleList(Rule rule) { + return ruleMapper.selectRuleList(rule); } - - /** - * 获取所有武器平台和组件 - * @return - */ @Override - public List getPlatformComponentNames() { - List flatList = ruleMapper.getPlatformComponentNames(); - if (CollUtil.isEmpty(flatList)) { - throw new RuntimeException(ExceptionConstants.RESULT_EXCEPTION); - } - - - Map> groupByPlatform = flatList.stream() - .collect(Collectors.groupingBy( - WeaponModelVO::getPlatformName, - Collectors.mapping(WeaponModelVO::getComponentName, Collectors.toList()) - )); - - return groupByPlatform.entrySet().stream() - .map(entry -> { - PlatformComponentNamesVO vo = new PlatformComponentNamesVO(); - vo.setPlatformName(entry.getKey()); - vo.setComponentNames(entry.getValue()); - return vo; - }) - .collect(Collectors.toList()); + public int insertRule(Rule rule) { + return ruleMapper.insertRule(rule); } - /** - * 获取通信组件的所有平台和组件 - * @param scenarioId - * @return - */ @Override - public List getCommPlatformComponentNames(Integer scenarioId) { - return ruleMapper.getCommPlatformComponentNames(scenarioId); + public int updateRule(Rule rule) { + return ruleMapper.updateRule(rule); } - /** - * 获取所有组件以及数量 - * @return - */ - private List getModuleAndCount(){ - List componentCountVOS = ruleMapper.getModuleAndCount(); - if(CollUtil.isEmpty(componentCountVOS)){ - return new ArrayList<>(); - } - return componentCountVOS; + @Override + public int deleteRuleById(Integer id) { + return ruleMapper.deleteRuleById(id); } -} + + @Override + public int deleteRuleByIds(Integer[] ids) { + return ruleMapper.deleteRuleByIds(ids); + } +} \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/mapper/rule/FireRuleService.xml b/auto-solution-rule/src/main/resources/mapper/rule/FireRuleService.xml new file mode 100644 index 0000000..2a01110 --- /dev/null +++ b/auto-solution-rule/src/main/resources/mapper/rule/FireRuleService.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml b/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml index 541b652..f4e4223 100644 --- a/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml +++ b/auto-solution-rule/src/main/resources/mapper/rule/RuleMapper.xml @@ -1,66 +1,97 @@ - + - - - - - + + + + + + + + + + - - - - - - - - + + where id = #{id} - + + + + AND name like concat('%', #{name}, '%') + + + AND scene_type = #{sceneType} + + + AND enabled = #{enabled} + + + + insert into rule + + name, + scene_type, + conditions, + actions, + priority, + enabled, + created_time, + updated_time + + + #{name}, + #{sceneType}, + #{conditions}, + #{actions}, + #{priority}, + #{enabled}, + now(), + now() + + - + + update rule + + name = #{name}, + scene_type = #{sceneType}, + conditions = #{conditions}, + actions = #{actions}, + priority = #{priority}, + enabled = #{enabled}, + updated_time = now() + + where id = #{id} + - + + delete from rule where id = #{id} + + + + delete from rule where id in + + #{id} + + \ No newline at end of file