Compare commits

...

178 Commits

Author SHA1 Message Date
芋道源码 ba7662cb8b
!370 修复 tsc linter 等报错
Merge pull request !370 from 芋道源码/migration
2026-06-22 05:27:23 +00:00
YunaiV 23df7c7f30 fix(web-antdv-next): 适配 antdv-next 5 组件 API
Descriptions class 改为 classes.root,Image error slot 改为 fallback,Tree 标题 slot 改为 titleRender,FormItem labelCol.style 改为 flex。

Transfer 事件和 footer slot 对齐 TransferKey/TransferDirection,并修复 Button color、ActionItem color、重复 attachments 等类型问题。

web-antdv-next 清缓存 typecheck 0 error。
2026-06-21 22:24:00 -07:00
YunaiV b02c75347e fix(web-antdv-next): 修复富文本图片上传适配
RichEditor 图片上传改用 uploadFile(data, onUploadProgress) 真实签名,不再把 onProgress/onSuccess/onError 塞进请求体。

URL 提取逻辑保持 response?.data?.url ?? response?.url ?? '' 不变。
2026-06-21 22:23:14 -07:00
YunaiV 6608d297e2 chore(ts): 为三端 typecheck 增加增量缓存与 8G heap
- vue-tsc 增加 --incremental 和 tsBuildInfoFile,缓存写入 node_modules/.cache/vue-tsc
- 三端 typecheck 统一设置 NODE_OPTIONS=--max-old-space-size=8192
- 避免清缓存全量 typecheck 时 OOM

说明:做回归判断时仍需先清理 tsbuildinfo,避免增量缓存掩盖新增错误
2026-06-21 21:24:15 -07:00
YunaiV 6ddaa3a755 fix: 吸收 Vue3 类型收敛与低风险修复
- 三端对齐 AI image 入参类型:DALL3 width/height 转 number,MJ base64Array 必填并初始化
- 收敛 CRM/BPM/IOT/Pay/Member/Mall/MP/Infra 等模块 VO 与表单类型
- 修复 mall kefu conversationList.toSorted 未写回导致排序无效
- Reward 商品范围数组改必填并初始化,表单直接绑定数组字段
- BPM form-design 去掉多余 props 捕获,收敛 form-create rule 类型
- simple-process 子流程固定多实例数量用 number 输入、string 存储
- 修复 web-ele 用户任务超时天数 ISO duration:P...D 而非 PT...D
- 修复 web-antd BPM 表单设计模板孤立 > 噪声

验证:web-antd/web-ele clean typecheck 通过;web-antdv-next 既有错误未命中本轮文件
2026-06-21 21:24:05 -07:00
YunaiV 4afe56d03b fix: 吸收 Vue3 低风险交互与局部类型修复
- 三端 ProductList 在 spuIds 为空时跳过商品详情请求
- 三端 FloatingActionButton 点击子项后收起预览面板
- OA 请假 startUserSelectAssignees 改为创建页局部扩展类型,不污染 Leave VO
- 修复 antdv-next FloatingActionButton Image fallback slot 类型
2026-06-21 11:00:40 -07:00
YunaiV e227119f39 fix(bpm): 升级 BPMN 依赖并补齐设计器兼容修复
- 升级 bpmn-js/diagram-js/properties-panel/token-simulation 到 18.x/15.x 版本线
- 三端 ProcessDesigner 补 bpmnCanvas 空值保护,keyboard 改用 diagram-js 15 的 { bind: true }
- 三端 ProcessViewer 补 canvas/elementRegistry 局部类型与空值保护
- 三端 ElementMultiInstance 更新 loopCharacteristics 前增加空值校验
- web-antdv-next Divider 标题位置改用 title-placement

验证:12 个改动文件 ESLint 通过,web-antd/web-ele typecheck 通过,BPMN Delete/Undo/Redo 与 XML 往返浏览器 smoke 通过
2026-06-21 10:37:22 -07:00
YunaiV 796982e488 fix(mall): 订单备注表单收口 remark 默认值
- 三端订单备注弹窗只写入 id/remark 表单字段
- remark 使用空字符串兜底,避免可选商家备注传入必填提交字段
- 避免将完整订单对象写入备注表单

对齐 Vue3 管理后台 9c95bebc2
2026-06-21 08:57:55 -07:00
YunaiV 1ead6888e9 fix(ai): 修复会话列表排序并收敛 createTime 类型
- 三端会话 VO createTime 改为必填字段
- 修复 conversationList.toSorted(...) 未写回导致排序不生效
- 排序和分组时间计算直接使用 Number(createTime)
- IM 群聊消息 index > 0 改为 Number(index) > 0

对齐 Vue3 管理后台 e58fe91a2
2026-06-21 08:51:40 -07:00
YunaiV c2707a499a fix(ai): 补全音乐播放器进度交互
- 音乐列表改用 typed provide/inject + MusicSong
- audioBar 绑定真实 audio 元数据,支持进度显示、拖动 seek 与切歌重载
- 同步适配 web-antd、web-ele、web-antdv-next

对齐 Vue3 管理后台 0970806dc
2026-06-21 08:18:12 -07:00
YunaiV 1a3de7e97a fix(ts): 对齐树表搜索与低风险类型修复
- demo02 树表 list API 参数改为可选
- 优惠券数量 formatter 统一返回字符串
- AI 音乐播放器进度滑块改用独立数值状态
- 同步适配 web-antd、web-ele、web-antdv-next

对齐 Vue3 管理后台 a57df0b2d
2026-06-21 08:03:15 -07:00
YunaiV 0a76bed471 fix(im): 清理 RTC 媒体元素卸载时的 srcObject
- 对齐 Vue3 管理后台 63dfc5e 的 RTC 媒体元素处理
- useMediaStreamElement 改为 callback ref 闭包保存当前元素
- 组件卸载或 ref 置空时清理旧 video/audio 元素的 srcObject,避免流关闭后画面残留
- 同步适配 web-antd、web-ele、web-antdv-next

验证:
- pnpm -F @vben/web-antd run typecheck
- pnpm -F @vben/web-ele run typecheck
- web-antdv-next 仍为既有 55 个类型错误,无 RTC 新增错误
2026-06-21 07:55:13 -07:00
YunaiV 953e7c1502 feat(member):会员详情收货地址展示地区名
3 个 app(web-antd/web-ele/web-antdv-next)address-list 地区列 areaId→areaName,
api 类型 MemberAddressApi.Address 补 areaName,对齐后端回填
2026-06-21 06:24:56 -07:00
芋道源码 ae6ad7abff
!368 Merge remote-tracking branch 'yudao/master'
Merge pull request !368 from Jason/master
2026-06-20 17:35:14 +00:00
芋道源码 31db712610
!369 feat(@vben/web-antdv-next): 补充 MES SN 详情并修复IM等模块兼容性问题
Merge pull request !369 from XuZhiqiang/feat-antdv-next
2026-06-20 17:29:31 +00:00
XuZhiqiang 40f0ad21ed fix(@vben/web-antdv-next): replace deprecated modal destroy prop 2026-06-21 00:07:12 +08:00
XuZhiqiang 5a21adf5bf fix(@vben/web-antdv-next): clean AI template refs and index typing
- remove unused AI template refs

- normalize document split and upload indexes
2026-06-20 23:55:39 +08:00
XuZhiqiang 22ba329ad3 fix(@vben/web-antdv-next): sync BPM designer typecheck fixes
- type BPMN listener helpers and modal grid rows

- remove stale BPMN form field editor code

- normalize simple process indexes and input refs

- clean unused process create timeline ref
2026-06-20 23:55:33 +08:00
XuZhiqiang 0f85d0b5ac fix(@vben/web-antdv-next): normalize IM table slots and map select values
- use bodyCell text for IM table fallback rendering

- handle object payloads from map Select selection
2026-06-20 23:55:19 +08:00
XuZhiqiang 3c146eb925 fix(@vben/web-antdv-next): align CRM receivable query types
- add contract number to receivable type

- add receivable page params for customer and contract filters
2026-06-20 23:55:12 +08:00
XuZhiqiang 29d943ae03 feat(@vben/web-antdv-next): add MES SN detail view
- add SN detail API and row type

- add SN detail modal with barcode action

- add clickable SN count and detail action in SN list
2026-06-20 23:55:07 +08:00
YunaiV 9f611f89fc fix(im): 修复 IM 管理详情页类型检查失败
- 使用 Table bodyCell 的 text 避免 column.dataIndex 动态索引类型错误
2026-06-20 00:49:06 -07:00
jason e2185793c3 fix: [bpm] 并行分支后的审批人自选问题修复,https://t.zsxq.com/daxv1 2026-06-20 13:45:19 +08:00
jason 8f9bd94f58 Merge remote-tracking branch 'yudao/master' 2026-06-20 10:30:15 +08:00
jason 71627271d0 fix: [bpm] 审批人自选时下一个节点审批人显示问题 2026-06-20 10:26:27 +08:00
芋道源码 342ea23ca0
!367 feat(im): 同步 im 的迁移
Merge pull request !367 from 芋道源码/migration
2026-06-20 01:36:10 +00:00
YunaiV 210443c833 feat(im): 优化免打扰会话未读展示
- 免打扰会话保留头像小红点提示
- 会话预览行展示免打扰未读条数
- 总未读统计继续排除免打扰会话
- 同步 Vue3 + Vben 三端会话项展示
2026-06-19 18:29:16 -07:00
芋道源码 50a5800158
!366 Merge remote-tracking branch 'yudao/master'
Merge pull request !366 from Jason/master
2026-06-20 01:16:16 +00:00
芋道源码 1495be795c
!365 fix(workspace): resolve type issues blocking pre-commit
Merge pull request !365 from XuZhiqiang/fix-pre-commit
2026-06-20 01:15:57 +00:00
YunaiV 1d1b0a1d0f fix(im): 修复 vben 三端 IM 组件库属性适配
- 修复 web-ele Element Plus 属性误用
  - Switch 使用 model-value 展示开关状态
  - Badge 使用 value 展示未读角标
  - Image 使用 preview-src-list 恢复图片预览
  - TabPane 使用 label/name 恢复已读状态切换
  - Select 改用 ElOption 渲染频道和素材选项
  - Popover 使用 v-model:visible 控制显示
  - Input 使用 show-word-limit 展示字数统计
  - Descriptions/Table 使用 border 展示边框
- 清理 web-ele 无效 closable 和误用 content 属性
- 清理 web-antdv-next 直接组件的 deprecated prop
  - destroy-on-close 改为 destroy-on-hidden
  - mask-closable 改为 mask.closable
  - body-style 改为 styles.body
2026-06-19 17:39:37 -07:00
YunaiV fac0190ca8 fix(im):修复迁移评审发现的组件与目录问题
- 修复 antdv-next 群详情缺少 DescriptionsItem 导入的问题
- 对齐 antdv-next 群详情、RTC 详情的数据访问写法,移除多余辅助函数
- 修复 web-ele 弹窗、抽屉、原生元素、头像、图标的 title/content 误用
- 将三端表情 API 目录 useritem 统一为 userItem
- 同步更新普通表情和管理端表情相关 import 路径
2026-06-19 17:12:42 -07:00
YunaiV 010da63c7c fix(im):同步已读补上报字段与群通话竞态修复
- web-antd、web-antdv-next、web-ele 同步 reportedReadMessageId 字段
- 避免旧 readMessageId 本地缓存污染 read API 跳过判断
- RTC_CALL_END 按 room 移除群通话胶囊,避免旧房间结束事件误删新房间通话
- participantsLoaded 仅在同 room 下继承,避免新房间误跳过参与者补齐
2026-06-19 11:16:58 -07:00
YunaiV 09b97f1e04 feat(im):同步已读上报补偿与群通话探测优化
- web-antd、web-antdv-next、web-ele 同步会话 readMessageId 逻辑
- readActive 与 WebSocket 自动已读改为基于服务端已上报读位置判断是否跳过接口
- read 接口成功后同步 readMessageId,失败时保留本端已读体验并允许后续重新进入补上报
- 拉取服务端 read 进度时同步更新会话 readMessageId,同时保持本地读位置单调合并
- 三端同步 activeCallLoaded / activeCallExpired 群通话探测状态
- 首登与重连时失效群通话探测缓存,本地无通话且探测过期时懒加载 getActiveCall
- 群通话写入或移除时标记探测已加载,并避免通话探测状态写入 IndexedDB
- 为 IndexedDB DO 类型补充存储结构注释,并修复 conversationStore lint 写法
2026-06-19 11:05:19 -07:00
YunaiV c0ead15bc3 feat(im):优化已读上报、群详情缓存与 RTC 通话状态
- 已读上报增加本地读位置覆盖判断,避免切换会话和当前会话自动已读时重复调用 read 接口
- 标记会话已读时同步推进本地 read 游标并写入 IndexedDB,接口失败仅记录日志
- 缓存私聊对方 maxReadMessageId,并在状态补拉、回执更新和退出 IM 时维护缓存
- 增加群详情 infoLoaded 内存标记,减少切群时重复拉取群详情,手动刷新和关键通知仍强制刷新
- 同步 GROUP_INFO_UPDATE 的 joinApproval,避免群审批配置在前端缓存中陈旧
- 优化群通话胶囊条状态,记录 participantsLoaded,按需补齐参与者并在通话无人时移除胶囊
- RTC_CALL_START 生成群通话最小胶囊条,后续由参与者事件和 getActiveCall 补齐
- 退出 IM 时清理 RTC 状态和群通话缓存
- Vben antd/antd-next 调整媒体元素为函数 ref,修复 MediaStream 与元素挂载时序问题
- 修复 Vben 消息历史弹窗回调类型标注
2026-06-19 10:05:22 -07:00
jason d78476ed84 Merge remote-tracking branch 'yudao/master' 2026-06-19 22:01:57 +08:00
jason d923a70cb4 fix: [bpm] simple 设计器导入问题修复 2026-06-19 21:30:27 +08:00
YunaiV efc75e2608 fix(im): 修复 antd next 一些样式问题 2026-06-19 02:11:26 -07:00
YunaiV c71e250b79 fix(im): 修复 antd next 一些样式问题 2026-06-19 01:46:54 -07:00
YunaiV 8279089eb9 fix(im): 将频道消息的 pull 改成 pullChannelMessageList 2026-06-18 21:59:42 -07:00
XuZhiqiang 56435b45f8 fix(@vben/web-antd): resolve typecheck issues blocking pre-commit
- fix map Select handler value typing
- remove unused AI template refs and normalize v-for indexes
- clean stale BPMN form field editor code
- type BPMN listener helpers and modal grid rows
- preserve node-name input focus with function refs
- add CRM receivable list fields and query param types
2026-06-19 11:36:04 +08:00
XuZhiqiang 53053524f6 fix(@vben/web-ele): 收敛流程监听选择弹窗表格类型 2026-06-19 10:56:10 +08:00
XuZhiqiang 15e274f812 fix(@vben/web-antdv-next): 适配 MES 组件 antdv-next 类型约束 2026-06-19 10:55:21 +08:00
XuZhiqiang 860a12a7e7 fix(workspace): 统一 MES 选择组件 id 判空处理 2026-06-19 10:54:26 +08:00
XuZhiqiang 1e4436561c fix(workspace): 收敛 MP、ERP 和 demo 类型兼容问题 2026-06-19 10:52:59 +08:00
YunaiV 3f13f62e40 feat(im):初始化 antd-next 的 im 迁移 2026-06-18 19:24:29 -07:00
YunaiV 0c8218ecfc Merge remote-tracking branch 'origin/master' into migration
# Conflicts:
#	apps/web-antdv-next/src/views/bpm/processInstance/detail/modules/operation-button.vue
#	apps/web-antdv-next/src/views/bpm/processInstance/detail/modules/time-line.vue

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:12:09 -07:00
YunaiV b1bc5fa0bd fix(im):修复会话侧栏抽屉样式(分隔底色 / body 内边距 / 空 header)
- web-antd 私聊侧栏:残留的 .el-drawer__body 改为 antd 的 .ant-drawer-body,
  去掉抽屉默认 24px 内边距,内容铺满贴边;底色与行分隔线对齐群聊侧栏
- web-antd 私聊 / 群聊侧栏:卡片间灰底 --im-conversation-side-bg 的亮色定义改用 :global(),
  修复 antd Drawer 传送到 body 后 scoped data-v 落不到、灰色分隔条亮色下失效(显白)的问题
- web-ele 私聊 / 群聊侧栏:ElDrawer 补 :with-header="false" 去掉空 header;
  群聊 --im-conversation-side-bg 同样改 :global(),对齐 Vue3 + EP
2026-06-18 16:55:40 -07:00
芋道源码 e26f91d9fa
!364 feat(@vben/web-antdv-next): sync Antdv Next compatibility fixes and BPM attachment support
Merge pull request !364 from XuZhiqiang/feat-antdv-next
2026-06-18 23:17:31 +00:00
YunaiV dfe4c8a040 feat(im):初始化 ele 的 im 迁移 2026-06-18 16:09:40 -07:00
XuZhiqiang e1731f5394 fix(workspace): 修复 ERP 明细草稿和收付款金额类型 2026-06-19 00:18:56 +08:00
XuZhiqiang 2e397a2c64 fix(workspace): 统一 ERP 金额更新事件 emit 命名 2026-06-19 00:07:20 +08:00
YunaiV 5a4f8b4e2a fix(im): 对齐群备注展示并修复 IM 消息管理字典
聊天端:
- 群 API 类型补充 groupRemark 和 silent
- 群列表同步时以接口返回的个人群设置为准,只保留成员缓存
- 会话名写入入口统一使用 getGroupDisplayName,避免群备注被原群名覆盖
- 聊天标题、转发、推荐名片、新建群入口同步群展示名逻辑
- 空群头像且成员未加载时异步预拉群成员,用于合成群头像
- 通讯录和合并消息详情补充滚动容器
- 消息历史日期选择改用 antd Calendar 卡片模式并修正样式

管理端:
- IM 字典常量统一为 im_content_type、im_message_status、im_message_receipt_status
- 私聊 / 群聊消息列表和详情页切换到统一内容类型、消息状态、回执状态字典
- 私聊消息 API 和详情页补充 receiptStatus
- 统计消息类型分布改用内容类型字典
2026-06-18 08:59:19 -07:00
XuZhiqiang 019473e9bc chore: merge master into feat-antdv-next 2026-06-18 23:28:17 +08:00
XuZhiqiang c20eb8e1f4 refactor(@vben/web-antdv-next): migrate SelectOption usages to options and optionRender
Replace remaining SelectOption children with Select options across form-create, BPM, IoT, MES, WMS, Mall, and infra pages.

Use optionRender for custom option content and update the sync skill with Select slot migration guidance.
2026-06-18 23:17:32 +08:00
XuZhiqiang 456a91dfc2 refactor(@vben/web-antdv-next): migrate plain SelectOption usages to options API
Replace simple label/value SelectOption children with Select options across BPM, IoT, AI, MP, Mall, codegen, and demo pages.

Keep custom option markup cases unchanged.
2026-06-18 23:16:30 +08:00
YunaiV e61d0a5aa2 fix(im):对齐 Vue3 已读游标修复 Vben 未读数异常
- Vben 消息离线 pull 入库时,按 conversation read position 过滤已读消息,避免已读历史消息重新累加未读
- Vben WebSocket 实时插入消息时,同步增加 read position 覆盖判断,和 Vue3+EP 的未读统计口径保持一致
- 保持未读自增入口只在 messageStore 的 applyPulledMessageList 和 insertMessage 两处
2026-06-18 07:21:01 -07:00
YunaiV 2ee25c8821 fix(im):同步群昵称静默更新逻辑
- 群聊侧栏从当前群成员的 displayUserName 回填「我在本群的昵称」
- WebSocket 收到 GROUP_MEMBER_NICKNAME_UPDATE 时只同步 groupStore,不再插入消息列表
- 保持与 Vue3 + EP 群昵称修改交互一致
2026-06-18 06:57:24 -07:00
YunaiV 2cbec901e1 feat(im):规范 Vben IM 组件目录并修复聊天端迁移问题
文件命名与目录整理:
- IM home/manager 组件文件统一 PascalCase → kebab-case,并新增各级 components/index.ts barrel 导出
- manager 选择器按业务模块就近收敛到频道、素材、群组目录,删除根 components 下的重复实现
- UserMultiSelect 改为复用 system/user/components/UserSelect,并补充多选与 getUserList 回显能力
- 合并 statistics 子组件导出,MessageContentPreview 调整为 content-preview

问题修复:
- 群聊发送按钮由 Element Plus split-button 写法改为 antd DropdownButton,恢复「发送回执消息」入口
- 修复 scoped 下暗色模式选择器塌缩导致整页发红的问题
- 修复会话「+」菜单图标与文字折行问题
- 修复推荐名片、转发、添加好友弹窗冒出多余 antd 默认底栏的问题

代码规范:
- 清理 IM 模块类型别名、注释和工具方法写法,保持 Vben 规范
- constants.ts 内容类型判定集合由数组改为 Set
- 优化 message/image/pull 等工具函数的 lint 写法
2026-06-18 05:53:25 -07:00
xingyu db628675b2
!363 Merge remote-tracking branch 'yudao/master'
Merge pull request !363 from Jason/master
2026-06-18 09:41:09 +00:00
XuZhiqiang 1f7d21d8e6 fix(@vben/web-antdv-next): 更新表单验证逻辑,使用 Promise 处理异步校验 2026-06-18 16:32:12 +08:00
XuZhiqiang d8c8775af2 fix(@vben/web-antdv-next): 修复FormItem rules为数组形式 2026-06-18 16:22:02 +08:00
XuZhiqiang af681338c7 fix(@vben/web-antdv-next): 添加 SelectOption、RadioButton、RadioGroup 和 FormItem 组件导入 2026-06-18 16:01:05 +08:00
XuZhiqiang 409af6b39c fix(@vben/web-antdv-next): 添加 CollapsePanel 组件导入 2026-06-18 15:05:08 +08:00
XuZhiqiang f152217c3c fix(web-antdv-next): normalize date picker timestamp handling
Add DatePicker and RangePicker adapter wrappers for numeric timestamp values, route direct value-format="x" usages through the adapter, and keep ShortcutDateRangePicker values as Dayjs.
2026-06-18 14:21:12 +08:00
YunaiV 24813f00f5 feat(im):antd 的 im 迁移进一步对齐 2026-06-17 22:14:05 -07:00
YunaiV 0929ab9409 feat(im):初始化 antd 的 im 迁移 2026-06-17 17:57:24 -07:00
jason 2cac5d1f9a Merge remote-tracking branch 'yudao/master' 2026-06-18 07:53:40 +08:00
jason 74f38e8622 fix: [bpm] 修复 timeline 显示问题,去掉 teleport 2026-06-18 07:52:52 +08:00
XuZhiqiang 2fc5575c30 fix(web-antdv-next): 修复 DateRangePicker 共享配置的二元组类型 2026-06-17 21:28:10 +08:00
XuZhiqiang e84607db70 fix(@vben/web-antdv-next): 修复table-actions中更多按钮布局不对齐问题 2026-06-17 17:19:19 +08:00
XuZhiqiang b0c151e6fd fix(@vben/web-antdv-next): 修复代码生成部分,预览时鼠标移入文件树,预览内容不显示的问题 2026-06-17 16:25:45 +08:00
XuZhiqiang 407d0bf25d fix(@vben/web-antdv-next): Description组件添加 DescriptionsItem 组件导入 2026-06-17 15:41:52 +08:00
XuZhiqiang e843b75e40 feat(@vben/web-antdv-next): 添加文件上传组件的下载按钮显示选项 2026-06-17 14:10:20 +08:00
XuZhiqiang cd66d2a1de feat(@vben/web-antdv-next): BPM增加审批意见和附件显示功能 2026-06-17 13:47:50 +08:00
XuZhiqiang 6951bd68a1 feat(@vben/web-antdv-next): BPM拒绝可以添加附件上传功能至审批表单 2026-06-17 13:24:57 +08:00
XuZhiqiang 041e3f6e2d fix(@vben/web-antdv-next): 修复 Tree 选中事件读取旧 dataRef 导致筛选失效 2026-06-17 11:25:07 +08:00
YunaiV 7222e320e2 feat(bpm): vben5 支持审批附件上传与展示
- web-antd、web-ele 审批通过和拒绝弹窗补齐附件上传约束
  - 限制支持常用文档和图片格式
  - 限制单文件最大 5MB、最多上传 10 个
  - 统一上传目录为 bpm/task-attachment
  - 开启上传说明展示
- web-antdv-next 补齐 BPM 审批附件完整能力
  - ApprovalTaskInfo 增加 attachments 字段
  - 审批通过、审批拒绝表单支持上传附件
  - 提交 approveTask/rejectTask 时携带 attachments
  - 弹窗关闭或提交成功后重置附件表单数据
  - 支持图片附件预览,非图片附件新窗口打开
- 三端时间线支持展示审批附件
  - 审批意见和附件统一展示在任务节点下
  - 图片附件展示缩略图并支持预览
  - 普通附件展示文件名并支持点击打开
  - 兼容带 query/hash 的附件 URL 文件名解析和图片类型识别
2026-06-14 02:48:33 +08:00
YunaiV 2a45d2d324 fix(request): 调整默认请求超时时间为 30 秒
- 将 vben 全局请求超时从 10s 调整为 30s
- 对齐 Vue3 + Element Plus 管理后台的请求超时配置
- 避免代码生成器导入表等慢接口频繁超时
2026-06-14 01:57:41 +08:00
芋道源码 8611d40b5c
!361 !360 Merge remote-tracking branch 'yudao/master'
Merge pull request !361 from 芋道源码/master
2026-06-13 17:52:04 +00:00
芋道源码 97ca9cfa45
!360 Merge remote-tracking branch 'yudao/master'
Merge pull request !360 from Jason/master
2026-06-13 17:50:03 +00:00
YunaiV c814d31cd3 feat(infra): 增加定时任务同步入口
- 为 vue3 同步任务按钮补充 infra:job:create 权限
- 为 vben antd、antdv-next、ele 增加 syncJob API
- 为 vben 定时任务列表增加同步任务按钮和确认/loading 流程
2026-06-14 01:21:37 +08:00
YunaiV 3014428775 fix(mes): 修复 SN 码查看条码缺少 bizType
- 新增 SN 码条码业务类型与配置
- 支持按 SN 明细查询对应条码
- 抽离 SN 码明细弹窗组件
- 同步 vben antd/ele 的条码入口

Refs: https://t.zsxq.com/1YCqD
2026-06-13 18:51:46 +08:00
YunaiV bc6e7cf622 fix(mes): 修复选择器筛选和单选弹窗
- 将 MES 通知单/工作站选择器的单选场景改为 radio
- 保留多选场景的 checkbox 与跨页 reserve 行为
- 修复生产工单选择器固定 status/type 参数丢失问题
- 修复空值选择器悬停时误展示清空图标的问题
- 按页面/操作步骤补充 ZSXQ 反馈与验收记录

关联星球:https://t.zsxq.com/dtLd8
2026-06-13 11:00:30 +08:00
jason edec738466 Merge remote-tracking branch 'yudao/master' 2026-06-11 22:59:32 +08:00
jason 36294575d1 feat: [bpm][ele] 审批,拒绝可以添加附件 2026-06-11 22:58:03 +08:00
jason 549d6e0373 feat: [bpm][antd] 审批,拒绝可添加附件 2026-06-11 20:05:46 +08:00
YunaiV f89b0365a1 feat(bpm): 支持流程打印渲染业务表单
- 在 vue3、vben antd、vben ele 打印弹窗中动态加载业务表单组件
- 未启用自定义打印模板且流程表单字段为空时,使用 formCustomViewPath 渲染业务详情
- 业务表单独立于打印表格渲染,避免表格单元格内嵌页面导致布局和分页问题
- 保留 readonly、print-mode 作为业务详情组件打印态适配约定
2026-06-11 01:21:56 +08:00
YunaiV fb80749156 fix: 修复 Vben 表单地区选择器只展示末级地区的问题
- 新增 antd、antdv-next、ele 三端 AreaCascader 组件
- 将表单值保持为末级 areaId,展示时回显完整省市区级联路径
- 替换会员、CRM、商城交易相关表单的地区选择字段
- 按组件库默认行为保留清空和搜索默认关闭,并在使用处显式开启
2026-06-08 22:17:52 +08:00
YunaiV 431cf8f268 Merge remote-tracking branch 'origin/master' into migration 2026-06-08 19:45:32 +08:00
YunaiV 8ed97335c9 fix(mall): 修复文章表单商品选择弹窗异常
- 初始化文章表单 formData,避免商品关联插槽渲染报错
- 禁用父级弹窗点击遮罩关闭,避免打开商品选择时关闭文章弹窗
- 修正文章新增默认值,热门/轮播默认 false,排序默认 0
- 同步修复 antd、antdv-next、ele 三端
2026-06-08 13:20:30 +08:00
xingyu4j b37657a92d Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2026-06-08 10:39:47 +08:00
金毛88 f23c9f5e19 chore: update deps 2026-06-07 18:54:43 +08:00
YunaiV 21998d8044 fix(iot): 修复 IoT 场景联动最近触发时间不显示
- 对齐后端字段 lastTriggerTime
- 修复 web-antd、web-ele、web-antdv-next 的 API 类型、表格列和插槽读取
2026-06-07 14:55:30 +08:00
xingyu4j 413ec8c060 docs: update deps 2026-06-07 12:59:11 +08:00
xingyu4j fd4d247e37 chore: update deps 2026-06-07 12:58:47 +08:00
xingyu4j c376a60e83 fix: lint 2026-06-07 12:52:18 +08:00
xingyu4j aad62cf5ca fix: dhtmlx-gantt 第三方类名使用下划线命名,无法重命名,故禁用 BEM 类名规则 2026-06-07 12:51:48 +08:00
xingyu e6ecade0ee
!359 fix(@vben/web-antdv-next): 适配 antdv-next 组件写法并修复迁移兼容问题
Merge pull request !359 from XuZhiqiang/feat-antdv-next
2026-06-07 02:17:59 +00:00
YunaiV 9c68eb18c1 fix(web-antdv-next): 修复商城组件类型与 WMS 枚举导入
- 修复 web-antdv-next 商城 Banner、活动选择、DIY 装修等组件类型问题
- 收窄热区、魔方、导航栏、公告栏等装修组件配置类型
- 修复 web-antd WMS 首页单据统计枚举从 vue 错误导入的问题
- 修复商城统计时间参数、客服消息类型导入等类型错误
- 对齐 web-antd、web-ele、web-antdv-next 的商城促销组件类型定义
- 修复 DIY 装修、组合活动、积分活动、运费模板等组件兼容问题
2026-06-07 00:52:07 +08:00
YunaiV f2a5bc522d fix(mall): 修复多端商城模块类型与组件兼容问题
- 修复商城统计时间参数、客服消息类型导入等类型错误
- 对齐 web-antd、web-ele、web-antdv-next 的商城促销组件类型定义
- 修复 DIY 装修、组合活动、积分活动、运费模板等组件兼容问题
2026-06-07 00:31:26 +08:00
YunaiV f8fb3d881d fix(mall): 修复首页账户充值金额单位显示错误
- 首页运营数据的账户充值金额从分转换为元后展示
- 同步修复 Vue3 与 Vben 的 antd、ele、antdv-next 三端
2026-06-06 23:40:11 +08:00
XuZhiqiang 4b77779e60 fix(web-antdv-next): 同步 CRM 回款预填和 ERP 单据弹窗修复 2026-06-06 23:08:42 +08:00
XuZhiqiang 7bc60c481a fix(web-antdv-next): 统一 Popover 和 Tooltip trigger 数组写法 2026-06-06 22:56:31 +08:00
XuZhiqiang 8fe46edfba fix(web-antdv-next): BPM 模型菜单使用 MenuItem 适配 antdv-next 2026-06-06 22:53:56 +08:00
XuZhiqiang 4f5caf1566 fix(web-antdv-next): TableAction 和 AI 菜单使用 MenuItem 并修正 Dropdown trigger 2026-06-06 22:51:07 +08:00
XuZhiqiang d3bcfd7177 fix(web-antdv-next): IoT 历史数据表使用 render 替换 customRender 2026-06-06 22:39:03 +08:00
XuZhiqiang 852fd0e44f fix(web-antdv-next): IoT 模拟设备页使用 Tabs items 和 contentRender 适配 antdv-next 2026-06-06 22:34:40 +08:00
XuZhiqiang 08a246d472 fix(web-antdv-next): CRM 和 Mall 模块使用 Tabs items 和 contentRender 适配 antdv-next 2026-06-06 22:29:15 +08:00
YunaiV 9d2446b6ff fix(crm): 修复回款新增弹窗预填数据被清空
- 将回款表单下游字段清空逻辑从 schema 依赖刷新移到用户选择事件
- 修复从回款计划新增回款时合同、期数、金额等预填数据被清空的问题
- 兼容回款管理、回款计划、客户/合同详情等新增回款入口
- 同步处理 web-antd、web-ele、web-antdv-next
2026-06-06 22:26:20 +08:00
XuZhiqiang 1900c051fc fix(web-antdv-next): 使用 Tabs items 和 contentRender 迁移 IoT 详情页签 2026-06-06 22:22:56 +08:00
XuZhiqiang 4646900de1 fix(web-antdv-next): <Tabs.TabPane> 改成 Tabs :items="xxxTabItems",使用 items 和 contentRender 迁移 MES 剩余页签 2026-06-06 22:16:41 +08:00
XuZhiqiang 13acbdd556 fix(web-antdv-next): <Tabs.TabPane> 改成 Tabs :items="xxxTabItems",使用 items 和 contentRender 迁移 MES 页签 2026-06-06 22:12:19 +08:00
YunaiV 651a525187 fix(erp): 修复单据选择弹窗宽高与嵌套关闭问题
- 调整 ERP 单据选择弹窗宽度为 80%
- 固定选择弹窗 Grid 高度,避免表格被压扁
- 禁用主表单弹窗遮罩点击关闭,避免子弹窗操作误关闭主弹窗
- 同步处理 web-antd、web-ele、web-antdv-next
2026-06-06 21:40:45 +08:00
xingyu4j 8e0564cc42 chore: node v24 2026-06-06 21:07:55 +08:00
XuZhiqiang b02d602a21 fix(web-antdv-next): 统一 Collapse 面板和表格插槽写法 2026-06-06 20:56:57 +08:00
xingyu4j 017b3c3fce ci: bump actions/stale from 9 to 10 2026-06-06 20:49:34 +08:00
xingyu4j 126275b417 ci: bump dessant/lock-threads from 5 to 6 2026-06-06 20:48:51 +08:00
xingyu4j bc908e29eb ci: bump amannn/action-semantic-pull-request from 5 to 6 2026-06-06 20:48:19 +08:00
XuZhiqiang 72f3d62a20 fix(web-antdv-next:mall): 替换 Space 组件为 SpaceCompact 实现垂直布局 2026-06-06 20:31:33 +08:00
xingyu4j efe3c25310 chore: update deps 2026-06-06 19:36:39 +08:00
xingyu4j d85ac2c976 feat: form 表单赋值 2026-06-06 19:33:31 +08:00
xingyu4j c816591b69 fix: modal 下拉等不能选中 2026-06-06 19:32:31 +08:00
xingyu4j 564b349700 fix: vue/custom-event-name-casing 2026-06-06 16:21:25 +08:00
xingyu4j ce495d67a0 feat: 同步 antdv-next 的组件 2026-06-06 16:20:36 +08:00
xingyu4j 8094d1ffb9 chore: update deps 2026-06-06 16:19:32 +08:00
XuZhiqiang 5c9a163c46 fix(web-antdv-next): 统一 TextArea 和 InputPassword 引用方式 2026-06-06 12:46:01 +08:00
XuZhiqiang 2aa2c8676f fix(web-antdv-next): 统一日期范围和分组组件引用方式 2026-06-06 12:32:49 +08:00
XuZhiqiang d7b23d67ce fix(web-antdv-next): 使用 SpaceCompact 替换组合组件写法 2026-06-06 12:27:40 +08:00
XuZhiqiang b8d992f828 fix(web-antdv-next): 替换 Button 和 Input 组合组件写法 2026-06-06 12:17:02 +08:00
XuZhiqiang 693f0b48c2 fix(web-antdv-next): 统一 Select 和 Radio 子组件引用方式 2026-06-06 12:05:23 +08:00
XuZhiqiang 4f66adb999 fix(web-antdv-next): 修复Form.Item、Descriptions.Item 报错提示 2026-06-06 12:00:51 +08:00
xingyu da85dcf87c
!357 feat(web-antdv-next): 同步 MES/WMS/IoT 模块并对齐上游 Vben 框架
Merge pull request !357 from XuZhiqiang/feat-antdv-next
2026-06-06 03:43:07 +00:00
XuZhiqiang 1123f00795 fix(web-antdv-next): adapt notification and open change APIs 2026-06-06 11:17:21 +08:00
XuZhiqiang 0efde47539 chore(web-antdv-next): sync MES formatting 2026-06-06 07:37:45 +08:00
XuZhiqiang 569ded85f9 fix(web-antdv-next): sync dashboard workspace spacing 2026-06-06 07:36:56 +08:00
XuZhiqiang e046050ef0 fix(web-antdv-next): sync BPM timeout duration format 2026-06-06 07:35:49 +08:00
XuZhiqiang 615749daf1 chore: 保证和上游Vben-admin的框架依赖一致性 2026-06-06 06:53:11 +08:00
XuZhiqiang db3081ee62 chore: 应该和vben-admin版本保持一致 2026-06-06 06:35:10 +08:00
xingyu4j 58d4be5893 fix: type 2026-06-05 19:03:12 +08:00
xingyu4j 0483d5cd8b Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin 2026-06-05 19:03:00 +08:00
xingyu a0735e1bba
!354 fix: [bpm] OA 请假流程重新发起问题修复
Merge pull request !354 from Jason/master
2026-06-05 10:22:47 +00:00
jason 705aa2fa7b fix: [bpm] web-ele 审批等按钮点击没反应问题修复 2026-06-05 10:07:09 +08:00
jason 1b5a06f3a2 fix: [bpm] web-ele 修复审批等按钮不能操作等问题 2026-06-05 08:11:00 +08:00
afe1 748b182e44
fix: workflow (#8013)
* fix: catelog

* fix: system

* chore: sync upstream changes

* feat:  component and workflow error
2026-06-05 05:13:08 +08:00
XuZhiqiang cf0f7cedca fix(web-antdv-next): sync dept delete confirmation state 2026-06-04 22:57:28 +08:00
XuZhiqiang 70aed10752 fix(@vben/web-antdv-next): 在web-antdv-next,表单适配器只有TextArea,没有Textarea 2026-06-04 16:42:46 +08:00
XuZhiqiang 03f167b7d0 fix(web-antdv-next): sync remaining upstream fixes 2026-06-04 16:22:52 +08:00
XuZhiqiang f6a8c6e652 fix(web-antdv-next): sync shared UI fixes 2026-06-04 16:20:42 +08:00
XuZhiqiang 09970d89a4 feat(web-antdv-next): sync IoT module 2026-06-04 16:17:45 +08:00
XuZhiqiang 6315055c08 feat(web-antdv-next): migrate MES module 2026-06-04 16:08:03 +08:00
XuZhiqiang 82b22173c0 feat(web-antdv-next): migrate WMS module 2026-06-04 15:57:43 +08:00
XuZhiqiang e6e4d8ce1e fix(@vben/web-antdv-next): 修复IOT模块若干导入异常问题 2026-06-04 15:28:56 +08:00
XuZhiqiang bac2f92d1a chore(@vben/web-antdv-next): 升级antdv-next版本为1.3.3 2026-06-04 15:27:45 +08:00
jason a357dbf940 fix: [bpm] OA 请假流程重新发起问题修复 2026-06-04 14:11:30 +08:00
金毛88 6544340d80 Merge branch 'fork/HaroldZhangCode91/feature/fix_freeze_scrollbar_of_modal' 2026-06-04 13:54:21 +08:00
jason 8146ebde8c Merge remote-tracking branch 'yudao/master' 2026-06-04 12:42:27 +08:00
jason b91268923f fix: [bpm] 超时时间天的格式问题修复 2026-06-04 12:40:51 +08:00
jason 4a597c0806 fix: 发起人节点显示审批意见 2026-06-04 12:37:51 +08:00
Harold Zhang 6b7cb7b1fc feat: fixed the regression of changing Menu to MenuUI 2026-06-04 11:46:53 +08:00
Harold Zhang d90d45a128 fix: fixed modal freeze issue 2026-06-04 11:19:38 +08:00
Harold Zhang 66077b3bcf Merge branch 'main' into feature/fix_freeze_scrollbar_of_modal 2026-06-03 18:07:37 +08:00
Harold Zhang 0328594747 feat: fixed the overlay layer can not work with reka-ui 2026-06-03 17:52:41 +08:00
金毛88 790e114d41 chore: 固定vite 8.0.10,避免编译后异常 2026-06-03 17:32:13 +08:00
Harold Zhang cc60ca9592 feat: fixed the defects the scrollbar disapear when modal close 2026-06-03 16:10:17 +08:00
HaroldZhangCode91 79707a2ebd
feat: fixed regression of modal for element plus (#7999) 2026-06-03 13:27:12 +08:00
金毛88 0eb72ca4fd feat: add useTDesignDesignTokens 2026-06-03 13:25:23 +08:00
金毛88 7fd4b1de04 Merge branch 'fork/SaleriHQ/feat/form-field-array' 2026-06-03 13:22:21 +08:00
xingyu 1f8e9f6bb0
update README.md.
Signed-off-by: xingyu <xingyu4j@vip.qq.com>
2026-06-02 00:55:21 +00:00
YunaiV 044ba2382d feat(im):增加 im 的功能说明 2026-06-01 08:17:48 +08:00
Saleri 9ffd42f013 chore: add changeset for form field array 2026-05-31 23:06:00 +08:00
Saleri 40101911f0 style: format naive styles 2026-05-31 16:21:13 +08:00
xingyu 04fbb7a556
chore: 升级 shadcn-vue 组件到v4最新版 (#7972)
* fix: useStore is deprecated

* chore: update deps

* feat: 升级shadcn-ui v4

* fix: workbench style

* feat: 升级shadcn-ui v4 step2

* feat: 升级shadcn-ui v4 step3

* chore: 升级shadcn v4

* fix: pagination

* fix: dark style

* fix: doc import

* feat: 增加详情组件,参考 antdv-next

* docs: descriptions docs

* docs: Browser Support

* feat: add table action

* feat: icon use vbenIcon

* fix: type error

* fix: dropdown popConfirm

* feat: 使用默认的文字交互

* feat: 优化渲染性能
2026-05-31 15:18:46 +08:00
Saleri e5f9106caa feat(@core/form-ui): 新增 useVbenForm 数组编辑器 VbenFormFieldArray 2026-05-31 15:03:55 +08:00
afe1 108d7ff335
chore: add commitlint config declaration (#7968)
* fix: catelog

* fix: system

* chore: sync upstream changes

* types: add commitlint config declaration
2026-05-28 15:50:47 +08:00
leo 1d6842fa69
build: change runtime config asset naming strategy for PWA compatibility (#7963)
replace query-based config url (_app.config.js?v=...)
with deterministic hashed filename (_app-config-v{version}-{hash}.js)
ensure service worker precache matches runtime injected asset
2026-05-28 12:53:51 +08:00
Saleri d6a9eaf9e9
fix: 修复 web-naive 表单页 Input 输入 _ 不显示的问题 (#7962) (#7965)
* fix(@vben/web-naive): 修复 naive input 输入 _ 不显示的问题 (#7962)

* fix(@vben/web-naive): 限制 input 字体修复作用域,避免全局影响
2026-05-28 12:49:48 +08:00
boisduval f7540c119b
fix: 修复 useVbenModal useVbenDrawer 传入参数失效的问题 (#7964)
- 把provide的key值修改为与inject一致的options
2026-05-28 12:49:23 +08:00
过冬 acf289381e
fix(@vben-core/popup-ui): modal 响应式适配,支持视口自适应 (#7951) 2026-05-25 13:27:17 +08:00
2904 changed files with 229025 additions and 19432 deletions

View File

@ -0,0 +1,3 @@
{
"singleQuote": true
}

View File

@ -0,0 +1,7 @@
---
'@vben/styles': patch
'@vben-core/form-ui': patch
'@vben/web-naive': patch
---
feat(@core/form-ui): 新增 useVbenForm 数组编辑器 VbenFormFieldArray

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -61,7 +61,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@ -89,6 +89,6 @@ jobs:
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
with:
category: '/language:${{matrix.language}}'

View File

@ -19,7 +19,7 @@ jobs:
steps:
# 关闭未活动的 Issues
- name: Close Inactive Issues
uses: actions/stale@v9
uses: actions/stale@v10
with:
days-before-stale: -1 # Issues and PR will never be flagged stale automatically.
stale-issue-label: needs-reproduction # Label that flags an issue as stale.

View File

@ -14,7 +14,7 @@ jobs:
if: github.repository == 'vbenjs/vue-vben-admin'
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
- uses: dessant/lock-threads@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
issue-inactive-days: '14'

View File

@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Validate PR title
uses: amannn/action-semantic-pull-request@v5
uses: amannn/action-semantic-pull-request@v6
with:
wip: true
subjectPattern: ^(?![A-Z]).+$

View File

@ -9,7 +9,7 @@ jobs:
if: github.repository == 'vbenjs/vue-vben-admin'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
- uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days'

View File

@ -1 +1 @@
22.22.0
24.16.0

View File

@ -9,7 +9,7 @@
## 🐶 新手必读
- nodejs >= v20.19.0(推荐 v22 / v24 && pnpm >= 10.32.1(强制使用 pnpm
- nodejs >= v22.18.0推荐v24 && pnpm >= 11.0.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>
@ -41,24 +41,24 @@
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.30 |
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 8.0.0 |
| [Vue](https://staging-cn.vuejs.org/) | vue框架 | 3.5.35 |
| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 8.0.10 |
| [Ant Design Vue](https://www.antdv.com/) | Ant Design Vue | 4.2.6 |
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.13.5 |
| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.14.1 |
| [Naive UI](https://www.naiveui.com/) | Naive UI | 2.44.1 |
| [TDesign](https://tdesign.tencent.com/) | TDesign | 1.18.5 |
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 超集 | 5.9.3 |
| [TDesign](https://tdesign.tencent.com/) | TDesign | 1.20.0 |
| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 超集 | 6.0.3 |
| [pinia](https://pinia.vuejs.org/) | Vue 存储库替代 vuex5 | 3.0.4 |
| [vueuse](https://vueuse.org/) | 常用工具集 | 14.2.1 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.3.0 |
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 5.0.3 |
| [Tailwind CSS](https://tailwindcss.com/) | 原子 CSS | 4.2.1 |
| [Iconify](https://iconify.design/) | 图标组件 | 5.0.0 |
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.449 |
| [vueuse](https://vueuse.org/) | 常用工具集 | 14.3.0 |
| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 11.4.4 |
| [vue-router](https://router.vuejs.org/) | Vue 路由 | 5.1.0 |
| [Tailwind CSS](https://tailwindcss.com/) | 原子 CSS | 4.3.0 |
| [Iconify](https://iconify.design/) | 图标组件 | 5.0.1 |
| [Iconify](https://icon-sets.iconify.design/) | 在线图标库 | 2.2.481 |
| [TinyMCE](https://www.tiny.cloud/) | 富文本编辑器 | 7.3.0 |
| [Echarts](https://echarts.apache.org/) | 图表库 | 6.0.0 |
| [axios](https://axios-http.com/) | http客户端 | 1.13.6 |
| [dayjs](https://day.js.org/) | 日期处理库 | 1.11.20 |
| [Echarts](https://echarts.apache.org/) | 图表库 | 6.1.0 |
| [axios](https://axios-http.com/) | http客户端 | 1.16.1 |
| [dayjs](https://day.js.org/) | 日期处理库 | 1.11.21 |
| [vee-validate](https://vee-validate.logaretm.com/) | 表单验证 | 4.15.1 |
| [zod](https://zod.dev/) | 数据验证 | 3.25.76 |
@ -272,3 +272,15 @@
![功能图](/.gitee/image/common/iot-feature.png)
![预览图](/.gitee/image/common/iot-preview.png)
### IM 即时通讯
演示地址Vue3 + Vben5<http://dashboard-vben.yudao.iocoder.cn>
使用文档:<https://doc.iocoder.cn/im-preview/>
![功能图](/.gitee/image/common/im-feature.png)
| 聊天界面 | 聊天管理 |
| --- | --- |
| ![聊天界面](/.gitee/image/common/im-preview-home.png) | ![聊天管理](/.gitee/image/common/im-preview-manager.png) |

View File

@ -20,7 +20,7 @@
"build:analyze": "pnpm vite build --mode analyze",
"dev": "pnpm vite --mode development",
"preview": "vite preview",
"typecheck": "vue-tsc --noEmit --skipLibCheck"
"typecheck": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vue-tsc --noEmit --skipLibCheck --incremental --tsBuildInfoFile node_modules/.cache/vue-tsc/tsconfig.tsbuildinfo"
},
"imports": {
"#/*": "./src/*"
@ -58,6 +58,7 @@
"diagram-js": "catalog:",
"fast-xml-parser": "catalog:",
"highlight.js": "catalog:",
"livekit-client": "catalog:",
"pinia": "catalog:",
"steady-xml": "catalog:",
"tinymce": "catalog:",

View File

@ -14,7 +14,7 @@ export namespace AiChatConversationApi {
temperature: number; // 温度参数
maxTokens: number; // 单条回复的最大 Token 数量
maxContexts: number; // 上下文的最大 Message 数量
createTime?: Date; // 创建时间
createTime: Date; // 创建时间
systemMessage?: string; // 角色设定
modelName?: string; // 模型名字
roleAvatar?: string; // 角色头像

View File

@ -34,15 +34,15 @@ export namespace AiImageApi {
prompt: string; // 提示词
modelId: number; // 模型
style: string; // 图像生成的风格
width: string; // 图片宽度
height: string; // 图片高度
width: number; // 图片宽度
height: number; // 图片高度
options: object; // 绘制参数Map<String, String>
}
export interface ImageMidjourneyImagineReqVO {
prompt: string; // 提示词
modelId: number; // 模型
base64Array?: string[]; // size不能为空
base64Array: string[]; // 参考图 base64 列表
width: string; // 图片宽度
height: string; // 图片高度
version: string; // 版本

View File

@ -12,7 +12,6 @@ export namespace BpmOALeaveApi {
startTime: number;
endTime: number;
createTime: Date;
startUserSelectAssignees?: Record<string, string[]>;
}
}
@ -21,11 +20,6 @@ export async function createLeave(data: BpmOALeaveApi.Leave) {
return requestClient.post('/bpm/oa/leave/create', data);
}
/** 更新请假申请 */
export async function updateLeave(data: BpmOALeaveApi.Leave) {
return requestClient.post('/bpm/oa/leave/update', data);
}
/** 获得请假申请 */
export async function getLeave(id: number) {
return requestClient.get<BpmOALeaveApi.Leave>(`/bpm/oa/leave/get?id=${id}`);

View File

@ -83,6 +83,7 @@ export namespace BpmProcessInstanceApi {
reason: string;
signPicUrl: string;
status: number;
attachments?: string[];
}
/** 抄送流程实例 */

View File

@ -11,15 +11,16 @@ export namespace CrmBusinessStatusApi {
deptNames?: string[];
creator?: string;
createTime?: Date;
statuses?: BusinessStatusType[];
statuses: BusinessStatusType[];
}
/** 商机状态信息 */
export interface BusinessStatusType {
id?: number;
name: string;
percent: number;
[x: string]: any;
percent?: number;
endStatus?: number;
key?: string;
}
}
@ -43,7 +44,7 @@ export const DEFAULT_STATUSES = [
name: '无效',
percent: 0,
},
];
] satisfies CrmBusinessStatusApi.BusinessStatusType[];
/** 查询商机状态组列表 */
export function getBusinessStatusPage(params: PageParam) {

View File

@ -12,6 +12,7 @@ export namespace CrmReceivableApi {
customerId?: number;
customerName?: string;
contractId?: number;
contractNo?: string;
contract?: Contract;
auditStatus: number;
processInstanceId: number;
@ -34,6 +35,11 @@ export namespace CrmReceivableApi {
no: string;
totalPrice: number;
}
export interface ReceivablePageParam extends PageParam {
contractId?: number;
customerId?: number;
}
}
/** 查询回款列表 */
@ -45,7 +51,9 @@ export function getReceivablePage(params: PageParam) {
}
/** 查询回款列表,基于指定客户 */
export function getReceivablePageByCustomer(params: PageParam) {
export function getReceivablePageByCustomer(
params: CrmReceivableApi.ReceivablePageParam,
) {
return requestClient.get<PageResult<CrmReceivableApi.Receivable>>(
'/crm/receivable/page-by-customer',
{ params },

View File

@ -29,6 +29,10 @@ export namespace CrmReceivablePlanApi {
returnTime: Date;
};
}
export interface PlanPageParam extends PageParam {
customerId?: number;
contractId?: number;
}
}
/** 查询回款计划列表 */

View File

@ -28,6 +28,7 @@ export namespace ErpPurchaseInApi {
export interface PurchaseInItem {
count?: number;
id?: number;
seq?: number; // 前端行号
orderItemId?: number;
productBarCode?: string;
productId?: number;

View File

@ -34,6 +34,7 @@ export namespace ErpPurchaseOrderApi {
/** 采购订单项信息 */
export interface PurchaseOrderItem {
id?: number; // 订单项编号
seq?: number; // 前端行号
orderId?: number; // 采购订单编号
productId?: number; // 产品编号
productName?: string; // 产品名称

View File

@ -11,6 +11,7 @@ export namespace ErpPurchaseReturnApi {
returnTime?: Date; // 退货时间
totalCount?: number; // 合计数量
totalPrice: number; // 合计金额,单位:元
refundPrice?: number; // 已退款金额,单位:元
discountPercent?: number; // 折扣百分比
discountPrice?: number; // 折扣金额
status?: number; // 状态
@ -24,6 +25,7 @@ export namespace ErpPurchaseReturnApi {
export interface PurchaseReturnItem {
count?: number;
id?: number;
seq?: number; // 前端行号
orderItemId?: number;
productBarCode?: string;
productId?: number;

View File

@ -28,6 +28,7 @@ export namespace ErpSaleOrderApi {
/** 销售订单项 */
export interface SaleOrderItem {
id?: number; // 订单项编号
seq?: number; // 前端行号
orderId?: number; // 采购订单编号
productId?: number; // 产品编号
productName?: string; // 产品名称

View File

@ -12,6 +12,7 @@ export namespace ErpSaleOutApi {
outTime?: Date; // 出库时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
receiptPrice?: number; // 已收款金额,单位:元
status?: number; // 状态
remark?: string; // 备注
discountPercent?: number; // 折扣百分比
@ -28,6 +29,7 @@ export namespace ErpSaleOutApi {
export interface SaleOutItem {
count?: number;
id?: number;
seq?: number; // 前端行号
orderItemId?: number;
productBarCode?: string;
productId?: number;

View File

@ -11,6 +11,7 @@ export namespace ErpSaleReturnApi {
returnTime?: Date; // 退货时间
totalCount?: number; // 合计数量
totalPrice?: number; // 合计金额,单位:元
refundPrice?: number; // 已退款金额,单位:元
status?: number; // 状态
remark?: string; // 备注
discountPercent?: number; // 折扣百分比
@ -27,6 +28,7 @@ export namespace ErpSaleReturnApi {
export interface SaleReturnItem {
count?: number;
id?: number;
seq?: number; // 前端行号
orderItemId?: number;
productBarCode?: string;
productId?: number;

View File

@ -21,6 +21,7 @@ export namespace ErpStockCheckApi {
/** 库存盘点项 */
export interface StockCheckItem {
id?: number; // 编号
seq?: number; // 前端行号
warehouseId?: number; // 仓库编号
productId?: number; // 产品编号
productName?: string; // 产品名称

View File

@ -23,15 +23,16 @@ export namespace ErpStockInApi {
/** 其它入库单产品信息 */
export interface StockInItem {
id?: number; // 编号
warehouseId: number; // 仓库编号
productId: number; // 产品编号
seq?: number; // 前端行号
warehouseId?: number; // 仓库编号
productId?: number; // 产品编号
productName?: string; // 产品名称
productUnitId?: number; // 产品单位编号
productUnitName?: string; // 产品单位名称
productBarCode?: string; // 产品条码
count: number; // 数量
productPrice: number; // 产品单价
totalPrice: number; // 总价
count?: number; // 数量
productPrice?: number; // 产品单价
totalPrice?: number; // 总价
stockCount?: number; // 库存数量
remark?: string; // 备注
}

View File

@ -26,6 +26,7 @@ export namespace ErpStockMoveApi {
count: number; // 数量
fromWarehouseId?: number; // 来源仓库ID
id?: number; // ID
seq?: number; // 前端行号
productBarCode: string; // 产品条形码
productId?: number; // 产品ID
productName?: string; // 产品名称

View File

@ -20,6 +20,7 @@ export namespace ErpStockOutApi {
/** 其它出库单产品信息 */
export interface StockOutItem {
id?: number; // 编号
seq?: number; // 前端行号
warehouseId?: number; // 仓库编号
productId?: number; // 产品编号
productName?: string; // 产品名称

View File

@ -0,0 +1,24 @@
import { requestClient } from '#/api/request';
export namespace ImChannelMaterialApi {
/** 用户端能看到的频道素材详情 */
export interface Material {
id: number;
channelId: number;
type: number;
title: string;
coverUrl?: string;
summary?: string;
content?: string;
url?: string;
}
}
/** 获取频道素材详情;用于客户端点击图文卡片渲染详情页 */
export function getChannelMaterial(id: number) {
return requestClient.get<ImChannelMaterialApi.Material>(
'/im/channel/material/get',
{ params: { id } },
);
}

View File

@ -0,0 +1,25 @@
import { requestClient } from '#/api/request';
export namespace ImConversationReadApi {
/** IM 会话读位置 Response VO */
export interface ConversationReadRespVO {
id: number; // 读位置编号(增量拉取游标用)
conversationType: number; // 会话类型,参见 ImConversationType
targetId: number; // 会话目标编号
messageId: number; // 最大已读消息编号
updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用)
}
}
/** 增量拉取当前用户的会话读位置(重连 / 离线补偿) */
export function pullMyConversationReadList(params: {
lastId?: number;
lastUpdateTime?: number;
limit: number;
}) {
return requestClient.get<ImConversationReadApi.ConversationReadRespVO[]>(
'/im/conversation-read/pull',
{ params },
);
}

View File

@ -0,0 +1,26 @@
import { requestClient } from '#/api/request';
export namespace ImFacePackApi {
/** 用户端表情包项(精简版) */
export interface FacePackUserItem {
id: number;
url: string;
name?: string;
width: number;
height: number;
}
/** 用户端表情包 + 嵌套 items */
export interface FacePackUser {
id: number;
name: string;
icon?: string;
items: FacePackUserItem[];
}
}
/** 拉取所有启用的系统表情包(含表情列表) */
export function getFacePackList() {
return requestClient.get<ImFacePackApi.FacePackUser[]>('/im/face-pack/list');
}

View File

@ -0,0 +1,38 @@
import { requestClient } from '#/api/request';
export namespace ImFaceUserItemApi {
/** 个人表情 */
export interface FaceUserItem {
id: number;
url: string;
name?: string;
width: number;
height: number;
}
/** 添加个人表情请求 */
export interface FaceUserItemSaveReqVO {
url: string;
name?: string;
width: number;
height: number;
}
}
/** 获取我的个人表情列表 */
export function getFaceUserItemList() {
return requestClient.get<ImFaceUserItemApi.FaceUserItem[]>('/im/face-user-item/list');
}
/** 添加个人表情 */
export function createFaceUserItem(data: ImFaceUserItemApi.FaceUserItemSaveReqVO) {
return requestClient.post<number>('/im/face-user-item/create', data);
}
/** 删除个人表情 */
export function deleteFaceUserItem(id: number) {
return requestClient.delete<boolean>('/im/face-user-item/delete', {
params: { id },
});
}

View File

@ -0,0 +1,78 @@
import { requestClient } from '#/api/request';
export namespace ImFriendApi {
/** IM 好友 Response VO */
export interface FriendRespVO {
id: number; // 关系记录编号
friendUserId: number; // 好友的用户编号
silent?: boolean; // 是否免打扰
displayName?: string; // 好友展示备注(仅自己可见)
displayNamePinyin?: string; // 备注的拼音(小写无空格,前端按首字母分桶 / 拼音搜索)
addSource?: number; // 添加来源;参见 ImFriendAddSourceEnum
pinned?: boolean; // 是否置顶联系人
blocked?: boolean; // 是否拉黑
status?: number; // 好友状态0=正常1=已删除)
addTime?: string; // 添加好友时间
deleteTime?: string; // 删除好友时间
updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用)
nickname?: string; // 好友昵称
nicknamePinyin?: string; // 昵称的拼音(小写无空格,前端按首字母分桶 / 拼音搜索)
avatar?: string; // 好友头像
}
/** IM 好友更新 Request VO */
export interface FriendUpdateReqVO {
friendUserId: number; // 好友的用户编号
silent?: boolean; // 是否免打扰
displayName?: string; // 好友展示备注
pinned?: boolean; // 是否置顶联系人
}
}
/** 获得当前登录用户的好友列表 */
export function getMyFriendList() {
return requestClient.get<ImFriendApi.FriendRespVO[]>('/im/friend/list');
}
/** 增量拉取当前用户的好友关系(重连 / 离线补偿) */
export function pullMyFriendList(params: {
lastId?: number;
lastUpdateTime?: number;
limit: number;
}) {
return requestClient.get<ImFriendApi.FriendRespVO[]>('/im/friend/pull', { params });
}
/** 获得好友详情 */
export function getFriend(friendUserId: number | string) {
return requestClient.get<ImFriendApi.FriendRespVO>('/im/friend/get', {
params: { friendUserId },
});
}
/** 删除好友(单向软删除) */
export function deleteFriend(friendUserId: number | string, clear: boolean) {
return requestClient.delete<boolean>('/im/friend/delete', {
params: { friendUserId, clear },
});
}
/** 更新好友信息(备注 / 免打扰 / 联系人置顶) */
export function updateFriend(data: ImFriendApi.FriendUpdateReqVO) {
return requestClient.put<boolean>('/im/friend/update', data);
}
/** 拉黑好友(必须先是好友;单边屏蔽对方私聊消息) */
export function blockFriend(friendUserId: number | string) {
return requestClient.put<boolean>('/im/friend/block', undefined, {
params: { friendUserId },
});
}
/** 移出黑名单 */
export function unblockFriend(friendUserId: number | string) {
return requestClient.put<boolean>('/im/friend/unblock', undefined, {
params: { friendUserId },
});
}

View File

@ -0,0 +1,84 @@
import { requestClient } from '#/api/request';
export namespace ImFriendRequestApi {
/** IM 好友申请 Response VO */
export interface FriendRequestRespVO {
id: number; // 申请编号
fromUserId: number; // 发起方用户编号
toUserId: number; // 接收方用户编号
handleResult: number; // 处理结果0=未处理1=同意2=拒绝
applyContent?: string; // 申请理由
handleContent?: string; // 处理理由(接收方拒绝时可选填)
addSource?: number; // 添加来源;参见 ImFriendAddSourceEnum
handleTime?: string; // 处理时间
createTime: string; // 申请创建时间
updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用)
fromNickname?: string; // 发起方昵称
fromAvatar?: string; // 发起方头像
toNickname?: string; // 接收方昵称
toAvatar?: string; // 接收方头像
}
/** IM 好友申请发起 Request VO */
export interface FriendRequestApplyReqVO {
toUserId: number; // 接收方用户编号
applyContent?: string; // 申请理由
displayName?: string; // 对接收方的备注(仅自己可见)
addSource?: number; // 添加来源
}
}
/** 发起好友申请 */
export function applyFriendRequest(data: ImFriendRequestApi.FriendRequestApplyReqVO) {
return requestClient.post<null | number>('/im/friend-request/apply', data);
}
/** 同意好友申请 */
export function agreeFriendRequest(id: number | string) {
return requestClient.put<boolean>('/im/friend-request/agree', undefined, {
params: { id },
});
}
/** 拒绝好友申请 */
export function refuseFriendRequest(
id: number | string,
handleContent?: string,
) {
return requestClient.put<boolean>('/im/friend-request/refuse', undefined, {
params: { id, handleContent },
});
}
/** 查询「我相关」的好友申请列表(游标分页:传 maxId 加载更多) */
export function getMyFriendRequestList(limit: number, maxId?: number) {
const params: Record<string, number> = { limit };
if (maxId != null) {
params.maxId = maxId;
}
return requestClient.get<ImFriendRequestApi.FriendRequestRespVO[]>(
'/im/friend-request/list',
{ params },
);
}
/** 增量拉取「我相关」的好友申请变更(重连 / 离线补偿) */
export function pullMyFriendRequestList(params: {
lastId?: number;
lastUpdateTime?: number;
limit: number;
}) {
return requestClient.get<ImFriendRequestApi.FriendRequestRespVO[]>(
'/im/friend-request/pull',
{ params },
);
}
/** 按 id 单查「我相关」的申请记录带越权过滤WebSocket 通知到达后用) */
export function getMyFriendRequest(id: number) {
return requestClient.get<ImFriendRequestApi.FriendRequestRespVO | null>(
'/im/friend-request/get',
{ params: { id } },
);
}

View File

@ -0,0 +1,146 @@
import type { ImGroupMessageApi } from '#/api/im/message/group';
import { requestClient } from '#/api/request';
export namespace ImGroupApi {
/** 群 Response VO */
export interface GroupRespVO {
id: number; // 编号
name: string; // 群名称
ownerUserId: number; // 群主用户编号
avatar?: string; // 群头像
notice?: string; // 群公告
banned?: boolean; // 是否封禁
mutedAll?: boolean; // 是否全群禁言
joinApproval?: boolean; // 进群是否需群主 / 管理员审批
bannedTime?: string; // 封禁时间
status: number; // 群状态0=正常1=已解散)
dissolvedTime?: string; // 解散时间
createTime?: string; // 创建时间
pinnedMessages?: ImGroupMessageApi.GroupMessageRespVO[]; // 群置顶消息列表(后端关联回填,仅当登录用户是群成员时非空)
joinStatus?: number; // 当前登录用户在该群的成员状态(参见 CommonStatusEnum0 在群 / 1 已退群);历史退群群仍返回,供展示离线消息的群名 / 头像
groupRemark?: string; // 当前登录用户对该群的备注
silent?: boolean; // 当前登录用户是否免打扰
}
/** 群消息置顶 / 取消置顶 Request VO */
export interface GroupMessagePinReqVO {
id: number; // 群编号
messageId: number; // 消息编号
}
/** 群创建 Request VO */
export interface GroupCreateReqVO {
name: string; // 群名称
memberUserIds?: number[]; // 初始成员用户编号列表(建群同时邀请的好友,不含创建者自己)
joinApproval?: boolean; // 进群是否需审批;不传默认 false 自由进群
}
/** 群更新 Request VO */
export interface GroupUpdateReqVO {
id: number; // 群编号
name?: string; // 群名称
avatar?: string; // 群头像
notice?: string; // 群公告
joinApproval?: boolean; // 进群是否需审批
}
/** 添加 / 撤销群管理员 Request VO */
export interface GroupAdminReqVO {
id: number; // 群编号
userIds: number[]; // 目标用户编号列表
}
/** 群主转让 Request VO */
export interface GroupTransferOwnerReqVO {
id: number; // 群编号
newOwnerUserId: number; // 新群主用户编号
}
/** 全群禁言 / 取消 Request VO */
export interface GroupMuteAllReqVO {
id: number; // 群编号
mutedAll: boolean; // 是否全群禁言
}
/** 成员禁言 Request VO */
export interface GroupMuteMemberReqVO {
id: number; // 群编号
userId: number; // 被禁言的用户编号
mutedSeconds: number; // 禁言时长0 表示永久禁言
}
/** 取消成员禁言 Request VO */
export interface GroupCancelMuteMemberReqVO {
id: number; // 群编号
userId: number; // 被取消禁言的用户编号
}
}
/** 获得当前登录用户的群列表 */
export function getMyGroupList() {
return requestClient.get<ImGroupApi.GroupRespVO[]>('/im/group/list');
}
/** 获得群详情 */
export function getGroup(id: number | string) {
return requestClient.get<ImGroupApi.GroupRespVO>('/im/group/get', { params: { id } });
}
/** 创建群 */
export function createGroup(data: ImGroupApi.GroupCreateReqVO) {
return requestClient.post<ImGroupApi.GroupRespVO>('/im/group/create', data);
}
/** 更新群 */
export function updateGroup(data: ImGroupApi.GroupUpdateReqVO) {
return requestClient.put<ImGroupApi.GroupRespVO>('/im/group/update', data);
}
/** 解散群 */
export function dissolveGroup(id: number | string) {
return requestClient.delete<boolean>('/im/group/dissolve', {
params: { id },
});
}
/** 添加群管理员(仅群主可调) */
export function addGroupAdmin(data: ImGroupApi.GroupAdminReqVO) {
return requestClient.put<boolean>('/im/group/add-admin', data);
}
/** 撤销群管理员(仅群主可调) */
export function removeGroupAdmin(data: ImGroupApi.GroupAdminReqVO) {
return requestClient.put<boolean>('/im/group/remove-admin', data);
}
/** 转让群主(仅老群主可调;旧群主转让后降为普通成员) */
export function transferGroupOwner(data: ImGroupApi.GroupTransferOwnerReqVO) {
return requestClient.put<boolean>('/im/group/transfer-owner', data);
}
/** 置顶群消息(仅群主 / 管理员可调) */
export function pinGroupMessage(data: ImGroupApi.GroupMessagePinReqVO) {
return requestClient.put<boolean>('/im/group/pin-message', data);
}
/** 取消置顶群消息(仅群主 / 管理员可调) */
export function unpinGroupMessage(data: ImGroupApi.GroupMessagePinReqVO) {
return requestClient.put<boolean>('/im/group/unpin-message', data);
}
/** 全群禁言 / 取消(仅群主 / 管理员可调) */
export function muteAll(data: ImGroupApi.GroupMuteAllReqVO) {
return requestClient.put<boolean>('/im/group/mute-all', data);
}
/** 禁言成员 */
export function muteMember(data: ImGroupApi.GroupMuteMemberReqVO) {
return requestClient.put<boolean>('/im/group/mute-member', data);
}
/** 取消成员禁言 */
export function cancelMuteMember(data: ImGroupApi.GroupCancelMuteMemberReqVO) {
return requestClient.put<boolean>('/im/group/cancel-mute-member', data);
}

View File

@ -0,0 +1,78 @@
import { requestClient } from '#/api/request';
export namespace ImGroupMemberApi {
/** 群成员 Response VO */
export interface GroupMemberRespVO {
id: number; // 编号
groupId: number; // 群编号
userId: number; // 用户编号
displayUserName?: string; // 组内显示名(群主设置的备注)
groupRemark?: string; // 群备注(当前用户对群的备注)
silent?: boolean; // 是否免打扰
status?: number; // 成员状态0=在群1=退群)
role?: number; // 成员角色,参见 ImGroupMemberRole 枚举
joinTime?: string; // 入群时间
quitTime?: string; // 退群时间
muteEndTime?: string; // 禁言到期时间
createTime?: string; // 创建时间
nickname?: string; // 用户昵称
avatar?: string; // 用户头像
}
/** 群成员邀请 Request VO */
export interface GroupMemberInviteReqVO {
groupId: number; // 群编号
memberUserIds: number[]; // 被邀请的用户编号列表
}
/** 群成员移除 Request VO */
export interface GroupMemberRemoveReqVO {
groupId: number; // 群编号
memberUserIds: number[]; // 被移除的用户编号列表
}
/** 群成员更新 Request VO */
export interface GroupMemberUpdateReqVO {
groupId: number; // 群编号
displayUserName?: string; // 群内昵称
groupRemark?: string; // 群备注
silent?: boolean; // 是否免打扰
}
}
/** 邀请用户加入群 */
export function inviteGroupMember(data: ImGroupMemberApi.GroupMemberInviteReqVO) {
return requestClient.post<boolean>('/im/group/invite', data);
}
/** 退出群 */
export function quitGroup(groupId: number | string) {
return requestClient.delete<boolean>('/im/group/quit', {
params: { groupId },
});
}
/** 移除群成员 */
export function removeGroupMember(data: ImGroupMemberApi.GroupMemberRemoveReqVO) {
return requestClient.delete<boolean>('/im/group/kicking', { data });
}
/** 获得群成员详情 */
export function getGroupMember(groupId: number, userId: number) {
return requestClient.get<ImGroupMemberApi.GroupMemberRespVO>('/im/group-member/get', {
params: { groupId, userId },
});
}
/** 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像) */
export function getGroupMemberList(groupId: number | string) {
return requestClient.get<ImGroupMemberApi.GroupMemberRespVO[]>('/im/group-member/list', {
params: { groupId },
});
}
/** 更新群成员 */
export function updateGroupMember(data: ImGroupMemberApi.GroupMemberUpdateReqVO) {
return requestClient.put<boolean>('/im/group-member/update', data);
}

View File

@ -0,0 +1,90 @@
import { requestClient } from '#/api/request';
export namespace ImGroupRequestApi {
/** IM 加群申请 Response VO */
export interface GroupRequestRespVO {
id: number; // 申请编号
groupId: number; // 群编号
userId: number; // 申请人 / 被邀请人用户编号
inviterUserId?: number; // 邀请人NULL 表示用户主动申请
handleResult: number; // 处理结果0=未处理1=同意2=拒绝
applyContent?: string; // 申请理由
handleContent?: string; // 处理理由(拒绝时可选填)
handleUserId?: number; // 处理人用户编号
addSource?: number; // 加入来源;参见 ImGroupAddSourceEnum
handleTime?: string; // 处理时间
createTime: string; // 申请创建时间
updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用)
userNickname?: string; // 申请人 / 被邀请人昵称
userAvatar?: string; // 申请人 / 被邀请人头像
inviterNickname?: string; // 邀请人昵称
inviterAvatar?: string; // 邀请人头像
groupName?: string; // 群名称
groupAvatar?: string; // 群头像
}
/** IM 加群申请发起 Request VO */
export interface GroupRequestApplyReqVO {
groupId: number; // 群编号
applyContent?: string; // 申请理由
addSource?: number; // 加入来源
}
}
/** 申请加群 */
export function applyJoinGroup(data: ImGroupRequestApi.GroupRequestApplyReqVO) {
return requestClient.post<null | number>('/im/group-request/apply', data);
}
/** 同意加群申请(群主或管理员) */
export function agreeGroupRequest(id: number | string) {
return requestClient.put<boolean>('/im/group-request/agree', undefined, {
params: { id },
});
}
/** 拒绝加群申请(群主或管理员) */
export function refuseGroupRequest(
id: number | string,
handleContent?: string,
) {
return requestClient.put<boolean>('/im/group-request/refuse', undefined, {
params: { id, handleContent },
});
}
/** 查询「我管理的所有群」下的未处理加群申请列表(不分页);前端 store 据此派生横幅红点 + Drawer 列表 */
export function getUnhandledRequestList() {
return requestClient.get<ImGroupRequestApi.GroupRequestRespVO[]>(
'/im/group-request/unhandled-list',
);
}
/** 查询指定群下的全部加群申请(含已处理);仅群主 / 管理员可查 */
export function getGroupRequestListByGroupId(groupId: number) {
return requestClient.get<ImGroupRequestApi.GroupRequestRespVO[]>(
'/im/group-request/list-by-group',
{ params: { groupId } },
);
}
/** 按 id 单查申请记录带越权过滤WebSocket 通知到达后用) */
export function getMyGroupRequest(id: number) {
return requestClient.get<ImGroupRequestApi.GroupRequestRespVO | null>(
'/im/group-request/get',
{ params: { id } },
);
}
/** 增量拉取我管理的所有群下加群申请变更(重连 / 离线补偿) */
export function pullMyGroupRequestList(params: {
lastId?: number;
lastUpdateTime?: number;
limit: number;
}) {
return requestClient.get<ImGroupRequestApi.GroupRequestRespVO[]>(
'/im/group-request/pull',
{ params },
);
}

View File

@ -0,0 +1,56 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerChannelApi {
/** 频道 */
export interface Channel {
id: number;
code: string;
name: string;
avatar?: string;
sort: number;
status: number;
createTime?: Date;
}
}
/** 获得频道分页 */
export function getManagerChannelPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerChannelApi.Channel>>(
'/im/manager/channel/page',
{ params },
);
}
/** 获得频道详情 */
export function getManagerChannel(id: number) {
return requestClient.get<ImManagerChannelApi.Channel>('/im/manager/channel/get', {
params: { id },
});
}
/** 新增频道 */
export function createManagerChannel(data: ImManagerChannelApi.Channel) {
return requestClient.post<number>('/im/manager/channel/create', data);
}
/** 修改频道 */
export function updateManagerChannel(data: ImManagerChannelApi.Channel) {
return requestClient.put<boolean>('/im/manager/channel/update', data);
}
/** 删除频道 */
export function deleteManagerChannel(id: number) {
return requestClient.delete<boolean>('/im/manager/channel/delete', {
params: { id },
});
}
/** 获得启用的频道精简列表(表单选择用) */
export function getSimpleChannelList() {
return requestClient.get<ImManagerChannelApi.Channel[]>(
'/im/manager/channel/simple-list',
);
}

View File

@ -0,0 +1,68 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerChannelMaterialApi {
/** 频道素材 */
export interface Material {
id: number;
channelId: number;
channelName?: string;
type: number;
title: string;
coverUrl?: string;
summary?: string;
content?: string;
url?: string;
createTime?: Date;
}
}
/** 获得素材分页 */
export function getManagerChannelMaterialPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerChannelMaterialApi.Material>>(
'/im/manager/channel-material/page',
{ params },
);
}
/** 获得指定频道下的素材精简列表 */
export function getSimpleManagerChannelMaterialList(channelId: number) {
return requestClient.get<ImManagerChannelMaterialApi.Material[]>(
'/im/manager/channel-material/simple-list',
{ params: { channelId } },
);
}
/** 获得素材详情 */
export function getManagerChannelMaterial(id: number) {
return requestClient.get<ImManagerChannelMaterialApi.Material>(
'/im/manager/channel-material/get',
{ params: { id } },
);
}
/** 新增素材 */
export function createManagerChannelMaterial(
data: ImManagerChannelMaterialApi.Material,
) {
return requestClient.post<number>('/im/manager/channel-material/create', data);
}
/** 修改素材 */
export function updateManagerChannelMaterial(
data: ImManagerChannelMaterialApi.Material,
) {
return requestClient.put<boolean>(
'/im/manager/channel-material/update',
data,
);
}
/** 删除素材 */
export function deleteManagerChannelMaterial(id: number) {
return requestClient.delete<boolean>('/im/manager/channel-material/delete', {
params: { id },
});
}

View File

@ -0,0 +1,48 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerChannelMessageApi {
/** 频道消息 */
export interface ChannelMessage {
id: number;
channelId: number;
channelName?: string;
materialId: number;
materialTitle?: string;
materialCoverUrl?: string;
type: number;
content?: string;
receiverUserIds?: number[];
sendTime?: Date;
}
/** 频道消息发送请求 */
export interface ChannelMessageSendReqVO {
materialId: number;
receiverUserIds?: number[];
}
}
/** 立即推送频道消息 */
export function sendManagerChannelMessage(
data: ImManagerChannelMessageApi.ChannelMessageSendReqVO,
) {
return requestClient.post<number>('/im/manager/channel-message/send', data);
}
/** 删除频道消息 */
export function deleteManagerChannelMessage(id: number) {
return requestClient.delete<boolean>('/im/manager/channel-message/delete', {
params: { id },
});
}
/** 获得频道消息分页 */
export function getManagerChannelMessagePage(params: PageParam) {
return requestClient.get<PageResult<ImManagerChannelMessageApi.ChannelMessage>>(
'/im/manager/channel-message/page',
{ params },
);
}

View File

@ -0,0 +1,63 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerFacePackItemApi {
/** 表情项 */
export interface FacePackItem {
id: number;
packId: number;
url: string;
name?: string;
width: number;
height: number;
sort: number;
status: number;
createTime?: Date;
}
}
/** 获得表情分页 */
export function getManagerFacePackItemPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerFacePackItemApi.FacePackItem>>(
'/im/manager/face-pack-item/page',
{ params },
);
}
/** 获得表情详情 */
export function getManagerFacePackItem(id: number) {
return requestClient.get<ImManagerFacePackItemApi.FacePackItem>(
'/im/manager/face-pack-item/get',
{ params: { id } },
);
}
/** 新增表情 */
export function createManagerFacePackItem(data: ImManagerFacePackItemApi.FacePackItem) {
return requestClient.post<number>('/im/manager/face-pack-item/create', data);
}
/** 修改表情 */
export function updateManagerFacePackItem(data: ImManagerFacePackItemApi.FacePackItem) {
return requestClient.put<boolean>(
'/im/manager/face-pack-item/update',
data,
);
}
/** 删除表情 */
export function deleteManagerFacePackItem(id: number) {
return requestClient.delete<boolean>('/im/manager/face-pack-item/delete', {
params: { id },
});
}
/** 批量删除表情 */
export function deleteManagerFacePackItemList(ids: number[]) {
return requestClient.delete<boolean>(
'/im/manager/face-pack-item/delete-list',
{ params: { ids: ids.join(',') } },
);
}

View File

@ -0,0 +1,55 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerFacePackApi {
/** 表情包 */
export interface FacePack {
id: number;
name: string;
icon?: string;
sort: number;
status: number;
createTime?: Date;
}
}
/** 获得表情包分页 */
export function getManagerFacePackPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerFacePackApi.FacePack>>(
'/im/manager/face-pack/page',
{ params },
);
}
/** 获得表情包详情 */
export function getManagerFacePack(id: number) {
return requestClient.get<ImManagerFacePackApi.FacePack>('/im/manager/face-pack/get', {
params: { id },
});
}
/** 新增表情包 */
export function createManagerFacePack(data: ImManagerFacePackApi.FacePack) {
return requestClient.post<number>('/im/manager/face-pack/create', data);
}
/** 修改表情包 */
export function updateManagerFacePack(data: ImManagerFacePackApi.FacePack) {
return requestClient.put<boolean>('/im/manager/face-pack/update', data);
}
/** 删除表情包 */
export function deleteManagerFacePack(id: number) {
return requestClient.delete<boolean>('/im/manager/face-pack/delete', {
params: { id },
});
}
/** 批量删除表情包 */
export function deleteManagerFacePackList(ids: number[]) {
return requestClient.delete<boolean>('/im/manager/face-pack/delete-list', {
params: { ids: ids.join(',') },
});
}

View File

@ -0,0 +1,33 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerFaceUserItemApi {
/** 用户表情 */
export interface FaceUserItem {
id: number;
userId: number;
userNickname?: string;
url: string;
name?: string;
width?: number;
height?: number;
createTime?: Date;
}
}
/** 获得用户表情分页 */
export function getManagerFaceUserItemPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerFaceUserItemApi.FaceUserItem>>(
'/im/manager/face-user-item/page',
{ params },
);
}
/** 删除用户表情 */
export function deleteManagerFaceUserItem(id: number) {
return requestClient.delete<boolean>('/im/manager/face-user-item/delete', {
params: { id },
});
}

View File

@ -0,0 +1,32 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerFriendApi {
/** 好友关系 */
export interface Friend {
id: number;
userId: number;
userNickname?: string;
friendUserId: number;
friendNickname?: string;
displayName?: string;
addSource?: number;
silent: boolean;
pinned: boolean;
blocked: boolean;
status: number;
addTime?: Date;
deleteTime?: Date;
createTime: Date;
}
}
/** 获得好友关系分页 */
export function getManagerFriendPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerFriendApi.Friend>>(
'/im/manager/friend/page',
{ params },
);
}

View File

@ -0,0 +1,30 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerFriendRequestApi {
/** 好友申请 */
export interface FriendRequest {
id: number;
fromUserId: number;
fromNickname?: string;
toUserId: number;
toNickname?: string;
applyContent?: string;
displayName?: string;
addSource?: number;
handleResult: number;
handleContent?: string;
handleTime?: Date;
createTime: Date;
}
}
/** 获得好友申请分页 */
export function getManagerFriendRequestPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerFriendRequestApi.FriendRequest>>(
'/im/manager/friend-request/page',
{ params },
);
}

View File

@ -0,0 +1,87 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerGroupApi {
/** 群 */
export interface Group {
id: number;
name: string;
avatar?: string;
notice?: string;
ownerUserId: number;
ownerNickname?: string;
memberCount?: number;
status: number;
banned: boolean;
mutedAll?: boolean; // 是否全群禁言
bannedReason?: string;
bannedTime?: Date;
dissolvedTime?: Date;
createTime: Date;
}
/** 群成员 */
export interface GroupMember {
userId: number;
nickname?: string;
avatar?: string;
displayUserName?: string;
groupRemark?: string;
silent?: boolean;
status: number;
role?: number; // 成员角色,参见 ImGroupMemberRole 枚举
joinTime?: Date;
quitTime?: Date;
muteEndTime?: Date; // 禁言到期时间
}
/** 群封禁请求 */
export interface GroupBanReqVO {
id: number;
reason: string;
}
}
/** 获得群分页 */
export function getManagerGroupPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerGroupApi.Group>>(
'/im/manager/group/page',
{ params },
);
}
/** 获得群详情 */
export function getManagerGroup(id: number) {
return requestClient.get<ImManagerGroupApi.Group>('/im/manager/group/get', {
params: { id },
});
}
/** 封禁群 */
export function banManagerGroup(data: ImManagerGroupApi.GroupBanReqVO) {
return requestClient.put<boolean>('/im/manager/group/ban', data);
}
/** 解封群 */
export function unbanManagerGroup(id: number) {
return requestClient.put<boolean>('/im/manager/group/unban', undefined, {
params: { id },
});
}
/** 解散群 */
export function dissolveManagerGroup(id: number) {
return requestClient.delete<boolean>('/im/manager/group/dissolve', {
params: { id },
});
}
/** 获得群成员列表(含已退群成员,由前端按需过滤) */
export function getManagerGroupMemberList(groupId: number) {
return requestClient.get<ImManagerGroupApi.GroupMember[]>(
'/im/manager/group/member/list',
{ params: { groupId } },
);
}

View File

@ -0,0 +1,33 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerGroupRequestApi {
/** 加群申请 */
export interface GroupRequest {
id: number;
groupId: number;
groupName?: string;
userId: number;
userNickname?: string;
inviterUserId?: number;
inviterNickname?: string;
applyContent?: string;
addSource?: number;
handleResult: number;
handleUserId?: number;
handleNickname?: string;
handleContent?: string;
handleTime?: Date;
createTime: Date;
}
}
/** 获得加群申请分页 */
export function getManagerGroupRequestPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerGroupRequestApi.GroupRequest>>(
'/im/manager/group-request/page',
{ params },
);
}

View File

@ -0,0 +1,40 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerGroupMessageApi {
/** 群聊消息 */
export interface GroupMessage {
id: number;
clientMessageId?: string;
groupId: number;
groupName?: string;
senderId: number;
senderNickname?: string;
type: number;
content: string;
status: number;
atUserIds?: number[];
atUserNicknames?: (null | string)[];
receiptStatus: number;
sendTime: Date;
createTime: Date;
}
}
/** 获得群聊消息分页 */
export function getManagerGroupMessagePage(params: PageParam) {
return requestClient.get<PageResult<ImManagerGroupMessageApi.GroupMessage>>(
'/im/manager/message/group/page',
{ params },
);
}
/** 获得群聊消息详情 */
export function getManagerGroupMessage(id: number) {
return requestClient.get<ImManagerGroupMessageApi.GroupMessage>(
'/im/manager/message/group/get',
{ params: { id } },
);
}

View File

@ -0,0 +1,38 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerPrivateMessageApi {
/** 私聊消息 */
export interface PrivateMessage {
id: number;
clientMessageId?: string;
senderId: number;
senderNickname?: string;
receiverId: number;
receiverNickname?: string;
type: number;
content: string;
status: number;
receiptStatus?: number;
sendTime: Date;
createTime: Date;
}
}
/** 获得私聊消息分页 */
export function getManagerPrivateMessagePage(params: PageParam) {
return requestClient.get<PageResult<ImManagerPrivateMessageApi.PrivateMessage>>(
'/im/manager/message/private/page',
{ params },
);
}
/** 获得私聊消息详情 */
export function getManagerPrivateMessage(id: number) {
return requestClient.get<ImManagerPrivateMessageApi.PrivateMessage>(
'/im/manager/message/private/get',
{ params: { id } },
);
}

View File

@ -0,0 +1,53 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerRtcApi {
/** RTC 通话 */
export interface RtcCall {
id: number;
room: string;
conversationType: number;
mediaType: number;
inviterUserId: number;
inviterNickname?: string;
groupId?: number;
groupName?: string;
status: number;
endReason?: number;
startTime: Date;
acceptTime?: Date;
endTime?: Date;
createTime: Date;
}
/** RTC 通话参与者 */
export interface RtcParticipant {
id: number;
callId: number;
userId: number;
userNickname?: string;
role: number;
status: number;
inviteTime: Date;
acceptTime?: Date;
leaveTime?: Date;
}
}
/** 获得通话记录分页 */
export function getManagerRtcCallPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerRtcApi.RtcCall>>(
'/im/manager/rtc/page',
{ params },
);
}
/** 获得通话参与者列表 */
export function getManagerRtcCallParticipantList(id: number) {
return requestClient.get<ImManagerRtcApi.RtcParticipant[]>(
'/im/manager/rtc/participant-list',
{ params: { id } },
);
}

View File

@ -0,0 +1,60 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace ImManagerSensitiveWordApi {
/** 敏感词 */
export interface SensitiveWord {
id: number;
word: string;
status: number;
creator?: string;
creatorName?: string;
createTime?: Date;
}
}
/** 获得敏感词分页 */
export function getManagerSensitiveWordPage(params: PageParam) {
return requestClient.get<PageResult<ImManagerSensitiveWordApi.SensitiveWord>>(
'/im/manager/sensitive-word/page',
{ params },
);
}
/** 获得敏感词详情 */
export function getManagerSensitiveWord(id: number) {
return requestClient.get<ImManagerSensitiveWordApi.SensitiveWord>(
'/im/manager/sensitive-word/get',
{ params: { id } },
);
}
/** 新增敏感词 */
export function createManagerSensitiveWord(data: ImManagerSensitiveWordApi.SensitiveWord) {
return requestClient.post<number>('/im/manager/sensitive-word/create', data);
}
/** 修改敏感词 */
export function updateManagerSensitiveWord(data: ImManagerSensitiveWordApi.SensitiveWord) {
return requestClient.put<boolean>(
'/im/manager/sensitive-word/update',
data,
);
}
/** 删除敏感词 */
export function deleteManagerSensitiveWord(id: number) {
return requestClient.delete<boolean>('/im/manager/sensitive-word/delete', {
params: { id },
});
}
/** 批量删除敏感词 */
export function deleteManagerSensitiveWordList(ids: number[]) {
return requestClient.delete<boolean>(
'/im/manager/sensitive-word/delete-list',
{ params: { ids: ids.join(',') } },
);
}

View File

@ -0,0 +1,88 @@
import { requestClient } from '#/api/request';
export namespace ImManagerStatisticsApi {
/** 统计概览 */
export interface Overview {
totalUser: number;
newUserToday: number;
totalGroup: number;
newGroupToday: number;
activeUserDaily: number;
activeUserWeekly: number;
activeUserMonthly: number;
privateMessageToday: number;
groupMessageToday: number;
privateMessageYesterday: number;
groupMessageYesterday: number;
}
/** 趋势数据 */
export interface Trend {
dates: string[];
series: Record<string, number[]>;
}
/** 消息类型分布 */
export interface MessageType {
type: number; // 参见 ImContentTypeEnum 枚举类,由前端按 DICT_TYPE.IM_CONTENT_TYPE 翻译
value: number;
}
/** 群规模分布 */
export interface GroupSize {
range: string;
count: number;
}
/** 消息发送排行 */
export interface TopSender {
userId: number;
nickname: string;
messageCount: number;
}
}
/** 获得 KPI 概览 */
export function getStatisticsOverview() {
return requestClient.get<ImManagerStatisticsApi.Overview>(
'/im/manager/statistics/overview',
);
}
/** 获得消息趋势(私聊 + 群聊双线) */
export function getMessageTrend(days: number) {
return requestClient.get<ImManagerStatisticsApi.Trend>(
'/im/manager/statistics/message-trend',
{ params: { days } },
);
}
/** 获得用户趋势(新增注册 + 日活双线) */
export function getUserTrend(days: number) {
return requestClient.get<ImManagerStatisticsApi.Trend>(
'/im/manager/statistics/user-trend',
{ params: { days } },
);
}
/** 获得内容类型分布(最近 30 天) */
export function getMessageTypeDistribution() {
return requestClient.get<ImManagerStatisticsApi.MessageType[]>(
'/im/manager/statistics/message-type-distribution',
);
}
/** 获得群规模分布 */
export function getGroupSizeDistribution() {
return requestClient.get<ImManagerStatisticsApi.GroupSize[]>(
'/im/manager/statistics/group-size-distribution',
);
}
/** 获得消息 TOP 发送者(最近 30 天) */
export function getTopSenders() {
return requestClient.get<ImManagerStatisticsApi.TopSender[]>(
'/im/manager/statistics/top-senders',
);
}

View File

@ -0,0 +1,34 @@
import { requestClient } from '#/api/request';
export namespace ImChannelMessageApi {
/** 频道消息 */
export interface ChannelMessageRespVO {
id: number;
clientMessageId?: string;
channelId: number;
materialId: number;
type: number;
content: string;
receiptStatus?: number;
sendTime: string;
}
}
/** 拉取当前用户应收的频道消息(离线增量);按 minId 游标分页 */
export function pullChannelMessageList(
params: { minId: number; size?: number },
signal?: AbortSignal,
) {
return requestClient.get<ImChannelMessageApi.ChannelMessageRespVO[]>(
'/im/channel/message/pull',
{ params, signal },
);
}
/** 上报频道消息已读位置;切到频道会话或拉到新消息后调 */
export function readChannelMessages(channelId: number, messageId: number) {
return requestClient.put<boolean>('/im/channel/message/read', undefined, {
params: { channelId, messageId },
});
}

View File

@ -0,0 +1,92 @@
import { requestClient } from '#/api/request';
export namespace ImGroupMessageApi {
/** 群聊消息 Response VO */
export interface GroupMessageRespVO {
id: number; // 消息编号
clientMessageId: string; // 客户端消息编号
senderId: number; // 发送人编号
groupId: number; // 群编号
type: number; // 内容类型
content: string; // 消息内容JSON 格式)
status: number; // 消息状态
sendTime: string; // 发送时间
atUserIds?: number[]; // @ 目标用户编号列表
receiverUserIds?: number[]; // 定向接收用户编号列表
receiptStatus?: number; // 回执状态
readCount?: number; // 已读人数(回执消息、且发送人为当前用户时有值)
}
/** 群聊消息发送 Request VO */
export interface GroupMessageSendReqVO {
clientMessageId: string; // 客户端消息编号
groupId: number; // 群编号
type: number; // 内容类型
content: string; // 消息内容JSON 格式)
atUserIds?: number[]; // @ 目标用户编号列表
receipt?: boolean; // 是否需要回执
}
/** 群聊历史消息列表 Request VO */
export interface GroupMessageListReqVO {
groupId: number | string; // 群编号
maxId?: number | string; // 起始消息编号(不含),为空则从最新消息开始
limit: number; // 拉取数量1 ~ 200
}
}
/** 发送群聊消息 */
export function sendGroupMessage(data: ImGroupMessageApi.GroupMessageSendReqVO) {
return requestClient.post<ImGroupMessageApi.GroupMessageRespVO>(
'/im/message/group/send',
data,
);
}
/** 拉取群聊消息(增量) */
export function pullGroupMessageList(
params: { minId: number | string; size: number },
signal?: AbortSignal,
) {
return requestClient.get<ImGroupMessageApi.GroupMessageRespVO[]>(
'/im/message/group/pull',
{ params, signal },
);
}
/** 查询群聊历史消息 */
export function getGroupMessageList(params: ImGroupMessageApi.GroupMessageListReqVO) {
return requestClient.get<ImGroupMessageApi.GroupMessageRespVO[]>(
'/im/message/group/list',
{ params },
);
}
/** 标记群聊消息已读 */
export function readGroupMessages(
groupId: number | string,
messageId: number | string,
) {
return requestClient.put<boolean>('/im/message/group/read', undefined, {
params: { groupId, messageId },
});
}
/** 撤回群聊消息 */
export function recallGroupMessage(id: number | string) {
return requestClient.delete<ImGroupMessageApi.GroupMessageRespVO>(
'/im/message/group/recall',
{ params: { id } },
);
}
/** 获取群消息已读用户列表 */
export function getGroupReadUsers(params: {
groupId: number | string;
messageId: number | string;
}) {
return requestClient.get<number[]>('/im/message/group/get-read-user-ids', {
params,
});
}

View File

@ -0,0 +1,89 @@
import { requestClient } from '#/api/request';
export namespace ImPrivateMessageApi {
/** 私聊消息 Response VO */
export interface PrivateMessageRespVO {
id: number; // 消息编号
clientMessageId: string; // 客户端消息编号
senderId: number; // 发送人编号
receiverId: number; // 接收人编号
type: number; // 内容类型
content: string; // 消息内容JSON 格式)
status: number; // 消息状态(正常 / 已撤回)
receiptStatus?: number; // 回执状态(不需要 / 待完成 / 已完成),对齐 ImMessageReceiptStatus
sendTime: string; // 发送时间
}
/** 私聊消息发送 Request VO */
export interface PrivateMessageSendReqVO {
clientMessageId: string; // 客户端消息编号
receiverId: number; // 接收人编号
type: number; // 内容类型
content: string; // 消息内容JSON 格式)
receipt?: boolean; // 是否需要回执;不传后端默认 true普通私聊用户消息
}
/** 私聊历史消息列表 Request VO */
export interface PrivateMessageListReqVO {
receiverId: number | string; // 接收人编号(对方)
maxId?: number | string; // 起始消息编号(不含),为空则从最新消息开始
limit: number; // 拉取数量1 ~ 200
}
}
/** 发送私聊消息 */
export function sendPrivateMessage(data: ImPrivateMessageApi.PrivateMessageSendReqVO) {
return requestClient.post<ImPrivateMessageApi.PrivateMessageRespVO>(
'/im/message/private/send',
data,
);
}
/** 拉取私聊消息(增量) */
export function pullPrivateMessageList(
params: { minId: number | string; size: number },
signal?: AbortSignal,
) {
return requestClient.get<ImPrivateMessageApi.PrivateMessageRespVO[]>(
'/im/message/private/pull',
{ params, signal },
);
}
/** 查询私聊历史消息 */
export function getPrivateMessageList(params: ImPrivateMessageApi.PrivateMessageListReqVO) {
return requestClient.get<ImPrivateMessageApi.PrivateMessageRespVO[]>(
'/im/message/private/list',
{ params },
);
}
/** 标记私聊消息已读 */
export function readPrivateMessages(
receiverId: number | string,
messageId: number | string,
) {
return requestClient.put<boolean>('/im/message/private/read', undefined, {
params: { receiverId, messageId },
});
}
/** 查询对方已读到我发的最大消息 id多端 / 离线后用于补齐已读状态) */
export function getPrivateMaxReadMessageId(
peerId: number | string,
signal?: AbortSignal,
) {
return requestClient.get<null | number>(
'/im/message/private/max-read-message-id',
{ params: { peerId }, signal },
);
}
/** 撤回私聊消息 */
export function recallPrivateMessage(id: number | string) {
return requestClient.delete<ImPrivateMessageApi.PrivateMessageRespVO>(
'/im/message/private/recall',
{ params: { id } },
);
}

View File

@ -0,0 +1,105 @@
import { requestClient } from '#/api/request';
export namespace ImRtcApi {
/** 创建新通话请求 VO */
export interface RtcCallCreateReqVO {
conversationType: number;
mediaType: number;
groupId?: number;
inviteeIds: number[]; // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人
}
/** 通话中追加邀请请求 VO仅群通话可用 */
export interface RtcCallInviteReqVO {
room: string;
inviteeIds: number[];
}
/** 通话会话 VOcreate / join / accept / refreshToken 共用 */
export interface RtcCallRespVO {
room: string; // 业务通话编号(同时作为 LiveKit 房间名)
livekitUrl: string;
token?: string; // ENDED 状态时为 null无需 connect LiveKit
conversationType: number;
mediaType: number;
status: number;
endReason?: number; // 结束原因;仅 status=ENDED 时有值
inviterId: number;
groupId?: number;
inviteeIds?: number[];
joinedUserIds?: number[];
}
/** 群活跃通话查询响应;不含 token */
export interface RtcGroupCallRespVO {
room: string;
groupId: number;
mediaType: number;
inviterId: number;
joinedUserIds?: number[];
inviteeIds?: number[];
}
}
/** 创建新通话;私聊或群聊根据 conversationType 区分 */
export function createCall(data: ImRtcApi.RtcCallCreateReqVO) {
return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/create', data);
}
/** 通话中追加邀请;仅群通话可用 */
export function inviteCall(data: ImRtcApi.RtcCallInviteReqVO) {
return requestClient.post<boolean>('/im/rtc/invite', data);
}
/** 加入已有群通话;用于胶囊条「加入」按钮 */
export function joinCall(room: string) {
return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/join', undefined, {
params: { room },
});
}
/** 接听通话 */
export function acceptCall(room: string) {
return requestClient.post<ImRtcApi.RtcCallRespVO>('/im/rtc/accept', undefined, {
params: { room },
});
}
/** 拒绝通话 */
export function rejectCall(room: string) {
return requestClient.post<boolean>('/im/rtc/reject', undefined, {
params: { room },
});
}
/** 取消邀请;主叫接通前调用 */
export function cancelCall(room: string) {
return requestClient.post<boolean>('/im/rtc/cancel', undefined, {
params: { room },
});
}
/** 离开通话;接通后调用 */
export function leaveCall(room: string) {
return requestClient.post<boolean>('/im/rtc/leave', undefined, {
params: { room },
});
}
/** 振铃超时检查RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING接口静默 */
export function noAnswerCallCheck(room: string) {
return requestClient.post<boolean>(
'/im/rtc/no-answer-call-check',
undefined,
{ params: { room } },
);
}
/** 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话 */
export function getActiveCall(groupId: number) {
return requestClient.get<ImRtcApi.RtcGroupCallRespVO | null>(
'/im/rtc/get-active-call',
{ params: { groupId } },
);
}

View File

@ -24,6 +24,18 @@ export namespace InfraCodegenApi {
parentMenuId: number;
}
/** 代码生成表保存请求 */
export interface CodegenTableSaveReqVO extends CodegenTable {
frontType?: null | number;
genPath?: string;
genType?: string;
masterTableId?: number;
subJoinColumnId?: number;
subJoinMany?: boolean;
treeParentColumnId?: number;
treeNameColumnId?: number;
}
/** 代码生成字段定义 */
export interface CodegenColumn {
id: number;
@ -54,7 +66,7 @@ export namespace InfraCodegenApi {
/** 代码生成详情 */
export interface CodegenDetail {
table: CodegenTable;
table: CodegenTableSaveReqVO;
columns: CodegenColumn[];
}
@ -66,7 +78,7 @@ export namespace InfraCodegenApi {
/** 更新代码生成请求 */
export interface CodegenUpdateReqVO {
table: any | CodegenTable;
table: CodegenTableSaveReqVO;
columns: CodegenColumn[];
}

View File

@ -11,7 +11,7 @@ export namespace Demo02CategoryApi {
}
/** 查询示例分类列表 */
export function getDemo02CategoryList(params: any) {
export function getDemo02CategoryList(params?: any) {
return requestClient.get<Demo02CategoryApi.Demo02Category[]>(
'/infra/demo02-category/list',
{ params },

View File

@ -1,5 +1,3 @@
import type { Dayjs } from 'dayjs';
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
@ -7,7 +5,7 @@ import { requestClient } from '#/api/request';
export namespace Demo03StudentApi {
/** 学生课程信息 */
export interface Demo03Course {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
score?: number; // 分数
@ -15,7 +13,7 @@ export namespace Demo03StudentApi {
/** 学生班级信息 */
export interface Demo03Grade {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
teacher?: string; // 班主任
@ -23,10 +21,10 @@ export namespace Demo03StudentApi {
/** 学生信息 */
export interface Demo03Student {
id: number; // 编号
id?: number; // 编号
name?: string; // 名字
sex?: number; // 性别
birthday?: Dayjs | string; // 出生日期
birthday?: number | string; // 出生日期
description?: string; // 简介
}
}

View File

@ -1,5 +1,3 @@
import type { Dayjs } from 'dayjs';
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
@ -7,7 +5,7 @@ import { requestClient } from '#/api/request';
export namespace Demo03StudentApi {
/** 学生课程信息 */
export interface Demo03Course {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
score?: number; // 分数
@ -15,7 +13,7 @@ export namespace Demo03StudentApi {
/** 学生班级信息 */
export interface Demo03Grade {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
teacher?: string; // 班主任
@ -23,10 +21,10 @@ export namespace Demo03StudentApi {
/** 学生信息 */
export interface Demo03Student {
id: number; // 编号
id?: number; // 编号
name?: string; // 名字
sex?: number; // 性别
birthday?: Dayjs | string; // 出生日期
birthday?: number | string; // 出生日期
description?: string; // 简介
demo03courses?: Demo03Course[];
demo03grade?: Demo03Grade;

View File

@ -1,5 +1,3 @@
import type { Dayjs } from 'dayjs';
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
@ -7,7 +5,7 @@ import { requestClient } from '#/api/request';
export namespace Demo03StudentApi {
/** 学生课程信息 */
export interface Demo03Course {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
score?: number; // 分数
@ -15,7 +13,7 @@ export namespace Demo03StudentApi {
/** 学生班级信息 */
export interface Demo03Grade {
id: number; // 编号
id?: number; // 编号
studentId?: number; // 学生编号
name?: string; // 名字
teacher?: string; // 班主任
@ -23,10 +21,10 @@ export namespace Demo03StudentApi {
/** 学生信息 */
export interface Demo03Student {
id: number; // 编号
id?: number; // 编号
name?: string; // 名字
sex?: number; // 性别
birthday?: Dayjs | string; // 出生日期
birthday?: number | string; // 出生日期
description?: string; // 简介
demo03courses?: Demo03Course[];
demo03grade?: Demo03Grade;

View File

@ -75,3 +75,8 @@ export function runJob(id: number) {
export function getJobNextTimes(id: number) {
return requestClient.get(`/infra/job/get_next_times?id=${id}`);
}
/** 同步定时任务到 Quartz */
export function syncJob() {
return requestClient.post('/infra/job/sync');
}

View File

@ -6,11 +6,11 @@ export namespace IoTOtaTaskApi {
/** IoT OTA 升级任务 */
export interface Task {
id?: number;
name?: string;
name: string;
description?: string;
firmwareId?: number;
status?: number;
deviceScope?: number;
deviceScope: number;
deviceIds?: number[];
deviceTotalCount?: number;
deviceSuccessCount?: number;

View File

@ -11,7 +11,7 @@ export namespace RuleSceneApi {
status?: number;
triggers?: Trigger[];
actions?: Action[];
lastTriggeredTime?: Date;
lastTriggerTime?: Date;
createTime?: Date;
}

View File

@ -30,8 +30,8 @@ export namespace ThingModelApi {
required?: boolean;
dataType?: string;
description?: string;
dataSpecs?: any;
dataSpecsList?: any[];
dataSpecs?: ThingModelDataSpecs;
dataSpecsList?: ThingModelPropertyDataSpecs[];
}
/** IoT 物模型服务 */
@ -64,8 +64,8 @@ export namespace ThingModelApi {
direction?: string;
paraOrder?: number;
dataType?: string;
dataSpecs?: any;
dataSpecsList?: any[];
dataSpecs?: ThingModelDataSpecs;
dataSpecsList?: ThingModelPropertyDataSpecs[];
}
/** IoT 物模型 TSL树形响应 */
@ -78,19 +78,35 @@ export namespace ThingModelApi {
}
/** IoT 数据定义(数值型) */
export interface DataSpecsNumberData {
export interface ThingModelDataSpecs {
accessMode?: string;
childDataType?: string;
dataSpecs?: ThingModelDataSpecs;
dataSpecsList?: ThingModelPropertyDataSpecs[];
dataType?: string;
defaultValue?: string;
description?: string;
identifier?: string;
length?: number | string;
min?: number | string;
max?: number | string;
name?: string;
precise?: string;
required?: boolean;
size?: number | string;
step?: number | string;
unit?: string;
unitName?: string;
value?: number | string;
}
/** IoT 数据定义(数值型) */
export type DataSpecsNumberData = ThingModelDataSpecs;
/** IoT 数据定义(枚举/布尔型) */
export interface DataSpecsEnumOrBoolData {
value: number | string;
name: string;
}
export type DataSpecsEnumOrBoolData = ThingModelDataSpecs;
export type ThingModelPropertyDataSpecs = Property & ThingModelDataSpecs;
}
/** 生成「必填 + 数字」类校验器:拼到 size / length / 枚举值上 */

View File

@ -8,6 +8,7 @@ export namespace MallCombinationActivityApi {
id?: number; // 活动编号
name?: string; // 活动名称
spuId?: number; // 商品 SPU 编号
spuName?: string; // 商品 SPU 名称
totalLimitCount?: number; // 总限购数量
singleLimitCount?: number; // 单次限购数量
startTime?: Date; // 开始时间
@ -21,7 +22,7 @@ export namespace MallCombinationActivityApi {
limitDuration?: number; // 限制时长
combinationPrice?: number; // 拼团价格
products: CombinationProduct[]; // 商品列表
picUrl?: any;
picUrl?: string; // 商品图片
}
/** 拼团活动所需属性 */

View File

@ -26,9 +26,9 @@ export namespace MallRewardActivityApi {
conditionType?: number; // 条件类型
productScope?: number; // 商品范围
rules: RewardRule[]; // 优惠规则列表
productScopeValues?: number[]; // 商品范围值(仅表单使用):值为品类编号列表、商品编号列表
productCategoryIds?: number[]; // 商品分类编号列表(仅表单使用)
productSpuIds?: number[]; // 商品 SPU 编号列表(仅表单使用)
productScopeValues: number[]; // 商品范围值(仅表单使用):值为品类编号列表、商品编号列表
productCategoryIds: number[]; // 商品分类编号列表(仅表单使用)
productSpuIds: number[]; // 商品 SPU 编号列表(仅表单使用)
}
}

View File

@ -31,7 +31,7 @@ export namespace MallSeckillActivityApi {
totalStock?: number; // 秒杀总库存
seckillPrice?: number; // 秒杀价格
products?: SeckillProduct[]; // 秒杀商品列表
picUrl?: any;
picUrl?: string; // 商品图片
}
}

View File

@ -7,7 +7,7 @@ import { requestClient } from '#/api/request';
export namespace MallTradeStatisticsApi {
/** 交易状况 Request */
export interface TradeTrendReqVO {
times: [Date, Date];
times?: string[];
}
/** 交易统计 Response */

View File

@ -4,20 +4,21 @@ export namespace MallTradeConfigApi {
/** 交易中心配置 */
export interface Config {
id?: number;
afterSaleRefundReasons?: string[];
afterSaleReturnReasons?: string[];
deliveryExpressFreeEnabled?: boolean;
deliveryExpressFreePrice?: number;
deliveryPickUpEnabled?: boolean;
afterSaleRefundReasons: string[];
afterSaleReturnReasons: string[];
deliveryExpressFreeEnabled: boolean;
deliveryExpressFreePrice: number;
deliveryPickUpEnabled: boolean;
brokerageEnabled?: boolean;
brokerageEnabledCondition?: number;
brokerageBindMode?: number;
brokeragePosterUrls?: string;
brokeragePosterUrls: string[];
brokerageFirstPercent?: number;
brokerageSecondPercent?: number;
brokerageWithdrawMinPrice?: number;
brokerageFrozenDays?: number;
brokerageWithdrawTypes?: string;
brokerageWithdrawMinPrice: number;
brokerageFrozenDays: number;
brokerageWithdrawFeePercent: number;
brokerageWithdrawTypes: number[];
tencentLbsKey?: string;
}
}

View File

@ -7,6 +7,7 @@ export namespace MemberAddressApi {
name: string;
mobile: string;
areaId: number;
areaName?: string;
detailAddress: string;
defaultStatus: boolean;
}

View File

@ -4,7 +4,7 @@ export namespace MemberConfigApi {
/** 积分设置信息 */
export interface Config {
id?: number;
pointTradeDeductEnable: number;
pointTradeDeductEnable: boolean;
pointTradeDeductUnitPrice: number;
pointTradeDeductMaxPrice: number;
pointTradeGivePoint: number;

View File

@ -10,27 +10,31 @@ export namespace MemberUserApi {
birthday?: number;
createTime?: number;
loginDate?: number;
loginIp: string;
mark: string;
mobile: string;
loginIp?: string;
mark?: string;
mobile?: string;
email?: string;
name?: string;
nickname?: string;
registerIp: string;
sex: number;
status: number;
registerIp?: string;
sex?: number;
status?: number;
areaId?: number;
areaName?: string;
levelName: string;
point?: number;
totalPoint?: number;
experience?: number;
tagIds?: number[];
groupId?: number;
levelId?: number;
levelName?: null | string;
point?: null | number;
totalPoint?: null | number;
experience?: null | number;
}
/** 会员用户等级更新信息 */
export interface UserUpdateLevelReqVO {
id: number;
levelId: number;
reason: string;
}
/** 会员用户积分更新信息 */

View File

@ -51,5 +51,7 @@ export function deleteAutoCodeRule(id: number) {
/** 导出编码规则 */
export function exportAutoCodeRule(params: PageParam) {
return requestClient.download('/mes/md/auto-code-rule/export-excel', { params });
return requestClient.download('/mes/md/auto-code-rule/export-excel', {
params,
});
}

View File

@ -34,7 +34,9 @@ export namespace MesMdItemApi {
/** 查询物料产品分页 */
export function getItemPage(params: PageParam) {
return requestClient.get<PageResult<MesMdItemApi.Item>>('/mes/md/item/page', { params });
return requestClient.get<PageResult<MesMdItemApi.Item>>('/mes/md/item/page', {
params,
});
}
/** 查询物料产品详情 */

View File

@ -32,9 +32,7 @@ export function getRouteSimpleList() {
/** 查询工艺路线详情 */
export function getRoute(id: number) {
return requestClient.get<MesProRouteApi.Route>(
`/mes/pro/route/get?id=${id}`,
);
return requestClient.get<MesProRouteApi.Route>(`/mes/pro/route/get?id=${id}`);
}
/** 新增工艺路线 */

View File

@ -25,12 +25,16 @@ export function getDefectPage(params: PageParam) {
/** 查询缺陷类型精简列表 */
export function getDefectSimpleList() {
return requestClient.get<MesQcDefectApi.Defect[]>('/mes/qc/defect/simple-list');
return requestClient.get<MesQcDefectApi.Defect[]>(
'/mes/qc/defect/simple-list',
);
}
/** 查询缺陷类型详情 */
export function getDefect(id: number) {
return requestClient.get<MesQcDefectApi.Defect>(`/mes/qc/defect/get?id=${id}`);
return requestClient.get<MesQcDefectApi.Defect>(
`/mes/qc/defect/get?id=${id}`,
);
}
/** 新增缺陷类型 */

View File

@ -25,7 +25,7 @@ export function getDefectRecord(id: number) {
/** 查询质检缺陷记录分页 */
export function getDefectRecordPage(
params: PageParam & { lineId?: number; qcId?: number; qcType?: number; },
params: PageParam & { lineId?: number; qcId?: number; qcType?: number },
) {
return requestClient.get<PageResult<MesQcDefectRecordApi.DefectRecord>>(
'/mes/qc/defect-record/page',

View File

@ -50,10 +50,9 @@ export namespace MesQcIpqcApi {
/** 查询过程检验单分页 */
export function getIpqcPage(params: PageParam) {
return requestClient.get<PageResult<MesQcIpqcApi.Ipqc>>(
'/mes/qc/ipqc/page',
{ params },
);
return requestClient.get<PageResult<MesQcIpqcApi.Ipqc>>('/mes/qc/ipqc/page', {
params,
});
}
/** 查询过程检验单详情 */

View File

@ -24,7 +24,9 @@ export namespace MesQcTemplateIndicatorApi {
}
/** 查询检测指标项分页 */
export function getTemplateIndicatorPage(params: PageParam & { templateId?: number }) {
export function getTemplateIndicatorPage(
params: PageParam & { templateId?: number },
) {
return requestClient.get<
PageResult<MesQcTemplateIndicatorApi.TemplateIndicator>
>('/mes/qc/template/indicator/page', { params });

View File

@ -22,7 +22,9 @@ export namespace MesQcTemplateItemApi {
}
/** 查询产品关联分页 */
export function getTemplateItemPage(params: PageParam & { templateId?: number }) {
export function getTemplateItemPage(
params: PageParam & { templateId?: number },
) {
return requestClient.get<PageResult<MesQcTemplateItemApi.TemplateItem>>(
'/mes/qc/template/item/page',
{ params },

View File

@ -37,16 +37,12 @@ export function getArrivalNotice(id: number) {
}
/** 新增到货通知单 */
export function createArrivalNotice(
data: MesWmArrivalNoticeApi.ArrivalNotice,
) {
export function createArrivalNotice(data: MesWmArrivalNoticeApi.ArrivalNotice) {
return requestClient.post<number>('/mes/wm/arrival-notice/create', data);
}
/** 修改到货通知单 */
export function updateArrivalNotice(
data: MesWmArrivalNoticeApi.ArrivalNotice,
) {
export function updateArrivalNotice(data: MesWmArrivalNoticeApi.ArrivalNotice) {
return requestClient.put('/mes/wm/arrival-notice/update', data);
}

View File

@ -39,10 +39,7 @@ export function getArrivalNoticeLine(id: number) {
export function createArrivalNoticeLine(
data: MesWmArrivalNoticeLineApi.ArrivalNoticeLine,
) {
return requestClient.post<number>(
'/mes/wm/arrival-notice-line/create',
data,
);
return requestClient.post<number>('/mes/wm/arrival-notice-line/create', data);
}
/** 修改到货通知单行 */

View File

@ -73,9 +73,12 @@ export function getBatchPage(params: MesWmBatchApi.PageParams) {
/** 批次向前追溯 */
export function getForwardBatchList(code: string) {
return requestClient.get<MesWmBatchApi.Batch[]>('/mes/wm/batch/forward-list', {
params: { code },
});
return requestClient.get<MesWmBatchApi.Batch[]>(
'/mes/wm/batch/forward-list',
{
params: { code },
},
);
}
/** 批次向后追溯 */

View File

@ -66,5 +66,7 @@ export function cancelMiscReceipt(id: number) {
/** 导出杂项入库单 */
export function exportMiscReceipt(params: any) {
return requestClient.download('/mes/wm/misc-receipt/export-excel', { params });
return requestClient.download('/mes/wm/misc-receipt/export-excel', {
params,
});
}

View File

@ -28,9 +28,10 @@ export namespace MesWmOutsourceIssueDetailApi {
/** 查询外协发料单明细列表 */
export function getOutsourceIssueDetailListByLineId(lineId: number) {
return requestClient.get<
MesWmOutsourceIssueDetailApi.OutsourceIssueDetail[]
>('/mes/wm/outsource-issue-detail/list-by-line', { params: { lineId } });
return requestClient.get<MesWmOutsourceIssueDetailApi.OutsourceIssueDetail[]>(
'/mes/wm/outsource-issue-detail/list-by-line',
{ params: { lineId } },
);
}
/** 查询外协发料单明细详情 */

View File

@ -21,10 +21,9 @@ export namespace MesWmOutsourceReceiptApi {
/** 查询外协入库单分页 */
export function getOutsourceReceiptPage(params: PageParam) {
return requestClient.get<PageResult<MesWmOutsourceReceiptApi.OutsourceReceipt>>(
'/mes/wm/outsource-receipt/page',
{ params },
);
return requestClient.get<
PageResult<MesWmOutsourceReceiptApi.OutsourceReceipt>
>('/mes/wm/outsource-receipt/page', { params });
}
/** 查询外协入库单详情 */

View File

@ -40,7 +40,10 @@ export function getProductIssueDetail(id: number) {
export function createProductIssueDetail(
data: MesWmProductIssueDetailApi.ProductIssueDetail,
) {
return requestClient.post<number>('/mes/wm/product-issue-detail/create', data);
return requestClient.post<number>(
'/mes/wm/product-issue-detail/create',
data,
);
}
/** 修改领料出库明细 */

View File

@ -20,10 +20,9 @@ export namespace MesWmProductIssueLineApi {
/** 查询领料出库单行分页 */
export function getProductIssueLinePage(params: PageParam) {
return requestClient.get<PageResult<MesWmProductIssueLineApi.ProductIssueLine>>(
'/mes/wm/product-issue-line/page',
{ params },
);
return requestClient.get<
PageResult<MesWmProductIssueLineApi.ProductIssueLine>
>('/mes/wm/product-issue-line/page', { params });
}
/** 查询领料出库单行详情 */

View File

@ -42,7 +42,10 @@ export function getProductSalesDetail(id: number) {
export function createProductSalesDetail(
data: MesWmProductSalesDetailApi.ProductSalesDetail,
) {
return requestClient.post<number>('/mes/wm/product-sales-detail/create', data);
return requestClient.post<number>(
'/mes/wm/product-sales-detail/create',
data,
);
}
/** 修改销售出库明细 */

View File

@ -40,7 +40,10 @@ export function getReturnVendorDetail(id: number) {
export function createReturnVendorDetail(
data: MesWmReturnVendorDetailApi.ReturnVendorDetail,
) {
return requestClient.post<number>('/mes/wm/return-vendor-detail/create', data);
return requestClient.post<number>(
'/mes/wm/return-vendor-detail/create',
data,
);
}
/** 修改供应商退货明细 */

View File

@ -21,10 +21,9 @@ export namespace MesWmReturnVendorLineApi {
/** 查询供应商退货单行分页 */
export function getReturnVendorLinePage(params: PageParam) {
return requestClient.get<PageResult<MesWmReturnVendorLineApi.ReturnVendorLine>>(
'/mes/wm/return-vendor-line/page',
{ params },
);
return requestClient.get<
PageResult<MesWmReturnVendorLineApi.ReturnVendorLine>
>('/mes/wm/return-vendor-line/page', { params });
}
/** 查询供应商退货单行详情 */

View File

@ -17,6 +17,21 @@ export namespace MesWmSnApi {
createTime?: Date; // 生成时间
}
/** MES SN 码明细 */
export interface Sn {
id?: number; // 编号
uuid?: string; // 批次 UUID
code?: string; // SN 码
itemId?: number; // 物料编号
itemCode?: string; // 物料编码
itemName?: string; // 物料名称
specification?: string; // 规格型号
unitName?: string; // 单位名称
batchCode?: string; // 批次号
workOrderId?: number; // 生产工单编号
createTime?: Date; // 生成时间
}
/** MES SN 码生成参数 */
export interface SnGenerate {
itemId?: number; // 物料编号
@ -48,6 +63,13 @@ export function getSnGroupPage(params: MesWmSnApi.PageParams) {
);
}
/** 查询批次 SN 码明细列表 */
export function getSnListByUuid(uuid: string) {
return requestClient.get<MesWmSnApi.Sn[]>('/mes/wm/sn/list-by-uuid', {
params: { uuid },
});
}
/** 批量删除 SN 码(按批次 UUID */
export function deleteSnBatch(uuid: string) {
return requestClient.delete('/mes/wm/sn/delete-batch', {

View File

@ -60,5 +60,7 @@ export function updateStockTakingResult(
/** 删除盘点结果 */
export function deleteStockTakingResult(id: number) {
return requestClient.delete(`/mes/wm/stocktaking-task-result/delete?id=${id}`);
return requestClient.delete(
`/mes/wm/stocktaking-task-result/delete?id=${id}`,
);
}

View File

@ -3,6 +3,19 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MpFreePublishApi {
/** 图文文章内容 */
export interface FreePublishArticle {
title?: string;
thumbUrl?: string;
picUrl?: string;
url?: string;
}
/** 图文内容 */
export interface FreePublishContent {
newsItem?: FreePublishArticle[];
}
/** 自由发布文章信息 */
export interface FreePublish {
id?: number;
@ -12,7 +25,7 @@ export namespace MpFreePublishApi {
title: string;
author: string;
digest: string;
content: string;
content?: FreePublishContent;
thumbUrl: string;
status: number;
publishTime?: Date;

View File

@ -11,6 +11,12 @@ export namespace MpTagApi {
count?: number;
createTime?: Date;
}
/** 标签精简信息 */
export interface SimpleTag {
tagId: number;
name: string;
}
}
/** 创建公众号标签 */
@ -46,7 +52,7 @@ export function getTagPage(params: PageParam) {
/** 获取公众号标签精简信息列表 */
export function getSimpleTagList() {
return requestClient.get<MpTagApi.Tag[]>('/mp/tag/list-all-simple');
return requestClient.get<MpTagApi.SimpleTag[]>('/mp/tag/list-all-simple');
}
/** 同步公众号标签 */

View File

@ -3,6 +3,16 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace PayNotifyApi {
/** 支付通知日志 */
export interface NotifyLog {
id?: number;
status?: number;
notifyTimes?: number;
lastExecuteTime?: Date;
createTime?: Date;
response?: string;
}
/** 支付通知任务 */
export interface NotifyTask {
id: number;
@ -20,13 +30,13 @@ export namespace PayNotifyApi {
maxNotifyTimes: number;
createTime: Date;
updateTime: Date;
logs?: any[];
logs?: NotifyLog[];
}
}
/** 获得支付通知明细 */
export function getNotifyTaskDetail(id: number) {
return requestClient.get(`/pay/notify/get-detail?id=${id}`);
return requestClient.get<PayNotifyApi.NotifyTask>(`/pay/notify/get-detail?id=${id}`);
}
/** 获得支付通知分页 */

View File

@ -9,16 +9,23 @@ export namespace SystemUserApi {
username: string;
nickname: string;
deptId: number;
deptName?: string;
postIds: string[];
email: string;
mobile: string;
sex: number;
avatar: string;
loginIp: string;
loginDate?: Date;
status: number;
remark: string;
createTime?: Date;
}
/** 用户精简信息 */
export interface UserSimple extends User {
id: number;
}
}
/** 查询用户管理列表 */
@ -34,6 +41,13 @@ export function getUser(id: number) {
return requestClient.get<SystemUserApi.User>(`/system/user/get?id=${id}`);
}
/** 查询用户列表 */
export function getUserList(ids: number[]) {
return requestClient.get<SystemUserApi.User[]>('/system/user/list', {
params: { ids: ids.join(',') },
});
}
/** 新增用户 */
export function createUser(data: SystemUserApi.User) {
return requestClient.post('/system/user/create', data);
@ -86,3 +100,17 @@ export function updateUserStatus(id: number, status: number) {
export function getSimpleUserList() {
return requestClient.get<SystemUserApi.User[]>('/system/user/simple-list');
}
/** 按用户编号查询用户精简信息 */
export function getSimpleUser(id: number | string) {
return requestClient.get<SystemUserApi.UserSimple>('/system/user/get-simple', {
params: { id },
});
}
/** 按昵称模糊搜索用户 */
export function getSimpleUserListByNickname(nickname: string) {
return requestClient.get<SystemUserApi.UserSimple[]>('/system/user/list-by-nickname', {
params: { nickname },
});
}

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