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