708 Commits

Author SHA1 Message Date
芋道源码
fffe060ab1 !233 【antd】【ele】Mall 迁移 80%
Merge pull request !233 from 芋道源码/dev
2025-10-18 11:30:44 +00:00
YunaiV
769510c4f6 feat:统一两端 data.ts 关联数据的加载逻辑(写法) 2025-10-18 17:14:28 +08:00
YunaiV
2288748ca8 feat:【mall 商城】优惠劵-模版(100% ele) 2025-10-18 11:45:57 +08:00
YunaiV
97e692d2fc feat:【mall 商城】优惠劵-领取记录(50% ele) 2025-10-18 11:37:28 +08:00
YunaiV
4084009556 feat:【mall 商城】优惠劵-模版(100% antd) 2025-10-18 11:13:50 +08:00
YunaiV
6577794b7d feat:【mall 商城】优惠劵-模版(70% antd) 2025-10-17 23:14:37 +08:00
YunaiV
20f7a9d087 feat:add formatFileSize 2025-10-17 21:47:54 +08:00
xingyu4j
b23581ba3b fix: warn 2025-10-17 18:17:01 +08:00
xingyu4j
23537b9f74 fix: warn 2025-10-17 17:36:55 +08:00
xingyu4j
1629003cdc feat: form create 2025-10-17 16:23:43 +08:00
xingyu4j
7704aef4c8 feat: form-create 2025-10-17 16:15:54 +08:00
xingyu4j
41baa56bf8 fix: remove message 2025-10-17 15:55:48 +08:00
xingyu4j
332de6dd91 fix: sort 2025-10-17 15:55:26 +08:00
xingyu4j
e14d10a4ba feat: 按需引入 form-create 2025-10-17 15:53:52 +08:00
xingyu4j
14a83d91f1 feat: 优化显示效果 2025-10-17 15:29:51 +08:00
xingyu4j
a65a5d2aab fix: getRangePickerDefaultProps 2025-10-17 15:10:23 +08:00
xingyu4j
22cf883cc4 fix: naive DatePicker default value use formatted-value 2025-10-17 15:03:43 +08:00
xingyu4j
09afe93a7a feat: add formatFileSize 2025-10-17 14:38:52 +08:00
xingyu4j
4f7b7c0e59 feat: job add crontab 2025-10-17 14:27:18 +08:00
xingyu4j
d4acf33a35 fix: select options 2025-10-17 14:26:59 +08:00
xingyu4j
81d92da3ac feat: add corn-tab 2025-10-17 14:24:56 +08:00
xingyu4j
ca1fefd197 feat: id use inputNumber 2025-10-17 13:39:23 +08:00
xingyu4j
15edcb1d7b fix: switch 2025-10-17 13:39:05 +08:00
xingyu4j
6979dbfa52 fix: switch slots 2025-10-17 11:33:49 +08:00
xingyu4j
a5e3406849 fix: naive code 2025-10-17 11:24:07 +08:00
xingyu4j
9499a80e8a feat: add FileUpload, ImageUpload 2025-10-17 11:23:43 +08:00
xingyu4j
ba7aa17dc3 fix: naive dict type 2025-10-17 11:23:23 +08:00
xingyu4j
c26d730a5a fix: ele createtime 2025-10-17 11:23:01 +08:00
xingyu4j
40a8e924a4 fix: antd createtime 2025-10-17 10:49:02 +08:00
xingyu4j
ee879055bb fix: ele Rate 2025-10-17 09:35:09 +08:00
xingyu4j
3055931904 feat: ele 注册rate组件 2025-10-17 09:34:10 +08:00
YunaiV
22bd8b8f45 feat:【mall 商城】优惠劵-模版(50% antd) 2025-10-16 23:34:41 +08:00
YunaiV
47a6a7284c feat:【mall 商城】优惠劵-领取记录(100% antd) 2025-10-16 23:04:33 +08:00
YunaiV
1394688364 feat:【mall 商城】文章分类(100% ele) 2025-10-16 22:06:52 +08:00
xingyu4j
e358c85c15 feat: allowClear to clearable 2025-10-16 18:05:39 +08:00
xingyu4j
dd1528d45a feat: add naive infra 2025-10-16 18:04:17 +08:00
xingyu4j
f6ad13b4f1 feat: add router 2025-10-16 18:03:51 +08:00
xingyu4j
4319b4ec26 feat: add upload 2025-10-16 18:03:33 +08:00
xingyu4j
d92cd2e48e feat: add report 2025-10-16 16:40:34 +08:00
xingyu4j
afdf859900 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-16 16:38:50 +08:00
xingyu4j
0094459b22 feat: naive desc comp label default left 2025-10-16 16:38:32 +08:00
xingyu4j
27c5dc65be feat: code style 2025-10-16 16:35:51 +08:00
xingyu4j
757eb72018 feat: naive system init 2025-10-16 16:35:02 +08:00
xingyu4j
bac9b0d747 feat: remove demo 2025-10-16 16:34:35 +08:00
xingyu4j
ecc9bdaad7 feat: add dayjs 2025-10-16 16:34:16 +08:00
xingyu4j
6c82311b1f feat: 保持方法一致性 2025-10-16 16:33:49 +08:00
YunaiV
3f6c405376 feat:清理多余的 buttonStyle: 'solid', 【ele】 2025-10-16 14:00:53 +08:00
YunaiV
d1089d7a50 feat:【mall 商城】文章分类(100% ele) 2025-10-16 13:16:53 +08:00
xingyu4j
79d7972172 feat: init naive vxe-table config 2025-10-16 11:27:50 +08:00
xingyu4j
27c1fdd1c0 feat: naive add dict-tag 2025-10-16 11:25:10 +08:00
xingyu4j
4e03d3577c feat: init naive base 2025-10-16 11:22:43 +08:00
xingyu4j
efc8607848 chore: init naive config 2025-10-16 11:21:19 +08:00
xingyu4j
1f81f07191 feat: init naive locales 2025-10-16 10:36:07 +08:00
xingyu4j
dc874aa090 feat: ini naive config 2025-10-16 10:32:39 +08:00
xingyu4j
b8cfb196e9 feat: add naive system infra api 2025-10-16 10:31:09 +08:00
xingyu4j
402f9a9080 chore: init naive config 2025-10-16 10:30:36 +08:00
xingyu4j
2ee3412aef fix: sort 2025-10-16 10:28:42 +08:00
xingyu4j
466d0c829e feat: naive adapter form 2025-10-16 10:20:45 +08:00
xingyu4j
bc6d0f7dd6 chore: 还原naive初始化 2025-10-16 10:16:45 +08:00
YunaiV
b28a35cd79 feat:【mall 商城】文章分类(100% antd) 2025-10-15 23:53:10 +08:00
YunaiV
6c6e1d4720 feat:【mall 商城】文章列表(100% antd) 2025-10-15 23:37:05 +08:00
YunaiV
68192bfacc Merge remote-tracking branch 'origin/dev' into dev
Resolved merge conflicts and integrated changes from remote branch.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 21:18:29 +08:00
YunaiV
d9da7bd6fb feat:【mall 商城】交易订单(100% ele 部分) 2025-10-15 21:17:05 +08:00
xingyu4j
4052e3c8d2 feat: 统一方法名 on => handle 2025-10-15 14:19:30 +08:00
YunaiV
daf01c0da8 feat:【mall 商城】交易订单(90% ele 部分) 2025-10-15 13:25:52 +08:00
YunaiV
ce5fc8cf3d feat:【mall 商城】交易订单(90% ele 部分) 2025-10-15 13:25:46 +08:00
YunaiV
7fd071a79b feat:【mall 商城】交易订单(80% ele 部分) 2025-10-15 13:14:59 +08:00
YunaiV
a82d492f58 feat:【mall 商城】交易订单(70% ele 初始化) 2025-10-15 12:37:15 +08:00
YunaiV
318cbc31b2 feat:【mall 商城】交易订单(60% antd delivery 优化代码风格) 2025-10-15 09:51:01 +08:00
YunaiV
8bd135414e feat:【mall 商城】交易订单(50% antd address 优化代码风格) 2025-10-15 09:45:38 +08:00
YunaiV
26f3aa18c2 feat:【mall 商城】交易订单(40% antd price 优化代码风格) 2025-10-15 09:37:02 +08:00
YunaiV
b40f10c68b feat:【mall 商城】交易订单(30% antd remark 优化代码风格) 2025-10-15 09:20:17 +08:00
YunaiV
a101cdf2f8 feat:【mall 商城】交易订单(30% antd remark 优化代码风格) 2025-10-15 09:12:51 +08:00
YunaiV
cc44ee3daa feat:【mall 商城】交易订单(30% antd list 优化代码风格) 2025-10-14 23:49:51 +08:00
YunaiV
8c5680de81 feat:【mall 商城】交易订单(20% antd detail 优化代码风格) 2025-10-14 23:17:28 +08:00
YunaiV
fc9d7232be feat:【mall 商城】交易订单(10% antd detail 初始化) 2025-10-14 22:18:57 +08:00
YunaiV
0d551f72a4 feat:【mall 商城】售后退款(100% ele) 2025-10-14 21:32:51 +08:00
YunaiV
6fe61f9efb feat:【mall 商城】售后退款(100% antd table) 2025-10-14 20:52:35 +08:00
YunaiV
5e8c9175bb feat:【mall 商城】售后退款(100% antd form) 2025-10-14 20:28:21 +08:00
YunaiV
9f3a0a9f34 feat:【mall 商城】售后退款(100% antd detail) 2025-10-14 19:46:15 +08:00
YunaiV
b512bcc134 feat:【mall 商城】售后退款(20% antd detail grid 相关的几个描述) 2025-10-14 19:07:31 +08:00
YunaiV
68fbd98991 feat:【mall 商城】售后退款(10% antd detail description 相关的几个描述) 2025-10-14 13:02:27 +08:00
YunaiV
876c32e833 feat:【框架】description 增加对 xx.yyy 属性的读取支持 2025-10-14 12:58:11 +08:00
xingyu4j
0a09970efb feat: 代码保持一致 2025-10-14 10:21:57 +08:00
xingyu4j
c19097ec0c Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-10-14 10:06:36 +08:00
xingyu
5f6b876c11 !230 修复iot产品管理:
Merge pull request !230 from huppygo/dev
2025-10-14 02:01:32 +00:00
YunaiV
c27378e75f feat:【mall 商城】售后退款(10% antd detail 初始化) 2025-10-14 09:46:45 +08:00
lidongcheng88
03ce030e7c fix: 混合双列 onMounted 关闭二级侧边栏 (#6807)
Co-authored-by: ldc <lidchen@tencent.com>
2025-10-14 06:56:00 +08:00
zouawen
59097e2466 chore: 新增是否开启首选项导航栏(外观、布局、快捷键、通用)吸顶效果,调整部分样式 (#6804) 2025-10-14 06:55:11 +08:00
YunaiV
1cf77fe6de feat:【mall 商城】门店自提的迁移(ele 100%) 2025-10-13 23:39:09 +08:00
YunaiV
a3d56ae6a3 feat:【mall 商城】门店自提的迁移(ele 80%) 2025-10-13 22:21:08 +08:00
huppygo
4261ca0a50 修复iot产品管理:
1.删除,导出,获取分页 引入地址不正确的问题
2.新增修改页面 点击确定按钮没有调用接口
3.新增修改页面productKey不显示问题,修复新增没有生成按钮问题
4.新增更多设置折叠框标题为更多设置 图标 图片 产品描述放到 更多配置折叠区域默认折叠点击展开
5.卡片列表中的产品图标根据设置的图标显示

Signed-off-by: Administrator <425053404@qq.com>
2025-10-13 22:20:35 +08:00
YunaiV
75c24789ff feat:【mall 商城】门店自提的迁移(antd 100%) 2025-10-13 21:17:34 +08:00
YunaiV
59b13842c4 feat:【mall 商城】门店自提的迁移(antd 50%) 2025-10-13 20:50:42 +08:00
YunaiV
e1cb380fdc feat:【mall 商城】门店自提待完成部分的梳理(antd 1%) 2025-10-13 19:50:28 +08:00
xingyu4j
f54424ced3 feat: 统一代码格式 2025-10-13 18:21:47 +08:00
xingyu4j
202a82bf44 refactor: 重构 dict_type 将每个模块分开,便于维护 2025-10-13 18:08:03 +08:00
xingyu4j
57d3ea3446 feat: cron-tab 2025-10-13 16:34:15 +08:00
xingyu4j
137c3f46a3 fix: error 2025-10-13 16:30:39 +08:00
xingyu4j
6720882dc1 feat: use Object.assign 2025-10-13 16:10:33 +08:00
xingyu4j
4358335d47 chore: 移除 min-dash 使用vben/utils 中的方法 2025-10-13 16:02:02 +08:00
xingyu4j
31e72c19ad feat: ele codegen use code editor 2025-10-13 15:01:52 +08:00
xingyu4j
2a71d61e21 feat: codegen use code editor 2025-10-13 14:55:22 +08:00
xingyu4j
8b423d3f08 feat: css style 2025-10-13 14:54:56 +08:00
xingyu4j
e7f1eb0844 feat: add code editor 2025-10-13 14:53:56 +08:00
YunaiV
a3a292db80 feat:【mall 商城】门店管理的迁移(ele 100%) 2025-10-13 13:10:46 +08:00
xingyu
938498ebc8 !226 feat:【mall 商城】分销提现的迁移(ele 100%)
Merge pull request !226 from 芋道源码/dev
2025-10-13 02:56:44 +00:00
xingyu4j
7b7ca39d83 fix: Top-level await is not available in the configured target environment 2025-10-13 10:55:54 +08:00
xingyu4j
a4561b3dd8 fix: iot && IconifyIcon 2025-10-13 10:41:08 +08:00
xingyu4j
4b69721a90 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-13 10:17:36 +08:00
xingyu4j
4c4cd57ef0 fix: iot 2025-10-13 10:17:19 +08:00
YunaiV
99c0945989 feat:【mall 商城】门店管理的迁移(antd 100%) 2025-10-13 09:53:11 +08:00
YunaiV
1a9037f6ab feat:【mall 商城】门店管理的迁移(antd 50%) 2025-10-12 20:55:28 +08:00
YunaiV
8c6d1d68d1 feat:【mall 商城】快递模版的迁移(ele 100%)fix 必须要有 node-key 2025-10-12 20:19:43 +08:00
YunaiV
0d02c60478 feat:【mall 商城】快递模版的迁移(ele 100%) 2025-10-12 19:45:52 +08:00
YunaiV
31a583419a feat:【mall 商城】快递模版的迁移(antd 100%) 2025-10-12 19:29:55 +08:00
YunaiV
4270916ce4 chore: complete merge with remote changes
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 17:22:19 +08:00
YunaiV
43dc2d4446 feat:【mall 商城】快递模版的迁移(antd 40% 表单部分) 2025-10-12 17:20:49 +08:00
xingyu
efd1bda0d0 Merge branch 'master' of gitee.com:yudaocode/yudao-ui-admin-vben into dev
Signed-off-by: xingyu <xingyu4j@vip.qq.com>
2025-10-12 03:01:31 +00:00
YunaiV
7eeb52c582 feat:【mall 商城】快递模版的迁移(antd 30% 列表 ok) 2025-10-11 22:03:40 +08:00
YunaiV
53195748b8 feat:【mall 商城】快递公司的迁移(ele 100%) 2025-10-11 21:00:23 +08:00
YunaiV
a46fa6442c feat:【mall 商城】快递公司的迁移(antd 100%) 2025-10-11 20:26:57 +08:00
YunaiV
59bbe4cc93 fix:vite 被 ai 错误的从 7.1.2 降级成 5.4.10 iota问题 2025-10-11 20:24:32 +08:00
芋道源码
7824506e86 !225 fix: namespace缺少}
Merge pull request !225 from SNOWFLAKE/N/A
2025-10-11 11:20:40 +00:00
YunaiV
5f88a54d60 feat:【mall 商城】分销提现的迁移(ele 100%) 2025-10-11 13:47:28 +08:00
SNOWFLAKE
9c079ca220 fix: namespace缺少} 2025-10-11 05:33:59 +00:00
YunaiV
2f0ba0458e feat:【mall 商城】分销提现的迁移(antd 100%)样式优化 2025-10-11 13:06:22 +08:00
YunaiV
ced545a791 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-11 12:52:46 +08:00
YunaiV
51a9f05c47 feat:【mall 商城】分销提现的迁移(antd 50%) 2025-10-11 12:49:54 +08:00
xingyu4j
15c8146eda fix: names 2025-10-11 10:58:01 +08:00
xingyu4j
a156873437 fix: iot 2025-10-11 10:56:12 +08:00
YunaiV
28566a659f feat:【mall 商城】分销记录的迁移(antd、ele 100%) 2025-10-11 09:54:49 +08:00
YunaiV
9bf2846a12 Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-11 08:39:36 +08:00
YunaiV
bc6dfad4c9 fix: 【infra 基础设施】update label and dependencies in data.ts 2025-10-11 00:57:52 +08:00
xingyu4j
abcc062ba1 fix: v-access:code 2025-10-10 21:56:07 +08:00
xingyu4j
fac8cee297 fix: iot 2025-10-10 21:55:50 +08:00
xingyu4j
7ef1da4f2c Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-10 21:44:32 +08:00
xingyu4j
691f9aa764 fix: iot 2025-10-10 21:44:08 +08:00
YunaiV
8465941011 fix:【system 系统管理】linter 报错 2025-10-10 21:32:15 +08:00
xingyu4j
00a25ed1d3 feat: dict enum 2025-10-10 20:58:41 +08:00
xingyu4j
c57c82264a Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-10 20:56:20 +08:00
xingyu4j
196622a8d0 feat: add iot dict enum 2025-10-10 20:53:21 +08:00
YunaiV
f740461c2a fix:【iot 物联网】linter 报错 2025-10-10 20:26:17 +08:00
xingyu
84cd10eb93 !224 修改iot前端接口调用失败问题
Merge pull request !224 from huppygo/master
2025-10-10 12:22:47 +00:00
YunaiV
b6fee5c05b feat:【mall 商城】分销用户的 form 迁移(ele 100%) 2025-10-10 20:22:33 +08:00
xingyu4j
d789072aa3 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-10 20:21:09 +08:00
YunaiV
5e66e6bfac feat:【mall 商城】分销用户的 list modal 迁移(ele 60%) 2025-10-10 19:40:02 +08:00
huppygo
2db27d522f update apps/web-antd/src/api/iot/ota/task/record/index.ts.
Signed-off-by: huppygo <huppygo@qq.com>
2025-10-10 11:26:09 +00:00
huppygo
5dfdf4b10c update apps/web-antd/src/api/iot/ota/task/index.ts.
Signed-off-by: huppygo <huppygo@qq.com>
2025-10-10 11:25:39 +00:00
huppygo
752a450add update apps/web-antd/src/api/iot/ota/firmware/index.ts.
Signed-off-by: huppygo <huppygo@qq.com>
2025-10-10 11:24:04 +00:00
xingyu4j
850df7149a fix: style lint 2025-10-10 18:10:59 +08:00
YunaiV
f41e746a81 feat:【mall 商城】分销用户的 list modal 迁移(ele 50%) 2025-10-10 13:28:25 +08:00
YunaiV
f77e731357 feat:统一优化 useGridColumns<T = 泛型的使用 2025-10-10 09:50:37 +08:00
YunaiV
740da3f545 feat:【mall 商城】分销用户的 list modal 迁移(antd 100%) 2025-10-10 09:30:52 +08:00
YunaiV
94d0550ecc feat:【mall 商城】分销用户的 update 迁移(antd 50%) 2025-10-09 22:18:57 +08:00
YunaiV
db38eb23da feat:【mall 商城】分销用户的 create 迁移(antd 40%) 2025-10-09 21:28:13 +08:00
xingyu4j
b2ba1d9d37 fix: tenant tenantPackage 2025-10-09 18:38:13 +08:00
xingyu4j
378cdd4c38 fix: dept leaderUser 2025-10-09 18:33:01 +08:00
xingyu4j
d2f50c9388 fix: tree bugs 2025-10-09 18:23:35 +08:00
xingyu4j
f63dc0ecef fix: content warp extra css 2025-10-09 17:58:40 +08:00
xingyu4j
ab54628f79 feat: ele spu form 保持一致 2025-10-09 17:51:14 +08:00
xingyu4j
2e4b788c5d feat: spu 保持一致 2025-10-09 17:50:43 +08:00
xingyu4j
3d67a376a3 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-09 17:13:14 +08:00
xingyu4j
6f46dc90f2 fix: el pick up order css 2025-10-09 17:12:28 +08:00
xingyu4j
41fe54e5f0 feat: use Rate 2025-10-09 17:11:53 +08:00
xingyu4j
3829fa0b49 fix: pick up order css 2025-10-09 17:09:17 +08:00
xingyu4j
9520d7016e feat: use Rate 2025-10-09 17:07:30 +08:00
xingyu4j
5e1187bab5 fix: icon 2025-10-09 16:51:57 +08:00
YunaiV
f2c34d42b0 feat:【mall 商城】分销用户的迁移(antd 30%) 2025-10-09 13:29:18 +08:00
xingyu4j
7533486cf8 fix: captcha icon 2025-10-09 11:24:40 +08:00
xingyu4j
066b28b2cc fix: bug 2025-10-09 11:20:28 +08:00
xingyu4j
99dd3350f4 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-10-09 11:19:32 +08:00
YunaiV
96a1232b1e feat:【mall 商城】交易配置的迁移与 bugfix(ele) 2025-10-09 10:01:33 +08:00
YunaiV
20adbc65a8 feat:【mall 商城】交易配置的迁移与 bugfix(antd) 2025-10-09 09:21:51 +08:00
YunaiV
f83a0adb2b feat:【mall 商城】商品评论的迁移(ele) 2025-10-08 20:04:48 +08:00
YunaiV
637d02d33c feat:【mall 商城】商品评论的迁移(ele) 2025-10-08 19:54:14 +08:00
YunaiV
e226e09e8a feat:【mall 商城】商品属性的迁移(ele) 2025-10-08 18:10:42 +08:00
YunaiV
276d91190c feat:【mall 商城】商品属性的迁移(antd) 2025-10-08 17:01:18 +08:00
YunaiV
5cdf1af39f feat:【mall 商城】API 风格调整 2025-10-08 11:17:22 +08:00
YunaiV
4648f2023b feat:【mall 商城】商品分类的迁移 2025-10-08 10:53:22 +08:00
YunaiV
e84cd6147c feat:【mall 商城】商品分类的迁移 2025-10-08 10:22:27 +08:00
芋道源码
1e9bfb419e !223 【antd】Member 迁移彻底完成
Merge pull request !223 from 芋道源码/dev
2025-10-07 12:55:45 +00:00
芋道源码
9b36b84253 !222 Vue3 + Element Plus版本iot前端迁移到vben版本
Merge pull request !222 from huppygo/master
2025-10-07 12:54:45 +00:00
YunaiV
2e91f912d5 fix:【antd】【ele】system 下角色分配,不支持多选的问题 2025-10-07 20:53:31 +08:00
YunaiV
5e5ae1195e feat:【ele】【member 会员】优化会员详情 2025-10-07 20:46:52 +08:00
YunaiV
a2ed4445f2 feat:【ele】【member 会员】优化会员 list、form 相关的代码 2025-10-07 20:30:18 +08:00
YunaiV
2efefb30bb feat:【ele】【member 会员】优化会员 list、form 相关的代码 2025-10-07 20:20:41 +08:00
YunaiV
cdd7e69f8e feat:【ele】【member 会员】优化会员 list、form 相关的代码 2025-10-07 20:20:33 +08:00
Administrator
877a03df4a Vue3 + Element Plus版本iot前端迁移到vben版本 2025-10-07 19:58:59 +08:00
YunaiV
d3e7c49255 feat:【ele】【member 会员】会员详情独立 detail 目录 2025-10-07 19:35:08 +08:00
YunaiV
412dd3c05c feat:【ele】【member 会员】会员详情独立 detail 目录 2025-10-07 19:35:02 +08:00
YunaiV
4978bbbcf1 feat:【antd】【member 会员】完成详情界面的迁移 2025-10-07 17:10:54 +08:00
YunaiV
25af653216 feat:【antd】【member 会员】迁移 CouponSendForm 组件 2025-10-07 16:28:15 +08:00
YunaiV
4809b7847a feat:【antd】【member 会员】迁移 CouponSendForm 组件 2025-10-07 16:17:21 +08:00
YunaiV
d88ba2ad4e feat:【antd】【member 会员】完成 balance-form 的迁移与 bugfix 2025-10-07 15:11:51 +08:00
YunaiV
a18126a761 feat:【antd】【member 会员】完成 balance-form 的迁移与 bugfix 2025-10-07 15:11:46 +08:00
YunaiV
dabbeaae81 feat:【antd】【member 会员】完成 point-form 的迁移与 bugfix 2025-10-07 14:40:00 +08:00
YunaiV
3f1e48de54 feat:【antd】【member 会员】完成 level-form 的迁移与 bugfix 2025-10-07 14:26:35 +08:00
YunaiV
d53e1f0397 feat:【antd】【member 会员】完成 index 和 form 的重构 2025-10-07 14:19:12 +08:00
YunaiV
a60c29169b feat:【antd】【member 会员】完成 index 和 form 的重构 2025-10-07 14:18:48 +08:00
YunaiV
b9593c7a4a feat:【antd】【member 会员】将 detail 独立目录 2025-10-07 11:25:39 +08:00
YunaiV
e546247c0b fix:【ele】统一 InputNumber 的 controlsPosition 写法 2025-10-07 11:11:15 +08:00
YunaiV
9e89cdbced feat:【antd】【ele】【member 会员】signin 迁移 ele 2025-10-07 11:04:07 +08:00
YunaiV
8d34744deb fix:【antd】移除 controlsPosition ,因为 inputnumber 没这个属性,只有 ele 才有 2025-10-07 10:55:34 +08:00
YunaiV
64eed7b39a feat:【antd】【ele】【member 会员】signin 迁移 antd 2025-10-07 10:47:07 +08:00
YunaiV
3e5a1ea5aa feat:【antd】【ele】【member 会员】tag 迁移 ele 2025-10-07 10:44:11 +08:00
YunaiV
d00f8538fd feat:【antd】【ele】【member 会员】tag 迁移 antd 2025-10-07 10:42:04 +08:00
YunaiV
7b7323d519 feat:【antd】【ele】【member 会员】point 迁移 ele 2025-10-07 10:40:29 +08:00
YunaiV
960413ed58 feat:【antd】【ele】【member 会员】point 迁移 antd 2025-10-07 10:32:16 +08:00
YunaiV
ba47b627c8 feat:【antd】【ele】【member 会员】level 迁移 ele 2025-10-07 10:30:24 +08:00
YunaiV
2f6e7ced5e feat:【antd】【ele】【member 会员】level 迁移 antd 2025-10-07 10:14:23 +08:00
YunaiV
f6ca135efb feat:【antd】【ele】【member 会员】group 迁移 ele 2025-10-07 09:46:47 +08:00
YunaiV
d150475efb feat:【antd】【ele】【member 会员】group 迁移 antd 2025-10-07 09:40:52 +08:00
YunaiV
a025d12790 feat:【antd】【ele】【member 会员】config 迁移 ele 2025-10-07 09:35:01 +08:00
YunaiV
fb37b7eec3 feat:【antd】【ele】【member 会员】config 迁移 antd 2025-10-07 09:26:12 +08:00
zouawen
2ce161e585 feat: 1、新增水印文案自定义功能;2、input-item输入框组件新增清除功能(可用于快捷清除水印文案);3、偏好设置、主题切换、语言选择、是否全屏按钮新增动画效果 (#6800)
* feature: 新增水印文案自定义功能;

* chore: 偏好设置、主题切换、语言选择、是否全屏按钮新增动画效果
2025-10-07 06:15:41 +08:00
芋道源码
e4707ef380 !220 【antd】ERP、PAY 迁移彻底完成
Merge pull request !220 from 芋道源码/dev
2025-10-06 12:48:00 +00:00
YunaiV
825a052533 feat:【antd】【ele】【pay 支付】pay/cashier 迁移 antd、ele 版本 2025-10-06 20:45:29 +08:00
YunaiV
38040be98f feat:【antd】【ele】【pay 支付】pay/demo/withdraw 迁移 ele 版本 2025-10-06 20:37:19 +08:00
YunaiV
584dcd5819 feat:【antd】【ele】【pay 支付】pay/demo/withdraw 迁移 antd 版本 2025-10-06 20:29:12 +08:00
YunaiV
dd7e4d9513 feat:【antd】【ele】【pay 支付】pay/demo/withdraw 迁移 ele 版本 2025-10-06 20:15:17 +08:00
YunaiV
5d9af538fd feat:【antd】【ele】【pay 支付】pay/demo/order 迁移 ele 版本 2025-10-06 20:09:25 +08:00
YunaiV
fbd6c86ee4 feat:【antd】【ele】【pay 支付】pay/demo/order 迁移 antd 版本 2025-10-06 19:55:14 +08:00
YunaiV
9fd1c507a2 feat:【antd】【ele】【pay 支付】pay/demo/order 迁移 antd 版本 2025-10-06 19:48:41 +08:00
YunaiV
4f2ffc58f7 feat:【antd】【ele】【pay 支付】pay/wallet/package 迁移 antd、ele 版本 2025-10-06 17:41:59 +08:00
YunaiV
b2de0e2a29 feat:【antd】【ele】【pay 支付】pay/wallet/balance 迁移 ele 版本 2025-10-06 13:36:03 +08:00
YunaiV
385b5eaaec feat:【antd】【ele】【pay 支付】pay/wallet/balance 迁移 antd 版本 2025-10-06 13:06:57 +08:00
YunaiV
0627f5072d feat:【antd】【ele】【pay 支付】pay/notify 迁移 ele 版本 2025-10-06 11:11:51 +08:00
YunaiV
c168045639 feat:【antd】【ele】【pay 支付】pay/notify 迁移 antd 版本 2025-10-06 10:40:20 +08:00
YunaiV
96026b85b5 feat:【antd】【ele】【pay 支付】order/refund/transfer 导出的缺失补全 2025-10-06 09:33:43 +08:00
YunaiV
fcc6162692 feat:【antd】【ele】【pay 支付】pay/transfer 迁移 ele 版本 2025-10-06 09:18:37 +08:00
zouawen
33306a5aff chore: 更换其他登录方式图标为彩色图标,新增其他登录方式tooltip文字提示 (#6799) 2025-10-06 06:56:54 +08:00
YunaiV
b587032597 feat:【antd】【ele】【pay 支付】pay/transfer 迁移 antd 版本 2025-10-05 22:06:58 +08:00
YunaiV
25e434276a fix:【antd】【ele】【pay 支付】pay/refund 迁移 ele 版本 2025-10-05 21:48:00 +08:00
YunaiV
cb04558426 fix:【antd】【ele】【pay 支付】pay/refund 迁移 antd 版本 2025-10-05 21:42:12 +08:00
YunaiV
25fe87e94c fix:【antd】【ele】【pay 支付】pay/order 详情使用错接口 2025-10-05 21:30:04 +08:00
YunaiV
112a7dfb93 feat:【antd】【ele】【pay 支付】pay/order 在 ele 代码优化 2025-10-05 21:12:25 +08:00
YunaiV
73e64b468a feat:【antd】【ele】【pay 支付】pay/order 在 antd 代码优化 2025-10-05 20:45:55 +08:00
YunaiV
8f20182050 feat:【ele】【pay 支付】pay/app 代码优化 4/4(对齐 ele 和 antd) 2025-10-05 20:32:46 +08:00
YunaiV
22b0496428 feat:【ele】【pay 支付】pay/app 代码优化 3/4(对齐 ele 和 antd) 2025-10-05 20:13:32 +08:00
YunaiV
b2e2fe7ccb feat:【ele】【框架】调整 CellSwitch,使用 inlinePrompt 内嵌展示文案 2025-10-05 19:52:54 +08:00
YunaiV
5393623f45 feat:【ele】【框架】调整 CellSwitch,注释 activeText、inactiveText 禁用文字展示 2025-10-05 19:49:40 +08:00
YunaiV
e6e0621c20 feat:【antd】【pay 支付】pay/app 代码优化 2/4 2025-10-05 18:56:39 +08:00
YunaiV
7bdfa99042 feat:【antd】【pay 支付】pay/app 代码优化 1/4 2025-10-05 16:51:59 +08:00
YunaiV
98d7ed663f fix:【antd】【erp 系统】tableData.value.findIndex((item) => item.id === row.id) 不正确的问题,使用 seq 比对 2025-10-05 14:38:00 +08:00
YunaiV
c6bd38f98d fix:【antd】【erp 系统】finance/account 切换默认的逻辑未实现 2025-10-05 14:19:28 +08:00
YunaiV
8266490674 feat:【antd】【erp 系统】finance/receipt 的迁移 4/4(已完成) 2025-10-05 13:59:14 +08:00
YunaiV
ce709742fd feat:【antd】【erp 系统】finance/receipt 的迁移 4/4(已完成) 2025-10-05 13:59:01 +08:00
YunaiV
8789cd1ff2 feat:【antd】【erp 系统】统一审批接口的写法与调用 2025-10-05 11:12:19 +08:00
YunaiV
95ba94ee5e feat:【antd】【erp 系统】finance/receipt 的迁移 1/4(初始化) 2025-10-05 11:04:27 +08:00
YunaiV
9a17613823 feat:【antd】【erp 系统】finance/payment 的迁移 4/4(form 部分) 2025-10-05 10:52:17 +08:00
YunaiV
14dd95b915 feat:【antd】【erp 系统】finance/payment 的迁移 4/4(form 部分) 2025-10-05 10:52:13 +08:00
YunaiV
43533b5499 feat:【antd】【erp 系统】finance/payment 的迁移 2/4(form 部分) 2025-10-05 10:30:48 +08:00
YunaiV
af29a0e29b feat:【antd】【erp 系统】finance/payment 的迁移 2/4(form 部分) 2025-10-05 10:19:22 +08:00
YunaiV
386919030d feat:【antd】【erp 系统】finance/payment 的迁移 1/4(列表 ok) 2025-10-05 09:28:53 +08:00
YunaiV
02adb68581 feat:【antd】【erp 系统】库存相关的 3 位保留的补全 2025-10-05 09:19:39 +08:00
YunaiV
f98cef8c71 feat:【antd】【erp 系统】stock/check 1/1 重构完成 2025-10-05 09:00:39 +08:00
YunaiV
9567fb39c1 feat:【antd】【erp 系统】stock/move 1/1 重构完成 2025-10-05 08:52:58 +08:00
YunaiV
33de8dcdf2 feat:【antd】【erp 系统】stock/out 1/1 重构完成 2025-10-04 22:34:25 +08:00
YunaiV
a6c4fde2c4 feat:【antd】【erp 系统】stock/in 1/1 重构完成 2025-10-04 21:52:37 +08:00
YunaiV
a7c4e6ac11 feat:【antd】【erp 系统】purchase/in 重构 4/4(bugfix) 2025-10-04 21:34:11 +08:00
YunaiV
7d3f5dc149 feat:【antd】【erp 系统】purchase/return 重构 4/4 2025-10-04 21:26:43 +08:00
YunaiV
7d9b3f89fa feat:【antd】【erp 系统】purchase/return 重构 2/4 2025-10-04 21:14:41 +08:00
YunaiV
1350342715 feat:【antd】【erp 系统】purchase/return 重构 1/4 2025-10-04 21:04:30 +08:00
YunaiV
655b3d87c0 feat:【antd】【erp 系统】purchase/in 重构 4/4 2025-10-04 20:52:20 +08:00
YunaiV
ff2f176917 feat:【antd】【erp 系统】purchase/in 重构 4/4 2025-10-04 20:37:30 +08:00
YunaiV
f7c0b41199 feat:【antd】【erp 系统】purchase/in 重构 1/4 2025-10-04 20:05:58 +08:00
YunaiV
c401000eb9 feat:【antd】【erp 系统】purchase/order 重构 4/4 2025-10-04 20:00:37 +08:00
YunaiV
9406593d6e feat:【antd】【erp 系统】purchase/order 重构 3/4 2025-10-04 19:37:28 +08:00
YunaiV
2039cbc0d0 feat:【antd】【erp 系统】purchase/order 重构 2/4 2025-10-04 19:27:44 +08:00
YunaiV
5e13d28d46 feat:【antd】【erp 系统】purchase/order 重构 1/4 2025-10-04 19:18:22 +08:00
YunaiV
7250934a41 feat:【antd】【erp 系统】sale 重构代码风格(增加已出库等动态列) 2025-10-04 17:07:58 +08:00
YunaiV
dd9fd6e284 feat:【antd】【erp 系统】sale 重构代码风格(修复“优惠后金额”未计算的问题) 2025-10-04 16:48:03 +08:00
YunaiV
888a6d9ec8 feat:【antd】【erp 系统】sale 重构代码风格(处理文案等) 2025-10-04 16:29:36 +08:00
YunaiV
a9c9e0f8b2 feat:【antd】【erp 系统】stock/stock 重构代码风格 2025-10-04 15:44:11 +08:00
YunaiV
34167a38de feat:【antd】【erp 系统】stock/record 重构代码风格 2025-10-04 15:39:56 +08:00
YunaiV
b0c32a2a18 feat:【antd】【erp 系统】finance/account 重构代码风格 2025-10-04 15:31:26 +08:00
YunaiV
f63cb9ed2f feat:【antd】【erp 系统】sale/return 重构初始化 2025-10-04 15:16:51 +08:00
YunaiV
480ed5c83d feat:【antd】【erp 系统】sale/out 全部重构 ok 2025-10-04 15:04:12 +08:00
YunaiV
3182a86b80 feat:【antd】调整 formatNumber 为 formatAmount3 保留 3 位,formatAmount2 保留 2 位 2025-10-04 14:53:31 +08:00
YunaiV
ceabd731ba feat:【antd】【erp 系统】sale/out 部分重构(sale-order-select) 2025-10-04 14:45:03 +08:00
YunaiV
40b5d952eb feat:【antd】【erp 系统】sale/out 部分重构(form 基本重构完) 2025-10-04 10:56:40 +08:00
YunaiV
86e701ba3a feat:【antd】【erp 系统】sale/out 部分重构(form 部分重构 +1) 2025-10-04 10:21:14 +08:00
YunaiV
c603b7002c feat:【antd】【erp 系统】sale/out 部分重构(form 部分重构) 2025-10-04 09:52:40 +08:00
YunaiV
c8c4693983 feat:【antd】【erp 系统】sale/out 部分重构(列表 ok) 2025-10-04 09:15:11 +08:00
YunaiV
e073a40153 feat:【antd】【erp 系统】sale/out 部分重构(列表 ok) 2025-10-04 09:15:01 +08:00
YunaiV
d5712f2640 feat:【antd】【erp 系统】sale/order 重构完成 2025-10-03 20:54:22 +08:00
YunaiV
83cffeafc3 feat:【antd】【erp 系统】sale/order 部分代码优化(form 基本完善) 2025-10-03 20:38:44 +08:00
YunaiV
95295d5b93 feat:【框架】form-api 增加 disabled 控制的能力 2025-10-03 20:15:31 +08:00
YunaiV
e9fafab07c feat:【antd】【erp 系统】sale/order 部分代码优化(form 继续优化代码) 2025-10-03 20:06:05 +08:00
YunaiV
945e0902ae feat:【antd】【erp 系统】sale/order 部分代码优化(form 修复 init 问题) 2025-10-03 19:37:56 +08:00
YunaiV
b57cbc798a feat:【antd】【erp 系统】sale/order 部分代码优化(form 中量) 2025-10-03 18:36:05 +08:00
YunaiV
3f0c60be04 feat:【antd】【erp 系统】sale/order 部分代码优化(form 中量) 2025-10-03 18:26:30 +08:00
YunaiV
3902005ad4 feat:【antd】【erp 系统】sale/order 部分代码优化(form 少量) 2025-10-03 17:21:08 +08:00
YunaiV
8d897e89a3 feat:【antd】【erp 系统】sale/order 部分代码优化 2025-10-03 16:14:30 +08:00
YunaiV
1a33f2562e feat:【antd】【erp 系统】customer 迁移 2025-10-03 11:50:26 +08:00
YunaiV
c208c56f72 feat:【antd】【erp 系统】warehouse 迁移 2025-10-03 11:38:08 +08:00
YunaiV
2572824d1a feat:【antd】【erp 系统】warehouse 迁移 2025-10-03 11:37:34 +08:00
YunaiV
85b6d0c4d6 feat:【antd】【erp 系统】supplier 迁移 2025-10-03 10:12:00 +08:00
YunaiV
eeb1f1ebf9 feat:【antd】【erp 系统】product 迁移 2025-10-03 09:55:03 +08:00
YunaiV
325cede2ed feat:【antd】【ele】统一 await formApi.setValues(formData.value); 的写法 2025-10-03 09:07:01 +08:00
YunaiV
7934cbdd7b feat:【antd】【erp 系统】product unit 迁移 2025-10-03 08:58:11 +08:00
YunaiV
f3390427ac feat:【antd】【erp 系统】product category 迁移 2025-10-03 08:52:55 +08:00
YunaiV
bfbf97874c feat:【antd】【erp 系统】product category 迁移 2025-10-03 08:50:43 +08:00
YunaiV
76b00821cb feat:【antd】【erp 系统】home 界面的代码优化 2025-10-02 20:14:20 +08:00
YunaiV
1bf4238609 Merge branch 'master' of https://github.com/yudaocode/yudao-ui-admin-vben into dev 2025-10-02 16:17:02 +08:00
芋道源码
63f58fa84d !219 【antd】CRM 迁移彻底完成
Merge pull request !219 from 芋道源码/dev
2025-10-02 08:10:55 +00:00
YunaiV
463a9fb509 fix:【pay 支付】微信支付 publicKeyContent 调整为非必填,兼容 https://t.zsxq.com/ODR5V、https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICUE53 2025-10-02 10:24:10 +08:00
YunaiV
783f510229 fix:【bpm 工作流】已办任务的审批状态过滤不正确 2025-10-02 09:35:46 +08:00
YunaiV
92c433a6aa feat:【antd】【ele】统一 infra 和 system 的代码风格(demo03/normal) 2025-10-01 13:00:13 +08:00
YunaiV
599e1b342a feat:【antd】【ele】统一 infra 和 system 的代码风格(demo03/inner) 2025-10-01 12:44:06 +08:00
YunaiV
2e2a147815 feat:【antd】【ele】统一 infra 和 system 的代码风格(demo03/erp) 2025-10-01 10:48:23 +08:00
YunaiV
67b39cfe8a feat:【antd】【ele】统一 infra 和 system 的代码风格(demo01、demo02) 2025-10-01 09:49:04 +08:00
YunaiV
cdc0cbc431 feat:【antd】【crm】团队成员的代码实现 2025-09-30 22:23:54 +08:00
YunaiV
5eec2050a9 feat:【antd】【crm】跟进记录的代码优化 2025-09-30 22:13:37 +08:00
YunaiV
3708af6738 feat:【antd】【crm】回款的新增/修改的时,正确处理合同 2025-09-30 20:52:00 +08:00
YunaiV
6b0d783564 feat:【antd】【crm】修改时,负责人不允许直接修改 2025-09-30 20:01:37 +08:00
lw567
6e03de5011 fix: watermark create error #6788 (#6789)
Co-authored-by: liwei567 <liwei567@example.com>
2025-09-30 19:53:09 +08:00
YunaiV
6410c83b13 feat:【antd】【crm】修改时,负责人不允许直接修改 2025-09-30 19:51:24 +08:00
YunaiV
9e6d8ff3e9 feat:【antd】【crm】调整操作日志和团队成员的标签顺序,优化表单字段的规则和属性 2025-09-30 19:42:20 +08:00
YunaiV
0f6868febf feat:【antd】【crm】将 defineAsyncComponent 调整成 export 2025-09-30 15:24:00 +08:00
YunaiV
0d07db46f0 feat:【antd】【crm】优化整体的 allowClear 2025-09-30 14:56:55 +08:00
YunaiV
2d5f24c626 feat:【antd】【crm】优化 statistics 的整体代码 2025-09-30 13:16:52 +08:00
YunaiV
0d1901abdb feat:【antd】【crm】优化 backlog 的整体代码 2025-09-30 13:08:46 +08:00
YunaiV
f381f934e8 feat:【antd】【crm】优化 receivable-plan 的整体代码风格 2025-09-30 09:56:35 +08:00
YunaiV
05ec6a16b3 feat:【antd】【crm】优化 receivable-plan 的整体代码风格 2025-09-30 09:24:52 +08:00
HaHa
713281a8ba fix(theme-button): fix flicker during theme switch (#6782) 2025-09-30 05:10:51 +08:00
shierd
42e3de9e2c fix: 修复设置表单值时合并子对象的错误 (#6780)
Co-authored-by: shier <shier@shierd.com>
2025-09-30 05:10:39 +08:00
vent
1e029dbc9a fix: 修复部分场景 echarts 在使用 v-show 时获取不到 width 的问题 (#6776) 2025-09-30 05:09:33 +08:00
YunaiV
0afd36172b feat:【antd】【crm】优化 receivable-plan 的整体代码风格 2025-09-29 23:32:16 +08:00
YunaiV
9bfd314311 feat:【antd】【crm】优化 receivable 的整体代码风格 2025-09-29 23:19:46 +08:00
YunaiV
e441978662 feat:【antd】【crm】优化 receivable 的整体代码风格 2025-09-29 09:47:16 +08:00
YunaiV
985dca4990 feat:【antd】【crm】优化合同的整体代码风格 2025-09-29 09:16:44 +08:00
YunaiV
a4aa2b7711 feat:【antd】【crm】优化合同的整体代码风格 2025-09-29 09:16:16 +08:00
YunaiV
876768e98d feat:【antd】【crm】优化合同的整体代码风格 2025-09-29 08:41:41 +08:00
YunaiV
41530a40e5 feat:【antd】【crm】优化合同配置的代码 2025-09-28 23:09:44 +08:00
YunaiV
252b530526 feat:【antd】【crm】商机状态的代码优化 2025-09-28 23:00:40 +08:00
YunaiV
9c564ea3af feat:【antd】【crm】商机的整体代码结构优化 2025-09-28 22:46:00 +08:00
YunaiV
1a3441b662 feat:【antd】【crm】商机的整体代码结构优化 2025-09-28 21:06:08 +08:00
YunaiV
c60c2a5b76 feat:【antd】【crm】商机的整体代码结构优化 2025-09-28 21:04:20 +08:00
YunaiV
3d2a53a6b2 feat:【antd】【crm】产品的 components 优化 2025-09-28 20:00:06 +08:00
YunaiV
ee3af0293b feat:【antd】【crm】产品的列表、详情优化 2025-09-28 13:02:10 +08:00
YunaiV
43c3169c54 feat:【antd】【crm】产品分类的代码优化 2025-09-28 09:51:07 +08:00
YunaiV
968552ec4b feat:【antd】【crm】客户公海分配 form 的优化 2025-09-27 21:10:02 +08:00
YunaiV
3ba046def7 feat:【antd】【crm】客户公海分配 form 的优化 2025-09-27 21:08:08 +08:00
YunaiV
9dd6e0f687 feat:【antd】【crm】客户公海配置优化 2025-09-27 20:40:34 +08:00
YunaiV
45fb4dc3fe feat:【antd】【crm】客户限制配置的重构与修复部分缺陷 2025-09-27 17:19:54 +08:00
YunaiV
082fddcb64 feat:【antd】【crm】线索、联系人的详情,改成 TableAction 实现 2025-09-27 17:04:06 +08:00
YunaiV
10018fcc85 feat:【antd】【crm】客户的详情的重构 2025-09-27 16:56:36 +08:00
YunaiV
09abc9cead feat:【antd】【crm】客户的列表的重构 2025-09-27 16:36:18 +08:00
YunaiV
06633c336e feat:【antd】【crm】联系人列表和详情组件的重构与优化 2025-09-27 15:44:55 +08:00
YunaiV
84bb8331c2 feat:【antd】【crm】contact 详情的优化 2025-09-27 15:25:09 +08:00
YunaiV
af291928ad review:【antd】流程设计器、文件上传等 2025-09-27 14:02:47 +08:00
xingyu4j
f50ca431ec docs: readme 2025-09-26 13:48:15 +08:00
xingyu4j
9936be1346 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-26 13:46:48 +08:00
xingyu4j
a56ab2212d fix: lint 2025-09-26 13:46:21 +08:00
xingyu
27d767f812 !218 ele:重新封装上传组件、新增 CronTab CRON 表达式配置组件
Merge pull request !218 from puhui999/dev-ele
2025-09-26 05:43:12 +00:00
puhui999
8229ca1335 fix:【ele】代码生成预览 2025-09-26 11:12:32 +08:00
puhui999
f0fbaf45f4 refactor:【ele】重新封装上传组件 2025-09-26 10:52:30 +08:00
YunaiV
0d018c37c5 feat:【antd】【crm】contact form 的优化 2025-09-26 08:38:57 +08:00
YunaiV
3c0723d82f feat:【antd】【crm】contact 列表的优化 2025-09-25 23:39:44 +08:00
YunaiV
655940bc4f feat:【antd】【crm】contact 整体结构调整 2025-09-25 21:39:06 +08:00
puhui999
c64c770f54 feat:【ele】新增 CronTab CRON 表达式配置组件、JOB 表单优化 2025-09-25 17:05:26 +08:00
xingyu4j
daf0cd9f27 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-25 16:35:19 +08:00
xingyu
7157254482 !217 上传组件增加 modelValue 参数适配,同时支持 modelValue 和 value 参数(适配 FormCreate)
Merge pull request !217 from puhui999/dev-form-create
2025-09-25 08:32:33 +00:00
puhui999
1f1a26bc11 feat:【antd】优化 bpmn-process-designer 组件图标 2025-09-25 11:52:26 +08:00
puhui999
510825bb49 feat:【antd】图片上传组件增加 modelValue 参数适配,同时支持 modelValue 和 value 参数(适配 FormCreate) 2025-09-25 11:29:10 +08:00
xingyu4j
0b64363eeb Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-25 11:23:52 +08:00
puhui999
fbeeb151ff feat:【antd】文件上传组件增加 modelValue 参数适配,同时支持 modelValue 和 value 参数(适配 FormCreate) 2025-09-25 11:16:56 +08:00
YunaiV
484cd432fe feat:【antd】【crm】基本完成代码风格优化和统一 2025-09-25 09:38:51 +08:00
puhui999
9bd1252dd6 feat:【antd】优化 bpmn-process-designer penal 样式 2025-09-24 20:45:30 +08:00
xingyu4j
808b2970ca fix: lint 2025-09-24 18:08:21 +08:00
xingyu4j
b26f9b1380 feat: use common-ui ContentWrap 2025-09-24 15:05:23 +08:00
xingyu4j
80b2e4fce4 feat: add ContentWrap comp 2025-09-24 15:04:29 +08:00
xingyu4j
0cfdbe75e4 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-09-24 14:30:35 +08:00
xingyu4j
959c747f69 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-24 14:17:22 +08:00
puhui999
aaa821fbee fix:【antd】移除 bpmn-process-designer 不必要的编译器宏导入 2025-09-24 11:07:34 +08:00
YunaiV
8324295ee6 feat:【antd】【crm】重构 clue detail 路由 2025-09-24 09:52:31 +08:00
YunaiV
7dc6929b79 feat:【antd】【crm】增加 clue detail 的优化想法 2025-09-24 09:36:46 +08:00
Cup_Of_Bread
81bb7456f8 fix: 修复注解错误 (#6763) 2025-09-23 23:49:25 +08:00
pangyajun123
26f8d2aa30 perf: 表单需要通过权限控制是否需要展示,dependencies.if 这种方式需要别triggerFields触发字段,不能满足要求 (#6756) 2025-09-23 23:48:27 +08:00
YunaiV
95ce3e40f7 feat:【antd】【crm】优化 clue 线索的列表界面 2025-09-23 23:47:09 +08:00
boisduval
a8b848d367 fix: 解决搜索表单中arrayToStringFields属性无法在搜索时生效的问题 (#6591)
- 合并handleArrayToStringFields与handleStringToArrayFields为handleMultiFields
- 在handleMultiFields判断arrayToString或stringToArray
- 删除两个方法在其他地方的引用 统一为在handleRangeTimeValue内调用handleMultiFields实现数据转换

Co-authored-by: 宛晴 <wanqing@mengtaigroup.com>
2025-09-23 23:45:26 +08:00
YunaiV
634b5be676 feat:【antd】【crm】优化 clue 线索的列表界面 2025-09-23 23:44:56 +08:00
xingyu4j
d3513782b0 fix: mp api 2025-09-23 15:07:59 +08:00
xingyu4j
b7bb7ecd5d Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-23 14:52:15 +08:00
YunaiV
94c5c4c57e feat:【antd】【ele】统一 infra 和 system 的代码风格 2025-09-23 09:42:06 +08:00
YunaiV
5ddc25f4f2 feat:【antd】【ele】统一 mail/template 的实现 2025-09-23 09:21:08 +08:00
YunaiV
3c67ecada0 feat:【antd】【ele】统一 dataSourceConfig 的实现 2025-09-23 08:31:14 +08:00
YunaiV
af74cf6ad9 feat:【antd】【ele】统一 infra 和 system 的代码风格 2025-09-23 00:04:41 +08:00
xingyu4j
a143e0cee3 fix: lint 2025-09-22 18:53:39 +08:00
xingyu4j
b6d7dda0b3 fix: 空白页面关闭后其他页面无法正常显示 2025-09-22 18:40:00 +08:00
xingyu4j
ac82b49425 fix: iframe 2025-09-22 18:31:02 +08:00
xingyu4j
be1250e71a fix: mp tag 2025-09-22 18:13:52 +08:00
xingyu4j
47c0c847eb feat: 统一消息提醒 2025-09-22 18:06:09 +08:00
YunaiV
a1e756c0e5 feat:【antd】【ele】统一 api 的 system、infra 实现 2025-09-22 12:58:22 +08:00
YunaiV
6ca2b0f1ca feat:【antd】【ele】统一 codegen、file 的 API 参数 2025-09-22 09:59:22 +08:00
YunaiV
c9f123be2a feat:【antd】数据源管理,增加批量删除 2025-09-22 09:24:05 +08:00
YunaiV
38919dfc8e fix:【antd】【ele】activeMenu => activePath 解决激活菜单 2025-09-21 21:59:01 +08:00
芋道源码
d21031ecf4 Merge pull request #125 from inside5545/master
fix:流程表单字典选择器无法正常回显
2025-09-21 11:22:46 +08:00
苏俊言
c4babbecf0 fix:流程表单字典选择器无法正常回显 2025-09-20 16:55:41 +08:00
YunaiV
ca3fae4611 fix:【pay 支付】收银界面,关闭后清理定时轮询 2025-09-20 12:45:40 +08:00
YunaiV
65d24fa6be feat:【antd】【bpm 工作流】开启流程类型的 BPMN 的配置 2025-09-20 10:17:28 +08:00
xingyu
45a5c9bc8e !214 merge dev
Merge pull request !214 from xingyu/dev
2025-09-19 08:20:33 +00:00
xingyu4j
66e2158fa7 chore: ele 缺失 tinymce 依赖 2025-09-19 16:18:40 +08:00
xingyu4j
d9a543ffaa fix: lint 2025-09-19 16:12:16 +08:00
xingyu4j
a75754c2ec fix: ele 不存在InputPassword组件 2025-09-19 16:09:45 +08:00
xingyu4j
033bd21ff8 fix: assign menu form 2025-09-19 16:09:14 +08:00
xingyu4j
2f55bca2e4 fix: 使用Tree替换原有VbenTree 2025-09-19 16:08:23 +08:00
xingyu4j
7689aff790 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-09-18 17:58:14 +08:00
ming4762
482ce981ce chore: update deps vxe, vxe-table: 4.14.4 -> 4.16.11 vxe-pc-ui: 4.7.… (#6752)
* chore: update deps vxe, vxe-table: 4.14.4 -> 4.16.11  vxe-pc-ui: 4.7.12 -> 4.9.29

* fix: resolve the ESLint warning generated by #6317
2025-09-17 17:42:39 +08:00
Jin Mao
97ad93ab1f Merge branch 'zouawen-main' 2025-09-17 17:41:05 +08:00
Jin Mao
319b7fcdaa Merge branch 'main' of https://github.com/zouawen/vue-vben-admin into zouawen-main 2025-09-17 17:37:43 +08:00
Jin Mao
4de8220ce6 feat(common-ui): 添加 Tree 组件
- 在 common-ui 包中新增 Tree 组件
- 实现了基本的树形结构展示功能
- 集成了 VbenTree 组件和自定义样式- 添加了空数据时的占位展示
2025-09-17 17:28:39 +08:00
xingyu
fce9536213 !213 bpmn 流程模型设计器 bpmn-process-designer 整合
Merge pull request !213 from puhui999/dev
2025-09-15 10:31:45 +00:00
xingyu4j
e0c2ebae8a Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-09-15 13:56:25 +08:00
xingyu4j
3c5285ba72 chore: 恢复 单引号 2025-09-15 13:56:03 +08:00
xingyu4j
65bbccbe9e Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-15 13:41:30 +08:00
puhui999
058e20d311 style: 移除 bpmn-process-designer element-variables.scss 2025-09-15 11:37:12 +08:00
puhui999
2458046afe fix: bpmn-process-designer SelectOption 标题展示问题 2025-09-15 11:18:45 +08:00
puhui999
40e04f773d fix: bpmn-process-designer structuredClone => cloneDeep 2025-09-15 11:05:25 +08:00
puhui999
9e3b4461cf fix: 修复 bpmn-process-designer 图标使用问题,使用 h 函数 2025-09-15 10:44:36 +08:00
puhui999
9af3745670 feat: bpmn 流程模型设计器 bpmn-process-designer 整合 2025-09-15 10:23:17 +08:00
puhui999
26f00f3d37 refactor: 重构 bpmnProcessDesigner => bpmn-process-designer 2025-09-15 09:43:52 +08:00
芋道源码
391f08804f !212 迁移重构 bpmnProcessDesigner 组件 ele => antd
Merge pull request !212 from puhui999/dev
2025-09-15 01:17:14 +00:00
Jin Mao
9114692f95 Merge branch 'main' into main 2025-09-15 08:08:31 +08:00
Jin Mao
0f7731b611 Merge branch 'ming4762-stream-2025091101' 2025-09-15 08:03:52 +08:00
Jin Mao
8040bc1a22 Merge branch 'stream-2025091101' of https://github.com/ming4762/smart-boot-ui-vben into ming4762-stream-2025091101 2025-09-15 08:02:30 +08:00
oc
11d273cbb6 feat(authentication): 二维码登录和验证码登录组件增加返回按钮显隐配置 (#6713)
- 在 CodeLogin 和 QrcodeLogin 组件中添加 showBack 属性
- 根据 showBack 属性决定是否显示返回按钮
- 默认值为 true,即默认显示返回按钮
2025-09-15 07:43:18 +08:00
puhui999
85de19a422 Merge remote-tracking branch 'yudao/dev' into dev 2025-09-14 19:54:23 +08:00
puhui999
9f1c3831fa refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-14 19:53:25 +08:00
puhui999
6ffd3dbd67 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-14 18:20:11 +08:00
puhui999
71dd9f2d88 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-14 18:16:02 +08:00
zouawen
a4b8f8f795 fix: 节点选中时过滤父节点禁用状态 2025-09-12 17:31:42 +08:00
xingyu4j
39081139e2 fix: element-plus button 的 text 类型,后续会废弃 2025-09-12 16:38:25 +08:00
xingyu4j
2c5557aa30 fix: codegen demo 2025-09-12 16:14:16 +08:00
xingyu
5f5fb9e544 !211 fix(system): 角色管理分配菜单使用简化菜单列表接口
Merge pull request !211 from Lex/dev
2025-09-12 03:35:50 +00:00
Lex
94d44340a3 fix(system): 角色管理分配菜单使用简化菜单列表接口
- 在 web-antd、web-ele 和 web-naive 应用中,修改了角色管理模块的分配菜单表单
- 将原有的 getMenuList() 调用替换为 getSimpleMenusList(),用于【角色分配菜单】功能的选项。在多租户的场景下,会只返回租户所在套餐有的菜单
2025-09-12 10:19:08 +08:00
zouawen
dfa2ac3435 fix: 全选时过滤disabled的节点 2025-09-11 18:16:10 +08:00
zouawen
39820c783c fix:
1、VbenTree新增是否全选、展开折叠功能;
2、解决当点击子节点label文字区域,而非checkbox时,关联父组件不能选中问题;
3、优化子节点选中时关联父节点选中功能:删除VbenTree中processParentSelection方法,改为在onSelect中实现,原因:processParentSelection在每次模型值更新时都会被调用,且计算复杂度为O(n^2),onSelect只在交互时触发,复杂度为O(n);
4、新增中间层tree组件,处理无数据时显示场景(显示图标Inbox和国际化comom.noData文本);
5、为防止父组件传值子组件boolean类型默认false问题,新增treePropsDefaults方法,为TreeProps赋默认值,Tree组件和VbenTree组件统一使用;
6、优化VbenTree组件整体样式(优化padding、margin、gap值,优化type为button时outline左右空白区域不对称问题),优化内部header、footer插槽样式。
2025-09-11 16:41:42 +08:00
xingyu4j
ccbcb3d9bf docs: readme 2025-09-11 14:48:25 +08:00
zhongming4762
66822a5f95 feat: add SSE support to request-client 2025-09-11 11:22:47 +08:00
zhongming4762
eb4f1f8164 feat: add SSE support to request-client 2025-09-11 10:50:19 +08:00
YunaiV
e3e3c2e968 reactor:统一 Description 命名为 Descriptions 2025-09-10 23:58:31 +08:00
YunaiV
5ec4d8ab82 reactor:【infra 基础设施】infra 的 job、joblogger 描述的统一 2025-09-10 23:50:56 +08:00
YunaiV
21f76355fa reactor:【infra 基础设施】infra 的 job、joblogger 描述的统一 2025-09-10 22:33:38 +08:00
puhui999
a277f0fa03 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-10 15:39:32 +08:00
puhui999
6759bd1b77 refactor: 重构 bpmnProcessDesigner listeners 组件 ele => antd 2025-09-10 15:03:49 +08:00
xingyu4j
4cb1ecfb1c refactor: 移动 iframe 到 @vben/common-ui 2025-09-10 11:55:09 +08:00
puhui999
f17e4fdc58 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-10 11:30:08 +08:00
YunaiV
b3a4a91a25 reactor:【system 系统管理】notifymessage、operatelog、socialuser 2025-09-10 09:53:55 +08:00
YunaiV
6bf1392edf reactor:【system 系统管理】loginlog、maillog、smslog 的描述统一 2025-09-10 00:37:49 +08:00
YunaiV
69b662bb53 reactor:【system 系统管理】loginlog、maillog、smslog 的描述统一 2025-09-10 00:29:08 +08:00
YunaiV
68f64c9d67 reactor:【infra 基础设施】build 进一步统一代码风格 2025-09-09 23:24:31 +08:00
芋道源码
0bff8bd7a9 !210 feat: ele table-toolbar
Merge pull request !210 from 芋道源码/dev-vxe
2025-09-09 15:17:55 +00:00
YunaiV
16f4892fac reactor:【infra 基础设施】codegen 进一步统一代码风格(100%) 2025-09-09 23:11:33 +08:00
YunaiV
044db12224 reactor:【infra 基础设施】codegen 进一步统一代码风格(50%) 2025-09-09 22:58:58 +08:00
xingyu4j
a5156f1e10 feat: ele table-toolbar 2025-09-09 19:44:07 +08:00
YunaiV
08b4176fb3 reactor:【infra 基础设施】job/logger 进一步统一代码风格 2025-09-09 18:44:42 +08:00
puhui999
b913ece251 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-09 17:49:46 +08:00
puhui999
be276ac651 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-09 17:43:40 +08:00
xingyu4j
29e5017913 feat: table-toolbar 2025-09-09 17:04:57 +08:00
YunaiV
b3a65f2492 reactor:【infra 基础设施】job 进一步统一代码风格 2025-09-09 13:18:27 +08:00
YunaiV
96158f22b9 reactor:【infra 基础设施】config 进一步统一代码风格 2025-09-09 12:20:48 +08:00
YunaiV
8d10030185 reactor:【infra 基础设施】file 进一步统一代码风格 2025-09-09 09:56:09 +08:00
YunaiV
cdc350cef9 reactor:【infra 基础设施】fileConfig 进一步统一代码风格 2025-09-09 09:06:46 +08:00
YunaiV
b52f7803ad reactor:【infra 基础设施】fileConfig 进一步统一代码风格 2025-09-09 09:06:42 +08:00
YunaiV
6bb4005ae0 reactor:【infra 基础设施】redis 进一步统一代码风格 2025-09-08 23:51:07 +08:00
YunaiV
58ed3bfc2e reactor:【system 系统管理】infra 的 apiErrorLog 进一步统一代码风格 2025-09-08 23:42:43 +08:00
YunaiV
cec3b7ab1e reactor:【system 系统管理】infra 的 apiAccessLog 进一步统一代码风格 2025-09-08 23:25:33 +08:00
YunaiV
2e38b1906d fix:【element-plus】getRangePickerDefaultProps 默认结束为 23:59:59 2025-09-08 23:24:02 +08:00
YunaiV
51d2d66f76 fix:【element-plus】button 的 text 类型,后续会废弃 2025-09-08 23:00:53 +08:00
YunaiV
2becb1b09d reactor:【system 系统管理】menu 进一步统一代码风格 2025-09-08 22:53:18 +08:00
puhui999
3665e655e2 refactor: 重构 bpmnProcessDesigner 组件 ele => antd 2025-09-08 17:36:21 +08:00
YunaiV
3564c123a1 reactor:【system 系统管理】menu 进一步统一代码风格(暂时只包括 element-plus) 2025-09-08 13:12:57 +08:00
YunaiV
96dadf9971 reactor:【system 系统管理】user 进一步统一代码风格(dept tree) 2025-09-08 12:51:07 +08:00
YunaiV
28df31cc37 reactor:【system 系统管理】user 进一步统一代码风格 2025-09-08 09:52:43 +08:00
puhui999
ed1b152a39 refactor: 重构 bpmnProcessDesigner ProcessPalette 组件 ele => antd 2025-09-07 19:36:10 +08:00
puhui999
3036a174fc refactor: 重构 bpmnProcessDesigner designer 模块 ele => antd 2025-09-07 19:25:34 +08:00
YunaiV
74ffefb09f fix:【infra 基础设施】websocket 推送,无法选中所有人 2025-09-06 21:21:43 +08:00
YunaiV
4cbbad4d40 reactor:【system 系统管理】tenantPackage 进一步统一代码风格 2025-09-06 20:54:48 +08:00
YunaiV
942c4ef389 reactor:【system 系统管理】tenant 进一步统一代码风格 2025-09-06 20:46:33 +08:00
YunaiV
35bd5adf45 reactor:【system 系统管理】social 进一步统一代码风格 2025-09-06 20:32:46 +08:00
YunaiV
8d5a6d8aa0 reactor:【system 系统管理】role 进一步统一代码风格 2025-09-06 20:17:38 +08:00
YunaiV
6d47871f02 reactor:【system 系统管理】operate 进一步统一代码风格 2025-09-06 19:55:38 +08:00
YunaiV
1d11ebad3a reactor:【system 系统管理】oauth2/token 进一步统一代码风格 2025-09-06 19:47:13 +08:00
YunaiV
c9e782fefe reactor:【system 系统管理】oauth2/client 进一步统一代码风格 2025-09-06 19:38:48 +08:00
YunaiV
4bdd5552dd feat:【element-plus】form schema 支持 InputTag 组件 2025-09-06 19:38:35 +08:00
YunaiV
03618a6265 reactor:【system 系统管理】sms/template 进一步统一代码风格 2025-09-06 17:36:04 +08:00
YunaiV
15359ab9a3 reactor:【system 系统管理】sms/channel 进一步统一代码风格 2025-09-06 17:18:17 +08:00
YunaiV
965ccdbea1 reactor:【system 系统管理】notify/my 进一步统一代码风格 2025-09-06 16:39:52 +08:00
YunaiV
11f507ed2b reactor:【system 系统管理】notify/message 进一步统一代码风格 2025-09-06 16:13:49 +08:00
YunaiV
94d778c0df reactor:【system 系统管理】notify/template 进一步统一代码风格 2025-09-06 15:44:02 +08:00
YunaiV
a38e55651b reactor:【system 系统管理】岗位 post 进一步统一代码风格 2025-09-06 15:12:58 +08:00
YunaiV
5f77cde53f reactor:【system 系统管理】mail/log 进一步统一代码风格 2025-09-06 11:21:34 +08:00
YunaiV
9565de2b5c reactor:【system 系统管理】mail/template 进一步统一代码风格 2025-09-06 11:13:27 +08:00
YunaiV
e3b2f944a8 reactor:【system 系统管理】mail/account 进一步统一代码风格 2025-09-06 10:37:26 +08:00
YunaiV
0539aece1b fix:【system 系统管理】ele、antd 的搜索清理属性不对的问题 2025-09-06 10:24:59 +08:00
YunaiV
fcaa81ff3b reactor:【system 系统管理】area、dept、dict、loginlog 进一步统一代码风格 2025-09-06 09:39:09 +08:00
YunaiV
84e32a0884 reactor:【system 系统管理】dict 在 element-plus 和 antd 保持一致 2025-09-06 00:20:05 +08:00
YunaiV
e81a759e0d reactor:element-plus 移除 loading 的 fullscreen = true(默认就是 true) 2025-09-05 23:39:33 +08:00
YunaiV
8d93c843ad reactor:【system 系统管理】area 在 element-plus 和 antd 保持一致 2025-09-05 23:27:12 +08:00
YunaiV
079dac3969 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(处理上级逻辑) 2025-09-05 23:12:31 +08:00
YunaiV
330b06e024 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(处理上级逻辑) 2025-09-05 22:59:23 +08:00
YunaiV
4183fee283 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(isExpanded 放在 onRefresh 前面) 2025-09-05 22:46:50 +08:00
YunaiV
92044f8282 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(handleAppend 注释文案统一) 2025-09-05 22:13:41 +08:00
YunaiV
4cd1be1a31 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(pagerConfig 顺序) 2025-09-05 22:07:37 +08:00
YunaiV
c34fdcc5e8 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd(reserve 持久化树状态) 2025-09-05 21:22:57 +08:00
YunaiV
5776bf99f8 reactor:【system 系统管理】dept 部门管理的实现,对齐 ele 和 antd 2025-09-05 20:28:47 +08:00
xingyu4j
817a157645 feat: antdv mall spu form 2025-09-05 16:17:10 +08:00
puhui999
82fdcb5da5 feat: bpmnProcessDesigner 迁移(纯复制) 2025-09-05 15:38:09 +08:00
xingyu4j
f30a3451de fix: todo 2025-09-05 14:11:35 +08:00
xingyu4j
2369f06654 fix: crm todo 2025-09-05 13:16:29 +08:00
xingyu
2daebde092 !209 refactor: dict 抽离
Merge pull request !209 from 芋道源码/dev-dict
2025-09-05 04:30:09 +00:00
xingyu
a303a93a6d Merge branch 'dev' of gitee.com:yudaocode/yudao-ui-admin-vben into dev-dict
Signed-off-by: xingyu <xingyu4j@vip.qq.com>
2025-09-05 04:28:43 +00:00
xingyu4j
ffbaa89323 Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-09-05 12:26:36 +08:00
xingyu4j
c288098e10 refactor: 破坏性更新 dict 抽离 2025-09-05 12:24:58 +08:00
xingyu4j
6e19749ca3 refactor: 破坏性更新 dict 抽离 2025-09-05 12:24:16 +08:00
xingyu4j
386370f640 refactor: 破坏性更新 dict 抽离 2025-09-05 12:10:52 +08:00
xingyu4j
5ef57590e0 refactor: 破坏性更新 dict 抽离 2025-09-05 12:00:24 +08:00
YunaiV
0bf1635090 reactor:去除多余的 data.id as number 2025-09-05 00:46:57 +08:00
YunaiV
a153a86142 reactor:【system 系统管理】notice 在 ele 和 antd 的代码一致性 2025-09-04 21:31:24 +08:00
xingyu4j
b79bebab18 refactor: dict 抽离 2025-09-04 20:42:56 +08:00
xingyu4j
48ec3e15ab refactor: 将字典从store 移动到@vben/stores 2025-09-04 18:36:05 +08:00
xingyu4j
cf8745d844 refactor: 将枚举和常量从utils移动到constants 2025-09-04 18:28:13 +08:00
xingyu4j
37fba1474e refactor: 将枚举和常量从utils移动到constants 2025-09-04 18:19:49 +08:00
xingyu4j
d7d445617f feat: format time 已经迁移到 @vben/utils 2025-09-04 10:18:03 +08:00
xingyu4j
6b3818ff40 fix: workflow 2025-09-04 10:17:08 +08:00
xingyu4j
e7e2ebdb73 refactor: tinyflow 2025-09-03 19:19:50 +08:00
xingyu4j
78d005f7e1 refactor: tinyflow 2025-09-03 19:14:10 +08:00
xingyu4j
e802a39aa3 fix: import @vben/utils 2025-09-03 19:12:52 +08:00
xingyu4j
7f3e2a90ae fix: captcha aes encrypt 2025-09-03 18:04:35 +08:00
xingyu4j
1b4335760b fix: tinymce 2025-09-03 18:03:45 +08:00
xingyu4j
50a3e6daba fix: 引入错误 2025-09-03 18:03:14 +08:00
xingyu4j
f0f094a28d chore: fix missing dependencies 2025-09-03 17:10:12 +08:00
xingyu4j
046c8820ac fix: 循环依赖 2025-09-03 16:59:45 +08:00
xingyu4j
a238f635be fix: types 2025-09-03 16:58:31 +08:00
xingyu4j
deb412662e refactor: 提取正则和验证到 @vben/utils 2025-09-03 16:46:22 +08:00
xingyu4j
44eebda749 fix: code format 2025-09-03 16:35:00 +08:00
xingyu4j
e6f76c097d refactor: 破坏性重构,将枚举类由 utils 提取到 @vben/utils 2025-09-03 16:08:40 +08:00
xingyu4j
25468bece5 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-09-03 14:58:59 +08:00
YunaiV
18a63913d1 review:【ai 支付】相关代码 2025-09-03 09:18:44 +08:00
YunaiV
18de49e2fe review:【crm 支付】相关代码 2025-09-02 23:37:24 +08:00
YunaiV
40566f8e4a review:【pay 支付】相关代码 2025-09-02 23:29:53 +08:00
YunaiV
41583c5e41 review:【erp 系统】相关代码 2025-09-02 23:16:28 +08:00
YunaiV
744eef46f4 review:【member 会员】相关代码 2025-09-02 21:22:03 +08:00
YunaiV
5e85efb23e review:【mall 商城】promotion 相关代码 2025-09-02 20:59:21 +08:00
YunaiV
bb97aca0be review:【mall 商城】trade 相关代码 2025-09-02 20:29:01 +08:00
YunaiV
d0457b4e4b review:【mall 商城】product 相关代码 2025-09-02 19:41:18 +08:00
谦元吉
6a85b3ab84 fix(@vben/common-ui): resolve #6698 (#6700)
* fix(@vben/common-ui): resolve #6698

* fix(@vben/common-ui): resolve #6698

* fix(@vben/common-ui): resolve conversation

* fix(@vben/common-ui): resolve #6698
2025-09-02 17:02:11 +08:00
谦元吉
c57592f3a6 fix(@vben-core/shadcn-ui): 修复VbenPinInput组件在点击获取验证码和回车同时进行时会重复触发计时器的问题 (#6705) 2025-09-02 16:56:46 +08:00
YunaiV
160846b665 fix: download query bug 2025-09-02 09:42:21 +08:00
YunaiV
c25ea731fd reactor:优化批量删除的代码,从 as number 变成 ! 2025-09-02 09:28:19 +08:00
YunaiV
67da079606 review:同步 vue5 官方的差异 2025-09-01 23:29:44 +08:00
YunaiV
4062bb03fb review:同步 vue5 官方的差异 2025-09-01 22:24:15 +08:00
xingyu
0f0ae5de48 !208 fix: download query bug
Merge pull request !208 from puhui999/dev
2025-09-01 02:29:58 +00:00
puhui999
71d2c380b3 fix: download query bug 2025-08-31 21:17:11 +08:00
YunaiV
06ea290306 (〃'▽'〃) v2025.09 发布:新增 AI 支持联网搜索、推理、文件/图片、MCP 等功能,完善 IoT 场景联动 2025-08-31 11:38:45 +08:00
xingyu
8e4f52c8aa !207 fix: bugs
Merge pull request !207 from xingyu/dev
2025-08-26 09:14:39 +00:00
xingyu4j
433d12ed35 fix: bugs 2025-08-26 17:13:27 +08:00
xingyu4j
f317508d39 fix: build bugs 2025-08-26 17:07:27 +08:00
xingyu4j
b55c291af1 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-08-26 16:57:32 +08:00
jason
9301962e12 fix: 去掉 console 打印 2025-08-26 08:50:24 +00:00
jason
367a5b9924 fix: [BPM 工作流] 流程表单字段解析调整为使用库解析 2025-08-26 08:50:24 +00:00
XuZhiqiang
bc2b71baa3 !205 feat(@vben/web-antd): erp 模块除去收款单和付款单功能基本完成
* fix(@vben/web-antd): erp 解决冲突
* fix(@vben/web-antd): erp 更新采购和销售退货表单,修复关联订单选择功能不统一详细可编辑的问题,统一文件名称格式
* feat(@vben/web-antd): erp-finance-account 新增结算账户管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-sale-return 新增销售退货管理功能,包括退货列表、表单及相关操作
* feat(@vben/web-antd): erp-sale-out 新增销售出库管理功能,包括出库列表、表单及相关操作
* feat(@vben/web-antd): erp-sale-order 新增销售订单管理功能,包括订单列表、表单及相关操作
* feat(@vben/web-antd): erp-sale-customer 新增客户管理功能,包括客户表单、列表及相关操作
* feat(@vben/web-antd): erp-purchase-return 新增采购退货管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-purchase-in 新增采购入库管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-stock-check 新增库存盘点单管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-stock-move 新增库存调拨单管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-stock-out 新增其它出库单管理功能,包括表单、列表及相关操作
* fix(@vben/web-antd): erp-stock-in 修复提交表单时清空产品项 ID,确保请求成功不报row_xxx报错
2025-08-26 08:40:01 +00:00
Ken Hai
b0d7b177be fix: 角色管理,授权的树形组件,取消勾选叶子节点,父级节点状态错误 (#6680)
Co-authored-by: haiyinlong <haiyinlong@uhigame.com>
2025-08-25 21:32:01 +08:00
LinaBell
566d3bdf7c fix: appendToMain warning (#6684) 2025-08-25 21:25:29 +08:00
螃蟹
adbf793e79 fix(@vben/web-ele): the main color tone for switching between dark and light themes has been reset (#6678) 2025-08-25 11:03:54 +08:00
LinaBell
cf6c4c9aae fix: cannot read properties of null (reading 'nextSibling') (#6667) 2025-08-21 22:26:10 +08:00
Ken Hai
ffaf85c8f3 fix: 修复角色修改时VbenTree组件没有回显选中 (#6662)
* fix: 修复角色修改时VbenTree组件没有回显选中

* chore: use nextTick

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix: merge

* chore: 更新

---------

Co-authored-by: haiyinlong <haiyinlong@uhigame.com>
Co-authored-by: Jin Mao <50581550+jinmao88@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-21 15:30:58 +08:00
panda7
2cc78f925f fix: the bug in the lock method of the vbenModal component (#6648) 2025-08-21 15:17:55 +08:00
ming4762
93f0eea4e7 fix: fix the issue of excessive line spacing in vbenForm (#6653)
* gap-2和 pb-4/2 重叠导致间距过宽,gap-x只保留列间距
2025-08-21 12:41:04 +08:00
xingyu
4af5931e92 !203 增加表单就绪状态,让表单数据先于form-create渲染,解决发起流程时表单事件不触发问题
Merge pull request !203 from 崔什么/master
2025-08-21 02:10:28 +00:00
yu.cui
80e0d05f4e 增加表单就绪状态,让表单数据先于form-create渲染,解决发起流程时表单事件不触发问题 2025-08-20 17:39:01 +08:00
YunaiV
8e372fa7da feat:【system 系统管理】租户管理时,支持填写多个域名 websites 2025-08-19 23:00:50 +08:00
YunaiV
3b2b0d5438 feat:【system 系统管理】租户管理时,支持填写多个域名 websites 2025-08-19 22:59:07 +08:00
xingyu
fb8179fef2 !202 docs: update deps
Merge pull request !202 from xingyu/dev
2025-08-19 09:47:11 +00:00
xingyu4j
ebac48524d docs: update deps 2025-08-19 17:46:25 +08:00
xingyu
807451bf2a !201 update vben 5.5.9
Merge pull request !201 from xingyu/dev
2025-08-19 09:45:44 +00:00
xingyu4j
8fdbbfad22 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-08-19 17:41:16 +08:00
xingyu4j
1d5bfaac5a Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vben into dev 2025-08-19 17:34:00 +08:00
xingyu
f5d9d7596a !200 fix: 修改Api日志界面打开后关不掉的问题
Merge pull request !200 from 痴货/master
2025-08-19 09:28:21 +00:00
谦元吉
58e3941810 chore(docs): update the component import of the form adapter description in the document (#6656) 2025-08-19 16:48:10 +08:00
Svend
3ad433a50b fix: 修复在 hash 路由模式下无法在新窗口打开路由的问题 (#6652)
此问题是由于 PR #6583 中新增的 `resolveHref` 函数导致的。其在 hash 路由模式下,得到的 URL 会包含 #/ 前缀。在经过 openRouteInNewWindow 的逻辑后就会出现两次 /# 前缀
2025-08-19 16:47:45 +08:00
ming4762
8ac2db5b7c fix: fix the issue of VbenForm compact reactive failure (#6654) 2025-08-19 16:46:14 +08:00
Elm1992
a441dcebae fix: meta.link invalid issue 2025-08-19 16:40:16 +08:00
吃货
b546ea8720 refactor(infra): 调整 API 错误日志页面组件导入顺序
- 将 Textarea 组件的导入顺序提前- 优化组件导入的组织结构
2025-08-19 11:01:33 +08:00
吃货
90895db1e7 fix: 修改Api日志界面打开后关不掉的问题
BUG连接:https://gitee.com/yudaocode/yudao-ui-admin-vben/issues/ICT6PI
2025-08-19 10:56:37 +08:00
YunaiV
2dfa34d096 feat:【infra 基础设施】文件配置时,增加“公开访问” 2025-08-18 00:00:04 +08:00
Vben
ff4704d5ea chore: Upgrade vite to version 7.x (#6645) 2025-08-16 22:50:31 +08:00
菠萝吹雪
6ddfbd84b0 chore: modify the contributor showcase in the README (#6636) 2025-08-16 22:47:08 +08:00
ming4762
1e6417f95b feat: vBenForm add layout: inline (#6644) 2025-08-16 22:41:08 +08:00
vben
e147a9d2fd chore: release 5.5.9 2025-08-16 22:16:02 +08:00
XuZhiqiang
cb1b441f7b !199 feat(@vben/web-antd): erp-stock-out 新增其它出库单管理功能,包括表单、列表及相关操作
* feat(@vben/web-antd): erp-stock-out 新增其它出库单管理功能,包括表单、列表及相关操作
* fix(@vben/web-antd): erp-stock-in 修复提交表单时清空产品项 ID,确保请求成功不报row_xxx报错
2025-08-16 13:14:38 +00:00
芋道源码
43c8ce2d7d !194 refactor: (web-ele)优化移动端组件代码结构
Merge pull request !194 from 痴货/master
2025-08-16 13:12:10 +00:00
YunaiV
271546a98b feat:【framework 框架】增加 api 加解密能力(默认登录先不加密,避免大家不理解) 2025-08-16 17:20:59 +08:00
YunaiV
4be6d26375 feat:【framework 框架】增加 api 加解密能力(优化代码) 2025-08-16 17:20:45 +08:00
YunaiV
2920dabb99 feat:【framework 框架】增加 api 加解密能力 2025-08-16 17:09:08 +08:00
xingyu
5b50a91529 !198 feat(@vben/web-antd): erp-product 新增产品管理功能,包括表单、列表及相关操作
Merge pull request !198 from XuZhiqiang/feat-erp
2025-08-15 10:47:54 +00:00
xingyu
f0e09f78e8 !195 feat:Tinyflow因大小写导致的引用问题
Merge pull request !195 from Codingendless/master
2025-08-15 10:46:38 +00:00
xuzhiqiang
133f90f34e fix(@vben/web-antd): erp-purchase-order修复新增采购订单时的报错,清除项的 ID 2025-08-15 09:40:34 +08:00
谦元吉
4efebb8c0b fix:update (#6635) 2025-08-14 22:01:12 +08:00
gxc685
9ce0df88ae fix: 修复mock里面eventHandler重复导致无法启动 (#6631) 2025-08-14 22:00:54 +08:00
xuzhiqiang
5076e3ff72 feat(@vben/web-antd): erp-product 新增产品管理功能,包括表单、列表及相关操作 2025-08-14 16:17:05 +08:00
xuzhiqiang
7fb9f6e064 feat(@vben/web-antd): erp-product-unit 新增产品单位管理功能,包括表单、列表及相关操作 2025-08-14 16:16:34 +08:00
xuzhiqiang
2a655a04c9 fix(@vben/web-antd): erp-product-category移除erp产品分类未使用的复选框处理逻辑,简化代码 2025-08-14 14:56:39 +08:00
xuzhiqiang
5eaeab0cff feat(@vben/web-antd): 新增产品分类表单和列表功能,优化产品分类接口 2025-08-14 14:33:42 +08:00
谦元吉
3cf0c0eb04 fix(@vben/backend-mock): go back to the last modification (#6634)
* fix(@vben/backend-mock): the version went back to the last submission, and the latest submission was completely useless.

* fix: resolve conflicts
2025-08-14 12:06:41 +08:00
Codingendless
0c371a78dc feat:Tinyflow因大小写导致的引用问题 2025-08-14 00:02:39 +08:00
谦元吉
ab7e363279 fix(@vben/backend-mock): fix all ts type errors in this module (#6613)
* fix(@vben/backend-mock): 修复所有 ts 类型报错

* fix(@vben/backend-mock): 修复该模块所有 ts 类型报错

* fix(@vben/backend-mock): 解决 coderabbitai

* fix(@vben/backend-mock): 解决 coderabbitai

* fix(@vben/backend-mock): 解决 coderabbitai
2025-08-12 17:23:39 +08:00
吃货
218f28f35c refactor: (web-ele)优化移动端组件代码结构
-调整组件内元素的排列顺序
- 修复部分组件的样式问题
- 优化代码结构,提高可维护性
2025-08-10 21:18:00 +08:00
吃货
b8c66b23f9 refactor: (ele,diy-editor)重构组件库结构和功能
- 新增 ComponentContainer、ComponentContainerProperty、ComponentLibrary 组件
- 优化导航栏单元格属性组件,更名为 CellProperty
- 更新优惠券相关组件导出方式
- 删除旧版 ComponentContainer 组件
2025-08-10 21:17:03 +08:00
吃货
d7397f28a0 Merge branch 'masterApiTreeSelect' 2025-08-10 16:42:57 +08:00
芋道源码
9cac5a2937 !193 修复批量删除后 checkedIds 未重置的问题
Merge pull request !193 from puhui999/dev
2025-08-09 07:15:42 +00:00
puhui999
8eae74879b fix(@vben/web-ele): 修复批量删除后 checkedIds 未重置的问题 2025-08-09 12:14:19 +08:00
puhui999
ccf9c3fd53 fix(@vben/web-antd): 修复批量删除后 checkedIds 未重置的问题 2025-08-09 12:10:10 +08:00
xingyu
6c425b4dbc !192 feat: BUG[Bug]: ele 版本 ApiTreeSelect 无法选择非末级 https://gitee.com/yudaoco…
Merge pull request !192 from 痴货/masterApiTreeSelect
2025-08-08 05:49:03 +00:00
xueyang
9fc594434f perf: 优化useVbenForm样式 (#6611)
* perf(style): 优化useVbenForm垂直布局 actions 样式

* perf(style): 优化useVbenForm actions 布局样式

- 操作按钮组显示位置
```
actionPosition?: 'center' | 'left' | 'right';
```
- 操作按钮组的样式
```
actionType?: 'block' | 'inline'
inline: 行类显示,block: 新一行单独显示
```

* perf: 优化useVbenForm actions 布局样式

删除 actionType
增加 actionLayout
- actionLayout?: 'inline' | 'newLine' | 'rowEnd';
- newLine: 在新行显示。rowEnd: 在行内显示,靠右对齐(默认)。inline: 使用grid默认样式
- 删除无用代码 queryFormStyle

* perf: 优化useVbenForm使用案例

* perf: 优化form组件样式

去掉padding,改为gap

* docs: update vben-form.md

* fix: 修复FormMessage位置

* perf: Avoid direct mutation of props object.

-  props.actionLayout = props.actionLayout || 'rowEnd';
-  props.actionPosition = props.actionPosition || 'right';
+  const actionLayout = props.actionLayout || 'rowEnd';
+  const actionPosition = props.actionPosition || 'right';

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix: 修复 wrapperClass 权重

* fix: 全局搜索结果不匹配 #6603

* fix: 避免FormMessage溢出

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-07 23:48:34 +08:00
吃货
63ce6f5669 feat: BUG[Bug]: ele 版本 ApiTreeSelect 无法选择非末级 https://gitee.com/yudaocode/yudao-ui-admin-vben/issues/ICGUVV
在菜单数据配置中添加 checkStrictly 属性,设置为 true,可以选择任何节点数据。
2025-08-07 21:10:39 +08:00
xingyu4j
9ef75f4fbe fix: JsonViewer 2025-08-06 15:36:02 +08:00
xingyu
ce1f3735ad !191 Merge remote-tracking branch 'yudao/dev' into dev
Merge pull request !191 from Jason/dev
2025-08-06 03:30:54 +00:00
jason
07d15f5c88 Merge remote-tracking branch 'yudao/dev' into dev 2025-08-05 23:01:03 +08:00
jason
849f2becd8 feat: [BPM 工作流] Simple 模型新增跳过表达式 2025-08-05 22:58:11 +08:00
YunaiV
d48b78a462 feat:【system 系统功能】邮箱增加抄送、密送,支持多个 2025-08-05 22:23:29 +08:00
jason
8e4ea3ca44 fix: [BPM 工作流] 更多设置表单选项问题修复 2025-08-05 22:11:21 +08:00
YunaiV
55061b73de feat:【system 系统功能】邮箱增加抄送、密送,支持多个 2025-08-05 21:45:23 +08:00
lrl
73bddd119e style: (web-ele)优化多个组件的样式和布局
-调整图像上传组件的样式,优化上传区域和处理按钮的布局
- 改进魔方编辑器组件的样式,统一边框和对齐方式
-统一垂直按钮组组件的样式,修复按钮圆角问题
2025-08-05 15:34:25 +08:00
lrl
e7fc44715b feat: (web-ele)新增颜色输入框组件并优化图片上传组件
- 新增 ColorInput 组件用于颜色选择
- 重构 ImageUpload 组件,增加编辑和删除功能
- 更新 DIY 编辑器相关组件,优化用户体验
- 添加商城 H5 预览地址配置
- 优化导航栏单元格属性配置
2025-08-05 15:32:12 +08:00
YunaiV
6d99bf3a46 review:【erp 系统】purchase/order 的管理 2025-08-04 22:42:59 +08:00
xingyu
02f1bd3251 !190 fix: 优化角色菜单表单加载逻辑,移除重复的菜单列表加载调用,确保在打开模态框时正确加载菜单数据。
Merge pull request !190 from xingyu/dev
2025-08-04 11:23:08 +00:00
xingyu4j
9a305e6cbd fix: 优化角色菜单表单加载逻辑,移除重复的菜单列表加载调用,确保在打开模态框时正确加载菜单数据。 2025-08-04 19:12:51 +08:00
xingyu4j
990ae4463a fix: types 2025-08-04 18:43:33 +08:00
xingyu
3f1c3a283f !189 !188 feat(@vben/web-antd): vxe-table) 其他入库模块、简单验证样式
Merge pull request !189 from xingyu/dev
2025-08-04 10:30:33 +00:00
xingyu
229a6f017a !187 update apps/web-ele/src/views/system/user/data.ts.
Merge pull request !187 from 青木/N/A
2025-08-04 09:58:23 +00:00
xingyu
93290bf441 !188 feat(@vben/web-antd): vxe-table) 其他入库模块、简单验证样式
Merge pull request !188 from 陈賝/dev
2025-08-04 09:57:54 +00:00
nehc
c64be886b4 feat(@vben/web-antd): vxe-table)新增表单验证功能
- 在 vxe-table.ts 中添加 createRequiredValidation函数
- 在 data.ts 中使用 createRequiredValidation 替代原有的 className 函数
- 在 vxe-table 插件中添加 validation 相关的工具函数
- 优化表格列的验证逻辑,提高代码复用性和可维护性
2025-08-04 09:22:51 +08:00
nehc
5f56b14733 feat(@vben/web-antd): 验证样式
- 添加 isValidating 状态管理,用于控制验证过程
- 在表格列定义中增加验证错误样式
- 实现必填字段错误提示功能
- 优化表格渲染逻辑,确保验证错误及时显示
- 新增相关 CSS 样式,定义验证错误的视觉效果
2025-08-04 09:22:51 +08:00
nehc
9d80b9fc71 feat(@vben/web-antd): erp-stock-in 优化入库单产品清单组件 2025-08-04 09:22:51 +08:00
nehc
1433a0980d feat(@vben/web-antd): erp-stock-in 优化入库单产品清单组件
- 移除了 totalCount 和 totalPrice 的计算逻辑
- 调整了添加产品的按钮位置
- 为表格底部的单元格添加了自定义样式
- 简化了组件的 props 接口
2025-08-04 09:22:51 +08:00
nehc
3afd957713 feat(@vben/web-antd): erp-stock-in 优化库存入库模块
- 为表格列设置 minWidth 以优化布局
- 使用 Popconfirm组件替代 Modal 确认框
- 通过 message 组件展示操作结果
- 优化删除和审核操作的处理流程
- 引入 useVbenModal 优化表单弹窗
2025-08-04 09:22:51 +08:00
nehc
510ec12582 feat(@vben/web-antd): erp-stock-in 添加其它入库单功能
- 新增其它入库单列表页面
- 实现其它入库单的创建、编辑和删除功能
- 添加产品清单管理功能
- 集成供应商、产品和仓库的选择接口
- 优化表格展示和搜索功能
2025-08-04 09:22:51 +08:00
nehc
2e6575f368 feat(@vben/web-antd): erp-stock-record 添加产品库存明细管理功能
- 实现了产品库存明细的查询、导出功能
- 添加了搜索表单和列表展示
- 集成了仓库和产品选择器
- 使用了 VxeTable 组件
2025-08-04 09:22:51 +08:00
nehc
8d660404dc feat(@vben/web-antd): erp-stock-stock 实现产品库存管理功能
- 新增产品库存管理页面,包括库存列表和搜索功能
- 添加导出库存数据功能
- 集成 API 接口和数据处理逻辑
- 优化页面布局和组件使用
2025-08-04 09:22:50 +08:00
lrl
1f155fa7c5 feat: (web-ele)创建 DIY编辑器组件
- 新增 DIY 编辑器组件主入口文件
- 创建移动端组件索引文件
2025-08-04 09:11:58 +08:00
lrl
2166ce3e4e feat: 新增多个组件并优化优惠券相关功能
- 新增 AppLinkSelectDialog 组件,用于选择 APP 链接- 新增 NavigationBarCellProperty组件,用于导航栏单元格属性设置
- 新增 CombinationShowcase 和 CombinationTableSelect 组件,用于拼团活动展示和选择- 优化优惠券相关组件,导出所有优惠券相关组件
- 新增 ComponentContainer 组件,用于包裹和样式化 DIY 组件
2025-08-04 09:09:39 +08:00
青木
ec14751aeb update apps/web-ele/src/views/system/user/data.ts.
对应ele的 vxe-table的activeValue: 1,inactiveValue: 0

Signed-off-by: 青木 <720227+9mgps@user.noreply.gitee.com>
2025-08-03 13:28:05 +00:00
芋道源码
aa6639a108 !185 refactor: (web-ele)优化多个组件的删除操作和确认逻辑
Merge pull request !185 from 痴货/master
2025-08-03 12:12:53 +00:00
YunaiV
32ee1b11ec feat:【bpm 工作流】审批人自选时,相同节点共享数据 2025-08-02 22:25:30 +08:00
YunaiV
2c687266b2 feat:【BPM 工作流】增加审批人撤销的能力 2025-08-02 16:25:06 +08:00
lrl
38daaa2934 refactor: (web-ele)优化多个组件的删除操作和确认逻辑
- 将 ElMessageBox 替换为自定义 confirm 函数- 添加全局 loading 功能
- 优化错误处理和消息提示- 调整部分组件属性和样式
2025-08-01 13:56:55 +08:00
xingyu
5a31e80c2d !184 feat(@vben/web-antd): erp-stock-warehouse 仓库列表管理
Merge pull request !184 from 陈賝/dev
2025-07-31 07:04:35 +00:00
xingyu
ff62e4c368 !183 feat(@vben/web-antd): erp-purchase-supplier-优化采购订单导出功能并添加供应商管理权限控制
Merge pull request !183 from 陈賝/dev
2025-07-31 02:47:33 +00:00
nehc
8d17d8d915 feat(@vben/web-antd): erp-stock-warehouse 修复仓库列表的状态切换功能
- 将默认状态切换逻辑从组件模板移到单独的函数中
- 使用 confirm 对话框替代 message.confirm
- 优化了默认状态切换的用户体验和错误处理
- 引入了 Promise 机制,允许异步操作
2025-07-30 17:42:50 +08:00
nehc
787f5168ad feat(@vben/web-antd): erp-stock-warehouse 新增仓库管理功能
- 添加仓库管理相关的数据结构和 API 接口
- 实现仓库列表展示、搜索、添加、编辑和删除功能
- 添加仓库默认状态切换和导出功能
- 优化表格展示效果,固定操作列
- 移除不必要的按钮和链接
2025-07-30 16:48:52 +08:00
nehc
423bfffbea feat(@vben/web-antd): erp-purchase-supplier-优化采购订单导出功能并添加供应商管理权限控制
- 在供应商管理页面添加权限控制:
  - 创建供应商
  - 导出供应商信息
  - 编辑供应商
  - 删除供应商
2025-07-30 15:40:34 +08:00
nehc
33cec7caee feat(@vben/web-antd): erp-purchase-supplier-供应商管理页面
- 移除状态字段,增加联系电话字段
- 调整供应商列表的展示逻辑
- 优化搜索和导出功能
- 使用 useVbenVxeGrid 替代原有的表格实现
- 用 downloadFileFromBlobPart 处理文件下载
2025-07-30 15:40:33 +08:00
nehc
93c0d9e486 feat(@vben/web-antd): erp-purchase-supplier-添加供应商管理功能
- 新增供应商管理页面,包括搜索、列表、新增、编辑和删除功能
- 实现供应商数据的分页查询、导出功能
- 使用 Vben Form 和 Vxe Table 组件构建表单和表格
- 添加国际化支持
2025-07-30 15:40:33 +08:00
xingyu4j
8b89a32813 Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into dev 2025-07-29 15:21:32 +08:00
leo
b93e22c45a fix(@vben/layouts): respect base URL when opening route in new window (#6583)
Previously, the generated URL for opening routes in a new window did not include the router base,
which led to incorrect paths when the app was deployed under a subdirectory (e.g., /admin/).
This change ensures that the resolved path includes the configured base by using
router.resolve(path).href.
2025-07-29 13:46:05 +08:00
xingyu
0694eb2b29 !181 feat(@vben/web-antd): erp-优化采购订单功能
Merge pull request !181 from 陈賝/dev
2025-07-28 10:04:42 +00:00
Jin Mao
193f5b6512 Merge branch 'main' into 2025072604 2025-07-28 15:53:04 +08:00
Jin Mao
cb3f96683f fix: 修复双列布局模式下,路由为hideInMenu时,空白右列 2025-07-28 15:50:21 +08:00
nehc
b3942bb8ff feat(@vben/web-antd): erp-移除重复接口
-移除了 stock API 中的 getStockCountByProductId 函数
-将 getStockCount 函数的使用范围从 product 模块扩展到 purchase 模块
- 更新了 PurchaseOrderItemForm 组件中的库存查询逻辑
2025-07-28 14:45:47 +08:00
nehc
b3a2d29a3b feat(@vben/web-antd): erp-优化采购订单功能
- 移除采购订单明细项表单配置
- 调整采购订单表格列定义
- 优化采购订单删除操作,增加加载提示和错误处理
- 添加采购订单详情页面
- 重新计算采购订单项的价格字段
- 调整采购订单状态更新和删除的交互方式,增加二次确认
2025-07-28 14:04:00 +08:00
nehc
f242f1c37d feat(@vben/web-antd): erp-优化上传附件及验证
- 修改订单时间格式为 timestamp
- 限制文件上传数量为 1
- 调整表格列宽和显示逻辑
- 优化子表单验证和提交逻辑
- 修复文件上传组件的兼容性问题
- 优化产品清单的初始化和验证
2025-07-26 17:36:59 +08:00
zhongming4762
06ffdf164a feat: add dingding login 2025-07-25 22:02:55 +08:00
ming4762
5b75e5e917 perf: perf the control logic of VbenModal full screen and header (#6566)
* resolve the issue of header=false and full screen button display but not operable
2025-07-25 21:45:45 +08:00
aonoa
fad0b49841 fix: adding roles does not automatically refresh (#6548)
* fix: adding roles does not automatically refresh

* style: fix code style err
2025-07-25 21:35:57 +08:00
Jin Mao
260e45cd7b Merge branch 'main' into feat/add-vben-modal-animation 2025-07-25 21:33:11 +08:00
nehc
8a7239ce24 feat(@vben/web-antd): erp-采购订单表单逻辑
- 使用 handleValuesChange
- 优化 discountPrice 和 totalPrice 的计算逻辑
- 改进子表单的验证和数据处理
- 统一数值格式化处理
- 优化表格数据的更新方式
2025-07-25 19:21:33 +08:00
nehc
e319888240 feat(@vben/web-antd): erp-优化采购订单表单布局和功能
- 添加订单单号字段并设置为只读
- 将附件上传组件替换为 FileUpload
- 新增产品清单字段
- 调整表单项的布局和样式
- 优化订单产品清单的展示方式
2025-07-25 19:21:32 +08:00
nehc
83010b6590 style(@vben/web-antd): erp-优化采购订单表单样式
- 更新 Tab 卡片样式,使用 border 和 bg-card 类
- 修改合计行样式,使用 rounded、border、bg-muted 和 text-muted-foreground 类
- 调整字体颜色,使用 text-foreground 类
2025-07-25 19:21:32 +08:00
nehc
a24f08cbb0 feat(@vben/web-antd): erp-采购订单明细表
- 使用 useVbenVxeGrid 重构
2025-07-25 19:21:31 +08:00
nehc
f9407ca8bc feat(@vben/web-antd): erp-采购订单明细表
- 优化了产品变更、价格计算和表单验证逻辑
- 更新了表格列定义和单元格模板
- 删除了冗余的组件挂载逻辑
2025-07-25 19:21:31 +08:00
nehc
7c2c249e5d feat(@vben/web-antd): erp-重构采购订单模块
- 更新表单组件,使用已有的 VbenForm 组件
- 优化表单字段定义,使用 useFormSchema 函数统一管理
- 重构表格组件,使用 VxeTable
- 优化数据处理逻辑,提高代码复用性和可维护性
- 调整界面布局和样式,提升用户体验
2025-07-25 19:21:31 +08:00
nehc
1cad71f3bf feat(@vben/web-antd): erp-区分采购对象
- 修改命名空间 PurchaseOrderApi 为 ErpPurchaseOrderApi
- 为接口属性添加注释,明确其含义和单位
- 更新相关视图和组件中的导入和使用
2025-07-25 19:21:31 +08:00
nehc
0b47648650 feat(@vben/web-antd): erp-添加采购订单功能
- 新增采购订单列表页面
- 添加采购订单表单和子表单组件
- 实现采购订单的查询、创建、编辑和删除功能
- 优化采购订单的审批和反审批操作- 增加采购订单的导出功能
2025-07-25 19:21:30 +08:00
YunaiV
f14954f7e2 fix:【BPM 工作流】流程预测时,“查看子流程”按钮不支持点击 2025-07-25 06:13:35 +00:00
nehc
7526ff5b87 refactor(@vben/web-antd): 移除 CardTitle 组件
移除了 CardTitle 组件及相关样式,直接使用 <span> 标签展示标题。
受影响的主要文件:
- 删除了 card-title.vue 文件
- 更新了 SummaryCard 组件的标题展示方式
- 修改了 TimeSummaryChart组件,用 <span> 替代 CardTitle 组件
2025-07-25 06:13:35 +00:00
nehc
b41ac68e06 refactor(@vben/web-antd): ERP 首页适配已有组件
- 移除不必要的 API 调用和数据处理逻辑
- 使用 AnalysisOverview 组件替换自定义统计卡片
- 优化 TimeSummaryChart组件,支持不同类型的数据展示
- 简化页面结构,提高组件的可复用性和可维护性
2025-07-25 06:13:35 +00:00
nehc
dcffb9bbe3 feat(@vben/web-antd): 新增 CardTitle组件并优化 TimeSummaryChart
- 新增 CardTitle 组件用于统一卡片标题样式
- 在 TimeSummaryChart 中使用 CardTitle 组件替代原生标题
- 调整 EchartsUI 组件的 height 属性单位
2025-07-25 06:13:35 +00:00
nehc
f763ad2855 feat(@vben/web-antd): 新增 ERP API 接口并符合 Vben 项目标准
- 将所有 ERP API 文件从旧的 axios 配置迁移到新的 requestClient
- 使用 namespace 组织接口类型定义,提高代码可维护性
- 将对象方法改为独立的导出函数,符合现代 JavaScript 最佳实践
- 为所有 API 函数添加完整的 TypeScript 类型定义
- 统一分页查询参数和状态更新参数的接口定义
- 涵盖财务、采购、销售、库存等所有 ERP 业务模块
2025-07-25 06:13:35 +00:00
YunaiV
7b7402b986 review:【BPM 工作流】模型分类内,排序不正确的问题 2025-07-25 06:13:35 +00:00
YunaiV
7b06bd27b3 fix:【BPM 工作流】工作流模型维护时,key 缺少参数校验 2025-07-25 06:13:35 +00:00
YunaiV
e6f4cf5660 review:【ANTD】相关的代码 2025-07-25 06:13:35 +00:00
xingyu
c447145d62 !180 refactor: 重构authLogin代码逻辑
Merge pull request !180 from 痴货/master
2025-07-23 07:41:44 +00:00
芋道源码
27ad777c2c !179 fix: 删除china2相关的地图json
Merge pull request !179 from 痴货/master
2025-07-23 05:08:38 +00:00
lrl
347f0ab852 refactor: 重构authLogin代码逻辑 2025-07-23 11:23:00 +08:00
lrl
df3215fef1 fix: 删除china2相关的地图json 2025-07-23 11:07:19 +08:00
lrl
992f0bd2f0 refactor: 重构商场首页和统计页面组件
- 新等组件
- 优化 Work增 AnalysisOverview、AnalysisOverviewIconbenchQuickDataShow 组件的使用
- 更新图标使用方式,移除自定义 SVG 图标
-提升页面视觉效果 调整布局和样式,
2025-07-23 10:51:13 +08:00
xingyu
4797791935 !177 fix: (system): 修复VbenTree加载顺序问题
Merge pull request !177 from 简佳/master
2025-07-21 10:34:08 +00:00
7031dbebe6 fix: (system): 修复VbenTree加载顺序问题
- 调整了数据权限分配和菜单分配表单中的加载顺序
- 确保在设置表单值之前完成树形结构数据的加载
2025-07-21 14:27:34 +08:00
vben
1575619d53 chore: release v5.5.8 2025-07-19 22:19:50 +08:00
lrl
27a7e84def feat: 添加交易状况组件并优化统计数据展示,支持环比增长率显示 2025-07-18 15:06:27 +08:00
panda7
fc9ea347ca Merge branch 'main' into feat/add-vben-modal-animation 2025-07-18 00:38:54 +08:00
 panda7
1a9b0509d5 feat: add animation effects to VbenModal component 2025-07-18 00:15:40 +08:00
lrl
a442eab9ea feat: 更新组件类型和统计数据展示
- 在组件类型中新增 'ApiCascader' 以支持更多业务需求
- 在商品统计概览中为多个统计项添加 tooltip,提供更清晰的数据解释
- 优化交易统计页面,重构数据加载逻辑,提升用户体验
2025-07-17 10:35:33 +08:00
lrl
d2a2227c4c Merge remote-tracking branch 'remote/master'
# Conflicts:
#	packages/effects/plugins/src/echarts/use-echarts.ts
2025-07-17 10:09:54 +08:00
lrl
2cccbc949f fix: 修正商品统计数据赋值逻辑
- 更新商品统计组件中的数据赋值方式,确保正确映射到统计卡片
- 修复了浏览量、访客数、支付件数等多个统计项的数据来源,提升数据准确性
2025-07-17 09:55:11 +08:00
lrl
4620ede9b9 feat: 新增商品统计组件和优化数据处理逻辑
- 引入商品排行和商品概况组件,展示商品相关统计信息
- 更新商品统计 API,支持时间范围查询和数据格式化
- 优化数据加载逻辑,提升用户体验
- 添加日期范围选择器,增强统计数据的灵活性
2025-07-17 09:53:04 +08:00
lrl
73a73ac312 fix: 修复性别统计图表数据赋值逻辑
- 修正了性别统计卡片组件中性别统计数据的赋值方式
- 确保数据正确映射到图表选项中,提升数据展示的准确性
2025-07-16 16:15:26 +08:00
lrl
b480eb54c1 feat: 新增会员统计组件和优化数据展示
- 在会员统计页面中新增会员地域分布和性别分布组件
- 更新会员统计 API,支持获取会员汇总和地区统计数据
- 优化数据加载逻辑,提升用户体验
- 引入分析概览组件以展示关键统计信息
2025-07-16 16:14:01 +08:00
lrl
380a24358c style: 更新会员漏斗卡片组件的样式
- 为 trapezoid 类添加 z-index 属性,确保层级关系正确
- 保持 margin-left 设置不变,优化了组件的视觉效果
2025-07-16 11:52:04 +08:00
lrl
ff53153782 style: 优化会员漏斗卡片组件的样式和布局
- 调整了会员漏斗卡片组件的样式,简化了宽度设置
- 更新了 trapezoid 类的样式,移除了多余的 margin 和 font-size 设置
- 改善了组件的可读性和视觉效果
2025-07-16 11:49:27 +08:00
lrl
8c2f982ab6 feat: 更新日期格式化方法,新增多个统计卡片组件
- 将日期格式化方法从 formatDate 更新为 formatDate2,提升日期处理的灵活性
- 新增会员概览、用户统计、会员终端和交易量趋势等统计卡片组件
- 在商城首页引入新组件以展示关键会员和交易数据
- 优化数据获取逻辑,提升用户体验
2025-07-16 11:01:27 +08:00
lrl
5edccd3efe feat: 新增运营数据展示组件,优化商城首页数据处理逻辑
- 在商城首页引入 WorkbenchQuickDataShow 组件,展示关键运营数据
- 增加数据获取方法,包括订单、商品和钱包充值数据
- 更新 AnalysisOverview 组件以支持双向绑定
- 优化数据加载逻辑,提升用户体验
2025-07-15 15:49:48 +08:00
lrl
e88c17f7e2 style: 格式化样式 2025-07-15 13:25:44 +08:00
lrl
6ce1363dea feat: 更新组件和API,优化数据处理逻辑
- 将 TreeSelect 组件的 fieldNames 属性更改为 props
- 更新商品分类API的请求路径
- 在多个模块中引入 ElMessageBox 以增强用户交互体验
- 新增售后管理和订单管理的详细视图组件
- 优化了多个表单组件的逻辑,提升了用户体验
2025-07-15 13:23:20 +08:00
2065 changed files with 117154 additions and 74962 deletions

1
.gitignore vendored
View File

@@ -49,3 +49,4 @@ vite.config.ts.*
*.sln
*.sw?
.history
.cursor

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 495 KiB

View File

@@ -9,7 +9,7 @@
## 🐶 新手必读
- nodejs > 20.10.0 && pnpm > 10.10.0 (强制使用pnpm)
- nodejs > 20.10.0 && pnpm > 10.14.0 (强制使用pnpm)
- 演示地址【Vue3 + element-plus】<http://dashboard-vue3.yudao.iocoder.cn>
- 演示地址【Vue3 + vben5(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn>
- 演示地址【Vue2 + element-ui】<http://dashboard.yudao.iocoder.cn>
@@ -35,30 +35,30 @@
## 外包项目请联系【非项目需求请勿扫码,非客服,不解答项目问题】
![alt 定制开发](.image/wx-xingyu.png)
![alt 软件定制开发 数舵科技](.image/wx-xingyu.png)
## 技术栈
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.13 |
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 6.2.5 |
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.17 |
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 7.1.2 |
| [Ant Design Vue](https://www.antdv.com/) | Ant Design Vue | 4.2.6 |
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.9.7 |
| [Naive UI](https://www.naiveui.com/) | Naive UI | 2.41.0 |
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.10.2 |
| [Naive UI](https://www.naiveui.com/) | Naive UI | 2.42.0 |
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 超集 | 5.8.3 |
| [pinia](https://pinia.vuejs.org/) | Vue 存储库替代 vuex5 | 2.3.1 |
| [vueuse](https://vueuse.org/) | 常用工具集 | 12.8.2 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.1.3 |
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.5.0 |
| [pinia](https://pinia.vuejs.org/) | Vue 存储库替代 vuex5 | 3.0.3 |
| [vueuse](https://vueuse.org/) | 常用工具集 | 13.4.0 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.1.7 |
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 4.5.1 |
| [Tailwind CSS](https://tailwindcss.com/) | 原子 CSS | 3.4.17 |
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.324 |
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.354 |
| [TinyMCE](https://www.tiny.cloud/) | 富文本编辑器 | 6.1.0 |
| [Echarts](https://echarts.apache.org/) | 图表库 | 5.6.0 |
| [axios](https://axios-http.com/) | http客户端 | 1.8.4 |
| [axios](https://axios-http.com/) | http客户端 | 1.10.0 |
| [dayjs](https://day.js.org/) | 日期处理库 | 1.11.13 |
| [vee-validate](https://vee-validate.logaretm.com/) | 表单验证 | 4.15.0 |
| [zod](https://zod.dev/) | 数据验证 | 3.24.2 |
| [vee-validate](https://vee-validate.logaretm.com/) | 表单验证 | 4.15.1 |
| [zod](https://zod.dev/) | 数据验证 | 3.25.67 |
## 🔥 后端架构

View File

@@ -1,5 +1,7 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { MOCK_CODES } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);

View File

@@ -1,9 +1,15 @@
import { defineEventHandler, readBody, setResponseStatus } from 'h3';
import {
clearRefreshTokenCookie,
setRefreshTokenCookie,
} from '~/utils/cookie-utils';
import { generateAccessToken, generateRefreshToken } from '~/utils/jwt-utils';
import { forbiddenResponse } from '~/utils/response';
import { MOCK_USERS } from '~/utils/mock-data';
import {
forbiddenResponse,
useResponseError,
useResponseSuccess,
} from '~/utils/response';
export default defineEventHandler(async (event) => {
const { password, username } = await readBody(event);

View File

@@ -1,7 +1,9 @@
import { defineEventHandler } from 'h3';
import {
clearRefreshTokenCookie,
getRefreshTokenFromCookie,
} from '~/utils/cookie-utils';
import { useResponseSuccess } from '~/utils/response';
export default defineEventHandler(async (event) => {
const refreshToken = getRefreshTokenFromCookie(event);

View File

@@ -1,9 +1,11 @@
import { defineEventHandler } from 'h3';
import {
clearRefreshTokenCookie,
getRefreshTokenFromCookie,
setRefreshTokenCookie,
} from '~/utils/cookie-utils';
import { verifyRefreshToken } from '~/utils/jwt-utils';
import { generateAccessToken, verifyRefreshToken } from '~/utils/jwt-utils';
import { MOCK_USERS } from '~/utils/mock-data';
import { forbiddenResponse } from '~/utils/response';
export default defineEventHandler(async (event) => {

View File

@@ -1,3 +1,7 @@
import { eventHandler, setHeader } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
export default eventHandler(async (event) => {
const userinfo = verifyAccessToken(event);
if (!userinfo) {

View File

@@ -1,5 +1,7 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { MOCK_MENUS } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
export default eventHandler(async (event) => {
const userinfo = verifyAccessToken(event);

View File

@@ -1,3 +1,6 @@
import { eventHandler, getQuery, setResponseStatus } from 'h3';
import { useResponseError } from '~/utils/response';
export default eventHandler((event) => {
const { status } = getQuery(event);
setResponseStatus(event, Number(status));

View File

@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
sleep,

View File

@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
sleep,

View File

@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
sleep,

View File

@@ -1,4 +1,5 @@
import { faker } from '@faker-js/faker';
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

View File

@@ -1,3 +1,4 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';

View File

@@ -1,6 +1,7 @@
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
const namesMap: Record<string, any> = {};

View File

@@ -1,6 +1,7 @@
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
const pathMap: Record<string, any> = { '/': 0 };

View File

@@ -1,4 +1,5 @@
import { faker } from '@faker-js/faker';
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { getMenuIds, MOCK_MENU_LIST } from '~/utils/mock-data';
import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response';

View File

@@ -1,6 +1,11 @@
import { faker } from '@faker-js/faker';
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response';
import {
sleep,
unAuthorizedResponse,
usePageResponseSuccess,
} from '~/utils/response';
function generateMockDataList(count: number) {
const dataList = [];
@@ -44,30 +49,69 @@ export default eventHandler(async (event) => {
await sleep(600);
const { page, pageSize, sortBy, sortOrder } = getQuery(event);
// 规范化分页参数,处理 string[]
const pageRaw = Array.isArray(page) ? page[0] : page;
const pageSizeRaw = Array.isArray(pageSize) ? pageSize[0] : pageSize;
const pageNumber = Math.max(
1,
Number.parseInt(String(pageRaw ?? '1'), 10) || 1,
);
const pageSizeNumber = Math.min(
100,
Math.max(1, Number.parseInt(String(pageSizeRaw ?? '10'), 10) || 10),
);
const listData = structuredClone(mockData);
if (sortBy && Reflect.has(listData[0], sortBy as string)) {
// 规范化 query 入参,兼容 string[]
const sortKeyRaw = Array.isArray(sortBy) ? sortBy[0] : sortBy;
const sortOrderRaw = Array.isArray(sortOrder) ? sortOrder[0] : sortOrder;
// 检查 sortBy 是否是 listData 元素的合法属性键
if (
typeof sortKeyRaw === 'string' &&
listData[0] &&
Object.prototype.hasOwnProperty.call(listData[0], sortKeyRaw)
) {
// 定义数组元素的类型
type ItemType = (typeof listData)[0];
const sortKey = sortKeyRaw as keyof ItemType; // 将 sortBy 断言为合法键
const isDesc = sortOrderRaw === 'desc';
listData.sort((a, b) => {
if (sortOrder === 'asc') {
if (sortBy === 'price') {
return (
Number.parseFloat(a[sortBy as string]) -
Number.parseFloat(b[sortBy as string])
);
const aValue = a[sortKey] as unknown;
const bValue = b[sortKey] as unknown;
let result = 0;
if (typeof aValue === 'number' && typeof bValue === 'number') {
result = aValue - bValue;
} else if (aValue instanceof Date && bValue instanceof Date) {
result = aValue.getTime() - bValue.getTime();
} else if (typeof aValue === 'boolean' && typeof bValue === 'boolean') {
if (aValue === bValue) {
result = 0;
} else {
return a[sortBy as string] > b[sortBy as string] ? 1 : -1;
result = aValue ? 1 : -1;
}
} else {
if (sortBy === 'price') {
return (
Number.parseFloat(b[sortBy as string]) -
Number.parseFloat(a[sortBy as string])
);
} else {
return a[sortBy as string] < b[sortBy as string] ? 1 : -1;
}
const aStr = String(aValue);
const bStr = String(bValue);
const aNum = Number(aStr);
const bNum = Number(bStr);
result =
Number.isFinite(aNum) && Number.isFinite(bNum)
? aNum - bNum
: aStr.localeCompare(bStr, undefined, {
numeric: true,
sensitivity: 'base',
});
}
return isDesc ? -result : result;
});
}
return usePageResponseSuccess(page as string, pageSize as string, listData);
return usePageResponseSuccess(
String(pageNumber),
String(pageSizeNumber),
listData,
);
});

View File

@@ -1 +1,3 @@
import { defineEventHandler } from 'h3';
export default defineEventHandler(() => 'Test get handler');

View File

@@ -1 +1,3 @@
import { defineEventHandler } from 'h3';
export default defineEventHandler(() => 'Test post handler');

View File

@@ -1,5 +1,6 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);

View File

@@ -1,5 +1,6 @@
import { eventHandler } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import { unAuthorizedResponse } from '~/utils/response';
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
export default eventHandler((event) => {
const userinfo = verifyAccessToken(event);

View File

@@ -1,3 +1,4 @@
import { defineEventHandler } from 'h3';
import { forbiddenResponse, sleep } from '~/utils/response';
export default defineEventHandler(async (event) => {

View File

@@ -1,3 +1,5 @@
import { defineEventHandler } from 'h3';
export default defineEventHandler(() => {
return `
<h1>Hello Vben Admin</h1>

View File

@@ -1,5 +1,7 @@
import type { EventHandlerRequest, H3Event } from 'h3';
import { deleteCookie, getCookie, setCookie } from 'h3';
export function clearRefreshTokenCookie(event: H3Event<EventHandlerRequest>) {
deleteCookie(event, 'jwt', {
httpOnly: true,

View File

@@ -1,8 +1,11 @@
import type { EventHandlerRequest, H3Event } from 'h3';
import type { UserInfo } from './mock-data';
import { getHeader } from 'h3';
import jwt from 'jsonwebtoken';
import { UserInfo } from './mock-data';
import { MOCK_USERS } from './mock-data';
// TODO: Replace with your own secret key
const ACCESS_TOKEN_SECRET = 'access_token_secret';
@@ -31,12 +34,22 @@ export function verifyAccessToken(
return null;
}
const token = authHeader.split(' ')[1];
const tokenParts = authHeader.split(' ');
if (tokenParts.length !== 2) {
return null;
}
const token = tokenParts[1] as string;
try {
const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET) as UserPayload;
const decoded = jwt.verify(
token,
ACCESS_TOKEN_SECRET,
) as unknown as UserPayload;
const username = decoded.username;
const user = MOCK_USERS.find((item) => item.username === username);
if (!user) {
return null;
}
const { password: _pwd, ...userinfo } = user;
return userinfo;
} catch {
@@ -50,7 +63,12 @@ export function verifyRefreshToken(
try {
const decoded = jwt.verify(token, REFRESH_TOKEN_SECRET) as UserPayload;
const username = decoded.username;
const user = MOCK_USERS.find((item) => item.username === username);
const user = MOCK_USERS.find(
(item) => item.username === username,
) as UserInfo;
if (!user) {
return null;
}
const { password: _pwd, ...userinfo } = user;
return userinfo;
} catch {

View File

@@ -1,5 +1,7 @@
import type { EventHandlerRequest, H3Event } from 'h3';
import { setResponseStatus } from 'h3';
export function useResponseSuccess<T = any>(data: T) {
return {
code: 0,

View File

@@ -24,3 +24,12 @@ VITE_APP_BAIDU_CODE = e98f2eab6ceb8688bc6d8fc5332ff093
# GoView域名
VITE_GOVIEW_URL='http://127.0.0.1:3000'
# API 加解密
VITE_APP_API_ENCRYPT_ENABLE = true
VITE_APP_API_ENCRYPT_HEADER = X-Api-Encrypt
VITE_APP_API_ENCRYPT_ALGORITHM = AES
VITE_APP_API_ENCRYPT_REQUEST_KEY = 52549111389893486934626385991395
VITE_APP_API_ENCRYPT_RESPONSE_KEY = 96103715984234343991809655248883
# VITE_APP_API_ENCRYPT_REQUEST_KEY = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCls2rIpnGdYnLFgz1XU13GbNQ5DloyPpvW00FPGjqn5Z6JpK+kDtVlnkhwR87iRrE5Vf2WNqRX6vzbLSgveIQY8e8oqGCb829myjf1MuI+ZzN4ghf/7tEYhZJGPI9AbfxFqBUzm+kR3/HByAI22GLT96WM26QiMK8n3tIP/yiLswIDAQAB
# VITE_APP_API_ENCRYPT_RESPONSE_KEY = MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOH8IfIFxL/MR9XIg1UDv5z1fGXQI93E8wrU4iPFovL/sEt9uSgSkjyidC2O7N+m7EKtoN6b1u7cEwXSkwf3kfK0jdWLSQaNpX5YshqXCBzbDfugDaxuyYrNA4/tIMs7mzZAk0APuRXB35Dmupou7Yw7TFW/7QhQmGfzeEKULQvnAgMBAAECgYAw8LqlQGyQoPv5p3gRxEMOCfgL0JzD3XBJKztiRd35RDh40Nx1ejgjW4dPioFwGiVWd2W8cAGHLzALdcQT2KDJh+T/tsd4SPmI6uSBBK6Ff2DkO+kFFcuYvfclQQKqxma5CaZOSqhgenacmgTMFeg2eKlY3symV6JlFNu/IKU42QJBAOhxAK/Eq3e61aYQV2JSguhMR3b8NXJJRroRs/QHEanksJtl+M+2qhkC9nQVXBmBkndnkU/l2tYcHfSBlAyFySMCQQD445tgm/J2b6qMQmuUGQAYDN8FIkHjeKmha+l/fv0igWm8NDlBAem91lNDIPBUzHL1X1+pcts5bjmq99YdOnhtAkAg2J8dN3B3idpZDiQbC8fd5bGPmdI/pSUudAP27uzLEjr2qrE/QPPGdwm2m7IZFJtK7kK1hKio6u48t/bg0iL7AkEAuUUs94h+v702Fnym+jJ2CHEkXvz2US8UDs52nWrZYiM1o1y4tfSHm8H8bv8JCAa9GHyriEawfBraILOmllFdLQJAQSRZy4wmlaG48MhVXodB85X+VZ9krGXZ2TLhz7kz9iuToy53l9jTkESt6L5BfBDCVdIwcXLYgK+8KFdHN5W7HQ==

View File

@@ -1,6 +1,6 @@
{
"name": "@vben/web-antd",
"version": "5.5.7",
"version": "5.5.9",
"homepage": "https://vben.pro",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
@@ -46,17 +46,21 @@
"@vueuse/core": "catalog:",
"@vueuse/integrations": "catalog:",
"ant-design-vue": "catalog:",
"bpmn-js": "catalog:",
"bpmn-js-properties-panel": "catalog:",
"bpmn-js-token-simulation": "catalog:",
"camunda-bpmn-moddle": "catalog:",
"cropperjs": "catalog:",
"crypto-js": "catalog:",
"dayjs": "catalog:",
"diagram-js": "catalog:",
"fast-xml-parser": "catalog:",
"highlight.js": "catalog:",
"pinia": "catalog:",
"steady-xml": "catalog:",
"tinymce": "catalog:",
"vue": "catalog:",
"vue-dompurify-html": "catalog:",
"vue-router": "catalog:",
"vue3-signature": "catalog:"
},
"devDependencies": {
"@types/crypto-js": "catalog:"
}
}

View File

@@ -22,6 +22,9 @@ const AutoComplete = defineAsyncComponent(
() => import('ant-design-vue/es/auto-complete'),
);
const Button = defineAsyncComponent(() => import('ant-design-vue/es/button'));
const Cascader = defineAsyncComponent(
() => import('ant-design-vue/es/cascader'),
);
const Checkbox = defineAsyncComponent(
() => import('ant-design-vue/es/checkbox'),
);
@@ -59,6 +62,9 @@ const Textarea = defineAsyncComponent(() =>
const TimePicker = defineAsyncComponent(
() => import('ant-design-vue/es/time-picker'),
);
const TimeRangePicker = defineAsyncComponent(() =>
import('ant-design-vue/es/time-picker').then((res) => res.TimeRangePicker),
);
const TreeSelect = defineAsyncComponent(
() => import('ant-design-vue/es/tree-select'),
);
@@ -100,6 +106,7 @@ const withDefaultPlaceholder = <T extends Component>(
// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明
export type ComponentType =
| 'ApiCascader'
| 'ApiSelect'
| 'ApiTreeSelect'
| 'AutoComplete'
@@ -126,6 +133,7 @@ export type ComponentType =
| 'Switch'
| 'Textarea'
| 'TimePicker'
| 'TimeRangePicker'
| 'TreeSelect'
| 'Upload'
| BaseFormComponentType;
@@ -135,6 +143,21 @@ async function initComponentAdapter() {
// 如果你的组件体积比较大,可以使用异步加载
// Button: () =>
// import('xxx').then((res) => res.Button),
ApiCascader: withDefaultPlaceholder(
{
...ApiComponent,
name: 'ApiCascader',
},
'select',
{
component: Cascader,
fieldNames: { label: 'label', value: 'value', children: 'children' },
loadingSlot: 'suffixIcon',
modelPropName: 'value',
optionsPropName: 'treeData',
visibleEvent: 'onVisibleChange',
},
),
ApiSelect: withDefaultPlaceholder(
{
...ApiComponent,
@@ -195,6 +218,7 @@ async function initComponentAdapter() {
Textarea: withDefaultPlaceholder(Textarea, 'input'),
RichTextarea,
TimePicker,
TimeRangePicker,
TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'),
Upload,
FileUpload,

View File

@@ -7,9 +7,7 @@ import type { ComponentType } from './component';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
import { $t } from '@vben/locales';
/** 手机号正则表达式(中国) */
const MOBILE_REGEX = /(?:0|86|\+86)?1[3-9]\d{9}/;
import { isMobile } from '@vben/utils';
async function initSetupVbenForm() {
setupVbenForm<ComponentType>({
@@ -44,7 +42,7 @@ async function initSetupVbenForm() {
mobile: (value, _params, ctx) => {
if (value === undefined || value === null || value.length === 0) {
return true;
} else if (!MOBILE_REGEX.test(value)) {
} else if (!isMobile(value)) {
return $t('ui.formRules.mobile', [ctx.label]);
}
return true;
@@ -54,7 +52,7 @@ async function initSetupVbenForm() {
if (value === undefined || value === null || value.length === 0) {
return $t('ui.formRules.required', [ctx.label]);
}
if (!MOBILE_REGEX.test(value)) {
if (!isMobile(value)) {
return $t('ui.formRules.mobile', [ctx.label]);
}
return true;

View File

@@ -1,79 +0,0 @@
/* 来自 @vben/plugins/vxe-table style.css覆盖 vxe-table 原有的样式定义,使用 vben 的样式主题 */
:root {
--vxe-ui-font-color: hsl(var(--foreground));
--vxe-ui-font-primary-color: hsl(var(--primary));
/* --vxe-ui-font-lighten-color: #babdc0;
--vxe-ui-font-darken-color: #86898e; */
--vxe-ui-font-disabled-color: hsl(var(--foreground) / 50%);
/* base */
--vxe-ui-base-popup-border-color: hsl(var(--border));
--vxe-ui-input-disabled-color: hsl(var(--border) / 60%);
/* --vxe-ui-base-popup-box-shadow: 0px 12px 30px 8px rgb(0 0 0 / 50%); */
/* layout */
--vxe-ui-layout-background-color: hsl(var(--background));
--vxe-ui-table-resizable-line-color: hsl(var(--heavy));
/* --vxe-ui-table-fixed-left-scrolling-box-shadow: 8px 0px 10px -5px hsl(var(--accent));
--vxe-ui-table-fixed-right-scrolling-box-shadow: -8px 0px 10px -5px hsl(var(--accent)); */
/* input */
--vxe-ui-input-border-color: hsl(var(--border));
/* --vxe-ui-input-placeholder-color: #8d9095; */
/* --vxe-ui-input-disabled-background-color: #262727; */
/* loading */
--vxe-ui-loading-background-color: hsl(var(--overlay-content));
/* table */
--vxe-ui-table-header-background-color: hsl(var(--accent));
--vxe-ui-table-border-color: hsl(var(--border));
--vxe-ui-table-row-hover-background-color: hsl(var(--accent-hover));
--vxe-ui-table-row-striped-background-color: hsl(var(--accent) / 60%);
--vxe-ui-table-row-hover-striped-background-color: hsl(var(--accent));
--vxe-ui-table-row-radio-checked-background-color: hsl(var(--accent));
--vxe-ui-table-row-hover-radio-checked-background-color: hsl(
var(--accent-hover)
);
--vxe-ui-table-row-checkbox-checked-background-color: hsl(var(--accent));
--vxe-ui-table-row-hover-checkbox-checked-background-color: hsl(
var(--accent-hover)
);
--vxe-ui-table-row-current-background-color: hsl(var(--accent));
--vxe-ui-table-row-hover-current-background-color: hsl(var(--accent-hover));
--vxe-ui-font-primary-tinge-color: hsl(var(--primary));
--vxe-ui-font-primary-lighten-color: hsl(var(--primary) / 60%);
--vxe-ui-font-primary-darken-color: hsl(var(--primary));
/* height: auto !important; */
/* --vxe-ui-table-fixed-scrolling-box-shadow-color: rgb(0 0 0 / 80%); */
}
.vxe-tools--operate {
margin-right: 0.25rem;
margin-left: 0.75rem;
}
.vxe-table-custom--checkbox-option:hover {
background: none !important;
}
.vxe-toolbar {
padding: 0;
}
.vxe-buttons--wrapper:not(:empty),
.vxe-tools--operate:not(:empty),
.vxe-tools--wrapper:not(:empty) {
padding: 0.6em 0;
}
.vxe-tools--operate:not(:has(button)) {
margin-left: 0;
}

View File

@@ -6,7 +6,9 @@ import { h } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { $te } from '@vben/locales';
import {
AsyncComponents,
AsyncVxeColumn,
AsyncVxeTable,
createRequiredValidation,
setupVbenVxeTable,
useVbenVxeGrid,
} from '@vben/plugins/vxe-table';
@@ -33,8 +35,6 @@ import { $t } from '#/locales';
import { useVbenForm } from './form';
import '#/adapter/style.css';
setupVbenVxeTable({
configVxeTable: (vxeUI) => {
vxeUI.setConfig({
@@ -332,40 +332,44 @@ setupVbenVxeTable({
},
});
// add by 星语:数量格式化,例如说:金额
vxeUI.formats.add('formatNumber', {
// add by 星语:数量格式化,保留 3 位
vxeUI.formats.add('formatAmount3', {
tableCellFormatMethod({ cellValue }) {
return erpCountInputFormatter(cellValue);
},
});
// add by 星语:数量格式化,保留 2 位
vxeUI.formats.add('formatAmount2', {
tableCellFormatMethod({ cellValue }, digits = 2) {
return `${erpNumberFormatter(cellValue, digits)}`;
return `${erpNumberFormatter(cellValue, digits)}`;
},
});
vxeUI.formats.add('formatFenToYuanAmount', {
tableCellFormatMethod({ cellValue }, digits = 2) {
return `${erpNumberFormatter(fenToYuan(cellValue), digits)}`;
return `${erpNumberFormatter(fenToYuan(cellValue), digits)}`;
},
});
// add by 星语:文件大小格式化
vxeUI.formats.add('formatFileSize', {
tableCellFormatMethod({ cellValue }, digits = 2) {
if (!cellValue) return '0 B';
const unitArr = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const index = Math.floor(Math.log(cellValue) / Math.log(1024));
const size = cellValue / 1024 ** index;
const formattedSize = size.toFixed(digits);
return `${formattedSize} ${unitArr[index]}`;
},
});
},
useVbenForm,
});
export { useVbenVxeGrid };
export { createRequiredValidation, useVbenVxeGrid };
const [VxeTable, VxeColumn, VxeToolbar] = AsyncComponents;
export { VxeColumn, VxeTable, VxeToolbar };
export const [VxeTable, VxeColumn] = [AsyncVxeTable, AsyncVxeColumn];
// add by 芋艿from https://github.com/vbenjs/vue-vben-admin/blob/main/playground/src/adapter/vxe-table.ts#L264-L270
export type OnActionClickParams<T = Recordable<any>> = {
code: string;
row: T;
};
export type OnActionClickFn<T = Recordable<any>> = (
params: OnActionClickParams<T>,
) => void;
export * from '#/components/table-action';
export type * from '@vben/plugins/vxe-table';

View File

@@ -12,6 +12,7 @@ export namespace AiImageApi {
// AI 绘图
export interface Image {
id: number; // 编号
userId: number;
platform: string; // 平台
model: string; // 模型
prompt: string; // 提示词

View File

@@ -1,7 +1,6 @@
import type { AiWriteTypeEnum } from '@vben/constants';
import type { PageParam, PageResult } from '@vben/request';
import type { AiWriteTypeEnum } from '#/utils';
import { useAppConfig } from '@vben/hooks';
import { fetchEventSource } from '@vben/request';
import { useAccessStore } from '@vben/stores';

View File

@@ -1,57 +0,0 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ProductUnitApi {
/** 产品单位信息 */
export interface ProductUnit {
id: number; // 编号
groupId?: number; // 分组编号
name?: string; // 单位名称
basic?: number; // 基础单位
number?: number; // 单位数量/相对于基础单位
usageType: number; // 用途
}
}
/** 查询产品单位分页 */
export function getProductUnitPage(params: PageParam) {
return requestClient.get<PageResult<ProductUnitApi.ProductUnit>>(
'/basic/product-unit/page',
{ params },
);
}
/** 查询产品单位详情 */
export function getProductUnit(id: number) {
return requestClient.get<ProductUnitApi.ProductUnit>(
`/basic/product-unit/get?id=${id}`,
);
}
/** 新增产品单位 */
export function createProductUnit(data: ProductUnitApi.ProductUnit) {
return requestClient.post('/basic/product-unit/create', data);
}
/** 修改产品单位 */
export function updateProductUnit(data: ProductUnitApi.ProductUnit) {
return requestClient.put('/basic/product-unit/update', data);
}
/** 删除产品单位 */
export function deleteProductUnit(id: number) {
return requestClient.delete(`/basic/product-unit/delete?id=${id}`);
}
/** 批量删除产品单位 */
export function deleteProductUnitListByIds(ids: number[]) {
return requestClient.delete(
`/basic/product-unit/delete-list?ids=${ids.join(',')}`,
);
}
/** 导出产品单位 */
export function exportProductUnit(params: any) {
return requestClient.download('/basic/product-unit/export-excel', params);
}

View File

@@ -1,61 +0,0 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ProductUnitGroupApi {
/** 产品单位组信息 */
export interface ProductUnitGroup {
id: number; // 编号
name?: string; // 产品单位组名称
status?: number; // 开启状态
}
}
/** 查询产品单位组分页 */
export function getProductUnitGroupPage(params: PageParam) {
return requestClient.get<PageResult<ProductUnitGroupApi.ProductUnitGroup>>(
'/basic/product-unit-group/page',
{ params },
);
}
/** 查询产品单位组详情 */
export function getProductUnitGroup(id: number) {
return requestClient.get<ProductUnitGroupApi.ProductUnitGroup>(
`/basic/product-unit-group/get?id=${id}`,
);
}
/** 新增产品单位组 */
export function createProductUnitGroup(
data: ProductUnitGroupApi.ProductUnitGroup,
) {
return requestClient.post('/basic/product-unit-group/create', data);
}
/** 修改产品单位组 */
export function updateProductUnitGroup(
data: ProductUnitGroupApi.ProductUnitGroup,
) {
return requestClient.put('/basic/product-unit-group/update', data);
}
/** 删除产品单位组 */
export function deleteProductUnitGroup(id: number) {
return requestClient.delete(`/basic/product-unit-group/delete?id=${id}`);
}
/** 批量删除产品单位组 */
export function deleteProductUnitGroupListByIds(ids: number[]) {
return requestClient.delete(
`/basic/product-unit-group/delete-list?ids=${ids.join(',')}`,
);
}
/** 导出产品单位组 */
export function exportProductUnitGroup(params: any) {
return requestClient.download(
'/basic/product-unit-group/export-excel',
params,
);
}

View File

@@ -49,5 +49,7 @@ export async function deleteProcessExpression(id: number) {
/** 导出流程表达式 */
export async function exportProcessExpression(params: any) {
return requestClient.download('/bpm/process-expression/export-excel', params);
return requestClient.download('/bpm/process-expression/export-excel', {
params,
});
}

View File

@@ -1,9 +1,12 @@
import type {
BpmCandidateStrategyEnum,
BpmNodeTypeEnum,
} from '@vben/constants';
import type { PageParam, PageResult } from '@vben/request';
import type { BpmTaskApi } from '../task';
import type { BpmModelApi } from '#/api/bpm/model';
import type { BpmCandidateStrategyEnum, BpmNodeTypeEnum } from '#/utils';
import { requestClient } from '#/api/request';
@@ -40,6 +43,7 @@ export namespace BpmProcessInstanceApi {
nodeType: BpmNodeTypeEnum;
startTime?: Date;
status: number;
processInstanceId?: string;
tasks: ApprovalTaskInfo[];
}

View File

@@ -130,3 +130,10 @@ export const getChildrenTaskList = async (id: string) => {
`/bpm/task/list-by-parent-task-id?parentTaskId=${id}`,
);
};
// 撤回任务
export const withdrawTask = async (taskId: string) => {
return await requestClient.put('/bpm/task/withdraw', null, {
params: { taskId },
});
};

View File

@@ -64,7 +64,11 @@ export namespace AuthApi {
/** 登录 */
export async function loginApi(data: AuthApi.LoginParams) {
return requestClient.post<AuthApi.LoginResult>('/system/auth/login', data);
return requestClient.post<AuthApi.LoginResult>('/system/auth/login', data, {
headers: {
isEncrypt: false,
},
});
}
/** 刷新 accessToken */

View File

@@ -108,7 +108,7 @@ export function deleteBusiness(id: number) {
/** 导出商机 */
export function exportBusiness(params: any) {
return requestClient.download('/crm/business/export-excel', params);
return requestClient.download('/crm/business/export-excel', { params });
}
/** 联系人关联商机列表 */

View File

@@ -67,7 +67,7 @@ export function deleteClue(id: number) {
/** 导出线索 */
export function exportClue(params: any) {
return requestClient.download('/crm/clue/export-excel', params);
return requestClient.download('/crm/clue/export-excel', { params });
}
/** 线索转移 */

View File

@@ -96,7 +96,7 @@ export function deleteContact(id: number) {
/** 导出联系人 */
export function exportContact(params: any) {
return requestClient.download('/crm/contact/export-excel', params);
return requestClient.download('/crm/contact/export-excel', { params });
}
/** 获得联系人列表(精简) */

View File

@@ -50,6 +50,7 @@ export namespace CrmContractApi {
creatorName: string;
updateTime?: Date;
products?: ContractProduct[];
contactName?: string;
}
}
@@ -108,7 +109,7 @@ export function deleteContract(id: number) {
/** 导出合同 */
export function exportContract(params: any) {
return requestClient.download('/crm/contract/export-excel', params);
return requestClient.download('/crm/contract/export-excel', { params });
}
/** 提交审核 */

View File

@@ -16,6 +16,7 @@ export namespace CrmCustomerApi {
ownerUserId: number; // 负责人的用户编号
ownerUserName?: string; // 负责人的用户名称
ownerUserDept?: string; // 负责人的部门名称
ownerUserDeptName?: string; // 负责人的部门名称
lockStatus?: boolean;
dealStatus?: boolean;
mobile: string; // 手机号
@@ -34,7 +35,9 @@ export namespace CrmCustomerApi {
creatorName?: string; // 创建人名称
createTime: Date; // 创建时间
updateTime: Date; // 更新时间
poolDay?: number; // 距离进入公海天数
}
export interface CustomerImport {
ownerUserId: number;
file: File;
@@ -74,7 +77,7 @@ export function deleteCustomer(id: number) {
/** 导出客户 */
export function exportCustomer(params: any) {
return requestClient.download('/crm/customer/export-excel', params);
return requestClient.download('/crm/customer/export-excel', { params });
}
/** 下载客户导入模板 */

View File

@@ -53,5 +53,5 @@ export function deleteProduct(id: number) {
/** 导出产品 */
export function exportProduct(params: any) {
return requestClient.download('/crm/product/export-excel', params);
return requestClient.download('/crm/product/export-excel', { params });
}

View File

@@ -89,7 +89,7 @@ export function deleteReceivable(id: number) {
/** 导出回款 */
export function exportReceivable(params: any) {
return requestClient.download('/crm/receivable/export-excel', params);
return requestClient.download('/crm/receivable/export-excel', { params });
}
/** 提交审核 */

View File

@@ -98,7 +98,7 @@ export function deleteReceivablePlan(id: number) {
}
/** 导出回款计划 Excel */
export function exportReceivablePlan(params: PageParam) {
export function exportReceivablePlan(params: any) {
return requestClient.download('/crm/receivable-plan/export-excel', {
params,
});

View File

@@ -0,0 +1,68 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpAccountApi {
/** ERP 结算账户信息 */
export interface Account {
id?: number; // 结算账户编号
no: string; // 账户编码
remark: string; // 备注
status: number; // 开启状态
sort: number; // 排序
defaultStatus: boolean; // 是否默认
name: string; // 账户名称
}
/** 结算账户分页查询参数 */
export interface AccountPageParam extends PageParam {
name?: string;
no?: string;
status?: number;
}
}
/** 查询结算账户分页 */
export function getAccountPage(params: ErpAccountApi.AccountPageParam) {
return requestClient.get<PageResult<ErpAccountApi.Account>>(
'/erp/account/page',
{ params },
);
}
/** 查询结算账户精简列表 */
export function getAccountSimpleList() {
return requestClient.get<ErpAccountApi.Account[]>('/erp/account/simple-list');
}
/** 查询结算账户详情 */
export function getAccount(id: number) {
return requestClient.get<ErpAccountApi.Account>(`/erp/account/get?id=${id}`);
}
/** 新增结算账户 */
export function createAccount(data: ErpAccountApi.Account) {
return requestClient.post('/erp/account/create', data);
}
/** 修改结算账户 */
export function updateAccount(data: ErpAccountApi.Account) {
return requestClient.put('/erp/account/update', data);
}
/** 修改结算账户默认状态 */
export function updateAccountDefaultStatus(id: number, defaultStatus: boolean) {
return requestClient.put('/erp/account/update-default-status', null, {
params: { id, defaultStatus },
});
}
/** 删除结算账户 */
export function deleteAccount(id: number) {
return requestClient.delete(`/erp/account/delete?id=${id}`);
}
/** 导出结算账户 Excel */
export function exportAccount(params: any) {
return requestClient.download('/erp/account/export-excel', { params });
}

View File

@@ -0,0 +1,112 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpFinancePaymentApi {
/** 付款单项 */
export interface FinancePaymentItem {
id?: number;
row_id?: number; // 前端使用的临时ID
bizId: number; // 业务ID
bizType: number; // 业务类型
bizNo: string; // 业务编号
totalPrice: number; // 应付金额
paidPrice: number; // 已付金额
paymentPrice: number; // 本次付款
remark?: string; // 备注
}
/** 付款单信息 */
export interface FinancePayment {
id?: number; // 付款单编号
no: string; // 付款单号
supplierId: number; // 供应商编号
supplierName?: string; // 供应商名称
paymentTime: Date; // 付款时间
totalPrice: number; // 合计金额,单位:元
discountPrice: number; // 优惠金额
paymentPrice: number; // 实际付款金额
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
accountId?: number; // 付款账户
accountName?: string; // 账户名称
financeUserId?: number; // 财务人员
financeUserName?: string; // 财务人员姓名
creator?: string; // 创建人
creatorName?: string; // 创建人姓名
items?: FinancePaymentItem[]; // 付款明细
bizNo?: string; // 业务单号
}
/** 付款单分页查询参数 */
export interface FinancePaymentPageParams extends PageParam {
no?: string;
paymentTime?: [string, string];
supplierId?: number;
creator?: string;
financeUserId?: number;
accountId?: number;
status?: number;
remark?: string;
bizNo?: string;
}
}
/** 查询付款单分页 */
export function getFinancePaymentPage(
params: ErpFinancePaymentApi.FinancePaymentPageParams,
) {
return requestClient.get<PageResult<ErpFinancePaymentApi.FinancePayment>>(
'/erp/finance-payment/page',
{
params,
},
);
}
/** 查询付款单详情 */
export function getFinancePayment(id: number) {
return requestClient.get<ErpFinancePaymentApi.FinancePayment>(
`/erp/finance-payment/get?id=${id}`,
);
}
/** 新增付款单 */
export function createFinancePayment(
data: ErpFinancePaymentApi.FinancePayment,
) {
return requestClient.post('/erp/finance-payment/create', data);
}
/** 修改付款单 */
export function updateFinancePayment(
data: ErpFinancePaymentApi.FinancePayment,
) {
return requestClient.put('/erp/finance-payment/update', data);
}
/** 更新付款单的状态 */
export function updateFinancePaymentStatus(id: number, status: number) {
return requestClient.put('/erp/finance-payment/update-status', null, {
params: { id, status },
});
}
/** 删除付款单 */
export function deleteFinancePayment(ids: number[]) {
return requestClient.delete('/erp/finance-payment/delete', {
params: {
ids: ids.join(','),
},
});
}
/** 导出付款单 Excel */
export function exportFinancePayment(
params: ErpFinancePaymentApi.FinancePaymentPageParams,
) {
return requestClient.download('/erp/finance-payment/export-excel', {
params,
});
}

View File

@@ -0,0 +1,112 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
namespace ErpFinanceReceiptApi {
/** 收款单项 */
export interface FinanceReceiptItem {
id?: number;
row_id?: number; // 前端使用的临时ID
bizId: number; // 业务ID
bizType: number; // 业务类型
bizNo: string; // 业务编号
totalPrice: number; // 应收金额
receiptedPrice: number; // 已收金额
receiptPrice: number; // 本次收款
remark?: string; // 备注
}
/** 收款单信息 */
export interface FinanceReceipt {
id?: number; // 收款单编号
no: string; // 收款单号
customerId: number; // 客户编号
customerName?: string; // 客户名称
receiptTime: Date; // 收款时间
totalPrice: number; // 合计金额,单位:元
discountPrice: number; // 优惠金额
receiptPrice: number; // 实际收款金额
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
accountId?: number; // 收款账户
accountName?: string; // 账户名称
financeUserId?: number; // 财务人员
financeUserName?: string; // 财务人员姓名
creator?: string; // 创建人
creatorName?: string; // 创建人姓名
items?: FinanceReceiptItem[]; // 收款明细
bizNo?: string; // 业务单号
}
/** 收款单分页查询参数 */
export interface FinanceReceiptPageParams extends PageParam {
no?: string;
receiptTime?: [string, string];
customerId?: number;
creator?: string;
financeUserId?: number;
accountId?: number;
status?: number;
remark?: string;
bizNo?: string;
}
}
/** 查询收款单分页 */
export function getFinanceReceiptPage(
params: ErpFinanceReceiptApi.FinanceReceiptPageParams,
) {
return requestClient.get<PageResult<ErpFinanceReceiptApi.FinanceReceipt>>(
'/erp/finance-receipt/page',
{
params,
},
);
}
/** 查询收款单详情 */
export function getFinanceReceipt(id: number) {
return requestClient.get<ErpFinanceReceiptApi.FinanceReceipt>(
`/erp/finance-receipt/get?id=${id}`,
);
}
/** 新增收款单 */
export function createFinanceReceipt(
data: ErpFinanceReceiptApi.FinanceReceipt,
) {
return requestClient.post('/erp/finance-receipt/create', data);
}
/** 修改收款单 */
export function updateFinanceReceipt(
data: ErpFinanceReceiptApi.FinanceReceipt,
) {
return requestClient.put('/erp/finance-receipt/update', data);
}
/** 更新收款单的状态 */
export function updateFinanceReceiptStatus(id: number, status: number) {
return requestClient.put('/erp/finance-receipt/update-status', null, {
params: { id, status },
});
}
/** 删除收款单 */
export function deleteFinanceReceipt(ids: number[]) {
return requestClient.delete('/erp/finance-receipt/delete', {
params: {
ids: ids.join(','),
},
});
}
/** 导出收款单 Excel */
export function exportFinanceReceipt(
params: ErpFinanceReceiptApi.FinanceReceiptPageParams,
) {
return requestClient.download('/erp/finance-receipt/export-excel', {
params,
});
}

View File

@@ -0,0 +1,62 @@
import { requestClient } from '#/api/request';
export namespace ErpProductCategoryApi {
/** ERP 产品分类信息 */
export interface ProductCategory {
id?: number; // 分类编号
parentId?: number; // 父分类编号
name: string; // 分类名称
code?: string; // 分类编码
sort?: number; // 分类排序
status?: number; // 开启状态
children?: ProductCategory[]; // 子分类
}
}
/** 查询产品分类列表 */
export function getProductCategoryList(params?: any) {
return requestClient.get<ErpProductCategoryApi.ProductCategory[]>(
'/erp/product-category/list',
{ params },
);
}
/** 查询产品分类精简列表 */
export function getProductCategorySimpleList() {
return requestClient.get<ErpProductCategoryApi.ProductCategory[]>(
'/erp/product-category/simple-list',
);
}
/** 查询产品分类详情 */
export function getProductCategory(id: number) {
return requestClient.get<ErpProductCategoryApi.ProductCategory>(
`/erp/product-category/get?id=${id}`,
);
}
/** 新增产品分类 */
export function createProductCategory(
data: ErpProductCategoryApi.ProductCategory,
) {
return requestClient.post('/erp/product-category/create', data);
}
/** 修改产品分类 */
export function updateProductCategory(
data: ErpProductCategoryApi.ProductCategory,
) {
return requestClient.put('/erp/product-category/update', data);
}
/** 删除产品分类 */
export function deleteProductCategory(id: number) {
return requestClient.delete(`/erp/product-category/delete?id=${id}`);
}
/** 导出产品分类 Excel */
export function exportProductCategory(params: any) {
return requestClient.download('/erp/product-category/export-excel', {
params,
});
}

View File

@@ -0,0 +1,61 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpProductApi {
/** ERP 产品信息 */
export interface Product {
id?: number; // 产品编号
name: string; // 产品名称
barCode: string; // 产品条码
categoryId: number; // 产品类型编号
unitId: number; // 单位编号
unitName?: string; // 单位名字
status: number; // 产品状态
standard: string; // 产品规格
remark: string; // 产品备注
expiryDay: number; // 保质期天数
weight: number; // 重量kg
purchasePrice: number; // 采购价格,单位:元
salePrice: number; // 销售价格,单位:元
minPrice: number; // 最低价格,单位:元
}
}
/** 查询产品分页 */
export function getProductPage(params: PageParam) {
return requestClient.get<PageResult<ErpProductApi.Product>>(
'/erp/product/page',
{ params },
);
}
/** 查询产品精简列表 */
export function getProductSimpleList() {
return requestClient.get<ErpProductApi.Product[]>('/erp/product/simple-list');
}
/** 查询产品详情 */
export function getProduct(id: number) {
return requestClient.get<ErpProductApi.Product>(`/erp/product/get?id=${id}`);
}
/** 新增产品 */
export function createProduct(data: ErpProductApi.Product) {
return requestClient.post('/erp/product/create', data);
}
/** 修改产品 */
export function updateProduct(data: ErpProductApi.Product) {
return requestClient.put('/erp/product/update', data);
}
/** 删除产品 */
export function deleteProduct(id: number) {
return requestClient.delete(`/erp/product/delete?id=${id}`);
}
/** 导出产品 Excel */
export function exportProduct(params: any) {
return requestClient.download('/erp/product/export-excel', { params });
}

View File

@@ -0,0 +1,62 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpProductUnitApi {
/** ERP 产品单位信息 */
export interface ProductUnit {
id?: number; // 单位编号
name: string; // 单位名字
status: number; // 单位状态
}
/** 产品单位分页查询参数 */
export interface ProductUnitPageParam extends PageParam {
name?: string;
status?: number;
}
}
/** 查询产品单位分页 */
export function getProductUnitPage(
params: ErpProductUnitApi.ProductUnitPageParam,
) {
return requestClient.get<PageResult<ErpProductUnitApi.ProductUnit>>(
'/erp/product-unit/page',
{ params },
);
}
/** 查询产品单位精简列表 */
export function getProductUnitSimpleList() {
return requestClient.get<ErpProductUnitApi.ProductUnit[]>(
'/erp/product-unit/simple-list',
);
}
/** 查询产品单位详情 */
export function getProductUnit(id: number) {
return requestClient.get<ErpProductUnitApi.ProductUnit>(
`/erp/product-unit/get?id=${id}`,
);
}
/** 新增产品单位 */
export function createProductUnit(data: ErpProductUnitApi.ProductUnit) {
return requestClient.post('/erp/product-unit/create', data);
}
/** 修改产品单位 */
export function updateProductUnit(data: ErpProductUnitApi.ProductUnit) {
return requestClient.put('/erp/product-unit/update', data);
}
/** 删除产品单位 */
export function deleteProductUnit(id: number) {
return requestClient.delete(`/erp/product-unit/delete?id=${id}`);
}
/** 导出产品单位 Excel */
export function exportProductUnit(params: any) {
return requestClient.download('/erp/product-unit/export-excel', { params });
}

View File

@@ -0,0 +1,123 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpPurchaseInApi {
/** 采购入库信息 */
export interface PurchaseIn {
id?: number; // 入库工单编号
no?: string; // 采购入库号
supplierId?: number; // 供应商编号
inTime?: Date; // 入库时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
status?: number; // 状态
remark?: string; // 备注
outCount?: number; // 采购出库数量
returnCount?: number; // 采购退货数量
discountPercent?: number; // 折扣百分比
discountPrice?: number; // 折扣金额
paymentPrice?: number; // 实际支付金额
otherPrice?: number; // 其他费用
totalProductPrice?: number; // 合计商品金额
taxPrice?: number; // 合计税额
items?: PurchaseInItem[]; // 采购入库明细
}
export interface PurchaseInItem {
count?: number;
id?: number;
orderItemId?: number;
productBarCode?: string;
productId?: number;
productName: string;
productPrice: number;
productUnitId?: number;
productUnitName?: string;
totalProductPrice?: number;
remark: string;
stockCount?: number;
taxPercent?: number;
taxPrice?: number;
totalPrice?: number;
warehouseId?: number;
inCount?: number;
}
/** 采购入库分页查询参数 */
export interface PurchaseInPageParams extends PageParam {
no?: string;
supplierId?: number;
status?: number;
}
}
/**
* 查询采购入库分页
*/
export function getPurchaseInPage(
params: ErpPurchaseInApi.PurchaseInPageParams,
) {
return requestClient.get<PageResult<ErpPurchaseInApi.PurchaseIn>>(
'/erp/purchase-in/page',
{
params,
},
);
}
/**
* 查询采购入库详情
*/
export function getPurchaseIn(id: number) {
return requestClient.get<ErpPurchaseInApi.PurchaseIn>(
`/erp/purchase-in/get?id=${id}`,
);
}
/**
* 新增采购入库
*/
export function createPurchaseIn(data: ErpPurchaseInApi.PurchaseIn) {
return requestClient.post('/erp/purchase-in/create', data);
}
/**
* 修改采购入库
*/
export function updatePurchaseIn(data: ErpPurchaseInApi.PurchaseIn) {
return requestClient.put('/erp/purchase-in/update', data);
}
/**
* 更新采购入库的状态
*/
export function updatePurchaseInStatus(id: number, status: number) {
return requestClient.put('/erp/purchase-in/update-status', null, {
params: {
id,
status,
},
});
}
/**
* 删除采购入库
*/
export function deletePurchaseIn(ids: number[]) {
return requestClient.delete('/erp/purchase-in/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出采购入库 Excel
*/
export function exportPurchaseIn(
params: ErpPurchaseInApi.PurchaseInPageParams,
) {
return requestClient.download('/erp/purchase-in/export-excel', {
params,
});
}

View File

@@ -0,0 +1,112 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpPurchaseOrderApi {
/** ERP 采购订单项信息 */
export interface PurchaseOrderItem {
id?: number; // 订单项编号
orderId?: number; // 采购订单编号
productId?: number; // 产品编号
productName?: string; // 产品名称
productBarCode?: string; // 产品条码
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productPrice?: number; // 产品单价,单位:元
totalProductPrice?: number; // 产品总价,单位:元
count?: number; // 数量
totalPrice?: number; // 总价,单位:元
taxPercent?: number; // 税率,百分比
taxPrice?: number; // 税额,单位:元
totalTaxPrice?: number; // 含税总价,单位:元
remark?: string; // 备注
stockCount?: number; // 库存数量(显示字段)
}
/** ERP 采购订单信息 */
export interface PurchaseOrder {
id?: number; // 订单工单编号
no?: string; // 采购订单号
supplierId?: number; // 供应商编号
supplierName?: string; // 供应商名称
orderTime?: Date | string; // 订单时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
totalProductPrice?: number; // 产品金额,单位:元
discountPercent?: number; // 优惠率,百分比
discountPrice?: number; // 优惠金额,单位:元
depositPrice?: number; // 定金金额,单位:元
accountId?: number; // 结算账户编号
status?: number; // 状态
remark?: string; // 备注
fileUrl?: string; // 附件地址
inCount?: number; // 采购入库数量
count?: number; // 数量
returnCount?: number; // 采购退货数量
inStatus?: number; // 入库状态
returnStatus?: number; // 退货状态
productNames?: string; // 产品名称列表
creatorName?: string; // 创建人名称
createTime?: Date; // 创建时间
items?: PurchaseOrderItem[]; // 订单项列表
}
/** 采购订单分页查询参数 */
export interface PurchaseOrderPageParam extends PageParam {
no?: string;
supplierId?: number;
productId?: number;
orderTime?: string[];
status?: number;
remark?: string;
creator?: string;
inStatus?: number;
returnStatus?: number;
}
}
/** 查询采购订单分页 */
export function getPurchaseOrderPage(
params: ErpPurchaseOrderApi.PurchaseOrderPageParam,
) {
return requestClient.get<PageResult<ErpPurchaseOrderApi.PurchaseOrder>>(
'/erp/purchase-order/page',
{ params },
);
}
/** 查询采购订单详情 */
export function getPurchaseOrder(id: number) {
return requestClient.get<ErpPurchaseOrderApi.PurchaseOrder>(
`/erp/purchase-order/get?id=${id}`,
);
}
/** 新增采购订单 */
export function createPurchaseOrder(data: ErpPurchaseOrderApi.PurchaseOrder) {
return requestClient.post('/erp/purchase-order/create', data);
}
/** 修改采购订单 */
export function updatePurchaseOrder(data: ErpPurchaseOrderApi.PurchaseOrder) {
return requestClient.put('/erp/purchase-order/update', data);
}
/** 更新采购订单的状态 */
export function updatePurchaseOrderStatus(id: number, status: number) {
return requestClient.put('/erp/purchase-order/update-status', null, {
params: { id, status },
});
}
/** 删除采购订单 */
export function deletePurchaseOrder(ids: number[]) {
return requestClient.delete('/erp/purchase-order/delete', {
params: { ids: ids.join(',') },
});
}
/** 导出采购订单 Excel */
export function exportPurchaseOrder(params: any) {
return requestClient.download('/erp/purchase-order/export-excel', { params });
}

View File

@@ -0,0 +1,125 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpPurchaseReturnApi {
/** 采购退货信息 */
export interface PurchaseReturn {
id?: number; // 采购退货编号
no?: string; // 采购退货号
supplierId?: number; // 供应商编号
returnTime?: Date; // 退货时间
totalCount?: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
discountPercent?: number; // 折扣百分比
discountPrice?: number; // 折扣金额
status?: number; // 状态
remark?: string; // 备注
totalTaxPrice?: number; // 合计税额
otherPrice?: number; // 其他费用
items?: PurchaseReturnItem[];
}
export interface PurchaseReturnItem {
count?: number;
id?: number;
orderItemId?: number;
productBarCode?: string;
productId?: number;
productName: string;
productPrice: number;
productUnitId?: number;
productUnitName?: string;
totalProductPrice?: number;
remark: string;
stockCount?: number;
taxPercent?: number;
taxPrice?: number;
totalPrice?: number;
warehouseId?: number;
}
/** 采购退货分页查询参数 */
export interface PurchaseReturnPageParams extends PageParam {
no?: string;
supplierId?: number;
status?: number;
}
/** 采购退货状态更新参数 */
export interface PurchaseReturnStatusParams {
id: number;
status: number;
}
}
/**
* 查询采购退货分页
*/
export function getPurchaseReturnPage(
params: ErpPurchaseReturnApi.PurchaseReturnPageParams,
) {
return requestClient.get<PageResult<ErpPurchaseReturnApi.PurchaseReturn>>(
'/erp/purchase-return/page',
{
params,
},
);
}
/**
* 查询采购退货详情
*/
export function getPurchaseReturn(id: number) {
return requestClient.get<ErpPurchaseReturnApi.PurchaseReturn>(
`/erp/purchase-return/get?id=${id}`,
);
}
/**
* 新增采购退货
*/
export function createPurchaseReturn(
data: ErpPurchaseReturnApi.PurchaseReturn,
) {
return requestClient.post('/erp/purchase-return/create', data);
}
/**
* 修改采购退货
*/
export function updatePurchaseReturn(
data: ErpPurchaseReturnApi.PurchaseReturn,
) {
return requestClient.put('/erp/purchase-return/update', data);
}
/**
* 更新采购退货的状态
*/
export function updatePurchaseReturnStatus(id: number, status: number) {
return requestClient.put('/erp/purchase-return/update-status', null, {
params: { id, status },
});
}
/**
* 删除采购退货
*/
export function deletePurchaseReturn(ids: number[]) {
return requestClient.delete('/erp/purchase-return/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出采购退货 Excel
*/
export function exportPurchaseReturn(
params: ErpPurchaseReturnApi.PurchaseReturnPageParams,
) {
return requestClient.download('/erp/purchase-return/export-excel', {
params,
});
}

View File

@@ -0,0 +1,73 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpSupplierApi {
/** ERP 供应商信息 */
export interface Supplier {
id?: number; // 供应商编号
name: string; // 供应商名称
contact: string; // 联系人
mobile: string; // 手机号码
telephone: string; // 联系电话
email: string; // 电子邮箱
fax: string; // 传真
remark: string; // 备注
status: number; // 开启状态
sort: number; // 排序
taxNo: string; // 纳税人识别号
taxPercent: number; // 税率
bankName: string; // 开户行
bankAccount: string; // 开户账号
bankAddress: string; // 开户地址
}
/** 供应商分页查询参数 */
export interface SupplierPageParam extends PageParam {
name?: string;
mobile?: string;
status?: number;
}
}
/** 查询供应商分页 */
export function getSupplierPage(params: ErpSupplierApi.SupplierPageParam) {
return requestClient.get<PageResult<ErpSupplierApi.Supplier>>(
'/erp/supplier/page',
{ params },
);
}
/** 获得供应商精简列表 */
export function getSupplierSimpleList() {
return requestClient.get<ErpSupplierApi.Supplier[]>(
'/erp/supplier/simple-list',
);
}
/** 查询供应商详情 */
export function getSupplier(id: number) {
return requestClient.get<ErpSupplierApi.Supplier>(
`/erp/supplier/get?id=${id}`,
);
}
/** 新增供应商 */
export function createSupplier(data: ErpSupplierApi.Supplier) {
return requestClient.post('/erp/supplier/create', data);
}
/** 修改供应商 */
export function updateSupplier(data: ErpSupplierApi.Supplier) {
return requestClient.put('/erp/supplier/update', data);
}
/** 删除供应商 */
export function deleteSupplier(id: number) {
return requestClient.delete(`/erp/supplier/delete?id=${id}`);
}
/** 导出供应商 Excel */
export function exportSupplier(params: any) {
return requestClient.download('/erp/supplier/export-excel', { params });
}

View File

@@ -0,0 +1,73 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpCustomerApi {
/** ERP 客户信息 */
export interface Customer {
id?: number; // 客户编号
name: string; // 客户名称
contact: string; // 联系人
mobile: string; // 手机号码
telephone: string; // 联系电话
email: string; // 电子邮箱
fax: string; // 传真
remark: string; // 备注
status: number; // 开启状态
sort: number; // 排序
taxNo: string; // 纳税人识别号
taxPercent: number; // 税率
bankName: string; // 开户行
bankAccount: string; // 开户账号
bankAddress: string; // 开户地址
}
/** 客户分页查询参数 */
export interface CustomerPageParam extends PageParam {
name?: string;
mobile?: string;
status?: number;
}
}
/** 查询客户分页 */
export function getCustomerPage(params: ErpCustomerApi.CustomerPageParam) {
return requestClient.get<PageResult<ErpCustomerApi.Customer>>(
'/erp/customer/page',
{ params },
);
}
/** 查询客户精简列表 */
export function getCustomerSimpleList() {
return requestClient.get<ErpCustomerApi.Customer[]>(
'/erp/customer/simple-list',
);
}
/** 查询客户详情 */
export function getCustomer(id: number) {
return requestClient.get<ErpCustomerApi.Customer>(
`/erp/customer/get?id=${id}`,
);
}
/** 新增客户 */
export function createCustomer(data: ErpCustomerApi.Customer) {
return requestClient.post('/erp/customer/create', data);
}
/** 修改客户 */
export function updateCustomer(data: ErpCustomerApi.Customer) {
return requestClient.put('/erp/customer/update', data);
}
/** 删除客户 */
export function deleteCustomer(id: number) {
return requestClient.delete(`/erp/customer/delete?id=${id}`);
}
/** 导出客户 Excel */
export function exportCustomer(params: any) {
return requestClient.download('/erp/customer/export-excel', { params });
}

View File

@@ -0,0 +1,104 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpSaleOrderApi {
/** ERP 销售订单信息 */
export interface SaleOrder {
id?: number; // 订单工单编号
no: string; // 销售订单号
customerId: number; // 客户编号
accountId?: number; // 收款账户编号
orderTime: Date; // 订单时间
totalCount: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
outCount: number; // 销售出库数量
fileUrl?: string; // 附件地址
inCount?: number; // 采购入库数量
returnCount: number; // 销售退货数量
totalProductPrice?: number; // 产品金额,单位:元
discountPercent?: number; // 优惠率,百分比
discountPrice?: number; // 优惠金额,单位:元
depositPrice?: number; // 定金金额,单位:元
items?: SaleOrderItem[]; // 销售订单产品明细列表
}
export interface SaleOrderItem {
id?: number; // 订单项编号
orderId?: number; // 采购订单编号
productId?: number; // 产品编号
productName?: string; // 产品名称
productBarCode?: string; // 产品条码
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productPrice?: number; // 产品单价,单位:元
totalProductPrice?: number; // 产品总价,单位:元
count?: number; // 数量
totalPrice?: number; // 总价,单位:元
taxPercent?: number; // 税率,百分比
taxPrice?: number; // 税额,单位:元
totalTaxPrice?: number; // 含税总价,单位:元
remark?: string; // 备注
stockCount?: number; // 库存数量(显示字段)
}
/** 销售订单分页查询参数 */
export interface SaleOrderPageParam extends PageParam {
no?: string;
customerId?: number;
status?: number;
}
}
/** 查询销售订单分页 */
export function getSaleOrderPage(params: ErpSaleOrderApi.SaleOrderPageParam) {
return requestClient.get<PageResult<ErpSaleOrderApi.SaleOrder>>(
'/erp/sale-order/page',
{ params },
);
}
/** 查询销售订单详情 */
export function getSaleOrder(id: number) {
return requestClient.get<ErpSaleOrderApi.SaleOrder>(
`/erp/sale-order/get?id=${id}`,
);
}
/** 查询销售订单项列表 */
export function getSaleOrderItemListByOrderId(orderId: number) {
return requestClient.get<ErpSaleOrderApi.SaleOrderItem[]>(
`/erp/sale-order/item/list-by-order-id?orderId=${orderId}`,
);
}
/** 新增销售订单 */
export function createSaleOrder(data: ErpSaleOrderApi.SaleOrder) {
return requestClient.post('/erp/sale-order/create', data);
}
/** 修改销售订单 */
export function updateSaleOrder(data: ErpSaleOrderApi.SaleOrder) {
return requestClient.put('/erp/sale-order/update', data);
}
/** 更新销售订单的状态 */
export function updateSaleOrderStatus(id: number, status: number) {
return requestClient.put('/erp/sale-order/update-status', null, {
params: { id, status },
});
}
/** 删除销售订单 */
export function deleteSaleOrder(ids: number[]) {
return requestClient.delete('/erp/sale-order/delete', {
params: { ids: ids.join(',') },
});
}
/** 导出销售订单 Excel */
export function exportSaleOrder(params: any) {
return requestClient.download('/erp/sale-order/export-excel', { params });
}

View File

@@ -0,0 +1,101 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpSaleOutApi {
/** 销售出库信息 */
export interface SaleOut {
id?: number; // 销售出库编号
no?: string; // 销售出库号
customerId?: number; // 客户编号
saleUserId?: number; // 客户编号
outTime?: Date; // 出库时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
status?: number; // 状态
remark?: string; // 备注
discountPercent?: number; // 折扣百分比
discountPrice?: number; // 折扣金额
otherPrice?: number; // 其他费用
totalProductPrice?: number; // 合计商品金额
taxPrice?: number; // 合计税额
totalTaxPrice?: number; // 合计税额
fileUrl?: string; // 附件地址
items?: SaleOutItem[];
}
export interface SaleOutItem {
count?: number;
id?: number;
orderItemId?: number;
productBarCode?: string;
productId?: number;
productName: string;
productPrice: number;
productUnitId?: number;
productUnitName?: string;
totalProductPrice?: number;
remark: string;
stockCount?: number;
taxPercent?: number;
taxPrice?: number;
totalPrice?: number;
warehouseId?: number;
outCount?: number;
}
/** 销售出库分页查询参数 */
export interface SaleOutPageParams extends PageParam {
no?: string;
customerId?: number;
status?: number;
}
}
/** 查询销售出库分页 */
export function getSaleOutPage(params: ErpSaleOutApi.SaleOutPageParams) {
return requestClient.get<PageResult<ErpSaleOutApi.SaleOut>>(
'/erp/sale-out/page',
{
params,
},
);
}
/** 查询销售出库详情 */
export function getSaleOut(id: number) {
return requestClient.get<ErpSaleOutApi.SaleOut>(`/erp/sale-out/get?id=${id}`);
}
/** 新增销售出库 */
export function createSaleOut(data: ErpSaleOutApi.SaleOut) {
return requestClient.post('/erp/sale-out/create', data);
}
/** 修改销售出库 */
export function updateSaleOut(data: ErpSaleOutApi.SaleOut) {
return requestClient.put('/erp/sale-out/update', data);
}
/** 更新销售出库的状态 */
export function updateSaleOutStatus(id: number, status: number) {
return requestClient.put('/erp/sale-out/update-status', null, {
params: { id, status },
});
}
/** 删除销售出库 */
export function deleteSaleOut(ids: number[]) {
return requestClient.delete('/erp/sale-out/delete', {
params: {
ids: ids.join(','),
},
});
}
/** 导出销售出库 Excel */
export function exportSaleOut(params: ErpSaleOutApi.SaleOutPageParams) {
return requestClient.download('/erp/sale-out/export-excel', {
params,
});
}

View File

@@ -0,0 +1,120 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpSaleReturnApi {
/** 销售退货信息 */
export interface SaleReturn {
id?: number; // 销售退货编号
no?: string; // 销售退货号
customerId?: number; // 客户编号
returnTime?: Date; // 退货时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
status?: number; // 状态
remark?: string; // 备注
discountPercent?: number; // 折扣百分比
discountPrice?: number; // 折扣金额
otherPrice?: number; // 其他费用
totalProductPrice?: number; // 合计商品金额
taxPrice?: number; // 合计税额
totalTaxPrice?: number; // 合计税额
fileUrl?: string; // 附件地址
items?: SaleReturnItem[];
}
export interface SaleReturnItem {
count?: number;
id?: number;
orderItemId?: number;
productBarCode?: string;
productId?: number;
productName: string;
productPrice: number;
productUnitId?: number;
productUnitName?: string;
totalProductPrice?: number;
remark: string;
stockCount?: number;
taxPercent?: number;
taxPrice?: number;
totalPrice?: number;
warehouseId?: number;
returnCount?: number;
}
/** 销售退货分页查询参数 */
export interface SaleReturnPageParams extends PageParam {
no?: string;
customerId?: number;
status?: number;
}
}
/**
* 查询销售退货分页
*/
export function getSaleReturnPage(
params: ErpSaleReturnApi.SaleReturnPageParams,
) {
return requestClient.get<PageResult<ErpSaleReturnApi.SaleReturn>>(
'/erp/sale-return/page',
{
params,
},
);
}
/**
* 查询销售退货详情
*/
export function getSaleReturn(id: number) {
return requestClient.get<ErpSaleReturnApi.SaleReturn>(
`/erp/sale-return/get?id=${id}`,
);
}
/**
* 新增销售退货
*/
export function createSaleReturn(data: ErpSaleReturnApi.SaleReturn) {
return requestClient.post('/erp/sale-return/create', data);
}
/**
* 修改销售退货
*/
export function updateSaleReturn(data: ErpSaleReturnApi.SaleReturn) {
return requestClient.put('/erp/sale-return/update', data);
}
/**
* 更新销售退货的状态
*/
export function updateSaleReturnStatus(id: number, status: number) {
return requestClient.put('/erp/sale-return/update-status', null, {
params: { id, status },
});
}
/**
* 删除销售退货
*/
export function deleteSaleReturn(ids: number[]) {
return requestClient.delete('/erp/sale-return/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出销售退货 Excel
*/
export function exportSaleReturn(
params: ErpSaleReturnApi.SaleReturnPageParams,
) {
return requestClient.download('/erp/sale-return/export-excel', {
params,
});
}

View File

@@ -0,0 +1,31 @@
import { requestClient } from '#/api/request';
export namespace ErpPurchaseStatisticsApi {
/** ERP 采购全局统计 */
export interface PurchaseSummary {
todayPrice: number; // 今日采购金额
yesterdayPrice: number; // 昨日采购金额
monthPrice: number; // 本月采购金额
yearPrice: number; // 今年采购金额
}
/** ERP 采购时间段统计 */
export interface PurchaseTimeSummary {
time: string; // 时间
price: number; // 采购金额
}
}
/** 获得采购统计 */
export function getPurchaseSummary() {
return requestClient.get<ErpPurchaseStatisticsApi.PurchaseSummary>(
'/erp/purchase-statistics/summary',
);
}
/** 获得采购时间段统计 */
export function getPurchaseTimeSummary() {
return requestClient.get<ErpPurchaseStatisticsApi.PurchaseTimeSummary[]>(
'/erp/purchase-statistics/time-summary',
);
}

View File

@@ -0,0 +1,31 @@
import { requestClient } from '#/api/request';
export namespace ErpSaleStatisticsApi {
/** ERP 销售全局统计 */
export interface SaleSummary {
todayPrice: number; // 今日销售金额
yesterdayPrice: number; // 昨日销售金额
monthPrice: number; // 本月销售金额
yearPrice: number; // 今年销售金额
}
/** ERP 销售时间段统计 */
export interface SaleTimeSummary {
time: string; // 时间
price: number; // 销售金额
}
}
/** 获得销售统计 */
export function getSaleSummary() {
return requestClient.get<ErpSaleStatisticsApi.SaleSummary>(
'/erp/sale-statistics/summary',
);
}
/** 获得销售时间段统计 */
export function getSaleTimeSummary() {
return requestClient.get<ErpSaleStatisticsApi.SaleTimeSummary[]>(
'/erp/sale-statistics/time-summary',
);
}

View File

@@ -0,0 +1,110 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockCheckApi {
/** 库存盘点单信息 */
export interface StockCheck {
id?: number; // 盘点编号
no: string; // 盘点单号
checkTime: Date; // 盘点时间
totalCount: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
productNames?: string; // 产品信息
creatorName?: string; // 创建人
items?: StockCheckItem[]; // 盘点产品清单
}
export interface StockCheckItem {
id?: number; // 编号
warehouseId?: number; // 仓库编号
productId?: number; // 产品编号
productName?: string; // 产品名称
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productBarCode?: string; // 产品条码
count?: number; // 盈亏数量
actualCount?: number; // 实际库存
productPrice?: number; // 产品单价
totalPrice?: number; // 总价
stockCount?: number; // 账面库存
remark?: string; // 备注
}
/** 库存盘点单分页查询参数 */
export interface StockCheckPageParams extends PageParam {
no?: string;
status?: number;
}
}
/**
* 查询库存盘点单分页
*/
export function getStockCheckPage(
params: ErpStockCheckApi.StockCheckPageParams,
) {
return requestClient.get<PageResult<ErpStockCheckApi.StockCheck>>(
'/erp/stock-check/page',
{
params,
},
);
}
/**
* 查询库存盘点单详情
*/
export function getStockCheck(id: number) {
return requestClient.get<ErpStockCheckApi.StockCheck>(
`/erp/stock-check/get?id=${id}`,
);
}
/**
* 新增库存盘点单
*/
export function createStockCheck(data: ErpStockCheckApi.StockCheck) {
return requestClient.post('/erp/stock-check/create', data);
}
/**
* 修改库存盘点单
*/
export function updateStockCheck(data: ErpStockCheckApi.StockCheck) {
return requestClient.put('/erp/stock-check/update', data);
}
/**
* 更新库存盘点单的状态
*/
export function updateStockCheckStatus(id: number, status: number) {
return requestClient.put('/erp/stock-check/update-status', null, {
params: { id, status },
});
}
/**
* 删除库存盘点单
*/
export function deleteStockCheck(ids: number[]) {
return requestClient.delete('/erp/stock-check/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出库存盘点单 Excel
*/
export function exportStockCheck(
params: ErpStockCheckApi.StockCheckPageParams,
) {
return requestClient.download('/erp/stock-check/export-excel', {
params,
});
}

View File

@@ -0,0 +1,107 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockInApi {
/** 其它入库单信息 */
export interface StockIn {
id?: number; // 入库编号
no: string; // 入库单号
supplierId: number; // 供应商编号
supplierName?: string; // 供应商名称
inTime: Date; // 入库时间
totalCount: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
productNames?: string; // 产品信息
creatorName?: string; // 创建人
items?: StockInItem[]; // 入库产品清单
}
/** 其它入库单产品信息 */
export interface StockInItem {
id?: number; // 编号
warehouseId: number; // 仓库编号
productId: number; // 产品编号
productName?: string; // 产品名称
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productBarCode?: string; // 产品条码
count: number; // 数量
productPrice: number; // 产品单价
totalPrice: number; // 总价
stockCount?: number; // 库存数量
remark?: string; // 备注
}
/** 其它入库单分页查询参数 */
export interface StockInPageParams extends PageParam {
no?: string;
supplierId?: number;
status?: number;
}
}
/**
* 查询其它入库单分页
*/
export function getStockInPage(params: ErpStockInApi.StockInPageParams) {
return requestClient.get<PageResult<ErpStockInApi.StockIn>>(
'/erp/stock-in/page',
{
params,
},
);
}
/**
* 查询其它入库单详情
*/
export function getStockIn(id: number) {
return requestClient.get<ErpStockInApi.StockIn>(`/erp/stock-in/get?id=${id}`);
}
/**
* 新增其它入库单
*/
export function createStockIn(data: ErpStockInApi.StockIn) {
return requestClient.post('/erp/stock-in/create', data);
}
/**
* 修改其它入库单
*/
export function updateStockIn(data: ErpStockInApi.StockIn) {
return requestClient.put('/erp/stock-in/update', data);
}
/**
* 更新其它入库单的状态
*/
export function updateStockInStatus(id: number, status: number) {
return requestClient.put('/erp/stock-in/update-status', null, {
params: { id, status },
});
}
/**
* 删除其它入库单
*/
export function deleteStockIn(ids: number[]) {
return requestClient.delete('/erp/stock-in/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出其它入库单 Excel
*/
export function exportStockIn(params: ErpStockInApi.StockInPageParams) {
return requestClient.download('/erp/stock-in/export-excel', {
params,
});
}

View File

@@ -0,0 +1,107 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockMoveApi {
/** 库存调拨单信息 */
export interface StockMove {
id?: number; // 调拨编号
no: string; // 调拨单号
outTime: Date; // 调拨时间
totalCount: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
fromWarehouseId?: number; // 来源仓库编号
createTime: Date; // 创建时间
creator: string; // 创建人
creatorName: string; // 创建人名称
productNames: string; // 产品名称
items?: StockMoveItem[]; // 子表信息
}
/** 库存调拨单子表信息 */
export interface StockMoveItem {
count: number; // 数量
fromWarehouseId?: number; // 来源仓库ID
id?: number; // ID
productBarCode: string; // 产品条形码
productId?: number; // 产品ID
productName?: string; // 产品名称
productPrice: number; // 产品单价
productUnitName?: string; // 产品单位
remark?: string; // 备注
stockCount: number; // 库存数量
toWarehouseId?: number; // 目标仓库ID
totalPrice?: number; // 总价
}
/** 库存调拨单分页查询参数 */
export interface StockMovePageParams extends PageParam {
no?: string;
status?: number;
}
}
/**
* 查询库存调拨单分页
*/
export function getStockMovePage(params: ErpStockMoveApi.StockMovePageParams) {
return requestClient.get<PageResult<ErpStockMoveApi.StockMove>>(
'/erp/stock-move/page',
{
params,
},
);
}
/**
* 查询库存调拨单详情
*/
export function getStockMove(id: number) {
return requestClient.get<ErpStockMoveApi.StockMove>(
`/erp/stock-move/get?id=${id}`,
);
}
/**
* 新增库存调拨单
*/
export function createStockMove(data: ErpStockMoveApi.StockMove) {
return requestClient.post('/erp/stock-move/create', data);
}
/**
* 修改库存调拨单
*/
export function updateStockMove(data: ErpStockMoveApi.StockMove) {
return requestClient.put('/erp/stock-move/update', data);
}
/**
* 更新库存调拨单的状态
*/
export function updateStockMoveStatus(id: number, status: number) {
return requestClient.put('/erp/stock-move/update-status', null, {
params: { id, status },
});
}
/**
* 删除库存调拨单
*/
export function deleteStockMove(ids: number[]) {
return requestClient.delete('/erp/stock-move/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出库存调拨单 Excel
*/
export function exportStockMove(params: ErpStockMoveApi.StockMovePageParams) {
return requestClient.download('/erp/stock-move/export-excel', { params });
}

View File

@@ -0,0 +1,106 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockOutApi {
/** 其它出库单信息 */
export interface StockOut {
id?: number; // 出库编号
no: string; // 出库单号
customerId: number; // 客户编号
outTime: Date; // 出库时间
totalCount: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
status: number; // 状态
remark: string; // 备注
fileUrl?: string; // 附件
items?: StockOutItem[]; // 出库产品清单
}
/** 其它出库单产品信息 */
export interface StockOutItem {
id?: number; // 编号
warehouseId?: number; // 仓库编号
productId?: number; // 产品编号
productName?: string; // 产品名称
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productBarCode?: string; // 产品条码
count: number; // 数量
productPrice: number; // 产品单价
totalPrice: number; // 总价
stockCount?: number; // 库存数量
remark?: string; // 备注
}
/** 其它出库单分页查询参数 */
export interface StockOutPageParams extends PageParam {
no?: string;
customerId?: number;
status?: number;
}
}
/**
* 查询其它出库单分页
*/
export function getStockOutPage(params: ErpStockOutApi.StockOutPageParams) {
return requestClient.get<PageResult<ErpStockOutApi.StockOut>>(
'/erp/stock-out/page',
{
params,
},
);
}
/**
* 查询其它出库单详情
*/
export function getStockOut(id: number) {
return requestClient.get<ErpStockOutApi.StockOut>(
`/erp/stock-out/get?id=${id}`,
);
}
/**
* 新增其它出库单
*/
export function createStockOut(data: ErpStockOutApi.StockOut) {
return requestClient.post('/erp/stock-out/create', data);
}
/**
* 修改其它出库单
*/
export function updateStockOut(data: ErpStockOutApi.StockOut) {
return requestClient.put('/erp/stock-out/update', data);
}
/**
* 更新其它出库单的状态
*/
export function updateStockOutStatus(id: number, status: number) {
return requestClient.put('/erp/stock-out/update-status', null, {
params: { id, status },
});
}
/**
* 删除其它出库单
*/
export function deleteStockOut(ids: number[]) {
return requestClient.delete('/erp/stock-out/delete', {
params: {
ids: ids.join(','),
},
});
}
/**
* 导出其它出库单 Excel
*/
export function exportStockOut(params: ErpStockOutApi.StockOutPageParams) {
return requestClient.download('/erp/stock-out/export-excel', {
params,
});
}

View File

@@ -0,0 +1,47 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockRecordApi {
/** ERP 产品库存明细 */
export interface StockRecord {
id?: number; // 编号
productId: number; // 产品编号
warehouseId: number; // 仓库编号
count: number; // 出入库数量
totalCount: number; // 总库存量
bizType: number; // 业务类型
bizId: number; // 业务编号
bizItemId: number; // 业务项编号
bizNo: string; // 业务单号
}
/** 库存记录分页查询参数 */
export interface StockRecordPageParam extends PageParam {
productId?: number;
warehouseId?: number;
bizType?: number;
}
}
/** 查询产品库存明细分页 */
export function getStockRecordPage(
params: ErpStockRecordApi.StockRecordPageParam,
) {
return requestClient.get<PageResult<ErpStockRecordApi.StockRecord>>(
'/erp/stock-record/page',
{ params },
);
}
/** 查询产品库存明细详情 */
export function getStockRecord(id: number) {
return requestClient.get<ErpStockRecordApi.StockRecord>(
`/erp/stock-record/get?id=${id}`,
);
}
/** 导出产品库存明细 Excel */
export function exportStockRecord(params: any) {
return requestClient.download('/erp/stock-record/export-excel', { params });
}

View File

@@ -0,0 +1,83 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpStockApi {
/** 产品库存信息 */
export interface Stock {
id?: number; // 编号
productId: number; // 产品编号
warehouseId: number; // 仓库编号
count: number; // 库存数量
}
/** 产品库存分页查询参数 */
export interface StockPageParams extends PageParam {
productId?: number;
warehouseId?: number;
}
/** 产品库存查询参数 */
export interface StockQueryParams {
productId: number;
warehouseId: number;
}
}
/**
* 查询产品库存分页
*/
export function getStockPage(params: ErpStockApi.StockPageParams) {
return requestClient.get<PageResult<ErpStockApi.Stock>>('/erp/stock/page', {
params,
});
}
/**
* 查询产品库存详情
*/
export function getStock(id: number) {
return requestClient.get<ErpStockApi.Stock>(`/erp/stock/get?id=${id}`);
}
/**
* 根据产品和仓库查询库存详情
*/
export function getStockByProductAndWarehouse(
params: ErpStockApi.StockQueryParams,
) {
return requestClient.get<ErpStockApi.Stock>('/erp/stock/get', {
params,
});
}
/**
* 获得产品库存数量
*/
export function getStockCount(productId: number, warehouseId?: number) {
const params: any = { productId };
if (warehouseId !== undefined) {
params.warehouseId = warehouseId;
}
return requestClient.get<number>('/erp/stock/get-count', {
params,
});
}
/**
* 导出产品库存 Excel
*/
export function exportStock(params: ErpStockApi.StockPageParams) {
return requestClient.download('/erp/stock/export-excel', {
params,
});
}
/**
* 获取库存数量
*/
export function getWarehouseStockCount(params: ErpStockApi.StockQueryParams) {
return requestClient.get<number>('/erp/stock/get-count', {
params,
});
}

View File

@@ -0,0 +1,77 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ErpWarehouseApi {
/** ERP 仓库信息 */
export interface Warehouse {
id?: number; // 仓库编号
name: string; // 仓库名称
address: string; // 仓库地址
sort: number; // 排序
remark: string; // 备注
principal: string; // 负责人
warehousePrice: number; // 仓储费,单位:元
truckagePrice: number; // 搬运费,单位:元
status: number; // 开启状态
defaultStatus: boolean; // 是否默认
}
/** 仓库分页查询参数 */
export interface WarehousePageParam extends PageParam {
name?: string;
status?: number;
}
}
/** 查询仓库分页 */
export function getWarehousePage(params: ErpWarehouseApi.WarehousePageParam) {
return requestClient.get<PageResult<ErpWarehouseApi.Warehouse>>(
'/erp/warehouse/page',
{ params },
);
}
/** 查询仓库精简列表 */
export function getWarehouseSimpleList() {
return requestClient.get<ErpWarehouseApi.Warehouse[]>(
'/erp/warehouse/simple-list',
);
}
/** 查询仓库详情 */
export function getWarehouse(id: number) {
return requestClient.get<ErpWarehouseApi.Warehouse>(
`/erp/warehouse/get?id=${id}`,
);
}
/** 新增仓库 */
export function createWarehouse(data: ErpWarehouseApi.Warehouse) {
return requestClient.post('/erp/warehouse/create', data);
}
/** 修改仓库 */
export function updateWarehouse(data: ErpWarehouseApi.Warehouse) {
return requestClient.put('/erp/warehouse/update', data);
}
/** 修改仓库默认状态 */
export function updateWarehouseDefaultStatus(
id: number,
defaultStatus: boolean,
) {
return requestClient.put('/erp/warehouse/update-default-status', null, {
params: { id, defaultStatus },
});
}
/** 删除仓库 */
export function deleteWarehouse(id: number) {
return requestClient.delete(`/erp/warehouse/delete?id=${id}`);
}
/** 导出仓库 Excel */
export function exportWarehouse(params: any) {
return requestClient.download('/erp/warehouse/export-excel', { params });
}

View File

@@ -65,13 +65,13 @@ export namespace InfraCodegenApi {
}
/** 更新代码生成请求 */
export interface CodegenUpdateReq {
export interface CodegenUpdateReqVO {
table: any | CodegenTable;
columns: CodegenColumn[];
}
/** 创建代码生成请求 */
export interface CodegenCreateListReq {
export interface CodegenCreateListReqVO {
dataSourceConfigId?: number;
tableNames: string[];
}
@@ -106,25 +106,36 @@ export function getCodegenTable(tableId: number) {
}
/** 修改代码生成表定义 */
export function updateCodegenTable(data: InfraCodegenApi.CodegenUpdateReq) {
export function updateCodegenTable(data: InfraCodegenApi.CodegenUpdateReqVO) {
return requestClient.put('/infra/codegen/update', data);
}
/** 基于数据库的表结构,同步数据库的表和字段定义 */
export function syncCodegenFromDB(tableId: number) {
return requestClient.put(`/infra/codegen/sync-from-db?tableId=${tableId}`);
return requestClient.put(
'/infra/codegen/sync-from-db',
{},
{
params: { tableId },
},
);
}
/** 预览生成代码 */
export function previewCodegen(tableId: number) {
return requestClient.get<InfraCodegenApi.CodegenPreview[]>(
`/infra/codegen/preview?tableId=${tableId}`,
'/infra/codegen/preview',
{
params: { tableId },
},
);
}
/** 下载生成代码 */
export function downloadCodegen(tableId: number) {
return requestClient.download(`/infra/codegen/download?tableId=${tableId}`);
return requestClient.download('/infra/codegen/download', {
params: { tableId },
});
}
/** 获得表定义 */
@@ -136,7 +147,9 @@ export function getSchemaTableList(params: any) {
}
/** 基于数据库的表结构,创建代码生成器的表定义 */
export function createCodegenList(data: InfraCodegenApi.CodegenCreateListReq) {
export function createCodegenList(
data: InfraCodegenApi.CodegenCreateListReqVO,
) {
return requestClient.post('/infra/codegen/create-list', data);
}

View File

@@ -44,3 +44,10 @@ export function updateDataSourceConfig(
export function deleteDataSourceConfig(id: number) {
return requestClient.delete(`/infra/data-source-config/delete?id=${id}`);
}
/** 批量删除数据源配置 */
export function deleteDataSourceConfigList(ids: number[]) {
return requestClient.delete(
`/infra/data-source-config/delete-list?ids=${ids.join(',')}`,
);
}

View File

@@ -55,5 +55,7 @@ export function deleteDemo01ContactList(ids: number[]) {
/** 导出示例联系人 */
export function exportDemo01Contact(params: any) {
return requestClient.download('/infra/demo01-contact/export-excel', params);
return requestClient.download('/infra/demo01-contact/export-excel', {
params,
});
}

View File

@@ -42,5 +42,7 @@ export function deleteDemo02Category(id: number) {
/** 导出示例分类 */
export function exportDemo02Category(params: any) {
return requestClient.download('/infra/demo02-category/export-excel', params);
return requestClient.download('/infra/demo02-category/export-excel', {
params,
});
}

View File

@@ -70,10 +70,9 @@ export function deleteDemo03StudentList(ids: number[]) {
/** 导出学生 */
export function exportDemo03Student(params: any) {
return requestClient.download(
'/infra/demo03-student-erp/export-excel',
return requestClient.download('/infra/demo03-student-erp/export-excel', {
params,
);
});
}
// ==================== 子表(学生课程) ====================

View File

@@ -72,10 +72,9 @@ export function deleteDemo03StudentList(ids: number[]) {
/** 导出学生 */
export function exportDemo03Student(params: any) {
return requestClient.download(
'/infra/demo03-student-inner/export-excel',
return requestClient.download('/infra/demo03-student-inner/export-excel', {
params,
);
});
}
// ==================== 子表(学生课程) ====================

View File

@@ -72,10 +72,9 @@ export function deleteDemo03StudentList(ids: number[]) {
/** 导出学生 */
export function exportDemo03Student(params: any) {
return requestClient.download(
'/infra/demo03-student-normal/export-excel',
return requestClient.download('/infra/demo03-student-normal/export-excel', {
params,
);
});
}
// ==================== 子表(学生课程) ====================

View File

@@ -16,6 +16,7 @@ export namespace InfraFileConfigApi {
accessKey?: string;
accessSecret?: string;
pathStyle?: boolean;
enablePublicAccess?: boolean;
domain: string;
}

View File

@@ -19,7 +19,7 @@ export namespace InfraFileApi {
}
/** 文件预签名地址 */
export interface FilePresignedUrlResp {
export interface FilePresignedUrlRespVO {
configId: number; // 文件配置编号
uploadUrl: string; // 文件上传 URL
url: string; // 文件 URL
@@ -27,7 +27,7 @@ export namespace InfraFileApi {
}
/** 上传文件 */
export interface FileUploadReq {
export interface FileUploadReqVO {
file: globalThis.File;
directory?: string;
}
@@ -52,7 +52,7 @@ export function deleteFileList(ids: number[]) {
/** 获取文件预签名地址 */
export function getFilePresignedUrl(name: string, directory?: string) {
return requestClient.get<InfraFileApi.FilePresignedUrlResp>(
return requestClient.get<InfraFileApi.FilePresignedUrlRespVO>(
'/infra/file/presigned-url',
{
params: { name, directory },
@@ -67,7 +67,7 @@ export function createFile(data: InfraFileApi.File) {
/** 上传文件 */
export function uploadFile(
data: InfraFileApi.FileUploadReq,
data: InfraFileApi.FileUploadReqVO,
onUploadProgress?: AxiosProgressEvent,
) {
// 特殊:由于 upload 内部封装,即使 directory 为 undefined也会传递给后端

View File

@@ -58,11 +58,12 @@ export function exportJob(params: any) {
/** 任务状态修改 */
export function updateJobStatus(id: number, status: number) {
const params = {
id,
status,
};
return requestClient.put('/infra/job/update-status', {}, { params });
return requestClient.put('/infra/job/update-status', undefined, {
params: {
id,
status,
},
});
}
/** 定时任务立即执行一次 */

View File

@@ -0,0 +1,94 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace AlertConfigApi {
/** IoT 告警配置 VO */
export interface AlertConfig {
id?: number;
name: string;
description?: string;
level?: number;
status?: number;
sceneRuleIds?: number[];
receiveUserIds?: number[];
receiveUserNames?: string;
receiveTypes?: number[];
createTime?: Date;
updateTime?: Date;
}
}
/** IoT 告警配置 */
export interface AlertConfig {
id?: number;
name?: string;
description?: string;
level?: number;
status?: number;
sceneRuleIds?: number[];
receiveUserIds?: number[];
receiveUserNames?: string;
receiveTypes?: number[];
createTime?: Date;
updateTime?: Date;
}
/** 查询告警配置分页 */
export function getAlertConfigPage(params: PageParam) {
return requestClient.get<PageResult<AlertConfigApi.AlertConfig>>(
'/iot/alert-config/page',
{ params },
);
}
/** 查询告警配置详情 */
export function getAlertConfig(id: number) {
return requestClient.get<AlertConfigApi.AlertConfig>(
`/iot/alert-config/get?id=${id}`,
);
}
/** 查询所有告警配置列表 */
export function getAlertConfigList() {
return requestClient.get<AlertConfigApi.AlertConfig[]>(
'/iot/alert-config/list',
);
}
/** 新增告警配置 */
export function createAlertConfig(data: AlertConfig) {
return requestClient.post('/iot/alert-config/create', data);
}
/** 修改告警配置 */
export function updateAlertConfig(data: AlertConfig) {
return requestClient.put('/iot/alert-config/update', data);
}
/** 删除告警配置 */
export function deleteAlertConfig(id: number) {
return requestClient.delete(`/iot/alert-config/delete?id=${id}`);
}
/** 批量删除告警配置 */
export function deleteAlertConfigList(ids: number[]) {
return requestClient.delete('/iot/alert-config/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 启用/禁用告警配置 */
export function toggleAlertConfig(id: number, enabled: boolean) {
return requestClient.put(`/iot/alert-config/toggle`, {
id,
enabled,
});
}
/** 获取告警配置简单列表 */
export function getSimpleAlertConfigList() {
return requestClient.get<AlertConfigApi.AlertConfig[]>(
'/iot/alert-config/simple-list',
);
}

View File

@@ -0,0 +1,82 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace AlertRecordApi {
/** IoT 告警记录 VO */
export interface AlertRecord {
id?: number;
configId?: number;
configName?: string;
configLevel?: number;
deviceId?: number;
deviceName?: string;
productId?: number;
productName?: string;
deviceMessage?: string;
processStatus?: boolean;
processRemark?: string;
processTime?: Date;
createTime?: Date;
}
}
/** IoT 告警记录 */
export interface AlertRecord {
id?: number;
configId?: number;
configName?: string;
configLevel?: number;
deviceId?: number;
deviceName?: string;
productId?: number;
productName?: string;
deviceMessage?: string;
processStatus?: boolean;
processRemark?: string;
processTime?: Date;
createTime?: Date;
}
/** 查询告警记录分页 */
export function getAlertRecordPage(params: PageParam) {
return requestClient.get<PageResult<AlertRecordApi.AlertRecord>>(
'/iot/alert-record/page',
{ params },
);
}
/** 查询告警记录详情 */
export function getAlertRecord(id: number) {
return requestClient.get<AlertRecordApi.AlertRecord>(
`/iot/alert-record/get?id=${id}`,
);
}
/** 处理告警记录 */
export function processAlertRecord(id: number, remark?: string) {
return requestClient.put('/iot/alert-record/process', {
id,
remark,
});
}
/** 批量处理告警记录 */
export function batchProcessAlertRecord(ids: number[], remark?: string) {
return requestClient.put('/iot/alert-record/batch-process', {
ids,
remark,
});
}
/** 删除告警记录 */
export function deleteAlertRecord(id: number) {
return requestClient.delete(`/iot/alert-record/delete?id=${id}`);
}
/** 批量删除告警记录 */
export function deleteAlertRecordList(ids: number[]) {
return requestClient.delete('/iot/alert-record/delete-list', {
params: { ids: ids.join(',') },
});
}

View File

@@ -0,0 +1,196 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IotDeviceApi {
/** IoT 设备 VO */
export interface Device {
id?: number; // 设备 ID主键自增
deviceName: string; // 设备名称
productId: number; // 产品编号
productKey?: string; // 产品标识
deviceType?: number; // 设备类型
nickname?: string; // 设备备注名称
gatewayId?: number; // 网关设备 ID
state?: number; // 设备状态
status?: number; // 设备状态(兼容字段)
onlineTime?: Date; // 最后上线时间
offlineTime?: Date; // 最后离线时间
activeTime?: Date; // 设备激活时间
createTime?: Date; // 创建时间
ip?: string; // 设备的 IP 地址
firmwareVersion?: string; // 设备的固件版本
deviceSecret?: string; // 设备密钥,用于设备认证,需安全存储
mqttClientId?: string; // MQTT 客户端 ID
mqttUsername?: string; // MQTT 用户名
mqttPassword?: string; // MQTT 密码
authType?: string; // 认证类型
locationType?: number; // 定位类型
latitude?: number; // 设备位置的纬度
longitude?: number; // 设备位置的经度
areaId?: number; // 地区编码
address?: string; // 设备详细地址
serialNumber?: string; // 设备序列号
config?: string; // 设备配置
groupIds?: number[]; // 添加分组 ID
picUrl?: string; // 设备图片
location?: string; // 位置信息(格式:经度,纬度)
}
/** IoT 设备属性详细 VO */
export interface DevicePropertyDetail {
identifier: string; // 属性标识符
value: string; // 最新值
updateTime: Date; // 更新时间
name: string; // 属性名称
dataType: string; // 数据类型
dataSpecs: any; // 数据定义
dataSpecsList: any[]; // 数据定义列表
}
/** IoT 设备属性 VO */
export interface DeviceProperty {
identifier: string; // 属性标识符
value: string; // 最新值
updateTime: Date; // 更新时间
}
/** 设备认证参数 VO */
export interface DeviceAuthInfo {
clientId: string; // 客户端 ID
username: string; // 用户名
password: string; // 密码
}
/** IoT 设备发送消息 Request VO */
export interface DeviceMessageSendReq {
deviceId: number; // 设备编号
method: string; // 请求方法
params?: any; // 请求参数
}
/** 设备分组更新请求 */
export interface DeviceGroupUpdateReq {
ids: number[]; // 设备 ID 列表
groupIds: number[]; // 分组 ID 列表
}
}
/** IoT 设备状态枚举 */
export enum DeviceStateEnum {
INACTIVE = 0, // 未激活
OFFLINE = 2, // 离线
ONLINE = 1, // 在线
}
/** 查询设备分页 */
export function getDevicePage(params: PageParam) {
return requestClient.get<PageResult<IotDeviceApi.Device>>(
'/iot/device/page',
{ params },
);
}
/** 查询设备详情 */
export function getDevice(id: number) {
return requestClient.get<IotDeviceApi.Device>(`/iot/device/get?id=${id}`);
}
/** 新增设备 */
export function createDevice(data: IotDeviceApi.Device) {
return requestClient.post('/iot/device/create', data);
}
/** 修改设备 */
export function updateDevice(data: IotDeviceApi.Device) {
return requestClient.put('/iot/device/update', data);
}
/** 修改设备分组 */
export function updateDeviceGroup(data: IotDeviceApi.DeviceGroupUpdateReq) {
return requestClient.put('/iot/device/update-group', data);
}
/** 删除单个设备 */
export function deleteDevice(id: number) {
return requestClient.delete(`/iot/device/delete?id=${id}`);
}
/** 删除多个设备 */
export function deleteDeviceList(ids: number[]) {
return requestClient.delete('/iot/device/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 导出设备 */
export function exportDeviceExcel(params: any) {
return requestClient.download('/iot/device/export-excel', { params });
}
/** 获取设备数量 */
export function getDeviceCount(productId: number) {
return requestClient.get<number>(`/iot/device/count?productId=${productId}`);
}
/** 获取设备的精简信息列表 */
export function getSimpleDeviceList(deviceType?: number, productId?: number) {
return requestClient.get<IotDeviceApi.Device[]>('/iot/device/simple-list', {
params: { deviceType, productId },
});
}
/** 根据产品编号,获取设备的精简信息列表 */
export function getDeviceListByProductId(productId: number) {
return requestClient.get<IotDeviceApi.Device[]>('/iot/device/simple-list', {
params: { productId },
});
}
/** 获取导入模板 */
export function importDeviceTemplate() {
return requestClient.download('/iot/device/get-import-template');
}
/** 获取设备属性最新数据 */
export function getLatestDeviceProperties(params: any) {
return requestClient.get<IotDeviceApi.DevicePropertyDetail[]>(
'/iot/device/property/get-latest',
{ params },
);
}
/** 获取设备属性历史数据 */
export function getHistoryDevicePropertyList(params: any) {
return requestClient.get<PageResult<IotDeviceApi.DeviceProperty>>(
'/iot/device/property/history-list',
{ params },
);
}
/** 获取设备认证信息 */
export function getDeviceAuthInfo(id: number) {
return requestClient.get<IotDeviceApi.DeviceAuthInfo>(
'/iot/device/get-auth-info',
{ params: { id } },
);
}
/** 查询设备消息分页 */
export function getDeviceMessagePage(params: PageParam) {
return requestClient.get<PageResult<any>>('/iot/device/message/page', {
params,
});
}
/** 查询设备消息配对分页 */
export function getDeviceMessagePairPage(params: PageParam) {
return requestClient.get<PageResult<any>>('/iot/device/message/pair-page', {
params,
});
}
/** 发送设备消息 */
export function sendDeviceMessage(params: IotDeviceApi.DeviceMessageSendReq) {
return requestClient.post('/iot/device/message/send', params);
}

View File

@@ -0,0 +1,51 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IotDeviceGroupApi {
/** IoT 设备分组 VO */
export interface DeviceGroup {
id?: number; // 分组 ID
name: string; // 分组名字
status?: number; // 分组状态
description?: string; // 分组描述
deviceCount?: number; // 设备数量
}
}
/** 查询设备分组分页 */
export function getDeviceGroupPage(params: PageParam) {
return requestClient.get<PageResult<IotDeviceGroupApi.DeviceGroup>>(
'/iot/device-group/page',
{ params },
);
}
/** 查询设备分组详情 */
export function getDeviceGroup(id: number) {
return requestClient.get<IotDeviceGroupApi.DeviceGroup>(
`/iot/device-group/get?id=${id}`,
);
}
/** 新增设备分组 */
export function createDeviceGroup(data: IotDeviceGroupApi.DeviceGroup) {
return requestClient.post('/iot/device-group/create', data);
}
/** 修改设备分组 */
export function updateDeviceGroup(data: IotDeviceGroupApi.DeviceGroup) {
return requestClient.put('/iot/device-group/update', data);
}
/** 删除设备分组 */
export function deleteDeviceGroup(id: number) {
return requestClient.delete(`/iot/device-group/delete?id=${id}`);
}
/** 获取设备分组的精简信息列表 */
export function getSimpleDeviceGroupList() {
return requestClient.get<IotDeviceGroupApi.DeviceGroup[]>(
'/iot/device-group/simple-list',
);
}

View File

@@ -0,0 +1,90 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IoTOtaFirmwareApi {
/** IoT OTA 固件 VO */
export interface Firmware {
id?: number;
name: string;
version: string;
productId: number;
productName?: string;
description?: string;
fileUrl?: string;
fileMd5?: string;
fileSize?: number;
status?: number;
createTime?: Date;
updateTime?: Date;
}
}
/** IoT OTA 固件 */
export interface IoTOtaFirmware {
id?: number;
name?: string;
version?: string;
productId?: number;
productName?: string;
description?: string;
fileUrl?: string;
fileMd5?: string;
fileSize?: number;
status?: number;
createTime?: Date;
updateTime?: Date;
}
/** 查询 OTA 固件分页 */
export function getOtaFirmwarePage(params: PageParam) {
return requestClient.get<PageResult<IoTOtaFirmwareApi.Firmware>>(
'/iot/ota/firmware/page',
{ params },
);
}
/** 查询 OTA 固件详情 */
export function getOtaFirmware(id: number) {
return requestClient.get<IoTOtaFirmwareApi.Firmware>(
`/iot/ota/firmware/get?id=${id}`,
);
}
/** 新增 OTA 固件 */
export function createOtaFirmware(data: IoTOtaFirmware) {
return requestClient.post('/iot/ota/firmware/create', data);
}
/** 修改 OTA 固件 */
export function updateOtaFirmware(data: IoTOtaFirmware) {
return requestClient.put('/iot/ota/firmware/update', data);
}
/** 删除 OTA 固件 */
export function deleteOtaFirmware(id: number) {
return requestClient.delete(`/iot/ota/firmware/delete?id=${id}`);
}
/** 批量删除 OTA 固件 */
export function deleteOtaFirmwareList(ids: number[]) {
return requestClient.delete('/iot/ota/firmware/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 更新 OTA 固件状态 */
export function updateOtaFirmwareStatus(id: number, status: number) {
return requestClient.put(`/iot/ota/firmware/update-status`, {
id,
status,
});
}
/** 根据产品 ID 查询固件列表 */
export function getOtaFirmwareListByProductId(productId: number) {
return requestClient.get<IoTOtaFirmwareApi.Firmware[]>(
'/iot/ota/firmware/list-by-product-id',
{ params: { productId } },
);
}

View File

@@ -0,0 +1,98 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IoTOtaTaskApi {
/** IoT OTA 升级任务 VO */
export interface Task {
id?: number;
name: string;
description?: string;
firmwareId: number;
firmwareName?: string;
productId?: number;
productName?: string;
deviceScope?: number;
deviceIds?: number[];
status?: number;
successCount?: number;
failureCount?: number;
pendingCount?: number;
createTime?: Date;
updateTime?: Date;
}
}
/** IoT OTA 升级任务 */
export interface OtaTask {
id?: number;
name?: string;
description?: string;
firmwareId?: number;
firmwareName?: string;
productId?: number;
productName?: string;
deviceScope?: number;
deviceIds?: number[];
status?: number;
successCount?: number;
failureCount?: number;
pendingCount?: number;
createTime?: Date;
updateTime?: Date;
}
/** 查询 OTA 升级任务分页 */
export function getOtaTaskPage(params: PageParam) {
return requestClient.get<PageResult<IoTOtaTaskApi.Task>>(
'/iot/ota/task/page',
{ params },
);
}
/** 查询 OTA 升级任务详情 */
export function getOtaTask(id: number) {
return requestClient.get<IoTOtaTaskApi.Task>(`/iot/ota/task/get?id=${id}`);
}
/** 新增 OTA 升级任务 */
export function createOtaTask(data: OtaTask) {
return requestClient.post('/iot/ota/task/create', data);
}
/** 修改 OTA 升级任务 */
export function updateOtaTask(data: OtaTask) {
return requestClient.put('/iot/ota/task/update', data);
}
/** 删除 OTA 升级任务 */
export function deleteOtaTask(id: number) {
return requestClient.delete(`/iot/ota/task/delete?id=${id}`);
}
/** 批量删除 OTA 升级任务 */
export function deleteOtaTaskList(ids: number[]) {
return requestClient.delete('/iot/ota/task/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 取消 OTA 升级任务 */
export function cancelOtaTask(id: number) {
return requestClient.put(`/iot/ota/task/cancel?id=${id}`);
}
/** 启动 OTA 升级任务 */
export function startOtaTask(id: number) {
return requestClient.put(`/iot/ota/task/start?id=${id}`);
}
/** 暂停 OTA 升级任务 */
export function pauseOtaTask(id: number) {
return requestClient.put(`/iot/ota/task/pause?id=${id}`);
}
/** 恢复 OTA 升级任务 */
export function resumeOtaTask(id: number) {
return requestClient.put(`/iot/ota/task/resume?id=${id}`);
}

View File

@@ -0,0 +1,101 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IoTOtaTaskRecordApi {
/** IoT OTA 升级任务记录 VO */
export interface TaskRecord {
id?: number;
taskId: number;
taskName?: string;
deviceId: number;
deviceName?: string;
firmwareId?: number;
firmwareName?: string;
firmwareVersion?: string;
status?: number;
progress?: number;
errorMessage?: string;
startTime?: Date;
endTime?: Date;
createTime?: Date;
}
}
/** IoT OTA 升级任务记录 */
export interface OtaTaskRecord {
id?: number;
taskId?: number;
taskName?: string;
deviceId?: number;
deviceName?: string;
firmwareId?: number;
firmwareName?: string;
firmwareVersion?: string;
status?: number;
progress?: number;
errorMessage?: string;
startTime?: Date;
endTime?: Date;
createTime?: Date;
}
/** 查询 OTA 升级任务记录分页 */
export function getOtaTaskRecordPage(params: PageParam) {
return requestClient.get<PageResult<IoTOtaTaskRecordApi.TaskRecord>>(
'/iot/ota/task/record/page',
{ params },
);
}
/** 查询 OTA 升级任务记录详情 */
export function getOtaTaskRecord(id: number) {
return requestClient.get<IoTOtaTaskRecordApi.TaskRecord>(
`/iot/ota/task/record/get?id=${id}`,
);
}
/** 根据任务 ID 查询记录列表 */
export function getOtaTaskRecordListByTaskId(taskId: number) {
return requestClient.get<IoTOtaTaskRecordApi.TaskRecord[]>(
'/iot/ota/task/record/list-by-task-id',
{ params: { taskId } },
);
}
/** 根据设备 ID 查询记录列表 */
export function getOtaTaskRecordListByDeviceId(deviceId: number) {
return requestClient.get<IoTOtaTaskRecordApi.TaskRecord[]>(
'/iot/ota/task/record/list-by-device-id',
{ params: { deviceId } },
);
}
/** 根据固件 ID 查询记录列表 */
export function getOtaTaskRecordListByFirmwareId(firmwareId: number) {
return requestClient.get<IoTOtaTaskRecordApi.TaskRecord[]>(
'/iot/ota/task/record/list-by-firmware-id',
{ params: { firmwareId } },
);
}
/** 重试升级任务记录 */
export function retryOtaTaskRecord(id: number) {
return requestClient.put(`/iot/ota/task/record/retry?id=${id}`);
}
/** 取消升级任务记录 */
export function cancelOtaTaskRecord(id: number) {
return requestClient.put(`/iot/ota/task/record/cancel?id=${id}`);
}
/** 获取升级任务记录状态统计 */
export function getOtaTaskRecordStatusStatistics(
firmwareId?: number,
taskId?: number,
) {
return requestClient.get<Record<string, number>>(
'/iot/ota/task/record/status-statistics',
{ params: { firmwareId, taskId } },
);
}

View File

@@ -0,0 +1,57 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IotProductCategoryApi {
/** IoT 產品分類 VO */
export interface ProductCategory {
id?: number; // 分類 ID
name: string; // 分類名稱
parentId?: number; // 父级分類 ID
sort?: number; // 分類排序
status?: number; // 分類狀態
description?: string; // 分類描述
createTime?: string; // 創建時間
}
}
/** 查詢產品分類分頁 */
export function getProductCategoryPage(params: PageParam) {
return requestClient.get<PageResult<IotProductCategoryApi.ProductCategory>>(
'/iot/product-category/page',
{ params },
);
}
/** 查詢產品分類詳情 */
export function getProductCategory(id: number) {
return requestClient.get<IotProductCategoryApi.ProductCategory>(
`/iot/product-category/get?id=${id}`,
);
}
/** 新增產品分類 */
export function createProductCategory(
data: IotProductCategoryApi.ProductCategory,
) {
return requestClient.post('/iot/product-category/create', data);
}
/** 修改產品分類 */
export function updateProductCategory(
data: IotProductCategoryApi.ProductCategory,
) {
return requestClient.put('/iot/product-category/update', data);
}
/** 刪除產品分類 */
export function deleteProductCategory(id: number) {
return requestClient.delete(`/iot/product-category/delete?id=${id}`);
}
/** 獲取產品分類精簡列表 */
export function getSimpleProductCategoryList() {
return requestClient.get<IotProductCategoryApi.ProductCategory[]>(
'/iot/product-category/simple-list',
);
}

View File

@@ -0,0 +1,99 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace IotProductApi {
/** IoT 产品 VO */
export interface Product {
id?: number; // 产品编号
name: string; // 产品名称
productKey?: string; // 产品标识
protocolId?: number; // 协议编号
protocolType?: number; // 接入协议类型
categoryId?: number; // 产品所属品类标识符
categoryName?: string; // 产品所属品类名称
icon?: string; // 产品图标
picUrl?: string; // 产品图片
description?: string; // 产品描述
status?: number; // 产品状态
deviceType?: number; // 设备类型
locationType?: number; // 定位类型
netType?: number; // 联网方式
codecType?: string; // 数据格式(编解码器类型)
dataFormat?: number; // 数据格式
validateType?: number; // 认证方式
deviceCount?: number; // 设备数量
createTime?: Date; // 创建时间
}
}
/** IOT 产品设备类型枚举类 */
export enum DeviceTypeEnum {
DEVICE = 0, // 直连设备
GATEWAY = 2, // 网关设备
GATEWAY_SUB = 1, // 网关子设备
}
/** IOT 产品定位类型枚举类 */
export enum LocationTypeEnum {
IP = 1, // IP 定位
MANUAL = 3, // 手动定位
MODULE = 2, // 设备定位
}
/** IOT 数据格式(编解码器类型)枚举类 */
export enum CodecTypeEnum {
ALINK = 'Alink', // 阿里云 Alink 协议
}
/** 查询产品分页 */
export function getProductPage(params: PageParam) {
return requestClient.get<PageResult<IotProductApi.Product>>(
'/iot/product/page',
{ params },
);
}
/** 查询产品详情 */
export function getProduct(id: number) {
return requestClient.get<IotProductApi.Product>(`/iot/product/get?id=${id}`);
}
/** 新增产品 */
export function createProduct(data: IotProductApi.Product) {
return requestClient.post('/iot/product/create', data);
}
/** 修改产品 */
export function updateProduct(data: IotProductApi.Product) {
return requestClient.put('/iot/product/update', data);
}
/** 删除产品 */
export function deleteProduct(id: number) {
return requestClient.delete(`/iot/product/delete?id=${id}`);
}
/** 导出产品 Excel */
export function exportProduct(params: any) {
return requestClient.download('/iot/product/export-excel', { params });
}
/** 更新产品状态 */
export function updateProductStatus(id: number, status: number) {
return requestClient.put(
`/iot/product/update-status?id=${id}&status=${status}`,
);
}
/** 查询产品(精简)列表 */
export function getSimpleProductList() {
return requestClient.get<IotProductApi.Product[]>('/iot/product/simple-list');
}
/** 根据 ProductKey 获取产品信息 */
export function getProductByKey(productKey: string) {
return requestClient.get<IotProductApi.Product>('/iot/product/get-by-key', {
params: { productKey },
});
}

View File

@@ -0,0 +1,83 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace DataRuleApi {
/** IoT 数据流转规则 VO */
export interface Rule {
id?: number;
name: string;
description?: string;
status?: number;
productId?: number;
productKey?: string;
sourceConfigs?: SourceConfig[];
sinkIds?: number[];
createTime?: Date;
}
/** IoT 数据源配置 */
export interface SourceConfig {
productId?: number;
productKey?: string;
deviceId?: number;
type?: string;
topic?: string;
}
}
/** IoT 数据流转规则 */
export interface DataRule {
id?: number;
name?: string;
description?: string;
status?: number;
productId?: number;
productKey?: string;
sourceConfigs?: any[];
sinkIds?: number[];
createTime?: Date;
}
/** 查询数据流转规则分页 */
export function getDataRulePage(params: PageParam) {
return requestClient.get<PageResult<DataRuleApi.Rule>>(
'/iot/data-rule/page',
{ params },
);
}
/** 查询数据流转规则详情 */
export function getDataRule(id: number) {
return requestClient.get<DataRuleApi.Rule>(`/iot/data-rule/get?id=${id}`);
}
/** 新增数据流转规则 */
export function createDataRule(data: DataRule) {
return requestClient.post('/iot/data-rule/create', data);
}
/** 修改数据流转规则 */
export function updateDataRule(data: DataRule) {
return requestClient.put('/iot/data-rule/update', data);
}
/** 删除数据流转规则 */
export function deleteDataRule(id: number) {
return requestClient.delete(`/iot/data-rule/delete?id=${id}`);
}
/** 批量删除数据流转规则 */
export function deleteDataRuleList(ids: number[]) {
return requestClient.delete('/iot/data-rule/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 更新数据流转规则状态 */
export function updateDataRuleStatus(id: number, status: number) {
return requestClient.put(`/iot/data-rule/update-status`, {
id,
status,
});
}

View File

@@ -0,0 +1,148 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace DataSinkApi {
/** IoT 数据流转目的 VO */
export interface Sink {
id?: number;
name: string;
description?: string;
status?: number;
type: string;
config?: any;
createTime?: Date;
}
}
/** IoT 数据流转目的 */
export interface DataSinkVO {
id?: number;
name?: string;
description?: string;
status?: number;
type?: string;
config?: any;
createTime?: Date;
}
/** IoT 数据目的类型枚举 */
export enum IotDataSinkTypeEnum {
HTTP = 'HTTP',
KAFKA = 'KAFKA',
MQTT = 'MQTT',
RABBITMQ = 'RABBITMQ',
REDIS_STREAM = 'REDIS_STREAM',
ROCKETMQ = 'ROCKETMQ',
}
/** HTTP 配置 */
export interface HttpConfig {
url?: string;
method?: string;
headers?: Record<string, string>;
timeout?: number;
}
/** MQTT 配置 */
export interface MqttConfig {
broker?: string;
port?: number;
topic?: string;
username?: string;
password?: string;
clientId?: string;
qos?: number;
}
/** Kafka 配置 */
export interface KafkaMQConfig {
bootstrapServers?: string;
topic?: string;
acks?: string;
retries?: number;
batchSize?: number;
}
/** RabbitMQ 配置 */
export interface RabbitMQConfig {
host?: string;
port?: number;
virtualHost?: string;
username?: string;
password?: string;
exchange?: string;
routingKey?: string;
queue?: string;
}
/** RocketMQ 配置 */
export interface RocketMQConfig {
nameServer?: string;
topic?: string;
tag?: string;
producerGroup?: string;
}
/** Redis Stream 配置 */
export interface RedisStreamMQConfig {
host?: string;
port?: number;
password?: string;
database?: number;
streamKey?: string;
maxLen?: number;
}
/** 查询数据流转目的分页 */
export function getDataSinkPage(params: PageParam) {
return requestClient.get<PageResult<DataSinkApi.Sink>>(
'/iot/data-sink/page',
{ params },
);
}
/** 查询数据流转目的详情 */
export function getDataSink(id: number) {
return requestClient.get<DataSinkApi.Sink>(`/iot/data-sink/get?id=${id}`);
}
/** 查询所有数据流转目的列表 */
export function getDataSinkList() {
return requestClient.get<DataSinkApi.Sink[]>('/iot/data-sink/list');
}
/** 查询数据流转目的简单列表 */
export function getDataSinkSimpleList() {
return requestClient.get<DataSinkApi.Sink[]>('/iot/data-sink/simple-list');
}
/** 新增数据流转目的 */
export function createDataSink(data: DataSinkVO) {
return requestClient.post('/iot/data-sink/create', data);
}
/** 修改数据流转目的 */
export function updateDataSink(data: DataSinkVO) {
return requestClient.put('/iot/data-sink/update', data);
}
/** 删除数据流转目的 */
export function deleteDataSink(id: number) {
return requestClient.delete(`/iot/data-sink/delete?id=${id}`);
}
/** 批量删除数据流转目的 */
export function deleteDataSinkList(ids: number[]) {
return requestClient.delete('/iot/data-sink/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 更新数据流转目的状态 */
export function updateDataSinkStatus(id: number, status: number) {
return requestClient.put(`/iot/data-sink/update-status`, {
id,
status,
});
}

View File

@@ -0,0 +1,156 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace RuleSceneApi {
/** IoT 场景联动规则 VO */
export interface SceneRule {
id?: number;
name: string;
description?: string;
status?: number;
triggers?: Trigger[];
actions?: Action[];
createTime?: Date;
}
/** IoT 场景联动规则触发器 */
export interface Trigger {
type?: string;
productId?: number;
deviceId?: number;
identifier?: string;
operator?: string;
value?: any;
cronExpression?: string;
conditionGroups?: TriggerConditionGroup[];
}
/** IoT 场景联动规则触发条件组 */
export interface TriggerConditionGroup {
conditions?: TriggerCondition[];
operator?: string;
}
/** IoT 场景联动规则触发条件 */
export interface TriggerCondition {
productId?: number;
deviceId?: number;
identifier?: string;
operator?: string;
value?: any;
type?: string;
}
/** IoT 场景联动规则动作 */
export interface Action {
type?: string;
productId?: number;
deviceId?: number;
identifier?: string;
value?: any;
alertConfigId?: number;
}
}
/** IoT 场景联动规则 */
export interface IotSceneRule {
id?: number;
name?: string;
description?: string;
status?: number;
triggers?: Trigger[];
actions?: Action[];
createTime?: Date;
}
/** IoT 场景联动规则触发器 */
export interface Trigger {
type?: string;
productId?: number;
deviceId?: number;
identifier?: string;
operator?: string;
value?: any;
cronExpression?: string;
conditionGroups?: TriggerConditionGroup[];
}
/** IoT 场景联动规则触发条件组 */
export interface TriggerConditionGroup {
conditions?: TriggerCondition[];
operator?: string;
}
/** IoT 场景联动规则触发条件 */
export interface TriggerCondition {
productId?: number;
deviceId?: number;
identifier?: string;
operator?: string;
value?: any;
type?: string;
param?: string;
}
/** IoT 场景联动规则动作 */
export interface Action {
type?: string;
productId?: number;
deviceId?: number;
identifier?: string;
value?: any;
alertConfigId?: number;
}
/** 查询场景联动规则分页 */
export function getSceneRulePage(params: PageParam) {
return requestClient.get<PageResult<RuleSceneApi.SceneRule>>(
'/iot/scene-rule/page',
{ params },
);
}
/** 查询场景联动规则详情 */
export function getSceneRule(id: number) {
return requestClient.get<RuleSceneApi.SceneRule>(
`/iot/scene-rule/get?id=${id}`,
);
}
/** 新增场景联动规则 */
export function createSceneRule(data: IotSceneRule) {
return requestClient.post('/iot/scene-rule/create', data);
}
/** 修改场景联动规则 */
export function updateSceneRule(data: IotSceneRule) {
return requestClient.put('/iot/scene-rule/update', data);
}
/** 删除场景联动规则 */
export function deleteSceneRule(id: number) {
return requestClient.delete(`/iot/scene-rule/delete?id=${id}`);
}
/** 批量删除场景联动规则 */
export function deleteSceneRuleList(ids: number[]) {
return requestClient.delete('/iot/scene-rule/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 更新场景联动规则状态 */
export function updateSceneRuleStatus(id: number, status: number) {
return requestClient.put(`/iot/scene-rule/update-status`, {
id,
status,
});
}
/** 获取场景联动规则简单列表 */
export function getSimpleRuleSceneList() {
return requestClient.get<RuleSceneApi.SceneRule[]>(
'/iot/scene-rule/simple-list',
);
}

View File

@@ -0,0 +1,69 @@
import { requestClient } from '#/api/request';
export namespace IotStatisticsApi {
/** IoT 统计摘要数据 */
export interface StatisticsSummary {
productCategoryCount: number;
productCount: number;
deviceCount: number;
deviceMessageCount: number;
productCategoryTodayCount: number;
productTodayCount: number;
deviceTodayCount: number;
deviceMessageTodayCount: number;
deviceOnlineCount: number;
deviceOfflineCount: number;
deviceInactiveCount: number;
productCategoryDeviceCounts: Record<string, number>;
}
/** 时间戳-数值的键值对类型 */
export interface TimeValueItem {
[key: string]: number;
}
/** IoT 消息统计数据类型 */
export interface DeviceMessageSummary {
statType: number;
upstreamCounts: TimeValueItem[];
downstreamCounts: TimeValueItem[];
}
/** 消息统计数据项(按日期) */
export interface DeviceMessageSummaryByDate {
time: string;
upstreamCount: number;
downstreamCount: number;
}
/** 消息统计接口参数 */
export interface DeviceMessageReq {
interval: number;
times?: string[];
}
}
/** 获取 IoT 统计摘要数据 */
export function getStatisticsSummary() {
return requestClient.get<IotStatisticsApi.StatisticsSummary>(
'/iot/statistics/get-summary',
);
}
/** 获取设备消息的数据统计(按日期) */
export function getDeviceMessageSummaryByDate(
params: IotStatisticsApi.DeviceMessageReq,
) {
return requestClient.get<IotStatisticsApi.DeviceMessageSummaryByDate[]>(
'/iot/statistics/get-device-message-summary-by-date',
{ params },
);
}
/** 获取设备消息统计摘要 */
export function getDeviceMessageSummary(statType: number) {
return requestClient.get<IotStatisticsApi.DeviceMessageSummary>(
'/iot/statistics/get-device-message-summary',
{ params: { statType } },
);
}

View File

@@ -0,0 +1,191 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ThingModelApi {
/** IoT 物模型数据 VO */
export interface ThingModel {
id?: number;
productId?: number;
productKey?: string;
identifier: string;
name: string;
desc?: string;
type: string;
property?: ThingModelProperty;
event?: ThingModelEvent;
service?: ThingModelService;
}
/** IoT 物模型属性 */
export interface Property {
identifier: string;
name: string;
accessMode: string;
dataType: string;
dataSpecs?: any;
dataSpecsList?: any[];
desc?: string;
}
/** IoT 物模型服务 */
export interface Service {
identifier: string;
name: string;
callType: string;
inputData?: any[];
outputData?: any[];
desc?: string;
}
/** IoT 物模型事件 */
export interface Event {
identifier: string;
name: string;
type: string;
outputData?: any[];
desc?: string;
}
}
/** IoT 物模型数据 */
export interface ThingModelData {
id?: number;
productId?: number;
productKey?: string;
identifier?: string;
name?: string;
desc?: string;
type?: string;
dataType?: string;
property?: ThingModelProperty;
event?: ThingModelEvent;
service?: ThingModelService;
}
/** IoT 物模型属性 */
export interface ThingModelProperty {
identifier?: string;
name?: string;
accessMode?: string;
dataType?: string;
dataSpecs?: any;
dataSpecsList?: any[];
desc?: string;
}
/** IoT 物模型服务 */
export interface ThingModelService {
identifier?: string;
name?: string;
callType?: string;
inputData?: any[];
outputData?: any[];
desc?: string;
}
/** IoT 物模型事件 */
export interface ThingModelEvent {
identifier?: string;
name?: string;
type?: string;
outputData?: any[];
desc?: string;
}
/** IoT 数据定义(数值型) */
export interface DataSpecsNumberData {
min?: number | string;
max?: number | string;
step?: number | string;
unit?: string;
unitName?: string;
}
/** IoT 数据定义(枚举/布尔型) */
export interface DataSpecsEnumOrBoolData {
value: number | string;
name: string;
}
/** IoT 物模型表单校验规则 */
export interface ThingModelFormRules {
[key: string]: any;
}
/** 验证布尔型名称 */
export function validateBoolName(_rule: any, value: any, callback: any) {
if (value) {
callback();
} else {
callback(new Error('枚举描述不能为空'));
}
}
/** 查询产品物模型分页 */
export function getThingModelPage(params: PageParam) {
return requestClient.get<PageResult<ThingModelApi.ThingModel>>(
'/iot/thing-model/page',
{ params },
);
}
/** 查询产品物模型详情 */
export function getThingModel(id: number) {
return requestClient.get<ThingModelApi.ThingModel>(
`/iot/thing-model/get?id=${id}`,
);
}
/** 根据产品 ID 查询物模型列表 */
export function getThingModelListByProductId(productId: number) {
return requestClient.get<ThingModelApi.ThingModel[]>(
'/iot/thing-model/list-by-product-id',
{ params: { productId } },
);
}
/** 根据产品标识查询物模型列表 */
export function getThingModelListByProductKey(productKey: string) {
return requestClient.get<ThingModelApi.ThingModel[]>(
'/iot/thing-model/list-by-product-key',
{ params: { productKey } },
);
}
/** 新增物模型 */
export function createThingModel(data: ThingModelData) {
return requestClient.post('/iot/thing-model/create', data);
}
/** 修改物模型 */
export function updateThingModel(data: ThingModelData) {
return requestClient.put('/iot/thing-model/update', data);
}
/** 删除物模型 */
export function deleteThingModel(id: number) {
return requestClient.delete(`/iot/thing-model/delete?id=${id}`);
}
/** 批量删除物模型 */
export function deleteThingModelList(ids: number[]) {
return requestClient.delete('/iot/thing-model/delete-list', {
params: { ids: ids.join(',') },
});
}
/** 导入物模型 TSL */
export function importThingModelTSL(productId: number, tslData: any) {
return requestClient.post('/iot/thing-model/import-tsl', {
productId,
tslData,
});
}
/** 导出物模型 TSL */
export function exportThingModelTSL(productId: number) {
return requestClient.get<any>('/iot/thing-model/export-tsl', {
params: { productId },
});
}

View File

@@ -5,18 +5,18 @@ import { requestClient } from '#/api/request';
export namespace MallBannerApi {
/** Banner 信息 */
export interface Banner {
id: number;
title: string;
picUrl: string;
status: number;
url: string;
position: number;
sort: number;
memo: string;
id: number; // Banner 编号
title: string; // Banner 标题
picUrl: string; // Banner 图片
status: number; // 状态
url: string; // 链接地址
position: number; // Banner 位置
sort: number; // 排序
memo: string; // 备注
}
}
/** 查询Banner管理列表 */
/** 查询 Banner 管理列表 */
export function getBannerPage(params: PageParam) {
return requestClient.get<PageResult<MallBannerApi.Banner>>(
'/promotion/banner/page',
@@ -24,24 +24,24 @@ export function getBannerPage(params: PageParam) {
);
}
/** 查询Banner管理详情 */
/** 查询 Banner 管理详情 */
export function getBanner(id: number) {
return requestClient.get<MallBannerApi.Banner>(
`/promotion/banner/get?id=${id}`,
);
}
/** 新增Banner管理 */
/** 新增 Banner 管理 */
export function createBanner(data: MallBannerApi.Banner) {
return requestClient.post('/promotion/banner/create', data);
}
/** 修改Banner管理 */
/** 修改 Banner 管理 */
export function updateBanner(data: MallBannerApi.Banner) {
return requestClient.put('/promotion/banner/update', data);
}
/** 删除Banner管理 */
/** 删除 Banner 管理 */
export function deleteBanner(id: number) {
return requestClient.delete(`/promotion/banner/delete?id=${id}`);
}

View File

@@ -5,18 +5,12 @@ import { requestClient } from '#/api/request';
export namespace MallBrandApi {
/** 商品品牌 */
export interface Brand {
/** 品牌编号 */
id?: number;
/** 品牌名称 */
name: string;
/** 品牌图片 */
picUrl: string;
/** 品牌排序 */
sort?: number;
/** 品牌描述 */
description?: string;
/** 开启状态 */
status: number;
id?: number; // 品牌编号
name: string; // 品牌名称
picUrl: string; // 品牌图片
sort?: number; // 品牌排序
description?: string; // 品牌描述
status: number; // 开启状态
}
}

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