163 Commits

Author SHA1 Message Date
28cd9c131b 补充类型 2026-04-16 13:46:59 +08:00
27a5dc8e02 修复节点添加和删除时的报错 2026-04-16 12:48:25 +08:00
243a42ca5c 优化场景和行为树列表项的选中状态显示 2026-04-16 11:25:10 +08:00
b56d57af44 调整行为树保存信息 2026-04-16 10:44:46 +08:00
012939829c Merge remote-tracking branch 'origin/master' 2026-04-16 10:20:03 +08:00
82027fc6aa 默认收起行为树场景列表 2026-04-16 10:19:53 +08:00
MHW
6610e06991 Merge remote-tracking branch 'origin/master' 2026-04-16 09:59:45 +08:00
MHW
40655dd557 新增行为树增加场景id字段 2026-04-16 09:59:34 +08:00
5079f17df0 更新返回按钮逻辑,添加从场景页面跳转的状态管理 2026-04-15 19:34:19 +08:00
913dea7afa 添加行为树页面的场景选择 2026-04-15 19:24:25 +08:00
6f48a06438 Merge remote-tracking branch 'origin/master' 2026-04-15 17:56:50 +08:00
6941954e14 调整行为树命令位置参数,增加位置标题样式并调整布局 2026-04-15 17:56:02 +08:00
MHW
2c834b9b2f 复制行为树区分多次复制同一行为树 2026-04-15 17:32:38 +08:00
MHW
447aef0fe3 Merge remote-tracking branch 'origin/master' 2026-04-15 17:30:39 +08:00
MHW
873e31970f Merge branch 'refs/heads/develop' 2026-04-15 17:30:30 +08:00
MHW
b39a85a074 复制行为树区分多次复制同一行为树 2026-04-15 17:30:25 +08:00
d8c3429163 Merge remote-tracking branch 'origin/master' 2026-04-15 17:22:30 +08:00
dbbc8a27c3 完善阵位分配命令的变量数据加载 2026-04-15 17:22:22 +08:00
MHW
8e96285c0a Merge remote-tracking branch 'origin/master' 2026-04-15 17:17:54 +08:00
MHW
559a550157 根据平台id获取该行为树的下属:BUG修复 2026-04-15 17:17:23 +08:00
a08e061979 更新 .gitignore 文件以排除新的缓存文件和锁定文件,类型文件项目运行时自动生成 2026-04-15 16:34:20 +08:00
8975777cd5 Merge remote-tracking branch 'origin/master' 2026-04-15 16:32:38 +08:00
MHW
f51619526a 根据平台id获取该行为树的下属:BUG修复 2026-04-15 16:28:49 +08:00
MHW
0691fddbf1 Merge remote-tracking branch 'origin/master' 2026-04-15 16:27:01 +08:00
MHW
2d60a8b90f 根据平台id获取该行为树的下属 2026-04-15 16:26:49 +08:00
e92423ee54 Merge remote-tracking branch 'origin/master' 2026-04-15 15:53:37 +08:00
99dfb6f009 为参数设置标签添加样式,限制标签宽度并处理文本溢出 2026-04-15 15:46:44 +08:00
MHW
4404d0e411 规则展示,bug修复 2026-04-15 15:30:20 +08:00
MHW
a67e3e42ba 优化规则代码,行为树的pagelist请求添加场景id与平台id条件 2026-04-15 13:54:09 +08:00
44ff489c08 调整文件结构 2026-04-15 13:42:07 +08:00
3c06e77c6d Merge remote-tracking branch 'origin/master' 2026-04-15 11:21:32 +08:00
e555c95058 修复转换数据不完整问题 2026-04-15 10:50:02 +08:00
MHW
8839c65d7f Merge remote-tracking branch 'origin/master' 2026-04-15 09:38:37 +08:00
MHW
f9eb10c783 根据场景id获取总指挥的行为树的原数据 2026-04-15 09:38:15 +08:00
949e059c8f 恢复挂载行为树请求 2026-04-14 18:08:03 +08:00
9858787570 Merge branch 'feature-transform-node-data' 2026-04-14 17:30:54 +08:00
5a8c707340 添加行为决策树管理的场景数据到节点数据的自动转换逻辑 2026-04-14 17:27:31 +08:00
e1fe2cf7da Merge remote-tracking branch 'origin/master' into feature-transform-node-data 2026-04-14 17:03:50 +08:00
MHW
3ae6a693e1 BUG修复:字段映射不上 2026-04-14 17:00:49 +08:00
MHW
178bceabbb Merge remote-tracking branch 'origin/master' 2026-04-14 16:46:10 +08:00
MHW
6969fe5744 技术要求:规则展示表格接口 2026-04-14 16:45:49 +08:00
d43effe612 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-14 16:45:10 +08:00
f66d707520 Merge remote-tracking branch 'origin/master' into feature-transform-node-data 2026-04-14 16:30:13 +08:00
MHW
e82455a220 获取场景关系 2026-04-14 15:10:24 +08:00
2b2a11831d 支持在通信节点右键菜单中挂载行为树 2026-04-14 15:09:50 +08:00
a10b16a0ff Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-14 13:35:50 +08:00
85b4a7dd2f feat: 增加通信关系图随机生成及后端数据加载功能
- 新增 data-converter.ts,实现通信记录到GraphContainer 的转换及自动布局算法
- 新增random-data-generator.ts,用于生成测试用的随机通信拓扑数据
- communication.vue中集成“随机生成”与“从后端加载”按钮及相关逻辑
- 支持多连通分量检测、层级布局计算及节点防重叠处理
2026-04-14 11:39:22 +08:00
MHW
835bb56851 Merge branch 'refs/heads/test-platform' 2026-04-14 09:34:42 +08:00
MHW
5c83b561cc 逻辑修改 2026-04-13 17:58:01 +08:00
bb45ff557b 新增根据行为树ID获取下属平台的接口 2026-04-13 17:33:28 +08:00
MHW
eff0b87da8 逻辑修改 2026-04-13 17:26:56 +08:00
254401d8f1 支持根据行为树加载下属平台并优化属性面板显示 2026-04-13 17:26:50 +08:00
d8c238a9bb Merge remote-tracking branch 'origin/master' 2026-04-13 17:15:51 +08:00
MHW
aefc2c688e 逻辑修改 2026-04-13 17:13:34 +08:00
MHW
5f1ba38c6b 逻辑修改 2026-04-13 17:10:52 +08:00
MHW
e57f0f19d5 根据场景id显示所有行为树 2026-04-13 17:02:08 +08:00
79364b951d 修复类型导入缺失及Props类型断言格式 2026-04-13 16:41:11 +08:00
1270bd7d02 Merge remote-tracking branch 'origin/master' 2026-04-13 16:40:51 +08:00
a277fe22a6 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-13 16:34:30 +08:00
MHW
b424774f3b 实体重复修改bug修复 2026-04-13 16:34:05 +08:00
MHW
766425bae5 实体重复修改 2026-04-13 16:31:56 +08:00
836e42625e Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-13 16:29:49 +08:00
MHW
0e6b6d9f45 查询行为树所属平台的下属 2026-04-13 16:16:24 +08:00
50c1cc5bf2 修复行为树复制参数传递错误 2026-04-13 15:33:46 +08:00
69c01bc62b Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-13 15:30:50 +08:00
7c71a38f68 添加前端行为树复制接口 2026-04-13 15:24:59 +08:00
bd62efca3f Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-13 15:07:15 +08:00
3946bc561a 添加行为树复制功能 2026-04-13 14:25:50 +08:00
5179ab785c Merge commit '5276a6b16fdf0e345bd0a952abc998c1bf4e3725' 2026-04-13 14:22:14 +08:00
MHW
5276a6b16f 复制行为树 2026-04-13 14:19:18 +08:00
c0da7bd0d9 画布动态尺寸 2026-04-13 12:22:30 +08:00
MHW
dafd7115a8 Merge branch 'refs/heads/develop' 2026-04-13 10:39:47 +08:00
MHW
1061020791 复制行为树 2026-04-13 10:39:37 +08:00
MHW
045117011b docker-compose 2026-04-11 13:46:02 +08:00
ee019d3c0f Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-09 16:19:08 +08:00
MHW
8a0dfb1ab8 sql改 2026-04-09 16:10:15 +08:00
MHW
08030c77c2 sql改 2026-04-09 16:06:40 +08:00
MHW
230116bdd7 sql 2026-04-09 15:40:49 +08:00
MHW
a65d296421 sql 2026-04-09 15:36:28 +08:00
MHW
78e5833514 docker 2026-04-09 15:13:10 +08:00
MHW
6add28fdfb 火力规则:装备匹配规则实现,目标规则实现,阵位规则、航迹规则【初版】 2026-04-09 10:22:53 +08:00
MHW
2fafd931cc 火力规则:装备匹配规则实现,目标规则实现,阵位规则简单实现(需要细化) 2026-04-07 17:04:13 +08:00
MHW
72f4caf555 火力规则:装备匹配规则实现 2026-04-07 14:41:46 +08:00
MHW
866fd215f2 火力规则:java静态方法实现规则 2026-04-07 11:23:27 +08:00
MHW
3e871e2dbd 火力规则:java代码层面设计 2026-04-07 10:02:31 +08:00
MHW
094dcf857d Merge remote-tracking branch 'origin/master' 2026-04-04 07:08:25 +08:00
MHW
50a369c722 火力规则:最终版json实体解析定义 2026-04-04 07:07:20 +08:00
80fa2de819 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-01 11:33:31 +08:00
libertyspy
b97f9aa32b UPDATE: VERSION-20260401 2026-04-01 11:32:53 +08:00
94b15ef412 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-04-01 09:14:06 +08:00
MHW
11e25fd0de Merge branch 'refs/heads/behaviortree-save' 2026-03-31 15:40:10 +08:00
MHW
eb57d2d228 行为树:新增行为树添加平台id 2026-03-31 15:39:58 +08:00
MHW
bcb0ca03b1 Merge remote-tracking branch 'origin/master' 2026-03-31 15:32:37 +08:00
MHW
7610076760 Merge branch 'refs/heads/develop' 2026-03-31 15:32:06 +08:00
MHW
e52aaa1680 火力规则:添加武器命中率因素 2026-03-31 15:31:50 +08:00
libertyspy
fecfb8d39c UPDATE: VERSION-20260331 2026-03-31 14:36:21 +08:00
4e28782d59 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-31 14:33:13 +08:00
libertyspy
150966824e UPDATE: VERSION-20260331 2026-03-31 14:33:09 +08:00
libertyspy
a4d9e8d8eb UPDATE: VERSION-20260331 2026-03-31 14:33:02 +08:00
libertyspy
a0d8f555f9 UPDATE: VERSION-20260331 2026-03-31 14:32:54 +08:00
615eac3bfe Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-31 11:14:44 +08:00
libertyspy
705021b391 UPDATE: VERSION-20260331 2026-03-31 11:14:29 +08:00
e24920acf1 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-31 11:11:50 +08:00
libertyspy
889cc02631 UPDATE: VERSION-20260331 2026-03-31 11:11:02 +08:00
libertyspy
cc1e003bc4 UPDATE: VERSION-20260331 2026-03-31 11:10:43 +08:00
MHW
eeed692ba6 火力规则:组件匹配修改(注释修改) 2026-03-30 16:50:38 +08:00
MHW
b3563a05d6 Merge branch 'refs/heads/develop'
# Conflicts:
#	auto-solution-rule/src/main/resources/rules/README.md
2026-03-30 16:46:49 +08:00
MHW
a7c19fb7e7 火力规则:组件匹配修改 2026-03-30 16:44:55 +08:00
MHW
36809d4033 Merge branch 'refs/heads/develop'
# Conflicts:
#	auto-solution-rule/src/main/resources/rules/README.md
2026-03-30 16:43:45 +08:00
MHW
1dba7584cd 火力规则:组件匹配修改 2026-03-30 16:43:24 +08:00
MHW
35d2766442 火力规则:规则文件注释补充 2026-03-30 11:12:19 +08:00
MHW
ce832fb16d 火力规则:代码冲突解决,readme文件补充 2026-03-27 20:37:45 +08:00
MHW
e9503358d3 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java
#	modeler/src/style.less
2026-03-27 17:58:40 +08:00
MHW
3b3370c440 Merge branch 'refs/heads/develop'
# Conflicts:
#	auto-solution-rule/src/main/java/com/solution/rule/service/FireRuleService.java
#	modeler/src/style.less
2026-03-27 17:56:55 +08:00
MHW
d8719c30c6 火力规则:装备类型规则、目标规则实现、阵位规则、航迹规则 2026-03-27 17:54:48 +08:00
MHW
9ff0e50bba 火力规则:装备类型规则、目标规则实现 2026-03-27 16:56:07 +08:00
libertyspy
2838938cfa UPDATE: VERSION-20260327 2026-03-27 14:02:18 +08:00
1c562c134c Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-27 13:29:42 +08:00
MHW
c4cc3cc30b 火力规则打击规则实现 2026-03-27 11:35:17 +08:00
libertyspy
d1f720f691 UPDATE: VERSION-20260327 2026-03-27 10:54:44 +08:00
libertyspy
cb1019b7d7 UPDATE: VERSION-20260327 2026-03-27 10:35:23 +08:00
MHW
18827cfbe7 火力规则打击规则实现 2026-03-27 10:27:04 +08:00
MHW
3fe32e4ac3 develop: 临时保存修改 2026-03-27 10:20:45 +08:00
c6c38332d9 Merge branches 'master' and 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-27 10:06:41 +08:00
libertyspy
168ced6b27 UPDATE: VERSION-20260327 2026-03-27 10:03:25 +08:00
libertyspy
499734efe8 UPDATE: VERSION-20260327 2026-03-27 10:03:16 +08:00
libertyspy
27c8fc13c6 UPDATE: VERSION-20260327 2026-03-27 10:03:07 +08:00
libertyspy
505092bcf4 UPDATE: VERSION-20260327 2026-03-27 10:02:59 +08:00
f51b27dc7c Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-27 09:33:59 +08:00
libertyspy
41ba11dc9b UPDATE: VERSION-20260327 2026-03-27 09:33:46 +08:00
a6c6cf2427 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-27 09:23:04 +08:00
libertyspy
158512cd12 UPDATE: VERSION-20260326 2026-03-27 00:08:48 +08:00
libertyspy
3a3ab0c9c6 UPDATE: VERSION-20260326 2026-03-27 00:05:50 +08:00
libertyspy
b08c74260d UPDATE: VERSION-20260326 2026-03-27 00:05:04 +08:00
libertyspy
02e9ca26a1 UPDATE: VERSION-20260326 2026-03-26 23:59:15 +08:00
373dc390fa Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-26 23:37:03 +08:00
libertyspy
8958ecd6dc UPDATE: VERSION-20260326 2026-03-26 23:36:47 +08:00
libertyspy
6656479327 UPDATE: VERSION-20260326 2026-03-26 22:05:31 +08:00
libertyspy
18ccf490e4 UPDATE: VERSION-20260326 2026-03-26 21:45:31 +08:00
2ed1129fe4 Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-20 16:06:00 +08:00
MHW
4a0602ce4e Merge branch 'refs/heads/develop' 2026-03-17 21:22:30 +08:00
MHW
8844830afc 修复lombok导致打包冲突 2026-03-17 21:21:48 +08:00
MHW
bcc450141e 保存场景关系 2026-03-17 11:08:30 +08:00
MHW
25e6ac1cbe Merge branch 'refs/heads/develop' 2026-03-17 11:07:52 +08:00
MHW
8b2f4dab89 保存场景关系 2026-03-17 11:07:35 +08:00
MHW
4f60d68c4f Merge remote-tracking branch 'origin/master' 2026-03-17 10:49:52 +08:00
MHW
b63ad360d0 新增通信关系 2026-03-17 10:49:21 +08:00
libertyspy
c724a7acf7 UPDATE: VERSION-20260317 2026-03-17 10:21:00 +08:00
libertyspy
185e490560 UPDATE: VERSION-20260317 2026-03-17 10:06:55 +08:00
ce4c23eff8 save 2026-03-17 09:19:00 +08:00
9f4ef1ab94 save 2026-03-17 09:18:50 +08:00
c800811bed Merge branch 'master' of http://101.43.238.71:3000/zouju/auto-solution 2026-03-17 09:18:05 +08:00
libertyspy
d13359c803 UPDATE: VERSION-20260317 2026-03-17 00:36:54 +08:00
libertyspy
65ea1cfd6b UPDATE: VERSION-20260317 2026-03-17 00:36:46 +08:00
libertyspy
4455d38a61 UPDATE: VERSION-20260317 2026-03-17 00:36:40 +08:00
libertyspy
6dd4392f0c UPDATE: VERSION-20260317 2026-03-17 00:36:16 +08:00
libertyspy
974f403784 UPDATE: VERSION-20260316 2026-03-16 22:43:12 +08:00
libertyspy
82bbfb83ca UPDATE: VERSION-20260316 2026-03-16 15:49:43 +08:00
libertyspy
fc7b5e6c63 Merge remote-tracking branch 'origin/master' 2026-03-16 15:48:53 +08:00
libertyspy
8dc867acb6 UPDATE: VERSION-20260316 2026-03-16 15:48:33 +08:00
libertyspy
c17197d6e5 UPDATE: VERSION-20260316 2026-03-16 15:48:23 +08:00
235fd9b6e1 更新数据格式 2026-03-16 11:57:20 +08:00
76022cf09a 修改xml 中的sql 解决,报错问题 2026-03-16 11:24:32 +08:00
225 changed files with 40649 additions and 748 deletions

9
.dockerignore Normal file
View File

@@ -0,0 +1,9 @@
**/target/
**/.git/
**/.idea/
**/*.iml
**/.vscode/
**/node_modules/
**/*.log
**/.DS_Store
**/uploadPath/

15
.env.example Normal file
View File

@@ -0,0 +1,15 @@
# 复制为 .env 后 docker compose 会自动加载
# copy .env.example .env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=autosolution_db
MYSQL_PORT=3307
REDIS_PASSWORD=123456
REDIS_PORT=6379
APP_PORT=1777
APP_IMAGE_TAG=latest
# JVM 可选
# JAVA_OPTS=-Xms512m -Xmx1024m

13
.gitignore vendored
View File

@@ -38,6 +38,10 @@ dist/
nbdist/
.nb-gradle/
######################################################################
# Docker / local secrets
.env
######################################################################
# Others
*.log
@@ -47,3 +51,12 @@ nbdist/
!*/build/*.java
!*/build/*.html
!*/build/*.xml
modeler/pnpm-lock.yaml
######################################################################
# Mock bundled cache files
**/*.bundled_*.mjs
**/__*.bundled_*.mjs
**/___*.bundled_*.mjs
modeler/types/components.d.ts
modeler/types/auto-imports.d.ts

114
DEPLOY_OFFLINE.md Normal file
View File

@@ -0,0 +1,114 @@
# Docker 离线部署说明(方式 A
执行 `docker compose up -d` 即可启动。
## 1. 交付清单
请将以下内容放在同一目录(示例:`app/`
- `docker-compose.yml`
- `.env`(或将 `.env.example` 复制为 `.env` 后修改)
- `bundle-images.tar`(包含 `auto-solution-admin``mysql:8.0``redis:7-alpine`
- `docker/mysql/init/01-ruoyi-table.sql`
- `docker/mysql/init/02-ruoyi-extra.sql`
- `docker/mysql/init/03-data.sql`
目录示例:
```text
app/
├─ docker-compose.yml
├─ .env
├─ bundle-images.tar
└─ docker/
└─ mysql/
└─ init/
├─ 00-create-db.sql
├─ 03-data.sql
```
## 2. 首次部署
`app` 目录执行:
```bash
docker load -i bundle-images.tar
docker compose down -v
docker compose up -d
```
说明:
- `down -v` 会删除旧数据卷,确保 MySQL 首次初始化时执行 `docker/mysql/init` 下的 SQL。
- SQL 执行顺序按文件名字典序,务必保持 `01 -> 02 -> 03`
## 3. 启动验证
```bash
docker ps
docker inspect autosolution-mysql --format '{{.State.Health.Status}}'
docker logs --tail 100 autosolution-mysql
docker logs --tail 100 autosolution-app
```
期望结果:
- `autosolution-mysql` 状态为 `healthy`
- `autosolution-app` 状态为 `Up`
## 4. 访问地址
- 后端默认端口:`1777`
- 访问地址:`http://<服务器IP>:1777`
## 5. 常见问题
### 5.1 `Table 'autosolution_db.sys_config' doesn't exist`
原因:初始化 SQL 未执行或执行失败。
处理:
1. 确认 `docker/mysql/init` 下 SQL 文件存在且顺序正确
2. 执行:
```bash
docker compose down -v
docker compose up -d
```
3. 查看 MySQL 日志定位 SQL 报错:
```bash
docker logs --tail 300 autosolution-mysql
```
### 5.2 `dependency failed to start: container autosolution-mysql is unhealthy`
原因MySQL 未通过健康检查(通常是 SQL 未执行完成或报错)。
处理:
```bash
docker logs --tail 300 autosolution-mysql
```
根据日志修复 SQL 后重新 `down -v` 再启动。
## 6. 版本升级
替换新的 `bundle-images.tar`(及必要 SQL后执行
```bash
docker load -i bundle-images.tar
docker compose down
docker compose up -d
```
如果本次升级包含库初始化变更并要求重建,请改用:
```bash
docker compose down -v
docker compose up -d
```

18
Dockerfile Normal file
View File

@@ -0,0 +1,18 @@
# 运行已打包的 JAR不依赖源码目录
# 要求构建上下文中存在 solution-admin.jar
# 构建docker build -t auto-solution-admin:latest .
FROM eclipse-temurin:11-jre-jammy
LABEL org.opencontainers.image.title="auto-solution-admin"
WORKDIR /app
RUN mkdir -p /app/uploadPath
COPY solution-admin.jar /app/app.jar
ENV TZ=Asia/Shanghai \
JAVA_OPTS="-Xms512m -Xmx1024m"
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar --spring.profiles.active=druid,docker"]

View File

@@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletResponse;
import com.solution.web.core.BehaviortreeProcessor;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.checkerframework.checker.units.qual.A;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -42,6 +43,12 @@ public class BehaviortreeController extends BaseController
@Autowired
private BehaviortreeProcessor behaviortreeProcessor;
@GetMapping(value = "/platform/{id}")
public AjaxResult fromPlatform(@PathVariable("id") Integer id)
{
return success(behaviortreeService.findOneByPlatformId(id));
}
/**
* 查询行为树主列表
*/
@@ -91,6 +98,19 @@ public class BehaviortreeController extends BaseController
return toAjax(behaviortreeProcessor.create(behaviortree));
}
/**
* 复制行为树
*/
@ApiOperation("复制行为树")
@PreAuthorize("@ss.hasPermi('system:behaviortree:add')")
@Log(title = "行为树主", businessType = BusinessType.INSERT)
@PostMapping("/copy")
public AjaxResult copy(@RequestBody Behaviortree behaviortree)
{
//return toAjax(behaviortreeService.copy(behaviortree));
return toAjax(behaviortreeProcessor.copy(behaviortree));
}
/**
* 修改行为树主
*/
@@ -115,4 +135,27 @@ public class BehaviortreeController extends BaseController
return toAjax(behaviortreeService.deleteBehaviortreeByIds(ids));
}
/**
* 根据平台id获取该行为树的下属
* @param platformId
* @return
*/
@ApiOperation("根据平台id获取该行为树的下属")
@PreAuthorize("@ss.hasPermi('system:behaviortree:query')")
@GetMapping("/underling/{platformId}")
public AjaxResult getUnderling(@PathVariable Integer platformId)
{
return success(behaviortreeService.getUnderling(platformId));
}
/**
* 根据场景id获取总指挥的行为树的原数据
* @return
*/
@ApiOperation("根据场景id获取总指挥的行为树的原数据")
@GetMapping("/commander/{scenarioId}")
public AjaxResult getCommander(@PathVariable Integer scenarioId){
return success(behaviortreeService.getCommander(scenarioId));
}
}

View File

@@ -0,0 +1,25 @@
package com.solution.web.controller.behaviour;
import com.solution.common.core.controller.BaseController;
import com.solution.common.core.domain.AjaxResult;
import com.solution.system.service.HbNodeCommandService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/node/command")
public class HbNodeCommandController extends BaseController {
private final HbNodeCommandService nodeCommandService;
public HbNodeCommandController(HbNodeCommandService nodeCommandService) {
this.nodeCommandService = nodeCommandService;
}
@GetMapping(value = "/all")
public AjaxResult all() {
return success(nodeCommandService.findAll());
}
}

View File

@@ -3,6 +3,8 @@ 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.domain.simplerulepojo.Task;
import com.solution.rule.domain.ultimately.dto.FireRuleInputDTO;
import com.solution.rule.service.FireRuleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -59,10 +61,20 @@ public class FireRuleController extends BaseController {
* @return
*/
@GetMapping("/platforms/{scenarioId}")
public AjaxResult platforms(@PathVariable Integer scenarioId){
public AjaxResult platformsScenarioId(@PathVariable Integer scenarioId){
return success(ruleService.findPlatformComponents(scenarioId));
}
@GetMapping("/platforms")
public AjaxResult platforms(){
return success(ruleService.findAllPlatformComponents());
}
@GetMapping("/platforms/basic")
public AjaxResult platformsBasic(){
return success(ruleService.findAllBasicPlatformComponents());
}
/**
* 根据平台id获取平台下所有组件
* @param platformId
@@ -73,4 +85,26 @@ public class FireRuleController extends BaseController {
public AjaxResult getComponents(@PathVariable Integer platformId){
return success(ruleService.getComponents(platformId));
}
/* @PostMapping("/rule")
@ApiOperation("开始执行规则匹配")
public AjaxResult execute(@RequestBody Task task){
return success(ruleService.executeTask(task));
}*/
/**
* 开始执行规则匹配
* @param task 敌方参数
* @return
*/
@PostMapping("/rule")
@ApiOperation("开始执行规则匹配")
public AjaxResult rule(@RequestBody FireRuleInputDTO task){
return success(ruleService.rule(task));
}
}

View File

@@ -6,7 +6,11 @@ import com.solution.common.core.domain.AjaxResult;
import com.solution.common.core.page.TableDataInfo;
import com.solution.common.enums.BusinessType;
import com.solution.rule.domain.Rule;
import com.solution.rule.domain.config.RuleConfig;
import com.solution.rule.domain.config.RuleConfigQuery;
import com.solution.rule.domain.config.RuleParamMeta;
import com.solution.rule.service.IRuleService;
import com.solution.rule.service.IRuleConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,12 +22,14 @@ import java.util.List;
@Api("红蓝对抗规则管理")
@RestController
@RequestMapping("/api/system/rule")
public class RuleController extends BaseController {
public class RuleController extends BaseController {
@Autowired
private IRuleService ruleService;
@Autowired
private IRuleConfigService ruleConfigService;
@PreAuthorize("@ss.hasPermi('system:rule:list')")
/*@PreAuthorize("@ss.hasPermi('system:rule:list')")
@GetMapping("/list")
@ApiOperation("查询规则列表")
public TableDataInfo list(Rule rule) {
@@ -61,5 +67,59 @@ public class RuleController extends BaseController {
@ApiOperation("删除规则")
public AjaxResult remove(@PathVariable Integer[] ids) {
return toAjax(ruleService.deleteRuleByIds(ids));
}*/
@PreAuthorize("@ss.hasPermi('system:rule:list')")
@GetMapping("/config/list")
@ApiOperation("查询规则聚合列表")
public TableDataInfo configList(RuleConfigQuery query) {
startPage();
return getDataTable(ruleConfigService.selectRuleConfigList(query));
}
@PreAuthorize("@ss.hasPermi('system:rule:query')")
@GetMapping("/config/{ruleCode}")
@ApiOperation("查询规则聚合详情")
public AjaxResult configInfo(@PathVariable String ruleCode) {
return success(ruleConfigService.selectRuleConfigByCode(ruleCode));
}
@PreAuthorize("@ss.hasPermi('system:rule:add')")
@Log(title = "规则聚合管理", businessType = BusinessType.INSERT)
@PostMapping("/config")
@ApiOperation("新增规则聚合")
public AjaxResult addConfig(@RequestBody RuleConfig ruleConfig) {
return toAjax(ruleConfigService.insertRuleConfig(ruleConfig));
}
@PreAuthorize("@ss.hasPermi('system:rule:edit')")
@Log(title = "规则聚合管理", businessType = BusinessType.UPDATE)
@PutMapping("/config")
@ApiOperation("修改规则聚合")
public AjaxResult editConfig(@RequestBody RuleConfig ruleConfig) {
return toAjax(ruleConfigService.updateRuleConfig(ruleConfig));
}
@PreAuthorize("@ss.hasPermi('system:rule:remove')")
@Log(title = "规则聚合管理", businessType = BusinessType.DELETE)
@DeleteMapping("/config/{ruleCodes}")
@ApiOperation("删除规则聚合")
public AjaxResult removeConfig(@PathVariable String[] ruleCodes) {
return toAjax(ruleConfigService.deleteRuleConfigByCodes(ruleCodes));
}
@PreAuthorize("@ss.hasPermi('system:rule:query')")
@GetMapping("/config/dict/{dictType}")
@ApiOperation("按类型查询规则字典")
public AjaxResult dict(@PathVariable String dictType) {
return success(ruleConfigService.selectDictByType(dictType));
}
@PreAuthorize("@ss.hasPermi('system:rule:query')")
@GetMapping("/config/param-meta")
@ApiOperation("查询参数元数据")
public AjaxResult paramMeta() {
List<RuleParamMeta> metas = ruleConfigService.selectParamMetaList();
return success(metas);
}
}

View File

@@ -1,4 +1,4 @@
package com.solution.scene.controller;
package com.solution.web.controller.scene;
import com.solution.common.annotation.Log;
import com.solution.common.core.controller.BaseController;
@@ -6,6 +6,7 @@ import com.solution.common.core.domain.AjaxResult;
import com.solution.common.core.page.TableDataInfo;
import com.solution.common.enums.BusinessType;
import com.solution.scene.domain.AfsimScenario;
import com.solution.scene.domain.AfsimScenarioForm;
import com.solution.scene.service.SceneService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -48,4 +49,30 @@ public class SceneController extends BaseController {
List<AfsimScenario> list = sceneService.selectSceneList();
return getDataTable(list);
}
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(sceneService.findOneById(id));
}
/**
* 根据场景id获取场景下所有行为树
*/
@GetMapping("/getAllTree/{id}")
@ApiOperation("根据场景id获取场景下所有行为树")
public AjaxResult getAllTree(@PathVariable Integer id){
return success(sceneService.getAllTree(id));
}
/**
* 根据场景id获取场景下所有关系
* @param id
* @return
*/
@GetMapping("/getAllRelation/{id}")
@ApiOperation("根据场景id获取场景下所有关系")
public AjaxResult getAllRelation(@PathVariable Integer id){
return success(sceneService.getAllRelation(id));
}
}

View File

@@ -8,8 +8,10 @@ package com.solution.web.core;
* that was distributed with this source code.
*/
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.solution.common.constant.ExceptionConstants;
import com.solution.system.domain.*;
import com.solution.system.service.IBehaviortreeService;
import com.solution.system.service.INodeconnectionService;
@@ -20,8 +22,12 @@ import com.solution.web.core.graph.GraphEdge;
import com.solution.web.core.graph.GraphNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@@ -53,6 +59,7 @@ public class BehaviortreeProcessor {
return result;
}
@Transactional(rollbackFor = Exception.class)
public int update(Behaviortree behaviortree) {
int result = behaviortreeService.updateBehaviortree(behaviortree);
@@ -71,7 +78,7 @@ public class BehaviortreeProcessor {
}
private void processGraph(Behaviortree behaviortree) {
//代码丢失 原:libertyspy 改:MHW
Graph graph = null;
try {
graph = objectMapper.readValue(behaviortree.getXmlContent(), Graph.class);
@@ -98,10 +105,17 @@ public class BehaviortreeProcessor {
instanceKeyMap.put(node.getKey(), instance);
if (node.hasParameters()) {
// 插入parameter nodeparameter
for (Templateparameterdef parameter : node.getParameters()) {
Nodeparameter nodeparameter = createNodeParameter(behaviortree, parameter, instance);
nodeparameterService.insertNodeparameter(nodeparameter);
if (node.isMultiable()) {
List<Nodeparameter> nodeparameters = createMultiableNodeparameter(behaviortree, node, instance);
for (Nodeparameter nodeparameter : nodeparameters) {
nodeparameterService.insertNodeparameter(nodeparameter);
}
} else {
// 插入parameter nodeparameter
for (Templateparameterdef parameter : node.getParameters()) {
Nodeparameter nodeparameter = createNodeParameter(behaviortree, parameter, instance);
nodeparameterService.insertNodeparameter(nodeparameter);
}
}
}
nodeKeyIndexMap.put(node.getKey(), index);
@@ -148,6 +162,47 @@ public class BehaviortreeProcessor {
return connection;
}
private List<Nodeparameter> createMultiableNodeparameter(Behaviortree behaviortree, GraphNode node,
Treenodeinstance instance) {
List<Nodeparameter> nodeparameters = new ArrayList<>();
Map<Long, List<String>> idValues = new HashMap<>();
List<String> tmpValues = null;
Map<Long, List<Templateparameterdef>> mappedValues = new HashMap<>();
List<Templateparameterdef> tmpDefs = null;
for (Templateparameterdef parameter : node.getParameters()) {
tmpDefs = mappedValues.get(parameter.getId() );
if (null == tmpDefs) {
tmpDefs = new ArrayList<>();
}
tmpDefs.add(parameter);
mappedValues.put(parameter.getId(), tmpDefs);
tmpValues = idValues.get(parameter.getId() );
if (null == tmpValues) {
tmpValues = new ArrayList<>();
}
tmpValues.add(parameter.getDefaultValue());
idValues.put(parameter.getId(), tmpValues);
}
int index = 0;
for (Long id : idValues.keySet()) {
tmpValues = idValues.get(id);
Nodeparameter nodeparameter = new Nodeparameter();
nodeparameter.setTreeId(behaviortree.getId());
nodeparameter.setNodeInstanceId(instance.getId());
nodeparameter.setParamDefId(id);
nodeparameter.setValue(StringUtils.collectionToCommaDelimitedString(tmpValues));
nodeparameter.setGroupIndex(index);
nodeparameters.add(nodeparameter);
index++;
}
return nodeparameters;
}
private Nodeparameter createNodeParameter(Behaviortree behaviortree, Templateparameterdef parameter,
Treenodeinstance instance) {
Nodeparameter nodeparameter = new Nodeparameter();
@@ -155,6 +210,7 @@ public class BehaviortreeProcessor {
nodeparameter.setNodeInstanceId(instance.getId());
nodeparameter.setParamDefId(parameter.getId());
nodeparameter.setValue(parameter.getDefaultValue());
nodeparameter.setGroupIndex(parameter.getGroupIndex());
return nodeparameter;
}
@@ -171,4 +227,44 @@ public class BehaviortreeProcessor {
}
/**
* 复制行为树
* @param behaviortree
* @return
*/
public int copy(Behaviortree behaviortree) {
if(ObjectUtil.isEmpty(behaviortree)){
throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION);
}
String name = behaviortree.getName();
String newName = name + "_" + behaviortree.getId();
String englishName = behaviortree.getEnglishName();
String newEnglishName = englishName + "_" + behaviortree.getId();
behaviortree.setEnglishName(newEnglishName);
behaviortree.setName(newName);
//不做前置判断必走数据库count
//获取行为树重复名称个数
Integer num = behaviortreeService.getCountName(newName);
if(num > 0){
// 从2开始尝试因为基础名称已经存在
int count = 2;
String finalName;
String finalEnglishName;
do {
finalName = newName + "_" + count;
finalEnglishName = newEnglishName + "_" + count;
// 检查当前生成的名称是否存在
num = behaviortreeService.getCountName(finalName);
count++;
} while(num > 0);
behaviortree.setName(finalName);
behaviortree.setEnglishName(finalEnglishName);
} else {
behaviortree.setName(newName);
behaviortree.setEnglishName(newEnglishName);
}
return this.create(behaviortree);
}
}

View File

@@ -33,6 +33,8 @@ public class GraphNode implements Serializable {
private String category;
private boolean multiable;
private List<Templateparameterdef> parameters;
private List<GraphVariable> variables;
@@ -61,6 +63,14 @@ public class GraphNode implements Serializable {
'}';
}
public boolean isMultiable() {
return multiable;
}
public void setMultiable(boolean multiable) {
this.multiable = multiable;
}
public String getCategory() {
return category;
}

View File

@@ -0,0 +1,23 @@
# Docker / docker-compose 环境:与 application.yml 的 druid 配置叠加使用
# 启动:-Dspring.profiles.active=druid,docker
spring:
devtools:
restart:
enabled: false
redis:
host: ${REDIS_HOST:redis}
port: ${REDIS_PORT:6379}
password: ${REDIS_PASSWORD:}
database: ${REDIS_DB:0}
datasource:
druid:
master:
url: jdbc:mysql://${MYSQL_HOST:mysql}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:autosolution_db}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
username: ${MYSQL_USER:root}
password: ${MYSQL_PASSWORD:root}
server:
port: ${SERVER_PORT:8080}
solution:
profile: ${SOLUTION_UPLOAD_PATH:/app/uploadPath}

View File

@@ -6,10 +6,8 @@ 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://localhost:3306/autosolution_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://127.0.0.1:3306/autosolution_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
# password: 123456
password: 1234
# 从库数据源
slave:

View File

@@ -46,7 +46,29 @@ public class Behaviortree extends BaseEntity
@Excel(name = "储存行为树的节点关系图")
private String xmlContent;
public void setId(Long id)
@Excel(name = "平台ID")
private Integer platformId;
@Excel(name = "场景ID")
private Integer scenarioId;
public Integer getScenarioId() {
return scenarioId;
}
public void setScenarioId(Integer scenarioId) {
this.scenarioId = scenarioId;
}
public Integer getPlatformId() {
return platformId;
}
public void setPlatformId(Integer platformId) {
this.platformId = platformId;
}
public void setId(Long id)
{
this.id = id;
}
@@ -118,14 +140,15 @@ public class Behaviortree extends BaseEntity
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("name", getName())
.append("description", getDescription())
.append("createdAt", getCreatedAt())
.append("updatedAt", getUpdatedAt())
.append("englishName", getEnglishName())
.append("xmlContent", getXmlContent())
.toString();
return "Behaviortree{" +
"id=" + id +
", name='" + name + '\'' +
", description='" + description + '\'' +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
", englishName='" + englishName + '\'' +
", xmlContent='" + xmlContent + '\'' +
", platformId=" + platformId +
'}';
}
}

View File

@@ -0,0 +1,55 @@
package com.solution.system.domain;
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2026 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import java.io.Serializable;
public class HbNodeCommand implements Serializable {
private Integer id;
private String command;
private String chineseName;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
public String getChineseName() {
return chineseName;
}
public void setChineseName(String chineseName) {
this.chineseName = chineseName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@@ -32,6 +32,8 @@ public class Nodeparameter extends BaseEntity
@Excel(name = "节点实例设置的具体参数值 (覆盖模板默认值)")
private String value;
private int groupIndex;
public void setId(Long id)
{
this.id = id;
@@ -80,6 +82,14 @@ public class Nodeparameter extends BaseEntity
return value;
}
public int getGroupIndex() {
return groupIndex;
}
public void setGroupIndex(int groupIndex) {
this.groupIndex = groupIndex;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@@ -42,6 +42,8 @@ public class Nodetemplate extends BaseEntity
@Excel(name = "模版类型节点模版或者条件判断例如“node”precondition“")
private String templateType;
private boolean multiable;
public Nodetemplate() {
}
@@ -53,6 +55,7 @@ public class Nodetemplate extends BaseEntity
this.description = template.description;
this.englishName = template.englishName;
this.templateType = template.templateType;
this.multiable = template.multiable;
}
public void setId(Long id)
@@ -125,6 +128,14 @@ public class Nodetemplate extends BaseEntity
return templateType;
}
public boolean isMultiable() {
return multiable;
}
public void setMultiable(boolean multiable) {
this.multiable = multiable;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@@ -0,0 +1,46 @@
package com.solution.system.domain;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 收集数据用来生成总指挥官
*/
@Data
public class PlatformChiefCommander {
/**
* Primary Key 主键ID自增
*/
private Integer id;
/**
* Create Time 创建时间
*/
private LocalDateTime createTime;
/**
* 名称
*/
private String name;
/**
* 时间
*/
private Integer time;
/**
* 指令
*/
private String command;
/**
* 下属指挥官
*/
private String subordinateCommander;
/**
* 场景ID
*/
private Integer scenarioId;
}

View File

@@ -0,0 +1,31 @@
package com.solution.system.domain;
import lombok.Data;
/**
* 平台表
*/
@Data
public class PlatformTree {
/**
* 主键
*/
private Integer id;
/**
* 平台名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 平台出现在想定上的想定id
*/
private Integer scenarioId;
}

View File

@@ -0,0 +1,34 @@
package com.solution.system.domain;
import lombok.Data;
/**
* 平台视图对象 platform
*/
@Data
public class PlatformVO
{
/** 主键 */
private Integer id;
/** 名称 */
private String name;
/** 描述 */
private String description;
/** 平台出现在想定上的想定id */
private Integer scenarioId;
/** 经度 */
private String longitude;
/** 纬度 */
private String latitude;
/** 平台类型 */
private String platformType;
/** 海拔 */
private Float altitude;
}

View File

@@ -42,6 +42,8 @@ public class Templateparameterdef extends BaseEntity
@Excel(name = "判断参数模版是节点的参数模版还是条件的参数模版")
private String templateType;
private int groupIndex;
public void setId(Long id)
{
this.id = id;
@@ -112,6 +114,14 @@ public class Templateparameterdef extends BaseEntity
return templateType;
}
public int getGroupIndex() {
return groupIndex;
}
public void setGroupIndex(int groupIndex) {
this.groupIndex = groupIndex;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@@ -3,6 +3,7 @@ package com.solution.system.mapper;
import java.util.List;
import com.solution.system.domain.Behaviortree;
import com.solution.system.domain.PlatformChiefCommander;
/**
* 行为树主Mapper接口
@@ -12,6 +13,9 @@ import com.solution.system.domain.Behaviortree;
*/
public interface BehaviortreeMapper
{
Behaviortree findOneByPlatformId(Integer platformId);
/**
* 查询行为树主
*
@@ -59,4 +63,18 @@ public interface BehaviortreeMapper
* @return 结果
*/
public int deleteBehaviortreeByIds(Long[] ids);
/**
* 根据场景id获取总指挥的行为树的原数据
* @param scenarioId
* @return
*/
List<PlatformChiefCommander> getCommander(Integer scenarioId);
/**
* 获取行为树重复名称个数
* @param newName
* @return
*/
Integer getCountName(String newName);
}

View File

@@ -0,0 +1,18 @@
package com.solution.system.mapper;
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2026 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import com.solution.system.domain.HbNodeCommand;
import java.util.List;
public interface HbNodeCommandMapper {
List<HbNodeCommand> findAll();
}

View File

@@ -0,0 +1,16 @@
package com.solution.system.mapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface PlatformCommunicationMapper {
/**
* 根据平台name获取平台下属英文名
* @param name
* @return
*/
List<String> getUnderlingBytreeId(String name);
}

View File

@@ -0,0 +1,35 @@
package com.solution.system.mapper;
import com.solution.system.domain.PlatformTree;
import com.solution.system.domain.PlatformVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface PlatformMapper {
/**
* 根据下属平台英文名获取中文名返回
* @param underlingEnglishName
* @return
*/
List<String> selectPlatformChineseName(@Param("underlingEnglishName") List<String> underlingEnglishName);
/**
* 根据平台id获取平台实体
* @param platformId
* @return
*/
PlatformTree getPlatformById(Integer platformId);
/**
* 根据平台英文名查询该平台实体
* @param underlingEnglishName
* @return
*/
List<PlatformVO> getPlatformByEnglishName(@Param("underlingEnglishName") List<String> underlingEnglishName);
}

View File

@@ -0,0 +1,18 @@
package com.solution.system.service;
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2026 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import com.solution.system.domain.HbNodeCommand;
import java.util.List;
public interface HbNodeCommandService {
List<HbNodeCommand> findAll();
}

View File

@@ -3,6 +3,8 @@ package com.solution.system.service;
import java.util.List;
import com.solution.system.domain.Behaviortree;
import com.solution.system.domain.PlatformChiefCommander;
import com.solution.system.domain.PlatformVO;
/**
* 行为树主Service接口
@@ -12,6 +14,9 @@ import com.solution.system.domain.Behaviortree;
*/
public interface IBehaviortreeService
{
Behaviortree findOneByPlatformId(Integer platformId);
/**
* 查询行为树主
*
@@ -59,4 +64,25 @@ public interface IBehaviortreeService
* @return 结果
*/
public int deleteBehaviortreeById(Long id);
/**
* 根据平台id获取该行为树的下属
* @param platformId
* @return
*/
List<PlatformVO> getUnderling(Integer platformId);
/**
* 根据场景id获取总指挥的行为树的原数据
* @param scenarioId
* @return
*/
List<PlatformChiefCommander> getCommander(Integer scenarioId);
/**
* 获取行为树重复名称个数
* @param newName
* @return
*/
Integer getCountName(String newName);
}

View File

@@ -2,8 +2,14 @@ package com.solution.system.service.impl;
import java.util.List;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.solution.common.constant.ExceptionConstants;
import com.solution.system.domain.PlatformChiefCommander;
import com.solution.system.domain.PlatformTree;
import com.solution.system.domain.PlatformVO;
import com.solution.system.mapper.PlatformCommunicationMapper;
import com.solution.system.mapper.PlatformMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.solution.system.mapper.BehaviortreeMapper;
@@ -22,6 +28,18 @@ public class BehaviortreeServiceImpl implements IBehaviortreeService
@Autowired
private BehaviortreeMapper behaviortreeMapper;
@Autowired
private PlatformCommunicationMapper platformCommunicationMapper;
@Autowired
private PlatformMapper platformMapper;
@Override
public Behaviortree findOneByPlatformId(Integer platformId)
{
return behaviortreeMapper.findOneByPlatformId(platformId);
}
/**
* 查询行为树主
*
@@ -93,4 +111,49 @@ public class BehaviortreeServiceImpl implements IBehaviortreeService
{
return behaviortreeMapper.deleteBehaviortreeById(id);
}
/**
* 根据平台id获取该行为树的下属
* @param platformId
* @return
*/
@Override
public List<PlatformVO> getUnderling(Integer platformId) {
if(null == platformId){
throw new RuntimeException(ExceptionConstants.PARAMETER_EXCEPTION);
}
//根据平台id获取平台实体
PlatformTree platform = platformMapper.getPlatformById(platformId);
//根据平台name获取平台下属英文名
List<String> underlingEnglishName = platformCommunicationMapper.getUnderlingBytreeId(platform.getName());
if(CollUtil.isEmpty(underlingEnglishName)){
throw new RuntimeException("该平台暂无下属");
}
//根据平台英文名查询该平台实体
List<PlatformVO> resultList = platformMapper.getPlatformByEnglishName(underlingEnglishName);
if(CollUtil.isEmpty(resultList)){
throw new RuntimeException("无法根据平台英文名获取平台实体");
}
return resultList;
}
/**
* 根据场景id获取总指挥的行为树的原数据
* @param scenarioId
* @return
*/
@Override
public List<PlatformChiefCommander> getCommander(Integer scenarioId) {
return behaviortreeMapper.getCommander(scenarioId);
}
/**
* 获取行为树重复名称个数
* @param newName
* @return
*/
@Override
public Integer getCountName(String newName) {
return behaviortreeMapper.getCountName(newName);
}
}

View File

@@ -0,0 +1,32 @@
package com.solution.system.service.impl;
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2026 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import com.solution.system.domain.HbNodeCommand;
import com.solution.system.mapper.HbNodeCommandMapper;
import com.solution.system.service.HbNodeCommandService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class HbNodeCommandServiceImpl implements HbNodeCommandService {
private final HbNodeCommandMapper hbNodeCommandMapper;
public HbNodeCommandServiceImpl(HbNodeCommandMapper hbNodeCommandMapper) {
this.hbNodeCommandMapper = hbNodeCommandMapper;
}
@Override
public List<HbNodeCommand> findAll() {
return hbNodeCommandMapper.findAll();
}
}

View File

@@ -5,19 +5,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.solution.system.mapper.BehaviortreeMapper">
<resultMap type="Behaviortree" id="BehaviortreeResult">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="description" column="description" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<result property="englishName" column="english_name" />
<result property="xmlContent" column="xml_content" />
<result property="id" column="id" />
<result property="name" column="name" />
<result property="description" column="description" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<result property="englishName" column="english_name"/>
<result property="xmlContent" column="xml_content" />
<result property="platformId" column="platform_id" />
<result property="scenarioId" column="scenario_id" />
</resultMap>
<select id="findOneByPlatformId" resultMap="BehaviortreeResult">
select * from behaviortree
where platform_id=#{platformId}
limit 1
</select>
<sql id="selectBehaviortreeVo">
select id, name, description, created_at, updated_at, english_name, xml_content from behaviortree
select id, name, description, created_at, updated_at, english_name, xml_content, platform_id, scenario_id from behaviortree
</sql>
<select id="selectBehaviortreeList" parameterType="Behaviortree" resultMap="BehaviortreeResult">
<include refid="selectBehaviortreeVo"/>
<where>
@@ -27,13 +36,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updatedAt != null "> and updated_at = #{updatedAt}</if>
<if test="englishName != null and englishName != ''"> and english_name like concat('%', #{englishName}, '%')</if>
<if test="xmlContent != null and xmlContent != ''"> and xml_content = #{xmlContent}</if>
<if test="xmlContent != null and xmlContent != ''"> and xml_content = #{xmlContent}</if>
<if test="platformId != null">platform_id = #{platformId}</if>
<if test="scenarioId != null">scenario_id = #{scenarioId}</if>
</where>
</select>
<select id="selectBehaviortreeById" parameterType="Long" resultMap="BehaviortreeResult">
<include refid="selectBehaviortreeVo"/>
select id, name, description, created_at, updated_at, english_name,graph, xml_content ,platform_id, scenario_id from behaviortree
where id = #{id}
</select>
<select id="getCommander" resultType="com.solution.system.domain.PlatformChiefCommander"
parameterType="java.lang.Integer">
SELECT id,
create_time AS createTime,
name,time,command,
subordinate_commander AS subordinateCommander,
scenario_id AS scenarioId
FROM platform_chief_commander
WHERE scenario_id = #{scenarioId}
</select>
<select id="getCountName" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT count(*)
FROM behaviortree
WHERE name = #{name}
</select>
<insert id="insertBehaviortree" parameterType="Behaviortree" useGeneratedKeys="true" keyProperty="id">
insert into behaviortree
@@ -44,6 +71,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updatedAt != null">updated_at,</if>
<if test="englishName != null and englishName != ''">english_name,</if>
<if test="xmlContent != null">xml_content,</if>
<if test="platformId != null">platform_id,</if>
<if test="scenarioId != null">scenario_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">#{name},</if>
@@ -52,6 +81,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updatedAt != null">#{updatedAt},</if>
<if test="englishName != null and englishName != ''">#{englishName},</if>
<if test="xmlContent != null">#{xmlContent},</if>
<if test="platformId != null">#{platformId},</if>
<if test="scenarioId != null">#{scenarioId},</if>
</trim>
</insert>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.solution.system.mapper.HbNodeCommandMapper">
<resultMap type="com.solution.system.domain.HbNodeCommand" id="HbNodeCommandMapperMap">
<result property="id" column="id"/>
<result property="command" column="command"/>
<result property="description" column="description"/>
<result property="chineseName" column="chinese_name"/>
</resultMap>
<select id="findAll" resultMap="HbNodeCommandMapperMap">
select *
from bh_node_command
</select>
</mapper>

View File

@@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="nodeInstanceId" column="node_instance_id" />
<result property="paramDefId" column="param_def_id" />
<result property="value" column="value" />
<result property="groupIndex" column="group_index" />
</resultMap>
<delete id="deleteByTreeId">
@@ -17,7 +18,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<sql id="selectNodeparameterVo">
select id, treeId, node_instance_id, param_def_id, value from nodeparameter
select id, treeId, node_instance_id, param_def_id,`value`, group_index from nodeparameter
</sql>
<select id="selectNodeparameterList" parameterType="Nodeparameter" resultMap="NodeparameterResult">
@@ -41,12 +42,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="nodeInstanceId != null">node_instance_id,</if>
<if test="paramDefId != null">param_def_id,</if>
<if test="value != null">value,</if>
group_index
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="treeId != null">#{treeId},</if>
<if test="nodeInstanceId != null">#{nodeInstanceId},</if>
<if test="paramDefId != null">#{paramDefId},</if>
<if test="value != null">#{value},</if>
#{groupIndex}
</trim>
</insert>
@@ -57,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="nodeInstanceId != null">node_instance_id = #{nodeInstanceId},</if>
<if test="paramDefId != null">param_def_id = #{paramDefId},</if>
<if test="value != null">value = #{value},</if>
group_index=#{groupIndex}
</trim>
where id = #{id}
</update>

View File

@@ -12,10 +12,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="description" column="description" />
<result property="englishName" column="english_name" />
<result property="templateType" column="templete_type" />
<result property="multiable" column="is_multiable" />
</resultMap>
<sql id="selectNodetemplateVo">
select id, type, name, logic_handler, description, english_name, templete_type from nodetemplate
select id, type, name, logic_handler, description, english_name, templete_type, is_multiable from nodetemplate
</sql>
<select id="selectNodetemplateList" parameterType="Nodetemplate" resultMap="NodetemplateResult">

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.solution.system.mapper.PlatformCommunicationMapper">
<select id="getUnderlingBytreeId" resultType="java.lang.String" parameterType="java.lang.String">
SELECT subordinate_platform
FROM platform_communication
WHERE command_platform = #{name}
</select>
</mapper>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.solution.system.mapper.PlatformMapper">
<select id="selectPlatformChineseName" resultType="java.lang.String"
parameterType="java.util.List">
SELECT description
FROM platform
WHERE name IN
<foreach item="item" collection="underlingEnglishName" open="(" separator="," close=")">
#{item}
</foreach>
</select>
<select id="getPlatformById" resultType="com.solution.system.domain.PlatformTree"
parameterType="java.lang.Integer">
SELECT id, name, description, scenario_id AS scenarioId
FROM platform
WHERE id = #{platformId}
</select>
<select id="getPlatformByEnglishName" resultType="com.solution.system.domain.PlatformVO">
SELECT id,name,description,
scenario_id AS scenarioId,
longitude,latitude,
platform_type AS platformType,
altitude
FROM platform
WHERE name IN
<foreach item="item" collection="underlingEnglishName" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>

View File

@@ -113,6 +113,12 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>

View File

@@ -6,4 +6,6 @@ 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";
public static final String RED_TANK_1 = "red_tank_1";
}

View File

@@ -16,18 +16,61 @@
rule模块
</description>
<properties>
<!-- Drools 版本,建议使用稳定版,如 7.74.1.Final 或 8.x 系列 -->
<drools.version>7.74.1.Final</drools.version>
</properties>
<dependencies>
<!-- 1. Drools 核心引擎 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- 2. KIE APIDrools 属于 KIE 项目的一部分,此依赖提供核心 API -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- 3. 规则编译器(用于编译 .drl 等规则文件) -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- 4. Spring 整合(如果需要和 Spring/Spring Boot 深度整合) -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- 流式解析工具-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.solution</groupId>
<artifactId>solution-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>

View File

@@ -0,0 +1,91 @@
package com.solution.rule.config;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.Message;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
@Configuration
public class DroolsConfig {
private static final String RULE_PATH = "classpath*:rules/**/*.drl";
private final KieServices kieServices = KieServices.Factory.get();
/**
* 加载规则文件
*/
@Bean
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(RULE_PATH);
for (Resource resource : resources) {
kieFileSystem.write(
ResourceFactory.newInputStreamResource(resource.getInputStream())
.setSourcePath("rules/" + resource.getFilename())
);
}
return kieFileSystem;
}
/**
* 构建 KieContainer
*/
@Bean
public KieContainer kieContainer(KieFileSystem kieFileSystem) {
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
// 检查错误
if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
throw new RuntimeException("Drools规则编译错误\n" +
kieBuilder.getResults().toString());
}
KieRepository repository = kieServices.getRepository();
return kieServices.newKieContainer(repository.getDefaultReleaseId());
}
/**
* KieBase
*/
@Bean
public KieBase kieBase(KieContainer kieContainer) {
return kieContainer.getKieBase();
}
/**
* KieSession推荐加
*/
@Bean
public KieSession kieSession(KieContainer kieContainer) {
return kieContainer.newKieSession();
}
/**
* 必须是 static
*/
@Bean
public static KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
}

View File

@@ -0,0 +1,33 @@
package com.solution.rule.config;
import java.util.HashMap;
import java.util.Map;
/**
* 装备匹配规则默认参数,与 {@code resources/rules/rule.drl} 中 {@code buildParam} 键保持一致。
*/
public final class FireRuleMatchDefaultParams {
private FireRuleMatchDefaultParams() {
}
public static Map<String, Object> defaults() {
Map<String, Object> param = new HashMap<>();
param.put("weight", 1);
param.put("minSelectedScore", 1);
param.put("tankScore", 1);
param.put("airScore", 2);
param.put("groundScore", 1);
param.put("missileScore", 1);
param.put("airTaskScore", 10);
param.put("bluePlatformKeywords_air", "F-16,J-10,F-35");
param.put("redPreferredWhenBlueAir", "防空,导弹,无人机,直升机,空空");
param.put("redPreferredWhenGround", "远火,榴弹,炮,火箭");
param.put("airTaskKeywords", "空中,制空,拦截,空战");
param.put("groundTaskKeywords", "地面,突击,登陆");
param.put("tankKeywords", "坦克,装甲");
param.put("missileKeywords", "导弹,火箭弹,巡航");
param.put("tieBreak", "equipmentId");
return param;
}
}

View File

@@ -0,0 +1,47 @@
package com.solution.rule.domain;
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2026 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import java.io.Serializable;
import java.util.List;
public class BasicPlatform implements Serializable {
private Integer id;
private String name;
private String description;
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;
}
}

View File

@@ -8,43 +8,12 @@ package com.solution.rule.domain;
* that was distributed with this source code.
*/
import java.io.Serializable;
import java.util.List;
public class Platform implements Serializable {
private Integer id;
private String name;
private String description;
public class Platform extends BasicPlatform {
private List<PlatformComponent> components;
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 List<PlatformComponent> getComponents() {
return components;
}
@@ -52,5 +21,4 @@ public class Platform implements Serializable {
public void setComponents(List<PlatformComponent> components) {
this.components = components;
}
}

View File

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 平台挂载的组件实体类
* 对应表 platform_component
@@ -29,4 +31,7 @@ public class PlatformComponent {
@ApiModelProperty(value = "组件数量")
private Long num;
@ApiModelProperty(value = "平台参数List<String>")
private List<String> platformParams;
}

View File

@@ -0,0 +1,61 @@
package com.solution.rule.domain.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("规则聚合对象")
public class RuleConfig {
@ApiModelProperty("主键ID")
private Long id;
@ApiModelProperty("规则编码")
private String ruleCode;
@ApiModelProperty("规则名称")
private String ruleName;
@ApiModelProperty("层级编码(task/action/platform)")
private String levelCode;
@ApiModelProperty("种类编码(select/assign/deploy/config/mode/spacetime/relation/limit)")
private String kindCode;
@ApiModelProperty("模块编码(equipment/target/position/track/group)")
private String moduleCode;
@ApiModelProperty("优先级(数字越小越先执行)")
private Integer priorityNo;
@ApiModelProperty("条件表达式")
private String conditionExpr;
@ApiModelProperty("动作表达式")
private String actionExpr;
@ApiModelProperty("版本号")
private Integer versionNo;
@ApiModelProperty("是否启用(1是0否)")
private Integer enabled;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间")
private Date createdAt;
@ApiModelProperty("更新时间")
private Date updatedAt;
@ApiModelProperty("参数列表")
private List<RuleConfigParam> params;
@ApiModelProperty("适用任务类型编码列表")
private List<String> taskTypes;
}

View File

@@ -0,0 +1,34 @@
package com.solution.rule.domain.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("规则参数对象")
public class RuleConfigParam {
@ApiModelProperty("规则编码")
private String ruleCode;
@ApiModelProperty("参数键")
private String paramKey;
@ApiModelProperty("参数值")
private String paramVal;
@ApiModelProperty("值类型(string/number/bool/json)")
private String valType;
@ApiModelProperty("参数名称")
private String paramName;
@ApiModelProperty("排序号")
private Integer sortNo;
@ApiModelProperty("是否启用(1是0否)")
private Integer enabled;
@ApiModelProperty("备注")
private String remark;
}

View File

@@ -0,0 +1,28 @@
package com.solution.rule.domain.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("规则配置查询对象")
public class RuleConfigQuery {
@ApiModelProperty("规则编码")
private String ruleCode;
@ApiModelProperty("规则名称")
private String ruleName;
@ApiModelProperty("层级编码(task/action/platform)")
private String levelCode;
@ApiModelProperty("种类编码(select/assign/deploy/config/mode/spacetime/relation/limit)")
private String kindCode;
@ApiModelProperty("模块编码(equipment/target/position/track/group)")
private String moduleCode;
@ApiModelProperty("是否启用(1是0否)")
private Integer enabled;
}

View File

@@ -0,0 +1,28 @@
package com.solution.rule.domain.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("规则字典项")
public class RuleDictItem {
@ApiModelProperty("字典类型")
private String dictType;
@ApiModelProperty("字典编码")
private String dictCode;
@ApiModelProperty("字典名称")
private String dictName;
@ApiModelProperty("排序号")
private Integer sortNo;
@ApiModelProperty("是否启用(1是0否)")
private Integer enabled;
@ApiModelProperty("备注")
private String remark;
}

View File

@@ -0,0 +1,42 @@
package com.solution.rule.domain.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("规则参数元数据")
public class RuleParamMeta {
@ApiModelProperty("参数键")
private String paramKey;
@ApiModelProperty("参数名称")
private String label;
@ApiModelProperty("值类型(bool/number/enum/csv/string)")
private String valueType;
@ApiModelProperty("是否必填")
private Boolean required;
@ApiModelProperty("枚举可选值")
private List<String> enumOptions;
@ApiModelProperty("数值最小值")
private Double min;
@ApiModelProperty("数值最大值")
private Double max;
@ApiModelProperty("格式正则")
private String pattern;
@ApiModelProperty("示例值")
private String example;
@ApiModelProperty("说明")
private String description;
}

View File

@@ -0,0 +1,18 @@
package com.solution.rule.domain.dto;
import lombok.Data;
import java.util.List;
@Data
public class ComponentJsonDTO {
//组件类型
private String type;
//组件名称
private String name;
//组件参数列表
private List<PlatformJsonDTO> parameters;
}

View File

@@ -0,0 +1,18 @@
package com.solution.rule.domain.dto;
import lombok.Data;
@Data
public class ComponentParamJsonDTO {
// 参数名称
private String name;
private String def;
// 参数值
private String value;
// 参数单位
private String unit;
}

View File

@@ -0,0 +1,21 @@
package com.solution.rule.domain.dto;
import lombok.Data;
import java.util.List;
@Data
public class PlatformJsonDTO {
// 装备ID
private String id;
// 装备名称
private String name;
// 平台类型 (Platform_type)
private String type;
// 子组件列表(武器、传感器、通信等)
private List<ComponentJsonDTO> components;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,25 @@
package com.solution.rule.domain.dto;
import lombok.Data;
import javax.sound.midi.Track;
import java.util.List;
@Data
public class TaskJsonDTO {
//任务id
private Long attackId;
//任务名称
private String name;
//任务类型
private String dataType;
//任务下的平台
private List<PlatformJsonDTO> platforms;
//任务轨迹
private List<Track> tracks;
}

View File

@@ -0,0 +1,18 @@
package com.solution.rule.domain.dto;
import lombok.Data;
import java.util.List;
@Data
public class TrackJsonDTO {
// 轨迹ID
private String id;
// 轨迹名称
private String name;
// 轨迹点列表
private List<TrackPointJsonDTO> points;
}

View File

@@ -0,0 +1,25 @@
package com.solution.rule.domain.dto;
public class TrackPointJsonDTO {
// 轨迹点索引
private int index;
// 经度
private double longitude;
// 纬度
private double latitude;
// 高度(米)
private double height;
// 速度(米/秒)
private double speed;
// 航向角(度)
private double heading;
// 时间点(秒)
private double time;
}

View File

@@ -20,4 +20,7 @@ public class WeaponModelDTO {
@ApiModelProperty("平台组件")
private List<PlatformComponent> components;
@ApiModelProperty("平台参数List<String>")
private List<String> platformParams;
}

View File

@@ -0,0 +1,52 @@
package com.solution.rule.domain.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.solution.common.utils.sign.Md5Utils;
import lombok.Data;
import java.util.List;
/**
* 单个属性的定义
*/
@Data
public class Attribute {
//uuid
@JsonProperty("_uuid")
private String uuid;
/** 属性数据类型float、int、string、bool、enum */
private String attDataType;
/** 属性定义(英文标识) */
private String attDef;
/** 属性默认值 */
private String attDefaultValue;
/** 属性详细信息 */
private Object attDetail;
/** 属性说明(中文描述) */
private String attExplain;
/** 属性ID */
private String attId;
/** 属性名称(中文) */
private String attName;
/** 属性取值范围(格式:最小值|最大值) */
private String attRange;
/** 属性单位 */
private String attUnit;
/** 是否为内置属性 */
private boolean builtIn;
/** 枚举信息 */
private String enumInfo;
/** 是否为关键属性 */
private boolean isKey;
/** 是否为公共属性 */
private boolean isPublic;
/** 是否可搜索 */
private boolean isSearch;
/** 是否为文本域 */
private boolean isTextarea;
/** 模型信息(可以是对象或数组,此处定义为具体对象) */
private List<ModelInfo> mdlInfo;
/** 是否只读0-可编辑1-只读) */
private int readOnly;
}

View File

@@ -0,0 +1,18 @@
package com.solution.rule.domain.request;
import lombok.Data;
/**
* 字典项实体
*/
@Data
public class DictItem {
/** 编码 */
private String code;
/** 说明 */
private String explain;
/** 名称 */
private String name;
/** 唯一标识符 */
private String uuid;
}

View File

@@ -0,0 +1,10 @@
package com.solution.rule.domain.request;
import lombok.Data;
@Data
public class Equipments {
}

View File

@@ -0,0 +1,16 @@
package com.solution.rule.domain.request;
import lombok.Data;
@Data
public class Force {
//对象句柄
private String ObjectHandle;
//类型
private Integer type;
}

View File

@@ -0,0 +1,26 @@
package com.solution.rule.domain.request;
import lombok.Data;
import java.util.List;
/**
* 阵营实体
*/
@Data
public class ForceSides {
//分组类型
private String groupType;
private List<Force> postures;
//对象句柄
private String ObjectHandle;
//阵营名称
private String ForceSideName;
//作战目标
private String warGoal;
}

View File

@@ -0,0 +1,35 @@
package com.solution.rule.domain.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 模型信息实体
*/
@Data
public class ModelInfo {
/** 模型ID */
@JsonProperty("_id")
private String id;
/** 类别 */
private String category;
/** 分类ID */
private String classifyId;
/** 分类名称 */
private String classifyName;
/** 创建时间(时间戳) */
private long createTime;
/** 字典项列表 */
private List<DictItem> dict;
/** 模型系统ID */
private int mxSysId;
/** 名称 */
private String name;
/** 角色ID */
private int roleId;
/** 空间ID */
private int spaceId;
/** 更新时间(时间戳) */
private long updateTime;
}

View File

@@ -0,0 +1,20 @@
package com.solution.rule.domain.request;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 引用属性对象
*/
@Data
public class RefAttributeObject {
//属性列表
private Map<String, List<Attribute>> attributes;
private TrackParam trackParam;
}

View File

@@ -0,0 +1,23 @@
package com.solution.rule.domain.request;
import lombok.Data;
import java.util.List;
/**
* 接收智唐接口实体
*/
@Data
public class RequestDTO {
//引用属性对象(设备属性定义)
private RefAttributeObject refAttributeObject;
//阵营列表
private List<ForceSides> forceSides;
//装备列表
private List<Equipments> equipments;
//private List<Tasks> tasks;
}

View File

@@ -0,0 +1,26 @@
package com.solution.rule.domain.request;
import lombok.Data;
import java.util.List;
@Data
public class Track {
//航迹名称
private String name;
//航迹开始时间
private int StartTime;
//航迹结束时间
private int EndTime;
//航迹类型
private String TrackType;
//航迹高度类型
private String HeightType;
//航迹海面类型
private String seaType;
//航迹点集合
private List<TrackPoint> TrackPoints;
//航迹所属阵营
private String Color;
//航迹总点数
private int PointCount;
}

View File

@@ -0,0 +1,13 @@
package com.solution.rule.domain.request;
import javax.sound.midi.Track;
import java.util.List;
import java.util.Map;
/**
* 航迹参数
*/
public class TrackParam {
private Map<String, List<Track>> tracks;
}

View File

@@ -0,0 +1,26 @@
package com.solution.rule.domain.request;
import lombok.Data;
/**
* 航迹节点实体
*/
@Data
public class TrackPoint {
//航迹索引
private String index;
//经度
private String longitude;
//纬度
private String latitude;
//高度
private String height;
//航速
private String speed;
//航向角
private String psia;
//时间
private String time;
//活动
private String active;
}

View File

@@ -0,0 +1,19 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
@Data
public class ComponentParam {
//唯一标识符
private String uuid;
//组件默认参数
private String attDefaultValue;
//参数单位
private String attExplain;
//组件数量
private Integer number;
}

View File

@@ -0,0 +1,18 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Coordinate {
//经度
private BigDecimal longitude;
//纬度
private BigDecimal latitude;
//高度
private Integer height;
}

View File

@@ -0,0 +1,19 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
import java.util.List;
@Data
public class SubComponents {
//设备id
private String deviceId;
//设备名称
private String deviceName;
//设备组件参数
private List<ComponentParam> componentParams;
}

View File

@@ -0,0 +1,54 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
import java.util.List;
/**
* 简单任务实体
*/
@Data
public class Task {
//任务id
private String id;
//任务名称
private String drawName;
//任务类型
private String dataType;
//任务所属阵营
private String side;
//任务威胁等级(1-3)
private String threatLevel;
//任务航迹
private List<TrackPoints> trackPoints;
//任务武器
private List<Weapon> taskWeapons;
//任务目标id
private String targetId;
//作战区经纬高
private List<Coordinate> warZoneLocation;
//防区经纬高
private List<Coordinate> defZoneLocation;
//阵型类型TRIANGLE/DIAMOND/LINE/COLUMN/WEDGE
private String formationType;
//阵型基础间距(米)
private Integer formationSpacingMeters;
//主僚标准距离(米)
private Integer mainWingDistanceMeters;
//阵型朝向0~359
private Integer formationHeadingDeg;
}

View File

@@ -0,0 +1,24 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class TrackPoints extends Coordinate{
// 轨迹索引
private Integer index;
// // 轨迹点经度
// private BigDecimal longitude;
//
// // 轨迹点纬度
// private BigDecimal latitude;
//
// // 轨迹点高度
// private Integer height;
//速度
private Integer speed;
}

View File

@@ -0,0 +1,42 @@
package com.solution.rule.domain.simplerulepojo;
import lombok.Data;
import java.util.List;
@Data
public class Weapon {
//装备id
private String equipmentId;
//装备名称
private String name;
//装备类型
private String supportType;
//装备组件
private List<SubComponents> components;
//装备部署位置(经纬高)
private Coordinate coordinate;
//武器数量
private Integer number;
//武器命中率
private Double hitRate;
//目标id
private String targetId;
//编队角色MAIN=主机WING=僚机
private String formationRole;
//僚机相对主机距离(米)
private Integer wingRelativeDistanceMeters;
//僚机相对主机方位角(度)
private Integer wingRelativeBearingDeg;
}

View File

@@ -0,0 +1,12 @@
package com.solution.rule.domain.simplerulepojo.fact;
import com.solution.rule.domain.simplerulepojo.Task;
import lombok.Data;
@Data
public class FactTask {
private Task blueTask;
private Task redTask;
}

View File

@@ -0,0 +1,32 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 装备组件参数项
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleComponentParamDTO {
/**
* 参数唯一标识
*/
private String uuid;
/**
* 属性默认值
*/
private String attDefaultValue;
/**
* 属性说明
*/
private String attExplain;
/**
* 数量
*/
private Integer number;
}

View File

@@ -0,0 +1,27 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 经纬高坐标点
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleCoordinateDTO {
/**
* 经度
*/
private Double longitude;
/**
* 纬度
*/
private Double latitude;
/**
* 高程(米)
*/
private Double height;
}

View File

@@ -0,0 +1,13 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputArithmeticRefDTO {
private String id;
private String name;
}

View File

@@ -0,0 +1,37 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 火力规则输入根文档,与 {@code 火力规则输入-无注释.json} 顶层字段对应。
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputDTO {
/**
* 来源场景文件名
*/
private String sourceFile;
/**
* 蓝方任务列表
*/
private List<FireRuleTaskInputDTO> tasks;
/**
* 红方装备等条目列表,对应 JSON 键 {@code redWeapons}(当前 {@link FireRuleInputRedWeaponElementDTO} 与装备结构一致)
*/
@JsonProperty("equipments")
private List<FireRuleInputRedWeaponElementDTO> equipments;
/**
* 阵营与姿态关系列表,对应 JSON 键 {@code ForceSides}
*/
@JsonProperty("ForceSides")
private List<FireRuleInputForceSideDTO> forceSides;
}

View File

@@ -0,0 +1,15 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputDeviceRefDTO {
private String id;
private String name;
private String refId;
}

View File

@@ -0,0 +1,19 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 阵营侧一方与其它方的姿态关系项
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputForcePostureDTO {
@JsonProperty("ObjectHandle")
private String objectHandle;
@JsonProperty("Type")
private Integer type;
}

View File

@@ -0,0 +1,26 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 阵营侧ForceSides 数组中的一项)
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputForceSideDTO {
private String groupType;
@JsonProperty("Postures")
private List<FireRuleInputForcePostureDTO> postures;
@JsonProperty("ObjectHandle")
private String objectHandle;
@JsonProperty("ForceSideName")
private String forceSideName;
}

View File

@@ -0,0 +1,17 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputLauncherConfigurationDTO {
private String classifyName;
private Integer isMount;
private FireRuleInputMountedWeaponRefDTO mountedWeapon;
private Integer number;
}

View File

@@ -0,0 +1,15 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputMountedWeaponRefDTO {
@JsonProperty("_id")
private String id;
private String name;
}

View File

@@ -0,0 +1,37 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedCommSlotDTO {
@JsonProperty("ObjectHandle")
private String objectHandle;
private FireRuleInputArithmeticRefDTO arithmetic;
private FireRuleInputDeviceRefDTO device;
private String deviceId;
private String deviceName;
private Boolean employLabel;
private String facilityName;
private String soleId;
private Map<String, Object> twiceModified;
private List<Object> zLists;
@JsonProperty("ParentPlat")
private String parentPlat;
}

View File

@@ -0,0 +1,33 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedMotorizedSlotDTO {
@JsonProperty("ObjectHandle")
private String objectHandle;
private FireRuleInputArithmeticRefDTO arithmetic;
private FireRuleInputDeviceRefDTO device;
private String deviceId;
private String deviceName;
private String soleId;
@JsonProperty("ParentPlat")
private String parentPlat;
private Map<String, Object> twiceModified;
private List<Object> zLists;
}

View File

@@ -0,0 +1,42 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedPlatformSlotDTO {
@JsonProperty("ObjectHandle")
private String objectHandle;
private FireRuleInputArithmeticRefDTO arithmetic;
private FireRuleInputDeviceRefDTO device;
private String deviceId;
private String deviceName;
private Boolean employLabel;
private String facilityName;
private String soleId;
private Map<String, Object> twiceModified;
private List<Object> zLists;
@JsonProperty("TrackParamId")
private String trackParamId;
private List<Double> positions;
@JsonProperty("ParentPlat")
private String parentPlat;
}

View File

@@ -0,0 +1,21 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedSubComponentsDTO {
private List<FireRuleInputRedCommSlotDTO> communication;
@JsonProperty("motorized_assembly")
private List<FireRuleInputRedMotorizedSlotDTO> motorizedAssembly;
private List<FireRuleInputRedPlatformSlotDTO> platform;
private List<FireRuleInputRedWeaponSlotDTO> weapon;
}

View File

@@ -0,0 +1,52 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Map;
/**
* {@code redWeapons} 中红方装备platform条目与 {@code 火力规则输入-无注释.json} 中带
* {@code SubComponents} 的装备对象字段一致。
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedWeaponElementDTO {
@JsonProperty("SupportType")
private String supportType;
@JsonProperty("TroopsDetail")
private Map<String, Object> troopsDetail;
@JsonProperty("Platform_type")
private String platformType;
private Boolean isStrikeTarget;
private Boolean isReconTarget;
private Boolean isInterferenceTarget;
private Boolean isDefendImportantPlace;
//命中率
private Double successTargetRad;
private String groupType;
@JsonProperty("EquipmentID")
private String equipmentId;
@JsonProperty("Name")
private String name;
@JsonProperty("OwnerForceSide")
private String ownerForceSide;
@JsonProperty("PlatID")
private String platId;
@JsonProperty("SubComponents")
private FireRuleInputRedSubComponentsDTO subComponents;
}

View File

@@ -0,0 +1,43 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleInputRedWeaponSlotDTO {
@JsonProperty("ObjectHandle")
private String objectHandle;
private FireRuleInputArithmeticRefDTO arithmetic;
private String codedQueue;
private FireRuleInputLauncherConfigurationDTO configuration;
private FireRuleInputDeviceRefDTO device;
private String deviceId;
private String deviceName;
private Boolean employLabel;
private String facilityName;
private String serialNumber;
private String soleId;
private Map<String, Object> twiceModified;
private List<Object> zLists;
@JsonProperty("ParentPlat")
private String parentPlat;
}

View File

@@ -0,0 +1,64 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.List;
/**
* 单条火力规则任务输入(蓝方多任务时为列表中的一项)
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleTaskInputDTO {
/**
* 任务唯一标识
*/
private String id;
/**
* 任务名称
*/
private String drawName;
/**
* 任务类型
*/
private String dataType;
/**
* 任务所属阵营
*/
private String side;
/**
* 蓝方任务装备命中率
*/
private Double successTargetRad;
/**
* 航迹所属实体或阵营标识
*/
private String trackPointsId;
/**
* 任务航迹点列表
*/
private List<FireRuleTrackPointDTO> trackPoints;
/**
* 任务武器配置列表
*/
private List<FireRuleTaskWeaponDTO> taskWeapons;
/**
* 任务目标 id
*/
private String targetId;
/**
* 作战区经纬高坐标列表
*/
private List<FireRuleCoordinateDTO> warZoneLocation;
}

View File

@@ -0,0 +1,50 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.List;
/**
* 任务挂载的武器配置
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleTaskWeaponDTO {
/**
* 装备 id武器唯一标识
*/
private String equipmentId;
/**
* 装备名称
*/
private String name;
/**
* 装备类型
*/
private String supportType;
/**
* 装备组件列表
*/
private List<FireRuleWeaponComponentDTO> components;
/**
* 装备部署位置
*/
private FireRuleCoordinateDTO coordinate;
/**
* 武器数量;对应 JSON 键 {@code number}。{@code _comment_number} 为注释键,不映射。
* 可为数值或业务文案(如「最大载弹量」)。
*/
private Object number;
/**
* 该武器打击目标 id
*/
private String targetId;
}

View File

@@ -0,0 +1,37 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 任务航迹点
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleTrackPointDTO {
/**
* 航迹点序号
*/
private Integer index;
/**
* 经度
*/
private Double longitude;
/**
* 纬度
*/
private Double latitude;
/**
* 高度
*/
private Double height;
/**
* 速度
*/
private Double speed;
}

View File

@@ -0,0 +1,29 @@
package com.solution.rule.domain.ultimately.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import java.util.List;
/**
* 任务武器下的设备组件
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleWeaponComponentDTO {
/**
* 设备 id
*/
private String deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 组件参数列表
*/
private List<FireRuleComponentParamDTO> componentParams;
}

View File

@@ -0,0 +1,6 @@
/**
* 火力规则输入侧 DTO与 {@code resources/json/火力规则输入-无注释.json} 对齐。
* <p>
* {@code redWeapons} 中装备项为 {@link com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO}(含 {@code SubComponents})。
*/
package com.solution.rule.domain.ultimately.dto;

View File

@@ -0,0 +1,20 @@
package com.solution.rule.domain.ultimately.fact;
import com.solution.rule.domain.ultimately.dto.FireRuleInputRedWeaponElementDTO;
import com.solution.rule.domain.ultimately.dto.FireRuleTaskInputDTO;
import com.solution.rule.domain.ultimately.vo.FireRuleOutputVO;
import lombok.Data;
import java.util.List;
@Data
public class DroolsFact {
//蓝方任务列表
private FireRuleTaskInputDTO task;
//红方武器库
private List<FireRuleInputRedWeaponElementDTO> redWeapons;
private FireRuleOutputVO fireRuleOutputVO;
}

View File

@@ -0,0 +1,22 @@
package com.solution.rule.domain.ultimately.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 算法引用id / 名称)
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleArithmeticRefVO {
/**
* 算法 id
*/
private String id;
/**
* 算法名称
*/
private String name;
}

View File

@@ -0,0 +1,32 @@
package com.solution.rule.domain.ultimately.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 装备组件参数项
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleComponentParamVO {
/**
* 参数唯一标识
*/
private String uuid;
/**
* 属性默认值
*/
private String attDefaultValue;
/**
* 属性说明
*/
private String attExplain;
/**
* 数量或序号
*/
private Integer number;
}

View File

@@ -0,0 +1,27 @@
package com.solution.rule.domain.ultimately.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* 经纬高坐标点
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleCoordinateVO {
/**
* 经度
*/
private Double longitude;
/**
* 纬度
*/
private Double latitude;
/**
* 高程(米)
*/
private Double height;
}

View File

@@ -0,0 +1,27 @@
package com.solution.rule.domain.ultimately.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 巡航航线偏移量项(上下 / 前后 / 左右 三选一与取值)
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FireRuleCruiseRouteOffsetItemVO {
@JsonProperty("UpOrDown")
private Boolean upOrDown;
@JsonProperty("BeforeOrAfter")
private Boolean beforeOrAfter;
@JsonProperty("LeftOrRight")
private Boolean leftOrRight;
/**
* 偏移数值
*/
private Number value;
}

Some files were not shown because too many files have changed in this diff Show More