Compare commits

..

200 Commits

Author SHA1 Message Date
wanxiaoli
e1f770c795 模型训练代码调整 2026-04-17 11:13:18 +08:00
wanxiaoli
bfb3d234eb 模型训练添加数据集校验 2026-04-15 14:55:56 +08:00
8395224f42 修改权限 2026-04-15 14:36:18 +08:00
28438fc0fa Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-04-15 10:55:35 +08:00
7e8af2185e 设备部件值只能输入正数 2026-04-15 10:55:14 +08:00
wanxiaoli
aa0beb57ea 后端修改 2026-04-13 09:40:46 +08:00
b1dd182b3b 去掉首页logo 2026-04-13 09:10:06 +08:00
2e34b85c38 模拟结果添加显示设置,修改模拟计算状态,修改模型训练bug 2026-04-10 14:22:52 +08:00
wanxiaoli
9c7eebdb8e Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-04-10 12:03:03 +08:00
wanxiaoli
d102de849b 情景状态闭环 2026-04-10 12:02:46 +08:00
87731f3d94 分析设计提交隐藏显示 2026-04-09 17:43:59 +08:00
50fc25abbc 添加分析设计bug 2026-04-09 17:14:36 +08:00
3843a7adb0 修改admin没有权限bug 2026-04-09 16:28:41 +08:00
d0e5969a71 修改导出数据结果 2026-04-09 15:57:02 +08:00
3d6d4d7d7d 项目分析设计新增复制功能 2026-04-09 15:41:33 +08:00
4b7966337a Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-04-09 11:31:52 +08:00
627d3160a5 添加衍生列 2026-04-09 11:31:17 +08:00
wanxiaoli
52bb4f69c5 模型训练添加特征映射配置 环节 2026-04-09 11:06:53 +08:00
4bad0bc52d 项目修改文字提示 2026-04-08 13:43:37 +08:00
d8d563f588 去掉debugger 2026-04-07 16:29:39 +08:00
26a8fb860e 修改训练bug 2026-04-07 16:25:31 +08:00
0c9e04ef8b 分析设计bug修改 2026-04-07 15:33:22 +08:00
c76129e35c 编辑分析设计添加查询方法 2026-04-07 15:16:28 +08:00
fbe5401bda 权限管理bug修复 2026-04-07 15:10:47 +08:00
6f6f62f04c 新增导入项目方法,修改上传数据源方法 2026-04-07 14:44:41 +08:00
d0de412782 项目列表添加权限管理 2026-04-07 09:54:29 +08:00
144a4d5866 修改导出方法,添加导入项目工程方法 2026-04-07 09:25:54 +08:00
wanxiaoli
dc5691e1f6 项目权限 2026-04-03 12:06:24 +08:00
b1ee7c5f61 添加项目权限管理 2026-04-03 09:09:59 +08:00
674c32af90 提交导出全部 2026-04-02 18:12:36 +08:00
eaf1910591 添加项目权限 2026-04-02 17:33:02 +08:00
da87415599 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-04-02 16:09:35 +08:00
8b5f6ffc36 添加权限设置 2026-04-02 16:09:18 +08:00
wanxiaoli
f59dd61da4 项目权限 2026-04-02 15:31:00 +08:00
86c7d1c7a9 修改算法类型判断,调整链接桩大小,点击添加移动连接线功能 2026-03-31 14:22:21 +08:00
086d834788 keff阈值bug修改 2026-03-27 11:00:32 +08:00
4863126498 x6图片测试提交 2026-03-26 19:15:04 +08:00
66a0c83554 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-03-26 17:15:38 +08:00
0925cd3d52 修改global问题 2026-03-26 17:15:25 +08:00
wanxiaoli
b38ea4ad65 后端更改 2026-03-26 16:55:28 +08:00
2800d02243 添加global 2026-03-26 13:51:39 +08:00
346ec6288d 模型训练修改图标 2026-03-26 13:36:36 +08:00
3c969488b7 添加训练模型websocket 2026-03-26 11:32:37 +08:00
f7d6ca4fdb Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-03-24 17:03:33 +08:00
688a44ad2d 修改连接线 2026-03-24 17:03:29 +08:00
wanxiaoli
eb2d94fb53 pom修改 2026-03-24 16:37:56 +08:00
1ee052abb9 修改连接线样式 2026-03-24 10:40:16 +08:00
48cd7a8d2a 修改变动公式值设置删除bug 2026-03-24 09:49:50 +08:00
1c90725356 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-03-23 18:11:58 +08:00
6aba8f4b37 修改新增和删除变动公式值bug 2026-03-23 18:11:52 +08:00
wanxiaoli
3d4a65a157 后端修改 2026-03-20 19:00:16 +08:00
wanxiaoli
c78e3be982 后端推理调整 2026-03-20 18:12:19 +08:00
wanxiaoli
d82e34d803 后端更新 2026-03-19 15:09:03 +08:00
666248b402 修改类型管理bug 2026-03-19 15:02:19 +08:00
21fd1572e7 修改版本号 2026-03-19 14:05:04 +08:00
176c767137 修改前端样式修改 2026-03-19 13:58:28 +08:00
wanxiaoli
68656b1d70 后端修改 2026-03-19 11:18:15 +08:00
be188c9c05 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-03-19 08:54:35 +08:00
7c8776ce49 修改bug 2026-03-19 08:54:15 +08:00
wanxiaoli
bdd563d196 模型路径获取方法支持材料类型 2026-03-18 10:12:55 +08:00
wanxiaoli
1d525c3770 模型训练增加材料类型支持 2026-03-17 17:49:29 +08:00
36d4b57ce3 根据需求修改页面 2026-03-16 16:09:11 +08:00
wanxiaoli
6ca6516b12 模型训练接口修改 2026-03-16 11:00:27 +08:00
15d442d9ec 修改图标 2026-03-12 18:17:40 +08:00
4de48dc5b9 删除debugger 2026-03-12 17:46:19 +08:00
28bb022a90 修改bug 2026-03-12 17:44:57 +08:00
7cb9d721da 修改bug 2026-03-12 17:02:48 +08:00
df9410b2d2 修改bug 2026-03-12 16:49:52 +08:00
099486cfc1 修改模拟分析添加Keff预警阈值,设备算法配置映射 2026-03-12 16:32:27 +08:00
9ed22058b6 修改模型训练 2026-03-12 15:42:44 +08:00
dec253c4e1 修改模型训练 2026-03-12 15:03:24 +08:00
wangxingkai
a2c4e64648 修改模型训练 2026-03-12 14:31:32 +08:00
wanxiaoli
b1fa56a7f3 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-03-11 18:18:04 +08:00
wanxiaoli
fb8062951a 修改上传路径为绝对路径 2026-03-11 18:17:45 +08:00
d2d58bbda4 修改代码 2026-03-11 18:12:59 +08:00
wangxingkai
959b073c23 添加训练模型模块 2026-03-11 17:42:42 +08:00
wanxiaoli
af36737867 添加根据类型获取算法 2026-03-11 16:00:42 +08:00
wanxiaoli
f7d113b71c 模型训练接口 2026-03-11 14:52:43 +08:00
wanxiaoli
aff2d7feea 模型训练 2026-03-11 13:55:32 +08:00
632fd0f725 添加模型训练模块,类型管理和模型管理位置更换 2026-03-11 11:51:52 +08:00
beae418be5 修改分析设计图片 2026-03-10 08:32:28 +08:00
eb25728cbb 提交代码 2026-02-05 09:51:45 +08:00
65e2f75b60 修改拓扑图 2026-01-28 10:08:39 +08:00
e24ca3ef6a 修改设计分析样式 2026-01-27 18:24:50 +08:00
32ac730b01 修改x6添加节点样式 2026-01-27 13:33:14 +08:00
298e0ee650 修改x6页面 2026-01-26 08:30:09 +08:00
7896f303b4 修改变更关系 2026-01-22 10:58:03 +08:00
223f815b15 修改图形化方法和功能 2026-01-21 18:18:52 +08:00
fb75114eaf 修改样式 2026-01-21 14:07:38 +08:00
fbf6cf63dc 修改文字 2026-01-21 13:55:55 +08:00
fc2a981cfc 修改拓扑图bug 2026-01-21 13:50:10 +08:00
b2324d6465 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-21 13:43:37 +08:00
a4682f00cd 修改计算结果导出 2026-01-21 13:43:28 +08:00
wanxiaoli
451d3fafe8 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-21 13:41:30 +08:00
wanxiaoli
397e917359 添加创建人 2026-01-21 13:41:16 +08:00
47761dd242 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-21 13:40:08 +08:00
061ddc16f4 修改bug 2026-01-21 13:39:59 +08:00
wanxiaoli
34a7658b5a 修改 2026-01-21 10:11:38 +08:00
wanxiaoli
a011e60d0c Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-21 09:58:09 +08:00
wanxiaoli
b32a8699ab 前端内容 2026-01-21 09:57:53 +08:00
wanxiaoli
5b6f806739 版本-本地暂存 2026-01-21 09:56:20 +08:00
d5c399d218 测试 2026-01-21 09:54:47 +08:00
wanxiaoli
67739f8a7c 结果导出 2026-01-21 09:51:18 +08:00
cba4cff69a 新增导出项目方法 2026-01-21 08:33:46 +08:00
93062e9f8c 修改前端bug 2026-01-20 18:04:10 +08:00
ffd02cbddc 场景判断错误 2026-01-20 17:30:48 +08:00
7103ba3cac 修改删除提示 2026-01-20 17:18:54 +08:00
f3bc668e65 修改模型详情回显图片 2026-01-20 16:56:36 +08:00
wanxiaoli
5093d978b4 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-20 16:05:07 +08:00
wanxiaoli
e0682d3c45 修改 2026-01-20 16:04:55 +08:00
3e3fad9215 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-20 16:03:25 +08:00
4c494a3ede 新增模型管理模块 2026-01-20 16:03:06 +08:00
wanxiaoli
d12317763f Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-20 16:02:24 +08:00
wanxiaoli
aca12f1534 添加model_path 2026-01-20 16:02:10 +08:00
293407919a 修改计算结果 2026-01-20 09:36:41 +08:00
a961ceffd0 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-19 17:31:42 +08:00
dee3a3e051 修改历史模拟分析页面 2026-01-19 17:31:35 +08:00
wanxiaoli
09a05c70c1 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-19 14:55:47 +08:00
wanxiaoli
e537effbe3 修改场景状态 2026-01-19 14:55:24 +08:00
41fb70bb78 提交预览x6 2026-01-17 14:59:23 +08:00
b1577e324a Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-17 13:42:02 +08:00
f38acfc857 提交前端 2026-01-17 13:41:47 +08:00
wanxiaoli
10970ab165 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-17 13:40:34 +08:00
wanxiaoli
1c442560a6 初始化注入设备尺寸 2026-01-17 13:40:19 +08:00
45f5a28775 修改提交 2026-01-17 12:32:55 +08:00
5e03b4e79f Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-17 09:08:46 +08:00
ea45e6f84b 保存分析设计 2026-01-17 09:08:16 +08:00
wanxiaoli
912dd6075a 物料新增与修改在同一接口 2026-01-16 18:30:49 +08:00
wanxiaoli
26423085bc Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-16 17:26:58 +08:00
wanxiaoli
8c0b313b0b 增加修改放一接口 2026-01-16 17:26:44 +08:00
3e4ad3afb8 修改分析物料 2026-01-16 14:43:40 +08:00
wanxiaoli
7a50fdb1cf 修改物料 2026-01-16 11:23:33 +08:00
088347289a Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-16 10:12:18 +08:00
129afbc8dc 修改分析图 2026-01-16 10:12:14 +08:00
wanxiaoli
645df52290 创建设备接口支持传入id和自动生成 2026-01-16 09:58:38 +08:00
10900e3e52 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-15 17:27:30 +08:00
80d707f992 修改x6 2026-01-15 17:27:26 +08:00
wanxiaoli
3fef4ea822 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2026-01-15 14:56:53 +08:00
wanxiaoli
dfab9ae5d0 修改 2026-01-15 14:56:32 +08:00
2269796070 分析设计添加新增模拟分析历史模拟分析 2026-01-15 08:47:44 +08:00
b47a65bdc8 修改x6 2026-01-13 17:39:09 +08:00
bd7292ccbe Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2026-01-13 15:11:45 +08:00
f7238eaf63 添加分析设计页面 2026-01-13 15:11:39 +08:00
wanxiaoli
8dce0a5a7f python调用 2026-01-09 10:42:16 +08:00
wanxiaoli
b86d8abd07 Fix compilation errors and update models 2026-01-05 17:21:25 +08:00
wanxiaoli
c6ae4c7d3c 提交内容 2026-01-05 17:07:42 +08:00
f3c4056c1e 修改了启动模式 2026-01-05 16:52:03 +08:00
wanxiaoli
9be237c53e 添加更新 2026-01-05 15:18:21 +08:00
a4a8ed9535 修改批量修改 2026-01-04 08:30:06 +08:00
6c85a844dd Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-31 09:11:13 +08:00
8dba8c07d4 修改初始化条件 2025-12-31 09:11:08 +08:00
wanxiaoli
43caa9d021 事件接口批量保存 2025-12-30 18:02:41 +08:00
921e657524 追加修改 2025-12-26 17:29:11 +08:00
4b9fbb8a7f Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-26 17:27:19 +08:00
0ec2f3ea1a 修改场景代码 2025-12-26 17:27:12 +08:00
wanxiaoli
5c8792e883 场景创建返回标识 2025-12-26 17:20:27 +08:00
a9b5057d9d Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-26 11:33:54 +08:00
64f1b0dae7 新增场景模块 2025-12-26 11:33:50 +08:00
wanxiaoli
56ffbbe268 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2025-12-26 11:29:46 +08:00
wanxiaoli
6c75359b52 场景表添加算法类型 2025-12-26 11:29:38 +08:00
731f5fadad 整理项目模块,数据管理,算法管理图标 2025-12-25 14:24:35 +08:00
033579d549 修改登录页面 2025-12-25 14:04:16 +08:00
9475db4619 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-25 13:45:26 +08:00
7c2409c627 添加算法模块,更换logo 2025-12-25 13:45:21 +08:00
wanxiaoli
516961c323 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2025-12-25 09:32:00 +08:00
wanxiaoli
9915158530 算法修改 2025-12-25 09:31:47 +08:00
4aca24a8c1 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-25 09:22:15 +08:00
33509c14af 修改设备样式 2025-12-25 09:22:09 +08:00
wanxiaoli
b8b122980f 设备、临界数据根据设备类型做导入 2025-12-25 09:16:29 +08:00
8c277528cb Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-24 17:14:24 +08:00
88dcd945e6 前端修改idbug 2025-12-24 17:14:19 +08:00
wanxiaoli
c88aae3f48 分页 2025-12-24 17:12:39 +08:00
wanxiaoli
0c64c11b58 提交新修改 2025-12-24 16:40:13 +08:00
8262b7c054 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-24 16:36:20 +08:00
46a5554a8e 新增临界数据管理 2025-12-24 16:36:15 +08:00
wanxiaoli
6e5376836d Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2025-12-24 15:46:45 +08:00
wanxiaoli
02375f3b03 添加创建人 2025-12-24 15:46:21 +08:00
db11179d81 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-24 13:33:11 +08:00
5a920b96c1 添加物料模块 2025-12-24 13:33:05 +08:00
wanxiaoli
4d40414e82 Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into development-business-css 2025-12-24 12:36:20 +08:00
wanxiaoli
7bb9d657f9 基础类修改 2025-12-24 12:35:13 +08:00
0adfdf748d Merge branch 'develop-business-css' of http://121.37.111.42:3000/ThbTech/JavaProjectRepo into develop-business-css 2025-12-23 14:54:03 +08:00
bad8cd11d5 添加项目模块 2025-12-23 14:53:57 +08:00
wanxiaoli
200222165a 代码更新 2025-12-23 14:42:05 +08:00
wanxiaoli
5fbdb08f67 添加创建人 2025-12-19 12:08:07 +08:00
wanxiaoli
7499a6e295 细化接口方法、注释等 2025-12-18 17:16:24 +08:00
wanxiaoli
719f02becd 修改 2025-12-17 17:52:12 +08:00
wanxiaoli
d6406f325a 提交功能规划文档 2025-12-17 17:43:50 +08:00
wanxiaoli
74a43d99a6 提交业务系统更新 2025-12-17 17:09:58 +08:00
wanxiaoli
17c177a341 增加了css项目业务类的增删改查方法 2025-12-17 17:08:51 +08:00
28810ecff3 添加了前端frontend代码 2025-11-21 13:06:11 +08:00
0f50e2ccd1 Merge remote-tracking branch 'origin/main-framework' into develop-business-css 2025-11-21 11:31:39 +08:00
4b94be1b4a chore: stop tracking generated assets per .gitignore (static/ and business-css/target) 2025-11-21 10:18:55 +08:00
507cc6a6d2 整理和前后端端代码及框架 2025-11-21 10:04:00 +08:00
f2e6cc67f3 测试提交 2025-11-20 16:42:09 +08:00
6fba87f156 Merge remote-tracking branch 'origin/main-framework' into develop-business-css 2025-11-12 18:15:45 +08:00
63d41e11a6 增加了分析模拟系统模块框架 2025-11-09 22:55:49 +08:00
48bca56d15 Merge remote-tracking branch 'origin/main-framework' into develop-business-css 2025-11-09 22:06:32 +08:00
fc4d5fc2cd 增加了从main-framework分支同步脚本 2025-11-09 21:48:30 +08:00
16549de421 Merge branch 'main-framework' into develop-business-css 2025-11-09 21:43:52 +08:00
746 changed files with 51298 additions and 374 deletions

5
.trae/.ignore Normal file
View File

@ -0,0 +1,5 @@
**/node_modules
**/dist
**/build
**/target
*.log

1
.vercel/project.json Normal file
View File

@ -0,0 +1 @@
{"neverMindDeployCard":true}

18
.vscode/launch.json vendored
View File

@ -1,5 +1,23 @@
{
"configurations": [
{
"type": "java",
"name": "Attach to Remote Program5005",
"request": "attach",
"hostName": "localhost",
"port": "5005"
},
{
"type": "java",
"name": "CriticalScenarioApplication",
"request": "launch",
"cwd": "${workspaceFolder}",
"mainClass": "com.yfd.business.css.CriticalScenarioApplication",
"projectName": "business-css",
"args": "",
"envFile": "${workspaceFolder}/.env"
},
{
"type": "java",
"name": "Spring Boot-PlatformApplication<platform>",

12
business-css/README.md Normal file
View File

@ -0,0 +1,12 @@
# business-css
临界事故情景分析模拟系统(业务模块)。
- 引用 `framework` 公共模块:依赖坐标 `com.yfd:platform:1.0:jar:plain`
- 提供基础 REST 接口:`/api/simulation/ping` 与 `/api/simulation/run`
- 运行方式:在项目根目录执行 `mvn -DskipTests spring-boot:run -pl business-css`
## 开发约定
- 统一使用 JDK 17
- 数据库连接在 `application.yml` 中配置,可根据环境覆盖
- 与框架的通用工具、模型、常量等直接通过依赖引入使用

View File

@ -0,0 +1,151 @@
# SimController 及相关接口实现建议 v4-2结合当前工程现状
本文档基于 [情景模拟分析结果v3.md](file:///e:/projectJava/JavaProjectRepo/business-css/%E6%83%85%E6%99%AF%E6%A8%A1%E6%8B%9F%E5%88%86%E6%9E%90%E7%BB%93%E6%9E%9Cv3.md) 第 3 条,并结合当前可运行代码的真实调用链,给出可落地的实现建议。
---
## 0. 现状盘点(必须先对齐)
### 0.1 当前“线上可用”的仿真接口在哪里
目前仿真入口实际在 `ProjectController`,而不是 `SimController`
- 初始化:`POST /projects/simulation/init` → [ProjectController.java:L275-L300](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java#L275-L300) → [ProjectServiceImpl.initSimulation](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L614-L774)
- 运行:`POST /projects/simulation/run` → [ProjectController.java:L288-L300](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/controller/ProjectController.java#L288-L300) → [ProjectServiceImpl.runSimulation](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1296-L1351)
### 0.2 SimController 为什么不可用
[SimController.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/controller/SimController.java#L1-L43) 目前是“原型草稿”,在本仓库中无法落地,原因是:
- 引用的 `ProjectRepository/EventRepository/InfluenceRepository/InferenceConverter` 仅在该文件出现,仓库中不存在真实实现。
- `SimBuilder.buildUnits/buildEvents/buildInfluenceNodes` 也不存在([SimBuilder.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/build/SimBuilder.java#L1-L44) 只有注释草稿)。
- `SimService` 当前逻辑是 KV 级简化引擎,并且事件优先级与现有 `initSimulation` 的行为不一致([SimService.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/SimService.java#L7-L51))。
### 0.3 当前系统的“真实数据格式”
`runSimulation` 解析的是一种“frames → devices”结构并按 `deviceType` 分组:
- 调用入口:[ProjectServiceImpl.runSimulation](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1296-L1351)
- 解析工具:[DeviceDataParser.parseAndGroupDeviceData](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/utils/DeviceDataParser.java#L1-L88)
- 单步模型:[DeviceStepInfo.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/model/DeviceStepInfo.java)
因此,“让 SimController 可用”的关键,不是从 0 造一套新格式,而是:**复用现有 frames 格式(或在 SimController 内把 SimContext 转为该格式)**,以便直接复用 `DeviceDataParser` + `DeviceInferService` 的整条推理/落库链路。
---
## 1. 建议的目标形态SimController 成为“仿真编排入口”
建议把 SimController 从“原型”升级为生产入口,但要遵循当前工程已存在的服务边界:
### 1.1 目标职责划分(贴合当前代码)
- **SimController**:只处理 HTTP + 参数校验 + 返回值结构统一(保持与 ProjectController 相同的 `{code,msg,data}` 或复用统一响应体)。
- **SimulationFacade新增**:负责把“现有 services + topology JSON + event 表”组装成可计算输入;并在需要时调用推理、落库、更新情景状态。
- **SimulationEngine新增或重构现有 SimService**:只做“时序帧生成/影响计算/事件注入”,纯内存计算,不碰 DB。
- **Converter新增**:把 Engine 输出转成 `DeviceDataParser` 能吃的 frames JSON或直接输出 Map 结构)。
这样做的好处:既保留 `SimController` 分层方向,又不引入仓库里不存在的 Repository/Converter 类型。
---
## 2. 具体落地建议(按当前文件/类名对齐)
### 2.1 先做最小可用:让 /sim 接口复用现有 ProjectServiceImpl 的能力
为了快速验证链路,第一阶段建议不要立刻重写引擎,而是“搬运+封装”:
1) **新增 `SimulationFacade`(建议放在 `com.yfd.business.css.service.sim` 包)**
内部依赖现有 service`ProjectService/ScenarioService/EventService/DeviceInferService`(以及 `MaterialService` 若需要 DB 补全静态物料属性)。
它暴露两类能力:
- `init(projectId, scenarioId, params)`:复用 [ProjectServiceImpl.initSimulation](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L614-L774) 或将其中解析/计算段迁移出来。
- `run(projectId, scenarioId, params)`:复用 [ProjectServiceImpl.runSimulation](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1296-L1351)。
2) **SimController 直接调用 facade并提供与 ProjectController 一致的返回结构**
这样能做到:新增 `/sim/*` 不影响现有 `/projects/simulation/*`,并且复用现有稳定链路。
这一阶段的目标是:**先让 SimController 可用、可回归测试、可逐步迁移**。
### 2.2 第二阶段:把 initSimulation 拆成“解析/计算/输出”三个可替换模块
当前 `initSimulation` 里混杂了:拓扑解析、设备顺序、静态注入、影响计算、事件解析、帧输出。建议拆成 3 个模块,便于未来替换而不改 API
#### A. Topology & Static 解析模块建议TopologyParser
直接复用现有实现(迁移或抽取):
- 设备顺序:`parseDeviceOrder(projectId)`[ProjectServiceImpl.java:L370-L397](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L370-L397)
- 设备-物料绑定:`buildDeviceMaterialMap`[ProjectServiceImpl.java:L1063-L1090](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1063-L1090)
- 静态/影响解析:
- 设备:`parseDeviceStaticsAndInfluences`[ProjectServiceImpl.java:L806-L860](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L806-L860)
- 物料:`parseMaterialStaticsAndInfluences`[ProjectServiceImpl.java:L861-L928](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L861-L928)
- DB 物料静态补全:`buildMaterialStaticFromDb`[ProjectServiceImpl.java:L1116-L1141](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1116-L1141)
- 设备 size 注入:`injectDeviceSize`[ProjectServiceImpl.java:L776-L804](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L776-L804)
建议输出一个结构化的 DTO例如
- `List<Device> orderedDevices`
- `Map<deviceId, deviceType>`
- `Map<deviceId, materialId>`
- `devStatic/devInfluence/matStatic/matInfluence/matStaticDb`
#### B. Event 解析模块建议EventScheduleBuilder
直接复用现有 `attr_changes` 解析逻辑:
- `buildValueProviders`[ProjectServiceImpl.java:L929-L996](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L929-L996)
- `collectTimePoints`[ProjectServiceImpl.java:L1037-L1061](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1037-L1061)
- `readValue`[ProjectServiceImpl.java:L998-L1035](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L998-L1035)
补强建议(贴合现状的缺口):
- 当 `timePoints` 为空时不要直接失败:允许用 params 提供 `start/end/interval` 生成时间网格(否则“无事件仿真”无法跑)。
- ramp 事件目前仅把起止时刻作为输出点;若前端想看平滑曲线,需要补齐采样点(例如每 1s
#### C. Frame 生成模块建议FrameGenerator
复用 `initSimulation` 的生成循环,但把“覆盖策略”参数化:
- 现在的覆盖策略是:**Static → Influence → overrideWithEvents最终覆盖**
代码:[overrideWithEvents](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1106-L1114)
- 建议支持两类事件Input 与 Override可先用 params 开关模拟)
- Input计算前注入
- Override计算后强制覆盖
这样第三阶段才需要动到“事件类型”定义;第二阶段只要把钩子留好即可。
---
## 3. SimService/SimModel 如何与现有链路对接(不要重新造轮子)
### 3.1 现有 SimModel 的适配建议(只做必要改造)
当前 SimModel 过于抽象(纯 KV无法表达“设备/物料静态属性注入、deviceType、material 绑定”等现有业务关键点:
- `SimUnit` 只有 `unitId/deviceId/materialId/deviceType`[SimUnit.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/model/SimUnit.java)
- `SimContext` 只有 `Map<SimPropertyKey, Double>` 的 currentValues[SimContext.java](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/model/SimContext.java)
建议的最小增强(为了能生成当前 runSimulation 可消费的 frames
- `SimUnit` 增加 `Map<String, Double> staticProps`(至少承载 diameter/height 与物料关键属性)。
- `SimEvent` 增加 `boolean override` 或扩展 EventType区分 Input/Override
- `SimInfluenceSource.delay` 目前未在 `SimService` 使用;若要支持 delay必须用 `ctx.timeline` 回看历史值(当前 `SimContext` 已能保留 step 的快照)。
### 3.2 Converter把 SimContext 输出转换成现有 frames 格式
建议增加一个 Converter替代原型里的 `InferenceConverter`),输出结构与 `DeviceDataParser` 一致:
```json
{
\"data\": {
\"frames\": [
{
\"step\": 0,
\"time\": 0,
\"devices\": {
\"dev-001\": {\"deviceType\": \"CylindricalTank\", \"diameter\": 20, \"height\": 20, \"u_concentration\": 20}
}
}
]
}
}
```
理由:这样 `SimController` 可以直接调用 `DeviceDataParser.parseAndGroupDeviceData` + `DeviceInferService.processDeviceInference`,与现有落库路径完全一致。
---
## 4. SimController 的接口形态建议(与现有系统兼容)
建议同时支持“两段式”和“一段式”,避免推倒重来:
### 4.1 两段式(兼容现有前端/流程)
- `POST /sim/init`:返回 frames`/projects/simulation/init` 对齐)
- `POST /sim/run`:接收 frames调用推理并落库`/projects/simulation/run` 对齐)
### 4.2 一段式(面向后端批处理/自动化)
- `POST /sim/run-all`:内部调用 init 生成 frames再立即 run 推理落库,返回摘要(如 snapshots、结果条数、耗时
---
## 5. 迁移与风险控制(建议强制执行)
1) **先引入新接口,不删旧接口**:让 `/sim/*``/projects/simulation/*` 并行一段时间。\n\n2) **帧格式不变**:任何新实现必须输出 `DeviceDataParser` 可解析的结构,否则推理链路与前端都要一起改,风险最大。\n\n3) **行为一致性测试**:对比新旧 init 输出(同 projectId/scenarioId是否一致对比 run 后写入 `scenario_result` 条数与 key 字段是否一致。\n\n4) **清理 System.out.println**`ProjectServiceImpl` 的 init/run 里有大量 `System.out.println`(例如 [ProjectServiceImpl.java:L644-L661](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L644-L661) 与 [runSimulation debug](file:///e:/projectJava/JavaProjectRepo/business-css/src/main/java/com/yfd/business/css/service/impl/ProjectServiceImpl.java#L1319-L1338)),建议迁移到统一日志体系后再移除,以免污染生产日志与性能。\n\n---\n\n## 6. 最小实现清单(按优先级排序)\n\n- 建议 1`SimController` 先“可用”——删除/替换不存在的 Repository/Converter 依赖,改用现有 Service。\n- 建议 2新增 `SimulationFacade`,把现有 `ProjectServiceImpl.initSimulation/runSimulation` 先封装起来。\n- 建议 3逐步抽取 `TopologyParser/EventScheduleBuilder/FrameGenerator`,把 `ProjectServiceImpl` 中的计算逻辑迁移出来。\n- 建议 4最后再考虑把增强后的 `SimService/SimModel` 正式替换成唯一引擎实现。\n+

View File

@ -0,0 +1,152 @@
# SimController 及相关接口实现建议 v4
基于 [情景模拟分析结果v3.md](file:///e:/projectJava/JavaProjectRepo/business-css/%E6%83%85%E6%99%AF%E6%A8%A1%E6%8B%9F%E5%88%86%E6%9E%90%E7%BB%93%E6%9E%9Cv3.md) 中的分析,`SimController` 及其配套组件 (`SimService`, `SimBuilder`, `SimModel`) 代表了系统向**模块化、可测试化**方向演进的正确路径。
当前 `SimController` 处于不可用状态(依赖缺失、逻辑简化、代码注释)。为了将其转化为生产可用的仿真服务,以下是具体的实现建议与重构方案。
---
## 1. 总体架构设计
目标是将仿真逻辑从 `ProjectServiceImpl` 中剥离,构建独立的仿真层。
* **Controller 层 (`SimController`)**: 仅负责接收 HTTP 请求,参数校验,调用 Service返回结果。
* **Facade 层 (`SimDataFacade`)**: **新增组件**。负责与现有的 `ProjectService`, `EventService`, `InfluenceService` 交互获取原始数据Project 实体, Event 列表等),并屏蔽数据库细节。*注:原设计中的 `ProjectRepository` 等接口在本项目中没有实现,直接复用现有的 Service 层更符合现状。*
* **Builder 层 (`SimBuilder`)**: 负责将原始数据Entity/JSON转换为仿真专用的领域模型 (`SimUnit`, `SimEvent`, `SimInfluenceNode`)。
* **Engine 层 (`SimService`)**: **核心计算引擎**。纯内存计算,不依赖数据库。执行 `Static -> Event -> Influence -> Override` 的标准管线。
---
## 2. 详细实现建议
### 2.1 补齐数据获取层 (SimDataFacade)
`SimController` 依赖了不存在的 `ProjectRepository` 等接口。建议创建一个 `SimDataFacade` 来封装数据获取逻辑。
```java
@Component
public class SimDataFacade {
private final ProjectService projectService;
private final EventService eventService;
// ... 其他 Service
// 封装获取逻辑:获取项目拓扑、事件列表、影响关系等
public SimDataPackage loadSimulationData(String projectId, String scenarioId) {
Project project = projectService.getById(projectId);
List<Event> events = eventService.list(new QueryWrapper<Event>().eq("scenario_id", scenarioId));
// ... 获取其他必要数据
return new SimDataPackage(project, events);
}
}
```
### 2.2 激活并增强 Builder (SimBuilder)
`SimBuilder` 目前被注释掉了,需要激活并实现核心转换逻辑。重点是将 `ProjectServiceImpl.initSimulation` 中的解析逻辑迁移过来。
* **`buildUnits`**: 解析 `Project.topology` JSON提取 Device 和 Material构建 `SimUnit` 列表。
* *关键点*需要包含静态属性Static Values的解析作为 `SimUnit` 的初始状态。
* **`buildEvents`**: 解析 `Event.attr_changes` JSON构建 `SimEvent` 列表。
* *关键点*:区分 **普通事件 (Input)****强制覆盖事件 (Override)**。建议在 `SimEvent` 中增加 `isOverride` 标志。
* **`buildInfluenceNodes`**: 解析 `Project.topology` 中的 `properties` -> `influence` 节点,构建 `SimInfluenceNode` 列表。
### 2.3 重构计算引擎 (SimService)
这是最核心的部分,必须修正当前的“事件 -> 计算”逻辑,改为 **标准管线**
**建议代码结构:**
```java
public class SimService {
public SimContext runSimulation(List<SimUnit> units,
List<SimEvent> events,
List<SimInfluenceNode> nodes,
int steps) {
SimContext ctx = new SimContext();
// 1. 初始化静态基线 (Static)
// 将 SimUnit 中携带的静态属性写入 ctx (t=0)
for (SimUnit unit : units) {
unit.getStaticProperties().forEach((k, v) ->
ctx.setValue(SimPropertyKey.of(unit.id(), k), v)
);
}
// 2. 时间步推进
for (int step = 0; step <= steps; step++) {
// 2.1 应用输入事件 (Event Input)
// 筛选当前 step 的普通事件,写入 ctx
applyEvents(ctx, events, step, false);
// 2.2 执行影响计算 (Influence)
// 基于当前 ctx 状态,计算所有 InfluenceNode
// 注意:为了避免计算顺序依赖,建议使用双缓冲 (Snapshot) 或 拓扑排序
// 简单实现可先计算 diff再统一应用
applyInfluences(ctx, nodes);
// 2.3 应用强制覆盖事件 (Event Override)
// 筛选当前 step 的强制事件,再次写入 ctx覆盖计算结果
applyEvents(ctx, events, step, true);
// 2.4 保存快照
ctx.snapshot(step);
}
return ctx;
}
}
```
### 2.4 统一 API 接口 (SimController)
建议将 `SimController` 作为仿真功能的唯一入口。
```java
@RestController
@RequestMapping("/sim")
public class SimController {
@PostMapping("/run")
public Result<SimulationResult> run(@RequestBody SimulationRequest req) {
// 1. 加载数据
SimDataPackage data = simDataFacade.loadSimulationData(req.getProjectId(), req.getScenarioId());
// 2. 构建模型
List<SimUnit> units = SimBuilder.buildUnits(data.getProject());
List<SimEvent> events = SimBuilder.buildEvents(data.getEvents());
List<SimInfluenceNode> nodes = SimBuilder.buildInfluenceNodes(data.getProject());
// 3. 执行仿真
SimContext ctx = simService.runSimulation(units, events, nodes, req.getSteps());
// 4. 结果转换 (适配前端图表或 AI 推理)
return Result.success(SimResultConverter.convert(ctx));
}
}
```
---
## 3. 实施路线图
1. **基础类准备**:
* 完善 `SimUnit`: 增加 `Map<String, Double> staticProperties` 字段。
* 完善 `SimEvent`: 增加 `boolean isOverride` 字段。
* 创建 `SimDataFacade` 类。
2. **迁移解析逻辑**:
* 将 `ProjectServiceImpl` 中解析 JSON (Topology, Event) 的代码块复制到 `SimBuilder` 中并适配。
* 确保单元测试覆盖 `SimBuilder`,保证解析正确性。
3. **实现计算逻辑**:
* 编写 `SimService.runSimulation`,严格按照推荐的 4 步管线实现。
* 编写单元测试,验证“事件覆盖计算”和“计算基于静态值”的场景。
4. **接口接入**:
* 在 `SimController` 中装配上述组件。
* 前端对接新的 `/sim/run` 接口。
5. **清理**:
* 标记 `ProjectServiceImpl` 中的旧模拟代码为 `@Deprecated`,并在验证新接口无误后删除。
通过以上步骤,可以将复杂的仿真逻辑从业务 Service 中解耦,构建一个清晰、可维护、易扩展的仿真引擎。

View File

@ -0,0 +1,194 @@
# SimController 及相关接口详细实现文档 v4-2
本文档基于 [SimController 及相关接口实现建议v4.md](file:///e:/projectJava/JavaProjectRepo/business-css/SimController%20%E5%8F%8A%E7%9B%B8%E5%85%B3%E6%8E%A5%E5%8F%A3%E5%AE%9E%E7%8E%B0%E5%BB%BA%E8%AE%AEv4.md) 进一步细化提供了更贴合当前代码库ProjectServiceImpl的详细实现方案。
## 1. 核心目标
* **激活 `SimController`**:使其成为仿真服务的唯一入口,替代分散在 `ProjectController` 中的逻辑。
* **标准化计算管线**:实现 `Static -> Event(Input) -> Influence -> Event(Override)` 的标准计算流程。
* **复用现有逻辑**:最大程度复用 `ProjectServiceImpl` 中已有的 JSON 解析和数据组装代码,避免重复造轮子。
---
## 2. 模块详细设计与实现
### 2.1 数据获取层 (SimDataFacade)
负责从 DB 获取原始数据,并进行初步的组装。
**File:** `src/main/java/com/yfd/business/css/facade/SimDataFacade.java` (新建)
```java
@Component
public class SimDataFacade {
@Autowired private ProjectService projectService;
@Autowired private EventService eventService;
@Autowired private MaterialService materialService; // 用于补全物料静态属性
public SimDataPackage loadSimulationData(String projectId, String scenarioId) {
// 1. 获取项目与拓扑
Project project = projectService.getById(projectId);
if (project == null) throw new IllegalArgumentException("Project not found: " + projectId);
// 2. 获取事件
List<Event> events = eventService.list(new QueryWrapper<Event>().eq("scenario_id", scenarioId));
// 3. 预加载物料库 (用于后续补全静态属性)
// 逻辑复用 ProjectServiceImpl.buildMaterialStaticFromDb
// 这里先返回原始数据,由 Builder 处理具体的补全逻辑
return new SimDataPackage(project, events);
}
}
```
### 2.2 模型构建层 (SimBuilder)
负责将 `Project` (JSON) 和 `Event` (JSON) 转换为 `SimUnit`, `SimEvent`, `SimInfluenceNode`
**关键策略**:直接复用 `ProjectServiceImpl` 中的解析方法(`parseDeviceStaticsAndInfluences`, `buildValueProviders` 等),将其重构为静态工具方法或独立组件。
**File:** `src/main/java/com/yfd/business/css/build/SimBuilder.java` (激活并重构)
```java
public class SimBuilder {
private final ObjectMapper objectMapper = new ObjectMapper();
// 1. 构建单元 (SimUnit) - 包含静态属性
public List<SimUnit> buildUnits(Project project, MaterialService materialService) {
List<SimUnit> units = new ArrayList<>();
JsonNode root = objectMapper.readTree(project.getTopology());
// 解析设备静态属性 (复用 ProjectServiceImpl.parseDeviceStaticsAndInfluences 的部分逻辑)
// 解析物料静态属性 (复用 ProjectServiceImpl.buildMaterialStaticFromDb)
// 伪代码示例
for (JsonNode deviceNode : root.path("devices")) {
String deviceId = deviceNode.path("deviceId").asText();
Map<String, Double> staticProps = new HashMap<>();
// 1.1 解析 topology 中的 static 节点
// 1.2 解析 Device.size 并注入
// 1.3 如果有绑定的 material查询 DB 并注入物料属性
units.add(new SimUnit(deviceId, ..., staticProps));
}
return units;
}
// 2. 构建事件 (SimEvent)
public List<SimEvent> buildEvents(List<Event> events) {
// 复用 ProjectServiceImpl.buildValueProviders 解析 attr_changes
// 将解析出的 Schedule 转换为 List<SimEvent>
// 注意区分 isOverride (强制覆盖)
}
// 3. 构建影响关系 (SimInfluenceNode)
public List<SimInfluenceNode> buildInfluenceNodes(Project project) {
// 复用 ProjectServiceImpl.parseDeviceStaticsAndInfluences 中的 influence 解析逻辑
}
}
```
### 2.3 核心计算引擎 (SimService)
实现标准计算管线。
**File:** `src/main/java/com/yfd/business/css/service/SimService.java` (重构)
```java
public class SimService {
public SimContext runSimulation(List<SimUnit> units,
List<SimEvent> events,
List<SimInfluenceNode> nodes,
int steps) {
SimContext ctx = new SimContext();
// Step 1: 初始化静态基线 (t=0)
for (SimUnit unit : units) {
unit.getStaticProperties().forEach((k, v) ->
ctx.setValue(SimPropertyKey.of(unit.unitId(), k), v)
);
}
// Step 2: 循环推进 (t=1 to steps)
for (int step = 1; step <= steps; step++) {
// 2.1 Event (Input): 应用普通事件
applyEvents(ctx, events, step, false);
// 2.2 Influence: 计算影响关系
// 基于当前 ctx (包含 static + input event) 计算
applyInfluences(ctx, nodes);
// 2.3 Event (Override): 应用强制覆盖事件
// 再次覆盖,确保强制逻辑生效
applyEvents(ctx, events, step, true);
// 2.4 Snapshot
ctx.snapshot(step);
}
return ctx;
}
// 辅助方法applyEvents, applyInfluences
}
```
### 2.4 统一控制器 (SimController)
**File:** `src/main/java/com/yfd/business/css/controller/SimController.java` (激活)
```java
@RestController
@RequestMapping("/sim")
public class SimController {
@Autowired private SimDataFacade simDataFacade;
@Autowired private SimBuilder simBuilder; // 如果是 Bean
@Autowired private SimService simService;
// 标准运行接口
@PostMapping("/run")
public Result<Map<String, Object>> run(@RequestBody SimulationRequest req) {
// 1. Load Data
SimDataPackage data = simDataFacade.loadSimulationData(req.getProjectId(), req.getScenarioId());
// 2. Build Model
List<SimUnit> units = simBuilder.buildUnits(data.getProject(), ...);
List<SimEvent> events = simBuilder.buildEvents(data.getEvents());
List<SimInfluenceNode> nodes = simBuilder.buildInfluenceNodes(data.getProject());
// 3. Run Engine
SimContext ctx = simService.runSimulation(units, events, nodes, req.getSteps());
// 4. Convert Result (复用 DeviceDataParser 或 InferenceConverter)
// 保持与前端/推理接口的数据格式兼容
return Result.success(SimResultConverter.toFrames(ctx));
}
}
```
---
## 3. 具体复用点清单 (ProjectServiceImpl -> SimBuilder)
为了加快开发,以下方法建议直接从 `ProjectServiceImpl` 提取到 `SimBuilder` 或工具类 `SimParserUtils` 中:
1. **`injectDeviceSize`**: 解析设备尺寸。
2. **`buildMaterialStaticFromDb`**: 补全物料静态属性。
3. **`parseDeviceStaticsAndInfluences`**: 解析设备静态值和影响关系。
4. **`parseMaterialStaticsAndInfluences`**: 解析物料静态值和影响关系。
5. **`buildValueProviders`**: 解析事件 JSON (attr_changes)。
**注意**:在提取时,需要将原本直接操作 `Map<String, Object> state` 的逻辑,改为构建 `SimUnit``SimInfluenceNode` 对象。
---
## 4. 兼容性与迁移
* **API 兼容**:新接口 `/sim/run` 的返回结构应尽量与原 `/projects/simulation/run` 中的 `frames` 结构保持一致,以便前端无缝切换。
* **分步上线**
1. 先上线 `/sim/run` 供测试使用。
2. 验证无误后,将前端调用切到新接口。
3. 废弃 `ProjectController` 中的相关接口。

137
business-css/api-test.http Normal file
View File

@ -0,0 +1,137 @@
### Algorithms
GET http://localhost:8090/api/algorithms
### Algorithms page
GET http://localhost:8090/api/algorithms/page?current=1&size=10
### Create algorithm
POST http://localhost:8090/api/algorithms
Content-Type: application/json
{
"name": "Sample Algorithm",
"description": "Test description",
"version": "v1.0",
"principle": "Simple principle",
"inputParams": "{}",
"outputParams": "{}"
}
### Update algorithm
PUT http://localhost:8090/api/algorithms/{{algorithmId}}
Content-Type: application/json
{
"name": "Updated Name"
}
### Delete algorithm
DELETE http://localhost:8090/api/algorithms/{{algorithmId}}
### Search algorithm
GET http://localhost:8090/api/algorithms/search?keyword=test
### Devices
POST http://localhost:8090/devices
Content-Type: application/json
{
"projectId": "{{projectId}}",
"code": "D-001",
"type": "pump",
"name": "Main Pump"
}
GET http://localhost:8090/devices/types
GET http://localhost:8090/devices/search?type=pump&name=Pump
### Materials
POST http://localhost:8090/materials
Content-Type: application/json
{
"projectId": "{{projectId}}",
"name": "UO2",
"uConcentration": 1.2,
"uo2Density": 10.5
}
GET http://localhost:8090/materials/search?name=UO2
### Critical Data
POST http://localhost:8090/critical-data
Content-Type: application/json
{
"deviceType": "pump",
"attrState": "{}",
"keffValue": 0.98
}
GET http://localhost:8090/critical-data/device-types
GET http://localhost:8090/critical-data/by-device-type?deviceType=pump
### Critical Data import (adjust file path)
POST http://localhost:8090/critical-data/import
Content-Type: multipart/form-data
file=@E:/path/to/critical-data.xlsx
### Scenarios
POST http://localhost:8090/scenarios
Content-Type: application/json
{
"projectId": "{{projectId}}",
"name": "Scenario A",
"description": "Test scenario"
}
GET http://localhost:8090/scenarios/search?name=Scenario
### Events
POST http://localhost:8090/events
Content-Type: application/json
{
"scenarioId": "{{scenarioId}}",
"deviceId": "{{deviceId}}",
"materialId": "{{materialId}}",
"attrChanges": "{\"flow_rate\": 12.3}",
"triggerTime": 1.5
}
PUT http://localhost:8090/events/{{eventId}}/attr-changes
Content-Type: application/json
{
"attr_changes": {"flow_rate": 20.0}
}
### Scenario Results
POST http://localhost:8090/scenario-results
Content-Type: application/json
{
"scenarioId": "{{scenarioId}}",
"deviceId": "{{deviceId}}",
"step": 1,
"attrState": "{}",
"keffValue": 0.97
}
### Projects
POST http://localhost:8090/projects
Content-Type: application/json
{
"code": "P-001",
"name": "Demo Project",
"description": "Test",
"topology": "{}"
}
GET http://localhost:8090/projects/search?name=Demo

114
business-css/docs/table.txt Normal file
View File

@ -0,0 +1,114 @@
-- ==========================================
-- 1. project 表
-- ==========================================
CREATE TABLE project (
project_id CHAR(36) PRIMARY KEY,
code VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(200) NOT NULL,
description TEXT,
topology LONGTEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ==========================================
-- 2. device 表
-- ==========================================
CREATE TABLE device (
device_id CHAR(36) PRIMARY KEY,
project_id CHAR(36) NOT NULL,
code VARCHAR(50) NOT NULL,
type VARCHAR(50) NOT NULL,
name VARCHAR(100),
size JSON NOT NULL,
volume DOUBLE,
flow_rate DOUBLE,
pulse_velocity DOUBLE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ==========================================
-- 3. material 表
-- ==========================================
CREATE TABLE material (
material_id CHAR(36) PRIMARY KEY,
project_id CHAR(36) NOT NULL,
name VARCHAR(100) NOT NULL,
u_concentration DOUBLE,
uo2_density DOUBLE,
u_enrichment DOUBLE,
pu_concentration DOUBLE,
puo2_density DOUBLE,
pu_isotope DOUBLE,
hno3_acidity DOUBLE,
h2c2o4_concentration DOUBLE,
organic_ratio DOUBLE,
moisture_content DOUBLE,
custom_attrs JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ==========================================
-- 4. critical_data 表
-- ==========================================
CREATE TABLE critical_data (
critical_id CHAR(36) PRIMARY KEY,
device_type VARCHAR(50) NOT NULL,
attr_state JSON NOT NULL,
keff_value DOUBLE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ==========================================
-- 5. scenario 表
-- ==========================================
CREATE TABLE scenario (
scenario_id CHAR(36) PRIMARY KEY,
project_id CHAR(36) NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- ==========================================
-- 6. event 表
-- ==========================================
CREATE TABLE event (
event_id CHAR(36) PRIMARY KEY,
scenario_id CHAR(36) NOT NULL,
device_id CHAR(36),
material_id CHAR(36),
attr_changes JSON NOT NULL,
trigger_time DOUBLE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- ==========================================
-- 7. scenario_result 表
-- ==========================================
CREATE TABLE scenario_result (
scenario_id CHAR(36) NOT NULL,
device_id CHAR(36) NOT NULL,
step INT NOT NULL,
attr_state JSON NOT NULL,
keff_value DOUBLE,
PRIMARY KEY(scenario_id, device_id, step)
);
-- ==========================================
-- 8.algorithm 表
-- ==========================================
CREATE TABLE algorithm (
algorithm_id CHAR(36) PRIMARY KEY COMMENT '算法唯一ID',
name VARCHAR(100) NOT NULL COMMENT '算法名称',
description TEXT COMMENT '算法描述',
version VARCHAR(20) COMMENT '版本号例如v1.0',
principle TEXT COMMENT '算法原理说明',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
input_params JSON COMMENT '调用参数以JSON存储参数名称、类型、默认值等',
output_params JSON COMMENT '输出参数以JSON存储参数名称、类型、说明等'
);

View File

@ -0,0 +1,26 @@
# 分析模拟系统功能规划说明
## 业务功能及目录结构
- business业务功能
- project 项目
- device 设备
- material 物料
- critical_data 临界数据
- scenario 情景
- init_event 始发事件
- scenario_result 情景结果
- algorithm 算法
## 系统管理功能及目录结构
- system通用系统管理
- user 用户
- role 角色
- menu 菜单
- log 日志
- dept 部门
- dict 字典

View File

@ -0,0 +1,81 @@
# 临界事故情景分析模拟系统方案
本文档定义业务模块 `business-css` 的目标、架构、数据模型、接口设计与实施计划。
## 目标
- 支撑对“临界事故”相关情景的建模、参数化配置与快速模拟评估。
- 与 `framework` 项目共享通用能力(鉴权、缓存、日志、通用工具、数据访问等)。
- 提供 REST 接口用于前端或第三方系统的集成。
## 总体架构
- 应用Spring BootJDK 17模块名 `business-css`
- 依赖:`com.yfd:platform:1.0:jar:plain` 引入框架公共模块。
- 数据存储MySQL默认 `yfd_platform`,可按环境切换)。
- 接口:按 `REST + JSON` 约定OpenAPI 自动文档可选。
## 核心域模型(初版)
- `Scenario`:事故情景(名称、类型、参数定义、风险等级)。
- `IncidentFactor`:影响因子(指标、阈值、权重、取值范围)。
- `SimulationRequest`:一次模拟请求(情景名、输入参数)。
- `SimulationResult`:模拟输出(状态、关键指标、结论摘要、时间戳)。
## 关键能力
- 参数化建模:基于影响因子提出可配置的情景模板。
- 指标计算:利用 `framework` 的通用工具库(如缓存、时间序列、统计)实现。
- 场景评估:形成风险等级、预警阈值与应对建议。
- 结果持久化:保存模拟结果用于追踪与复盘(后续版本)。
## 接口草图
- `GET /api/simulation/ping`:服务健康检测。
- `POST /api/simulation/run`:执行一次模拟,输入 `SimulationRequest`,输出 `SimulationResult`
- 后续:`/api/scenario/*` 用于情景模板的增删改查;`/api/factor/*` 用于影响因子的管理。
## 数据表(建议)
- `css_scenario`:情景基础信息表。
- `css_factor`:影响因子表。
- `css_simulation_log`:模拟记录表(包含输入与输出摘要)。
## 与框架的集成
- 鉴权与用户上下文:复用 `framework` 的安全模块。
- 通用组件缓存Caffeine/Redis、日志、异常统一处理。
- 数据访问:沿用 MyBatis/MyBatis-Plus 与统一的分页、审计字段策略。
## 版本与发布
- 业务模块版本:`1.0-SNAPSHOT` 起步;与框架 `1.0` 对齐。
- 构建:在仓库根 `pom` 中作为模块聚合;可单独使用 `-pl business-css` 构建或运行。
## 渐进式实施计划
1. 基础骨架搭建(已完成:应用入口、控制器、服务接口与模型)。
2. 定义情景与影响因子数据模型,建立数据库表结构与 Mapper。
3. 接入框架公共工具,完善指标计算与风险评估逻辑。
4. 增加 OpenAPI 文档与前端集成接口规范。
5. 引入结果持久化与查询报表。
## 调试与开发指南
### Maven 命令行启动 + 远程调试
如果您偏好使用命令行启动,或者需要模拟特定的 Maven 环境,可采用以下方式:
1. **启动应用**
在终端中运行以下命令,该命令会以调试模式启动应用并监听 `5005` 端口(`suspend=n` 表示不等待调试器连接直接启动,如需等待可改为 `y`)。
> 注意PowerShell 中需要使用单引号包裹 JVM 参数,防止解析错误。
```bash
mvn -DskipTests spring-boot:run -pl business-css '-Dspring-boot.run.jvmArguments=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'
```
2. **附加调试器**
应用启动后,转到 IDE 的 "运行和调试" (Run and Debug) 面板,选择 **"Attach to Remote Program5005"** 配置(需确保 `.vscode/launch.json` 中已存在相应配置然后点击运行。IDE 将连接到正在运行的 Maven 进程,即可开始断点调试。
## 运维与配置
- 端口默认 `8082`,环境覆盖通过 `application.yml` 与外部化配置。
- 数据库连接按环境注入dev/test/prod
- 日志级别默认 `info`,业务包 `com.yfd` 可设为 `debug`
## 安全与合规
- 按角色访问控制(复用框架安全),仅授权用户可触发模拟。
- 输入校验与审计日志记录,避免非法参数导致资源消耗异常。
---
本文为初版方案,后续将结合具体需求与数据约束逐步细化与调整。

View File

@ -0,0 +1 @@
ALTER TABLE material MODIFY COLUMN h2c2o4_concentration DECIMAL(20, 8);

View File

@ -0,0 +1,15 @@
# http://editorconfig.org
root = true
[*] # 表示所有文件适用
charset = utf-8 # 设置文件字符集为 utf-8
indent_style = space # 缩进风格tab | space
indent_size = 2 # 缩进大小
end_of_line = lf # 控制换行类型(lf | cr | crlf)
trim_trailing_whitespace = true # 去除行首的任意空白字符
insert_final_newline = true # 始终在文件末尾插入一个新行
[*.md] # 表示仅 md 文件适用以下规则
max_line_length = off
trim_trailing_whitespace = false

View File

@ -0,0 +1,10 @@
## 开发环境
# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV='development'
VITE_APP_TITLE = '临界事故情景分析模拟系统'
VITE_APP_PORT = 3000
VITE_APP_BASE_API = '/dev-api'
VITE_APP_BASE_HTTP = 'http://localhost:3000'
VITE_APP_WS_API = 'http://192.168.1.76:8090'

View File

@ -0,0 +1,8 @@
## 生产环境
NODE_ENV='production'
VITE_APP_TITLE = 'NewFrameWork2023-WEB'
VITE_APP_PORT = 3000
VITE_APP_BASE_API = '/prod-api'
VITE_APP_BASE_HTTP = 'http://localhost:3000'
VITE_APP_WS_API = 'http://192.168.1.76:8090'

View File

@ -0,0 +1,6 @@
## 模拟环境
NODE_ENV='staging'
VITE_APP_TITLE = 'NewFrameWork2023-WEB'
VITE_APP_PORT = 3000
VITE_APP_BASE_API = '/prod--api'

View File

@ -0,0 +1,16 @@
*.sh
node_modules
*.md
*.woff
*.ttf
.vscode
.idea
dist
/public
/docs
.husky
.local
/bin
.eslintrc.js
prettier.config.js
src/assets

View File

@ -0,0 +1,32 @@
module.exports = {
env: {
browser: true,
es2021: true,
node: true
},
globals: {
defineProps: 'readonly',
defineEmits: 'readonly',
defineExpose: 'readonly',
DialogType: "readonly",
OptionType: "readonly",
},
parser: 'vue-eslint-parser',
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended'
],
parserOptions: {
ecmaVersion: 'latest',
parser: '@typescript-eslint/parser',
sourceType: 'module'
},
plugins: ['vue', '@typescript-eslint'],
rules: {
'vue/multi-word-component-names': 'off',
'@typescript-eslint/no-empty-function': 'off', // 关闭空方法检查
'@typescript-eslint/no-explicit-any': 'off', // 关闭any类型的警告
'vue/no-v-model-argument': 'off'
}
};

17
business-css/frontend/.gitignore vendored Normal file
View File

@ -0,0 +1,17 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.local
package-lock.json
yarn.lock

View File

@ -0,0 +1,3 @@
registry=https://registry.npmjs.org
fetch-retries=5
strict-peer-dependencies=false

View File

@ -0,0 +1,9 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

View File

@ -0,0 +1,36 @@
/**
* 代码格式化配置
*/
module.exports = {
// 指定每个缩进级别的空格数
tabWidth: 2,
// 使用制表符而不是空格缩进行
useTabs: false,
// 在语句末尾打印分号
semi: true,
// 使用单引号而不是双引号
singleQuote: true,
// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
quoteProps: 'as-needed',
// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>"默认none
trailingComma: 'none',
// 在对象文字中的括号之间打印空格
bracketSpacing: true,
// 在单独的箭头函数参数周围包括括号 always(x) => x \ avoidx => x
arrowParens: 'avoid',
// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
rangeStart: 0,
rangeEnd: Infinity,
// 指定要使用的解析器,不需要写文件开头的 @prettier
requirePragma: false,
// 不需要自动在文件开头插入 @prettier
insertPragma: false,
// 换行设置 always\never\preserve
proseWrap: 'never',
// 指定HTML文件的全局空格敏感度 css\strict\ignore
htmlWhitespaceSensitivity: 'css',
// Vue文件脚本和样式标签缩进
vueIndentScriptAndStyle: false,
// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
endOfLine: 'lf'
};

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 有来开源组织
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,26 @@
module.exports = {
// 继承的规则
extends: ['@commitlint/config-conventional'],
// 定义规则类型
rules: {
// type 类型定义,表示 git 提交的 type 必须在以下类型范围内
'type-enum': [
2,
'always',
[
'feat', // 新功能 feature
'fix', // 修复 bug
'docs', // 文档注释
'style', // 代码格式(不影响代码运行的变动)
'refactor', // 重构(既不增加新功能也不是修复bug)
'perf', // 性能优化
'test', // 增加测试
'chore', // 构建过程或辅助工具的变动
'revert', // 回退
'build' // 打包
]
],
// subject 大小写不做校验
'subject-case': [0]
}
};

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="NewFrameWork2023-WEB" />
<meta name="keywords" content="NewFrameWork2023-WEB" />
<title>临界事故情景分析模拟系统</title>
<script>
window.global = window;
</script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

Binary file not shown.

View File

@ -0,0 +1,44 @@
#!/usr/bin/env bash
(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
NODE_EXE="$basedir/node.exe"
if ! [ -x "$NODE_EXE" ]; then
NODE_EXE="$basedir/node"
fi
if ! [ -x "$NODE_EXE" ]; then
NODE_EXE=node
fi
# this path is passed to node.exe, so it needs to match whatever
# kind of paths Node.js thinks it's using, typically win32 paths.
CLI_BASEDIR="$("$NODE_EXE" -p 'require("path").dirname(process.execPath)')"
NPM_CLI_JS="$CLI_BASEDIR/node_modules/npm/bin/npm-cli.js"
NPM_PREFIX=`"$NODE_EXE" "$NPM_CLI_JS" prefix -g`
if [ $? -ne 0 ]; then
# if this didn't work, then everything else below will fail
echo "Could not determine Node.js install directory" >&2
exit 1
fi
NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js"
# a path that will fail -f test on any posix bash
NPM_WSL_PATH="/.."
# WSL can run Windows binaries, so we have to give it the win32 path
# however, WSL bash tests against posix paths, so we need to construct that
# to know if npm is installed globally.
if [ `uname` = 'Linux' ] && type wslpath &>/dev/null ; then
NPM_WSL_PATH=`wslpath "$NPM_PREFIX_NPM_CLI_JS"`
fi
if [ -f "$NPM_PREFIX_NPM_CLI_JS" ] || [ -f "$NPM_WSL_PATH" ]; then
NPM_CLI_JS="$NPM_PREFIX_NPM_CLI_JS"
fi
"$NODE_EXE" "$NPM_CLI_JS" "$@"

View File

@ -0,0 +1,208 @@
{
root: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend',
registry: 'https://registry.npmmirror.com',
pkgs: [],
production: false,
cacheStrict: false,
cacheDir: 'C:\\Users\\13910\\.npminstall_tarball',
env: {
npm_config_registry: 'https://registry.npmmirror.com',
npm_config_argv: '{"remain":[],"cooked":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\13910\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com"],"original":["--fix-bug-versions","--china","--userconfig=C:\\\\Users\\\\13910\\\\.cnpmrc","--disturl=https://cdn.npmmirror.com/binaries/node","--registry=https://registry.npmmirror.com"]}',
npm_config_user_agent: 'npminstall/7.9.0 npm/? node/v20.19.2 win32 x64',
npm_config_cache: 'C:\\Users\\13910\\.npminstall_tarball',
NODE: 'C:\\Program Files\\nodejs\\node.exe',
npm_node_execpath: 'C:\\Program Files\\nodejs\\node.exe',
npm_execpath: 'C:\\Users\\13910\\AppData\\Roaming\\npm\\node_modules\\cnpm\\node_modules\\npminstall\\bin\\install.js',
npm_config_userconfig: 'C:\\Users\\13910\\.cnpmrc',
npm_config_disturl: 'https://cdn.npmmirror.com/binaries/node',
npm_config_r: 'https://registry.npmmirror.com',
COREPACK_NPM_REGISTRY: 'https://registry.npmmirror.com',
EDGEDRIVER_CDNURL: 'https://npmmirror.com/mirrors/edgedriver',
NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node',
NVM_NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node',
PHANTOMJS_CDNURL: 'https://cdn.npmmirror.com/binaries/phantomjs',
CHROMEDRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/chromedriver',
OPERADRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/operadriver',
CYPRESS_DOWNLOAD_PATH_TEMPLATE: 'https://cdn.npmmirror.com/binaries/cypress/${version}/${platform}-${arch}/cypress.zip',
ELECTRON_MIRROR: 'https://cdn.npmmirror.com/binaries/electron/',
ELECTRON_BUILDER_BINARIES_MIRROR: 'https://cdn.npmmirror.com/binaries/electron-builder-binaries/',
SASS_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-sass',
SWC_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-swc',
NWJS_URLBASE: 'https://cdn.npmmirror.com/binaries/nwjs/v',
PUPPETEER_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_CHROME_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_CHROME_HEADLESS_SHELL_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PLAYWRIGHT_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/playwright',
SENTRYCLI_CDNURL: 'https://cdn.npmmirror.com/binaries/sentry-cli',
SAUCECTL_INSTALL_BINARY_MIRROR: 'https://cdn.npmmirror.com/binaries/saucectl',
RE2_DOWNLOAD_MIRROR: 'https://cdn.npmmirror.com/binaries/node-re2',
RE2_DOWNLOAD_SKIP_PATH: 'true',
PRISMA_ENGINES_MIRROR: 'https://cdn.npmmirror.com/binaries/prisma',
npm_config_better_sqlite3_binary_host: 'https://cdn.npmmirror.com/binaries/better-sqlite3',
npm_config_keytar_binary_host: 'https://cdn.npmmirror.com/binaries/keytar',
npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp',
npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips',
npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs',
npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl',
RIPGREP_PREBUILT_BINARIES_MIRROR: 'https://registry.npmmirror.com/-/binary/ripgrep-prebuilt',
npm_rootpath: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend',
INIT_CWD: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend'
},
binaryMirrors: {
ENVS: {
COREPACK_NPM_REGISTRY: 'https://registry.npmmirror.com',
EDGEDRIVER_CDNURL: 'https://npmmirror.com/mirrors/edgedriver',
NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node',
NVM_NODEJS_ORG_MIRROR: 'https://cdn.npmmirror.com/binaries/node',
PHANTOMJS_CDNURL: 'https://cdn.npmmirror.com/binaries/phantomjs',
CHROMEDRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/chromedriver',
OPERADRIVER_CDNURL: 'https://cdn.npmmirror.com/binaries/operadriver',
CYPRESS_DOWNLOAD_PATH_TEMPLATE: 'https://cdn.npmmirror.com/binaries/cypress/${version}/${platform}-${arch}/cypress.zip',
ELECTRON_MIRROR: 'https://cdn.npmmirror.com/binaries/electron/',
ELECTRON_BUILDER_BINARIES_MIRROR: 'https://cdn.npmmirror.com/binaries/electron-builder-binaries/',
SASS_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-sass',
SWC_BINARY_SITE: 'https://cdn.npmmirror.com/binaries/node-swc',
NWJS_URLBASE: 'https://cdn.npmmirror.com/binaries/nwjs/v',
PUPPETEER_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_CHROME_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PUPPETEER_CHROME_HEADLESS_SHELL_DOWNLOAD_BASE_URL: 'https://cdn.npmmirror.com/binaries/chrome-for-testing',
PLAYWRIGHT_DOWNLOAD_HOST: 'https://cdn.npmmirror.com/binaries/playwright',
SENTRYCLI_CDNURL: 'https://cdn.npmmirror.com/binaries/sentry-cli',
SAUCECTL_INSTALL_BINARY_MIRROR: 'https://cdn.npmmirror.com/binaries/saucectl',
RE2_DOWNLOAD_MIRROR: 'https://cdn.npmmirror.com/binaries/node-re2',
RE2_DOWNLOAD_SKIP_PATH: 'true',
PRISMA_ENGINES_MIRROR: 'https://cdn.npmmirror.com/binaries/prisma',
npm_config_better_sqlite3_binary_host: 'https://cdn.npmmirror.com/binaries/better-sqlite3',
npm_config_keytar_binary_host: 'https://cdn.npmmirror.com/binaries/keytar',
npm_config_sharp_binary_host: 'https://cdn.npmmirror.com/binaries/sharp',
npm_config_sharp_libvips_binary_host: 'https://cdn.npmmirror.com/binaries/sharp-libvips',
npm_config_robotjs_binary_host: 'https://cdn.npmmirror.com/binaries/robotjs',
npm_config_gl_binary_host: 'https://cdn.npmmirror.com/binaries/gl',
RIPGREP_PREBUILT_BINARIES_MIRROR: 'https://registry.npmmirror.com/-/binary/ripgrep-prebuilt'
},
'@ali/s2': { host: 'https://cdn.npmmirror.com/binaries/looksgood-s2' },
sharp: { replaceHostFiles: [Array], replaceHostMap: [Object] },
'@tensorflow/tfjs-node': {
replaceHostFiles: [Array],
replaceHostRegExpMap: [Object],
replaceHostMap: [Object]
},
cypress: {
host: 'https://cdn.npmmirror.com/binaries/cypress',
newPlatforms: [Object]
},
'utf-8-validate': {
host: 'https://cdn.npmmirror.com/binaries/utf-8-validate/v{version}'
},
xprofiler: {
remote_path: './xprofiler/v{version}/',
host: 'https://cdn.npmmirror.com/binaries'
},
leveldown: { host: 'https://cdn.npmmirror.com/binaries/leveldown/v{version}' },
couchbase: { host: 'https://cdn.npmmirror.com/binaries/couchbase/v{version}' },
gl: { host: 'https://cdn.npmmirror.com/binaries/gl/v{version}' },
sqlite3: {
host: 'https://cdn.npmmirror.com/binaries/sqlite3',
remote_path: 'v{version}'
},
'@journeyapps/sqlcipher': { host: 'https://cdn.npmmirror.com/binaries' },
grpc: {
host: 'https://cdn.npmmirror.com/binaries',
remote_path: '{name}/v{version}'
},
'grpc-tools': { host: 'https://cdn.npmmirror.com/binaries' },
wrtc: {
host: 'https://cdn.npmmirror.com/binaries',
remote_path: '{name}/v{version}'
},
fsevents: { host: 'https://cdn.npmmirror.com/binaries/fsevents' },
nodejieba: { host: 'https://cdn.npmmirror.com/binaries/nodejieba' },
canvas: {
host: 'https://cdn.npmmirror.com/binaries/canvas',
remote_path: 'v{version}'
},
'skia-canvas': { host: 'https://cdn.npmmirror.com/binaries/skia-canvas' },
'flow-bin': {
replaceHost: 'https://github.com/facebook/flow/releases/download/v',
host: 'https://cdn.npmmirror.com/binaries/flow/v'
},
'jpegtran-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/jpegtran-bin'
},
'cwebp-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/cwebp-bin'
},
'zopflipng-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/zopflipng-bin'
},
'optipng-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/optipng-bin'
},
mozjpeg: {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/mozjpeg-bin'
},
gifsicle: {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/gifsicle-bin'
},
'pngquant-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/pngquant-bin',
replaceHostMap: [Object]
},
'pngcrush-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/pngcrush-bin'
},
'jpeg-recompress-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/jpeg-recompress-bin'
},
'advpng-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/advpng-bin'
},
'pngout-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/pngout-bin'
},
'jpegoptim-bin': {
replaceHost: [Array],
host: 'https://cdn.npmmirror.com/binaries/jpegoptim-bin'
},
argon2: { host: 'https://cdn.npmmirror.com/binaries/argon2' },
'ali-zeromq': { host: 'https://cdn.npmmirror.com/binaries/ali-zeromq' },
'ali-usb_ctl': { host: 'https://cdn.npmmirror.com/binaries/ali-usb_ctl' },
'gdal-async': { host: 'https://cdn.npmmirror.com/binaries/node-gdal-async' },
'libpg-query': { host: 'https://cdn.npmmirror.com/binaries' }
},
forbiddenLicenses: null,
flatten: false,
proxy: undefined,
prune: false,
disableFallbackStore: false,
workspacesMap: Map(0) {},
enableWorkspace: false,
workspaceRoot: 'D:\\Trae_space\\ProjectFrameWork2025\\app\\frontend',
isWorkspaceRoot: true,
isWorkspacePackage: false,
offline: false,
strictSSL: true,
ignoreScripts: false,
foregroundScripts: false,
ignoreOptionalDependencies: false,
detail: false,
forceLinkLatest: false,
trace: false,
engineStrict: false,
registryOnly: false,
client: false,
autoFixVersion: [Function: autoFixVersion]
}

View File

@ -0,0 +1,71 @@
{
"name": "NewFrameWork2023-WEB",
"version": "1.2.0",
"scripts": {
"dev": "vite serve --mode development",
"build:prod": "vue-tsc --noEmit && vite build --mode production",
"build:mvn": "vite build --mode production",
"serve": "vite preview",
"lint": "eslint src/**/*.{ts,js,vue} --fix",
"prettier": "prettier --write ."
},
"dependencies": {
"@antv/g6": "^5.0.51",
"@antv/x6": "^3.1.4",
"@element-plus/icons-vue": "^2.0.10",
"@types/js-cookie": "^3.0.2",
"@vueuse/core": "^9.1.1",
"@wangeditor/editor": "^5.0.0",
"@wangeditor/editor-for-vue": "^5.1.10",
"axios": "^1.2.0",
"better-scroll": "^2.4.2",
"default-passive-events": "^2.0.0",
"echarts": "^5.2.2",
"element-plus": "^2.2.27",
"insert-css": "^2.0.0",
"js-base64": "^3.7.5",
"js-cookie": "^3.0.1",
"jsencrypt": "^3.3.2",
"nprogress": "^0.2.0",
"path-browserify": "^1.0.1",
"path-to-regexp": "^6.2.0",
"pinia": "^2.0.12",
"screenfull": "^6.0.0",
"sockjs-client": "^1.6.1",
"sortablejs": "^1.14.0",
"stompjs": "^2.3.3",
"vue": "^3.2.40",
"vue-i18n": "^9.1.9",
"vue-router": "^4.1.6",
"vuedraggable": "^2.24.3",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^16.2.3",
"@commitlint/config-conventional": "^16.2.1",
"@types/node": "^16.11.7",
"@types/nprogress": "^0.2.0",
"@types/path-browserify": "^1.0.0",
"@typescript-eslint/eslint-plugin": "^5.19.0",
"@typescript-eslint/parser": "^5.19.0",
"@vitejs/plugin-vue": "^4.0.0",
"autoprefixer": "^10.4.13",
"eslint": "^8.14.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.6.0",
"fast-glob": "^3.2.11",
"husky": "^7.0.4",
"postcss": "^8.4.20",
"prettier": "^2.6.2",
"sass": "^1.53.0",
"tailwindcss": "^3.2.4",
"typescript": "^4.7.4",
"vite": "^4.0.3",
"vite-plugin-svg-icons": "^2.0.1",
"vue-tsc": "^0.35.0"
},
"repository": "https://gitee.com/youlaiorg/vue3-element-admin.git",
"author": "有来开源组织",
"license": "MIT"
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
这里放置前端项目的readme文件

View File

@ -0,0 +1,11 @@
<script setup lang="ts">
import { ElConfigProvider } from 'element-plus';
import { useAppStore } from '@/store/modules/app';
const appStore = useAppStore();
</script>
<template>
<el-config-provider :locale="appStore.locale" :size="appStore.size">
<router-view />
</el-config-provider>
</template>

View File

@ -0,0 +1,45 @@
import request from '@/utils/request';
//获取所有项目列表
export function trainAlgorithmsPage(queryParams:any){
return request({
url: '/train/list' ,
method: 'get',
params:queryParams
});
}
//新增项目
export function addAlgorithms(data:any){
return request({
url:'/train/submit' ,
method: 'Post',
data: data
});
}
export function trainPublish(data:any){
return request({
url:'/train/publish' ,
method: 'Post',
data: data
});
}
//单个删除项目
export function deleteAlgorithms (queryParams:any){
return request({
url:'/train/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
export function trainStatus(taskId:any){
return request({
url: '/train/status/'+taskId ,
method: 'get'
});
}

View File

@ -0,0 +1,36 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { LoginData, TokenResult, VerifyCode } from './types';
/**
*
* @param data {LoginForm}
* @returns
*/
export function loginApi(data: LoginData): AxiosPromise<TokenResult> {
return request({
url: '/user/login',
method: 'post',
params: data
});
}
/**
*
*/
export function logoutApi() {
return request({
url: '/user/logout',
method: 'post'
});
}
/**
*
*/
export function getCaptcha(): AxiosPromise<VerifyCode> {
return request({
url: '/user/code?t=' + new Date().getTime().toString(),
method: 'get'
});
}

View File

@ -0,0 +1,34 @@
/**
*
*/
export interface LoginData {
username: string;
password: string;
code: string;
uuid: string;
/**
* Code
*/
//verifyCode: string;
/**
* Code服务端缓存key(UUID)
*/
// verifyCodeKey: string;
}
/**
* Token响应类型
*/
export interface TokenResult {
token: string;
refreshToken: string;
expires: number;
}
/**
*
*/
export interface VerifyCode {
verifyCodeImg: string;
verifyCodeKey: string;
}

View File

@ -0,0 +1,60 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchAlgorithmsPage(queryParams:any){
return request({
url: '/algorithms/search' ,
method: 'get',
params:queryParams
});
}
//新增项目
export function addAlgorithms(data:any){
return request({
url:'/algorithms' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateAlgorithms (queryParams:any){
return request({
url:'/algorithms' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteAlgorithms (queryParams:any){
return request({
url:'/algorithms/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchAlgorithms (queryParams:any){
return request({
url:'/algorithms',
method: 'delete',
data: queryParams
});
}
export function algorithmsType(type:any){
return request({
url: '/algorithms/type/'+type ,
method: 'get'
});
}

View File

@ -0,0 +1,39 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchAlgorithmsModelPage(queryParams:any){
return request({
url: '/algorithm-models/search' ,
method: 'get',
params:queryParams
});
}
// //激活
export function algorithmModels(params:any){
return request({
url:'/algorithm-models/activate' ,
method: 'Post',
params: params
});
}
//单个删除项目
export function deleteAlgorithmModels (queryParams:any){
return request({
url:'/algorithm-models/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchAlgorithmModels (queryParams:any){
return request({
url:'/algorithm-models',
method: 'delete',
data: queryParams
});
}

View File

@ -0,0 +1,50 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchCriticalDataPage(queryParams:any){
return request({
url: '/critical-data/by-device-type' ,
method: 'get',
params:queryParams
});
}
//新增项目
export function addCriticalData(data:any){
return request({
url:'/critical-data' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateCriticalData (queryParams:any){
return request({
url:'/critical-data' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteCriticalData (queryParams:any){
return request({
url:'/critical-data/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchCriticalData (queryParams:any){
return request({
url:'/critical-data',
method: 'delete',
data: queryParams
});
}

View File

@ -0,0 +1,50 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchDevicesPage(queryParams:any){
return request({
url: '/devices/search' ,
method: 'get',
params:queryParams
});
}
//新增项目
export function addDevices(data:any){
return request({
url:'/devices' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateDevices (queryParams:any){
return request({
url:'/devices' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteDevices (queryParams:any){
return request({
url:'/devices/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchDevices (queryParams:any){
return request({
url:'/devices',
method: 'delete',
data: queryParams
});
}

View File

@ -0,0 +1,61 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchMaterialsPage(queryParams:any){
return request({
url: '/materials/search' ,
method: 'get',
params:queryParams
});
}
//拓扑图新增或更新项目
export function saveOrUpdate(data:any){
return request({
url:'/materials/saveOrUpdate' ,
method: 'Post',
data: data
});
}
//新增项目
export function addMaterials(data:any){
return request({
url:'/materials' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateMaterials (queryParams:any){
return request({
url:'/materials' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteMaterials (queryParams:any){
return request({
url:'/materials/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchMaterials (queryParams:any){
return request({
url:'/materials',
method: 'delete',
data: queryParams
});
}

View File

@ -0,0 +1,50 @@
import request from '@/utils/request';
// //获取所有项目列表
export function searchEventsByScenarioId(queryParams:any){
return request({
url: '/events/by-scenario' ,
method: 'get',
params:queryParams
});
}
//批量新增或修改事件
export function eventsBatchSave(data:any){
return request({
url:'/events/batchSave' ,
method: 'Post',
data: data
});
}
// //更新项目信息
// export function updateScenarios(queryParams:any){
// return request({
// url:'/events' ,
// method: 'PUT',
// data: queryParams
// });
// }
// //单个删除项目
// export function deleteScenarios(queryParams:any){
// return request({
// url:'/events/'+queryParams.id ,
// method: 'delete'
// // params: queryParams
// });
// }
// //多选删除项目
// export function deleteBatchScenarios(queryParams:any){
// return request({
// url:'/events',
// method: 'delete',
// data: queryParams
// });
// }

View File

@ -0,0 +1,134 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchProjectsLsit(queryParams:any){
return request({
url: '/projects/search' ,
method: 'get',
params:queryParams
});
}
export function projectsById(queryParams:any){
return request({
url: '/projects/'+ queryParams.projectId ,
method: 'get'
});
}
//新增项目
export function addProjects(data:any){
return request({
url:'/projects' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateProjects (queryParams:any){
return request({
url:'/projects' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteProjects (queryParams:any){
return request({
url:'/projects/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchProjects (queryParams:any){
return request({
url:'/projects',
method: 'delete',
data: queryParams
});
}
//单个删除项目
export function visibilityProjects (queryParams:any){
return request({
url:'/projects/'+queryParams.projectId+'/visibility' ,
method: 'put',
data: queryParams
});
}
export function topologyDevicesLsit(queryParams:any){
return request({
url: `/projects/${queryParams.id}/topology/devices` ,
method: 'get',
params:queryParams
});
}
//初始化项目模拟数据
export function simRun(data:any){
return request({
url:'/sim/run' ,
method: 'Post',
data:data
});
}
//初始化项目模拟数据
export function simulationInit(queryParams:any){
return request({
url:'/projects/simulation/init' ,
method: 'Post',
params:queryParams
});
}
// 运行项目模拟
export function simulationRun(projectId:string,scenarioId:string, data:any){
return request({
url:'/projects/simulation/run?projectId='+projectId+'&scenarioId='+scenarioId ,
method: 'Post',
data: data
});
}
export function exportAllExports(queryParams: any) {
return request({
url: '/projects/exportAllExports',
method: 'get',
params: queryParams,
responseType: 'arraybuffer'
});
}
export function exportProject(queryParams: any) {
return request({
url: '/projects/'+queryParams.projectId+'/exportProject',
method: 'get',
params: queryParams,
responseType: 'arraybuffer'
});
}
//导入项目
export function importProject(data:any){
return request({
url:'/projects/importProject' ,
method: 'Post',
data: data
});
}

View File

@ -0,0 +1,84 @@
import request from '@/utils/request';
//获取所有项目列表
export function searchScenariosLsit(queryParams:any){
return request({
url: '/scenarios/by-project' ,
method: 'get',
params:queryParams
});
}
//新增项目
export function addScenarios(data:any){
return request({
url:'/scenarios/createAndReturn' ,
method: 'Post',
data: data
});
}
//更新项目信息
export function updateScenarios(queryParams:any){
return request({
url:'/scenarios' ,
method: 'PUT',
data: queryParams
});
}
//单个删除项目
export function deleteScenarios(queryParams:any){
return request({
url:'/scenarios/'+queryParams.id ,
method: 'delete'
// params: queryParams
});
}
//多选删除项目
export function deleteBatchScenarios(queryParams:any){
return request({
url:'/scenarios',
method: 'delete',
data: queryParams
});
}
//获取所有项目列表
export function getActiveAlgorithms(){
return request({
url: '/algorithms/getActiveAlgorithms' ,
method: 'get'
});
}
//获取所有项目列表
export function getByScenario(queryParams:any){
return request({
url: '/scenario-results/by-scenario' ,
method: 'get',
params: queryParams
});
}
// 导出全部结果
export function exportAllExports(scenarioId:any,deviceId:any){
let url = '/scenario-results/export/by-scenario?scenarioId='+scenarioId
if(deviceId != null){
url = '/scenario-results/export/by-scenario?scenarioId='+scenarioId + '&deviceId='+deviceId
}
return request({
url: url ,
method: 'get',
responseType: 'arraybuffer'
});
}

View File

@ -0,0 +1,139 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { DeptForm, DeptQuery, Dept } from './types';
//获取组织架构
export function getTreelist(queryParams:any) {
return request({
url: '/system/organization/getOrgTree',
method: 'POST',
params: queryParams
});
}
//新增企业或部门
export function addTreelist(queryParams:any) {
return request({
url: '/system/organization/addOrg',
method: 'POST',
data: queryParams
});
}
// 修改企业部门
export function updataTreelist(queryParams:any) {
return request({
url: '/system/organization/updateById',
method: 'POST',
data: queryParams
});
}
//删除企业
export function delTreelist(queryParams:any) {
return request({
url: '/system/organization/deleteById',
method: 'POST',
params: queryParams
});
}
//获取部门信息
export function gettableData(queryParams:any) {
return request({
url: '/system/organization/getOrganizationById',
method: 'POST',
params: queryParams
});
}
//部门是否有效
export function deptIsVaild(queryParams:any) {
return request({
url: '/system/organization/setIsValid',
method: 'POST',
params: queryParams
});
}
//修改部门信息
export function reviseDepartment(queryParams:any) {
return request({
url: '/system/organization/updateById',
method: 'POST',
data: queryParams
});
}
/**
*
*
* @param queryParams
*/
export function listDepartments(queryParams?: DeptQuery): AxiosPromise<Dept[]> {
return request({
url: '/api/v1/dept',
method: 'get',
params: queryParams
});
}
/**
*
*/
export function listDeptOptions(): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/dept/options',
method: 'get'
});
}
/**
*
*
* @param id
*/
export function getDeptForm(id: string): AxiosPromise<DeptForm> {
return request({
url: '/api/v1/dept/' + id + '/form',
method: 'get'
});
}
/**
*
*
* @param data
*/
export function addDept(data: DeptForm) {
return request({
url: '/api/v1/dept',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateDept(id: string, data: DeptForm) {
return request({
url: '/api/v1/dept/' + id,
method: 'put',
data: data
});
}
/**
*
*
* @param ids
*/
export function deleteDept(ids: string) {
return request({
url: '/api/v1/dept/' + ids,
method: 'delete'
});
}

View File

@ -0,0 +1,34 @@
/**
*
*/
export interface DeptQuery {
keywords: string | undefined;
status: number | undefined;
}
/**
*
*/
export interface Dept {
id: string;
name: string;
parentId: string;
treePath: string;
sort: number;
status: number;
leader?: string;
mobile?: string;
email?: string;
children: Dept[];
}
/**
*
*/
export interface DeptForm {
id?: string;
parentId: string;
name: string;
sort: number;
status: number;
}

View File

@ -0,0 +1,242 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import {
DictQuery,
DictPageResult,
DictTypeForm,
DictItemQuery,
DictItemPageResult,
DictItemForm
} from './types';
// 查询字典
export function getTreelist(params:any) {
return request({
url: '/system/dictionary/dictList',
method: 'get',
params: params
});
}
// 新增字典
export function addDict(params:any) {
return request({
url: '/system/dictionary/addDict',
method: 'post',
data: params
});
}
// 修改字典
export function updateDict(params:any) {
return request({
url: '/system/dictionary/updateDict',
method: 'post',
data: params
});
}
// 删除字典
export function deleteById(params:any) {
return request({
url: '/system/dictionary/deleteById',
method: 'post',
params: params
});
}
// 字典排序
export function changeDictOrder(params:any) {
return request({
url: '/system/dictionary/changeDictOrder',
method: 'post',
params: params
});
}
// 查询字典项
export function getDictItemById(params:any) {
return request({
url: '/system/dictionaryItems/page',
method: 'get',
params: params
});
}
// 新增字典项
export function addDictionaryItem(params:any) {
return request({
url: '/system/dictionaryItems/addDictionaryItem',
method: 'post',
data: params
});
}
// 修改字典项
export function updateDictionaryItem(params:any) {
return request({
url: '/system/dictionaryItems/updateDictionaryItem',
method: 'post',
data: params
});
}
// 删除字典项
export function deleteDictItemById(params:any) {
return request({
url: '/system/dictionaryItems/deleteDictItemById',
method: 'post',
params: params
});
}
// 批量删除字典项
export function deleteDictItemByIds(params:any) {
return request({
url: '/system/dictionaryItems/deleteDictItemByIds',
method: 'post',
params: params
});
}
// 字典项排序
export function changeItemOrder(params:any) {
return request({
url: '/system/dictionaryItems/changeItemOrder',
method: 'post',
params: params
});
}
/**
*
*
* @param queryParams
*/
export function listDictTypePages(
queryParams: DictQuery
): AxiosPromise<DictPageResult> {
return request({
url: '/api/v1/dict/types/pages',
method: 'get',
params: queryParams
});
}
/**
*
*
* @param id
*/
export function getDictTypeForm(id: number): AxiosPromise<DictTypeForm> {
return request({
url: '/api/v1/dict/types/' + id + '/form',
method: 'get'
});
}
/**
*
*
* @param data
*/
export function addDictType(data: DictTypeForm) {
return request({
url: '/api/v1/dict/types',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateDictType(id: number, data: DictTypeForm) {
return request({
url: '/api/v1/dict/types/' + id,
method: 'put',
data: data
});
}
/**
*
*/
export function deleteDictTypes(ids: string) {
return request({
url: '/api/v1/dict/types/' + ids,
method: 'delete'
});
}
/**
*
*
* @param typeCode
*/
export function getDictionaries(typeCode: string): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/dict/types/' + typeCode + '/items',
method: 'get'
});
}
/**
*
*/
export function listDictItemPages(
queryParams: DictItemQuery
): AxiosPromise<DictItemPageResult> {
return request({
url: '/api/v1/dict/items/pages',
method: 'get',
params: queryParams
});
}
/**
*
*
* @param id
*/
export function getDictItemData(id: number): AxiosPromise<DictItemForm> {
return request({
url: '/api/v1/dict/items/' + id + '/form',
method: 'get'
});
}
/**
*
*
* @param data
*/
export function saveDictItem(data: DictItemForm) {
return request({
url: '/api/v1/dict/items',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateDictItem(id: number, data: DictItemForm) {
return request({
url: '/api/v1/dict/items/' + id,
method: 'put',
data: data
});
}
/**
*
*
* @param ids ID(,)
*/
export function deleteDictItems(ids: string) {
return request({
url: '/api/v1/dict/items/' + ids,
method: 'delete'
});
}

View File

@ -0,0 +1,84 @@
/**
*
*/
export interface DictQuery extends PageQuery {
/**
*
*/
name?: string;
}
/**
*
*/
export interface Dict {
id: number;
code: string;
name: string;
status: number;
remark: string;
}
/**
*
*/
export type DictPageResult = PageResult<Dict[]>;
/**
*
*/
export interface DictTypeForm {
id: number | undefined;
name: string;
code: string;
status: number;
remark: string;
}
/**
*
*/
export interface DictItemQuery extends PageQuery {
/**
*
*/
name?: string;
/**
*
*/
typeCode?: string;
}
/**
*
*/
export interface DictItem {
id: number;
name: string;
value: string;
typeCode: string;
sort: number;
status: number;
defaulted: number;
remark?: string;
}
/**
*
*/
export type DictItemPageResult = PageResult<DictItem[]>;
/**
*
*/
export interface DictItemForm {
id?: number;
typeCode?: string;
typeName?: string;
name: string;
code: string;
value: string;
status: number;
sort: number;
remark: string;
}

View File

@ -0,0 +1,34 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { FileInfo } from './types';
/**
*
*
* @param file
*/
export function uploadFileApi(file: File): AxiosPromise<FileInfo> {
const formData = new FormData();
formData.append('file', file);
return request({
url: '/api/v1/files',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
});
}
/**
*
*
* @param filePath
*/
export function deleteFileApi(filePath?: string) {
return request({
url: '/api/v1/files',
method: 'delete',
params: { filePath: filePath }
});
}

View File

@ -0,0 +1,7 @@
/**
* API类型声明
*/
export interface FileInfo {
name: string;
url: string;
}

View File

@ -0,0 +1,159 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { MenuQuery, Menu, Resource, MenuForm } from './types';
//获取菜单表格
export function getdata(queryParams:any) {
return request({
url: '/system/menu/getMenuButtonTree',
method: 'post',
params: queryParams
});
}
//新增目录
export function addmenu(queryParams:any) {
return request({
url: '/system/menu/addMenu',
method: 'post',
data: queryParams
});
}
//修改目录
export function editmenu(queryParams:any) {
return request({
url: '/system/menu/updateById',
method: 'post',
data: queryParams
});
}
//删除
export function deltmenu(queryParams:any) {
return request({
url: '/system/menu/deleteById',
method: 'post',
params: queryParams
});
}
//排序
export function moveOrderno(params:any) {
return request({
url: '/system/menu/changeMenuOrder',
method: 'post',
params: params
});
}
//上传图标之前获取ID
//上传单个图标
export function uploadIcon (data:any) {
return request({
headers: {
'Content-Type': 'multipart/form-data'
},
url: '/system/menu/uploadIcon',
method: 'POST',
data
});
}
//删除单个图标
export function moveIcon(params:any) {
return request({
url: '/system/menu/deleteIcon',
method: 'post',
params: params
});
}
/**
*
*/
export function listRoutes() {
return request({
url: 'system/menu/treeRoutes',
method: 'get',
});
}
/**
*
*
* @param queryParams
*/
export function listMenus(queryParams: MenuQuery): AxiosPromise<Menu[]> {
return request({
url: '/api/v1/menus',
method: 'get',
params: queryParams
});
}
/**
*
*/
export function listMenuOptions(): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/menus/options',
method: 'get'
});
}
/**
* (+)
*/
export function listResources(): AxiosPromise<Resource[]> {
return request({
url: '/api/v1/menus/resources',
method: 'get'
});
}
/**
*
* @param id
*/
export function getMenuDetail(id: string): AxiosPromise<MenuForm> {
return request({
url: '/api/v1/menus/' + id,
method: 'get'
});
}
/**
*
*
* @param data
*/
export function addMenu(data: MenuForm) {
return request({
url: '/api/v1/menus',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateMenu(id: string, data: MenuForm) {
return request({
url: '/api/v1/menus/' + id,
method: 'put',
data: data
});
}
/**
*
*
* @param ids ID(,)
*/
export function deleteMenus(ids: string) {
return request({
url: '/api/v1/menus/' + ids,
method: 'delete'
});
}

View File

@ -0,0 +1,105 @@
/**
*
*/
export interface MenuQuery {
keywords?: string;
}
/**
*
*/
export interface Menu {
id?: number;
parentId: number;
type?: string | 'CATEGORY' | 'MENU' | 'EXTLINK';
createTime: string;
updateTime: string;
name: string;
icon: string;
component: string;
sort: number;
visible: number;
children: Menu[];
}
/**
*
*/
export interface MenuForm {
/**
* ID
*/
id?: string;
/**
* ID
*/
parentId: string;
/**
*
*/
name: string;
/**
* (1:;0:;)
*/
visible: number;
icon?: string;
/**
*
*/
sort: number;
/**
*
*/
component?: string;
/**
*
*/
path: string;
/**
*
*/
redirect?: string;
/**
*
*/
type: string;
/**
*
*/
perm?: string;
}
/**
* (+)
*/
export interface Resource {
/**
*
*/
value: string;
/**
*
*/
label: string;
/**
*
*/
children: Resource[];
}
/**
*
*/
export interface Permission {
/**
*
*/
value: string;
/**
*
*/
label: string;
}

View File

@ -0,0 +1,28 @@
import request from '@/utils/request';
export function getMessageList(params:any) {
return request({
url: '/system/message/getMessageList',
method: 'get',
params
});
}
export function setMessageStatus(data:any) {
return request({
url: '/system/message/setMessageStatus?id=' + data,
method: 'post'
});
}
export function setAllMessageStatus() {
return request({
url: '/system/message/setAllMessageStatus',
method: 'post'
});
}
export function deleteMessageById(data:any) {
return request({
url: '/system/message/deleteMessageById?id=' + data,
method: 'post',
data
});
}

View File

@ -0,0 +1,18 @@
import request from '@/utils/request';
//获取所有角色
export function getLogList(params:any){
return request({
url: '/system/log/getLogList' ,
method: 'post',
params: params
});
}
export function exportExcel(queryParams: any) {
return request({
url: '/system/log/exportExcel',
method: 'get',
params: queryParams,
responseType: 'arraybuffer'
});
}

View File

@ -0,0 +1,196 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RoleQuery, RoleForm } from './types';
//获取所有角色
export function listRolePages(queryParams:any){
return request({
url: '/system/role/list' ,
method: 'post',
params:queryParams
});
}
//角色是否有效
export function isvaildTo(queryParams:any){
return request({
url: '/system/role/setIsvaild' ,
method: 'post',
params:queryParams
});
}
//新增角色
export function addDept(queryParams:any){
return request({
url:'/system/role/addRole' ,
method: 'post',
data: queryParams
});
}
//更新角色信息
export function renewDept (queryParams:any){
return request({
url:'/system/role/updateById' ,
method: 'post',
data: queryParams
});
}
//单个删除角色
export function deleDept (queryParams:any){
return request({
url:'/system/role/deleteById' ,
method: 'post',
params: queryParams
});
}
//获取分配权限
export function assignmentPer (queryParams:any){
return request({
url:'/system/menu/permissionAssignment' ,
method: 'post',
params: queryParams
});
}
//发出分配权限
export function setMenuById (queryParams:any){
return request({
url:'/system/role/setMenuById' ,
method: 'post',
params: queryParams
});
}
////获取组织范围
export function setOrgscope (queryParams:any){
return request({
url:'/system/organization/getOrgScopeTree' ,
method: 'post',
params: queryParams
});
}
//修改组织范围
export function postOrgscope (queryParams:any){
return request({
url:'/system/role/setOrgscope' ,
method: 'post',
params: queryParams
});
}
//删除角色
// export function delDept(queryParams:any){
// return request({
// url:'/system/role/addRole' ,
// method: 'post',
// data: queryParams
// });
// }
/**
*
*
* @param queryParam
*/
// export function listRolePages(
// queryParams?: RoleQuery
// ): AxiosPromise<RolePageResult> {
// return request({
// url: '/system/role/list',
// method: 'post',
// params: queryParams
// });
// }
/**
*
*
* @param queryParams
*/
export function listRoleOptions(
queryParams?: RoleQuery
): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/roles/options',
method: 'get',
params: queryParams
});
}
/**
* ID集合
*
* @param queryParams
*/
export function getRoleMenuIds(roleId: string): AxiosPromise<number[]> {
return request({
url: '/api/v1/roles/' + roleId + '/menuIds',
method: 'get'
});
}
/**
*
*
* @param queryParams
*/
export function updateRoleMenus(
roleId: string,
data: number[]
): AxiosPromise<any> {
return request({
url: '/api/v1/roles/' + roleId + '/menus',
method: 'put',
data: data
});
}
/**
*
*
* @param id
*/
export function getRoleDetail(id: number): AxiosPromise<RoleForm> {
return request({
url: '/api/v1/roles/' + id,
method: 'get'
});
}
/**
*
*
* @param data
*/
export function addRole(data: RoleForm) {
return request({
url: '/api/v1/roles',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateRole(id: number, data: RoleForm) {
return request({
url: '/api/v1/roles/' + id,
method: 'put',
data: data
});
}
/**
* (,)
*
* @param ids
*/
export function deleteRoles(ids: string) {
return request({
url: '/api/v1/roles/' + ids,
method: 'delete'
});
}

View File

@ -0,0 +1,40 @@
/**
*
*/
export interface RoleQuery extends PageQuery {
keywords?: string;
}
/**
*
*/
export interface Role {
id: string;
name: string;
code: string;
sort: number;
status: number;
deleted: number;
menuIds?: any;
permissionIds?: any;
}
/**
*
*/
export type RolePageResult = PageResult<Role[]>;
/**
*
*/
export interface RoleForm {
id?: number;
name: string;
code: string;
sort: number;
status: number;
/**
*
*/
dataScope: number;
}

View File

@ -0,0 +1,51 @@
import request from '@/utils/request';
//获取表格内容
export function getTaskList(params: any) {
return request({
url: '/system/quartzjob/getQuartzJobList',
method: 'get',
params: params
});
}
//新增表格内容
export function addTaskList(params: any) {
return request({
url: '/system/quartzjob/addQuartzJob',
method: 'post',
data: params
});
}
//删除定时任务
export function delTaskList(params: any) {
return request({
url: '/system/quartzjob/deleteQuartzJob',
method: 'post',
params: params
});
}
//修改定时任务
export function updataTaskList(params: any) {
return request({
url: '/system/quartzjob/updateQuartzJob',
method: 'post',
data: params
});
}
//定时任务是否有效
export function setTaskList(params: any) {
return request({
url: '/system/quartzjob/setQuartzStatus',
method: 'post',
params: params
});
}
//拖拽
export function changeItemOrder(params: any) {
return request({
url: '/system/quartzjob/changeDictOrder',
method: 'post',
params: params
});
}

View File

@ -0,0 +1,238 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { UserForm, UserInfo, UserPageResult, UserQuery } from './types';
//获取企业树 数据
export function getTreelist(queryParams:any) {
return request({
url: '/system/organization/getOrgTree',
method: 'POST',
params: queryParams
});
}
//获取用户列表信息
export function gettableData(queryParams:any) {
return request({
url: '/system/user/queryUsers',
method: 'get',
params: queryParams
});
}
//用户-禁用,启用
export function DataStatus (queryParams:any) {
return request({
url: '/system/user/setStatus',
method: 'POST',
params: queryParams
});
}
//删除用户
export function deltableData (queryParams:any) {
return request({
url: '/system/user/deleteById',
method: 'POST',
params: queryParams
});
}
//批量删除
export function delChoise (queryParams:any) {
return request({
url: '/system/user/deleteUserByIds',
method: 'POST',
params: queryParams
});
}
//获取角色
export function getRole (queryParams:any) {
return request({
url: '/system/role/list',
method: 'POST',
params: queryParams
});
}
//新建用户
export function addUsers (queryParams:any,roleids:any) {
return request({
url: '/system/user/addUser?'+'roleids='+roleids,
method: 'POST',
data: queryParams,
});
}
//更改用户
export function updataUser (queryParams:any,roleids:any) {
return request({
url: '/system/user/updateUser?'+'roleids='+roleids,
method: 'POST',
data: queryParams,
});
}
//更改用户
export function updatePersonalInfo (queryParams:any) {
return request({
url: '/user/updatePersonalInfo',
method: 'POST',
data: queryParams,
});
}
//更改头像
export function updateAvatar (data:any) {
return request({
headers: {
'Content-Type': 'multipart/form-data'
},
url: '/system/user/updateAvatar',
method: 'POST',
data
});
}
//重置密码
export function setpass (queryParams:any) {
return request({
url: '/system/user/resetPassword',
method: 'POST',
params: queryParams,
});
}
export function updatePassword (queryParams:any) {
return request({
url: '/user/updatePassword',
method: 'GET',
params: queryParams,
});
}
/**
*
*/
export function getUserInfo(): AxiosPromise<UserInfo> {
return request({
url: '/user/me',
method: 'get'
});
}
/**
*
*
* @param queryParams
*/
export function listUserPages(
queryParams: UserQuery
): AxiosPromise<UserPageResult> {
return request({
url: '/api/v1/users/pages',
method: 'get',
params: queryParams
});
}
/**
*
*
* @param userId
*/
export function getUserForm(userId: number): AxiosPromise<UserForm> {
return request({
url: '/api/v1/users/' + userId + '/form',
method: 'get'
});
}
/**
*
*
* @param data
*/
export function addUser(data: any) {
return request({
url: '/api/v1/users',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateUser(id: number, data: UserForm) {
return request({
url: '/api/v1/users/' + id,
method: 'put',
data: data
});
}
/**
*
*
* @param id
* @param status
*/
export function updateUserStatus(id: number, status: number) {
return request({
url: '/api/v1/users/' + id + '/status',
method: 'patch',
params: { status: status }
});
}
/**
*
*
* @param id
* @param password
*/
export function updateUserPassword(id: number, password: string) {
return request({
url: '/api/v1/users/' + id + '/password',
method: 'patch',
params: { password: password }
});
}
/**
*
*
* @param ids
*/
export function deleteUsers(ids: string) {
return request({
url: '/api/v1/users/' + ids,
method: 'delete'
});
}
/**
*
*
* @returns
*/
export function downloadTemplate() {
return request({
url: '/api/v1/users/template',
method: 'get',
responseType: 'arraybuffer'
});
}
/**
*
*
* @param queryParams
* @returns
*/
export function exportUser(queryParams: UserQuery) {
return request({
url: '/api/v1/users/_export',
method: 'get',
params: queryParams,
responseType: 'arraybuffer'
});
}

View File

@ -0,0 +1,67 @@
/**
*
*/
export interface UserInfo {
permissions: string[];
userInfo: any;
nickname: string;
avatar: string;
roles: string[];
perms: string[];
}
/**
*
*/
export interface UserQuery extends PageQuery {
keywords: string;
status: number;
deptId: number;
}
/**
*
*/
export interface UserType {
id: string;
username: string;
nickname: string;
mobile: string;
gender: number;
avatar: string;
email: string;
status: number;
deptName: string;
roleNames: string;
createTime: string;
}
/**
*
*/
export type UserPageResult = PageResult<UserType[]>;
/**
*
*/
export interface UserForm {
id: number | undefined;
deptId: number;
username: string;
nickname: string;
password: string;
mobile: string;
email: string;
gender: number;
status: number;
remark: string;
roleIds: number[];
}
/**
*
*/
export interface UserImportData {
deptId: number;
roleIds: number[];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

View File

Before

Width:  |  Height:  |  Size: 640 B

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

View File

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

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