From 6fb020355bf6da36459b02d114870853158436a4 Mon Sep 17 00:00:00 2001 From: liangyun Date: Thu, 12 Mar 2026 10:16:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=8A=A8=E4=BD=9C=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modeler/src/views/decision/nodes-card.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modeler/src/views/decision/nodes-card.vue b/modeler/src/views/decision/nodes-card.vue index 332dfc3..2a677c8 100644 --- a/modeler/src/views/decision/nodes-card.vue +++ b/modeler/src/views/decision/nodes-card.vue @@ -101,10 +101,10 @@ export default defineComponent({ r.data.forEach(tpl => { if (tpl.type === 'action') { actionsTemplates.value.push(tpl); - } else if (tpl.type === 'parallel' || tpl.type === 'sequence' || tpl.type === 'precondition') { - conditionTemplates.value.push(tpl); - } else { + } else if (tpl.type === 'parallel' || tpl.type === 'sequence' || tpl.type === 'select'|| tpl.type === 'root') { controlTemplates.value.push(tpl); + } else { + conditionTemplates.value.push(tpl); } }); } From 956d3f69eadd073bad3189e69d38ab22002bd925 Mon Sep 17 00:00:00 2001 From: MHW Date: Thu, 12 Mar 2026 16:01:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=81=AB=E5=8A=9B=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=9A=E8=BF=94=E5=9B=9E=E5=B9=B3=E5=8F=B0=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= 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 | 51 ++++++++ .../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 | 7 ++ pom.xml | 8 ++ 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 ++++++ 30 files changed, 817 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 solution-rule/pom.xml create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/dto/RequestDTO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/dto/WeaponModelDTO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/ComponentCountVO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformComponentNamesVO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java create mode 100644 solution-rule/src/main/java/com/solution/rule/enums/SceneType.java create mode 100644 solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java create mode 100644 solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java create mode 100644 solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java create mode 100644 solution-rule/src/main/java/com/solution/rule/mapper/ModelDetailMapper.java create mode 100644 solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java create mode 100644 solution-rule/src/main/java/com/solution/rule/service/RuleService.java create mode 100644 solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java create mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java create mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java create mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategy.java create mode 100644 solution-rule/src/main/java/com/solution/rule/strategy/SceneStrategyFactory.java create mode 100644 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..f9a3115 --- /dev/null +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/rule/RuleController.java @@ -0,0 +1,51 @@ +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.dto.RequestDTO; +import com.solution.rule.domain.dto.WeaponModelDTO; +import com.solution.rule.domain.vo.WeaponModelVO; +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.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; + +@Api("火力规则") +@RestController +@RequestMapping("/api/system/firerule") +public class RuleController extends BaseController { + + + @Autowired + private RuleService ruleService; + + + /** + * 开始执行规则匹配 + * @param sceneType 场景参数 + * @param weaponModelDTO 敌方参数 + * @return + */ + @PostMapping("/start") + @ApiOperation("开始执行规则匹配") + public AjaxResult execute(Integer sceneType, WeaponModelDTO weaponModelDTO){ + return success(ruleService.execute(sceneType,weaponModelDTO)); + } + + /** + * 获取所有武器平台和组件 + * @return + */ + @GetMapping("/weapon") + @ApiOperation("获取所有武器平台和组件") + public AjaxResult getPlatformComponentNames(){ + return success(ruleService.getPlatformComponentNames()); + } +} 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..b92c30a --- /dev/null +++ b/auto-solution-common/src/main/java/com/solution/common/constant/PlatformAndModuleConstants.java @@ -0,0 +1,7 @@ +package com.solution.common.constant; + + +public class PlatformAndModuleConstants { + + public static final String F22 = "f22"; +} diff --git a/pom.xml b/pom.xml index 8640467..61a1632 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 + solution-rule pom diff --git a/solution-rule/pom.xml b/solution-rule/pom.xml new file mode 100644 index 0000000..33757b0 --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java b/solution-rule/src/main/java/com/solution/rule/domain/PlatformComponent.java new file mode 100644 index 0000000..dd66e3a --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java b/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java new file mode 100644 index 0000000..f437c75 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/domain/RuleParam.java @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..f2cdeeb --- /dev/null +++ b/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/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 new file mode 100644 index 0000000..1ec2fff --- /dev/null +++ b/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/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 new file mode 100644 index 0000000..9bb1f80 --- /dev/null +++ b/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/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 new file mode 100644 index 0000000..cd9e6c9 --- /dev/null +++ b/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/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 new file mode 100644 index 0000000..f602600 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/domain/vo/PlatformWeaponAggregateVO.java @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..8388741 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/domain/vo/WeaponModelVO.java @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..142a69f --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/AbstractRuleChainHandler.java new file mode 100644 index 0000000..9d5c2e3 --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/RuleChainHandler.java new file mode 100644 index 0000000..42a5d33 --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java b/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java new file mode 100644 index 0000000..7896673 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/handler/WarplaneHandler.java @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..903bf51 --- /dev/null +++ b/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/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java b/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java new file mode 100644 index 0000000..2208c46 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/mapper/RuleMapper.java @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..694da7d --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/service/RuleService.java @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..1dd9545 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/service/impl/RuleServiceImpl.java @@ -0,0 +1,109 @@ +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 new file mode 100644 index 0000000..6540140 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/strategy/AirborneStrategy.java @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..e063702 --- /dev/null +++ b/solution-rule/src/main/java/com/solution/rule/strategy/DefenseStrategy.java @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..1e30b37 --- /dev/null +++ b/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.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 new file mode 100644 index 0000000..beb935a --- /dev/null +++ b/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/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml b/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml new file mode 100644 index 0000000..38d7dc5 --- /dev/null +++ b/solution-rule/src/main/resources/mapper/rule/RuleMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file