Compare commits

..

1002 Commits

Author SHA1 Message Date
YunaiV caa6fa9be3 fix: 修复头像裁剪容器高度异常
- 穿透设置 cropperjs 动态插入的 cropper-canvas 高度
- 解决头像上传裁剪区域只显示 100px 的问题
2026-06-07 18:29:02 +08:00
YunaiV 849f33c5a1 Merge remote-tracking branch 'origin/master' 2026-06-07 18:10:32 +08:00
YunaiV a08bdab7eb fix: 修复 ContentWrap 搜索栏异常滚动条
- 覆盖 Element Plus 新版 el-card body 默认 overflow:auto
- 避免搜索栏 ContentWrap 出现多余内部滚动条
2026-06-07 18:10:22 +08:00
芋道源码 5f5702ab17
!881 fix: 修复 IM 用户项 API 引用路径大小写错误
Merge pull request !881 from 久我山八重很不高兴w/master
2026-06-07 06:22:59 +00:00
芋道源码 70f683fda2
!882 fix: 修复场景联动列表页最近触发未能正确显示最后触发时间
Merge pull request !882 from 熊猫大侠/master-iotscene
2026-06-07 06:21:46 +00:00
YunaiV a4f8760415 refactor(mes): 移除冗余农历插件依赖
- 移除节假日页面未使用的 dayjs-plugin-lunar 扩展
- 统一使用 tyme4ts 计算农历、节日和节气信息
- 清理 package.json 和 pnpm-lock.yaml 中的冗余依赖
2026-06-07 01:46:01 +08:00
YunaiV 9bcffb8b38 fix(router): 修复父子同名路由导致子菜单丢失
- 收窄同名子路由折叠条件
- 仅在父级只有一个同名默认页时折叠
- 修复商城装修下装修模板菜单不显示的问题
2026-06-07 01:30:47 +08:00
YunaiV 8f24a79444 Merge remote-tracking branch 'origin/master' 2026-06-06 23:40:27 +08:00
YunaiV 0e46f09779 fix(mall): 修复首页账户充值金额单位显示错误
- 首页运营数据的账户充值金额从分转换为元后展示
- 同步修复 Vue3 与 Vben 的 antd、ele、antdv-next 三端
2026-06-06 23:40:11 +08:00
panda 69cd0b7875 fix: 修复场景联动列表页最近触发未能正确显示最后触发时间 2026-06-02 11:26:19 +08:00
久我山八重很不高兴w ba5c378a00
update src/views/im/manager/face/userItem/index.vue.
Signed-off-by: 久我山八重很不高兴w <479067860@qq.com>
2026-06-01 14:00:10 +00:00
YunaiV d1cb99c74a feat(im):增加 im 的功能说明 2026-06-01 08:16:37 +08:00
YunaiV b46b1647eb feat(im):合并 im 最新版本到 master 分支 2026-05-31 22:56:55 +08:00
YunaiV 2f7ec5b78f Merge branch 'im' of https://gitee.com/yudaocode/yudao-ui-admin-vue3
# Conflicts:
#	package.json
#	pnpm-lock.yaml
#	src/api/system/user/index.ts
2026-05-31 22:40:16 +08:00
YunaiV 37c70daaaf Merge remote-tracking branch 'origin/master' 2026-05-31 21:51:09 +08:00
YunaiV 944dd34d9e (〃'▽'〃)_v2026_05_发布:新增 WMS 仓储管理系统,完成 Vben5 IoT/MES/WMS 双端适配 2026-05-31 21:51:04 +08:00
YunaiV ff3c7884cc fix(bpm): 完善流程实例打印字段展示
- Vben5 web-antd/web-ele/web-antdv-next 同步支持更多表单字段打印
- Vue3 + Element Plus 流程打印补齐字典、用户、部门、省市区、文件、图片、开关、富文本等字段展示
- 普通字段和流程记录改为安全文本渲染,保留富文本 HTML 展示
- 打印时间改为每次打开弹窗时刷新
- web-ele 补充 ElButton 显式导入,避免运行时组件解析风险
2026-05-31 18:22:15 +08:00
YunaiV 595b8c5bb4 fix(form-create): 修复字典选择器 modelValue 回显兼容
- Vben5 web-ele 使用默认 modelValue 绑定,修正相关注释避免误用 model-value
- Vben5 web-antd 保留 value 绑定并明确组件库差异
- Vue3 DictSelect 显式接收 modelValue 并派发 update:modelValue,避免选择值更新后回显异常
2026-05-31 17:16:17 +08:00
YunaiV e6c0976c52 fix(crm): 修复待办线索漏传归属场景 2026-05-31 09:37:36 +08:00
YunaiV ed31f0d3c1 fix(bpm): 修复审批详情表单与时间线重叠 2026-05-31 09:30:24 +08:00
YunaiV 2e68890c7d fix(iot): 完善场景联动配置必填校验
- Vue3 抽取场景联动校验工具,统一触发器、附加条件和执行器校验
- Vben5 antd/ele 同步场景联动提交前兜底校验
- 补充 CRON 表达式、JSON 参数和动态字段必填校验
- 保留 deviceId=0 表示全部设备的业务语义
2026-05-31 00:36:40 +08:00
芋道源码 8405a07dd0
!880 fix: 修复场景联动配置中所有必填字段缺少了实际的验证
Merge pull request !880 from 熊猫大侠/master-iotscene
2026-05-30 15:13:58 +00:00
YunaiV 1b7fb5ed5d feat(member): 会员增加 email 字段 2026-05-30 22:55:27 +08:00
YunaiV aff1439629 feat: 优化 IoT 告警模板选择
- 后端 mail/sms/notify 模板 simple-list 仅返回启用模板精简字段
- 前端补充 mail/sms/notify 模板 simple-list API 封装
- vue3 与 vben antd/ele 在各自 system 模块封装模板选择组件
- IoT 告警配置按接收类型动态选择短信、邮件、站内信模板
- 补充前端 IotAlertReceiveTypeEnum,替换表单内裸常量
2026-05-30 22:06:01 +08:00
芋道源码 9a4f9b6995
!879 fix: 优化IoT告警配置支持动态选择邮件、短信、站内信的模板,不再依赖templateCode。
Merge pull request !879 from 熊猫大侠/master-iot-message
2026-05-30 12:57:22 +00:00
YunaiV d08413a68e fix(mes): 修改多个组件以使用整数类型的字典选项 2026-05-30 20:38:43 +08:00
YunaiV 89a49cf19c refactor(frontend): 统一当前登录用户 ID 获取入口
- 新增 getCurrentUserId 到 utils/auth
- 替换 IM、CRM、BPM、MES、Mall 等模块中直接读取 userStore.getUser.id 的写法
- 移除 IM 内部 currentUser 工具依赖,统一从全局 auth 工具获取当前用户编号
- 保留 userStore 对昵称、头像、部门等非 ID 字段的读取
2026-05-28 23:38:46 +08:00
YunaiV 763e11eb78 refactor(im): 统一本地存储入口和 store 命名
- 删除 utils/storage.ts,getCurrentUserId 移到 utils/user.ts
- StorageKeys 移到 utils/db.ts,按 localStorage / settings 分组
- db 客户端新增 clearStore;整桶 store 改为 clearStore + 循环 put 单事务
- 业务 store action / getter 统一改为 verbXxxList / verbXxx 风格
- draft API 加 Conversation 前缀;FriendStore loadFriends 改名 loadFriendData
- 卸载 localforage 依赖
2026-05-28 19:49:54 +08:00
YunaiV 664904bd06 refactor(im): 拆分会话消息存储并合并草稿
- 新增 IM IndexedDB DB client,按当前用户初始化本地库
- 将会话与消息拆成 conversations / messages 逐条存储
- 将草稿合并进 Conversation.draft,删除 draftStore
- 优化 pull 批量写入,消息、会话摘要和游标同事务落库
- 统一 store action 命名,清理旧 localStorage key 和 TODO
- 保留 maxId settings 游标,避免本地消息回收后游标回退
2026-05-28 08:39:49 +08:00
YunaiV 811b93d9f1 refactor(im): 拆分会话和消息本地存储
- 新增 IM IndexedDB DB 封装、schema、key helper 和 session guard
- 新增 messageStore,支持消息逐条持久化、分页加载、ack 合并、撤回和回执更新
- 调整 conversationStore 只持久化会话摘要,不再内嵌 messages 数组
- 切换发送、拉取、WebSocket、媒体上传和消息组件到 messageStore
- 增加离开 IM 时的 store 清理和本地存储序列化保护
2026-05-27 23:46:18 +08:00
YunaiV e80e5203a4 feat(mes): 迁移生产报工 antd/ele 并补齐任务选择器 2026-05-26 22:27:27 +08:00
熊猫大侠 c8b132433a
Merge branch 'master' of gitee.com:yudaocode/yudao-ui-admin-vue3 into master-iotscene
Signed-off-by: 熊猫大侠 <1565636758@qq.com>
2026-05-26 06:02:26 +00:00
panda 57596361ef fix: 修复场景联动配置中所有必填字段缺少了实际的验证 2026-05-26 11:22:24 +08:00
YunaiV 685ada8475 fix(mes): 修正安灯迁移的配置角色显示和记录只读字段 2026-05-26 00:08:46 +08:00
YunaiV e1b8370267 fix: 修复 IM 申请与 RTC 边界问题
- 复用好友申请、群申请和群邀请唯一键冲突后的旧记录,并补充测试
- 收敛 RTC 旁观者加入、忙线校验、追加邀请超员和群通话通知逻辑
- 为 RTC 参与者补充房间用户唯一约束与 MySQL 迁移
- 统一群本体管理请求的 id 字段,并同步前端调用
- 修复前端来电活跃态守卫和 LiveKit 重连前断开旧房间
- 清理群成员通知基类命名和相关注释
2026-05-25 20:54:11 +08:00
YunaiV a4dfb717aa fix(im):批量修复群管理、RTC 和消息链路问题
- 修复群管理行锁、管理员角色更新、群主转让、置顶消息并发问题
- 修复好友申请 maxId 游标、重复申请排序、通知类型校验和消息内容结构校验
- 修复消息统计口径、RTC token 鉴权、离会通知、前端拉取取消和媒体重试
- 优化表情批量删除、WebSocket 推送注释、群 READ 字段和相关单测
- 更新 bug_todo、bug_done 和 bug_rejected,剩余 9 个待修
2026-05-25 09:04:25 +08:00
YunaiV 06a008b030 fix(iot): 修复规则数据回显与 JSON 参数校验
- 修复 HTTP 数据目的编辑 URL 回显时机
- 复用 isEmptyVal 校验 JSON 必填参数,允许 0 和 false
2026-05-25 00:44:02 +08:00
YunaiV f3807e30d5 fix(im): 批量修复 P1/P2 问题
- 修复管理端消息内容搜索和私聊双向查询
- 加强 RTC 通话并发状态保护,去除重复接口错误提示
- 支持成员永久禁言
- 脱敏群消息 WebSocket 定向收件人字段
- 更新 IM bug 台账,剩余 P1/P2 共 35 个
2026-05-25 00:28:59 +08:00
YunaiV dc1a582fbd fix(iot): 修复源端 IoT 对齐基线问题
- 收紧物模型标识符前端校验规则
- 修复场景联动设备状态触发器校验
- 修正设备列表状态字段展示
2026-05-25 00:11:19 +08:00
YunaiV 8b06efe5ee fix: 加强 IM 上传 URL 与 RTC 来电载荷校验 2026-05-24 23:41:46 +08:00
YunaiV 309a4bf4d0 fix(im): 强化好友关系、消息历史和前端交互
- 校验群资料字段长度,并在同意好友申请时复验双方用户
- 仅向双向有效好友推送资料更新通知
- WebSocket 推送收件人去重,并忽略空用户编号
- 群聊和私聊历史保留撤回消息记录
- 校验群通话排除发起人后仍需存在被邀请人
- 统一 IM 前端接口参数传递方式
- 抽取全局 URL 安全打开工具,并复用到消息预览
- 防止好友申请同意和拒绝按钮重复操作
- 补充好友、消息、RTC、WebSocket 相关测试
2026-05-24 21:24:15 +08:00
YunaiV 2ede2b371f fix(im): 批量修复 P0 安全边界和通话流程问题
- 拒绝匿名 WebSocket 握手,收紧 RTC 接听和入会忙线校验
- 支持封禁群解散,管理端解散改为独立权限码
- 增加个人表情数量配置、唯一约束和并发重复兜底
- 修复 RTC 异常断开上报、视频远端音频和好友选择大列表渲染
- 让个人表情添加失败透出后端业务错误
- 流转 P0 bug 文档,并按产品取舍记录 apiSecret 默认值不强制拦截
2026-05-24 20:21:00 +08:00
YunaiV 00f273ca77 fix(im):加固好友、群成员与群消息边界流程
- 清理好友重加时的 deleteTime 和历史备注残留
- 清理群成员重入时的 quitTime、muteEndTime 和邀请来源残留
- 允许封禁群成员主动退群,仍拦截已解散群
- 校验群已读游标的消息归属和可见性
- 收窄群消息置顶通知为专用展示对象并同步前端展示
- 回填群成员单查接口的昵称和头像
- 补充相关回归测试并流转 IM bug 状态文档
2026-05-24 18:22:07 +08:00
YunaiV dd009a1de0 优化代码排版 2026-05-24 00:18:49 +08:00
芋道源码 fa42f8e574
Merge pull request #225 from DevDengChao/codex/lint-mall-bpm-misc
chore: fix mall bpm and misc lint
2026-05-23 22:07:05 +08:00
芋道源码 a1c43ed427
Merge pull request #224 from DevDengChao/codex/lint-mp-mes
fix: lint mp and mes views
2026-05-23 22:06:15 +08:00
芋道源码 31a7f6248a
Merge pull request #223 from DevDengChao/codex/lint-iot-ai
chore: fix ai and iot lint
2026-05-23 22:06:03 +08:00
芋道源码 02c0d0cb3b
Merge pull request #222 from DevDengChao/codex/lint-components
fix: lint src components
2026-05-23 21:35:25 +08:00
YunaiV a2fbf5b712 fix: clean up BPMN viewer resize observer 2026-05-23 21:06:20 +08:00
YunaiV cb78c2935d Merge remote-tracking branch 'origin/master' 2026-05-23 18:24:57 +08:00
YunaiV 798318ef7d Merge branch 'master' of https://github.com/yudaocode/yudao-ui-admin-vue3 2026-05-23 18:21:33 +08:00
芋道源码 8971c37059
Merge pull request #221 from HmEJ/feature/bpm
流程图居中显示
2026-05-23 18:21:10 +08:00
芋道源码 7dd7309e9c
!878 fix: 场景联动中设备状态变更配置的参数值(在线-online,离线-offline)与后台实际使用的(在线-1,离线-2)不一致,导致场景不生效。
Merge pull request !878 from 熊猫大侠/master-iot
2026-05-23 09:33:27 +00:00
YunaiV 1612e3e1b6 fix(iot): 场景联动动作类型切换清理逻辑失效
updateActionType 先调 onActionTypeChange(此时 action.type 仍是旧值)
再赋新值,修复 type guard 永远 false 导致切换执行器类型不清空旧
identifier;onActionTypeChange 内恒真的 type !== action.type
简化为 if (action.identifier)
2026-05-22 20:24:58 +08:00
YunaiV 72d8c499a4 feat(im): 修一批管理端统计与成员选择器细节
- 消息趋势 / 用户趋势图表加 loading 态(接口错误由全局拦截器统一提示)
- 群成员选择器 grid 模式补右上角 × 移除按钮
- 统计接口 6 个 API 补全返回值泛型
2026-05-22 20:15:15 +08:00
panda fa653ac887 fix: 优化IoT告警配置支持动态选择邮件、短信、站内信的模板,不再依赖templateCode。 2026-05-22 14:52:50 +08:00
panda 1888757854 fix: 场景联动中设备状态变更配置的参数值(在线-online,离线-offline)与后台实际使用的(在线-1,离线-2)不一致,导致场景不生效。 2026-05-22 10:50:28 +08:00
YunaiV 38ecc4f40c feat(im): 修一批前端性能 / 跨账号防御与侧边栏占位
- friendStore.getFriend 改 friendMap 索引,高频反查从 O(N) 降到 O(1)
- faceStore 加 storeEpoch,切账号后旧表情拉取 / 增删响应不再回写新账号
- friendStore 写路径统一补 epoch 守卫(loadFriendInfo / 单查申请 / 删好友 /
  免打扰 / 置顶 / 拉黑 / 备注),切账号瞬间的旧响应不污染新账号好友状态
- 私聊侧边栏 friend 缺失时给加载占位,替代原本的空白抽屉
2026-05-22 08:38:56 +08:00
YunaiV 9893aedbb2 feat(im): 修一批 WS 健壮性与跨账号防御
- WS 重连改指数退避(1→2→4→8→16→30s + jitter),频率封顶不再固定 3s 形成惊群
- onerror 不再调 reconnect,主动 close 让 onclose 成为唯一重连入口,避免双触计数 +2
- 私聊 / 群消息入口加防御层,senderId / receiverId / 定向 receiverUserIds 不含当前用户的帧直接丢弃
- useMessagePuller 引入 epoch + userId 双重快照,离开 IM / 切账号时旧 pull 写入前自检跳出
- cancelPull 同步清 WS messageBuffer,防止下次进 IM 把旧 session 缓冲帧回放进新 store
2026-05-21 20:02:44 +08:00
YunaiV 5a983bb1eb feat(im): 修一批上传安全与群聊交互问题
- 限制消息媒体上传大小,并让视频独立上传路径复用同一校验
- 禁止发送可执行 / 脚本类文件扩展名
- 切账号时废弃好友 store 未返回请求
- 多选转发过滤撤回 / 系统类消息
- 邀请群成员时前端拦截人数上限
- 允许群管理员 @ 所有人
2026-05-21 17:31:46 +08:00
YunaiV b5bc537f86 feat(alert): simplify alert config loading and display 2026-05-21 17:27:27 +08:00
YunaiV fead282395 feat(im): 修一批正确性 / UX 细节:群名 trim 空、敏感词 / 封禁理由空白校验、默认群名计入创建者、ack 后重算会话摘要、文本重试复用 clientMessageId 防重复 2026-05-21 15:57:46 +08:00
YunaiV 73aa578c9b feat(im): 修管理端 3 处:群消息 atUserNicknames 类型允许 null、移除前端无效的「消息内容」查询入口、表情包宽高加表单校验 2026-05-21 15:10:34 +08:00
YunaiV 7a236b4378 feat(im): 修 L-13/L-16:PagedScroller 加 itemKey 防索引乱位、私聊 Message.targetId 改对端 userId、抽 getPrivateMessagePeerId 收敛 4 处 peer 计算 2026-05-21 14:50:42 +08:00
YunaiV 1015423431 feat(im): 修一批 L 危:window.open 加 noopener、@ 浮层箭头方向跟随定位、置顶展开切群重置、加黑名单取消静默、菜单负坐标兜底、群选择回显跨页补查 2026-05-21 14:25:21 +08:00
YunaiV 3949e0c89f fix(im): 修复 IM 前端批量 UX 状态问题 2026-05-21 13:25:55 +08:00
YunaiV 29b257b8cd feat(im): 修一批状态串扰:群申请列表防同群 WS 推送乱序覆盖、群免打扰同步会话、跨端群已读清 @、联系人 selection 跟随 store、好友申请按钮并发锁 2026-05-21 11:11:36 +08:00
YunaiV 1e08e9fbca feat(im): 修 IM 切账号串号:loadConversations 开头清状态、加 loadedUserId 守门跨账号同 key 误激活、新增 clear() 对齐 friend/group store 2026-05-21 10:06:52 +08:00
YunaiV 69653163b0 feat(im): 修 IM 历史消息切会话串号:loadEarlier 用 getConversationKey 守卫,watch(conversation) 重置分页态 2026-05-21 09:05:44 +08:00
YunaiV 8468d9bf4d feat(im): 修 WebSocket 重复连接:connect 入口检测旧 socket 状态复用 / 重建,disconnect 解绑全部 handler 2026-05-21 08:41:44 +08:00
YunaiV f7cda1fc4e feat(im): 修一组细节:会话 silent 跟随新消息同步、合并末尾刷摘要 + 群 @ 标记、录音 1s 下限、邀请 reload 透 friendIds、pull 游标取最大 id 2026-05-21 01:13:29 +08:00
YunaiV fee633b0c8 feat(iot): 优化代码,尽量使用 ProductStatusEnum 枚举 2026-05-21 00:17:57 +08:00
YunaiV b63492199a feat(im): 对齐微信:免打扰会话改小红点、消息 Tab 二次点击滚动到下一未读、移除工具栏 hover tooltip 2026-05-20 23:57:18 +08:00
YunaiV c6b6e723e0 feat(im): 将 style 尽量多的改成 unocss,ai 友好 2026-05-20 19:38:14 +08:00
YunaiV 0a07d4a2e4 feat(im): 将 style 尽量多的改成 unocss,ai 友好 2026-05-20 13:56:46 +08:00
YunaiV fc812aef26 feat(im): 增加频道消息的已读状态 2026-05-20 01:00:46 +08:00
YunaiV f26c65c03f fix(iot): 固件操作的权限校验 2026-05-20 00:41:32 +08:00
YunaiV 30b963149a feat(im): 修复频道消息的引用展示不对; 2026-05-19 23:57:46 +08:00
YunaiV 9a36cfe933 feat(im): 继续优化频道的各种代码(v4)优化卡片样式 2026-05-19 23:52:11 +08:00
YunaiV 94e5fc00ac feat(im): 继续优化频道的各种代码(v3) 2026-05-19 22:06:38 +08:00
YunaiV 2442a01e48 feat(im): 继续优化频道的各种代码(v2) 2026-05-19 17:48:35 +08:00
YunaiV bfd407d75b feat(im): 继续优化频道的各种代码, 2026-05-19 17:18:48 +08:00
YunaiV b6d123ac72 feat(im): 增加频道的检查 2026-05-19 14:18:08 +08:00
YunaiV 5ebbbf7499 feat(im): 新增频道消息的前端实现 2026-05-19 13:26:32 +08:00
YunaiV 8ad7180c2b fix(CheckOrderForm): remove preselectDisabled option from SKU selection 2026-05-18 21:21:15 +08:00
DevDengChao f5bcaf22f9 chore: fix mall bpm misc lint
Co-authored-by: Codex <codex@openai.com>
2026-05-18 14:19:49 +08:00
DevDengChao 40d762070f fix: lint src components
Co-authored-by: Codex <codex@openai.com>
2026-05-18 14:19:40 +08:00
DevDengChao 7fa9311753 fix lint issues in mp and mes views
Co-authored-by: Codex <codex@openai.com>
2026-05-18 14:18:27 +08:00
DevDengChao 60c74b991e chore: fix ai iot lint
Co-authored-by: Codex <codex@openai.com>
2026-05-18 14:16:58 +08:00
YunaiV c4519a8696 feat(alert): enhance description input to textarea for better usability
feat(movement): add function to retrieve selected inventory keys
2026-05-18 13:30:04 +08:00
YunaiV b52ad0c34b refactor: 前端 IM API 移除 src/api/im/home 中间目录,face / friend / group / message / rtc 直接放在 src/api/im 下 2026-05-18 13:20:43 +08:00
YunaiV 5c2ee259a6 feat(im): 管理后台新增通话记录只读查询(列表 / 详情 / 参与者);im_rtc_participant 增加 call_id 关联 im_rtc_call.id
 feat(im): 管理后台新增通话记录页面(列表 + 详情抽屉 + 参与者表),消息预览补 RTC_CALL_START / END 文案
2026-05-18 12:37:51 +08:00
YunaiV 8329a6a885 feat(im): 振铃超时 Job 单人粒度标 NO_ANSWER + 独立 NO_ANSWER 信令推送
 feat(im): 处理 RTC_CALL(NO_ANSWER) 信令;私聊气泡显示「未接听」
2026-05-18 09:45:32 +08:00
YunaiV 073c54bc1d feat(wms):优化出库的交互,已选择的库存,disabled 掉,体验更好 2026-05-18 08:58:33 +08:00
YunaiV f58d1d88c8 feat(im): 振铃超时 Job 单人粒度标 NO_ANSWER + 独立 NO_ANSWER 信令推送
 feat(im): 处理 RTC_CALL(NO_ANSWER) 信令;私聊气泡显示「未接听」
2026-05-18 08:03:52 +08:00
YunaiV f6963cde37 Merge remote-tracking branch 'origin/master' 2026-05-18 01:03:15 +08:00
YunaiV 0c54bf28b3 fix(iot):物模型编辑回显时,service / event 子字段补数组兜底,避免参数列表绑定 undefined 2026-05-18 01:03:04 +08:00
YunaiV d0cd93de5a chore: fix eslint warnings from vite dev 2026-05-18 00:59:59 +08:00
YunaiV a2d043bc72 fix: normalize scss variable injection on Windows
- normalize injected variables.scss path for Windows Sass
- skip variable-defining scss files to avoid duplicate global variables
2026-05-18 00:47:16 +08:00
YunaiV 7622a44bbb fix:尝试修复 windows 的兼容性:additionalData: `@use "${pathResolve('src/styles/variables.scss')}" as *;`, 2026-05-18 00:31:55 +08:00
YunaiV 12a41da241 feat(im): 修复摄像头关闭后画面卡在最后一帧(pickStream 短路 mute 状态) 2026-05-18 00:26:14 +08:00
YunaiV ae7f3a8bc5 feat(im): 群通话本端拒绝 / 挂断后立即从胶囊条移除自己,无需等后端推回 2026-05-18 00:12:28 +08:00
YunaiV b9b085f1ee feat(im): 群通话本端拒绝 / 挂断后立即从胶囊条移除自己,无需等后端推回 2026-05-18 00:00:53 +08:00
YunaiV dc318c8e75 feat(im): 通话事件接入会话列表预览(私聊补 START 入消息流);文案统一「语音通话」 2026-05-17 22:26:07 +08:00
YunaiV 6cd49f0ce4 feat(im): 修复主叫取消通话时摄像头偶发未关闭的竞态 2026-05-17 21:02:54 +08:00
YunaiV 85207bec98 feat(im): 群通话发起/接听时主动同步胶囊条,避免依赖 webhook 延迟 2026-05-17 20:27:43 +08:00
YunaiV 46c436e0df feat(wms):将首页的枚举值去掉,统一合并到 constants 里,更聚焦点 2026-05-17 18:17:30 +08:00
YunaiV 5d222bdf48 feat(im): 通话窗扬声器开关 + 按钮关闭态统一深色样式 + 群通话支持刷新后重新加入
- useLiveKitRoom 增加 speakerEnabled 状态 + setSpeakerEnabled;audio 元素 :muted 联动,实现扬声器实际开关
- mic / speaker / camera / 屏幕共享 4 个按钮关闭态统一 bg-white/15 深色(之前一直 bg-white 像「开」)
- speaker / camera / 屏幕共享 关闭态 icon 借用 tabler:volume-off / video-off / device-laptop-off 显斜线(ant-design 缺 muted 变体)
- RtcGroupCallBanner 修复刷新后无法重新加入:按钮文案改为「已在通话中 / 重新加入 / 加入」三态;按钮文字色锁定深色防暗色主题不可见
- RtcCallIncoming 对齐微信样式:右上角小条 + 横排(头像 / 名 / 按钮);群聊带「通话成员」头像行
- RtcCallRunning UnoCSS 重写 + 接收 isGroup prop(去 conversationType 派生)
- RtcCallParticipantTile UnoCSS 重写 + speakerEnabled 透传静音
- 注释 / UI 文案半角省略号 → 全角……;watcher 参数 hidden → suppressTick
2026-05-17 17:37:37 +08:00
YunaiV ceb1aa9bce Merge remote-tracking branch 'origin/master' 2026-05-17 17:30:48 +08:00
YunaiV 26a3b87114 feat(iot):移除 DeviceTableSelect.vue、ProductTableSelect.vue 无用组件 2026-05-17 17:30:38 +08:00
YunaiV 03d0ce800d feat(im): 优化群邀请的 running 的交互 2026-05-17 16:46:10 +08:00
YunaiV a3f89d686c Merge pull request #215 from yudaocode/upgrade
# Conflicts:
#	build/vite/optimize.ts
#	package-lock.json
#	package.json
#	pnpm-lock.yaml
2026-05-17 13:56:29 +08:00
YunaiV 68922ebf02 feat(im): 优化群邀请的 incoming、inviting 的交互 2026-05-17 10:36:01 +08:00
YunaiV e629ac3825 feat(im): 增加群 call title(进度)情况 2026-05-16 21:39:44 +08:00
YunaiV 8b4351e4f3 feat(im): 增加群邀请电话的 dialog 2026-05-16 21:39:23 +08:00
YunaiV 28473434da fix: reduce low-risk vue-tsc errors in erp forms
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 18:48:35 +08:00
YunaiV 1f47e3c9d6 feat:增加 ts:check 优化,避免 ai 校验 oom 报错 2026-05-16 17:47:11 +08:00
YunaiV 4f4c64cfff feat(wms):调整 README.md 2026-05-16 15:09:42 +08:00
YunaiV 9a49c2df20 feat(wms):调整 README.md 2026-05-16 14:56:10 +08:00
YunaiV 9b8b1322b7 Merge branch 'wms' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 2026-05-16 14:41:33 +08:00
YunaiV ecb15b6481 feat:更新 README.md 2026-05-16 14:40:33 +08:00
YunaiV a18c81511c fix(wms): 完善单据状态保护与金额精度处理
- 后端补充商品、往来企业唯一性校验
- 单据更新改为按草稿状态条件更新,避免覆盖已完成单据
- 补充 WMS 金额、规格精度迁移 SQL 与测试表结构
- 前端统一明细金额兜底计算,优化完成/作废取消处理
2026-05-15 19:59:45 +08:00
YunaiV b3bb1114ba fix(wms): 完善单据状态保护与金额精度处理
- 后端补充商品、往来企业唯一性校验
- 单据更新改为按草稿状态条件更新,避免覆盖已完成单据
- 补充 WMS 金额、规格精度迁移 SQL 与测试表结构
- 前端统一明细金额兜底计算,优化完成/作废取消处理
2026-05-15 19:48:33 +08:00
YunaiV 50cfbfe58b feat(wms): 统一数量金额精度并清理 schema 脱钩
后端:
- 新增 sql/mysql/wms/20260515_wms_amount_precision.sql
  11 张表金额字段统一升到 decimal(16,2),覆盖 SKU 单价、单据主表/明细
  总金额/行金额、盘库实际金额、库存流水单价/行金额
- 新增 sql/mysql/wms/20260515_wms_sku_dimension_precision.sql
  SKU 长宽高对齐 lite 改为 decimal(10,1)、毛/净重改为 decimal(10,3)
- 测试 SQL create_tables.sql 全量同步生产 MySQL:数量 (20,2)、
  金额 (16,2)、长度 (10,1)、重量 (10,3),修复"测试 schema 与生产
  脱钩"导致单测假阳性的隐患
- WmsWarehouseServiceImpl.validateWarehouseCodeUnique 去掉
  StrUtil.isBlank 提前 return,因 code 已由 VO 层 @NotBlank 强制非空
- WmsWarehouseServiceImplTest 同步调整

前端:
- ReceiptOrderForm / ReceiptOrderDetail 合计行去掉"单价合计"派生展示,
  单价不能跨行相加;保留数量合计与行金额合计

文档:
- review-opus.md 收口至仅剩 F10 (SQL 导出,用户认领)
- 新增 fix-plan.md 与 精度调整-codex讨论.md,沉淀本轮决策依据
2026-05-15 18:52:37 +08:00
YunaiV c81116678a feat(wms): 拆 simple-list 列表 VO、补首页校验与业务单号搜索框
后端:
- 新增 WmsItemListReqVO / WmsMerchantListReqVO,simple-list 接口不再
  复用分页 PageReqVO,Swagger 上不再误暴露 pageNo/pageSize 字段
- WmsItemController / WmsMerchantController 的 getXxxSimpleList 改用
  独立 ListReqVO;Mapper.selectList、Service.getXxxList 同步调整签名
- WmsHomeStatisticsServiceImpl 三个查询入口加 validateWarehouseIfPresent,
  非空 warehouseId 走 warehouseService.validateWarehouseExists 校验,
  避免前端误传任意 id 直接落到首页 SQL
- 新增 sql/mysql/wms/20260515_wms_total_price.sql:幂等给 4 张明细 / 流水表
  补 total_price 列并按 ROUND(quantity*price, 2) 回填历史数据

前端:
- receipt/index.vue + shipment/index.vue 搜索栏补 bizOrderNo 输入控件,
  对齐已声明的 queryParams 与后端 PageReqVO 支持
- WmsHomeOrderSummaryCards.getStatusPercent 改 function 声明,并去掉
  最小 4% 占比下限,保留真实比例
2026-05-15 18:23:59 +08:00
YunaiV fa570c2637 feat(wms): 持久化出入库移库明细行金额并补全库存流水金额展示 2026-05-15 14:11:14 +08:00
YunaiV 2ffbcbd71f feat(wms):打印时,更新、新增的信息整合 2026-05-15 13:25:56 +08:00
YunaiV 524ed28973 feat(wms):打印时的 barcode 标签 2026-05-15 13:12:23 +08:00
YunaiV 508d06b493 feat(wms):更新修复进展 2026-05-15 13:09:30 +08:00
YunaiV f82ae7e0c8 feat(wms):优化整体代码结构 2026-05-15 12:59:11 +08:00
YunaiV 24343f66fc feat(wms):调整 check 的实现 2026-05-15 11:00:14 +08:00
YunaiV 52972506a8 feat(wms):更新修复进展 2026-05-15 10:45:28 +08:00
YunaiV d128df618e feat(wms):增加 code 字段生成(从后端到前端),用户更可控 2026-05-15 10:22:37 +08:00
YunaiV 5f944548a3 fix(wms): 调整文档的最新内容 2026-05-15 09:46:40 +08:00
YunaiV 7bae330828 fix(wms): 移库选择商品时,必须两个仓库都选择完 2026-05-15 09:06:59 +08:00
YunaiV 7ff8cb78e1 feat(wms):统一 4 个订单界面的样式和代码风格 2026-05-15 08:44:08 +08:00
YunaiV 8252f7b068 feat(wms):优化 onlyPositiveQuantity 只查询库存非空的处理。 2026-05-15 08:24:54 +08:00
YunaiV 19db64c08a feat(wms):优化代码的排版 2026-05-14 23:04:50 +08:00
YunaiV e0352af8b0 feat(wms):优化代码的排版 2026-05-14 22:53:53 +08:00
YunaiV ae54f938cf feat(wms):优化首页的代码实现 2026-05-14 22:35:53 +08:00
YunaiV b455ce4949 feat(im): 优化 rtcStore 的命名 2026-05-14 22:15:35 +08:00
YunaiV 58537a34c7 feat(wms):增加首页的 review 2026-05-14 18:53:56 +08:00
YunaiV 4a811fb0bb feat(im): 评审下 rtcStore 的实现 2026-05-14 17:16:46 +08:00
YunaiV 804ad667e0 feat(wms):优化盘库单的实现 2026-05-14 17:03:49 +08:00
YunaiV eaedb1e0ca feat(wms):移库管理,调整合计金额、数量的字段与交互。(前端负责展示,后端负责计算) 2026-05-14 09:46:19 +08:00
YunaiV e579a4de13 feat(im): 优化 rtc 整体弹窗界面 2026-05-14 09:44:39 +08:00
YunaiV df013ac69c feat(wms):出库管理,调整合计金额、数量的字段与交互。(前端负责展示,后端负责计算) 2026-05-14 09:07:26 +08:00
YunaiV 6f96d004a9 feat(wms):入库管理,调整合计金额、数量的字段与交互。(前端负责展示,后端负责计算) 2026-05-14 08:39:04 +08:00
YunaiV 44808eb3f4 feat(wms):调整 order_time 放到【仓库】后面 2026-05-14 00:02:03 +08:00
YunaiV a7911bcbcf feat(wms):增加 order_time 单据字段 2026-05-13 23:31:03 +08:00
YunaiV a170ae37ab feat(im): 优化消息的 format 相关的逻辑,从 user 抽到 message 工具类里,更加统一 2026-05-13 23:27:02 +08:00
YunaiV 841d2cb763 feat(im): 统一 im 的 api 风格,保持一致性 2026-05-13 22:58:09 +08:00
YunaiV 8d06f87e0f feat(wms):减法,去掉批次号等字段 2026-05-13 22:06:37 +08:00
YunaiV fdbb98fe65 feat(wms):减法,去掉 area 表 2026-05-13 20:29:25 +08:00
YunaiV c5948d405e feat(wms):减法,去掉 detail 表,和 mes 更对齐 2026-05-13 18:42:51 +08:00
YunaiV 70aff05ef5 feat(wms):新增移库、盘库管理 2026-05-13 09:47:45 +08:00
YunaiV b3b35e147b feat(wms):新增出库管理 2026-05-13 08:57:41 +08:00
YunaiV 765c8ea94f feat(wms):修复只能删除作废的入库单的问题 2026-05-13 00:42:29 +08:00
YunaiV ac49ba5c6d feat(wms):增加供应商 select 组件 2026-05-12 23:34:45 +08:00
YunaiV 3ef4e8424f feat(wms):增加入库列表的评审 2026-05-12 23:30:06 +08:00
YunaiV c865dfe488 feat(wms):进一步优化入库单的后端实现(对齐 mes) 2026-05-12 23:02:46 +08:00
YunaiV 18e5c97bf3 feat(im): 将后端的 roomName 和 callId 融合,简化字段和逻辑(一致性更好、概念更简洁) 2026-05-12 20:29:08 +08:00
HmEJ 680c0e0e8b feat: 使流程图居中显示 2026-05-12 16:50:13 +08:00
YunaiV 38cb980ce4 feat(im): 完善 rtc 的后端代码逻辑,各种代码风格的优化 2026-05-12 13:17:04 +08:00
YunaiV 0be2674277 feat(wms):增加 inv 库存的新增、修改方法,并提供相关单测 2026-05-12 11:14:21 +08:00
YunaiV f0cd639137 feat(wms):优化 inventory history 2026-05-11 15:11:39 +08:00
YunaiV 314293ced3 feat(wms):优化 inventory 的实现 2026-05-11 14:10:16 +08:00
YunaiV 32bbd912a2 feat(wms):增加 inventory history 2026-05-11 13:07:35 +08:00
YunaiV 32442830b0 feat(wms):增加 inventory 2026-05-11 09:45:24 +08:00
YunaiV 711d5abc0a feat(wms):完善往来企业 2026-05-10 23:56:28 +08:00
YunaiV 4da16e95f5 feat(wms):完善商品信息、SKU 信息 2026-05-10 22:46:23 +08:00
YunaiV d890781149 feat(wms):增加商品信息、SKU 信息 2026-05-10 21:33:42 +08:00
YunaiV 30e4fef7bb feat(wms):增加商品分类、商品品牌。 2026-05-10 16:38:25 +08:00
YunaiV 8105cc786a (〃'▽'〃)_v2026_04_发布:新增代码生成器 Excel 导入,增强 IoT 场景联动与数据流转 2026-05-10 10:59:52 +08:00
YunaiV eb8002ce0b chore: make build scripts cross-platform
- use cross-env for NODE_OPTIONS in build commands
- align local/dev/test/stage/prod build scripts with Vite modes
- add cross-env to pnpm lockfile
2026-05-10 10:01:08 +08:00
YunaiV 1aad2f1648 feat(wms):迁移到 md 更整体 2026-05-10 09:02:51 +08:00
YunaiV c3737d3b7a feat(wms):增加 warehouse 功能 2026-05-10 01:22:38 +08:00
YunaiV 750f25410c feat(im): 基于 livekit 构建 im 通话(语音聊天、视频聊天、共享桌面)v0.1:推进中 2026-05-09 15:23:07 +08:00
YunaiV e12596ad7c ♻️ refactor(im): 移动 IM 相关 API 引用至新路径 2026-05-09 01:25:03 +08:00
YunaiV 2935d7d112 feat(im): 拆出私聊 / 群聊已读两个全局开关,关闭后禁用接口与所有 UI 入口(含群回执)
ImProperties.message 新增 privateReadEnabled / groupReadEnabled,前端 config.ts 同步镜像。关闭后:
- 后端:read 系列接口(read / getMaxReadMessageId / getGroupReadUserIds)抛业务异常;sendGroupMessage 强制 NO_RECEIPT 忽略 receipt=true;pull 群消息跳过 Redis 已读游标读取与 readCount 补齐
- 前端:气泡已读标签 / 群回执 popover / 「发送回执消息」下拉入口 / admin 列表「状态」「回执」列与详情对应字段按开关隐藏;自动上报 / 冷启动同步对方已读位置 / WS READ & RECEIPT handler 全部按开关短路兜底,避免打到禁用接口
- 单测:补 @Spy ImProperties 修复原本就在的 NPE,加 disabled 分支断言
2026-05-09 01:07:18 +08:00
YunaiV 46b06b0444 【新增】IM:群头像支持成员头像九宫格兜底
群头像为空时,取前 9 个成员头像在 Canvas 上拼九宫格 dataURL;空头像 / 加载失败的格子画跟 UserAvatar 同款色卡(首字 + charCode 哈希调色板)。
- 新增 GroupAvatar 组件包一层 UserAvatar;按容器 size × DPR 自适应画布像素,避免 retina 屏糊
- utils/group.ts 加 buildGroupAvatar 与 LRU 缓存 facade(上限 200);utils/image.ts 抽公共 loadImage;utils/user.ts 抽 getAvatarText / getAvatarBgColor 供 UserAvatar 与拼图共用
- GroupItem / GroupInfo / ConversationItem / ConversationPickerPanel 按会话类型分支换用 GroupAvatar
2026-05-08 18:28:02 +08:00
YunaiV 70e7a1c900 【新增】IM:群头像支持成员头像九宫格兜底
群头像为空时,取前 9 个成员头像在 Canvas 上拼九宫格 dataURL;空头像 / 加载失败的格子画跟 UserAvatar 同款色卡(首字 + charCode 哈希调色板)。
- 新增 GroupAvatar 组件包一层 UserAvatar;按容器 size × DPR 自适应画布像素,避免 retina 屏糊
- utils/group.ts 加 buildGroupAvatar 与 LRU 缓存 facade(上限 200);utils/image.ts 抽公共 loadImage;utils/user.ts 抽 getAvatarText / getAvatarBgColor 供 UserAvatar 与拼图共用
- GroupItem / GroupInfo / ConversationItem / ConversationPickerPanel 按会话类型分支换用 GroupAvatar
2026-05-08 18:27:53 +08:00
YunaiV c5b082ca80 ♻️ refactor(im): 业务策略数值从 ImCommonConstants 上移到 ImProperties(按 group / message 子模块分组),常量类仅保留 AT_USER_ID_ALL 协议契约值
♻️ refactor(im): 抽出 utils/config.ts 集中数值常量,按业务域统一前缀(GROUP_ / MESSAGE_ / FRIEND_ / CONVERSATION_ / FORWARD_),constants.ts 只留协议枚举与契约值
2026-05-08 17:42:13 +08:00
YunaiV dfd5b39a17 feat(im): MessageForwardDialog 接入「创建聊天」分支 + 收尾打磨
- MessageForwardDialog 加 view: 'conversation' | 'contact' 切换:
  - 模板按 view 切 ConversationPickerPanel / FriendPickerPanel;dialog header 用 slot 渲染「← 返回」
  - handleSwitchToContact 切 view + 清留言(避免不可见输入框留言被静默发出)
  - handleCreateGroupAndSend 复用 forwardToTarget(newConversation),merge / single 都按 mode 自动跑
  - 成功 / 失败统一末尾退多选 + 关弹窗,避免源会话遗留多选态
- 顺手清掉 GroupMemberAddDialog / MessageForwardDialog 末尾多余空行

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:16:01 +08:00
YunaiV 312df4c73d refactor(im): 抽象 IM 选择类弹窗为 PickerPanel 体系,对齐微信 PC
- 拆「业务壳 + 纯 PickerPanel」两层;13 个 dialog 统一 ref + open(opts) 接口
- 新增 FriendPickerPanel / ConversationPickerPanel / GroupMemberPickerPanel
- 抽 useFriendBuckets / useSelectedItems composable + buildDefaultGroupName / picker-dialog.scss mixin
- conversationStore 加 recentForwardConversationKeys 系列 action(持久化到 IDB)
- 三态语义固化:hide > locked > disabled
- 圆形勾选用微信绿;主按钮跟随项目主题色;最近转发横向头像 + 移除模式
- 删 GroupMemberSelector(由 GroupMemberPickerPanel 替代)/ FriendLite.deleted 死字段
- 配套:project_duibiao/im/dialog-picker-{contract,wechat-compare}.md
2026-05-08 14:06:48 +08:00
YunaiV 40ac2daca8 feat(im):文本气泡 @ 高亮支持点击 + URL 自动识别成可点击链接
- @ 段:群消息按 atUserIds 反查群成员,候选 name 兼容历史字面量(真实昵称 / 好友备注 / 群自定义昵称),displayName 统一收敛到 nickname,让历史消息也能渲染成 @真实昵称;@ 段点击弹 UserInfoCard
- @所有人:注入 IM_AT_ALL_USER_ID 虚拟候选,对齐微信 PC 仅高亮配色不挂点击
- 同名歧义:同字面量对应多个 userId 时标记 ambiguous,parser 整段消费成普通文本,避免错绑用户
- URL:识别 http(s) / www. 起头链接,<a target="_blank"> 新标签打开;默认补 https://
- TipSegment 加 link 变体作为统一文本片段类型,TEXT 气泡与灰条 tip 共用 TipSegments 组件渲染
- MessageInput @ token 文本统一用真实昵称,不再掺好友备注 / 群自定义昵称
2026-05-08 01:23:09 +08:00
YunaiV 094ab44094 🎨 refactor(im): joinMentionSegments 用 flatMap 替代命令式 push
少一个可变 out + 命令式 forEach,意图更直观

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 23:59:00 +08:00
YunaiV 9eb221e8d2 feat(im): 灰条 tip 文案的 mention 段支持点击弹 UserInfoCard
群广播 / 撤回 / 好友事件 tip 文案从纯字符串拆成 TipSegment[],mention
段携带 userId,渲染层挂点击 → uiStore.openUserInfoCardAtEvent。

- utils/message.ts:加 TipSegment 协议 + 零依赖 helper
- utils/user.ts、utils/conversation.ts:加 segments builder,string 版
  改写为 segmentsToText 包装,避免 case 表分叉
- TipSegments.vue:按 activeConversation 推断 addSource,群里走
  GROUP+群名、私聊走 SEARCH;nickname 不传备注避免 UserInfo 首屏闪
- MessageItem.vue / MessageHistory.vue:tip 块切 <TipSegments>

顺手补:utils/constants.ts 新增 SystemUserSexEnum,替换 IM 模块 sex
硬编码 1 / 2

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 23:46:50 +08:00
YunaiV 5b85a4c469 feat(im): 浏览器标签 title 拼上未读数前缀 2026-05-07 22:17:03 +08:00
YunaiV 7fa1dbc55c 🐛 fix(im): 当前打开的会话在列表里不再展示 [草稿] 前缀 2026-05-07 21:55:45 +08:00
YunaiV cc93b8a742 feat(im): 初始化消息转发 v0.4:第四次评审(语音播放器资源释放打磨)
agent 三轮复审后的质量打磨,无功能变更。

- useVoicePlayer.stop:audio.removeAttribute('src') + audio.load() 替代 audio.src = '';不会触发空 src 加载的 error 事件,也能让浏览器立即释放底层 decoder buffer
- useVoicePlayer.play:同 key 再点的 stop() 改 stop(key),意图自解释(我想停的就是我自己)
- useVoicePlayer 移除未消费的 currentKey 暴露;调用方都走 isPlaying(key) 派生
- home/index.vue onUnmounted 追加 voicePlayer.stop():模块级单例 audio 不会随视图卸载自动停,补主壳兜底
2026-05-07 21:46:33 +08:00
YunaiV 0b07091e79 🐛 fix(im): 修复切会话 watch 仅监听 targetId 导致私聊与群聊 id 同号时不触发
home/index.vue 已读 watch、MessagePanel 滚动 / 侧栏 / 群资料预拉 watch 都只看 targetId,
私聊 1 切群 1 时不会触发,会把侧栏 / 新消息浮窗 / 滚动状态 / 已读上报漏掉,且不跑 ensureGroupData。
对齐多选 + 语音那两条 watch,统一改成监听 [type, targetId]。
2026-05-07 21:26:40 +08:00
YunaiV 0323566878 feat(im): 初始化消息转发 v0.3:第三次评审(语音播放全局互斥)
新点的语音停掉旧的,对齐微信 PC 语义;一次只播一条,主面板 / 历史抽屉 / 合并详情共享同一播放态,避免多窗口同时出声。

- 新增 useVoicePlayer composable:模块级单例 currentTask + play / stop;ended / error / play().catch 全部 once: true 收尾,避免 listener 泄漏;play(key, url) / stop(key?) / isPlaying(key) 以 Symbol 当播放身份
- MessageBubble setup 里 Symbol('im-message-bubble-voice') 生成实例级 voiceKey;voicePlaying 改成派生 computed,移除本地 currentAudio
- MessageBubble 卸载兜底:调 voicePlayer.stop(voiceKey) 仅停自己;防止删除消息 / 历史抽屉切筛选导致气泡消失但 audio 仍在响;不会误伤别处仍可见的同 url 气泡
- MessagePanel 切会话 watch 追加 voicePlayer.stop()
- MessageHistory 关闭抽屉 watch 追加 voicePlayer.stop()
- MessageMergeDetailDialog handleClose 追加 voicePlayer.stop()
2026-05-07 21:26:12 +08:00
YunaiV 82d065c270 feat(im): 初始化消息转发 v0.2:第二次优化部分代码(一些工具类等) 2026-05-07 20:34:09 +08:00
YunaiV cf01143632 feat(im): 初始化消息转发 v0.1:第一次评审 2026-05-07 19:47:27 +08:00
YunaiV 9bcdc92806 feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 19:07:37 +08:00
YunaiV f5936a6e7f feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 18:01:43 +08:00
YunaiV d175fe86be feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 17:28:16 +08:00
YunaiV ce66a507ef feat(im): 初始化群名片 v0.2:第二次评审(需求各种进群的小问题) 2026-05-07 17:25:03 +08:00
YunaiV 65d5aacac9 feat(im): 初始化群名片 v0.1:第一次评审 2026-05-07 13:07:56 +08:00
YunaiV 808ad575fc feat(im): 初始化群申请 v0.5:第六把 review(性能 / 健壮性 / 简洁度收口)
后端
- createInviteRequestList N+1 → 3 SQL:批量 select IN + update IN + insertBatch;20 人邀请从 40 RTT 降到 3 RTT
- service 不再出现 mybatis:复用记录的 update(null, wrapper) 下沉到 Im{Group,Friend}RequestMapper.update*Reset helper
- inviteGroupMember 入参去重切 hutool:CollUtil.subtractToList(CollUtil.distinct(...), activeMemberUserIds)
- 删除 dead 字段 inviterUserId(GroupRequestApprovedNotification / GroupRequestRejectedNotification):前端不再消费

前端
- 1505 / 1506 通知改静默:同意走群事件 1509 / 1510 渲染系统提示,拒绝不再打扰
- 修竞态:addByRequestId 校验 handleResult === UNHANDLED,避免 1503 在途时被 1505 / 1506 抢先后又把已处理记录塞回未处理列表
- 修复 dialog 复用记录刷新:watch key 含 inviterUserId / applyContent,同 id 不同内容也触发 refetch;actingId 期间跳过避免本端动作多余 RTT
- 修复 willGoApproval 误报:group.ownerUserId 兜底群主;members 未到位时保守按非审批处理
- unhandledCountMap memoized getter:O(N) 扫一次缓存到 Map,ConversationItem 直读 Map 消除 O(N×M) 重复 filter
2026-05-07 08:13:27 +08:00
YunaiV cb26df3ca1 feat(im): 初始化群申请 v0.4:第五把 review(多轮 finding 修复 + 通知静默化)
- 邀请路径写 addSource=INVITE;群主 / 管理员邀请绕过审批;inviteGroupMember 入参去重
- getGroupRequest 越权校验加成员有效状态判断;新增 list-by-group 接口
- 申请列表按 update_time 倒序,update(null, wrapper) 路径手动刷 updateTime
- addByRequestId 不再 skip 同 id,复用记录刷新并置顶
- GroupRequestListDialog 单群模式订阅 store 增量同步;GroupMemberAddDialog 审批分支文案区分
- ConversationItem 增加 [X 条进群申请] 红字前缀;MessagePanel 顶部胶囊横幅
- 1505 / 1506 通知改静默:同意走群事件渲染系统提示,拒绝不再打扰;清掉 dead inviterUserId 字段
2026-05-07 00:51:48 +08:00
YunaiV b2ba42049b feat(im): 初始化群申请 v0.3:第四把 review(优化界面,进一步对齐微信界面)【之前提交错了】 2026-05-06 23:57:54 +08:00
YunaiV f746aebe08 feat(im): 初始化群申请 v0.3:第四把 review(优化界面,进一步对齐微信界面) 2026-05-06 23:57:03 +08:00
YunaiV 0eca952c6a feat(im): 初始化表情包 v0.3:第四把 review(增加表情管理的界面) 2026-05-06 23:00:08 +08:00
YunaiV a98e32554c feat(im): 初始化表情包 v0.2:第三把 review 2026-05-06 21:08:46 +08:00
YunaiV 2f513f7b8f feat(im): 初始化群申请 v0.2:第三把 review 2026-05-06 20:51:45 +08:00
YunaiV 8eebfd4744 feat(im): 初始化表情包 v0.1:第二把 review 2026-05-06 20:50:55 +08:00
YunaiV 1ed5dc7e6a feat(im): 初始化表情包 v0.0:第一把 review 2026-05-06 19:42:19 +08:00
YunaiV 8fc5273a88 feat(im): 初始化群申请 v0.1:第二把 review 2026-05-06 18:52:30 +08:00
DevDengChao 81711a98c9 docs: 删除依赖升级备注 2026-05-06 16:55:01 +08:00
DevDengChao 766b3906fa docs: note sequential build verification
Co-authored-by: OpenAI <support@openai.com>
2026-05-06 16:30:35 +08:00
DevDengChao cd63cf2b34 chore: remove e2e tests and playwright
Co-authored-by: OpenAI <support@openai.com>
2026-05-06 16:24:25 +08:00
DevDengChao 84ae85f545 chore: upgrade runtime dependencies
Co-authored-by: OpenAI <support@openai.com>
2026-05-06 16:13:36 +08:00
DevDengChao 78b6679e63 chore: upgrade dev tooling dependencies
Co-authored-by: OpenAI <support@openai.com>
2026-05-06 16:07:04 +08:00
DevDengChao ee5ed1f97b merge: upstream master into upgrade
Co-authored-by: OpenAI <support@openai.com>
2026-05-06 16:00:18 +08:00
YunaiV 3be0daf115 feat(im): 初始化群申请 v0.0:第一把 review 2026-05-06 14:53:47 +08:00
YunaiV 4868d69ed8 feat(im): 优化名片消息类型 v0.4:增加转发成功失败的提示 2026-05-06 12:18:31 +08:00
YunaiV 1ac0650984 ♻️ refactor(im):注释对齐 + patchMessage 复用 applyServerMessageUpdate
- recomputeConversationLast / videoCoverUrl / showSendingLoading 三处 JSDoc 跟实现对齐:
  原描述还停留在旧设计(lastSendTime 不重算 / 占位 coverUrl 用 blob / 「外层 loading 多余」),
  这轮一并改成当前事实,避免后续维护被误导
- patchMessage 删手写 revoke + Object.assign,改调 applyServerMessageUpdate,
  与 ackMessage / insertMessage(existingIndex) 共用一份服务端字段合并语义;
  「值未变早返回」保留在 patchMessage 顶部
- 抽 BLOB_URL_PREFIX 常量替代散落在 utils/message.ts 与 useMediaUploader.ts 的 3 处 'blob:' 字面量
2026-05-06 10:38:43 +08:00
YunaiV 30d695d702 🐛 fix(im):codex 评审修复发送中状态边角
- recomputeConversationLast 空 messages 时一并清 lastSendTime,
  避免刷新后被 drop 的媒体占位让空会话仍按旧时间排在列表前面
- 视频占位 coverUrl 不再赋 blob URL:<video poster> 期待图片资源,
  传 video blob 在部分浏览器会退化成黑底,cover 等 probe 出真实 URL 后由 commit 阶段一起 patch
- useMediaUploader 暴露 requireMediaHandler typed accessor,
  消除 video 链路 mediaTypeHandlers[VIDEO]! 非空断言
- MessageItem 把外层 loading 的 (!isUploading || isVoice) 抽成 showSendingLoading computed
2026-05-06 10:18:49 +08:00
YunaiV 459eaa5428 ♻️ refactor(im): 优化消息存储逻辑,减少不必要的处理
改进消息存储时的处理逻辑,通过提前检查是否存在 _localFile 来优化性能,避免不必要的全量映射操作。
2026-05-06 08:50:13 +08:00
YunaiV 59aab8ecdc feat(im): 优化名片消息类型 v0.3:增加表情选择 2026-05-06 08:47:18 +08:00
YunaiV b17f7a57e5 feat(im): 优化发送中的能力 v0.2:简化各种 kind、复用各种逻辑 2026-05-06 08:46:33 +08:00
YunaiV 957a63f8f4 feat(im): 优化名片消息类型 v0.2:优化转发弹窗的界面样式 2026-05-06 08:33:03 +08:00
YunaiV c15d75ba91 feat(im): 优化发送中的能力 v0.1:各种清理时的边界 2026-05-06 08:22:41 +08:00
YunaiV 3836467481 feat(im): 优化名片消息类型 v0.1:补充缺失的名片展示 2026-05-06 08:21:52 +08:00
YunaiV f3de29f95f feat(im): 增加名片消息类型 2026-05-06 08:00:36 +08:00
YunaiV 8f2eddea4a feat(im): 增加发送中的能力,针对图片、文件、视频等 2026-05-06 08:00:23 +08:00
YunaiV f8cc9d14d9 feat(im): 优化下禁言弹窗的样式 2026-05-05 22:51:26 +08:00
YunaiV 5bd99c53c2 🐛 fix(im):codex 评审修复 FRIEND_ADD / FRIEND_DELETE 接收方 peer 与 clear 气泡
- FRIEND_ADD 接收方 peer 改按帧 sender / receiver 反推:becomeFriends 单条入库后双方收到同一份 payload,payload.friendUserId 固定是 toUserId,本端真正的对端要看自己是 sender 还是 receiver;新增 websocketStore.computeFriendPeerId 算好后传给 friendStore.applyFriendAdd/DeleteNotification
- FRIEND_DELETE clear=true 跳过气泡插入:clear 语义是清会话本身,气泡分支按 isFriendDeleteWithClear 校验,避免在已清会话里写虚拟消息

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 22:32:04 +08:00
YunaiV c653c2fa2b feat(im): 增强消息处理逻辑,支持好友通知与撤回消息 2026-05-05 22:15:48 +08:00
YunaiV 4e181564b8 feat(im): 清理一些 TODO 的修复 2026-05-05 22:04:45 +08:00
YunaiV a9f54fdee1 feat(im): 重构普通消息类型,和 openim 的消息编号对齐 2026-05-05 21:56:05 +08:00
YunaiV 055d4bab27 feat(im): 联动好友 / 群通知重构,抽 useMuteOverlay 统一禁言拦截与媒体上传公共骨架 2026-05-05 21:33:27 +08:00
YunaiV e48316231c feat(im): 增加好友申请的管理界面 2026-05-05 19:36:29 +08:00
YunaiV 390b66aee8 feat(im): 群禁言/封禁 UI 交互 + 群主解散群聊
一、群禁言交互
- MessageItem 右键菜单新增「禁言/解除禁言/移除」(权限校验)
- 新增 GroupMuteMemberDialog 禁言时长选择弹窗
- ConversationGroupSide 新增「全群禁言」开关
- MessageInput 新增禁言/封禁覆盖层,拦截所有发送入口
- canManageSender 目标角色未知时不展示管理菜单
- 全群禁言群主按 ownerUserId 直接豁免,不依赖成员列表

二、群封禁(GROUP_BANNED 1533)
- constants 激活 GROUP_BANNED 常量,扩展 isGroupNotification 范围
- groupStore 处理 1533 事件,实时更新 banned 字段
- MessageInput 覆盖层最高优先级判断 banned(红底)
- Group 类型、convertGroup 映射 banned 字段

三、禁言事件(1512-1515)
- constants 激活 GROUP_MEMBER_MUTED / CANCEL_MUTED / MUTED / CANCEL_MUTED
- groupStore 处理 1512-1515 事件,更新 muteEndTime / mutedAll
- user.ts 新增 4 条禁言 + 2 条封禁通知文案
- GroupNotificationPayload 扩展 mutedUserId / muteEndTime / banned

四、群主解散群聊
- ConversationGroupSide 底部按钮:群主显示「解散群聊」,非群主显示「退出群聊」
- 新增 handleDissolve 实现(二次确认 → dissolveGroup API → 清本地数据)
2026-05-05 18:41:28 +08:00
芋道源码 9d8d0647be
!877 feat(system): 优化用户选择 UserSelectV2 布局,多选支持、默认选中当前用户支持、禁选支持、默认部门支持,可替代…
Merge pull request !877 from 半栈幼儿员/hotfix/user
2026-05-05 10:10:47 +00:00
YunaiV 7b4c7028a0 feat(im):群禁言功能(阶段三管理后台 UI)
1. group API 新增 mutedAll 字段 + 3 个禁言接口(muteAll、muteMember、cancelMuteMember)
2. group member API 新增 muteEndTime 字段
3. 管理后台群列表新增「全群禁言」列(已禁言/未禁言标签)
4. 群详情抽屉新增「全群禁言」状态行 + 成员表新增「禁言状态」列(禁言中 + 到期时间)
2026-05-05 16:58:51 +08:00
YunaiV 4d006f8e73 feat(im):将"免打扰"字段从 muted 全量重命名为 silent(DO/VO/Service/Mapper/测试/SQL + 前端 types/store/组件/管理后台),为后续 mute 禁言功能腾出词族 2026-05-05 13:51:53 +08:00
preschooler 536e54062e feat(system): 优化用户选择 UserSelectV2 布局,多选支持、默认选中当前用户支持、禁选支持、默认部门支持,可替代项目所有位置,可移除原 UserSelectForm、UserSelect,避免一次性查询所有用户 2026-05-05 12:35:31 +08:00
YunaiV dd75c702db feat(im):删好友「同时清空聊天记录」弹窗 + 顶部「对方还不是你的朋友」胶囊(点击弹 UserInfoCard)+ fetchFriends 不动 DISABLE 尊重用户选择 2026-05-05 00:57:58 +08:00
YunaiV 2a55748296 feat(im):增加好友删除时,增加是否删除本地聊天的选项 2026-05-05 00:33:06 +08:00
YunaiV 1400bd80dd 🐛 fix(im):loadFriendRequest 按 id 大小决定插入位置,老 id 不入避免破坏倒序 + loadMore 重复 push 2026-05-04 23:06:12 +08:00
YunaiV 14e3f85cb0 ♻️ refactor(im):用户申请列表,增加流式查询,避免一次性加载过多,或者历史无法被加载到。 2026-05-04 22:46:20 +08:00
YunaiV 9fc25b7109 ♻️ refactor(im):friendStore 修 setMuted/removeFriend 一致性 + 新申请直推列表 + 清 dispatcher 防御兜底 2026-05-04 21:13:36 +08:00
YunaiV 45bac49ec0 ♻️ refactor(im):friendStore 回调参数 f 改全名 friend / existing 2026-05-04 19:52:44 +08:00
YunaiV b242b017c0 feat(im):fetchFriends 加 pending 去重 + FRIEND_APPLICATION 重命名 RECEIVED + inflight 命名调整为 pending 2026-05-04 19:14:51 +08:00
YunaiV cfd152addf feat(im):实现 1209 FRIEND_INFO_UPDATED 推送(system 发 AdminUserProfileUpdateMessage,IM Consumer 监听后批量推好友多端) 2026-05-04 18:24:08 +08:00
YunaiV 7618d58a66 feat(im):好友模块 code review 多项修复(补 block/unblock 全链路 + UserInfo 菜单入口、silent 后主动入库、防 currentUserId 切账号失活、雪崩去重与命名/枚举清理) 2026-05-04 17:31:21 +08:00
YunaiV 5c2a185ff9 【IM 优化】通讯录顶部搜索栏改为 h-14,与消息 Tab 顶部对齐,避免切换抖动 2026-05-04 16:47:33 +08:00
YunaiV 42566d1e86 feat(im): 优化好友申请逻辑,增加自我添加校验与异常处理
更新好友申请功能,使用 computed 包裹当前用户 ID,避免在 keep-alive 实例中持有旧 ID。增加自我添加好友的校验逻辑,防止用户添加自己为好友。同时,增强自动通过好友申请的异常处理,确保在事务提交后能正确处理失败情况。
2026-05-04 16:41:55 +08:00
YunaiV 7141e431e2 feat(im): 前端增加「黑名单」的操作 2026-05-04 16:24:12 +08:00
YunaiV 1b51926b19 refactor(im): 移除 TIP_TIME 消息类型,时间分隔条改为渲染时按 prevMessage.sendTime 计算
顺带修复 Bug-Y(删除最后一条消息后孤立时间分隔条)
2026-05-04 16:05:23 +08:00
YunaiV 63c4dd1096 fix(im):修复对话置顶被关闭时,默认还选择了第一个置顶对话,导致又被打开。 2026-05-04 12:00:03 +08:00
YunaiV b6ca1187b1 feat(im): 增加好友申请的逻辑(v1.3:修复各种边界情况,包括静默添加好友) 2026-05-04 11:08:03 +08:00
YunaiV 89ee5d51ea feat(im): 增加好友申请的逻辑(v1.2:增加相关枚举、字典,减少硬编码) 2026-05-04 10:44:09 +08:00
YunaiV 5b9acb4813 fix(im):从群聊,点击好友聊天时,关闭之前的群聊面板 2026-05-04 10:31:02 +08:00
YunaiV 0e979a9f67 fix(im):私聊头像,也可以点击,方便好友管理。 2026-05-04 10:30:30 +08:00
YunaiV ce2cdc112f fix(im):仅普通消息进行声音通知 2026-05-04 10:29:41 +08:00
YunaiV 1469d8bb3d feat(im): 增加好友申请的逻辑(v1.1:增加各种 code review 注释) 2026-05-04 09:47:25 +08:00
YunaiV f86cd30af4 feat(im): 增加好友申请的逻辑(v1) 2026-05-04 09:18:35 +08:00
芋道源码 5e937d797d
!851 feat:增加说明文案
Merge pull request !851 from steven/feat-自定义海报代码补充开发
2026-05-03 10:59:47 +00:00
芋道源码 3a1f520dc6
!876 回退 'Pull Request !870 : fix: 菜单名称过长时没有正确显示省略号'
Merge pull request !876 from 芋道源码/revert-merge-870-master
2026-05-03 10:55:53 +00:00
芋道源码 5e6b6bdd8e
回退 'Pull Request !870 : fix: 菜单名称过长时没有正确显示省略号' 2026-05-03 10:55:35 +00:00
YunaiV 53b96f87a0 Merge remote-tracking branch 'origin/feat/mes' into feat/mes 2026-05-03 18:48:25 +08:00
YunaiV b7a13a0000 ♻️ refactor(service): 优化请求拦截器中的 token 设置逻辑,简化白名单判断 2026-05-03 18:48:12 +08:00
YunaiV 6d5705b655 fix(bpm):修正流程实例审批弹窗网关分支重算的并发与提交问题
- 提交时不再用节点表单值覆盖 data.variables;与预览阶段使用同一份合并变量
- onChange 加 useDebounceFn(300ms) + 请求序号去重,handleAudit 提交前 await 最新一轮重算
- 切换任务时重置请求序号与 pending 重算
- 改用 form-create 官方 formData() 取节点表单当前值
- 双 nextTick 改为 until 等 fApi 就绪,1s 兜底超时
2026-05-03 18:48:12 +08:00
YunaiV 8571a27a15 fix: 【framework】关闭 TagsView 标签后 keep-alive 缓存未收缩,导致 DOM/JS heap 不回收
delView/delAllViews 误用 delCachedView,关闭非当前标签时会去删 currentRoute
对应的缓存,把要关的 name 留在 cachedViews 里,keep-alive include 不收缩,
旧组件实例无法 unmount。

回退到基于剩余 visitedViews 重建 cachedViews 的实现(对应 5718c7881 之前的写法);
delCachedView 自身保留 issue #180 的修复,仍供 refreshPage 使用。
2026-05-03 18:48:12 +08:00
YunaiV cdcd200c7d 【修复】form-create 单图上传规则 disabled 字段标题与默认值错配 2026-05-03 18:48:12 +08:00
YunaiV 6232330c81 【修复】IoT 场景联动:事件触发器比较值改普通文本输入,允许留空(事件发生即匹配) 2026-05-03 18:48:12 +08:00
YunaiV 418f0c4f52 🐛 fix(system):修复租户 get-by-website 接口不支持端口的问题
🐛 fix(mes):修复常见缺陷的「检测项类型」错用独立字典的问题

「常见缺陷」与「检测项设置」的「检测项类型」语义一致,应共用同一份字典;DefectForm 与列表页统一改为 MES_INDICATOR_TYPE,并清理未使用的 MES_DEFECT_TYPE 常量。
2026-05-03 18:48:12 +08:00
YunaiV 5bce60fd29 ♻️ refactor(service): 优化请求拦截器中的 token 设置逻辑,简化白名单判断 2026-05-03 18:48:04 +08:00
YunaiV beddbe7785 Merge remote-tracking branch 'origin/feat/mes' into feat/mes 2026-05-03 18:39:16 +08:00
芋道源码 2e65691737
!870 fix: 菜单名称过长时没有正确显示省略号
Merge pull request !870 from 李家辉/fix-text-overflow
2026-05-03 10:38:57 +00:00
YunaiV 95cecc8870 fix(bpm):修正流程实例审批弹窗网关分支重算的并发与提交问题
- 提交时不再用节点表单值覆盖 data.variables;与预览阶段使用同一份合并变量
- onChange 加 useDebounceFn(300ms) + 请求序号去重,handleAudit 提交前 await 最新一轮重算
- 切换任务时重置请求序号与 pending 重算
- 改用 form-create 官方 formData() 取节点表单当前值
- 双 nextTick 改为 until 等 fApi 就绪,1s 兜底超时
2026-05-03 18:38:18 +08:00
YunaiV 7a4300116e fix: 【framework】关闭 TagsView 标签后 keep-alive 缓存未收缩,导致 DOM/JS heap 不回收
delView/delAllViews 误用 delCachedView,关闭非当前标签时会去删 currentRoute
对应的缓存,把要关的 name 留在 cachedViews 里,keep-alive include 不收缩,
旧组件实例无法 unmount。

回退到基于剩余 visitedViews 重建 cachedViews 的实现(对应 5718c7881 之前的写法);
delCachedView 自身保留 issue #180 的修复,仍供 refreshPage 使用。
2026-05-03 18:38:18 +08:00
YunaiV 51542e336b 【修复】form-create 单图上传规则 disabled 字段标题与默认值错配 2026-05-03 18:38:18 +08:00
YunaiV 7f33206057 【修复】IoT 场景联动:事件触发器比较值改普通文本输入,允许留空(事件发生即匹配) 2026-05-03 18:38:18 +08:00
YunaiV 8e1430c1a4 🐛 fix(system):修复租户 get-by-website 接口不支持端口的问题
🐛 fix(mes):修复常见缺陷的「检测项类型」错用独立字典的问题

「常见缺陷」与「检测项设置」的「检测项类型」语义一致,应共用同一份字典;DefectForm 与列表页统一改为 MES_INDICATOR_TYPE,并清理未使用的 MES_DEFECT_TYPE 常量。
2026-05-03 18:38:18 +08:00
芋道源码 aafe5f12bc
!866 fix: 修复请求拦截器bug
Merge pull request !866 from funcong/fc-fix-bug
2026-05-03 10:37:47 +00:00
YunaiV 9df6828255 fix(bpm):修正流程实例审批弹窗网关分支重算的并发与提交问题
- 提交时不再用节点表单值覆盖 data.variables;与预览阶段使用同一份合并变量
- onChange 加 useDebounceFn(300ms) + 请求序号去重,handleAudit 提交前 await 最新一轮重算
- 切换任务时重置请求序号与 pending 重算
- 改用 form-create 官方 formData() 取节点表单当前值
- 双 nextTick 改为 until 等 fApi 就绪,1s 兜底超时
2026-05-03 16:34:55 +08:00
YunaiV 06e2ca3100 Merge remote-tracking branch 'origin/feat/mes' into feat/mes 2026-05-03 13:33:23 +08:00
YunaiV fa9facfa0b fix: 【framework】关闭 TagsView 标签后 keep-alive 缓存未收缩,导致 DOM/JS heap 不回收
delView/delAllViews 误用 delCachedView,关闭非当前标签时会去删 currentRoute
对应的缓存,把要关的 name 留在 cachedViews 里,keep-alive include 不收缩,
旧组件实例无法 unmount。

回退到基于剩余 visitedViews 重建 cachedViews 的实现(对应 5718c7881 之前的写法);
delCachedView 自身保留 issue #180 的修复,仍供 refreshPage 使用。
2026-05-03 13:32:43 +08:00
YunaiV 0cc2bff0f4 【修复】form-create 单图上传规则 disabled 字段标题与默认值错配 2026-05-03 13:32:43 +08:00
YunaiV 192a118823 【修复】IoT 场景联动:事件触发器比较值改普通文本输入,允许留空(事件发生即匹配) 2026-05-03 13:32:43 +08:00
YunaiV d2e82b710b 🐛 fix(system):修复租户 get-by-website 接口不支持端口的问题
🐛 fix(mes):修复常见缺陷的「检测项类型」错用独立字典的问题

「常见缺陷」与「检测项设置」的「检测项类型」语义一致,应共用同一份字典;DefectForm 与列表页统一改为 MES_INDICATOR_TYPE,并清理未使用的 MES_DEFECT_TYPE 常量。
2026-05-03 13:32:43 +08:00
YunaiV bf79e07d5c ♻️ refactor(im): 清理代码中的 TODO 注释并优化逻辑 2026-05-03 13:27:31 +08:00
YunaiV 7c129c18c4 feat(im): 增加群消息的置顶 2026-05-03 12:53:24 +08:00
YunaiV 01e0e8e37b feat(im): 增加群消息的置顶 2026-05-03 12:15:39 +08:00
芋道源码 583b409fad
!864 条件节点添加包含和不包含操作符
Merge pull request !864 from Lesan/bugfix/bpm-202602
2026-05-03 03:01:48 +00:00
YunaiV ffb69063b9 feat(im): 重构群通知相关,对齐 openim 的消息编号(继续优化代码) 2026-05-03 09:22:53 +08:00
YunaiV 5d0755eea9 Merge remote-tracking branch 'origin/feat/mes' into feat/mes 2026-05-03 09:20:21 +08:00
芋道源码 a698cb1635
!867 feat(iot): 前端新增 Database 数据目的配置表单
Merge pull request !867 from puhui999/master
2026-05-03 01:19:11 +00:00
YunaiV 43372c05ad feat(im): 重构群通知相关,对齐 openim 的消息编号 2026-05-03 02:00:43 +08:00
YunaiV a704620f84 fix: 【framework】关闭 TagsView 标签后 keep-alive 缓存未收缩,导致 DOM/JS heap 不回收
delView/delAllViews 误用 delCachedView,关闭非当前标签时会去删 currentRoute
对应的缓存,把要关的 name 留在 cachedViews 里,keep-alive include 不收缩,
旧组件实例无法 unmount。

回退到基于剩余 visitedViews 重建 cachedViews 的实现(对应 5718c7881 之前的写法);
delCachedView 自身保留 issue #180 的修复,仍供 refreshPage 使用。
2026-05-03 00:28:27 +08:00
芋道源码 7fd0a24ca5
!875 fix(bpm):修复流程网关分支问题
Merge pull request !875 from 郭某人/master
2026-05-02 16:01:00 +00:00
YunaiV e98d575b3a 【修复】form-create 单图上传规则 disabled 字段标题与默认值错配 2026-05-02 22:56:56 +08:00
YunaiV d5a9e2e313 【修复】IoT 场景联动:事件触发器比较值改普通文本输入,允许留空(事件发生即匹配) 2026-05-02 14:32:42 +08:00
YunaiV fa27c27831 feat(im): 增加群角色(管理员) 2026-05-02 14:31:42 +08:00
芋道源码 f9c0cace70
!871 fix: 修复响应拦截器 code=0 的逻辑错误
Merge pull request !871 from zhulh/fix/code-0-bug
2026-05-02 03:21:51 +00:00
YunaiV 3146f64edc feat(im): 未读计数改用 isNormalMessage,对齐后端 normal 语义 2026-05-02 09:06:01 +08:00
YunaiV 2c3842582f 🐛 fix(system):修复租户 get-by-website 接口不支持端口的问题
🐛 fix(mes):修复常见缺陷的「检测项类型」错用独立字典的问题

「常见缺陷」与「检测项设置」的「检测项类型」语义一致,应共用同一份字典;DefectForm 与列表页统一改为 MES_INDICATOR_TYPE,并清理未使用的 MES_DEFECT_TYPE 常量。
2026-05-02 00:35:16 +08:00
YunaiV fbd8615398 feat(im): 消息右键菜单优化 + 修复图片场景滚不到底
- MessageItem:「回复」→「引用」并加图标;撤回 / 删除互斥(自己消息 2 分钟内显示撤回,超出 / 对方消息显示删除),均加分割线 + 红色样式对齐微信;MENU_KEYS 抽 const 防 typo;引用块从气泡上方移到下方,selfSend 时竖线镜像到右侧
- MessagePanel:scrollToBottom 改 async + waitMediaSettled 等图片 / 视频元数据加载;用 expectedScrollTop drift 替代 distanceFromBottom,修复「图片加载完底部上移、误判用户已滚走」导致到不了底
- ReplyPreview:删等价的 filePayload / voicePayload alias,直接复用 parsedPayload
- uiStore:ContextMenuItem 加 icon? 字段,支持菜单项前置图标
2026-05-01 23:06:14 +08:00
YunaiV 52fdf0bcab feat(im): 消息右键菜单优化 + 修复图片场景滚不到底
- MessageItem:「回复」→「引用」并加图标;撤回 / 删除互斥(自己消息 2 分钟内显示撤回,超出 / 对方消息显示删除),均加分割线 + 红色样式对齐微信;MENU_KEYS 抽 const 防 typo;引用块从气泡上方移到下方,selfSend 时竖线镜像到右侧
- MessagePanel:scrollToBottom 改 async + waitMediaSettled 等图片 / 视频元数据加载;用 expectedScrollTop drift 替代 distanceFromBottom,修复「图片加载完底部上移、误判用户已滚走」导致到不了底
- ReplyPreview:删等价的 filePayload / voicePayload alias,直接复用 parsedPayload
- uiStore:ContextMenuItem 加 icon? 字段,支持菜单项前置图标
2026-05-01 23:04:56 +08:00
YunaiV 43666dc56c feat(im): 优化【消息引用】的功能,增加文件、图片的展示调整 2026-05-01 19:05:57 +08:00
YunaiV ef901b5381 feat(im): 优化【消息引用】的功能,来自第二波 code review,解决安全性问题 2026-05-01 18:20:04 +08:00
YunaiV cfeee7bbb7 feat(im): 优化【消息引用】的功能,来自第一波 code review 2026-05-01 18:09:02 +08:00
YunaiV 1dfab43b8a feat(im): 增加【消息引用】的功能 2026-05-01 18:03:05 +08:00
YunaiV 744229a02e feat(im): 优化语音输入的交互。 2026-05-01 09:59:27 +08:00
YunaiV 63c711f9e2 feat(im): 增加视频消息 2026-05-01 09:47:01 +08:00
YunaiV 82022b86de feat(im): 实现 im 的首页统计 2026-05-01 09:25:39 +08:00
YunaiV f5656c8a2f feat(im): 同步输入框状态以支持粘贴功能 2026-05-01 08:50:51 +08:00
YunaiV 31dc1b1198 feat(im): 用户的输入,改成 userselectv2,增强体验。 2026-05-01 08:49:14 +08:00
YunaiV 3cc7ac7f8b Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into im
# Conflicts:
#	pnpm-lock.yaml
#	src/router/modules/remaining.ts
#	src/utils/dict.ts
2026-05-01 08:22:54 +08:00
YunaiV 7ed6fa5579 feat(im): 增加群管理的完善 2026-05-01 08:19:13 +08:00
YunaiV 8564788b11 feat(im): 对齐微信的图标展示 2026-05-01 08:17:24 +08:00
YunaiV 92b1466597 feat(im): 增加群管理的 code review 2026-05-01 07:52:31 +08:00
YunaiV 238862b572 feat(im): 增加发送草稿,切换对话的时候,不丢失。对齐微信 2026-05-01 07:52:18 +08:00
YunaiV be654bce50 feat(im): 增加私聊消息的管理 2026-05-01 07:46:19 +08:00
YunaiV d64a695673 feat(im): 增加群聊消息的管理 2026-05-01 07:08:05 +08:00
YunaiV dfbae06afa feat(im): 优化输入框的样式 2026-05-01 06:59:14 +08:00
YunaiV 384a0c134a feat(im): 完成敏感词的管理 2026-04-30 22:25:25 +08:00
YunaiV 9f1fc9ef78 reviewed 2026-04-30 21:38:17 +08:00
YunaiV fd1ba30bdb feat(im): 优化好友列表的管理 2026-04-30 21:09:03 +08:00
YunaiV 01fff53aaf feat(im): 增加 im 的管理界面 2026-04-30 19:04:31 +08:00
YunaiV 4b4c4fab11 feat(im): 优化群聊的功能界面 2026-04-30 16:59:56 +08:00
YunaiV 368b385267 feat(im): 增加群邀请的功能 2026-04-30 15:47:32 +08:00
YunaiV 0ab8b292f2 feat(im): 增加 pinyin 功能 2026-04-30 15:22:35 +08:00
YunaiV d19bdd42d5 feat(im): 优化添加好友界面 2026-04-30 14:53:41 +08:00
YunaiV 0c7d1f0df6 feat(im): 新增通讯录界面 2026-04-30 14:07:03 +08:00
YunaiV a762dfff84 feat(im): 优化整体包结构,将 friend、group 通用组件抽过去。 2026-04-30 10:11:20 +08:00
YunaiV 4b64153044 feat(im): 完善 friend、group 相关的本地存储(疯狂优化) 2026-04-29 22:03:54 +08:00
YunaiV e90f9e5237 feat(im): 增加 friend、group 相关的本地存储 2026-04-29 15:50:49 +08:00
YunaiV de39bc7fc1 feat(im): 优化代码,移除 message 里的 name 存储,避免更新困难。(为 friend、group 独立存储做准备) 2026-04-28 23:32:40 +08:00
YunaiV f0fc144e8a feat(im): 调整代码结构,优化 side 样式 2026-04-28 20:14:24 +08:00
YunaiV 431a0bfb93 feat(im): 调整代码结构,优化 side 样式 2026-04-28 20:13:01 +08:00
YunaiV ba34e4adc0 feat(im): 优化整体 message 包结构 2026-04-28 09:30:12 +08:00
YunaiV 29a03ef03d feat(im): 优化整体 message 包结构 2026-04-28 09:29:40 +08:00
YunaiV 122b1ba748 feat(im): 优化 message 的导入 2026-04-28 08:48:38 +08:00
YunaiV 56b0630847 feat(im): 优化 icon 的导入 2026-04-28 08:15:29 +08:00
YunaiV 6ead932813 feat(im): 优化 icon 的导入 2026-04-28 08:15:10 +08:00
YunaiV 9fc10b304c feat(im): 增加 ChatPanel.vue 组件 2026-04-28 01:15:04 +08:00
YunaiV 4c8898b6f5 🐛 fix(im): 上传 URL 取错字段,粘贴图片 / 文件 / 语音消息加载失败
axios 配置里 request.upload 直接返回完整 axios response(不是 res.data,
跟 get/post/put 不一致),原代码 (await updateFile(form)) as unknown as string
把整个 {data, status, headers, ...} 对象当成 URL 塞进消息 JSON,接收端
<el-image src> 拿到的是序列化串自然加载失败。

uploadAndSendImage / uploadAndSendFile / onVoiceSend 三处统一改成 .data 取值:
  ((await updateFile(form)) as { data?: string })?.data
跟 mall PictureSelectUpload / bpm SignDialog 等其它业务代码取 URL 的方式一致。
2026-04-28 01:14:24 +08:00
YunaiV 9c5b11e551 feat(im): 支持历史消息的加载 2026-04-28 01:08:45 +08:00
YunaiV e9be6ef8b3 feat(im): 增加群消息的回执开关,通过向下箭头 2026-04-27 23:56:50 +08:00
YunaiV 29695b649a feat(im): 增加群消息的回执开关,通过向下箭头 2026-04-27 23:54:41 +08:00
YunaiV 8847cdb79f feat(im): 新增 MessageReadStatus.vue 2026-04-27 22:36:47 +08:00
YunaiV bfa267120a ♻️ refactor(im): MessageItem 头像顶右 + MentionPicker/MessageInput 命名清理
【MessageItem.vue】
- 头像合一:双 v-if 头像(左/右)收成单一 <UserAvatar>,DOM 顺序固定为
  [头像, 气泡],selfSend 靠外层 flex-row-reverse 翻视觉 → 头像顶右、气泡在
  头像左侧。早先双 v-if + row-reverse 让自己消息时气泡顶右、头像反而被
  挤在 bubble 左边,跟微信观感不对齐
- 5 处脚本 TODO 注释补齐:groupMembersForReadStatus / handleContextMenu /
  handleRecall / handleDelete,解释 WHY 而不是 WHAT
- formatTipTime 局部变量按"不缩写"展开:d → messageDate / n → value /
  hm → hourMinute / (a,b) → (left,right) / weeks → weekNames
- senderAvatar / groupMembersForReadStatus 回调参数 m → member、g → group

【MessageInput.vue】
- groupMembers producer 局部变量 g → group、(m) => → (member) =>

【MentionPicker.vue】
- memberItems 过滤回调 (m) => → (member) =>
2026-04-27 21:48:34 +08:00
YunaiV 8fd21da555 🐛 fix(im): TIP_TEXT 系统提示不再显示空白
群解散 / 退群 / 踢人 等系统提示后端发的是裸字符串,之前按 TextMessage JSON
解析 → 主聊天窗显示空行、会话列表摘要变空。

- message.ts:新增 resolveTipText helper,兼容裸字符串 + {"content":"..."}
- MessageItem / conversationStore.resolveLastContent 把 TIP_TEXT 从 TEXT
  分支拆出来,统一走 resolveTipText(TEXT 仍按 JSON 解析,没有裸字符串可能)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 19:59:56 +08:00
YunaiV 9e8d04249c 🐛 fix(im): TIP_TEXT 系统提示不再显示空白
群解散 / 退群 / 踢人 等系统提示后端发的是裸字符串,之前按 TextMessage JSON
解析 → 主聊天窗显示空行、会话列表摘要变空。

- message.ts:新增 resolveTipText helper,兼容裸字符串 + {"content":"..."}
- MessageItem / conversationStore.resolveLastContent 把 TIP_TEXT 从 TEXT
  分支拆出来,统一走 resolveTipText(TEXT 仍按 JSON 解析,没有裸字符串可能)
2026-04-27 19:56:54 +08:00
YunaiV cb5d30e327 feat(im): 新增 MessageItem.vue 2026-04-27 19:11:31 +08:00
YunaiV ccc9aca21c feat(im): MessageInput 工具栏挪到底部 + 4 图标统一 Iconify + 聊天历史挪到右上角
对齐微信 PC:输入区在上、操作图标在下;会话级操作(如聊天历史)统一放 header 右上角

【MessageInput.vue】
- 模板顺序对调:editor 在上 / 工具栏在下(justify-between:左 4 图标 gap-1 / 右"发 送"按钮)
- editor min-height 80 → 100、padding 8/12 → 10/14,输入区视觉权重接近微信
- 4 个图标统一走 Iconify ant-design outlined 同源,避免 ep / antd 混用视觉割裂:
  - 表情:Sunny → ant-design:smile-outlined(Element Plus 没有 smile,必须走 Iconify)
  - 图片:Picture → ant-design:picture-outlined
  - 文件夹:Paperclip → ant-design:folder-outlined(附件 → 文件夹更贴近微信观感)
  - 语音:Microphone → ant-design:audio-outlined
  - 整条 @element-plus/icons-vue import 删除,全部改 <span class="message-input__tool inline-flex …">
    + <Icon icon="…" :size="18" /> 的统一外壳;scoped CSS 的 :deep(svg) 继续命中,padding / hover
    样式不动;DOM 实测 4 图标全部 30×30、top:761、间距 34px 完全对齐
- EmojiPicker class:bottom-9 left-3 → bottom-full left-3 mb-2,picker 从工具栏顶部向上弹出
  (旧值在新布局下会浮在工具栏内部,盖住图标)
- 删 defineEmits<{ openHistory }>():聊天历史挪到 ChatPanel header 后已没有调用方

【ChatPanel.vue】
- header 右上角新增"聊天历史"图标(Tickets),点击直接 historyVisible = true 弹"历史消息"抽屉
  (对齐微信 PC:右上角集中放会话级操作;并列在原"聊天信息 / 群聊信息"图标左侧)
- <MessageInput :key="…" @open-history="…"> 上的 listener 摘掉,emit 链路完整解耦
2026-04-27 15:46:13 +08:00
YunaiV fc82ed3d7e ♻️ refactor(input): 优化粘贴文件处理逻辑,简化代码结构 2026-04-27 14:30:38 +08:00
YunaiV cba5c15604 feat(im): MessageInput / MentionPicker / ChatPanel 三连修——粘贴文件、切群清空、命名规范
【ChatPanel.vue】
- 加 messageInputKey computed(type-targetId)+ MessageInput :key 绑它,
  切会话强制 unmount + remount editor / mention range / 草稿全归零,
  避免 A 群打了一半的字 / @ token 漏到 B 群被发出去
  (早先用 inline template literal 做 :key,Vue SFC 编译没把表达式接到
  vnode.key 上,hmr / 完整 reload 都看到 key=null;改 computed 后正常)
【MessageInput.vue】
- onPaste 加 clipboardData.items 扫一轮:image/* → uploadAndSendImage,
  其它 file → uploadAndSendFile,纯文本兜底走 nativeExec('insertText');
  截图 / 拖入图片 / 拖入文件不再被默默吞掉
- 抽 uploadAndSendImage / uploadAndSendFile 两个共用函数,
  onImagePicked / onFilePicked 改成薄包装走它们,避免上传逻辑双份
- 删 nativeExec 里的 // eslint-disable-next-line @typescript-eslint/no-deprecated:
  项目当前 @typescript-eslint v7 没有这条规则,加了会让 lint 报"规则不存在",
  反而把 lint 拖红;改用单纯 JSDoc 解释为什么留着 execCommand
- 重命名 mentionPos → mentionPosition(prop / ref 一致),按"变量不缩写"
- 7 个方法补 JSDoc:onSelectionChange / insertText / onPaste / onInput /
  onKeydown / onImagePicked / onFilePicked / onVoiceSend;复杂的
  collectFromEditor 和 handleSend 加分步 1./2./3. 内联注释
- data-empty 改用属性"存在 / 缺失"模拟(template 里 data-empty="",JS 里
  raw 为空就 set ''、否则 delete),CSS 选择器同步改 [data-empty],
  比 [data-empty='true'] 直观
【MentionPicker.vue】
- prop pos → position(不缩写);ref / 内部解构 / 默认值都跟着改
- <el-icon><UserFilled /></el-icon> → <Icon icon="ep:user-filled">:
  用全局 Icon 组件走 Iconify,少一个 EP 图标 import
- scrollToTop / scrollToActive 局部变量 wrap → scrollWrap、
  itemH → itemHeight、activeTop → activeOffsetTop;
  v-for 与 handleSelect 的 (m) → (member)
2026-04-27 13:57:18 +08:00
YunaiV 678c2d6834 feat(im): MessageInput 切 contenteditable + MentionPicker 对齐微信,修一堆 @ 浮层 bug
【MessageInput.vue】
- textarea → contenteditable div:拿真·光标 rect 给浮层定位(textarea 拿不到),@ 成员
  以 <span data-id contenteditable=false> token 节点存在,删 token 即删 atUserIds
- collectFromEditor:DOM walk 还原 plain text + atUserIds(text / br / span[data-id] /
  div / 其他元素 五种节点分支),过滤零宽空格
- handleSend:从 DOM 收集而非 ref<string>,atUserIds 走 Set 去重;分步注释
- placeholder 用 [data-empty]::before + JS 维护属性"存在 / 缺失"模拟,避开浏览器删空
  后留 <br> 让 :empty 不命中
- @ 浮层位置:bottom 锚定(picker 下沿贴 @ 上方 8px),无论候选多寡下沿固定,不再
  随 picker 高度变化漂移;上方放不下才翻成 top 锚定到 @ 下方
- @ 浮层规则:regex 改成 `(?:^|\s)@([^\s@]*)$`,避免 email-like "test@example.com"
  误触发;锚定在 @ 字符位置而非 caret,否则用户每多敲一字浮层右移
- click outside 关浮层:document mousedown 监听,target 不在 editor / picker 内即关
- Enter 兜底:mention 浮层无候选时 fall through 到正常发送,避免按 Enter 没反应
- token 首位 ZWSP:token 是 editor 第一个节点时 contenteditable=false 边缘会让光标
  无法挪到 token 前,补一个零宽空格当锚点;DOM walk 滤掉
- Shift+Enter 强制 br(execCommand insertLineBreak),DOM walk 不必处理多换行容器
- onPaste 用 execCommand('insertText') 剥光所有 HTML,不留外部样式 / 脚本
- onEditorScroll 同步浮层位置,多行 + 滚动条场景下 picker 跟随 caret
- selection 保存:document selectionchange 监听 + 仅 editor 内时记录,emoji 面板偷
  焦点后能回到原位

【MentionPicker.vue】
- 视觉对齐微信 PC:顶部"所有人"虚拟项(蓝方块 + UserFilled 图标)+ "群成员"分组
  header + 底部三角指针;rounded-md + soft shadow
- "全体成员" → "所有人";userId=-1 / 文案常量化到 utils/constants.ts
  (IM_AT_ALL_USER_ID / IM_AT_ALL_NICKNAME),三个文件共用,不再散落
- !fixed + !h-75 / max-height:用 UnoCSS important 变体压过 Element Plus 的
  .el-scrollbar { position:relative; height:100% } 默认 CSS——之前 picker 落到父
  容器坐标系导致 y=1326 飞出视口外,肉眼看不到的根因
- pos prop 从 {x, y} → {x, top?, bottom?},配合 MessageInput 的 bottom 锚定
- allItem / memberItems 拆成两个 computed,showMembers 做扁平合并供键盘导航;
  群成员上限 100 去掉,浮层本就支持滚动
- 5 个内部函数 / watch 全部补 JSDoc(showMembers / visible 两个 watch、scrollToTop /
  scrollToActive / handleSelect)
2026-04-27 13:21:27 +08:00
YunaiV 3ea04663f2 feat(im): IM 5 个 store 补 HMR + 抽 atAll 常量 + 全面补齐 JSDoc
- 全部 5 个 store(conversation / friend / group / ui / websocket)加
  acceptHMRUpdate;Pinia 单例的 actions 是 wrapper 闭包,Vite 推新模块时
  不会自动替换闭包内的旧函数体,导致改 store 后看着热重载、跑的还是旧逻辑
- 抽 IM_AT_ALL_USER_ID(-1)+ IM_AT_ALL_NICKNAME('所有人')到
  utils/constants.ts;conversationStore 删本地 AT_ALL_FLAG 改用共享常量;
  MentionPicker 渲染虚拟项 / ChatGroupMember 类型注释也都引这两个常量
- groupStore.loadGroups 改成合并而非全量替换:用 groupMap 按 id 找已有项,
  保留 loadGroupMembers 写过的 members / memberCount / muted(这三个字段
  不在 ImGroupRespVO 里,全量替换会被冲掉)
- groupStore.loadGroupMembers 重写为分步注释(1. 缓存 / 2. 拉取 /
  3. 回填 muted / 4.1 占位 / 4.2 直写);await 之后必须重新 getGroup
  防 race(loadGroupMembers 与 loadGroups 并发时用入口快照会把真实 name
  覆盖成 String(groupId))
- types/GroupMember 补 muted 字段,convertGroupMember 透传,
  解决 vue-tsc TS2339 / TS2353
- 5 个 store 缺 JSDoc 的方法全部补齐:removePrivateConversation /
  removeGroupConversation / getFriend / getActiveFriends / isFriend /
  loadGroupInfo / upsertGroup / stopHeartbeat
- 全局"墓碑"措辞统一为"软删保留记录",types / friendStore / groupStore 三处
- groupStore 删冗余注释(与代码自描述重复的)若干处;变量 g/old 改 group/existing
2026-04-27 13:10:15 +08:00
YunaiV a0ed0d800c feat(im): 群聊免打扰接入后端,完善免打扰失败回滚 + ContextMenu 微调
- groupStore.setMuted 改 async,调 /im/group-member/update 推后端
- GroupMember.muted 在类型层补齐;convertGroupMember 保留 muted;
  loadGroupMembers 拉完成员后用当前用户那条 member.muted 回填 group.muted
  与 conversation.muted,避免冷启动后服务端已免打扰的群在会话列表里仍显示为
  未免打扰
- ConversationItem.handleMuted 失败回滚:catch 后 ElMessage.error 并反向
  setMuted 把 conversationStore(已 saveConversations 落盘)拽回正确状态
- ContextMenu 分割线改用 h-[1px] + bg(UnoCSS 不带 border-style preflight,
  border-t 在空内容 div 上不显形),文案 text-center → text-left 贴近微信
- groupStore.setMuted 改 async 后,ConversationItem 里两路 setMuted 调用
  都用 void 显式 fire-and-forget,风格统一
2026-04-27 09:29:49 +08:00
YunaiV 45a530e8c7 feat(im): 新增 MentionPicker.vue、MessageInput.vue、VoiceRecorder.vue 三个组件,vibe~ 2026-04-27 09:20:10 +08:00
YunaiV 6add0b0600 feat(im): 群聊免打扰接入后端,完善免打扰失败回滚 + ContextMenu 微调
- groupStore.setMuted 改 async,调 /im/group-member/update 推后端
- GroupMember.muted 在类型层补齐;convertGroupMember 保留 muted;
  loadGroupMembers 拉完成员后用当前用户那条 member.muted 回填 group.muted
  与 conversation.muted,避免冷启动后服务端已免打扰的群在会话列表里仍显示为
  未免打扰
- ConversationItem.handleMuted 失败回滚:catch 后 ElMessage.error 并反向
  setMuted 把 conversationStore(已 saveConversations 落盘)拽回正确状态
- ContextMenu 分割线改用 h-[1px] + bg(UnoCSS 不带 border-style preflight,
  border-t 在空内容 div 上不显形),文案 text-center → text-left 贴近微信
- groupStore.setMuted 改 async 后,ConversationItem 里两路 setMuted 调用
  都用 void 显式 fire-and-forget,风格统一
2026-04-27 09:03:18 +08:00
YunaiV 7f84c428a5 feat(im): 优化 ConversationItem.vue,对齐微信的时间展示。 2026-04-27 08:51:35 +08:00
YunaiV e85f8edcaa feat(im): 优化 ConversationItem.vue,对齐微信交互 2026-04-27 08:42:39 +08:00
YunaiV 115e0482db feat(im): 优化 ConversationItem.vue 增加相关评审 2026-04-27 08:22:14 +08:00
YunaiV a1a9053aaa feat(im): 优化 MessagePage.vue 页面,对齐微信交互 2026-04-27 00:51:31 +08:00
YunaiV 1a0c11f685 feat(im): 优化 MessagePage.vue 页面,对齐微信交互 2026-04-27 00:51:15 +08:00
YunaiV e1b52be8ea feat(im): 新增 MessagePage.vue 页面 + 部分 review 2026-04-27 00:01:43 +08:00
YunaiV 8790d6b128 feat(im): 优化 ToolBar.vue 组件
- tabs / goTab / goProfile 从 path 切到路由 name:path 后期容易随前缀调整变动,name 更稳定
- isActive 由 path 前缀比对简化为 route.name 全等比对(IM 三 Tab 无嵌套子路由,足够)
- 群聊图标 svg-icon:peoples → ant-design:team:三人组合跟 ep:user(单人)视觉区分更明显
- 给 goTab / goProfile 补 JSDoc;清理 5 个 TODO @AI
2026-04-26 23:45:27 +08:00
YunaiV 3a77001b42 🐛 fix(im): 修复主壳初始化期间消息漏拉 / 缓冲回放失效
三处时序竞态修复:
- loading=true 提前到 connect 前,避免 WS 早于 pullOnce 推进 maxId 漏拉断线积压
- loading=false 提到 flushBuffer 前,让回放走正常 insertMessage 而非被 push 回 buffer
- 加 bootstrapped 守卫,避免 isConnected watcher 在 friend/group 加载完前抢跑

附带:主壳文件名 Index.vue → index.vue 对齐其他模块小写惯例;清理 5 个 TODO @AI。
2026-04-26 23:32:55 +08:00
YunaiV 8a7991261f 🐛 fix(im): 主动断开 WS 后不再自动重连,同步复位 isConnected
disconnect() 之前调用 socket.close() 是异步触发 onclose,回调里会
无条件走 reconnect,导致离开 IM 主壳后 3 秒又会在后台重新打开 WebSocket。
修复:
- close 前先解绑 onclose / onerror handler,主动关闭路径不再走自动重连
- onclose 已被解绑后没人帮我们设 isConnected=false,disconnect 内手动复位,
  避免 socket=null 但 isConnected=true 的状态不一致
2026-04-26 23:08:23 +08:00
YunaiV 1e02a40ec4 feat(im): 添加 IM 聊天模块的全屏容器组件,并添加相关 review 注释 2026-04-26 22:02:02 +08:00
YunaiV 9570f25cdc feat(im): 优化 ToolBar.vue 组件 2026-04-26 21:51:09 +08:00
YunaiV d37af6d959 feat(im): 优化 PagedScroller.vue 组件 2026-04-26 21:46:13 +08:00
YunaiV 802a10cf85 feat(im): 优化 ResizableAside.vue 组件 2026-04-26 21:35:27 +08:00
YunaiV a973406b2a feat(im): 优化 ContextMenu.vue 组件 2026-04-26 20:19:19 +08:00
YunaiV 43771b0f47 feat(im): 优化 EmojiPicker.vue 组件 2026-04-26 19:49:44 +08:00
YunaiV 20c6631e7a feat(im): 新增 UserInfoCard.vue 2026-04-26 19:08:02 +08:00
YunaiV 9a4e79e4ef 🐛 fix(im): conversation.messages 入 IDB 前用 toRaw 解 Proxy,否则 structuredClone 抛 DataCloneError 静默丢消息 2026-04-26 17:57:50 +08:00
YunaiV f1d44c8267 feat(im): 优化 UserAvatar.vue 通用用户头像组件 2026-04-26 17:52:32 +08:00
YunaiV 969d8237ce feat(im): 增加 UserAvatar.vue 通用用户头像组件 2026-04-26 17:32:47 +08:00
YunaiV f929ebc184 feat(im): 增加 conversationStore.ts 未来的优化 todo; 2026-04-26 16:13:58 +08:00
YunaiV 2c1ff59286 feat(im): 初始化 useMessageSender.ts 2026-04-26 15:56:24 +08:00
YunaiV e573462cb7 feat(im): 增加 useMessagePuller 用于首次消息的拉取 2026-04-26 10:38:14 +08:00
YunaiV 8c1f17f5a6 🐛 fix(im): 私聊已读消费端卡 maxReadId + 上报 messageId 与后端对齐
handlePrivateReceipt 收到对方 RECEIPT 时丢弃了后端编码在 DTO id 字段
的 maxReadId,applyReadReceipt 把会话里所有 selfSend 未撤回消息一刀切
标 READ;回执在路上时刚发的消息会被误标已读。
- applyReadReceipt 的 markPrivateRead 改为 privateReadMaxId,按
  id <= maxReadId 卡边界,超过 maxReadId 的自发消息保留原状态;
- handlePrivateReceipt 透传 websocketMessage.id 作为 privateReadMaxId;
- apiReadPrivateMessages 增加 messageId 形参,与后端新接口对齐;
- websocketStore 私聊自动已读用刚到的消息 id;useMessageSender.readActive
  把私聊 / 群聊的 maxMessageId 计算合并到调用前。
2026-04-26 09:46:09 +08:00
YunaiV a35698fc07 🐛 fix(im): 群聊离线拉取看不到撤回提示,pull 路径接入 recallMessage
pullByType 之前对 RECALL 信号一律 skip、只靠原消息 status=RECALL 走 OR 兜底渲染。
当 pull 的 minId 卡在原消息处、回拉只返回信号时,本地缓存里的老消息没人翻成
RECALL,会一直停在原态——配合后端群聊 mapper 过滤掉 status=RECALL 的原消息,群聊
离线撤回完全不可见。

改成 pull / WS 走同一套 dispatch:
- pullByType 信号转 conversationStore.recallMessage(),跟 WS 路径一致
- recallMessage 把 parseRecallMessageId 收敛进内部,第 3 个参数从
  messageId: number 改成 recallSignalContent: string,4 个调用点都缩成一行
- MessageItem.isRecall 只判 type=RECALL,去掉 status=RECALL OR 分支
  (conversationStore 里跳未读 / 跳已读那两处对 status 的判断是业务逻辑保留)
2026-04-26 00:28:43 +08:00
YunaiV 66514fc597 ♻️ refactor(im): conversationStore 存储改为 IndexedDB 按会话分桶 + 命名统一
- 持久化迁到 localforage(IndexedDB),meta 索引与单会话 messages 分 key 存,消除写放大
- saveConversations 支持 不传 / 单个 / 数组 三种粒度;签名改为 sync void(fire-and-forget)
- 修复 sortConversations 仅刷 meta 不刷 messages 导致离线消息重启丢失的 bug
- 方法重命名:saveToStorage→saveConversations、updateMessageState→ackMessage、applyRecall→recallMessage、refreshConversations→sortConversations、removeLocalMessage→removeMessage、_removeMessagesStorage→removeConversationMessages
- 删除 dead field Conversation.lastReadCount;TIP_TIME clientMessageId 改用 uuid
2026-04-25 22:52:00 +08:00
YunaiV 2785e2bea6 feat(im): 重构优化 store 方案 2026-04-25 16:45:31 +08:00
YunaiV e30e30ea51 🐛 fix(im): 撤回信号错用 TIP_TEXT,应为 RECALL 2026-04-25 11:42:34 +08:00
YunaiV 505b3b5953 feat(im): 重构部分老代码。 2026-04-24 22:55:58 +08:00
YunaiV a28694074e 🔧 chore(deps): 添加 localforage 依赖:https://localforage.docschina.org/ 2026-04-24 22:12:54 +08:00
YunaiV d6f96a56a2 feat(im): 优化 ConversationItem.vue 逻辑 2026-04-24 21:54:20 +08:00
YunaiV 68d3ad10d4 feat(im): 优化 im 前端的工具类 2026-04-24 21:36:09 +08:00
YunaiV 5f16cd74e0 feat(im): 优化 im 前端的枚举类 2026-04-24 00:50:09 +08:00
YunaiV 6664afb851 ♻️ refactor(im): 重命名 IM 模块中的多个类和文件以简化结构 2026-04-23 20:38:27 +08:00
YunaiV 6d6515c06d ♻️ refactor(im): 用户查询接口迁移到 system/user
- /api/im/user:移除 getSelfInfo/getUserListByName,改用 /system/user/get-simple、/system/user/list-by-nickname
- AddFriendDialog:切换为 getSimpleUserListByNickname,去掉已废弃的 userName 展示
2026-04-23 01:36:45 +08:00
guoanhao 11495a64f5 fix(bpm):修复流程网关分支问题 2026-04-22 17:37:30 +08:00
YunaiV 76be404c69 🎨 style(Message): 修复铃铛对齐问题,调整样式为 flex-center 2026-04-19 00:30:34 +08:00
YunaiV 9fb796194e feat(im): 前端的 IM 增加 Layout 整体布局 2026-04-19 00:30:07 +08:00
YunaiV 064b657294 (〃'▽'〃)_v2026_03_发布:新增 MES 制造执行系统,IoT 接入 Modbus 协议 2026-04-18 13:29:43 +08:00
YunaiV bc9c67ad3b (〃'▽'〃)_v2026_03_发布:新增 MES 制造执行系统,IoT 接入 Modbus 协议 2026-04-18 13:25:10 +08:00
YunaiV bf81e6f617 Merge branch 'feat/mes' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 2026-04-18 13:23:29 +08:00
YunaiV a839dd6fa5 feat(mes): 更新 MES 状态常量和相关枚举
将 MES 设备维护记录状态枚举中的状态值更新为常量引用,增强代码可读性和一致性。同时,新增 MES 单据状态常量,简化状态管理。
2026-04-17 22:10:14 +08:00
YunaiV 0a96738cfb feat(mes): 更新 MES 状态常量和相关枚举
将 MES 设备维护记录状态枚举中的状态值更新为常量引用,增强代码可读性和一致性。同时,新增 MES 单据状态常量,简化状态管理。
2026-04-16 19:27:01 +08:00
YunaiV 378965d82f 🎨 style(mes): 优化模板格式和属性排列 2026-04-15 19:22:14 +08:00
YunaiV 05f43f91ab feat(mes): 添加计量单位名称到生产任务响应对象 2026-04-15 14:29:24 +08:00
YunaiV c63a5f87a4 ♻️ refactor(mes): 重构 approveFeedback 方法,移除用户 ID 参数
简化 approveFeedback 方法,移除不必要的用户 ID 参数,改为使用表单保存的报工人和时间。此变更提高了代码的可读性和维护性,同时确保审批状态更新逻辑的清晰性。
2026-04-14 13:53:42 +08:00
YunaiV 76b2d5caf3 Merge branch 'feat/mes' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 2026-04-13 22:42:48 +08:00
YunaiV d63d4eee27 feat:增加 iot 模块 2026-04-13 22:42:37 +08:00
YunaiV cd300bded7 ♻️ refactor(mes): 修改字段名称以提高代码可读性 2026-04-13 19:57:35 +08:00
YunaiV befc4dc95e feat(docs):优化 permalink 2026-04-12 23:30:11 +08:00
YunaiV 3c5670141e feat:增加 iot 模块 2026-04-12 21:06:45 +08:00
YunaiV d6f8fb7b55 ♻️ refactor(mes): 修正质检缺陷记录删除权限 2026-04-12 20:38:01 +08:00
YunaiV ea50b843dc feat(mes):增加 mes 模块 2026-04-12 16:40:47 +08:00
YunaiV 75ed43b123 Merge branch 'feat/mes' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 2026-04-12 16:33:36 +08:00
YunaiV b1c45fbd69 ♻️ refactor(calShiftList): 重命名表单类型变量为 dialogType 2026-04-12 02:39:21 +08:00
YunaiV bf912754ca 📝 docs(index): 更新文档警告组件,添加相关链接和标题 2026-04-11 21:43:44 +08:00
YunaiV 6358e7db9e ♻️ refactor(machinery): 统一规格型号字段命名为 'specification' 2026-04-11 16:03:22 +08:00
YunaiV 3e203a9536 feat(index): 更新来源单据字段及调整表单项顺序 2026-04-11 14:12:00 +08:00
YunaiV 518851ce74 merge: 合并 master 分支到 im
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 09:38:25 +08:00
YunaiV 9fb0659615 ♻️ refactor(mes): 重命名通知单编码和名称字段 2026-04-11 09:25:52 +08:00
YunaiV 36666cfdc6 ♻️ refactor(location): 移除库位管理状态字段 2026-04-10 22:44:50 +08:00
YunaiV ab690c9b50 feat(barcode): 添加条码详情弹窗功能
在多个表单中新增查看条码的按钮,允许用户在详情模式下查看条码信息。此功能提升了用户体验,使得条码信息的访问更加便捷。

- 在 `MachineryForm.vue`、`MdItemForm.vue`、`WorkshopForm.vue` 等文件中添加了条码详情弹窗组件
- 实现了 `handleBarcode` 方法以处理条码查看逻辑
2026-04-10 20:12:05 +08:00
YunaiV d16a92587d feat(mes): 更新物料/产品标识和补齐选项的显示方式
重构了多个组件中的物料/产品标识显示逻辑,使用 dict-tag 组件替代了原有的 getItemOrProductLabel 方法。更新了补齐选项的 radio group,支持动态生成选项。此变更提升了代码的可维护性和可扩展性。
2026-04-10 19:25:00 +08:00
DevDengChao 14edd68d77 test: harden e2e auth setup
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-10 16:23:50 +08:00
DevDengChao 968a1ccb40 chore: upgrade typescript to 6.0.2
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-10 14:54:46 +08:00
DevDengChao c163ed152c chore: upgrade unplugin-vue-components
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-10 14:46:30 +08:00
DevDengChao 2499d59f28 chore: upgrade console runtime dependencies
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-10 14:38:29 +08:00
DevDengChao 176cddc21f chore: upgrade console dev dependencies
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-10 14:33:43 +08:00
YunaiV b508aa7c66 feat(unit-measure): 新增计量单位引用检查功能
为计量单位添加引用检查,确保在删除计量单位时,能够验证是否被生产任务投料或质检方案指标项引用。新增相关方法以获取引用记录数量,提升数据一致性和安全性。
2026-04-10 09:56:58 +08:00
YunaiV 0045e52c3d feat(mes): 添加车间编码生成按钮 2026-04-10 09:25:47 +08:00
YunaiV f628c2e7f5 feat(mes): 新增 OQC 来源单据类型错误码及相关校验 2026-04-10 08:52:23 +08:00
YunaiV 4a3683aea8 feat(mes): 优化整体代码风格 2026-04-10 00:57:02 +08:00
YunaiV 802cc92309 feat(mes): 添加懒加载注解以优化依赖注入 2026-04-10 00:42:22 +08:00
YunaiV 1b0af32a6a feat(qc): 修改检测项类型为整数并更新相关文档 2026-04-10 00:06:43 +08:00
YunaiV 1d01b221e6 feat(mes): 修改检测项类型为整数类型 2026-04-09 22:46:32 +08:00
YunaiV 302ca05052 feat(item-receipt): 添加采购入库单相关字段和功能
新增采购入库单编码和采购订单号字段,优化相关服务和控制器以支持批量获取入库单信息,提升数据处理能力。
2026-04-09 21:06:17 +08:00
YunaiV e39389137c feat(workshop): 增加车间精简列表负责人信息和销售订单编号 2026-04-09 16:09:53 +08:00
YunaiV 901e0883b4 ♻️ refactor(mes): 移除无用的 script 标签 2026-04-09 00:50:28 +08:00
YunaiV 813aa868d2 feat(sales): 新增发货通知单行ID字段及相关校验逻辑
在销售出库单行中新增发货通知单行ID字段,并实现相关的校验逻辑,以确保出库单与发货通知单行之间的关联性和一致性。此变更提升了系统的完整性和数据一致性。
2026-04-09 00:43:50 +08:00
YunaiV f34657341b feat(stock): 添加虚拟仓过滤功能
新增虚拟仓过滤模式,支持排除虚拟仓和仅查看虚拟仓的选项。更新相关请求对象和数据查询逻辑,以便后端处理虚拟仓的过滤需求。
2026-04-08 22:11:17 +08:00
YunaiV 52eb55107c feat(task): 添加质检标志字段及相关查询功能
在生产任务和工艺路线工序中新增质检标志字段 `checkFlag`,并更新相关查询逻辑以支持根据该字段进行过滤。此变更旨在增强任务管理的灵活性和准确性。
2026-04-08 18:01:06 +08:00
YunaiV 5fa959662b feat(select): 增加批次和仓库过滤功能,优化库存选择器 2026-04-08 13:59:29 +08:00
YunaiV b0fc3b05f2 feat(select): 增加批次和仓库过滤功能,优化库存选择器 2026-04-08 13:59:14 +08:00
YunaiV 5cc0a96db0 feat(workorder): 添加工单状态字段并更新相关逻辑
在 MesProWorkOrderPageReqVO 中新增工单状态字段,并在相关的 Mapper 和 Service 中更新查询逻辑以支持该字段。同时,新增批次编号字段到 MesWmMaterialStockPageReqVO,并更新相关逻辑以确保数据一致性。
2026-04-08 12:03:25 +08:00
YunaiV 55cb175f5a feat(select): 增加批次和仓库过滤功能,优化库存选择器 2026-04-08 09:56:32 +08:00
YunaiV 606a9ed6e8 feat(select): 增加状态过滤功能,优化选择器提示信息
在 DvCheckPlanSelect 和相关组件中新增状态过滤功能,允许用户根据计划状态筛选可选项。同时,优化了提示信息的拼装逻辑,提升用户体验。
2026-04-08 01:15:03 +08:00
YunaiV 500d20155b feat(mes): 添加任务状态列表支持,优化任务查询功能 2026-04-07 23:47:14 +08:00
YunaiV 0d13f32654 feat(mes): 添加工单状态过滤功能 2026-04-07 20:03:57 +08:00
YunaiV 06b00efcbe 🎨 style(mes): 代码格式化调整
对 MES 模块多个 Vue 组件进行代码格式化:
- 长属性行拆分为多行
- 多行属性合并为更紧凑的格式
- 删除多余空行
- 统一分号/逗号风格

无逻辑变更,纯格式调整。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 18:52:50 +08:00
YunaiV 5af93de4f5 feat(mes): 新增 BOM 子物料选择器组件及弹窗 2026-04-07 18:48:03 +08:00
YunaiV 917b2102bd feat(system): 更新用户选择组件为 UserSelectV2 并添加部门树选择 2026-04-07 14:00:08 +08:00
YunaiV a5122b58c4 feat(mes): 添加发货通知单行选择器组件及相关功能 2026-04-07 12:26:31 +08:00
YunaiV 2f21daecc1 ♻️ refactor(mes): 移除无用的发货通知单相关代码
删除了不再使用的发货通知单精简列表接口及相关逻辑,简化了代码结构,提高了可维护性。
2026-04-07 12:26:19 +08:00
YunaiV bf586e57b8 ♻️ refactor(mes): 移除无用的到货通知单相关接口和组件 2026-04-07 12:26:11 +08:00
YunaiV 6e6e65a22c ♻️ refactor(mes): 移除无用的到货通知单相关方法和注释 2026-04-07 12:26:03 +08:00
YunaiV 0e4e5be9ee feat(package): 添加状态字段并重构装箱单选择逻辑
新增装箱单和盘点方案的状态字段,优化装箱单选择器的交互方式,支持通过弹窗选择装箱单。移除不再使用的接口和方法,提升代码整洁性和可维护性。
2026-04-07 09:49:25 +08:00
YunaiV ee1a7b9003 ♻️ refactor(mes): 移除未使用的盘点方案相关代码
清理了不再使用的盘点方案列表获取方法和相关的 API 接口,简化了代码结构,提高了可维护性。
2026-04-07 09:36:28 +08:00
YunaiV 739725d9f8 feat(mes): 移除质检指标精简列表接口并重构选择器组件
移除不再使用的质检指标精简列表接口,更新相关前端组件以支持新的选择器交互方式。选择器现在使用只读输入框和弹窗选择,提升用户体验和交互性。
2026-04-07 00:56:10 +08:00
YunaiV 9be9a2fdaf ♻️ refactor(mes): 移除无用的质检方案精简列表接口 2026-04-07 00:43:14 +08:00
YunaiV 2eb9f0c740 ♻️ refactor(card): 移除精简列表相关代码和接口
删除不再使用的获取生产流转卡精简列表的接口及相关逻辑,优化代码结构。
2026-04-07 00:42:58 +08:00
YunaiV 1387509a37 feat(transfer): 新增库存选择功能并优化表单逻辑 2026-04-07 00:31:44 +08:00
YunaiV b173e40ebf feat(select): 继承属性以增强选择组件的灵活性 2026-04-06 23:52:26 +08:00
YunaiV 69e076e496 ♻️ refactor(task): 移除生产任务精简列表相关代码
删除不再使用的生产任务精简列表接口及其相关逻辑,优化代码结构。
2026-04-06 23:43:05 +08:00
YunaiV a585a48ca5 feat(mes): 增加工序选择器的悬停 tooltip 展示详情 2026-04-06 22:40:02 +08:00
YunaiV 796c095044 ♻️ refactor(mes): 清理无用代码和调整组件结构 2026-04-06 22:14:52 +08:00
YunaiV 934baa46d4 feat(type): 新增设备类型树组件并调整导入路径 2026-04-06 20:20:23 +08:00
YunaiV 65a0be187f feat(mes): 增强设备选择器和类型选择器功能
- 更新设备选择器,支持只读输入框和弹窗选择,提升用户体验。
- 增加设备编码、名称、品牌和规格的展示信息。
- 优化设备类型选择器,添加 tooltip 显示选中项的详细信息。
- 移除不再使用的 API 接口,简化代码结构。

这些改动旨在提升用户在选择设备和设备类型时的交互体验,确保信息的完整性和可读性。
2026-04-06 20:04:59 +08:00
YunaiV 16012a5efd feat(mes): 新增点检保养项目选择器和弹窗组件
实现了 MES 点检保养项目的只读输入框和弹窗选择器,支持单选和多选功能。用户可以通过只读输入框查看选中项目的详细信息,并通过点击弹窗进行选择。此功能提升了用户交互体验,简化了项目选择流程。
2026-04-06 19:52:52 +08:00
YunaiV 8701e75a23 feat(mes): 新增点检保养方案选择器组件及弹窗 2026-04-06 19:40:48 +08:00
YunaiV 0ed523ef20 feat(mes):修复 workorder 的路径问题 2026-04-06 19:35:19 +08:00
YunaiV 38016f46ba ♻️ refactor(mes): 移除无用注释 2026-04-06 18:41:45 +08:00
YunaiV 1ecba4a1f8 🎨 style(WmBatchSelectDialog): 调整输入框宽度至 220px 2026-04-06 18:38:46 +08:00
YunaiV ebfd12ebe7 🎨 style(WmBatchSelectDialog): 调整输入框宽度至 220px 2026-04-06 18:38:38 +08:00
YunaiV b36094b90f feat(mes): 新增批次管理相关字段和功能
在批次管理中新增多个字段,包括生产任务编号、工具编号、模具编号、生产批号、质量状态以及日期范围等。更新了相关的请求和响应对象,增强了批次查询功能,支持更多筛选条件。

同时,更新了前端组件以支持新的字段和功能,提升用户体验。
2026-04-06 18:31:18 +08:00
YunaiV 0ea1b51d3b feat(batch): 添加生产工单编号字段并重构选择器组件 2026-04-06 16:59:07 +08:00
YunaiV ed6fdd5894 feat(mes): 增加计量单位选择器的悬停 tooltip 展示详情 2026-04-06 16:33:21 +08:00
YunaiV 018a6975ec feat(mes): 添加状态过滤功能,默认只查询启用项 2026-04-06 16:27:08 +08:00
YunaiV 9b686628be feat(mes): 更新车间和工作站选择器,增加 tooltip 展示详情 2026-04-06 16:01:53 +08:00
YunaiV 88552dc6a2 feat(mes): 增强物料分类选择器和库位选择器的悬停提示功能
为物料分类选择器、库位选择器、库区选择器和仓库选择器添加悬停提示,展示更多详细信息,包括编码、名称、备注等。此改进提升了用户体验,使用户在选择时能够更方便地获取信息。
2026-04-06 13:13:02 +08:00
YunaiV b3d587b1c2 feat(mes): 新增库存记录编号字段并优化盘点行创建逻辑 2026-04-06 12:15:00 +08:00
YunaiV f1aa3e0b5e feat(dialog): 优化选择对话框的搜索表单和数据表格
调整了 MdClientSelectDialog、MdItemSelectDialog 和 MdVendorSelectDialog 组件的搜索表单样式,增加了英文名称和状态的输入项,提升了用户体验。同时,重构了数据表格的结构,确保一致性和可读性。
2026-04-06 12:04:13 +08:00
YunaiV 5f61294aad feat(mes): 增加库位编号和相关查询功能
在库存物资选择对话框中新增库位编号字段,更新查询参数以支持库位的选择和过滤。调整相关组件以确保库位信息的正确显示和交互。
2026-04-06 11:28:35 +08:00
YunaiV a29ea8e4e4 feat(stock): 添加供应商编号并移除库存精简列表接口 2026-04-06 11:16:21 +08:00
YunaiV c4507c6f1f feat(mes): 优化生产工单选择对话框的搜索功能和布局 2026-04-06 10:31:41 +08:00
YunaiV 09836f2972 ♻️ refactor(workorder): 移除工单列表相关代码
删除不再使用的工单列表接口和相关逻辑,简化代码结构,提升可维护性。
2026-04-06 10:21:34 +08:00
YunaiV 797e62710c ♻️ refactor(mes): 移除无用的供应商列表相关代码
清理不再使用的供应商精简列表接口及相关服务方法,优化代码结构。
2026-04-06 01:39:39 +08:00
YunaiV 306ea73838 ♻️ refactor(navigation): 移除无用注释,优化导航逻辑 2026-04-06 01:36:53 +08:00
YunaiV 4d183bf379 feat(mes): 增加生产趋势查询参数验证和首页组件优化
为生产趋势查询添加最小和最大天数验证,确保输入有效性。
优化首页组件,增加数据存在性判断,提升用户体验。
2026-04-06 01:28:30 +08:00
YunaiV fb213bfd76 feat(home): 更新首页组件注释和路由名称
优化首页各个组件的注释,增加可读性,并将导航逻辑中的 URL 替换为路由名称,提升代码的稳定性和可维护性。
2026-04-06 01:12:32 +08:00
YunaiV 8e8c1941b3 ♻️ refactor(mes): 移除无用的客户列表接口和相关代码
清理不再使用的客户精简列表接口及其相关实现,优化代码结构,提升可维护性。
2026-04-06 00:53:32 +08:00
YunaiV 89b38dbdd8 feat(mes): 添加用户已上工的错误码检查 2026-04-06 00:50:13 +08:00
YunaiV 91adaff611 feat(home): 新增 MES 首页统计功能及相关数据结构 2026-04-06 00:50:01 +08:00
YunaiV 163e722e61 feat(statistics): 新增 MES 首页统计功能
实现了 MES 首页的统计功能,包括工单状态分布、生产趋势和汇总统计。新增了相关的 VO 类、服务接口及实现,支持从数据库获取统计数据并返回给前端。

- 添加 MesHomeStatisticsController 控制器
- 实现 MesHomeStatisticsService 接口及其实现
- 新增数据访问层 Mapper 和 XML 配置
- 定义响应 VO 类以适应前端需求
2026-04-05 23:55:59 +08:00
YunaiV 0561636d4f feat(mes): 更新 MES 退料类型和状态常量 2026-04-05 23:52:07 +08:00
YunaiV 00ff024328 feat(mes): 新增当前用户工作站绑定状态 VO 和相关接口 2026-04-05 23:38:23 +08:00
YunaiV 6c276d6ae3 feat(workrecord): 新增 MES 工作记录管理功能
实现工作记录的上下工记录流水,包括分页查询、导出 Excel、上线和下线操作。新增相关的请求和响应 VO,完善数据对象和服务接口,支持用户与工作站的绑定状态管理。
2026-04-05 22:03:57 +08:00
YunaiV 86e8585a31 ♻️ refactor(mes): 移除无用的物料产品相关代码
清理了不再使用的物料产品相关方法和接口,简化了代码结构,提高了可维护性。
2026-04-05 17:20:36 +08:00
YunaiV 998c22d3da feat(mes): 优化物料产品选择器 V2 组件(完善 tooltip 展示) 2026-04-05 12:52:13 +08:00
YunaiV 35e003de64 feat(mes): 优化物料产品选择器 V2 组件(完善 tooltip 展示) 2026-04-05 12:50:00 +08:00
YunaiV 07cd4c47ed feat(mes): 优化物料产品选择器 V2 组件 2026-04-05 12:39:13 +08:00
YunaiV 1f9380ba90 feat(mes): 新增物料产品选择器 V2 组件 2026-04-05 12:28:29 +08:00
YunaiV 9f9ac51edf feat(mes): 新增物料产品选择器 V2 组件 2026-04-05 12:27:32 +08:00
YunaiV 1313347c85 feat(mes): 增强批次追溯功能,添加删除标记过滤
更新 SQL 查询以过滤已删除的记录,确保批次追溯时只返回有效数据。同时,增加了集成测试用例以验证新逻辑的正确性。
2026-04-05 10:40:49 +08:00
YunaiV 53fa5ea202 feat(mes): 增强库存事务处理与编码生成
- 优化 selectByCompositeKey 方法,改进批次 ID 的处理逻辑
- 新增多个错误码以增强错误处理
- 更新样品编号和入库单编号生成逻辑,使用自动编码 API
2026-04-05 00:51:40 +08:00
YunaiV 342b5d08c0 feat(defect): 支持缺陷记录弹窗的编辑和详情模式 2026-04-05 00:00:57 +08:00
YunaiV 4e964e2eea feat(mes): 新增质检方案编码生成与详情模式支持 2026-04-04 22:37:49 +08:00
YunaiV 98714fde0c feat(mes): 新增质检指标结果值属性校验 2026-04-04 21:17:49 +08:00
YunaiV 3ab07d7412 feat(mes): 更新缺陷类型字典和必填字段验证
修改缺陷相关的字典类型为 MES_DEFECT_TYPE,并在缺陷数量字段添加必填验证,确保数据完整性。
2026-04-04 20:54:00 +08:00
YunaiV 23799e7f21 feat(mes): 修改执行生产流转卡为完成生产流转卡 2026-04-04 20:22:47 +08:00
YunaiV 0c4ee24dd3 feat(mes): 新增生产流转卡状态管理功能
- 添加状态字段到 MesProCardRespVO 和相关的前端组件
- 实现提交、执行和取消生产流转卡的 API 接口
- 更新 MesProCardService 和 MesProCardServiceImpl 以支持新功能
- 更新前端表单和列表以显示和操作流转卡状态
2026-04-04 20:07:56 +08:00
YunaiV 8e91178726 feat(mes): 新增生产报工单功能及相关逻辑
新增生产报工单的创建、编辑、提交和审批功能,优化表单交互逻辑,支持自动生成报工单号,提升用户体验。
2026-04-04 19:49:59 +08:00
YunaiV bc098e8999 feat(mes): 优化工单和任务管理功能,增强表单交互逻辑
调整工单表单和任务列表的展示,新增工单完成操作,优化表单数据处理逻辑,提升用户体验。
2026-04-04 17:03:45 +08:00
YunaiV cfa787530e feat(mes): 优化工艺路线管理功能,调整状态处理逻辑
移除工艺路线状态的必填验证,调整状态字段为可选。更新状态切换逻辑,增强用户交互体验,确保状态操作的可用性和提示信息的准确性。
2026-04-04 16:42:26 +08:00
YunaiV 375d5a2236 feat(mes): 更新工艺路线和工序管理界面,增强用户体验
调整表单和列表中的标签,增加字段描述,优化布局,提升可读性和操作性。
2026-04-04 16:24:05 +08:00
YunaiV 609cbb654c feat(mes): 新增工艺路线启用功能及相关逻辑
实现工艺路线的启用功能,允许用户在确认工序和产品 BOM 配置完整后启用工艺路线。同时,优化了表单的状态管理,增强了用户体验。
2026-04-04 12:08:06 +08:00
YunaiV aa5cb50d1d feat(mes): 新增工序详情功能及编码生成逻辑
为工序管理模块新增工序详情查看功能,用户可以通过点击工序编码查看详细信息。同时,更新工序编码生成逻辑,支持自动生成编码,提升用户体验。
2026-04-04 11:34:45 +08:00
YunaiV d18a58f44f feat(mes): 增强工序管理功能,新增工序校验逻辑
新增工序创建和更新时的存在性校验,确保工序有效性。
同时,重构工艺路线服务,优化工序引用检查逻辑。
2026-04-04 11:28:27 +08:00
YunaiV 12566d6860 ♻️ refactor(mes): 优化组件状态管理及注释说明 2026-04-04 10:54:11 +08:00
YunaiV 7e0c226c24 feat(mes): 重构工单状态管理及验证逻辑
移除工单状态字段,优化工单创建和更新时的验证逻辑,确保数据一致性和完整性。更新前端表单,简化状态处理,提升用户体验。
2026-04-04 10:44:17 +08:00
YunaiV b2d86b12d6 feat(mes): 新增生产工单编码及状态管理功能
新增生产工单编码规则和状态管理逻辑,优化工单创建和更新流程。
同时,更新前端表单以支持新的工单状态和来源单据字段,提升用户体验。
2026-04-04 10:15:26 +08:00
YunaiV 469363c046 feat(mes): 更新维修工单表单逻辑及字段展示 2026-04-04 01:22:55 +08:00
YunaiV 307bac15e1 feat(mes): 更新维修工单表单逻辑及状态管理
调整维修工单表单的字段展示逻辑,优化完成维修和验收的操作流程。新增维修完成日期和维修结果的必填校验,确保用户在提交时提供必要信息。同时,修正了表单的可编辑状态,提升用户体验。
2026-04-04 01:17:06 +08:00
YunaiV da1dfa410b feat(mes): 新增维修工单确认完成请求及相关逻辑
新增 MesDvRepairConfirmReqVO 类以处理维修工单确认完成请求,更新相关服务和控制器逻辑以支持新的请求格式。确保维修工单名称和完成日期为必填项,增强了数据验证和状态管理。
2026-04-04 00:54:39 +08:00
YunaiV 86e8d62213 feat(mes): 更新维修工单流程及状态管理
新增维修工单提交、确认和完成验收功能,优化状态流转逻辑。
- 提交维修工单时记录当前用户
- 完成维修后更新状态为待验收
- 完成验收时支持通过与不通过的结果记录

确保维修工单的状态管理更加清晰,提升用户体验
2026-04-04 00:46:02 +08:00
YunaiV 1005ec0eb6 feat(mes): 新增维修工单状态流转功能
实现维修工单的状态流转,包括提交、完成维修和验收功能。新增相关接口和状态枚举,优化了维修工单的管理流程,确保状态的准确性和一致性。
2026-04-04 00:21:58 +08:00
YunaiV 7999232771 feat(mes): 新增维修工单编码唯一性校验及设备编号字段
新增维修工单编码的唯一性校验逻辑,确保在创建和更新维修工单时编码不重复。同时,新增设备编号字段以便于关联设备信息,提升维修工单管理的准确性和完整性。
2026-04-03 23:30:40 +08:00
YunaiV a8e68c155a feat(mes): 更新保养记录状态值及表单操作逻辑
调整保养记录状态值,确保状态与操作逻辑一致。新增表单提交功能,允许在编辑模式下提交保养记录,优化用户体验。
2026-04-03 22:54:27 +08:00
YunaiV efdb18c05b feat(mes): 优化保养项目弹窗及按钮文本
更新保养项目明细的标题,调整按钮文本格式,提升用户体验。
2026-04-03 21:48:28 +08:00
YunaiV 7b98e87849 feat(mes): 更新保养记录相关字段及新增功能
调整保养记录请求对象,新增保养计划编号、设备编号和保养人编号字段。更新查询逻辑以支持新字段,并新增获取保养记录明细列表和根据记录编号删除明细的功能。优化表单组件以支持详情模式。
2026-04-03 19:02:22 +08:00
YunaiV b5063758e5 feat(mes): 新增点检记录明细的项目类型字段及批量创建功能
新增项目类型字段到点检记录明细响应对象,并在控制器和服务层中实现批量创建点检记录明细的功能。此变更提升了点检记录的灵活性和可扩展性。
2026-04-03 09:54:16 +08:00
YunaiV 0c0de1eb45 feat(mes): 新增点检保养项目编码及相关逻辑 2026-04-03 08:37:33 +08:00
YunaiV ca892047fb ♻️ refactor(mes): 重命名自动编码相关组件文件 2026-04-03 08:35:32 +08:00
YunaiV e035774e38 feat(mes): 优化点检方案表单及子资源列表的编辑逻辑
调整点检方案表单,简化字段的禁用逻辑,确保在编辑模式下可以生成方案编码。更新子资源列表组件,基于表单类型动态控制操作权限,提升用户体验。
2026-04-03 08:19:44 +08:00
YunaiV 476dd53a3c feat(mes): 新增点检方案设备和项目的重复校验逻辑
新增设备和项目在同一方案下的重复校验,避免用户重复添加相同设备或项目。同时,增强了点检方案停用时的状态校验,确保只有已启用的方案才能被停用。
2026-04-03 00:49:00 +08:00
YunaiV b25cb1dd0f feat(mes): 新增计划编码、开始时间、结束日期及频率信息字段 2026-04-03 00:10:35 +08:00
YunaiV acf673d2d2 feat(mes): 新增设备台账点检、保养和维修记录列表组件 2026-04-02 23:50:24 +08:00
YunaiV 2ddfb9b722 feat(mes): 优化设备编码生成与表单交互逻辑
增强设备编码输入的交互体验,禁用生成按钮在更新状态下,确保用户操作的准确性。同时,添加了 TODO 注释以便后续功能实现的对接。
2026-04-02 23:24:46 +08:00
YunaiV 3db2347f67 feat(mes): 新增设备编码生成逻辑及相关常量 2026-04-02 22:37:04 +08:00
YunaiV 4bbe313ef8 feat(mes): 新增设备台账导入功能及相关接口
新增设备台账导入功能,支持从 Excel 文件批量导入设备信息。实现了导入模板的生成和导入结果的反馈,包括成功创建和更新的设备编码,以及导入失败的原因提示。同时,更新了设备类型和车间的校验逻辑,确保数据的有效性和完整性。
2026-04-02 22:27:11 +08:00
YunaiV 5ea8c24410 feat(mes): 增强设备类型编码的输入验证与生成逻辑
为设备类型编码字段添加非空验证,确保用户输入有效数据。同时,更新前端表单,允许用户手动输入或点击生成按钮来生成编码,提升用户体验。
2026-04-02 22:00:50 +08:00
YunaiV 1cf4f0128c feat(mes): 替换用户选择组件,简化用户搜索逻辑 2026-04-02 21:28:29 +08:00
YunaiV 1b3a41da14 feat(mes): 优化排班日历查询逻辑,支持批量班组查询
重构排班日历查询功能,简化代码实现,支持一次性查询多个班组的排班记录。
新增班组编号集合字段,提升查询效率和可读性。
2026-04-02 19:54:18 +08:00
YunaiV f8553abcdd feat(mes): 新增假期设置列表支持日期范围过滤功能
更新假期设置列表接口,支持可选的开始和结束日期参数,优化前端日历组件的数据获取逻辑,提升用户体验。
2026-04-02 10:03:50 +08:00
YunaiV fc21347c59 feat(mes): 重构机械类型校验逻辑,简化代码实现 2026-04-02 09:49:50 +08:00
YunaiV e41961283c feat(mes): 优化 cal plan 的代码实现 2026-04-02 01:36:36 +08:00
YunaiV 71c7d498f1 feat(mes): 新增查看模式下的只读功能及相关按钮逻辑 2026-04-02 00:34:22 +08:00
YunaiV f133e4f5c5 feat(mes): 更新班组表单和成员列表组件逻辑
优化班组表单的弹窗标题逻辑,支持不同表单类型的动态标题显示。调整成员列表组件,确保操作按钮仅在编辑模式下可见。简化消息提示内容,提升用户体验。
2026-04-02 00:27:23 +08:00
YunaiV e0238243aa feat(mes): 移除冗余的班组类型枚举引用及相关注释 2026-04-01 23:54:49 +08:00
YunaiV f85979e025 feat(mes): 新增日期工具方法及排班请求字段
新增获取指定日期所在季度和周的第一天的方法,增强日期处理能力。
同时在排班请求中添加班组类型、开始日期和结束日期字段,完善排班计划功能。
2026-04-01 20:40:18 +08:00
YunaiV 8de07f5337 feat(mes): 新增班组排班记录生成逻辑及相关字段校验
实现班组排班记录的生成逻辑,增加了班组类型和用户存在性校验,优化了排班记录的批量写入方式。同时,新增了相关错误码以处理班组和班次数量不足的情况。
2026-04-01 19:12:53 +08:00
zhulianghu 74128f53a5 fix: 修复响应拦截器 code=0 的逻辑错误 2026-04-01 09:53:32 +08:00
YunaiV c68d64a585 feat(mes): 新增批次生成逻辑及相关字段处理
实现批次的生成或获取逻辑,自动关联外协工单和物料信息。更新了相关数据对象和服务实现,确保在创建和更新外协工单行时能够正确处理批次信息。
2026-04-01 01:45:34 +08:00
YunaiV 95b4c9242c feat(mes): 新增外协工单编码字段及相关查询逻辑 2026-04-01 01:19:52 +08:00
YunaiV a21d5193f7 feat(mes): 新增批次编码字段及外协工单编码处理逻辑 2026-04-01 00:42:54 +08:00
YunaiV f9e3eba6b6 feat(mes): 优化外协入库单表单与列表交互逻辑
新增入库单编号的可点击链接,优化表单提交与完成入库的逻辑,提升用户体验。
2026-04-01 00:15:25 +08:00
YunaiV ffb833d822 feat(mes): 新增工单类型过滤和批次编码处理逻辑
在生产工单精简列表接口中新增工单类型参数,支持根据工单类型过滤工单列表。同时,在外协发料单行的创建和更新中,新增批次编码字段,并实现根据批次编码自动解析批次 ID 的功能,提升数据处理的灵活性和准确性。
2026-03-31 23:22:23 +08:00
YunaiV 8effbce819 feat(mes): 更新外协发料单表单和行列表单逻辑
调整外协发料单明细表单的宽度,优化物料选择逻辑,增加备注字段,并修正批次号的标签。确保表单与后端数据校验一致,提高用户体验。
2026-03-31 22:53:41 +08:00
YunaiV 2b9da6c2a2 feat(mes): 新增外协发料单编码和数据校验逻辑
新增外协发料单编码常量,更新相关服务以支持外协发料单的创建和校验逻辑。优化了发料单的创建、更新和取消流程,确保数据的完整性和有效性。
2026-03-31 22:38:53 +08:00
YunaiV 89b61ba3cd feat(mes): 新增生产流转卡和装箱单精简列表接口
新增获取生产流转卡和装箱单的精简列表接口,主要用于前端下拉选项选择,提升用户体验。同时,更新条码配置相关逻辑,增加条码配置关联检查,确保数据一致性。
2026-03-31 21:14:07 +08:00
YunaiV 26272b7b12 feat(mes): 更新操作按钮,移除完成功能 2026-03-31 20:11:12 +08:00
YunaiV 6611156170 feat(mes): 优化装箱单表单逻辑,增强用户交互体验
更新装箱单表单的操作逻辑,新增编辑、完成和删除功能,优化表单字段的可编辑性和状态管理。确保在编辑模式下用户可以保存修改,并在完成操作前进行确认,提升用户体验和数据安全性。
2026-03-31 20:05:13 +08:00
YunaiV 6dc20ba950 feat(mes): 优化库存冻结逻辑,更新盘点任务处理流程
重构库存冻结和解冻逻辑,合并相关方法以提高代码可读性和维护性。
新增表单提交和执行盘点的处理逻辑,确保用户操作的流畅性和准确性。
2026-03-31 19:38:04 +08:00
YunaiV 134cddc54c feat(mes): 优化条件值校验逻辑,调整 valueId 处理方式 2026-03-31 18:47:57 +08:00
YunaiV 55ca892c9c feat(mes): 新增盘点方案保存数据校验逻辑,优化动态盘点时间处理 2026-03-31 18:31:53 +08:00
YunaiV abe63d39db feat(mes): 新增盘点方案编码和任务编码常量,更新错误码提示
新增盘点方案编码和盘点任务编码常量,以支持新的盘点功能。同时,更新相关错误码提示,确保用户在操作时获得准确的信息。
2026-03-31 18:14:42 +08:00
YunaiV 03bc24d3f7 feat(mes): 更新转移调拨单编码常量名称 2026-03-31 16:03:35 +08:00
YunaiV 9d3fe736aa feat(mes): 新增转移单行和明细的删除功能,优化删除逻辑
新增通过行ID和转移ID删除转移单行和明细的功能,简化了删除操作,提升代码可读性和维护性。同时,增加了转移数量超过库存数量的错误码,增强了系统的健壮性。
2026-03-31 15:35:05 +08:00
YunaiV 6282cdf979 feat(mes): 新增单据状态字段,更新库存冻结状态批量处理 2026-03-31 12:18:16 +08:00
YunaiV 725a16866a feat(mes): 优化转移单操作按钮和表单逻辑
调整转移单操作按钮的显示逻辑,简化表单提交和确认流程。新增状态判断以支持不同操作模式,提升用户交互体验。
2026-03-31 11:08:41 +08:00
YunaiV c94cfa2ecb feat(mes): 新增来源单据编号和类型字段,更新必填验证 2026-03-31 10:03:05 +08:00
YunaiV 4de57ee672 feat(mes): 新增入库单行级联删除功能
实现了根据入库单编号删除所有相关行的功能,增强了数据管理的灵活性和一致性。
2026-03-31 09:01:57 +08:00
YunaiV 76f47a476b 🎨 style(mes): 统一代码格式,优化可读性 2026-03-30 23:23:23 +08:00
YunaiV 920799534a feat(mes): 新增库区和库位编号必填验证 2026-03-30 23:22:53 +08:00
YunaiV 6e58d4d73f feat(mes): 优化杂项出库单表单,移除提交功能并调整字段逻辑
移除杂项出库单表单中的提交按钮,简化用户操作流程。调整表单字段逻辑,确保在编辑和查看模式下的字段状态一致,提升用户体验。
2026-03-30 23:05:39 +08:00
YunaiV e954777753 feat(mes): 新增来源单据编号和来源单据类型字段
在表单中添加来源单据编号和来源单据类型字段,以支持更详细的出库单信息。同时,更新了相关的状态和类型字段,优化了表单的交互体验。
2026-03-30 22:50:40 +08:00
YunaiV 45cc9ad129 feat(mes): 更新出库单相关字段和编码规则
调整出库单表单和列表的字段标签,新增批次号字段,优化操作按钮格式,并添加编码规则的TODO注释,以便后续开发。
2026-03-30 22:35:16 +08:00
YunaiV 57b75b5201 feat(mes): 优化销售出库拣货明细表单布局
调整表单布局为三行显示,提升用户体验。修改出库仓库、库区、库位和批次号字段为禁用状态,以符合业务逻辑。
2026-03-30 22:22:34 +08:00
YunaiV 87a286ca5d feat(mes): 优化销售出库表单布局和交互逻辑
调整销售出库表单的模板结构,改善运输信息的展示逻辑,确保在不同模式下的可用性和可读性。增加了对表单项的计算属性支持,以提升用户体验。
2026-03-30 22:07:59 +08:00
YunaiV 47db6c3b4c feat(mes): 新增批次号和出厂检验标志字段
在相关数据对象中新增批次号和出厂检验标志字段,并在服务层实现相应的逻辑校验。此变更旨在增强库存管理的灵活性和准确性。
2026-03-30 21:51:40 +08:00
YunaiV 47355814a2 feat(mes): 新增批次号字段并重命名收货地址字段 2026-03-30 20:56:41 +08:00
YunaiV 7e3693d18c feat(mes): 新增库存记录ID和收货地址字段
在销售出库相关的多个数据对象中新增库存记录ID和收货地址字段,以支持更全面的出库信息管理。这些字段将帮助在出库单中更好地追踪库存和收货信息,提高系统的可用性和用户体验。
2026-03-30 20:35:23 +08:00
YunaiV 09f95d5fad feat(mes): 新增销售订单号查询输入框 2026-03-30 19:27:11 +08:00
YunaiV 64e7b17631 feat(mes): 新增执行退货功能及相关逻辑优化 2026-03-30 19:22:29 +08:00
YunaiV 696069e212 feat(mes): 新增销售退货单状态和编码逻辑
新增销售退货单的状态枚举和编码常量,优化了退货单的操作逻辑,支持新的质检和提交功能。
2026-03-30 19:16:08 +08:00
YunaiV 0ff490499e feat(mes): 优化发货通知单表单和列表功能
重构发货通知单的表单和列表展示,新增执行出库按钮,优化客户选择组件,提升用户体验。调整表单字段的可编辑状态,确保在不同操作模式下的交互逻辑清晰。
2026-03-30 18:22:30 +08:00
YunaiV 12c04def97 feat(mes): 移除库存物资记录编号字段并优化批次处理逻辑 2026-03-30 18:05:31 +08:00
YunaiV 62f4c62e3d feat(mes): 新增库存物资记录编号字段及相关逻辑 2026-03-30 17:53:58 +08:00
YunaiV e41d14bb67 feat(mes): 新增库存物资记录编号字段及相关逻辑 2026-03-30 15:50:31 +08:00
lijiahui 491e09c136 fix: 菜单名称过长时没有正确显示省略号 2026-03-30 15:31:51 +08:00
YunaiV d8dbbf156e feat(mes): 新增发货通知单编码和删除明细逻辑校验 2026-03-30 15:18:32 +08:00
YunaiV 79d63523fe feat(mes): 增强产品入库单功能,新增数量校验和明细检查
新增上架数量的正数校验,确保入库单的数量大于0。同时,增加了收货单明细为空的错误提示,提升数据完整性和用户体验。
2026-03-30 12:54:12 +08:00
YunaiV 4ec4c4dd09 feat(mes): 优化退料单功能,新增提交和执行退料操作 2026-03-30 12:17:03 +08:00
YunaiV 91b2fbb659 feat(mes): 新增库存记录和批次编码字段,优化退料单功能
在退料单相关的多个类中新增库存记录 ID 和批次编码字段,以支持更精确的库存管理和数据校验。同时,更新了相关的表单和服务逻辑,确保新字段的正确使用和验证。
2026-03-30 11:48:09 +08:00
YunaiV b82bb858d0 feat(mes): 重构领料出库单操作逻辑,优化表单提交和删除功能
重构了领料出库单的操作逻辑,合并了提交和完成操作的处理方式,简化了代码结构。新增了表单提交前的修改检查,确保数据一致性。同时,优化了删除操作的实现,提升用户体验。
2026-03-30 11:31:15 +08:00
YunaiV daa269e4ce feat(mes): 优化领料出库拣货明细表单布局,新增库存记录选择 2026-03-30 10:48:32 +08:00
YunaiV 6c968ac5b7 feat(mes): 增强领料出库单功能,新增客户信息和行数据校验 2026-03-30 10:17:14 +08:00
YunaiV ef2b54316e feat(mes): 优化库存选择器和退货明细表单布局
调整库存选择器为下拉选择组件,支持前端过滤,提升用户体验。更新退货明细表单,增加库存记录选择,优化表单布局,确保信息展示更为清晰。
2026-03-29 23:16:56 +08:00
YunaiV 51e8cd35fa feat(mes): 优化库存选择器和退货明细表单布局
调整库存选择器为下拉选择组件,支持前端过滤,提升用户体验。更新退货明细表单,增加库存记录选择,优化表单布局,确保信息展示更为清晰。
2026-03-29 23:08:48 +08:00
YunaiV 23bf42c4ad feat(mes): 优化库存选择器和退货明细表单布局
调整库存选择器为下拉选择组件,支持前端过滤,提升用户体验。更新退货明细表单,增加库存记录选择,优化表单布局,确保信息展示更为清晰。
2026-03-29 23:08:42 +08:00
YunaiV 4f76374065 feat(mes): 更新删除操作注释为更明确的描述 2026-03-29 21:57:35 +08:00
YunaiV fe6e80271d feat(mes): 优化删除按钮操作及表单数据处理逻辑 2026-03-29 21:57:26 +08:00
YunaiV 5856838c73 feat(mes): 优化退货单操作逻辑,简化提交与完成流程 2026-03-29 21:43:46 +08:00
YunaiV 1f2a0904f4 feat(mes): 增强退货单功能,新增行数据校验与删除逻辑
- 新增退货数量字段的校验,确保其大于 0
- 增加根据行 ID 删除明细的功能
- 新增退货单编码的定义
- 增强退货单状态校验,确保状态为草稿才能进行删除操作
2026-03-29 21:01:14 +08:00
YunaiV 5efcbffd67 ♻️ refactor(mes): 重命名返回供应商相关文件 2026-03-29 20:25:02 +08:00
YunaiV f7f6e7ce93 feat(mes): 优化到货通知单和行的表单逻辑
调整到货通知单和行的表单结构,增强用户体验。修改了表单字段的布局和逻辑,确保数据的有效性和可用性。更新了相关组件的引用,提升代码的可读性和维护性。
2026-03-29 20:02:15 +08:00
YunaiV 88dcf7f74f feat(mes): 增强到货通知单表单逻辑与交互
更新到货通知单表单,增加字段的只读状态控制,优化用户交互体验。新增表单数据快照功能以支持脏检查,确保用户在提交前确认修改。调整按钮逻辑以适应不同表单状态,提升整体可用性。
2026-03-29 19:36:59 +08:00
YunaiV 32a830b595 feat(mes): 新增到货通知单编码及相关逻辑处理 2026-03-29 19:13:37 +08:00
YunaiV 166caaa72c feat(mes): 新增到货通知单编码及相关逻辑处理 2026-03-29 19:11:04 +08:00
YunaiV 43e80f868a feat(mes): 优化入库单表单逻辑和状态管理
调整表单字段和状态管理,简化逻辑处理,确保在创建和编辑模式下正确传递数据。增强了用户体验,提升了代码可读性和维护性。
2026-03-29 18:24:08 +08:00
YunaiV 63b212c514 feat(mes): 新增采购订单号字段及相关逻辑处理 2026-03-29 18:13:50 +08:00
YunaiV 98a227a609 🗑️ chore(mes): 清理已移除的冗余 Tab 组件(ClientProductSalesTab、VendorItemReceiptTab、BatchTraceDetailTab) 2026-03-29 16:27:11 +08:00
YunaiV 736f7d2455 feat(mes): 添加 overflow-hidden 类以改善组件布局 2026-03-29 12:09:42 +08:00
YunaiV dba8ef1ab5 feat(mes): 新增采购订单号字段及相关逻辑处理 2026-03-29 11:22:53 +08:00
YunaiV 526879fa60 feat(mes): 新增采购入库单编码常量及生成逻辑 2026-03-29 10:51:55 +08:00
YunaiV cc640d8801 feat(mes): 添加数量校验逻辑,更新入库明细处理
新增对上架数量和入库数量的校验逻辑,确保入库明细的总数量不超过行入库数量。优化了入库单和入库明细的创建与更新流程,提升数据一致性和准确性。
2026-03-29 10:41:16 +08:00
YunaiV 45f8ea64c7 feat(mes): 新增批次详情弹窗及相关逻辑 2026-03-29 10:24:31 +08:00
YunaiV 884fb1bf66 feat(mes): 新增获取批次详情接口,更新相关逻辑 2026-03-29 10:17:57 +08:00
YunaiV efd463893e feat(mes): 更新工具编码及可用数量字段,添加校验逻辑
将工具编码字段设置为必填,并添加相应的校验逻辑。更新可用数量字段名称为更具描述性的名称,确保代码一致性和可读性。同时,调整相关逻辑以支持新的字段名称。
2026-03-29 10:04:59 +08:00
YunaiV d264c06830 feat(mes): 更新保养维护类型字段及相关校验逻辑 2026-03-29 09:46:14 +08:00
YunaiV 5e57cafb22 feat(mes): 新增工具类型编码及相关校验逻辑
添加工具类型编码字段,并重构工具类型的保存和更新逻辑,简化数据校验过程。更新表单组件以支持新功能,优化用户体验。
2026-03-29 09:30:47 +08:00
YunaiV 53bfa9be57 feat(mes): 更新物料库存查询逻辑,优化仓库选择组件 2026-03-29 09:17:37 +08:00
YunaiV 4d151e0d5b feat(mes): 移除生成编码按钮的禁用状态 2026-03-29 00:06:20 +08:00
YunaiV 872fa9fe19 ♻️ refactor(mes): 移除多余的布局行,优化表单结构 2026-03-28 23:29:53 +08:00
YunaiV 53fbb03ad4 feat(mes): 重构库区混放规则更新逻辑,简化接口调用 2026-03-28 23:26:57 +08:00
YunaiV fdcc30415a feat(mes): 优化库位和库区管理功能,合并混放规则设置接口
整合物料混放和批次混放的设置接口为一个更新接口,简化了API调用。
同时,增加了库位和库区编码的生成逻辑,提升了用户体验。
2026-03-28 20:58:30 +08:00
YunaiV 5e1618b1c0 feat(mes): 添加虚拟仓库和库区删除校验,优化物料混放规则更新 2026-03-28 20:25:00 +08:00
YunaiV 075629e49c feat(mes): 添加车间详情链接和表单只读模式
在工作站列表中为车间编码添加了详情链接,点击后可查看车间详细信息。同时,在工作站表单中增加了只读模式,确保在查看详情时无法修改数据。
2026-03-28 19:04:13 +08:00
YunaiV 351ee4fb0d feat(mes): 添加工作站设备资源的级联删除功能
新增按工作站编号删除设备资源的功能,确保在删除工作站时,相关的设备资源能够被自动清理,提升数据一致性和管理效率。
2026-03-28 18:51:12 +08:00
YunaiV f1b7e53b08 feat(mes): 更新工作站表单,添加工序和设备选择功能 2026-03-28 18:06:46 +08:00
YunaiV 1ad04812e1 feat(mes): 添加工序编号及名称,优化工作站相关功能
新增工序编号和名称字段,更新工作站相关逻辑以支持工序信息的处理。优化工作站的创建、更新和查询功能,确保工序信息的有效性和完整性。
2026-03-28 17:54:07 +08:00
YunaiV 78e8ec1772 feat(mes): 添加客户英文名称及出库单查询功能
新增客户英文名称字段,优化客户信息展示。实现按客户编号查询销售出库单列表的功能,提升用户体验。
2026-03-28 17:19:31 +08:00
YunaiV 480564042e feat(mes): 添加供应商入库单列表功能,优化物料清单展示 2026-03-28 16:52:21 +08:00
YunaiV 3ac19a0c73 feat(mes): 更新供应商相关逻辑,添加英文名称及引用校验功能
重构供应商数据模型,替换供应商等级为英文名称,并在相关服务中添加对供应商引用的校验逻辑,以确保数据一致性和完整性。
2026-03-28 16:00:04 +08:00
YunaiV f3138d8cd5 feat(mes): 添加工序存在性校验功能,优化物料表单 2026-03-28 10:56:58 +08:00
YunaiV 3b62e38087 feat(mes): 添加物料分类变更处理逻辑,优化弹窗标题显示 2026-03-28 10:38:48 +08:00
YunaiV 55198c3747 feat(mes): 优化物料分类选择器,禁用分支节点选择 2026-03-28 10:30:24 +08:00
YunaiV b6bc58d104 feat(mes): 添加物料产品状态更新功能,优化物料分类选择器 2026-03-28 10:08:17 +08:00
YunaiV db6a9aeabe feat(mes): 添加物料产品状态更新功能,优化物料分类选择器 2026-03-28 09:47:38 +08:00
YunaiV 3860970490 feat(mes): 添加物料选择弹窗组件,优化物料编码生成逻辑
新增物料选择弹窗组件,支持物料分类树和物料列表的搜索与选择功能。优化物料编码生成方法,使用自动编码规则生成物料编码,提升用户体验。
2026-03-28 09:14:55 +08:00
YunaiV 856e8f6a76 feat(mes): 添加条件渲染和调整表单标签宽度 2026-03-28 08:34:04 +08:00
YunaiV 1993e46eb6 feat(mes): 重构「完成」操作逻辑,优化表单处理
更新了多个表单的完成操作逻辑,确保在表单修改后先保存数据再完成检验单。此变更提升了用户体验,避免了数据丢失的风险。
2026-03-27 22:48:18 +08:00
YunaiV 0befdd32ad feat(mes): 添加样品编号生成方法,优化质检表单 2026-03-27 21:54:24 +08:00
YunaiV 4e05ad4691 feat(mes): 更新销售出库单状态流转逻辑,添加 OQC 检验支持
优化销售出库单的状态流转逻辑,新增待检测状态以支持 OQC 检验。根据检验结果自动流转状态,提升出库流程的灵活性和准确性。
2026-03-27 19:57:14 +08:00
YunaiV 49b0de72df feat(mes): 更新质检标志字段,优化相关逻辑
将多个类中的质检标志字段从 `iqcCheck` 和 `qcFlag` 更新为 `iqcCheckFlag` 和 `rqcCheckFlag`,以提高代码一致性和可读性。同时,更新相关逻辑以自动计算质量状态,确保系统在处理质检时的准确性。
2026-03-27 19:28:20 +08:00
YunaiV f39c47a58b feat(mes): 更新待检任务查询,优化字段描述和逻辑
- 修改待检任务查询的注释,提升可读性
- 在 IQC 相关逻辑中添加事务管理
- 更新表单字段,调整来源单据类型和名称
2026-03-27 18:22:30 +08:00
YunaiV addba55f2d feat(mes): 添加检测工具字段,优化出货检验单数据结构
新增检测工具字段以支持更全面的检验信息,同时优化相关数据结构,提升系统的可用性和灵活性。
2026-03-27 17:26:08 +08:00
YunaiV 3c1d5eb01a feat(mes): 更新退货检验单相关字段,优化数据结构和逻辑 2026-03-26 22:38:27 +08:00
YunaiV be159c7070 feat(mes): 添加来源单据编号字段,优化数据结构 2026-03-26 21:44:05 +08:00
YunaiV 9959c6c5f6 feat(mes): 更新退货检验单表单,修正名称并优化字段处理 2026-03-26 13:26:16 +08:00
YunaiV 047e2d08c5 feat(mes): 更新退货检验单逻辑,支持合格/不合格数量拆分
优化退货检验单的处理逻辑,新增对合格品和不合格品数量的支持。实现了根据检验结果更新退货单行的质量状态,并在部分合格的情况下进行行拆分。同时,更新了相关的接口和数据结构,确保数据一致性和完整性。
2026-03-25 23:37:29 +08:00
YunaiV 7736768a3e feat(mes): 添加工单、工作站、任务和客户信息字段 2026-03-25 21:04:24 +08:00
YunaiV d79d6084c3 feat(mes): 添加过程检验单编码,更新工作站校验方法返回类型 2026-03-24 22:38:28 +08:00
YunaiV cbf173b75b feat(mes): 更新单据状态字段宽度,优化界面布局 2026-03-24 21:09:16 +08:00
YunaiV cbbf44e6ab feat(mes): 移除来源单据编号字段,优化数据结构 2026-03-24 21:05:11 +08:00
YunaiV eef5ec9b78 feat(mes): 更新来源单据类型为整型,优化数据一致性
将来源单据类型字段从字符串更改为整型,以提高数据一致性和类型安全性。同时,添加了相关的枚举类型以支持新的字段定义。
2026-03-24 14:03:16 +08:00
YunaiV c9b99e9465 feat(mes): 重命名待检数量字段,优化数据一致性 2026-03-24 09:37:03 +08:00
YunaiV 23748e3433 feat(mes): 添加质检标识字段,优化入库单信息管理 2026-03-24 09:03:03 +08:00
YunaiV 74879e0933 feat(mes): 禁止修改物料和模板字段,优化表单状态管理 2026-03-23 23:37:02 +08:00
YunaiV 8ea418890d ♻️ refactor(mes): 移除更新成功后的窗口关闭逻辑 2026-03-23 23:06:50 +08:00
YunaiV ec48c03486 feat(mes): 添加来料检验单编码规则和优化界面元素
新增来料检验单编码规则,支持自动生成检验单编号。优化了多个表单中的分隔符样式,提升用户体验。
2026-03-23 23:03:50 +08:00
YunaiV 251dd5b720 feat(mes): 更新 IqcForm 组件逻辑,优化新增和更新操作 2026-03-23 22:10:05 +08:00
YunaiV 06689709ea feat(mes): 移除状态字段并添加来料日期选择功能
移除不再使用的状态字段,简化数据结构。同时在前端表单中添加来料日期选择功能,以便用户输入相关信息。
2026-03-23 22:00:47 +08:00
YunaiV f9717b63ea feat(mes): 重命名生产领料出库相关类和接口,统一为产品领料出库命名
重构生产领料出库相关的类、接口和API,统一命名为产品领料出库,以提高代码的一致性和可读性。包括修改相关的状态枚举、数据对象、服务接口及其实现,确保所有引用均已更新。

BREAKING CHANGE: 相关类和接口的名称已更改,需更新调用代码
2026-03-23 21:32:18 +08:00
YunaiV 46f72e85a8 feat(mes): 修改库存冻结标识字段名称为 'frozen' 2026-03-23 13:02:47 +08:00
DevDengChao 5959539a03 docs: add Vite 8 upgrade and validation notes
- document Vite 8 config migration notes
- record effective upgrade validation commands and existing baseline issues

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 11:10:23 +08:00
DevDengChao 26c7544829 chore: upgrade vite to 8.0.1 and @vitejs/plugin-legacy to 8.0.0
- vite
- @vitejs/plugin-legacy
- adapt vite.config.ts for Vite 8 code splitting and Lightning CSS recovery

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 11:08:26 +08:00
DevDengChao c792f5fa0f chore: upgrade stylelint-order to 8.1.1
- stylelint-order

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 11:00:59 +08:00
DevDengChao f497bf8e23 chore: upgrade wangEditor and BPMN packages
- @wangeditor-next/editor
- @wangeditor-next/plugin-mention
- bpmn-js
- diagram-js
- bpmn-js-token-simulation

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 10:58:02 +08:00
DevDengChao eade6bd9a4 chore: upgrade eslint, stylelint, typescript-eslint and unocss
- eslint
- stylelint
- typescript-eslint
- unocss
- @unocss/eslint-config
- @unocss/eslint-plugin
- @unocss/transformer-variant-group

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 10:53:25 +08:00
DevDengChao 91c97d7302 chore: upgrade @vitejs/plugin-vue*, rollup, sass, vue-tsc and Vite helpers
- @vitejs/plugin-vue
- @vitejs/plugin-vue-jsx
- rollup
- sass
- vite-plugin-eslint2
- vite-plugin-svg-icons-ng
- vue-tsc

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 10:48:47 +08:00
DevDengChao 27b3c36976 chore: upgrade vue, vue-router, element-plus, vue-i18n and dayjs
- vue
- vue-router
- element-plus
- vue-i18n
- dayjs

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 10:43:21 +08:00
DevDengChao bfcce06577 chore: upgrade @commitlint/*, @types/*, lint-staged, terser and @iconify/json
- @commitlint/cli
- @commitlint/config-conventional
- @iconify/json
- @types/node
- @types/qs
- lint-staged
- terser

Co-authored-by: OpenAI Codex <codex@openai.com>
2026-03-23 10:39:12 +08:00
YunaiV 55845bded4 feat(mes): 修改库存冻结标识字段名称为 'frozen'
将库存相关的冻结标识字段从 'frozenFlag' 修改为 'frozen',以提高代码一致性和可读性。涉及多个数据对象和请求/响应对象的更新。
2026-03-23 09:58:07 +08:00
YunaiV e6f05a0d52 feat(mes): 添加仓库、库区和库位名称字段及相关校验 2026-03-22 21:53:26 +08:00
YunaiV 20bdd0ad31 feat(mes): 更新库存管理逻辑,重命名字段并添加事务记录
重构库存管理相关的请求和响应对象,更新字段名称以提高语义清晰度。新增库存事务流水记录,支持库存增减事件的追踪。此变更旨在提升库存管理的可维护性和可读性。
2026-03-22 16:31:59 +08:00
YunaiV 4b08ee3d97 ♻️ refactor(mes): 移除流转卡相关的状态和时间字段,简化请求和响应对象 2026-03-21 22:25:58 +08:00
YunaiV 478268f9c9 feat(mes): 重构生产入库单行相关逻辑,更新字段及接口
重命名和更新了生产入库单行的请求和响应对象,调整了字段名称以更好地反映业务逻辑。同时,优化了控制器中的相关方法,确保与新的数据结构一致。此变更旨在提升代码的可读性和维护性。
2026-03-21 21:23:56 +08:00
YunaiV 6a7fd807b8 feat(wm): 删除多余的 productproduct 界面 2026-03-21 00:22:02 +08:00
YunaiV d6fc4ad3ef feat(mes): 添加物料消耗记录行的请求和响应 VO 及控制器
新增物料消耗记录行的请求和响应数据对象,包含分页请求和响应结构。
同时实现了控制器以支持根据报工编号分页获取消耗行列表的功能。
2026-03-19 23:55:27 +08:00
YunaiV 434d68ac11 feat(mes): 添加报工审批功能,优化状态管理
新增报工审批功能,包括审批通过和驳回的逻辑,优化了状态枚举和表单交互,提升用户体验。
2026-03-19 13:09:37 +08:00
YunaiV 424f3d04c1 feat(mes): 添加报工人和审核人字段,优化审批逻辑 2026-03-19 08:40:56 +08:00
YunaiV 6553ab1875 feat(mes): 重构报工审批逻辑,更新相关字段和接口
优化报工审批功能,修改了相关的请求和响应对象,移除不必要的字段,新增任务信息的自动填充逻辑。调整了控制器中的方法名称和权限校验,确保审批流程的清晰和一致性。
2026-03-18 21:49:34 +08:00
YunaiV b6a6479ced feat(mes): 添加条件渲染以显示删除按钮 2026-03-17 21:49:04 +08:00
YunaiV ea35423d9e feat(mes): 添加安灯呼叫记录创建和更新请求 VO 2026-03-17 21:15:47 +08:00
YunaiV 8774ea3dad feat(mes): 添加角色选择器组件,优化安灯呼叫配置 2026-03-17 13:24:02 +08:00
YunaiV 0571b98552 feat(mes): 添加工艺路线编号字段,优化任务查询逻辑 2026-03-17 13:07:41 +08:00
YunaiV 5418806b9f feat(mes): 优化任务名称构建逻辑,支持数量动态更新
重构任务名称构建逻辑,使用独立方法生成任务名称,确保在创建和更新任务时数量信息正确显示。更新甘特图配置,允许在编辑状态下拖动和调整任务持续时间,提升用户交互体验。
2026-03-17 09:51:48 +08:00
YunaiV 0a0cd5f165 feat(mes): 优化生产任务保存请求和验证逻辑
调整生产任务保存请求的字段为可选,简化编辑时的请求参数。更新任务验证逻辑,确保在更新时只校验存在的字段,提升用户体验和代码可维护性。同时,新增甘特图编辑页面,支持批量保存任务修改。
2026-03-16 23:28:27 +08:00
YunaiV 98c8b9a5cf feat(mes): 添加甘特图任务类型映射和国际化支持
新增甘特图组件的任务类型映射,使用 BarcodeBizTypeEnum 枚举来处理后端类型。同时,优化了中文国际化设置,确保甘特图组件在中文环境下的正确显示。
2026-03-16 21:44:30 +08:00
YunaiV 81a8f262aa feat(mes): 添加甘特图数据项 VO 和相关接口逻辑
新增 GanttDataRespVO 类以支持甘特图数据结构,并在 MesProTaskController 中实现获取甘特图任务列表的接口。此变更旨在优化任务管理界面,提升用户体验。
2026-03-16 13:03:15 +08:00
YunaiV 5f8a002654 feat(mes): 添加甘特图任务列表接口,优化任务数据加载 2026-03-15 23:28:57 +08:00
YunaiV 3860525dfd feat(mes): 添加工作站编码字段,移除单位编号字段并优化相关逻辑 2026-03-15 22:04:27 +08:00
YunaiV d49ba31f78 feat(mes): 添加工单完成功能,优化任务管理界面 2026-03-15 20:55:57 +08:00
YunaiV 3d459b292f feat(mes): 添加按产品查询工序列表功能 2026-03-15 20:43:44 +08:00
YunaiV e4c0a881f0 feat(mes): 重构工单对话框,合并排产与详情功能 2026-03-15 18:06:19 +08:00
YunaiV 0bcab49fc0 feat(mes): 添加工单状态和来源单据字段,优化查询功能 2026-03-15 16:45:58 +08:00
YunaiV 39d3efce50 feat(mes): 移除单位编号字段,优化工单 BOM 相关逻辑 2026-03-15 10:39:07 +08:00
YunaiV 1e5f56b54b feat(mes): 移除单位编号字段,优化工单请求参数 2026-03-15 09:22:05 +08:00
YunaiV fb8b459182 feat(mes): 移除工单来源、批次号和工单状态字段,简化请求参数 2026-03-14 21:07:39 +08:00
YunaiV 47f4f68ca8 feat(mes): 添加批次分页功能,支持根据条件查询批次列表 2026-03-14 20:16:14 +08:00
YunaiV 0bc189097d feat(mes): 添加批次追溯功能,支持向前和向后查询批次列表 2026-03-14 14:52:43 +08:00
YunaiV 39c14c61d4 feat(mes): 更新生产批号字段为批号,优化数据模型 2026-03-14 00:35:36 +08:00
YunaiV e518ffe0fd feat(mes): 添加批次号字段并更新表单逻辑
新增批次号字段至数据模型,并调整表单以支持自动生成批次号的显示。移除不必要的输入项,优化用户体验。
2026-03-14 00:24:15 +08:00
YunaiV 851891eab7 feat(mes): 添加批次管理功能,支持批次生成与获取
新增批次生成请求 VO 和批次管理服务接口,支持根据物料批次配置生成或获取批次记录。更新相关数据对象和服务实现,确保批次管理功能的完整性和可用性。
2026-03-13 23:55:24 +08:00
puhui999 dfee5b999d style(iot): 优化 Database 数据目的的建表提示UX
- 表名输入框右侧附加「查看/收起表结构提示」按钮
- 引入 el-collapse-transition 结合酷炫终端卡片实现平滑的折叠动画
- 修正 Vue template 中由于缺少闭合 div 导致的语法编译错误
2026-03-13 12:46:57 +08:00
puhui999 9f19835a80 feat(iot): Database 表单增加建表 SQL 提示和一键复制
- 顶部 el-alert 友好提示用户需要先创建表
- 内嵌 SQL 文本框(monospace字体) + 复制按钮
- tableName 默认值设为 iot_device_message_sink
2026-03-13 12:30:04 +08:00
puhui999 ad376b24b4 feat(iot): 前端新增 Database 数据目的配置表单
1. DatabaseConfigForm.vue: 新增 Database 配置表单(JDBC地址/用户名/密码/目标表名)
2. config/index.ts: 导出 DatabaseConfigForm 组件
3. DataSinkForm.vue: 引入 DatabaseConfigForm 条件渲染和校验规则
4. api/sink/index.ts: 添加 DatabaseConfig 接口和联合类型
2026-03-13 12:27:09 +08:00
YunaiV 1ec78b1bbb feat(mes): 添加物料和盘点数量字段的展示与校验逻辑 2026-03-12 01:19:24 +08:00
YunaiV 523866f044 feat(mes): 更新盘点结果相关逻辑,添加盘点数量字段
- 修改盘点结果请求和响应对象,新增盘点数量字段并设置为必填
- 更新控制器逻辑,简化创建和更新盘点结果的处理
- 添加盘点任务行的创建和更新逻辑,确保数据一致性
- 优化错误处理,增加相关错误码
2026-03-12 01:05:56 +08:00
YunaiV 6f97a7b473 feat(mes): 添加盘点结果的创建、更新和删除功能 2026-03-11 09:34:42 +08:00
YunaiV 567ed338c8 feat(mes): 更新盘点方案参数类型枚举及相关逻辑 2026-03-11 00:53:50 +08:00
YunaiV 0fb0150579 feat(mes): 添加盘点任务行的请求和响应 VO 及相关控制器
新增 MesWmStockTakingTaskLinePageReqVO 和 MesWmStockTakingTaskLineSaveReqVO 类,支持盘点任务行的分页请求和新增/修改请求。同时,创建 MesWmStockTakingTaskLineController 控制器,提供相应的 API 接口,增强系统的功能性和可维护性。
2026-03-10 23:52:09 +08:00
YunaiV b04162dab0 feat(mes): 支持盘点任务的动态时间过滤:
1. 新增动态盘点时间过滤功能
 2. 重构盘点任务流程
 3. 代码优化
 4. 前端适配
2026-03-10 20:15:19 +08:00
funcong 8cffb4a8ca fix: 修复请求拦截器bug 2026-03-10 18:48:03 +08:00
YunaiV 5df13ec5b8 feat(mes): 添加盘点任务相关的请求和响应 VO 2026-03-10 00:39:53 +08:00
YunaiV 0559f8eccd feat(mes): 更新盘点方案参数类型枚举及相关逻辑 2026-03-09 22:58:32 +08:00
YunaiV 9a6cd0f6cb feat(mes): 添加盘点方案状态更新功能及参数校验
新增更新盘点方案状态的接口,确保在启用状态时,相关参数不为空。
同时,更新了相关权限控制和错误码定义,提升了系统的健壮性和用户体验。
2026-03-09 22:29:49 +08:00
YunaiV ca2447f710 feat(mes): 更新盘点方案参数及状态管理逻辑
移除不必要的字段,优化参数类型枚举,添加分页请求和响应对象,增强代码可读性和维护性。更新状态管理逻辑,确保盘点方案的启用状态与参数一致性。
2026-03-09 21:47:24 +08:00
YunaiV 34068a5583 feat(mes): 更新盘点方案参数及状态管理逻辑
移除不必要的字段,优化参数类型枚举,添加分页请求和响应对象,增强代码可读性和维护性。更新状态管理逻辑,确保盘点方案的启用状态与参数一致性。
2026-03-09 21:46:52 +08:00
DevDengChao a997f25f98 Merge remote-tracking branch 'upstream/master' into upgrade 2026-03-09 09:57:30 +08:00
YunaiV 43dd2425ed feat(mes): 添加盘点方案参数相关功能和数据结构
新增盘点方案参数的 CRUD 接口及相关枚举,支持在管理后台进行参数的创建、更新和删除操作。同时,更新了前端组件以支持参数的动态选择和展示,提升用户体验。
2026-03-09 09:04:03 +08:00
YunaiV 2cde22dcd7 feat(mes): 添加物料编码、名称及规格字段,更新状态管理 2026-03-08 23:05:25 +08:00
YunaiV 74e058ee49 feat(mes): 添加上架功能及相关字段校验
新增执行上架功能,允许将待上架状态的转移单更新为待执行状态。
同时,添加了转移单及转移单行的字段校验,确保必要字段不为空,提升数据完整性。
2026-03-08 22:38:03 +08:00
YunaiV 544546862c feat(mes): 添加转移单及转移单行的字段校验和状态管理
新增转移单及转移单行相关功能,包含字段的必填校验和状态管理逻辑。更新了相关数据结构,确保在创建和提交转移单时进行必要的验证,提升系统的稳定性和数据一致性。

- 添加转移单字段的必填校验
- 更新转移单状态管理逻辑
- 增强数据结构的完整性
2026-03-08 21:13:02 +08:00
YunaiV 0a508c881e feat(mes): 添加转移单及转移单行相关功能和数据结构
新增转移单及转移单行的相关数据对象、服务接口和控制器,支持转移单的创建、修改、删除和查询功能。同时,添加了转移单状态和类型的枚举,完善了相关的 API 接口。

- 添加 MesWmTransferDO、MesWmTransferLineDO、MesWmTransferDetailDO 数据对象
- 实现 MesWmTransferService 和 MesWmTransferLineService 接口
- 新增 MesWmTransferController 和 MesWmTransferLineController 控制器
- 更新相关的 API 接口文档
2026-03-08 20:39:21 +08:00
YunaiV 5dbbb84d1b feat(mes): 添加装箱单及装箱明细的作者注释和字段类型调整 2026-03-08 13:04:51 +08:00
YunaiV 2cb3b5b492 feat(iot): IoT 产品和设备分页默认改为 12 条 2026-03-08 12:27:47 +08:00
YunaiV d6cb5e4e5c feat(mes): 添加装箱单及装箱明细的 VO 和 Mapper 注释
为装箱单及装箱明细相关的 VO 和 Mapper 类添加了详细的注释,提升代码可读性和维护性。同时,修正了部分字段类型以确保一致性。
2026-03-08 12:22:24 +08:00
YunaiV 76ee59b868 feat(mes): 重构装箱单及装箱明细相关功能
- 移除不必要的仓库、库区和库位字段
- 更新接口名称为 addChildPackage 和 removeChildPackage
- 添加可添加为子箱的装箱单精简列表接口
- 优化相关逻辑,确保代码整洁和可维护性
2026-03-08 12:04:46 +08:00
YunaiV 61d710bc8e feat(mes): 添加装箱单及装箱明细相关功能
新增装箱单和装箱明细的请求和响应对象,支持装箱单的创建、更新、删除及查询功能。包括装箱单的状态管理和子箱的添加与移除逻辑,提升了系统的功能完整性和用户体验。
2026-03-08 11:06:22 +08:00
YunaiV e58ffbb681 feat(mes): 添加装箱单及装箱明细相关功能
新增装箱单和装箱明细的请求和响应对象,完善装箱单的创建、更新、删除及查询功能。
同时,增加装箱单状态的枚举和相关逻辑,提升系统的可用性和扩展性。
2026-03-08 09:22:21 +08:00
YunaiV 001b1c4c86 feat(mes): 添加条码详情查看功能及相关逻辑 2026-03-07 19:18:37 +08:00
YunaiV 4cbfd26da7 feat(mes): 添加级联选择器数据加载逻辑 2026-03-07 18:07:13 +08:00
YunaiV 715135fbb1 feat(mes): 添加条码内容生成接口及相关逻辑
新增条码内容生成接口,支持根据业务类型和编码生成条码内容。
同时更新相关服务和前端组件,确保条码内容的自动生成和验证逻辑。
2026-03-07 17:23:22 +08:00
YunaiV b386c17933 feat(mes): 添加工具精简列表接口及条码自动生成逻辑
新增工具精简列表接口,支持获取工具的简化信息。同时,在创建工具、客户、设备等时,自动生成对应的条码,提升条码管理的效率。
2026-03-07 14:47:57 +08:00
芋道源码 f29a384904
!862 fix: 完成 review c153ff93 的所有 TODO 修复
Merge pull request !862 from puhui999/master-dev
2026-03-07 03:56:34 +00:00
YunaiV 21821c92d9 feat(mes): 添加条码清单导出功能
实现条码清单的 Excel 导出功能,用户可以通过点击导出按钮下载条码清单。此功能增强了用户体验,方便用户管理和使用条码数据。
2026-03-07 10:12:43 +08:00
YunaiV c7f9d41e07 feat(mes): 更新条码组件和表单逻辑,优化数据处理 2026-03-07 09:10:07 +08:00
YunaiV 184009380d feat(mes): 更新条码业务类型和表单逻辑
调整条码业务类型枚举,修改库位和仓库的常量值,优化条码表单组件的选择逻辑,添加库区和设备的选择器,确保用户能够正确选择业务对象。
2026-03-07 00:49:15 +08:00
YunaiV 00259fd8a2 feat(mes): 更新条码表单组件,优化业务类型选择逻辑
调整条码表单中的选择器宽度,确保更好的用户体验。增加了对不同业务类型的动态选择支持,便于后续扩展和维护。
2026-03-06 22:04:06 +08:00
YunaiV 913fa69073 feat(mes): 添加业务名称字段及相关逻辑
在 MES 条码相关组件中新增业务名称字段,支持根据业务名称进行查询和管理。更新相关 API 逻辑以适应新字段的使用,提升条码管理的灵活性和准确性。
2026-03-06 09:42:07 +08:00
YunaiV e20322985c feat(mes): 添加条码配置和条码相关功能
新增条码配置的 API 接口,包括查询、创建、更新和删除功能。同时,重构了条码相关的组件和逻辑,确保与现有系统的兼容性。此更新旨在提升条码管理的灵活性和可维护性。
2026-03-06 08:54:19 +08:00
YunaiV 5960e0102f feat(mes): 添加编码规则分段详情查询 API 2026-03-06 00:09:34 +08:00
YunaiV c12d7616f2 feat(mes): 添加条码相关组件和逻辑
新增条码格式枚举、条码生成组件及其相关 API,支持条码的创建、查看和配置功能。实现了条码的自动生成逻辑,并优化了条码配置管理界面,提升用户体验。

- 新增 Barcode 组件用于条码展示
- 实现条码生成和下载功能
- 添加条码配置管理功能
2026-03-06 00:09:23 +08:00
DevDengChao 52e538aa43 fix(router): auto-reload on chunk load failure after rebuild
Add two layers of error handling for stale chunk imports:
- `vite:preloadError` listener in main.ts for Vite preload failures
- `router.onError` in router/index.ts for dynamic import failures during navigation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 15:31:02 +08:00
DevDengChao c4908548a1 feat(cropper): upgrade cropperjs from v1 to v2
cropperjs v2 is a complete rewrite using Web Components architecture.

- Cropper.vue: rewrite to use v2 API
  - `new Cropper(img, { container })` with Web Components template
  - `selection.$toCanvas()` (async) replaces `cropper.getCroppedCanvas()`
  - Selection `change` event replaces `crop`/`cropmove` callbacks
  - CropperImage `load` event replaces `ready` callback
- CopperModal.vue: update toolbar handlers
  - `cropperImage.$rotate()` replaces `cropper.rotate()`
  - `cropperImage.$zoom()` replaces `cropper.zoom()`
  - `cropperImage.$scale()` replaces `cropper.scaleX/Y()`
  - `cropperImage.$resetTransform()` + `selection.$reset()` replaces `cropper.reset()`
- types.ts: replace `Cropper.Data` with inline type (v2 has no Data type)
- Remove v1 CSS import (v2 uses shadow DOM styles)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:37:34 +08:00
YunaiV e275ef417e feat(mes): 添加 SN 码生成、查询和导出功能
新增 SN 码生成、分页查询和批量删除的 API 接口,支持导出 SN 码分组和明细为 Excel 文件。实现了前端页面的搜索、生成和导出功能,提升了用户操作的便捷性。
2026-03-05 13:36:35 +08:00
DevDengChao 2520de56b4 refactor(icon): replace deprecated @iconify/iconify with @iconify/vue
- Remove @iconify/iconify (deprecated), @purge-icons/generated, vite-plugin-purge-icons
- Add @iconify/vue which uses @iconify/utils iconToSVG internally
- Rewrite Icon.vue to use @iconify/vue Icon component instead of manual DOM manipulation
- Pre-load ep/fa/fa-solid icon sets via addCollection for offline support
- Other icon sets (ion, mdi, heroicons, etc.) load from Iconify API on demand
- Remove PurgeIcons() from Vite plugin config
- Verified: all 22 icons on login page render correctly as SVGs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 12:26:12 +08:00
DevDengChao 860d2c0b29 chore(deps): minor updates for bpmn-js and purge-icons
- bpmn-js 18.12.0 → 18.13.0
- bpmn-js-properties-panel 5.52.1 → 5.53.0
- @purge-icons/generated 0.9.0 → 0.10.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 11:22:25 +08:00
DevDengChao 53a1024c11 chore(deps): patch updates for UnoCSS ecosystem (66.6.x)
- unocss 66.6.2 → 66.6.5
- @unocss/eslint-config 66.6.3 → 66.6.5
- @unocss/eslint-plugin 66.6.3 → 66.6.5
- @unocss/transformer-variant-group 66.6.3 → 66.6.5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 11:19:42 +08:00
DevDengChao 037b465a64 chore(deps): patch updates for toolchain (commitlint, lint-staged, postcss, iconify/json)
- @commitlint/cli 20.4.2 → 20.4.3
- @commitlint/config-conventional 20.4.2 → 20.4.3
- lint-staged 16.3.1 → 16.3.2
- postcss 8.5.6 → 8.5.8
- @iconify/json 2.2.444 → 2.2.446

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 11:17:06 +08:00
YunaiV 15e462b2d0 feat(mes): 添加编码规则分段详情查询 API 2026-03-05 01:23:22 +08:00
YunaiV 78f7110770 feat(mes): 更新 MES 编码相关的 API 路径并添加编码规则分段功能 2026-03-04 23:55:26 +08:00
YunaiV 2e87bf55b5 feat(mes): 添加外协发料单数量校验功能
新增校验接口,确保外协发料单每行明细数量之和与行发料数量一致。此功能提升了数据准确性,避免了潜在的发料错误。
2026-03-04 09:59:33 +08:00
YunaiV ce14a5ae6d feat(mes): 添加取消外协发料单功能
实现取消外协发料单的接口,支持在特定状态下取消发料单。新增相关的业务逻辑和错误处理,确保只有在允许的状态下才能执行取消操作。
2026-03-04 08:49:00 +08:00
YunaiV 05aca5904c feat(mes): 添加外协发料单状态管理功能
新增提交到待拣货、执行拣货和完成外协发料出库的功能,优化了状态管理逻辑,确保发料单在不同状态下的操作流程更加清晰和安全。
2026-03-04 01:40:33 +08:00
YunaiV 4b1db07af0 feat(mes): 添加外协入库明细的增删改查功能
实现外协入库明细的创建、更新、删除和查询功能,增强系统对外协入库明细的管理能力。新增相关的请求和响应 VO,确保数据的有效性和完整性。
2026-03-03 22:52:47 +08:00
YunaiV 2efd2ce442 feat(mes): 添加外协入库单行的请求和响应 VO 及相关控制器功能 2026-03-03 21:53:17 +08:00
YunaiV d1bd19200f feat(mes): 添加外协入库单及行相关功能和请求响应 VO 2026-03-03 20:41:21 +08:00
YunaiV 63f28ba4c3 feat(mes): 添加外协发料单行及明细相关功能和请求响应 VO 2026-03-03 20:17:24 +08:00
YunaiV e6261273d4 feat(mes): 添加杂项入库单行分页功能及明细服务实现 2026-03-03 19:52:54 +08:00
YunaiV 8138e9fa93 feat(mes): 更新杂项类型为整数并添加明细服务
将杂项类型字段从字符串更改为整数,以支持新的枚举类型。同时,新增杂项出库明细的服务接口和实现,提供对明细的增删改查功能,提升系统的灵活性和可维护性。
2026-03-03 19:11:48 +08:00
YunaiV 8948a76f63 feat(mes): 添加杂项入库单及行相关请求和响应 VO 2026-03-03 14:05:05 +08:00
YunaiV 16394f3f94 feat(mes): 添加杂项出库单类型及状态枚举支持
新增杂项出库单类型和状态枚举,更新相关接口和前端表单以支持业务类型选择。确保系统能够正确处理杂项出库单的状态和类型,提高用户体验和系统的灵活性。
2026-03-03 12:51:32 +08:00
YunaiV efa794d2ab feat(mes): 添加杂项出库单及行相关功能
新增杂项出库单及行的请求和响应对象,更新相关的接口和枚举,支持杂项出库单的创建、修改、删除和查询功能。优化了相关的业务逻辑和数据结构,以提升系统的可维护性和扩展性。
2026-03-03 11:49:19 +08:00
DevDengChao ac6097aa9a fix: resolve ESLint 10 + eslint-plugin-vue 10 rule compat for dev server
Disable rules that are new/stricter in eslint-plugin-vue 10 and
typescript-eslint 8+ which would block dev server rendering via
vite-plugin-eslint2:
- vue/no-ref-as-operand, vue/no-mutating-props,
  vue/no-side-effects-in-computed-properties
- @typescript-eslint/no-unused-expressions, no-unsafe-function-type,
  no-wrapper-object-types, no-this-alias, no-empty-object-type
- Ignore auto-generated src/types/auto-components.d.ts
- Fix hasPermi.ts short-circuit expression

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:00:29 +08:00
DevDengChao cb5f0fb3f0 fix(deps): restore @iconify/iconify required by @purge-icons/generated
Re-added @iconify/iconify as runtime dependency — it's imported by
@purge-icons/generated which is used in src/plugins/svgIcon/index.ts.
Also reverted @purge-icons/generated 0.10 back to 0.9 (both versions
have the same @iconify/iconify import).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:56:06 +08:00
DevDengChao 49f0fb06f4 chore(deps): BPMN ecosystem upgrade and cleanup (Phase D)
- diagram-js 12 → 15, min-dash 4 → 5
- Remove unused fast-xml-parser (replaced by steady-xml)
- @purge-icons/generated 0.9 → 0.10

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:50:46 +08:00
DevDengChao c0845eae75 chore(deps): medium-risk major upgrades (Phase C)
- stylelint 16 → 17, config-recommended 14 → 18, config-standard 36 → 40, order 6 → 7
- vue-types 5 → 6
- video.js 7 → 8
- cropperjs v2 evaluated but reverted to v1 due to incompatible API rewrite

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:46:12 +08:00
DevDengChao e31423bc6d chore(deps): low-risk major upgrades (Phase B)
- Remove deprecated @iconify/iconify (replaced by @purge-icons/generated)
- @commitlint/cli + config-conventional 19 → 20
- lint-staged 15 → 16
- rimraf 5 → 6
- markmap-common/lib/toolbar/view 0.16-0.17 → 0.18
- vue3-signature 0.2 → 0.4
- vue-dompurify-html 4 → 5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:35:24 +08:00
DevDengChao 5284b00706 chore(deps): update all semver-compatible packages to latest
Bump ~23 packages within their declared semver ranges, including:
- vue 3.5.26 → 3.5.29
- dayjs, lodash-es, qs, highlight.js, jsencrypt
- prettier, postcss, rollup, terser, autoprefixer
- and others

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:33:08 +08:00
DevDengChao 550c30eae4 chore: post-upgrade cleanup
- Update Node.js engine requirement to >= 20.19.0 (Vite 7 requirement)
- Remove duplicate entries in optimizeDeps include list
- Remove build-time-only packages (sass, unocss) from optimizeDeps

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:12:44 +08:00
DevDengChao fd11e07e92 chore(deps): upgrade Vite 5.1.4 → 7.3.1 and ecosystem plugins
Core:
- vite 5.1.4 → 7.3.1
- @vitejs/plugin-vue 5 → 6.0.4
- @vitejs/plugin-vue-jsx 3 → 5.1.4
- @vitejs/plugin-legacy 5 → 7.2.1
- @types/node 20.17.9 → 25.3.3

Plugins:
- unplugin-auto-import 0.16.7 → 21.0.0
- unplugin-vue-components 0.25.2 → 31.0.0
- unplugin-element-plus 0.8.0 → 0.11.2
- vite-plugin-svg-icons-ng 1.3.1 → 1.5.2
- vite-plugin-top-level-await 1.4.4 → 1.6.0

Config:
- Switch to Sass Modern Compiler API (api: 'modern-compiler')
- Remove silenceDeprecations workaround

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:49:57 +08:00
DevDengChao f4b8fea579 chore(deps): upgrade ECharts 5.5.0 → 6.0.0
Note: echarts-wordcloud has unmet peer dep (expects echarts ^5)
but works at runtime. Monitor for official v6 support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:46:13 +08:00
DevDengChao 6ffcbbc1d2 chore(deps): migrate ESLint 8 → 10 with flat config
- Upgrade eslint 8.57.1 → 10.0.2
- Migrate .eslintrc.js → eslint.config.mjs (flat config)
- Replace vite-plugin-eslint → vite-plugin-eslint2
- Replace @typescript-eslint/eslint-plugin + parser → typescript-eslint
- Upgrade eslint-plugin-vue 9 → 10, vue-eslint-parser 9 → 10
- Remove eslint-define-config, eslint-config-prettier, eslint-plugin-prettier
- Delete .eslintignore (now handled in flat config ignores)
- Remove deprecated rules: vue/script-setup-uses-vars, vue/no-setup-props-destructure

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:44:40 +08:00
DevDengChao 53f779afa2 chore(deps): upgrade UnoCSS 0.58.5 → 66.6.2 and related packages
- unocss 0.58.9 → 66.6.2
- @unocss/eslint-config 0.57.7 → 66.6.3
- @unocss/eslint-plugin 66.1.0-beta.5 → 66.6.3
- @unocss/transformer-variant-group 0.58.9 → 66.6.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:38:32 +08:00
YunaiV 32ad593fae feat(mes): 更新检验单完成接口及权限管理 2026-03-02 19:38:23 +08:00
DevDengChao 643eb92aff chore(deps): upgrade Vue I18n 9.10.2 → 11.2.8, fix related compat issues
- Upgrade vue-i18n to 11.2.8, @intlify/unplugin-vue-i18n to 11.0.7
- Remove vue-i18n CJS alias from vite.config.ts (no longer needed)
- Remove vue-i18n from optimizeDeps include list
- Upgrade bpmn-js-token-simulation 0.36.2 → 0.39.2 (ids@3 compat)
- Fix duplicate route name 'Redirect' (Vue Router 5 enforces uniqueness)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:36:31 +08:00
YunaiV fa38b554ea feat(mes): 更新反馈和入库相关接口及状态管理
将多个接口的执行方法重命名为完成方法,增强语义清晰度。更新相关的权限控制和状态枚举,确保系统逻辑一致性。
2026-03-02 19:25:37 +08:00
DevDengChao 7991028e0a chore(deps): upgrade @vueuse/core 10.9.0 → 14.2.1
Crosses 4 major versions. All composables used by the project remain
compatible. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:16:43 +08:00
DevDengChao c0414a563f chore(deps): upgrade Vue Router 4.4.5 → 5.0.3
Major version with no breaking changes for this codebase. Dynamic route
generation via router.addRoute() and navigation guards work correctly.
All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:14:18 +08:00
DevDengChao 7326634cd3 chore(deps): upgrade Pinia 2.1.7 → 3.0.4, persistedstate 3.2.1 → 4.7.1
Pinia 3 is a "boring major" removing only deprecated APIs. The
persistedstate plugin v4 default export remains compatible.
All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:12:27 +08:00
DevDengChao 81f00adae3 chore(deps): upgrade TypeScript 5.3.3 → 5.9.3
Multiple minor versions with improved type inference. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:10:28 +08:00
DevDengChao 136ef314b5 chore(deps): upgrade bpmn-js-properties-panel 5.23.0 → 5.52.1
bpmn-js was already at v18. Properties panel minor update.
All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:06:04 +08:00
DevDengChao c13d5d7dfd chore(deps): upgrade vue-tsc 1.8.27 → 3.2.5
Major version bump with stricter type checking. Pre-existing type errors
in source code are surfaced but do not affect runtime. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:03:39 +08:00
DevDengChao b6f40353ad chore(deps): upgrade Sass 1.69.5 → 1.97.3
Patch update. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:00:25 +08:00
DevDengChao dec43ffcee chore(deps): upgrade Element Plus 2.11.1 → 2.13.3
Minor update. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:58:47 +08:00
DevDengChao 3dad65a53f chore(deps): upgrade Axios 1.9.0 → 1.13.6
Minor/patch update. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:56:55 +08:00
DevDengChao 9864cf5a92 chore(deps): upgrade Vue 3.5.12 → 3.5.26
Patch update with no breaking changes. All 24 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:54:36 +08:00
YunaiV 4d66a7072c feat(mes): 添加运单填写功能及相关状态管理 2026-03-02 18:54:26 +08:00
DevDengChao 1b9fcc51a1 test: add Playwright E2E test suite as regression safety net
Set up 24 E2E tests covering auth, navigation, user CRUD, permissions,
UI features, and smoke tests using Playwright with API mocking via
page.route(). This provides a safety net before proceeding with
dependency upgrades.

- Add playwright.config.ts with setup project + storageState auth
- Add .env.e2e disabling captcha/tenant/encryption for test mode
- Add e2e/ directory with fixtures, helpers, page objects, and tests
- Add test:e2e scripts to package.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:49:50 +08:00
YunaiV 5375487d57 feat(mes): 更新销售出库单状态枚举及相关逻辑
新增待填写运单状态,优化销售出库单状态描述,调整相关方法注释以提高可读性。同时,更新前端表单以支持填写运单功能,确保用户体验一致性。
2026-03-02 18:21:55 +08:00
YunaiV 1a1209088c review(mes): 移除 WmBatchSelect 组件并更新相关逻辑 2026-03-02 17:20:30 +08:00
YunaiV 77e25ce9d8 feat(mes): 移除收货地址字段并优化发货通知单选择器 2026-03-02 13:32:06 +08:00
YunaiV 0e58608fe1 feat(mes): 添加客户验证逻辑至销售通知单创建与更新 2026-03-02 12:59:47 +08:00
YunaiV ac6bd643aa feat(mes): 新增发货通知单状态枚举及相关逻辑优化
新增 MES 发货通知单状态枚举,优化发货通知单的状态管理逻辑,提升代码可读性和维护性。移除不必要的字段,简化请求对象。
2026-03-02 12:25:41 +08:00
YunaiV 1f442fb7fd feat(mes): 新增发货通知单及相关行功能
添加发货通知单及其行的相关数据结构和逻辑,包括创建、更新、删除和查询功能。此功能将提升销售出库管理的效率,并支持更灵活的发货通知处理。
2026-03-02 12:07:02 +08:00
YunaiV 10d5510885 feat(mes): 添加销售出库单相关字段及逻辑优化
新增出库日期、发货通知单ID、发货通知单编号、客户编码、承运商和运输单号字段,优化了相关数据结构和逻辑,提升了销售出库单的功能完整性和数据准确性。
2026-03-02 11:12:12 +08:00
YunaiV 2242a13401 feat(mes): 新增销售出库单行及明细相关功能和数据结构
新增销售出库单行和明细的请求和响应对象,包含分页查询、创建、更新和删除功能。实现了销售出库单行和明细的数据库映射,并提供了相应的服务接口和控制器,支持前端调用。

同时,更新了相关的 API 接口,确保前端能够正确获取和操作销售出库单行及明细数据。
2026-03-02 10:42:20 +08:00
YunaiV 48e2ed8272 feat(mes): 添加物料批次管理校验逻辑 2026-03-01 23:03:56 +08:00
YunaiV 48b9e54fd8 feat(mes): 更新退货单相关字段及逻辑优化
- 修改退货数量字段名称为 `quantity`,以简化代码。
- 更新退货原因字段为必填项,确保数据完整性。
- 优化部分逻辑,提升代码可读性和维护性。
2026-03-01 22:47:51 +08:00
YunaiV 38f3e73486 feat(mes): 添加销售退货单及行相关功能和数据结构
新增销售退货单及行的相关数据结构、请求和响应对象,包含销售退货单的基本信息、行信息以及相关的 API 接口,支持销售退货单的创建、更新、查询和删除操作,提升了系统的功能性和可维护性。
2026-03-01 22:16:18 +08:00
YunaiV bc932d0a0d feat(mes): 添加销售退货单及行相关功能和数据结构
新增销售退货单及行的相关数据结构、请求和响应对象,包含销售退货单的基本信息、行信息以及相关的 API 接口,支持销售退货单的创建、更新、查询和删除操作,提升了系统的功能性和可维护性。
2026-03-01 22:16:12 +08:00
YunaiV c2e397e84c feat(mes): 重命名产品收货单相关类和接口
重命名产品收货单及其相关的 VO、DO、Service 和 API 接口,以统一命名为“Receipt”,提升代码可读性和一致性。此变更包括多个文件的重命名和相应的引用更新,确保系统功能不受影响。
2026-03-01 14:34:11 +08:00
YunaiV 21cfbb9314 feat(mes): 添加产品收货单明细数量校验功能
新增校验产品收货单明细数量的接口,确保每行明细数量之和与行收货数量一致。此功能提升了数据的准确性和完整性,避免了潜在的入库错误。

- 添加 checkProductRecptQuantity 方法
- 更新相关接口以支持数量校验
2026-03-01 13:16:39 +08:00
YunaiV c1a0c63ba6 feat(mes): 添加产品收货单及行相关功能和数据结构
新增产品收货单及行的相关数据对象、请求和响应 VO,以及对应的服务和控制器接口。实现了产品收货单的创建、更新、删除和查询功能,支持与物料、仓库等模块的关联,提升了系统的可扩展性和可维护性。
2026-03-01 11:33:09 +08:00
YunaiV 248635e3d7 feat(mes): 移除生产退料单数量校验逻辑及相关接口 2026-03-01 00:55:00 +08:00
YunaiV a9d08368a6 feat(mes): 更新生产退料单提交逻辑及状态校验
重构生产退料单的提交功能,合并确认与提交操作,简化状态流转逻辑。新增状态校验,确保只有草稿状态的退料单可提交,并根据物料质检状态自动决定目标状态(待检验或待上架)。
2026-03-01 00:23:51 +08:00
YunaiV 347b4dfaf4 feat(mes): 添加退料单质检标识及相关字段校验 2026-02-28 23:02:35 +08:00
YunaiV 15de32fcbf feat(mes): 添加生产退料单确认功能及字段校验
新增确认生产退料单的接口,更新相关字段为必填项并添加数量校验逻辑。此变更旨在提升退料单的管理效率和数据准确性。
2026-02-28 22:16:52 +08:00
YunaiV 2a83f67065 refactor(mes): 调整供应商退货模块字段映射
refactor(mes): 同步供应商退货字段变更
2026-02-28 18:17:12 +08:00
YunaiV 333c8a1154 feat(mes): 添加生产退料单及明细相关功能 2026-02-28 15:10:10 +08:00
YunaiV 0b29aaadaf feat(mes): 添加生产退料单及明细相关功能
新增生产退料单、退料单行及退料明细的请求和响应对象,完善相关的服务和映射接口,支持生产退料单的创建、更新和查询功能。
2026-02-28 13:28:27 +08:00
YunaiV 639ff7645e feat(mes): 添加供应商退货单及相关明细功能
新增供应商退货单、退货单行及退货明细的数据对象和 API 接口,支持供应商退货管理功能。
2026-02-28 09:56:20 +08:00
YunaiV 3d80f5c216 feat(mes): 添加生产入库单及相关功能
新增生产入库单的相关数据结构、API 接口和服务实现,包括入库单、入库明细及其 CRUD 操作。此功能支持生产入库管理,提升仓库管理效率。

- 添加生产入库单相关的请求和响应 VO
- 实现生产入库单的服务接口
- 增加生产入库单行的 CRUD 操作
- 更新相关的数据库映射和查询逻辑
2026-02-28 08:40:57 +08:00
YunaiV 8628548282 ♻️ refactor(mes): 删除多余的预留字段 2026-02-28 01:46:31 +08:00
YunaiV 0d3ddca266 feat(mes): 添加领料出库单数量校验功能
新增校验领料出库单数量的接口,确保每行明细数量之和等于行领料数量。此功能提升了数据一致性检查,避免了潜在的数量不匹配问题。
2026-02-28 00:52:00 +08:00
YunaiV 1afe2e79e4 feat(mes): 更新领料出库单明细 API 接口及组件
- 修改领料出库单明细的 API 接口,支持按行编号查询明细列表
- 替换供应商选择组件,简化供应商选择逻辑
- 添加取消领料出库单的功能,增强用户操作体验
2026-02-27 23:58:35 +08:00
YunaiV 5e2366ace0 feat(mes): 更新领料出库单相关 API 接口及组件
重命名领料出库单和明细相关的 API 方法,增强代码可读性。新增领料出库明细表单组件,支持拣货明细的添加与编辑功能。同时,调整相关组件的逻辑以适应新的 API 结构。
2026-02-27 23:33:22 +08:00
YunaiV bd27ddfc71 feat(mes): 添加生产领料出库单相关功能与接口
新增生产领料出库单的状态管理、行验证及明细查询功能,优化了相关数据模型和接口,提升了系统的可用性和用户体验。
2026-02-27 19:04:35 +08:00
YunaiV a77ef94fd5 feat(mes): 添加生产领料出库单相关功能与组件
新增生产领料出库单的相关数据模型、接口及前端组件,支持领料单的创建、编辑和完成操作。优化了数据校验逻辑,并添加了物料、库存和工单选择器,提升用户体验。

- 实现领料单的基本 CRUD 操作
- 增加物料和库存选择功能
- 优化前端表单布局与交互
2026-02-26 21:17:38 +08:00
YunaiV 84f417823d feat(mes): 添加 MES 领料出库单相关数据模型及接口
新增 MES 领料出库单及其行的响应和请求 VO,包含必要的字段和注释。
同时实现了相关的控制器和服务接口,支持创建、更新、删除和查询领料出库单的功能。

此功能将提升领料出库单的管理效率,便于后续的业务逻辑实现。
2026-02-26 19:18:10 +08:00
YunaiV fe04f0485e ♻️ refactor(mes): 使用 MesOrderStatusConstants 替代状态枚举值
重构采购入库单和领料申请单状态枚举,统一使用 MesOrderStatusConstants 中的常量,提升代码可维护性和一致性。
2026-02-26 19:08:52 +08:00
YunaiV 12b6c0df2f ♻️ refactor(mes): 重构质检状态枚举及相关逻辑
将质检相关的状态枚举从 MesOrderStatusEnum 更改为 MesQcStatusEnum,确保状态管理的一致性和可维护性。更新了相关的服务和前端逻辑,以反映新的状态枚举。
2026-02-26 09:37:27 +08:00
YunaiV e26a40fe0e refactor(mes): 优化弹窗标题显示
refactor(framework): 优化 ObjectUtils 工具类
2026-02-26 01:44:00 +08:00
YunaiV a94e55b533 feat(mes): 添加到货通知单行列表查询接口及相关字段调整
新增获取到货通知单行列表的接口,支持通过通知单编号查询。调整相关数据模型,更新字段名称以提高可读性,并移除冗余字段,优化数据结构。同时,更新前端组件以支持新接口的调用和展示。

BREAKING CHANGE: 修改了到货通知单行的字段名称和接口路径
2026-02-26 01:31:00 +08:00
YunaiV 6312e2fe56 refactor(mes): 优化采购入库单界面文案和标记待优化项
- 修改列名:上架数量 -> 数量
  - 标记界面布局和组件选择器待优化项
  - 调整代码格式
2026-02-25 23:16:17 +08:00
YunaiV b460a0e47d feat(mes): 优化到货通知单表单交互
- 参考 IQC 表单模式,支持详情查看和新增后自动进入编辑
- 移除用户不应填写的字段(合格数量由 IQC 回调设置)
- 使用 MdVendorSelect 组件替换内联选择器
- 添加必填验证(通知单名称、是否检验、到货数量 > 0)
- 修复导航:点击编号查看详情,新增入库单按钮查看相关入库单
2026-02-25 21:37:09 +08:00
YunaiV 2fc5362a7e feat(mes): 优化 RQC 前端交互,添加缺陷统计显示
主要变更:
  - RqcForm 添加缺陷情况显示区域和 detail 模式支持
  - 检验单编号改为链接,点击可查看详情(对齐 IQC)
  - 删除 sourceDocCode 字段,rqcType 改为 type
  - RQC Line 的 toolId/toolName 改为 tool 字段
  - 新增成功后自动切换到编辑模式,可继续编辑子表
2026-02-25 19:24:30 +08:00
YunaiV 44aa77e79f refactor(mes-qc): 优化 OQC 出货检验单表单
- 删除质检方案(templateId)选择字段
  - 恢复合格品数量(qualifiedQuantity)字段
  - 优化表单布局(每行 3 个字段)
  - 新增数量字段、日期字段、检测人员必填校验
  - 删除出货日期、检测日期搜索字段
2026-02-25 13:33:33 +08:00
YunaiV 7df0785818 refactor(mes-qc): 优化 IPQC/IQC 质检模块
IPQC 优化:
  - 修复 TODO AI 项:模板检索方法、tool 字段重构、删除冗余字段
  - 新增废品数量字段(工废/料废/其他废品)及验证
  - 添加检测人员和物料的存在性验证

  IQC 优化:
  - 检测人员由后端自动设置改为前端传递
  - 添加检测人员存在性验证
2026-02-25 00:15:05 +08:00
YunaiV a013f965aa review(mes): 各种 qc 单的校验逻辑。 2026-02-24 17:10:58 +08:00
YunaiV 81bee7693f refactor(mes): 新增 mes_order_status 字典,替代 mes_qc_iqc_status
- dict.ts:MES_QC_IQC_STATUS → MES_ORDER_STATUS,删除 @AI TODO
- constants.ts:4 个独立 QC 状态枚举(IQC/IPQC/OQC/RQC)合并为统一的 MesOrderStatusEnum(草稿/已确认/审批中/已审批/已完成/已取消)
- iqc/ipqc/oqc/rqc index.vue:字典类型引用更新为 MES_ORDER_STATUS
- iqc/index.vue:状态判断由 MesQcIqcStatusEnum.PREPARE → MesOrderStatusEnum.DRAFT
2026-02-24 05:16:41 +08:00
YunaiV d7d22b8a8f feat(mes): 新增供应商和物料存在性校验功能 2026-02-24 04:55:28 +08:00
YunaiV 251a7851a0 ♻️ refactor(mes): 调整表格列宽和标签名称 2026-02-24 04:23:08 +08:00
YunaiV e13a3b2fac feat(mes): IQC 检验单行 toolId/toolName 改为 tool
- api/mes/qc/iqc/line/index.ts: QcIqcLineVO 删除 toolId、toolName,新增 tool
- views/mes/qc/iqc/IqcLineList.vue: 表格列 prop 由 toolName 改为 tool
2026-02-24 03:57:59 +08:00
YunaiV f1beac7055 refactor(mes): IQC 表单字段清理 + 校验增强
1. IqcForm.vue
   - 删除质检方案(templateId)、检测人员(inspectorUserId)表单项
   - formData/resetForm 移除 templateId/minCheckQuantity/maxUnqualifiedQuantity/checkQuantity/inspectorUserId
   - formRules 增加 qualifiedQuantity/unqualifiedQuantity/receiveDate/inspectDate 必填校验
   - 移除 QcTemplateSelect、UserSelect 组件引用
   - open 方法参数 prefillData → data,去掉 Partial
2. api/mes/qc/iqc/index.ts
   - QcIqcVO 删除 minCheckQuantity、maxUnqualifiedQuantity
2026-02-24 00:46:49 +08:00
YunaiV 7ea96e1c2e refactor(mes): IQC 模块重构 - Service 拆分 + 字段清理 + 业务逻辑优化
1. 拆分 MesQcTemplateService → MesQcTemplateDetailService
   - 检测指标项、产品关联 CRUD 迁移至 DetailService
   - 新增 getRequiredTemplateByItemIdAndType 方法
2. MesQcIqcSaveReqVO 字段清理
   - 删除 templateId/minCheckQuantity/maxUnqualifiedQuantity/checkQuantity/inspectorUserId
   - 增加 qualifiedQuantity/unqualifiedQuantity @NotNull + @DecimalMin 校验
   - 增加 receiveDate/inspectDate @NotNull 校验
3. MesQcIqcServiceImpl 业务逻辑调整
   - createIqc/updateIqc 增加 inspectorUserId 参数,由 Controller 传入 getLoginUserId()
   - templateId 不再由前端传递,后端根据 itemId + IQC 类型自动查找模板
   - checkQuantity 由后端计算(= qualifiedQuantity + unqualifiedQuantity)
   - updateIqc 禁止修改 sourceDocType/sourceDocId/sourceLineId/templateId
4. MesQcIqcDO/RespVO 删除 minCheckQuantity、maxUnqualifiedQuantity 字段
5. 更新调用方:IndicatorController、ItemController、IQC/OQC/IPQC ServiceImpl
2026-02-24 00:46:37 +08:00
YunaiV f2dd52706b feat(mes): 新增待检任务列表页 + IqcForm 支持预填
- 新增 pendinginspect/index.vue 待检任务列表页
- 新增 api/mes/qc/pendinginspect/index.ts API 定义
- 搜索栏:来源单据编号、产品物料(MdItemSelect)、检验类型
- 表格列:来源单据编号、检验类型/名称、物料编码/名称、规格型号、待检数量、单位
- IQC 行显示"创建检验单"按钮,打开 IqcForm 并预填来源数据
- IqcForm.vue: open() 增加 prefillData 参数,isFromPendingTask 控制来源字段只读
- 新增菜单 SQL(mes_qc_pending_inspect.sql)
- 新增待检任务测试数据(mes_wm_arrival_notice.sql id=100~102)
2026-02-23 15:55:57 +08:00
YunaiV 3b52a8a2ad feat(mes): 同步 IQC 与到货通知单后端变更
1. IQC API sourceDocType 从 string 改 number,删除 sourceDocCode
2. IQC 表单删除 sourceDocCode 字段(formData + resetForm)
3. 到货通知单 API 删除 approveArrivalNotice 方法(后端已移除该端点)
2026-02-23 12:26:29 +08:00
YunaiV e736f26166 feat(mes): 添加采购入库明细列表接口及上架明细表单功能 2026-02-23 02:16:35 +08:00
YunaiV ea476a1ec3 feat(mes): 完善入库单操作逻辑与界面交互
重构入库单相关组件,优化用户操作体验。移除不必要的审批按钮,简化执行入库流程为直接确认并调用接口。更新状态判断逻辑,确保只有待上架和待入库状态可以取消操作。调整表单展示逻辑,确保在不同模式下的字段可读性。

此变更旨在提升用户操作的直观性与效率,减少误操作的可能性。
2026-02-23 00:43:22 +08:00
YunaiV 72c3e545f1 feat(mes): 添加到货通知单精简列表接口及状态筛选功能
新增获取到货通知单的精简列表接口,支持按状态筛选。更新相关状态枚举和校验逻辑,优化采购入库单的审批和取消功能,确保系统在处理入库单时的状态管理更加清晰和高效。
2026-02-22 23:34:13 +08:00
YunaiV fcd90edc08 feat(mes): 添加物料接收单状态枚举及相关功能
新增物料接收单的状态枚举,包含草稿、待质检、已完成和待入库状态。
同时更新相关的请求和响应对象,确保在物料接收流程中能够正确处理状态变更。
2026-02-22 19:16:30 +08:00
YunaiV 6e56876c3c feat(mes): 添加入库日期和状态筛选功能
在 MES 采购入库单请求中新增入库日期字段,并在数据查询中支持根据入库日期进行筛选。此功能提升了用户在管理入库单时的灵活性和准确性。
2026-02-22 18:13:07 +08:00
YunaiV b32770d77e feat(mes): 新增到货通知单和到货通知单行的表单组件 2026-02-22 18:00:32 +08:00
YunaiV 5aea9a0428 feat(mes): 添加到货通知单的到货日期和状态枚举
新增到货日期字段到 MES 到货通知单请求 VO,并在查询中支持根据到货日期范围筛选。同时,添加到货通知单状态的枚举定义,提升系统的可维护性和可读性。
2026-02-22 18:00:24 +08:00
YunaiV 39187b441e feat(mes): 新增到货通知单和到货通知单行的表单组件 2026-02-22 17:28:11 +08:00
YunaiV 6fd1806c4c feat(mes): add request and response VO for MES item receipt and detail, including service and controller implementations 2026-02-22 15:43:58 +08:00
YunaiV 87d24ab7a4 feat(mes): add VO and service for managing MES arrival notice and arrival notice line 2026-02-22 15:43:49 +08:00
YunaiV b6e875c6bb feat(mes): change rqcType from String to Integer and update related fields in RQC classes 2026-02-22 15:13:52 +08:00
YunaiV b1f0a71b7a feat(mes): update IPQC type to Integer and add source document fields in RQC 2026-02-22 14:27:35 +08:00
YunaiV 52785c5c08 feat(mes): add RQC line request and response VO, and implement RQC line controller and service 2026-02-22 12:24:20 +08:00
YunaiV 479f35ffb8 feat(mes): add RQC (退货检验单) related classes and API for handling inspection lines 2026-02-22 11:21:37 +08:00
YunaiV 969b4a70f0 feat(mes): 新增 IPQC 过程检验前端页面,集成缺陷记录与检测结果
- 新增 IPQC 列表页、表单弹窗、检验行子表
- IpqcForm 新增"检测结果"标签页,复用 QcIndicatorResultList 组件
- IpqcLineList 新增"缺陷列表"操作列,集成 DefectRecordInlineList 弹窗,添加分页
- 新增 IPQC API 和 Line API(TypeScript)
- dict.ts 注册 MES_IPQC_TYPE 字典类型
- constants.ts 新增 MesQcIpqcStatusEnum 枚举
2026-02-22 11:03:12 +08:00
YunaiV 418de29138 refactor(mes): 优化检验结果表单,简化接口调用和字段处理
1. API:合并 getResult + getDetailTemplate 为 getDetail(qcId, qcType, id?),
   精简 VO 类型定义,移除后端不再返回的关联字段
2. Form:open 方法统一 formData.value = data 赋值(不再区分 create/update),
   合并 valueFloat/valueInteger 为 valueNumber,
   getDictOptions 改为 getStrDictOptions,补全 JSDoc 注释
3. 新增 IPQC 模块页面(index.vue/IpqcForm.vue/IpqcLineList.vue)及 API
2026-02-22 08:36:21 +08:00
YunaiV a8ffdfab75 feat(mes): add validation for inspection result detail list and update related comments 2026-02-22 08:04:09 +08:00
YunaiV db33e04451 feat(mes): refactor inspection result types and add new result detail structure 2026-02-21 23:42:34 +08:00
YunaiV 47c84d3104 refactor(mes): 质检指标 resultType 改为 number 类型,resultSpec 重命名为 resultSpecification,result 目录重命名为 indicatorresult
1. indicator/index.ts:resultType 从 string 改为 number,resultSpec 重命名为 resultSpecification
2. IndicatorForm.vue:getStrDictOptions 改为 getIntDictOptions,条件判断改为数字比较(4=DICT, 5=FILE)
3. indicator/index.vue:结果值类型筛选下拉改用 getIntDictOptions
4. qc/result 目录整体重命名为 qc/indicatorresult(views + api),更新 IqcForm.vue 的引用路径
2026-02-21 22:40:41 +08:00
YunaiV 461510786e 【后端】refactor(mes): 将 MesQcDefectRecordDO 相关类从 qc/defect 包独立到 qc/defectrecord 包
【前端】refactor(mes): 将缺陷记录相关文件从 qc/defect/record 目录独立到 qc/defectrecord 目录
2026-02-21 22:11:21 +08:00
YunaiV 79bc5c6ea0 feat(mes): 添加生成检验单编号功能,重构质检方案选择组件,优化表单逻辑和注释 2026-02-21 21:17:28 +08:00
YunaiV 298ad41d5b feat(mes): 重构缺陷记录相关类的包结构,更新缺陷等级字段类型为整数,优化缺陷记录内联编辑组件 2026-02-21 21:03:14 +08:00
YunaiV 31cc9bd31e feat(mes): 更新质检缺陷记录权限标识,重构相关校验逻辑,优化缺陷统计计算 2026-02-21 19:26:47 +08:00
YunaiV 87d10eacb8 feat(mes): 适配通用质检缺陷记录 API,更新 IQC 缺陷列表组件
配合后端 mes_qc_defect_record 通用化重构,前端同步适配。

主要变更:
1. 新增 api/mes/qc/defect-record/index.ts 通用缺陷记录 API
2. IqcDefectList.vue 切换至 QcDefectRecordApi,字段映射调整
   (defectName→name, defectLevel→level, defectQuantity→quantity, iqcId→qcId)
3. 新增 qcType=1 参数标识 IQC 类型
2026-02-21 16:52:03 +08:00
YunaiV 473a0d9017 feat(mes): 移除不必要的字段,优化流转卡和工序记录的校验逻辑,添加工序记录列表组件 2026-02-21 12:35:48 +08:00
YunaiV e9e066cf25 feat(mes): 添加报工相关字段和简化选择组件,优化数据处理逻辑 2026-02-21 12:29:49 +08:00
YunaiV 1c4ae03e7d feat(mes): 添加计划班组和班次相关的 VO 及 API,新增点检保养方案设备和项目的 VO 及 API,添加工序选择器组件 2026-02-21 12:22:47 +08:00
YunaiV 335f367e00 feat(mes): 添加生产任务选择器和工单选择器组件,支持前端过滤功能 2026-02-21 12:21:36 +08:00
YunaiV 7b274a0990 feat(mes): 添加流转卡和工序记录相关的请求和响应 VO,重构服务接口及实现 2026-02-21 11:58:14 +08:00
YunaiV eab4883204 feedback 2026-02-21 11:15:00 +08:00
YunaiV 170b9e0857 feat(mes): 添加生产报工相关的请求和响应 VO,重构报工控制器及服务实现 2026-02-21 09:27:45 +08:00
YunaiV f7d8682073 feat(mes): 添加安灯配置编号和用户信息字段,重构相关数据对象和服务接口 2026-02-21 09:26:06 +08:00
YunaiV b505744d0c feat(mes): 重构安灯相关组件,优化导入路径,增加注释以提升可读性 2026-02-21 08:46:51 +08:00
YunaiV a0ac62e0fa feat(mes): 重构 IQC 状态管理,使用枚举替代硬编码,简化代码并提升可维护性 2026-02-21 08:10:12 +08:00
YunaiV 99b983f00f feat(mes): 添加安灯呼叫配置和记录相关功能,包括请求和响应 VO、枚举及服务接口 2026-02-21 08:07:15 +08:00
YunaiV 5ddc53bce9 feat(mes): qc 添加安灯处置状态和级别枚举,更新相关错误码和接口定义 2026-02-21 00:19:09 +08:00
YunaiV e20122bd3c feat(mes):通过枚举和用户关联来重构缺陷处理流程,并增强内部质量控制功能 2026-02-20 22:49:14 +08:00
YunaiV ccc58e9a74 feat(mes): 添加维修工单确认和不通过功能,更新相关服务和前端接口 2026-02-20 19:55:08 +08:00
YunaiV 51d255a9fd feat(mes): 添加设备保养记录提交功能,新增状态枚举及相关校验 2026-02-20 19:50:11 +08:00
YunaiV a65c5c4cfb feat(mes): 更新检验单和缺陷记录相关功能,优化表单和列表展示 2026-02-20 19:41:12 +08:00
YunaiV 13e0222d0c feat(mes): 添加维修工单和维修工单行相关功能,包括请求和响应 VO 及控制器 2026-02-20 19:16:40 +08:00
YunaiV b8ea0645d3 feat(mes): 更新点检结果字段类型为整数,重构相关枚举和状态描述 2026-02-20 18:42:03 +08:00
YunaiV d033bcaaf5 feat(mes): 新增设备点检记录相关功能,包括记录明细接口及表单组件 2026-02-20 16:55:23 +08:00
YunaiV afaf6e371e feat(mes): 添加维修工单和点检记录相关状态及错误码常量 2026-02-20 16:05:11 +08:00
YunaiV 05d7212bd0 feat(mes): 重构点检保养方案界面,新增设备和项目选择器组件,优化启用停用逻辑 2026-02-20 15:33:47 +08:00
YunaiV 11b0b290eb feat(mes): 新增设备和点检保养项目精简列表接口及批次号字段 2026-02-20 15:25:37 +08:00
YunaiV 8d7b7cf473 feat(mes): 新增 MES 点检保养方案相关功能,包括设备和项目的增删改查接口及数据模型 2026-02-20 15:24:31 +08:00
YunaiV 9392e32630 refactor(mes): 重构设备保养记录模块,抽取可复用 Select 组件
1. 新增 DvMachinerySelect、DvCheckPlanSelect、UserSelect 三个通用选择器组件
2. MaintenRecordForm 和 index 页面改用 Select 组件替代内联远程搜索逻辑
3. MaintenRecordLineForm 合并到 MaintenRecordLineList(参考 pro/route 风格)
4. API 文件 maintenRecordLine.ts 迁移至 line/index.ts
5. 保养记录状态枚举从 10/20 改为 0/1,与后端对齐
2026-02-20 14:42:46 +08:00
YunaiV 083c187f2f refactor(mes): 重构设备保养记录模块,抽取可复用 Select 组件
1. 新增 DvMachinerySelect、DvCheckPlanSelect、UserSelect 三个通用选择器组件
2. MaintenRecordForm 和 index 页面改用 Select 组件替代内联远程搜索逻辑
3. MaintenRecordLineForm 合并到 MaintenRecordLineList(参考 pro/route 风格)
4. API 文件 maintenRecordLine.ts 迁移至 line/index.ts
5. 保养记录状态枚举从 10/20 改为 0/1,与后端对齐
2026-02-20 14:42:19 +08:00
YunaiV 9845059d4a feat(mes): 新增设备保养记录及明细相关功能,包括请求和响应 VO、Controller、Service 及 API 接口 2026-02-20 11:40:31 +08:00
YunaiV 2a83789782 feat(mes): 新增 MES 点检保养项目相关功能,包括请求和响应 VO、Controller 及 API 接口 2026-02-20 09:49:49 +08:00
YunaiV b76ecb2460 feat(mes): 新增来料检验单及缺陷记录相关功能,包括请求和响应 VO、Mapper、Controller 及 API 接口 2026-02-20 09:36:23 +08:00
YunaiV c454002370 feat(mes): 更新物料库存模块,优化物料查询逻辑并新增工作站和库区数量统计功能 2026-02-20 09:27:07 +08:00
YunaiV fff9c7f34e pro-task 2026-02-20 08:58:09 +08:00
YunaiV 3c3bf1b13b feat(mes): 新增生产排产(pro_task)前端页面
- 新增生产任务 API(task + task_issue)和 VO 定义
- 新增排产主页面:甘特图预览 + 待排产工单列表 + 排产/进度 Drawer
- 新增任务 CRUD 列表(ProTaskList)、任务表单(ProTaskForm)
- 新增 dhtmlx-gantt 甘特图组件封装(GanttChart)和全屏编辑(GanttEdit)
- 新增生产进度圆形进度条展示(ProTaskProgress)
- 新增任务投料列表(ProTaskIssueList,预留)
- 新增工作站下拉选择器(MdWorkstationSelect)
- 新增 MES_PRO_TASK_STATUS 字典和 MesProTaskStatusEnum 枚举
- 安装 dhtmlx-gantt 依赖
2026-02-20 08:57:56 +08:00
YunaiV 2740f3d26b feat(mes): 新增仓库管理-库存台账前端页面
新增:
- api/mes/wm/materialStock/index.ts:库存台账 API
- views/mes/wm/materialStock/index.vue:主页面(左侧物料分类树 + 搜索 + 表格 + 冻结开关 + 导出)
- views/mes/wm/materialStock/AreaDetailDialog.vue:库位详情只读弹窗
2026-02-20 08:26:54 +08:00
YunaiV d1e6d4109f fix(mes): 完善生产工单前端,支持树形展示、子工单生成及 BOM 内联编辑
1. index.vue:工单列表改为 handleTree 树形展示(row-key + tree-props),
   新增「确认」「新增子工单」操作按钮,移除父工单列,搜索条件对齐
2. WorkOrderForm:移除 batchCode 字段,需求日期改为 date 类型,
   新增 parentId 及子工单预填逻辑,新增 WorkOrderItemList 物料需求 Tab
3. WorkOrderBomList:合并 WorkOrderBomForm 弹窗为内联编辑(仅编辑数量/备注),
   草稿状态显示编辑按钮,已确认+自行生产+产品类型显示「生成工单」按钮
4. WorkOrderItemList:API 调用迁移到 ProWorkOrderBomApi
5. API 层:workorder/index.ts 新增 confirmWorkOrder、移除 batchCode;
   bom/index.ts 新增 getWorkOrderBomItemListByWorkOrderId、itemOrProduct 字段
6. 删除独立的 WorkOrderBomForm.vue 组件
7. constants.ts 新增 MesProTaskStatusEnum,dict.ts 新增对应字典类型
2026-02-20 08:24:58 +08:00
YunaiV e5bd477a7e feat(mes): 优化排班日历功能,新增假期按日期范围查询逻辑及假期类型枚举 2026-02-19 22:26:01 +08:00
YunaiV f4239e8a0e feat(mes): 完善排班日历功能,新增假期过滤及班组排班记录查询逻辑 2026-02-19 21:25:17 +08:00
YunaiV 93a76b19db refactor(mes): 重构排班日历视图,提取公共日历格子组件
- 新增 CalendarDateCell.vue:抽取三个视图中重复的农历/节气/节假日/班次渲染逻辑,统一维护
- CalendarTypeView.vue → TypeView.vue,PersonView.vue → UserView.vue:按视图含义重命名,去掉多余前缀
- UserView.vue:用户选择从 el-input-number 改为 el-select 下拉,调用 getSimpleUserList 获取用户列表
- TeamView.vue / TypeView.vue / UserView.vue:统一使用 CalendarDateCell 组件;补充变量行尾注释、函数 JSDoc 及关键逻辑行内注释
- index.vue:更新组件引用
2026-02-19 20:56:39 +08:00
YunaiV 64b3ce64c3 feat(mes): 新增开始日期和结束日期字段,优化排班日历请求和响应对象 2026-02-19 20:28:57 +08:00
YunaiV 3ec6a0bd79 fix(mes): 修复生产工单前端 TODO,搜索增强、条件显隐、BOM 拆分
- index.vue:新增产品/客户搜索,补充父工单/来源单据/客户编码列,"来源类型"改"工单来源"
- WorkOrderForm.vue:工单编码生成按钮,来源单据编号/供应商条件显隐,"生产数量"改"工单数量"
- WorkOrderBom 拆分为 WorkOrderBomList + WorkOrderBomForm
- constants.ts 新增 MesProWorkOrderTypeEnum、MesProWorkOrderSourceTypeEnum
2026-02-19 19:26:41 +08:00
YunaiV 115dcb2df6 fix(mes): 修复生产工单前端 TODO,搜索增强、条件显隐、BOM 拆分
- index.vue:新增产品/客户搜索,补充父工单/来源单据/客户编码列,"来源类型"改"工单来源"
- WorkOrderForm.vue:工单编码生成按钮,来源单据编号/供应商条件显隐,"生产数量"改"工单数量"
- WorkOrderBom 拆分为 WorkOrderBomList + WorkOrderBomForm
- constants.ts 新增 MesProWorkOrderTypeEnum、MesProWorkOrderSourceTypeEnum
2026-02-19 19:26:25 +08:00
YunaiV 112e24f97d fix(mes): 工艺路线前端 TODO 修复:状态按钮化、MdItemSelect、字段优化
- index.vue 状态操作改为按钮,启用后禁用「禁用」和「删除」按钮
- RouteProcessList 前3列 fixed、label 改名、布尔字段用 dict-tag、颜色显示 hex 值
- RouteProductList/RouteProductBomList 物料选择改用 MdItemSelect 组件
- RouteProductList BOM 弹窗移入产品编辑表单,动态宽度
- RouteProductBomList label 改名、processId 类型修复
2026-02-19 18:45:50 +08:00
YunaiV 1c0cbc0dc6 refactor(mes): 合并子列表 Form 到 List 组件,统一 Panel 重命名为 List
1. 合并 4 对 Form→List:将独立的 *Form.vue 弹窗组件内联到对应的 *List.vue 中
   - TemplateIndicatorForm → TemplateIndicatorList
   - TemplateItemForm → TemplateItemList
   - CalTeamMemberForm → CalTeamMemberList
   - ProProcessContentForm → ProProcessContentList

2. 重命名 5 个 Panel→List,更新引用方 import
   - WorkstationMachinePanel → WorkstationMachineList
   - WorkstationToolPanel → WorkstationToolList
   - WorkstationWorkerPanel → WorkstationWorkerList
   - CalPlanTeamPanel → CalPlanTeamList
   - CalShiftPanel → CalShiftList

3. 统一 9 个子列表组件的注释风格
   - 补全文件头注释、defineOptions、模板区域注释
   - 统一分隔线、JSDoc、变量行尾注释、watch 注释
   - 去掉多余的闭合行尾注释

4. 修复 WorkstationToolList 中 createSuccess/updateSuccess 提示写反的 bug
2026-02-19 18:24:25 +08:00
YunaiV e94f2d4fee fix(mes): 修复工艺路线前端 TODO,补全注释与交互优化
- API 文件(4 个)补充 VO 字段注释和方法注释,新增 updateRouteStatus 方法
- index.vue 字段加"工艺路线"前缀,状态列改为 el-switch 开关操作
- RouteForm.vue 补充行内注释,status 默认值改用 CommonStatusEnum.ENABLE
- RouteProcessList/ProductList/ProductBomList 补充变量行内注释
- CalendarTypeView/TeamView 修复 ESLint 问题
2026-02-19 17:44:58 +08:00
YunaiV 0da99069c5 refactor(mes): 将 enableFlag/enabled/areaEnabled 重构为 status/areaStatus(CommonStatus)
QC Template: enableFlag(Boolean) -> status(Integer),使用 CommonStatusEnum
Warehouse Area: enabled(Boolean) -> status(Integer),使用 CommonStatusEnum
Warehouse Location: areaEnabled(Boolean) -> areaStatus(Integer),使用 CommonStatusEnum

涉及前端 API 定义、列表页、表单页的字段名和字典类型切换(INFRA_BOOLEAN_STRING -> COMMON_STATUS),
以及后端 DO、RespVO、SaveReqVO、PageReqVO、Mapper 的同步修改。

注意:语义反转,原 true(启用) 对应新 status=0(开启),原 false(禁用) 对应新 status=1(关闭)。
2026-02-19 17:17:13 +08:00
YunaiV 545887ed38 refactor(mes): 将 enableFlag/enabled/areaEnabled 重构为 status/areaStatus(CommonStatus)
QC Template: enableFlag(Boolean) -> status(Integer),使用 CommonStatusEnum
Warehouse Area: enabled(Boolean) -> status(Integer),使用 CommonStatusEnum
Warehouse Location: areaEnabled(Boolean) -> areaStatus(Integer),使用 CommonStatusEnum

涉及前端 API 定义、列表页、表单页的字段名和字典类型切换(INFRA_BOOLEAN_STRING -> COMMON_STATUS),
以及后端 DO、RespVO、SaveReqVO、PageReqVO、Mapper 的同步修改。

注意:语义反转,原 true(启用) 对应新 status=0(开启),原 false(禁用) 对应新 status=1(关闭)。
2026-02-19 17:15:20 +08:00
YunaiV e95d613965 feat(mes): 新增工艺路线模块,支持路线、工序链、产品及 BOM 管理
从 ktg-mes 迁移工艺路线(pro-route)模块,包含:
- 4 个 DO:MesProRoute / RouteProcess / RouteProduct / RouteProductBom
- 4 个 Mapper 及 9 个 VO(含工序链 findPre/findNext 查询)
- 4 对 Service 接口+实现(链表重建、启用校验、级联删除)
- 4 个 Controller(路线 CRUD+导出,子资源复用父权限)
2026-02-19 16:39:43 +08:00
YunaiV 20c6876f2c feat(mes): 清理 qc-template TODO,补全注释风格与表单布局
- TemplateForm/TemplateIndicatorForm/TemplateItemForm/TemplateIndicatorList/TemplateItemList:注释风格对齐(ref 行内注释、函数步骤注释、defineExpose/defineEmits 说明)
- TemplateIndicatorForm:表单布局调整为多行 el-row/el-col(质检指标+标准值 / 计量单位+误差上下限 / 检测方法 / 说明图 / 备注)
- TemplateItemForm:表单布局调整为多行(产品物料 / 最低检测数+最大不合格数 / 致命+严重+轻微缺陷率 / 备注),补充缺失的备注字段
- index.vue:搜索项检测种类改为单值 Integer 查询
2026-02-19 12:57:00 +08:00
YunaiV e7a066d9c5 feat(mes): 重构质检方案页面,子表维护移入编辑弹窗
- api/mes/qc/template/ 拆分为 index.ts / indicator.ts / item.ts 三个文件
- TemplateForm.vue:Dialog 宽度改为 900px,编辑模式下新增 el-tabs,
  内嵌检测指标项(TemplateIndicatorList)和产品关联(TemplateItemList)子表
- index.vue:移除底部子表区域及 currentRow/activeTab 逻辑,简化为纯列表页;
  检测种类搜索字段由 types 改为 type(单选)
- TemplateIndicatorList/Form、TemplateItemList/Form:更新 import 路径至拆分后的 API 文件
- 清理所有 TODO @AI 注释
2026-02-19 12:41:57 +08:00
YunaiV e7a8095a35 review(mes):cal-calender 日历功能 2026-02-19 12:23:18 +08:00
YunaiV b8254baf5a feat(mes): 抽取通用 Select 下拉组件,替换各表单内联 el-select
将 MES 模块中各表单的内联 el-select + 手动加载 SimpleList 数据的模式,
统一抽取为独立的 Select 组件,每个组件自包含数据加载和前端搜索过滤。

新增 8 个 Select 组件:
- MdItemSelect(物料产品选择器)
- MdClientSelect(客户选择器)
- MdVendorSelect(供应商选择器)
- MdUnitMeasureSelect(计量单位选择器)
- MdWorkshopSelect(车间选择器)
- WmWarehouseSelect(仓库选择器)
- QcIndicatorSelect(质检指标选择器)
- TmToolTypeSelect(工具类型选择器)

改造 10 个消费者文件:
- WorkOrderForm.vue:产品/客户/供应商选择器替换
- WorkOrderBom.vue:物料/单位选择器替换,修复 handleBomItemChange
- MdItemForm.vue:计量单位选择器替换
- WorkstationForm.vue:车间/仓库选择器替换
- MachineryForm.vue:车间选择器替换
- TemplateItemForm.vue:物料选择器替换
- TemplateIndicatorForm.vue:质检指标/计量单位选择器替换
- ToolForm.vue:工具类型选择器替换
- workstation/index.vue:搜索栏车间选择器替换
- tool/index.vue:搜索栏工具类型选择器替换
2026-02-19 12:09:52 +08:00
YunaiV 5f010acc5f review(mes):qc-template 的实现代码 2026-02-18 22:48:56 +08:00
YunaiV 50be43d9e2 feat(mes): 重构生产工序模块包结构,拆分 process-content 为独立子模块
前端:
- api/mes/pro/process/index.ts:移除 contents 字段
- 新建 api/mes/pro/process/content/index.ts,删除旧 process-content/index.ts
- views/mes/pro/process/index.vue:移除 expand 行交互和工艺要求列,
  对齐 ktg-mes 风格
- ProProcessForm.vue:工序编码增加生成按钮,标签改为工序说明,
  编辑时弹窗内嵌操作步骤列表(el-divider + ProProcessContentList)
- 新建 ProProcessContentList.vue(列表)和 ProProcessContentForm.vue
  (表单弹窗),拆分自原内联实现,对齐 CalTeamMemberList/Form 风格
2026-02-18 16:08:12 +08:00
YunaiV 67e6e59120 review(mes):pro-process 的初步实现 50% 2026-02-18 15:47:18 +08:00
YunaiV 3c198013ba feat(mes): 重构 cal-team 班组成员前端文件结构
- 删除 api/mes/cal/team/member.ts、shift.ts,迁移至
  member/index.ts、shift/index.ts(与其他模块保持一致)
- CalTeamMemberPanel.vue 重命名为 CalTeamMemberList.vue,拆分为
  List(列表+删除)和 Form(添加弹窗)两个独立组件
- CalTeamMemberForm.vue(新增):用户下拉选择(getSimpleUserList)、
  表单校验、提交,通过 defineExpose open() + emit success 与 List 交互
- CalTeamForm.vue:更新引用为 CalTeamMemberList
2026-02-18 15:32:14 +08:00
YunaiV 377bf6e2ed feat(mes): 优化 cal-team 班组成员相关逻辑
- MesCalTeamMemberController:注入 AdminUserApi,合并 list-by-team 与
  list-by-team-ids 为单一接口(支持 teamId / teamIds 参数),新增
  buildMemberRespVOList 方法批量填充用户昵称和手机号
- MesCalTeamMemberServiceImpl:validateTeamMemberExists 改为 void 返回;
  validateUserUnique 去掉冗余的 excludeId 参数
- MesCalTeamMemberMapper:selectByUserIdExcludeId 简化为 selectByUserId
2026-02-18 15:31:59 +08:00
YunaiV ecd21a5dbd feat(mes): 新增 CAL 模块班组前端页面及修复班组选择下拉
新增 views/mes/cal/team 及对应 API:
- api/mes/cal/team/{index,member,shift}.ts:班组/成员/排班三个 API 模块
- views/mes/cal/team/index.vue:班组列表页(搜索/分页/导出)
- views/mes/cal/team/CalTeamForm.vue:班组表单弹窗(编辑时内嵌成员管理 Tab)
- views/mes/cal/team/CalTeamMemberPanel.vue:班组成员管理面板

修复 CalPlanTeamPanel.vue:
- 班组选择从 el-input-number 改为 el-select 下拉(对接 CalTeamApi.getTeamList)
2026-02-18 11:21:22 +08:00
YunaiV 3b43e9e463 🎨 style(mes/wm): 对齐注释风格、修复 TODO、重构冗余代码 2026-02-18 09:08:09 +08:00
YunaiV 5289b8b3bd 🎨 style(mes/wm): 对齐注释风格、修复 TODO、重构冗余代码
- warehouse/index.vue:补充变量行内注释;将 chargeUserId 展示内联到模板
- WarehouseForm.vue:删除非标准 DONE @AI 注释;补充变量注释、defineExpose/defineEmits 注释、submitForm 步骤注释
- location/index.vue:补充变量行内注释;修复 warehouseId 类型;使用具名路由跳转
- location/LocationForm.vue:补充注释;修复 warehouseId 类型;补充新增时默认值注释
- area/index.vue:合并 parseQueryId 到 loadLocationContext;将 4 个散 ref 合并为 currentLocation 对象;补充变量行内注释
- area/AreaForm.vue:修复 locationId 类型;简化 open 方法中逐字段赋值为直接赋值;补充注释
- md/workstation/WorkstationForm.vue:补充 JSDoc 注释、变量注释、submitForm 步骤注释

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 09:07:29 +08:00
YunaiV 47fd8b6018 review(mes):wm-warehouse 的初步实现 80% 2026-02-17 23:51:33 +08:00
YunaiV 9546589ccc review(mes):wm-warehouse 的初步实现 50% 2026-02-17 22:52:45 +08:00
YunaiV 57894e7ab5 review(mes):wm-warehouse 的初步实现 2026-02-17 21:53:33 +08:00
YunaiV 38405b1d20 review(mes):work-order 的代码实现,功能测试 2026-02-17 21:00:24 +08:00
YunaiV 3463213cd4 review(mes):cal-plan 的代码实现,功能测试 2026-02-17 20:58:24 +08:00
YunaiV 416778c8e5 review(mes):qc-template 的代码实现,功能测试 2026-02-17 20:43:40 +08:00
YunaiV 0772290be9 review(mes):work-order 的代码实现,功能测试 2026-02-17 20:21:31 +08:00
YunaiV 721449d834 feat(mes):qc-template 初始化 2026-02-17 18:57:14 +08:00
YunaiV ce761e536e review(mes):cal-plan 的实现 2026-02-17 17:05:45 +08:00
YunaiV 663b2e32b5 feat:新增 qc indicator 质量管理 - 检测项 2026-02-17 16:09:37 +08:00
YunaiV 2f86852483 feat(mes/cal-plan): 新增排班计划专用 confirm 接口
- 后端新增 PUT /mes/cal/plan/confirm 接口,仅接收 id 参数
- Service 层新增 confirmPlan(Long id) 方法,含草稿状态校验和班组数量校验
- updatePlan 中强制忽略 status 字段,禁止通过 update 修改状态
- 前端 API 新增 confirmPlan(id: number) 方法
- CalPlanForm handleConfirm 改为调用专用 confirmPlan 接口
2026-02-17 16:05:24 +08:00
YunaiV d5303a1e7d feat(mes-pro): 新增生产工单前端页面
- 新增工单列表页,支持编码/名称/类型/状态/来源/需求日期筛选
- 新增工单表单弹窗(新增/编辑/详情),产品选择自动填充单位
- 新增工单 BOM 子组件,内嵌分页表格 + 增删改弹窗
- 新增工单和 BOM 的 API 文件
- dict.ts 增加 3 个字典类型,constants.ts 增加工单状态枚举
2026-02-17 15:37:12 +08:00
YunaiV e920999bff fix(mes-cal): 清理前端 3 处 TODO @AI 注释
1. team.ts: 删除"挪到 plan/team 目录下"注释(文件已在正确位置)
2. CalPlanTeamPanel.vue: 删除"晚点 review 下"注释
3. CalPlanForm.vue: 删除"单独一个接口"注释,更新确认提示语

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 15:26:46 +08:00
YunaiV 501db918f3 feat(mes):优化、实现 plan 的逻辑 2026-02-17 15:15:25 +08:00
YunaiV 778141bf7f feat(mes):新增 defect 缺陷类型 2026-02-17 14:38:26 +08:00
YunaiV 2d79633b07 feat(mes): 设备状态枚举同步调整,表单增加点检保养时间选择器
1. constants.ts MesDvMachineryStatusEnum 改为 STOP/PRODUCING/MAINTENANCE
2. MachineryForm 默认状态改为 STOP,新增 lastCheckTime、lastMaintenTime 两个 el-date-picker 字段
2026-02-17 11:32:41 +08:00
YunaiV d313450069 feat(mes-dv): 设备台账添加导入功能前端 UI
- 新增 MachineryImportForm 组件,参考物料导入模式
- 列表页添加导入按钮和导入弹窗
- API 新增 importTemplate 方法(后端接口待实现)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:25:03 +08:00
YunaiV 5428ed8351 feat(mes-dv): 设备台账列表添加左侧设备类型分类树
- 新增 MachineryTypeTree 组件,支持搜索过滤和点击/取消选择
- 列表页改为左树右表布局(4:20 比例),参考物料模块
- 移除搜索栏中的「设备类型」下拉(由左侧树代替)
- 重置时同时清空分类树选中状态

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:23:07 +08:00
YunaiV e0ec6249ae refactor(mes-dv): 设备台账列表去掉最近保养/点检时间列
这两个时间字段在列表中意义不大,已移至设备详情表单中展示。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:21:35 +08:00
YunaiV babb4c3979 feat(mes-dv): MachineryForm 添加点检/保养/维修 Tab 占位
- 删除多余的「所属车间」TODO 注释(form 已有车间选择框)
- 编辑模式下显示 3 个子资源 Tab:点检记录、保养记录、维修工单
- 子模块尚未实现,使用 el-empty 占位,待后续对接

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:20:48 +08:00
YunaiV f0fe6e3f01 feat(mes-dv): MachineryForm 改为 3 列布局并添加编码生成按钮
- 第一行改为 3 列:设备编码(含生成按钮)、设备名称、品牌
- 编码生成按钮使用 generateRandomStr,编辑模式下禁用
- 调整规格型号到第三行,整体布局更紧凑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:19:35 +08:00
YunaiV 969eac21df fix(mes-dv): 修复 MachineryTypeForm 的 TypeScript linter 警告
移除 formData 声明中多余的 `as unknown as number/string` 类型断言,
与 WorkstationForm 等其他表单组件保持一致的写法。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:18:12 +08:00
YunaiV c6ab40e175 feat(mes-dv): 新增设备类型和设备台账前端页面
新增设备类型(dv/machinery/type,树形表格)和设备台账(dv/machinery)的前端实现,
包含 API 定义、列表页、表单弹窗,以及 dict.ts 和 constants.ts 中 DV 相关补充
2026-02-17 09:53:14 +08:00
YunaiV 9f5303aea6 feat(mes-cal): 新增排班计划和班次管理前端页面
- 新增班次管理独立页面(index.vue + CalShiftForm.vue),支持 CRUD + 导出
- 新增排班计划列表页(index.vue),支持按编码/名称/轮班方式/状态搜索
- 新增排班计划表单(CalPlanForm.vue),含编码生成、条件显示倒班方式/天数、确认计划操作
- 新增班次子表面板(CalShiftPanel.vue),嵌入计划表单 Tab
- 新增班组子表面板(CalPlanTeamPanel.vue),嵌入计划表单 Tab
- 新增 shift/plan/plan-team 三个 API 文件
- dict.ts 新增 4 个字典类型常量(shift_type/shift_method/calendar_type/plan_status)
2026-02-17 09:52:46 +08:00
YunaiV 153fa2cf25 fix(mes-tm): 修复工具管理前端 TODO 项,完善表单布局、编码生成和列宽
1. ToolForm:表单改为 el-row/el-col 栅格布局(960px 宽弹窗),新增编码"生成"按钮(TL 前缀)
2. ToolTypeForm:类型编码新增"生成"按钮(TT 前缀),保养周期拆分为天/次两个条件字段
3. type/index:保养周期列增加天/次单位后缀展示
4. tool/index + type/index:补齐所有表格列宽(编码 120、名称 min-150、状态 80 等)
2026-02-16 22:42:47 +08:00
YunaiV 6a83adf543 refactor(mes-tm): 工具管理前端枚举优化
1. 新增 MesToolStatusEnum、MesMaintenTypeEnum 到 mes/utils/constants.ts
2. ToolForm、ToolTypeForm、index 页面使用枚举常量替代魔法值
3. 移除 as unknown as 类型断言,移除 TODO @AI 注释
2026-02-16 22:30:52 +08:00
YunaiV d6a4857f6f refactor(mes-tm): 工具管理前端枚举优化
1. 新增 MesToolStatusEnum、MesMaintenTypeEnum 到 mes/utils/constants.ts
2. ToolForm、ToolTypeForm、index 页面使用枚举常量替代魔法值
3. 移除 as unknown as 类型断言,移除 TODO @AI 注释
2026-02-16 22:30:15 +08:00
YunaiV b15cd9021e feat(mes): 新增工具管理(TM)模块前端页面
新增工具类型和工具台账的 API、列表页和表单弹窗,
dict.ts 补充 MES_TM_TOOL_STATUS 和 MES_TM_MAINTEN_TYPE 字典类型。
2026-02-16 21:12:42 +08:00
YunaiV 23531c6c5b refactor(mes): 优化假期设置交互,精简接口对齐后端
1. 右键改左键点击弹出设置弹窗,阻止非当前月切换
2. 弹窗打开时调 get-by-day 接口回显已有 type 和 remark
3. 新增备注(remark)输入框,时间戳传参用 formatDate 转换
4. HolidayType 枚举抽取到 mes/utils/constants.ts 统一管理
5. 精简 API:移除 page/export/update/delete,create 改为 save
2026-02-16 21:01:41 +08:00
YunaiV 369d3bbff2 refactor(mes): 优化假期设置交互,精简接口对齐后端
1. 右键改左键点击弹出设置弹窗,阻止非当前月切换
2. 弹窗打开时调 get-by-day 接口回显已有 type 和 remark
3. 新增备注(remark)输入框,时间戳传参用 formatDate 转换
4. HolidayType 枚举抽取到 mes/utils/constants.ts 统一管理
5. 精简 API:移除 page/export/update/delete,create 改为 save
2026-02-16 20:59:01 +08:00
YunaiV f40b415b9c feat(mes): 新增假期设置日历页面,使用 dayjs-plugin-lunar 显示农历
基于 el-calendar 实现假期设置页面,右键日期可设置假期/工作日类型,
日历单元格显示班/休标签、农历日期、公历节日、农历节日和节气。
使用 dayjs-plugin-lunar(底层 tyme4ts)替代手写 667 行农历工具。

新增文件:
- src/api/mes/cal/holiday/index.ts
- src/views/mes/cal/holiday/index.vue
- src/views/mes/cal/holiday/HolidayForm.vue

修改文件:
- src/utils/dict.ts:新增 MES_CAL_HOLIDAY_TYPE

新增依赖:
- dayjs-plugin-lunar
2026-02-16 18:39:12 +08:00
YunaiV cb56866deb refactor(mes): 重构产品 BOM/SIP/SOP 表单,统一代码风格并修复 TODO
1. 统一表单方法风格,对齐 WorkstationWorkerPanel 的写法:
   - 弹窗变量统一命名为 dialogVisible/dialogTitle
   - dialogTitle 使用 t('action.' + type) 国际化
   - submitForm 添加 formRef 校验守卫,使用 t() 国际化提示
   - create/update 判断顺序统一为先 create 后 update
2. SIP/SOP 的 orderNumber 字段全局重命名为 sort
3. BOM 物料选择简化为无论选择几条都直接批量创建
4. 修复 formData 展开赋值的 TS 类型错误,改为逐字段赋值
5. 清理所有 TODO @AI 注释
2026-02-16 17:46:33 +08:00
YunaiV b0548b329d feat(mes): 优化工作站模块,新增获取车间列表和车间 Map 方法,重构表单弹窗逻辑 2026-02-16 15:47:05 +08:00
YunaiV 435496bdbd feat(mes): 添加假期类型常量及相关错误码,调整SOP和SIP模块的展示顺序 2026-02-16 13:19:50 +08:00
YunaiV debce44339 refactor(mes-ui): 修正工作站模块中文标签命名 + 拆分 API
- 表单标签/占位符/校验提示:工位 → 工作站
- API 注释:工位设备 → 设备资源、工位工具 → 工装夹具资源、工位人员 → 人力资源
- 拆分 workstation API 到 machine/tool/worker/workshop 子目录
2026-02-16 12:36:00 +08:00
YunaiV 95c478d739 refactor(mes-ui): 修正工作站模块中文标签命名 & 拆分 API 文件
- 表单标签/占位符/校验提示:工位 → 工作站
- API 注释:工位设备 → 设备资源、工位工具 → 工装夹具资源、工位人员 → 人力资源
- 拆分 workstation API 到 machine/tool/worker/workshop 子目录
2026-02-16 12:12:03 +08:00
YunaiV 59bd23b3e0 feat(mes): 新增产品 BOM、SOP、SIP 子表前端组件
- 新增 productBom / productSop / productSip 三组 API 文件
- BOM 组件:表格列表,支持远程搜索物料、编辑用量
- SOP / SIP 组件:卡片式图片列表,支持上传/预览/排序
- MdItemForm.vue 集成三个组件,替换原 el-empty 占位
2026-02-16 08:58:31 +08:00
YunaiV 403b7e75af feat(mes): 新增车间管理、工位管理模块前端
- API 接口:workstation/index.ts(工位+3个子资源)、workshop.ts(车间)
- 车间:列表页(搜索+分页)+ 表单弹窗
- 工位:列表页 + 表单弹窗(一行3列布局 + 编码自动生成)
- 工位子资源:设备/工具/人员 3 个 Tab 面板组件
- 共 9 个 Vue/TS 文件
2026-02-16 08:40:27 +08:00
YunaiV 8a3e33952b feat(mes): 新增车间管理、工位管理模块前端
- API 接口:workstation/index.ts、workshop.ts
- 车间:列表页 + 表单弹窗
- 工位:列表页 + 表单弹窗(含设备/工具/人员三个子资源 Tab 面板)
- 共 9 个 Vue/TS 文件
2026-02-16 08:09:29 +08:00
YunaiV 15dd4dce76 feat(mes): 新增物料批次属性配置前端组件
1. 新增 MdItemBatchConfigForm 组件,根据 itemOrProduct 区分 ITEM/PRODUCT 展示不同 checkbox
2. 嵌入 MdItemForm 的"批次属性"tab,仅 batchFlag 开启时显示
3. API 文件放置于 batchConfig/index.ts 子目录
4. 使用 MesItemOrProductEnum 常量替代硬编码字符串
5. MdItemForm 变量名语义优化:itemTypeList → itemTypeTree,itemTypeFlatList → itemTypeList
6. 布局优化:采用 CSS Grid 一行 5 个,checkbox label 模式(☑ 文字)
2026-02-16 01:28:10 +08:00
YunaiV 3d103f1f46 feat(mes): 新增供应商管理前端页面
新增供应商管理的前端代码,参照客户模块风格:
- 列表页:编码/名称/简称/等级/评分/电话/状态/备注,支持搜索与分页
- 表单弹窗:完整字段编辑,支持编码自动生成(VD前缀)
- 导入弹窗:Excel 文件上传,支持更新已存在数据,下载导入模板
- API 定义:完整 CRUD + 导出 + 导入模板接口
2026-02-16 00:28:17 +08:00
YunaiV 15d64fe772 feat(mes): 新增 MES 客户表 DDL、字典、菜单权限与测试数据
- 建表 mes_md_client(含逻辑删除、多租户字段)
- 字典 mes_client_type:企业客户(1)、个人(2)
- 菜单权限 5140~5146:查询/创建/更新/删除/导出/导入
- 测试数据:比亚迪、博世、德力西
2026-02-15 23:34:50 +08:00
YunaiV 5153adf1cf feat(mes): 完善计量单位、物料导入与客户管理前端
1. 计量单位管理:新增 API + 列表页 + 表单(UnitMeasureForm)
2. 物料单位选择器:MdItemForm 单位字段从 el-input 改为 el-select 下拉
3. 物料导入:新增 MdItemImportForm 组件(上传 Excel、下载模板、更新已有数据)
4. 物料导入权限:v-hasPermi 改为 mes:md-item:import
5. API VO 字段调整:unitOfMeasure → unitMeasureId + unitMeasureName
6. 客户管理:新增 API + 列表页 + 表单(MdClientForm)
2026-02-15 22:18:46 +08:00
YunaiV 27f5fcb66e feat(mes): 完善物料分类与物料产品前端功能
1. 新增 ItemTypeTree 左侧分类树组件(支持搜索过滤、点击切换)
2. 物料列表改为左右布局(左侧树 + 右侧列表)
3. 新增 MesItemOrProductEnum 常量({ label, value } 结构)
4. 物料/产品列用 getItemOrProductLabel 翻译,安全库存列用 dict-tag 渲染
5. 表单改为 3 列布局(span=8),增加编码生成按钮和底部 Tab 占位
6. 分类管理移除导出按钮,分类表单修复 TS 类型和枚举默认值
7. 分类 API 移除 exportItemType
2026-02-15 15:43:49 +08:00
YunaiV 6bb27899c1 feat(mes): 新增物料产品分类与物料产品管理
迁移 ktg-mes 的 md_item_type 和 md_item 两张表到 yudao-module-mes,
包含完整的 CRUD、树形分类、物料分页查询、enrichment 等功能。

后端新增 17 个文件(1337 行):
- DO: MesMdItemTypeDO(树形分类)、MesMdItemDO(物料产品)
- VO: 分类 3 个(List/Save/Resp)、物料 3 个(Page/Save/Resp)
- Mapper: 2 个(BaseMapperX,纯 Java,无 XML)
- Service: 4 个(接口 + 实现)
- Controller: 2 个(/mes/md/item-type、/mes/md/item)
- ErrorCodeConstants 追加 9 个错误码

关键业务逻辑:
- 分类:父分类递归环路检测、同级名称/编码唯一性、删除保护(子分类+物料)
- 物料:编码/名称全局唯一、分类存在校验、安全库存联动清零
- enrichment:物料 RespVO 通过 Service 关联填充 itemTypeName、itemOrProduct
- 循环依赖:MesMdItemTypeServiceImpl 用 @Lazy 注入 MesMdItemService

plan: plans/swirling-stirring-metcalfe.md
2026-02-15 14:03:59 +08:00
LesanOuO 80128c5406 feat: 条件节点添加包含和不包含操作符 2026-02-14 16:53:21 +08:00
芋道源码 d3f008eb33
!863 !854 feat:【iot】接入 modbus 协议,重构所有协议的配置
Merge pull request !863 from 芋道源码/feature/iot
2026-02-14 03:10:48 +00:00
芋道源码 bb10760137
!854 feat:【iot】modbus-tcp 协议接入 100%:完整实现,修复 todo
Merge pull request !854 from 芋道源码/feature/iot-modbus
2026-02-14 03:09:03 +00:00
YunaiV ab8de6ea83 Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into feature/iot 2026-02-13 15:40:15 +08:00
YunaiV deed7eaff2 feat(iot):Modbus 支持 Master/Slave 双模式,配置表单和详情按协议类型区分展示 2026-02-13 15:35:41 +08:00
puhui999 e54c2b3e7a fix: 完成 review c153ff93 的所有 TODO 修复 2026-02-11 17:37:58 +08:00
puhui999 572c14a41a fix: 完成 review c153ff93 的所有 TODO 修复
- AreaSelect.vue: 删除未使用的 handleTree 导入
- AreaSelect.vue: 使用 AreaLevelEnum 枚举类型替代硬编码数字
- IframeComponent.vue: 已使用全局 isUrl 方法
- useAreaSelectRule.ts: 恢复代码格式空行,使用枚举常量
- useIframeRule.ts: 恢复代码格式空行
2026-02-11 17:27:07 +08:00
YunaiV 155edc41a9 feat(iot):Modbus 支持 Master/Slave 双模式,配置表单和详情按协议类型区分展示
1. ProtocolTypeEnum 拆分:MODBUS_TCP → MODBUS_TCP_MASTER + MODBUS_TCP_SLAVE
2. Slave 模式新增 mode(工作模式)、frameFormat(帧格式)字段,使用字典管理
3. 配置表单和详情页按 Master/Slave 模式条件展示不同字段,表单校验规则动态适配
4. 新增 DICT_TYPE:IOT_MODBUS_MODE、IOT_MODBUS_FRAME_FORMAT
5. 修复设备卡片 deviceName 过长溢出问题,添加文本截断

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:33:10 +08:00
YunaiV c153ff93c7 review:“新增 iframe 和省市区选择器组件” 2026-02-08 14:37:55 +08:00
芋道源码 c119040307
!861 feat(form-create): 新增 iframe 和省市区选择器组件
Merge pull request !861 from puhui999/master-dev
2026-02-08 06:32:21 +00:00
puhui999 99b1e6da2c Merge remote-tracking branch 'yudao/master' into master-dev 2026-02-08 11:56:45 +08:00
puhui999 a62251f900 feat(form-create): 新增 iframe 和省市区选择器组件
- 新增 iframe 网页嵌入组件,支持 URL 配置和实时预览
- 新增省市区三级联动选择器组件
2026-02-08 11:56:18 +08:00
YunaiV 5f211558fb Merge branch 'feature/iot-protocol' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into feature/iot-modbus
# Conflicts:
#	src/views/iot/device/device/detail/index.vue
2026-02-07 21:24:36 +08:00
YunaiV 91fb07971e fix(crm): 修复线索详情页转化状态按钮误显示,对应 https://t.zsxq.com/wq7ix 2026-02-07 21:07:31 +08:00
YunaiV 3aeb719ec2 fix(mall):OrderDetail detailData 为 null 的情况 2026-02-07 19:45:27 +08:00
YunaiV 1678bf6e57 fix: 忘记密码页面未开启验证码时,隐藏 Verify 组件,避免请求 captcha/get 接口 2026-02-07 16:42:23 +08:00
YunaiV 57a77b2ba9 feat(iot):【协议改造】移除 codecType,使用 protocolType 替代 2026-02-04 22:05:03 +08:00
YunaiV 4c5825389e feat(iot): refactor TimerConditionGroupConfig and PropertySelector for improved readability 2026-01-29 19:39:19 +08:00
芋道源码 da969d3be7
!859 feat(iot):【场景联动】定时触发,增加条件组
Merge pull request !859 from puhui999/feature/iot
2026-01-25 13:39:46 +00:00
puhui999 38e9298fa6 feat(iot):【场景联动】定时触发,增加条件组 2026-01-25 17:41:47 +08:00
YunaiV 972eb47610 feat:【iot】modbus-tcp 协议接入 100%:完整实现,修复 todo 2026-01-18 00:07:23 +08:00
YunaiV 56a25258ee feat:【iot】modbus-tcp 协议接入 40%:优化部分表单的实现,基于 dreamy-stirring-kazoo.md 2026-01-17 23:34:43 +08:00
YunaiV 8587a549c6 feat:【iot】modbus-tcp 协议接入 20%:初步实现,基于 dynamic-forging-wigderson.md 规划 2026-01-17 19:36:51 +08:00
8614095 3314dfe365 feat:增加说明文案 2026-01-15 11:13:20 +08:00
dylanmay d599ca91c6 接口变更 2025-02-10 14:34:29 +08:00
dylanmay 5c1bb25237 feat: 联系人 2024-12-12 22:19:14 +08:00
dylanmay e5b90372a6 数据持久化 2024-11-12 09:12:10 +08:00
dylanmay 5feb3e6815 socket接入 2024-11-12 09:11:08 +08:00
dylanmay 755bf1bb08 去掉conversatNo的使用 2024-10-28 16:31:04 +08:00
YunaiV 0d347643ca 【代码评审】IM:会话、消息相关的接口 2024-10-28 09:41:29 +08:00
dylanmay f3968db2e0 会话和消息处理 2024-10-26 19:45:08 +08:00
YunaiV 90461a8cdf Merge branch 'im' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into im 2024-10-20 13:52:05 +08:00
YunaiV d8d3366687 Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into im 2024-10-20 13:51:15 +08:00
dylanmay 90619542c8 单聊对接 2024-10-19 16:06:29 +08:00
YunaiV d2a212fb80 Merge branch 'master' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into im
# Conflicts:
#	src/router/modules/remaining.ts
2024-10-14 12:34:09 +08:00
dylanmay aaba03d001 update friend 2023-09-22 16:30:43 +08:00
dylanmay 5b8b51a894 feat: friends 2023-09-20 17:51:50 +08:00
dylanmay e3f8a3a94b feat: chat 2023-09-08 17:36:37 +08:00
916 changed files with 124992 additions and 24727 deletions

View File

@ -1,8 +0,0 @@
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/node_modules/*
/dist*
/src/main.ts

View File

@ -1,75 +0,0 @@
// @ts-check
const { defineConfig } = require('eslint-define-config')
module.exports = defineConfig({
root: true,
env: {
browser: true,
node: true,
es6: true
},
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2020,
sourceType: 'module',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true
}
},
extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended',
'@unocss'
],
rules: {
'vue/no-setup-props-destructure': 'off',
'vue/script-setup-uses-vars': 'error',
'vue/no-reserved-component-names': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': 'off',
'vue/custom-event-name-casing': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'no-unused-vars': 'off',
'space-before-function-paren': 'off',
'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/require-toggle-inside-transition': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off',
'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件
'@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示因为暂时不需要这么严格警告也有点繁琐
'@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
}
})

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ pnpm-debug
auto-*.d.ts
.idea
.history
output/

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

98
.vscode/settings.json vendored
View File

@ -1,5 +1,7 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.tsdk": "./node_modules/typescript/lib",
"volar.tsPlugin": true,
"volar.tsPluginStatus": false,
"npm.packageManager": "pnpm",
"editor.tabSize": 2,
"prettier.printWidth": 100, //
@ -83,54 +85,75 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
"source.fixAll.eslint": "explicit"
},
"editor.formatOnSave": true,
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
}
},
"i18n-ally.localesPaths": ["src/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": false,
"i18n-ally.namespace": true,
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"cSpell.words": [
"brotli",
"browserslist",
"codemirror",
"commitlint",
"cropperjs",
"echart",
"echarts",
"esnext",
"esno",
"iconify",
"INTLIFY",
"lintstagedrc",
"logicflow",
"nprogress",
"pinia",
"pnpm",
"qrcode",
"sider",
"sortablejs",
"stylelint",
"svgs",
"unocss",
"unplugin",
"unref",
"videojs",
"VITE",
"vitejs",
"vueuse",
"wangeditor",
"xingyu",
"yudao",
"zxcvbn"
"unocss",
"browserslist",
"esnext",
"unplugin",
"qrcode",
"sider",
"pinia",
"sider",
"nprogress",
"INTLIFY",
"stylelint",
"esno",
"vitejs",
"sortablejs",
"codemirror",
"iconify",
"commitlint",
"videojs",
"echarts",
"wangeditor",
"cropperjs",
"logicflow",
"vueuse",
"zxcvbn",
"lintstagedrc",
"brotli",
"sider",
"pnpm"
],
"vetur.format.scriptInitialIndent": true,
"vetur.format.styleInitialIndent": true,
"vetur.validation.script": false,
"MicroPython.executeButton": [
{
"text": "▶",
"tooltip": "运行",
"alignment": "left",
"command": "extension.executeFile",
"priority": 3.5
}
],
"MicroPython.syncButton": [
{
"text": "$(sync)",
"tooltip": "同步",
"alignment": "left",
"command": "extension.execute",
"priority": 4
}
],
//
"explorer.fileNesting.enabled": true,
@ -139,8 +162,7 @@
"*.ts": "$(capture).test.ts, $(capture).test.tsx",
"*.tsx": "$(capture).test.ts, $(capture).test.tsx",
"*.env": "$(capture).env.*",
"package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
"package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
},
"terminal.integrated.scrollback": 10000,
"nuxt.isNuxtApp": false
"terminal.integrated.scrollback": 10000
}

View File

@ -87,7 +87,7 @@
* 通用模块(必选):系统功能、基础设施
* 通用模块(可选):工作流程、支付系统、数据报表、会员中心
* 业务系统(按需):ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型
* 业务系统(按需):Mall 电子商城、OA 办公自动化、ERP 企业资源计划系统、WMS 仓库管理系统、CRM 客户关系管理、CMS 内容管理系统、MES 执行制造系统、AI 大模型平台、IoT 物联网系统、IM 即时通讯系统、Mobile 手机移动端、Report 数据大屏
### 系统功能
@ -222,18 +222,44 @@
![功能图](/.image/common/mall-preview.png)
### 会员中心
| | 功能 | 描述 |
|-----|------|----------------------------------|
| 🚀 | 会员管理 | 会员是 C 端的消费者,该功能用于会员的搜索与管理 |
| 🚀 | 会员标签 | 对会员的标签进行创建、查询、修改、删除等操作 |
| 🚀 | 会员等级 | 对会员的等级、成长值进行管理,可用于订单折扣等会员权益 |
| 🚀 | 会员分组 | 对会员进行分组,用于用户画像、内容推送等运营手段 |
| 🚀 | 积分签到 | 回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗 |
### ERP 系统
演示地址:<https://doc.iocoder.cn/erp-preview/>
![功能图](/.image/common/erp-feature.png)
### WMS 系统
演示地址:<https://doc.iocoder.cn/wms-preview/>
![功能图](/.image/common/wms-feature.png)
![预览图](/.image/common/wms-preview.png)
### CRM 系统
演示地址:<https://doc.iocoder.cn/crm-preview/>
![功能图](/.image/common/crm-feature.png)
### MES 系统
演示地址:<https://doc.iocoder.cn/mes-preview/>
![功能图](/.image/common/mes-feature.png)
![功能图](/.image/common/mes-preview.png)
### AI 大模型
演示地址:<https://doc.iocoder.cn/ai-preview/>
@ -242,6 +268,35 @@
![功能图](/.image/common/ai-preview.gif)
### MES 系统
演示地址:<https://doc.iocoder.cn/mes-preview/>
![功能图](/.image/common/mes-feature.png)
![预览图](/.image/common/mes-preview.png)
### IoT 物联网
演示地址:<https://doc.iocoder.cn/iot/build>
![功能图](/.image/common/iot-feature.png)
![预览图](/.image/common/iot-preview.png)
### IM 即时通讯
演示地址Vue3 + Element Plus<http://dashboard-vue3.yudao.iocoder.cn>
使用文档:<https://doc.iocoder.cn/im-preview/>
![功能图](/.image/common/im-feature.png)
| 聊天界面 | 聊天管理 |
| --- | --- |
| ![聊天界面](/.image/common/im-preview-home.png) | ![聊天管理](/.image/common/im-preview-manager.png) |
## 🐷 演示图
### 系统功能

View File

@ -2,8 +2,7 @@ import { resolve } from 'path'
import Vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
import progress from 'vite-plugin-progress'
import EslintPlugin from 'vite-plugin-eslint'
import PurgeIcons from 'vite-plugin-purge-icons'
import EslintPlugin from 'vite-plugin-eslint2'
import { ViteEjsPlugin } from 'vite-plugin-ejs'
// @ts-ignore
import ElementPlus from 'unplugin-element-plus/vite'
@ -29,7 +28,6 @@ export function createVitePlugins() {
VueJsx(),
UnoCSS(),
progress(),
PurgeIcons(),
ElementPlus({}),
AutoImport({
include: [
@ -64,7 +62,7 @@ export function createVitePlugins() {
dts: 'src/types/auto-components.d.ts',
// 自定义组件的解析器
resolvers: [ElementPlusResolver()],
globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**']
globs: ['src/components/**/**.{vue, md}', '!src/components/DiyEditor/components/mobile/**']
}),
EslintPlugin({
cache: false,
@ -77,7 +75,7 @@ export function createVitePlugins() {
}),
createSvgIconsPlugin({
iconDirs: [pathResolve('src/assets/svgs')],
symbolId: 'icon-[dir]-[name]',
symbolId: 'icon-[dir]-[name]'
}),
viteCompression({
verbose: true, // 是否在控制台输出压缩结果

View File

@ -2,22 +2,18 @@ const include = [
'qs',
'url',
'vue',
'sass',
'mitt',
'axios',
'pinia',
'dayjs',
'qrcode',
'unocss',
'vue-router',
'vue-types',
'vue-i18n',
'crypto-js',
'cropperjs',
'lodash-es',
'nprogress',
'web-storage-cache',
'@iconify/iconify',
'@vueuse/core',
'@zxcvbn-ts/core',
'echarts/core',
@ -91,18 +87,9 @@ const include = [
'element-plus/es/components/dropdown-menu/style/css',
'element-plus/es/components/dropdown-item/style/css',
'element-plus/es/components/skeleton/style/css',
'element-plus/es/components/skeleton/style/css',
'element-plus/es/components/backtop/style/css',
'element-plus/es/components/menu/style/css',
'element-plus/es/components/sub-menu/style/css',
'element-plus/es/components/menu-item/style/css',
'element-plus/es/components/dropdown/style/css',
'element-plus/es/components/skeleton-item/style/css',
'element-plus/es/components/tree/style/css',
'element-plus/es/components/dropdown-menu/style/css',
'element-plus/es/components/dropdown-item/style/css',
'element-plus/es/components/badge/style/css',
'element-plus/es/components/breadcrumb/style/css',
'element-plus/es/components/breadcrumb-item/style/css',
'element-plus/es/components/image/style/css',
'element-plus/es/components/collapse-transition/style/css',
'element-plus/es/components/timeline/style/css',
@ -119,6 +106,6 @@ const include = [
'element-plus/es/components/progress/style/css'
]
const exclude = ['@iconify/json']
const exclude: string[] = []
export { include, exclude }

115
eslint.config.mjs Normal file
View File

@ -0,0 +1,115 @@
import pluginVue from 'eslint-plugin-vue'
import tseslint from 'typescript-eslint'
import unocss from '@unocss/eslint-config/flat'
import autoImportGlobals from './.eslintrc-auto-import.json' with { type: 'json' }
export default tseslint.config(
// Global ignores (replaces .eslintignore)
{
ignores: [
'build/',
'config/',
'dist/',
'dist*/',
'*.js',
'*.mjs',
'!eslint.config.mjs',
'test/unit/coverage/',
'node_modules/',
'src/main.ts',
'src/types/auto-components.d.ts'
]
},
// Base TypeScript config
...tseslint.configs.recommended,
// Vue recommended config
...pluginVue.configs['flat/recommended'],
// UnoCSS config
unocss,
// Vue files use vue-eslint-parser with TypeScript parser
{
files: ['**/*.vue'],
languageOptions: {
parserOptions: {
parser: tseslint.parser
}
}
},
// Main rules config
{
languageOptions: {
ecmaVersion: 2020,
sourceType: 'module',
globals: {
...autoImportGlobals.globals
},
parserOptions: {
ecmaFeatures: {
jsx: true
}
}
},
rules: {
// Vue rules
'vue/no-reserved-component-names': 'off',
'vue/custom-event-name-casing': 'off',
'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/require-toggle-inside-transition': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always'
},
svg: 'always',
math: 'always'
}
],
'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off',
// TypeScript rules
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/no-unsafe-function-type': 'off',
'@typescript-eslint/no-wrapper-object-types': 'off',
'@typescript-eslint/no-this-alias': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'vue/no-ref-as-operand': 'off',
'vue/no-mutating-props': 'off',
'vue/no-side-effects-in-computed-properties': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'no-unused-vars': 'off',
'space-before-function-paren': 'off',
// UnoCSS rules - 芋艿:禁用 unocss 顺序提示
'@unocss/order': 'off',
'@unocss/order-attributify': 'off',
'unocss/order': 'off',
'unocss/order-attributify': 'off'
}
}
)

17486
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "yudao-ui-admin-vue3",
"version": "2026.01-snapshot",
"version": "2026.05-snapshot",
"description": "基于vue3、vite4、element-plus、typesScript",
"author": "xingyu",
"private": false,
@ -8,139 +8,137 @@
"i": "pnpm install",
"dev": "vite --mode env.local",
"dev-server": "vite --mode dev",
"ts:check": "vue-tsc --noEmit",
"build:local": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build",
"build:dev": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode dev",
"build:test": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode test",
"build:stage": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode stage",
"build:prod": "node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod",
"ts:check": "node --max_old_space_size=8192 ./node_modules/vue-tsc/bin/vue-tsc.js --noEmit",
"build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode env.local",
"build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev",
"build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test",
"build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage",
"build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod",
"serve:dev": "vite preview --mode dev",
"serve:prod": "vite preview --mode prod",
"preview": "pnpm build:local && vite preview",
"clean": "npx rimraf node_modules",
"clean:cache": "npx rimraf node_modules/.cache",
"lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
"lint:eslint": "eslint --fix ./src",
"lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
"lint:style": "stylelint --fix \"./src/**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c "
},
"dependencies": {
"@element-plus/icons-vue": "2.3.2",
"@form-create/designer": "^3.2.6",
"@form-create/element-ui": "^3.2.11",
"@iconify/iconify": "^3.1.1",
"@form-create/designer": "^3.4.0",
"@form-create/element-ui": "^3.2.38",
"@iconify/vue": "^5.0.1",
"@microsoft/fetch-event-source": "^2.0.1",
"@videojs-player/vue": "^1.0.0",
"@vueuse/core": "^10.9.0",
"@wangeditor-next/editor": "^5.6.46",
"@vueuse/core": "^14.3.0",
"@wangeditor-next/editor": "^5.7.0",
"@wangeditor-next/editor-for-vue": "^5.1.14",
"@wangeditor-next/plugin-mention": "^1.0.16",
"@wangeditor-next/plugin-mention": "^2.0.0",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"axios": "1.9.0",
"axios": "1.16.0",
"benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "^0.36.0",
"bpmn-js-token-simulation": "^0.39.3",
"camunda-bpmn-moddle": "^7.0.1",
"cropperjs": "^1.6.1",
"cropperjs": "^2.1.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.10",
"diagram-js": "^12.8.0",
"driver.js": "^1.3.1",
"echarts": "^5.5.0",
"dayjs": "^1.11.20",
"dhtmlx-gantt": "^9.1.1",
"diagram-js": "^15.14.0",
"driver.js": "^1.4.0",
"echarts": "^6.0.0",
"echarts-wordcloud": "^2.1.0",
"element-plus": "2.11.1",
"element-plus": "2.13.7",
"fast-xml-parser": "^4.3.2",
"highlight.js": "^11.9.0",
"jsencrypt": "^3.3.2",
"jsoneditor": "^10.1.3",
"lodash-es": "^4.17.21",
"markdown-it": "^14.1.0",
"markmap-common": "^0.16.0",
"markmap-lib": "^0.16.1",
"markmap-toolbar": "^0.17.0",
"markmap-view": "^0.16.0",
"min-dash": "^4.1.1",
"highlight.js": "^11.11.1",
"jsbarcode": "^3.12.3",
"jsencrypt": "^3.5.4",
"jsoneditor": "^10.4.3",
"livekit-client": "^2.18.9",
"lodash-es": "^4.18.1",
"markdown-it": "^14.1.1",
"markmap-common": "^0.18.9",
"markmap-lib": "^0.18.12",
"markmap-toolbar": "^0.18.12",
"markmap-view": "^0.18.12",
"min-dash": "^5.0.0",
"mitt": "^3.0.1",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
"qs": "^6.12.0",
"snabbdom": "^3.6.2",
"sortablejs": "^1.15.3",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
"qrcode": "^1.5.4",
"qs": "^6.15.1",
"snabbdom": "^3.6.3",
"sortablejs": "^1.15.7",
"steady-xml": "^0.1.0",
"url": "^0.11.3",
"video.js": "^7.21.5",
"vue": "3.5.12",
"vue-dompurify-html": "^4.1.4",
"vue-i18n": "9.10.2",
"vue-router": "4.4.5",
"vue-types": "^5.1.1",
"tyme4ts": "^1.4.6",
"url": "^0.11.4",
"video.js": "^8.23.8",
"vue": "3.5.34",
"vue-dompurify-html": "^5.3.0",
"vue-i18n": "11.4.0",
"vue-router": "5.0.6",
"vue-types": "^6.0.0",
"vue3-print-nb": "^0.1.4",
"vue3-signature": "^0.2.4",
"vue3-signature": "^0.4.4",
"vuedraggable": "^4.1.0",
"web-storage-cache": "^1.1.1",
"xml-js": "^1.6.11"
},
"devDependencies": {
"@commitlint/cli": "^19.0.1",
"@commitlint/config-conventional": "^19.0.0",
"@iconify/json": "^2.2.187",
"@intlify/unplugin-vue-i18n": "^2.0.0",
"@purge-icons/generated": "^0.9.0",
"@types/jsoneditor": "^9.9.5",
"@commitlint/cli": "^20.5.3",
"@commitlint/config-conventional": "^20.5.3",
"@iconify/json": "^2.2.470",
"@intlify/unplugin-vue-i18n": "^11.1.2",
"@types/jsoneditor": "^9.9.6",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.11.21",
"@types/node": "^25.6.0",
"@types/nprogress": "^0.2.3",
"@types/qrcode": "^1.5.5",
"@types/qs": "^6.9.12",
"@typescript-eslint/eslint-plugin": "^7.1.0",
"@typescript-eslint/parser": "^7.1.0",
"@unocss/eslint-config": "^0.57.4",
"@unocss/eslint-plugin": "66.1.0-beta.5",
"@unocss/transformer-variant-group": "^0.58.5",
"@vitejs/plugin-legacy": "^5.3.1",
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"autoprefixer": "^10.4.17",
"bpmn-js": "^17.9.2",
"bpmn-js-properties-panel": "5.23.0",
"consola": "^3.2.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "^2.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.22.0",
"lint-staged": "^15.2.2",
"postcss": "^8.4.35",
"postcss-html": "^1.6.0",
"@types/qrcode": "^1.5.6",
"@types/qs": "^6.15.0",
"@unocss/eslint-config": "^66.6.8",
"@unocss/eslint-plugin": "66.6.8",
"@unocss/transformer-variant-group": "^66.6.8",
"@vitejs/plugin-legacy": "^8.0.1",
"@vitejs/plugin-vue": "^6.0.6",
"@vitejs/plugin-vue-jsx": "^5.1.5",
"autoprefixer": "^10.5.0",
"bpmn-js": "^18.16.1",
"bpmn-js-properties-panel": "5.54.0",
"consola": "^3.4.2",
"eslint": "^10.3.0",
"eslint-plugin-vue": "^10.9.1",
"lint-staged": "^16.4.0",
"postcss": "^8.5.14",
"postcss-html": "^1.8.1",
"postcss-scss": "^4.0.9",
"prettier": "^3.2.5",
"prettier-eslint": "^16.3.0",
"rimraf": "^5.0.5",
"rollup": "^4.12.0",
"sass": "^1.69.5",
"stylelint": "^16.2.1",
"prettier": "^3.8.3",
"prettier-eslint": "^16.4.2",
"rimraf": "^6.1.3",
"rollup": "^4.60.3",
"sass": "^1.99.0",
"stylelint": "^17.11.0",
"stylelint-config-html": "^1.1.0",
"stylelint-config-recommended": "^14.0.0",
"stylelint-config-standard": "^36.0.0",
"stylelint-order": "^6.0.4",
"terser": "^5.28.1",
"typescript": "5.3.3",
"unocss": "^0.58.5",
"unplugin-auto-import": "^0.16.7",
"unplugin-element-plus": "^0.8.0",
"unplugin-vue-components": "^0.25.2",
"vite": "5.1.4",
"stylelint-config-recommended": "^18.0.0",
"stylelint-config-standard": "^40.0.0",
"stylelint-order": "^8.1.1",
"terser": "^5.46.2",
"typescript": "6.0.3",
"typescript-eslint": "^8.59.2",
"unocss": "^66.6.8",
"unplugin-auto-import": "^21.0.0",
"unplugin-element-plus": "^0.11.2",
"unplugin-vue-components": "^32.0.0",
"vite": "8.0.10",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-ejs": "^1.7.0",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-eslint2": "^5.1.0",
"vite-plugin-progress": "^0.0.7",
"vite-plugin-purge-icons": "^0.10.0",
"vite-plugin-svg-icons-ng": "^1.3.1",
"vite-plugin-top-level-await": "^1.4.4",
"vue-eslint-parser": "^9.3.2",
"vue-tsc": "^1.8.27"
"vite-plugin-svg-icons-ng": "^1.9.0",
"vite-plugin-top-level-await": "^1.6.0",
"vue-eslint-parser": "^10.4.0",
"vue-tsc": "^3.2.8"
},
"license": "MIT",
"repository": {
@ -153,7 +151,7 @@
"homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3",
"web-types": "./web-types.json",
"engines": {
"node": ">= 16.0.0",
"node": ">= 20.19.0",
"pnpm": ">=8.6.0"
}
}

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -0,0 +1,23 @@
import request from '@/config/axios'
// 用户端表情包项(精简版)
export interface ImFacePackUserItemVO {
id: number
url: string
name?: string
width: number
height: number
}
// 用户端表情包 + 嵌套 items
export interface ImFacePackUserVO {
id: number
name: string
icon?: string
items: ImFacePackUserItemVO[]
}
// 拉取所有启用的系统表情包(含表情列表)
export const getFacePackList = () => {
return request.get<ImFacePackUserVO[]>({ url: '/im/face-pack/list' })
}

View File

@ -0,0 +1,33 @@
import request from '@/config/axios'
// 个人表情
export interface ImFaceUserItemVO {
id: number
url: string
name?: string
width: number
height: number
}
// 添加个人表情请求
export interface ImFaceUserItemSaveReqVO {
url: string
name?: string
width: number
height: number
}
// 获取我的个人表情列表
export const getFaceUserItemList = () => {
return request.get<ImFaceUserItemVO[]>({ url: '/im/face-user-item/list' })
}
// 添加个人表情
export const createFaceUserItem = (data: ImFaceUserItemSaveReqVO) => {
return request.post<number>({ url: '/im/face-user-item/create', data })
}
// 删除个人表情
export const deleteFaceUserItem = (id: number) => {
return request.delete({ url: '/im/face-user-item/delete', params: { id } })
}

View File

@ -0,0 +1,62 @@
import request from '@/config/axios'
// IM 好友 Response VO
export interface ImFriendRespVO {
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 // 删除好友时间
// 聚合字段(自 AdminUser
nickname?: string // 好友昵称
nicknamePinyin?: string // 昵称的拼音(小写无空格,前端按首字母分桶 / 拼音搜索)
avatar?: string // 好友头像
}
// IM 好友更新 Request VO
export interface ImFriendUpdateReqVO {
friendUserId: number // 好友的用户编号
silent?: boolean // 是否免打扰
displayName?: string // 好友展示备注
pinned?: boolean // 是否置顶联系人
}
// 获得当前登录用户的好友列表
export const getMyFriendList = () => {
return request.get<ImFriendRespVO[]>({ url: '/im/friend/list' })
}
// 获得好友详情
export const getFriend = (friendUserId: number | string) => {
return request.get<ImFriendRespVO>({ url: '/im/friend/get', params: { friendUserId } })
}
// 删除好友(单向软删除)
export const deleteFriend = (friendUserId: number | string, clear: boolean) => {
return request.delete<boolean>({
url: '/im/friend/delete',
params: { friendUserId, clear }
})
}
// 更新好友信息(备注 / 免打扰 / 联系人置顶)
export const updateFriend = (data: ImFriendUpdateReqVO) => {
return request.put<boolean>({ url: '/im/friend/update', data })
}
// 拉黑好友(必须先是好友;单边屏蔽对方私聊消息)
export const blockFriend = (friendUserId: number | string) => {
return request.put<boolean>({ url: '/im/friend/block', params: { friendUserId } })
}
// 移出黑名单
export const unblockFriend = (friendUserId: number | string) => {
return request.put<boolean>({ url: '/im/friend/unblock', params: { friendUserId } })
}

View File

@ -0,0 +1,65 @@
import request from '@/config/axios'
// IM 好友申请 Response VO
export interface ImFriendRequestRespVO {
id: number // 申请编号
fromUserId: number // 发起方用户编号
toUserId: number // 接收方用户编号
handleResult: number // 处理结果0=未处理1=同意2=拒绝
applyContent?: string // 申请理由
handleContent?: string // 处理理由(接收方拒绝时可选填)
addSource?: number // 添加来源;参见 ImFriendAddSourceEnum
handleTime?: string // 处理时间
createTime: string // 申请创建时间
// 聚合字段(自 AdminUser
fromNickname?: string // 发起方昵称
fromAvatar?: string // 发起方头像
toNickname?: string // 接收方昵称
toAvatar?: string // 接收方头像
}
// IM 好友申请发起 Request VO
export interface ImFriendRequestApplyReqVO {
toUserId: number // 接收方用户编号
applyContent?: string // 申请理由
displayName?: string // 对接收方的备注(仅自己可见)
addSource?: number // 添加来源
}
// 发起好友申请
export const applyFriendRequest = (data: ImFriendRequestApplyReqVO) => {
return request.post<number | null>({ url: '/im/friend-request/apply', data })
}
// 同意好友申请
export const agreeFriendRequest = (id: number | string) => {
return request.put<boolean>({ url: '/im/friend-request/agree', params: { id } })
}
// 拒绝好友申请
export const refuseFriendRequest = (id: number | string, handleContent?: string) => {
return request.put<boolean>({
url: '/im/friend-request/refuse',
params: { id, handleContent }
})
}
// 查询「我相关」的好友申请列表(游标分页:传 maxId 加载更多)
export const getMyFriendRequestList = (limit: number, maxId?: number) => {
const params: Record<string, number> = { limit }
if (maxId != null) {
params.maxId = maxId
}
return request.get<ImFriendRequestRespVO[]>({
url: '/im/friend-request/list',
params
})
}
// 按 id 单查「我相关」的申请记录带越权过滤WebSocket 通知到达后用)
export const getMyFriendRequest = (id: number) => {
return request.get<ImFriendRequestRespVO | null>({
url: '/im/friend-request/get',
params: { id }
})
}

137
src/api/im/group/index.ts Normal file
View File

@ -0,0 +1,137 @@
import request from '@/config/axios'
import type { ImGroupMessageRespVO } from '@/api/im/message/group'
// 群 Response VO
export interface ImGroupRespVO {
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?: ImGroupMessageRespVO[] // 群置顶消息列表(后端关联回填,仅当登录用户是群成员时非空)
}
// 群消息置顶 / 取消置顶 Request VO
export interface ImGroupMessagePinReqVO {
id: number // 群编号
messageId: number // 消息编号
}
// 群创建 Request VO
export interface ImGroupCreateReqVO {
name: string // 群名称
memberUserIds?: number[] // 初始成员用户编号列表(建群同时邀请的好友,不含创建者自己)
joinApproval?: boolean // 进群是否需审批;不传默认 false 自由进群
}
// 群更新 Request VO
export interface ImGroupUpdateReqVO {
id: number // 群编号
name?: string // 群名称
avatar?: string // 群头像
notice?: string // 群公告
joinApproval?: boolean // 进群是否需审批
}
// 添加 / 撤销群管理员 Request VO
export interface ImGroupAdminReqVO {
id: number // 群编号
userIds: number[] // 目标用户编号列表
}
// 群主转让 Request VO
export interface ImGroupTransferOwnerReqVO {
id: number // 群编号
newOwnerUserId: number // 新群主用户编号
}
// 全群禁言 / 取消 Request VO
export interface ImGroupMuteAllReqVO {
id: number // 群编号
mutedAll: boolean // 是否全群禁言
}
// 成员禁言 Request VO
export interface ImGroupMuteMemberReqVO {
id: number // 群编号
userId: number // 被禁言的用户编号
mutedSeconds: number // 禁言时长0 表示永久禁言
}
// 取消成员禁言 Request VO
export interface ImGroupCancelMuteMemberReqVO {
id: number // 群编号
userId: number // 被取消禁言的用户编号
}
// 获得当前登录用户的群列表
export const getMyGroupList = () => {
return request.get<ImGroupRespVO[]>({ url: '/im/group/list' })
}
// 获得群详情
export const getGroup = (id: number | string) => {
return request.get<ImGroupRespVO>({ url: '/im/group/get', params: { id } })
}
// 创建群
export const createGroup = (data: ImGroupCreateReqVO) => {
return request.post<ImGroupRespVO>({ url: '/im/group/create', data })
}
// 更新群
export const updateGroup = (data: ImGroupUpdateReqVO) => {
return request.put<ImGroupRespVO>({ url: '/im/group/update', data })
}
// 解散群
export const dissolveGroup = (id: number | string) => {
return request.delete<boolean>({ url: '/im/group/dissolve', params: { id } })
}
// 添加群管理员(仅群主可调)
export const addGroupAdmin = (data: ImGroupAdminReqVO) => {
return request.put<boolean>({ url: '/im/group/add-admin', data })
}
// 撤销群管理员(仅群主可调)
export const removeGroupAdmin = (data: ImGroupAdminReqVO) => {
return request.put<boolean>({ url: '/im/group/remove-admin', data })
}
// 转让群主(仅老群主可调;旧群主转让后降为普通成员)
export const transferGroupOwner = (data: ImGroupTransferOwnerReqVO) => {
return request.put<boolean>({ url: '/im/group/transfer-owner', data })
}
// 置顶群消息(仅群主 / 管理员可调)
export const pinGroupMessage = (data: ImGroupMessagePinReqVO) => {
return request.put<boolean>({ url: '/im/group/pin-message', data })
}
// 取消置顶群消息(仅群主 / 管理员可调)
export const unpinGroupMessage = (data: ImGroupMessagePinReqVO) => {
return request.put<boolean>({ url: '/im/group/unpin-message', data })
}
// 全群禁言 / 取消(仅群主 / 管理员可调)
export const muteAll = (data: ImGroupMuteAllReqVO) => {
return request.put<boolean>({ url: '/im/group/mute-all', data })
}
// 禁言成员
export const muteMember = (data: ImGroupMuteMemberReqVO) => {
return request.put<boolean>({ url: '/im/group/mute-member', data })
}
// 取消成员禁言
export const cancelMuteMember = (data: ImGroupCancelMuteMemberReqVO) => {
return request.put<boolean>({ url: '/im/group/cancel-mute-member', data })
}

View File

@ -0,0 +1,76 @@
import request from '@/config/axios'
// 群成员 Response VO
export interface ImGroupMemberRespVO {
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 // 创建时间
// 聚合字段(自 AdminUser
nickname?: string // 用户昵称
avatar?: string // 用户头像
}
// 群成员邀请 Request VO
export interface ImGroupMemberInviteReqVO {
groupId: number // 群编号
memberUserIds: number[] // 被邀请的用户编号列表
}
// 群成员移除 Request VO
export interface ImGroupMemberRemoveReqVO {
groupId: number // 群编号
memberUserIds: number[] // 被移除的用户编号列表
}
// 群成员更新 Request VO
export interface ImGroupMemberUpdateReqVO {
groupId: number // 群编号
displayUserName?: string // 群内昵称
groupRemark?: string // 群备注
silent?: boolean // 是否免打扰
}
// 邀请用户加入群
export const inviteGroupMember = (data: ImGroupMemberInviteReqVO) => {
return request.post<boolean>({ url: '/im/group/invite', data })
}
// 退出群
export const quitGroup = (groupId: number | string) => {
return request.delete<boolean>({ url: '/im/group/quit', params: { groupId } })
}
// 移除群成员
export const removeGroupMember = (data: ImGroupMemberRemoveReqVO) => {
return request.delete<boolean>({ url: '/im/group/kicking', data })
}
// 获得群成员详情
export const getGroupMember = (groupId: number, userId: number) => {
return request.get<ImGroupMemberRespVO>({
url: '/im/group-member/get',
params: { groupId, userId }
})
}
// 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像)
export const getGroupMemberList = (groupId: number | string) => {
return request.get<ImGroupMemberRespVO[]>({
url: '/im/group-member/list',
params: { groupId }
})
}
// 更新群成员
export const updateGroupMember = (data: ImGroupMemberUpdateReqVO) => {
return request.put<boolean>({ url: '/im/group-member/update', data })
}

View File

@ -0,0 +1,71 @@
import request from '@/config/axios'
// IM 加群申请 Response VO
export interface ImGroupRequestRespVO {
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 // 申请创建时间
// 聚合字段
userNickname?: string // 申请人 / 被邀请人昵称
userAvatar?: string // 申请人 / 被邀请人头像
inviterNickname?: string // 邀请人昵称
inviterAvatar?: string // 邀请人头像
groupName?: string // 群名称
groupAvatar?: string // 群头像
}
// IM 加群申请发起 Request VO
export interface ImGroupRequestApplyReqVO {
groupId: number // 群编号
applyContent?: string // 申请理由
addSource?: number // 加入来源
}
// 申请加群
export const applyJoinGroup = (data: ImGroupRequestApplyReqVO) => {
return request.post<number | null>({ url: '/im/group-request/apply', data })
}
// 同意加群申请(群主或管理员)
export const agreeGroupRequest = (id: number | string) => {
return request.put<boolean>({ url: '/im/group-request/agree', params: { id } })
}
// 拒绝加群申请(群主或管理员)
export const refuseGroupRequest = (id: number | string, handleContent?: string) => {
return request.put<boolean>({
url: '/im/group-request/refuse',
params: { id, handleContent }
})
}
// 查询「我管理的所有群」下的未处理加群申请列表(不分页);前端 store 据此派生横幅红点 + Drawer 列表
export const getUnhandledRequestList = () => {
return request.get<ImGroupRequestRespVO[]>({
url: '/im/group-request/unhandled-list'
})
}
// 查询指定群下的全部加群申请(含已处理);仅群主 / 管理员可查
export const getGroupRequestListByGroupId = (groupId: number) => {
return request.get<ImGroupRequestRespVO[]>({
url: '/im/group-request/list-by-group',
params: { groupId }
})
}
// 按 id 单查申请记录带越权过滤WebSocket 通知到达后用)
export const getMyGroupRequest = (id: number) => {
return request.get<ImGroupRequestRespVO | null>({
url: '/im/group-request/get',
params: { id }
})
}

View File

@ -0,0 +1,41 @@
import request from '@/config/axios'
export interface ImManagerChannelVO {
id: number
code: string
name: string
avatar?: string
sort: number
status: number
createTime?: Date
}
// 获得频道分页
export const getManagerChannelPage = (params: PageParam) => {
return request.get({ url: '/im/manager/channel/page', params })
}
// 获得频道详情
export const getManagerChannel = (id: number) => {
return request.get({ url: '/im/manager/channel/get', params: { id } })
}
// 新增频道
export const createManagerChannel = (data: ImManagerChannelVO) => {
return request.post({ url: '/im/manager/channel/create', data })
}
// 修改频道
export const updateManagerChannel = (data: ImManagerChannelVO) => {
return request.put({ url: '/im/manager/channel/update', data })
}
// 删除频道
export const deleteManagerChannel = (id: number) => {
return request.delete({ url: '/im/manager/channel/delete', params: { id } })
}
// 获得启用的频道精简列表(表单选择用)
export const getSimpleChannelList = () => {
return request.get<ImManagerChannelVO[]>({ url: '/im/manager/channel/simple-list' })
}

View File

@ -0,0 +1,47 @@
import request from '@/config/axios'
export interface ImManagerChannelMaterialVO {
id: number
channelId: number
channelName?: string
type: number
title: string
coverUrl?: string
summary?: string
content?: string
url?: string
createTime?: Date
}
// 获得素材分页
export const getManagerChannelMaterialPage = (params: PageParam) => {
return request.get({ url: '/im/manager/channel-material/page', params })
}
// 获得指定频道下的素材精简列表
export const getSimpleManagerChannelMaterialList = (channelId: number) => {
return request.get({
url: '/im/manager/channel-material/simple-list',
params: { channelId }
})
}
// 获得素材详情
export const getManagerChannelMaterial = (id: number) => {
return request.get({ url: '/im/manager/channel-material/get', params: { id } })
}
// 新增素材
export const createManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => {
return request.post({ url: '/im/manager/channel-material/create', data })
}
// 修改素材
export const updateManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => {
return request.put({ url: '/im/manager/channel-material/update', data })
}
// 删除素材
export const deleteManagerChannelMaterial = (id: number) => {
return request.delete({ url: '/im/manager/channel-material/delete', params: { id } })
}

View File

@ -0,0 +1,34 @@
import request from '@/config/axios'
export interface ImManagerChannelMessageVO {
id: number
channelId: number
channelName?: string
materialId: number
materialTitle?: string
materialCoverUrl?: string
type: number
content?: string
receiverUserIds?: number[]
sendTime?: Date
}
export interface ImManagerChannelMessageSendReqVO {
materialId: number
receiverUserIds?: number[]
}
// 立即推送频道消息
export const sendManagerChannelMessage = (data: ImManagerChannelMessageSendReqVO) => {
return request.post({ url: '/im/manager/channel-message/send', data })
}
// 删除频道消息
export const deleteManagerChannelMessage = (id: number) => {
return request.delete({ url: '/im/manager/channel-message/delete', params: { id } })
}
// 获得频道消息分页
export const getManagerChannelMessagePage = (params: PageParam) => {
return request.get({ url: '/im/manager/channel-message/page', params })
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
export interface ImManagerFacePackItemVO {
id: number
packId: number
url: string
name?: string
width: number
height: number
sort: number
status: number
createTime?: Date
}
// 获得表情分页
export const getManagerFacePackItemPage = (params: PageParam) => {
return request.get({ url: '/im/manager/face-pack-item/page', params })
}
// 获得表情详情
export const getManagerFacePackItem = (id: number) => {
return request.get({ url: '/im/manager/face-pack-item/get', params: { id } })
}
// 新增表情
export const createManagerFacePackItem = (data: ImManagerFacePackItemVO) => {
return request.post({ url: '/im/manager/face-pack-item/create', data })
}
// 修改表情
export const updateManagerFacePackItem = (data: ImManagerFacePackItemVO) => {
return request.put({ url: '/im/manager/face-pack-item/update', data })
}
// 删除表情
export const deleteManagerFacePackItem = (id: number) => {
return request.delete({ url: '/im/manager/face-pack-item/delete', params: { id } })
}
// 批量删除表情
export const deleteManagerFacePackItemList = (ids: number[]) => {
return request.delete({
url: '/im/manager/face-pack-item/delete-list',
params: { ids: ids.join(',') }
})
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
export interface ImManagerFacePackVO {
id: number
name: string
icon?: string
sort: number
status: number
createTime?: Date
}
// 获得表情包分页
export const getManagerFacePackPage = (params: PageParam) => {
return request.get({ url: '/im/manager/face-pack/page', params })
}
// 获得表情包详情
export const getManagerFacePack = (id: number) => {
return request.get({ url: '/im/manager/face-pack/get', params: { id } })
}
// 新增表情包
export const createManagerFacePack = (data: ImManagerFacePackVO) => {
return request.post({ url: '/im/manager/face-pack/create', data })
}
// 修改表情包
export const updateManagerFacePack = (data: ImManagerFacePackVO) => {
return request.put({ url: '/im/manager/face-pack/update', data })
}
// 删除表情包
export const deleteManagerFacePack = (id: number) => {
return request.delete({ url: '/im/manager/face-pack/delete', params: { id } })
}
// 批量删除表情包
export const deleteManagerFacePackList = (ids: number[]) => {
return request.delete({
url: '/im/manager/face-pack/delete-list',
params: { ids: ids.join(',') }
})
}

View File

@ -0,0 +1,22 @@
import request from '@/config/axios'
export interface ImManagerFaceUserItemVO {
id: number
userId: number
userNickname?: string
url: string
name?: string
width?: number
height?: number
createTime?: Date
}
// 获得用户表情分页
export const getManagerFaceUserItemPage = (params: PageParam) => {
return request.get({ url: '/im/manager/face-user-item/page', params })
}
// 删除用户表情
export const deleteManagerFaceUserItem = (id: number) => {
return request.delete({ url: '/im/manager/face-user-item/delete', params: { id } })
}

View File

@ -0,0 +1,23 @@
import request from '@/config/axios'
export interface ImManagerFriendVO {
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 const getManagerFriendPage = (params: PageParam) => {
return request.get({ url: '/im/manager/friend/page', params })
}

View File

@ -0,0 +1,21 @@
import request from '@/config/axios'
export interface ImManagerFriendRequestVO {
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 const getManagerFriendRequestPage = (params: PageParam) => {
return request.get({ url: '/im/manager/friend-request/page', params })
}

View File

@ -0,0 +1,62 @@
import request from '@/config/axios'
export interface ImManagerGroupVO {
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 ImManagerGroupMemberVO {
userId: number
nickname?: string
avatar?: string
displayUserName?: string
groupRemark?: string
silent?: boolean
status: number
role?: number // 成员角色,参见 ImGroupMemberRole 枚举
joinTime?: Date
quitTime?: Date
muteEndTime?: Date // 禁言到期时间
}
// 获得群分页
export const getManagerGroupPage = (params: PageParam) => {
return request.get({ url: '/im/manager/group/page', params })
}
// 获得群详情
export const getManagerGroup = (id: number) => {
return request.get({ url: '/im/manager/group/get', params: { id } })
}
// 封禁群
export const banManagerGroup = (data: { id: number; reason: string }) => {
return request.put({ url: '/im/manager/group/ban', data })
}
// 解封群
export const unbanManagerGroup = (id: number) => {
return request.put({ url: '/im/manager/group/unban', params: { id } })
}
// 解散群
export const dissolveManagerGroup = (id: number) => {
return request.delete({ url: '/im/manager/group/dissolve', params: { id } })
}
// 获得群成员列表(含已退群成员,由前端按需过滤)
export const getManagerGroupMemberList = (groupId: number) => {
return request.get({ url: '/im/manager/group/member/list', params: { groupId } })
}

View File

@ -0,0 +1,24 @@
import request from '@/config/axios'
export interface ImManagerGroupRequestVO {
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 const getManagerGroupRequestPage = (params: PageParam) => {
return request.get({ url: '/im/manager/group-request/page', params })
}

View File

@ -0,0 +1,29 @@
import request from '@/config/axios'
export interface ImManagerGroupMessageVO {
id: number
clientMessageId?: string
groupId: number
groupName?: string
senderId: number
senderNickname?: string
type: number
content: string
status: number
atUserIds?: number[]
// 与 atUserIds 同长度;后端对找不到 / 已删除的成员返回 nullUI 用 `?.[idx] || userId` 回退到 userId 渲染
atUserNicknames?: (string | null)[]
receiptStatus?: number
sendTime: Date
createTime: Date
}
// 获得群聊消息分页
export const getManagerGroupMessagePage = (params: PageParam) => {
return request.get({ url: '/im/manager/message/group/page', params })
}
// 获得群聊消息详情
export const getManagerGroupMessage = (id: number) => {
return request.get({ url: '/im/manager/message/group/get', params: { id } })
}

View File

@ -0,0 +1,25 @@
import request from '@/config/axios'
export interface ImManagerPrivateMessageVO {
id: number
clientMessageId?: string
senderId: number
senderNickname?: string
receiverId: number
receiverNickname?: string
type: number
content: string
status: number
sendTime: Date
createTime: Date
}
// 获得私聊消息分页
export const getManagerPrivateMessagePage = (params: PageParam) => {
return request.get({ url: '/im/manager/message/private/page', params })
}
// 获得私聊消息详情
export const getManagerPrivateMessage = (id: number) => {
return request.get({ url: '/im/manager/message/private/get', params: { id } })
}

View File

@ -0,0 +1,40 @@
import request from '@/config/axios'
export interface ImManagerRtcCallVO {
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
}
export interface ImManagerRtcParticipantVO {
id: number
callId: number
userId: number
userNickname?: string
role: number
status: number
inviteTime: Date
acceptTime?: Date
leaveTime?: Date
}
// 获得通话记录分页
export const getManagerRtcCallPage = (params: PageParam) => {
return request.get({ url: '/im/manager/rtc/page', params })
}
// 获得通话参与者列表
export const getManagerRtcCallParticipantList = (id: number) => {
return request.get({ url: '/im/manager/rtc/participant-list', params: { id } })
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
export interface ImManagerSensitiveWordVO {
id: number
word: string
status: number
creator?: string
creatorName?: string
createTime?: Date
}
// 获得敏感词分页
export const getManagerSensitiveWordPage = (params: PageParam) => {
return request.get({ url: '/im/manager/sensitive-word/page', params })
}
// 获得敏感词详情
export const getManagerSensitiveWord = (id: number) => {
return request.get({ url: '/im/manager/sensitive-word/get', params: { id } })
}
// 新增敏感词
export const createManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => {
return request.post({ url: '/im/manager/sensitive-word/create', data })
}
// 修改敏感词
export const updateManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => {
return request.put({ url: '/im/manager/sensitive-word/update', data })
}
// 删除敏感词
export const deleteManagerSensitiveWord = (id: number) => {
return request.delete({ url: '/im/manager/sensitive-word/delete', params: { id } })
}
// 批量删除敏感词
export const deleteManagerSensitiveWordList = (ids: number[]) => {
return request.delete({
url: '/im/manager/sensitive-word/delete-list',
params: { ids: ids.join(',') }
})
}

View File

@ -0,0 +1,70 @@
import request from '@/config/axios'
export interface ImStatisticsOverviewVO {
totalUser: number
newUserToday: number
totalGroup: number
newGroupToday: number
activeUserDaily: number
activeUserWeekly: number
activeUserMonthly: number
privateMessageToday: number
groupMessageToday: number
privateMessageYesterday: number
groupMessageYesterday: number
}
export interface ImStatisticsTrendVO {
dates: string[]
series: Record<string, number[]>
}
export interface ImStatisticsMessageTypeVO {
type: number // 参见 ImMessageTypeEnum 枚举类,由前端按 DICT_TYPE.IM_MESSAGE_TYPE 翻译
value: number
}
export interface ImStatisticsGroupSizeVO {
range: string
count: number
}
export interface ImStatisticsTopSenderVO {
userId: number
nickname: string
messageCount: number
}
// 获得 KPI 概览
export const getStatisticsOverview = (): Promise<ImStatisticsOverviewVO> => {
return request.get<ImStatisticsOverviewVO>({ url: '/im/manager/statistics/overview' })
}
// 获得消息趋势(私聊 + 群聊双线)
export const getMessageTrend = (days: number): Promise<ImStatisticsTrendVO> => {
return request.get<ImStatisticsTrendVO>({ url: '/im/manager/statistics/message-trend', params: { days } })
}
// 获得用户趋势(新增注册 + 日活双线)
export const getUserTrend = (days: number): Promise<ImStatisticsTrendVO> => {
return request.get<ImStatisticsTrendVO>({ url: '/im/manager/statistics/user-trend', params: { days } })
}
// 获得消息类型分布(最近 30 天)
export const getMessageTypeDistribution = (): Promise<ImStatisticsMessageTypeVO[]> => {
return request.get<ImStatisticsMessageTypeVO[]>({
url: '/im/manager/statistics/message-type-distribution'
})
}
// 获得群规模分布
export const getGroupSizeDistribution = (): Promise<ImStatisticsGroupSizeVO[]> => {
return request.get<ImStatisticsGroupSizeVO[]>({
url: '/im/manager/statistics/group-size-distribution'
})
}
// 获得消息 TOP 发送者(最近 30 天)
export const getTopSenders = (): Promise<ImStatisticsTopSenderVO[]> => {
return request.get<ImStatisticsTopSenderVO[]>({ url: '/im/manager/statistics/top-senders' })
}

View File

@ -0,0 +1,30 @@
import request from '@/config/axios'
export interface ImChannelMessageRespVO {
id: number
clientMessageId?: string
channelId: number
materialId: number
type: number
content: string
/** 当前用户已读态pull 时按 Redis 游标计算填充,多端同步使用 */
status?: number
sendTime: string
}
// 拉取当前用户应收的频道消息(离线增量);按 minId 游标分页
export const pullChannelMessages = (params: { minId: number; size?: number }, signal?: AbortSignal) => {
return request.get<ImChannelMessageRespVO[]>({
url: '/im/channel/message/pull',
params,
signal
})
}
// 上报频道消息已读位置;切到频道会话或拉到新消息后调
export const readChannelMessages = (channelId: number, messageId: number) => {
return request.put({
url: '/im/channel/message/read',
params: { channelId, messageId }
})
}

View File

@ -0,0 +1,76 @@
import request from '@/config/axios'
// 群聊消息 Response VO
export interface ImGroupMessageRespVO {
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 ImGroupMessageSendReqVO {
clientMessageId: string // 客户端消息编号
groupId: number // 群编号
type: number // 消息类型
content: string // 消息内容JSON 格式)
atUserIds?: number[] // @ 目标用户编号列表
receipt?: boolean // 是否需要回执
}
// 群聊历史消息列表 Request VO
export interface ImGroupMessageListReqVO {
groupId: number | string // 群编号
maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始
limit: number // 拉取数量1 ~ 200
}
// 发送群聊消息
export const sendGroupMessage = (data: ImGroupMessageSendReqVO) => {
return request.post<ImGroupMessageRespVO>({ url: '/im/message/group/send', data })
}
// 拉取群聊消息(增量)
export const pullGroupMessages = (
params: { minId: number | string; size: number },
signal?: AbortSignal
) => {
return request.get<ImGroupMessageRespVO[]>({ url: '/im/message/group/pull', params, signal })
}
// 查询群聊历史消息
export const getGroupMessageList = (params: ImGroupMessageListReqVO) => {
return request.get<ImGroupMessageRespVO[]>({ url: '/im/message/group/list', params })
}
// 标记群聊消息已读
export const readGroupMessages = (groupId: number | string, messageId: number | string) => {
return request.put<boolean>({
url: '/im/message/group/read',
params: { groupId, messageId }
})
}
// 撤回群聊消息
export const recallGroupMessage = (id: number | string) => {
return request.delete<ImGroupMessageRespVO>({
url: '/im/message/group/recall',
params: { id }
})
}
// 获取群消息已读用户列表
export const getGroupReadUsers = (params: {
groupId: number | string
messageId: number | string
}) => {
return request.get<number[]>({ url: '/im/message/group/get-read-user-ids', params })
}

View File

@ -0,0 +1,71 @@
import request from '@/config/axios'
// 私聊消息 Response VO
export interface ImPrivateMessageRespVO {
id: number // 消息编号
clientMessageId: string // 客户端消息编号
senderId: number // 发送人编号
receiverId: number // 接收人编号
type: number // 消息类型
content: string // 消息内容JSON 格式)
status: number // 消息状态
sendTime: string // 发送时间
}
// 私聊消息发送 Request VO
export interface ImPrivateMessageSendReqVO {
clientMessageId: string // 客户端消息编号
receiverId: number // 接收人编号
type: number // 消息类型
content: string // 消息内容JSON 格式)
}
// 私聊历史消息列表 Request VO
export interface ImPrivateMessageListReqVO {
receiverId: number | string // 接收人编号(对方)
maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始
limit: number // 拉取数量1 ~ 200
}
// 发送私聊消息
export const sendPrivateMessage = (data: ImPrivateMessageSendReqVO) => {
return request.post<ImPrivateMessageRespVO>({ url: '/im/message/private/send', data })
}
// 拉取私聊消息(增量)
export const pullPrivateMessages = (
params: { minId: number | string; size: number },
signal?: AbortSignal
) => {
return request.get<ImPrivateMessageRespVO[]>({ url: '/im/message/private/pull', params, signal })
}
// 查询私聊历史消息
export const getPrivateMessageList = (params: ImPrivateMessageListReqVO) => {
return request.get<ImPrivateMessageRespVO[]>({ url: '/im/message/private/list', params })
}
// 标记私聊消息已读
export const readPrivateMessages = (receiverId: number | string, messageId: number | string) => {
return request.put<boolean>({
url: '/im/message/private/read',
params: { receiverId, messageId }
})
}
// 查询对方已读到我发的最大消息 id多端 / 离线后用于补齐已读状态)
export const getPrivateMaxReadMessageId = (peerId: number | string, signal?: AbortSignal) => {
return request.get<number | null>({
url: '/im/message/private/max-read-message-id',
params: { peerId },
signal
})
}
// 撤回私聊消息
export const recallPrivateMessage = (id: number | string) => {
return request.delete<ImPrivateMessageRespVO>({
url: '/im/message/private/recall',
params: { id }
})
}

88
src/api/im/rtc/index.ts Normal file
View File

@ -0,0 +1,88 @@
import request from '@/config/axios'
// 创建新通话请求 VO
export interface ImRtcCallCreateReqVO {
conversationType: number
mediaType: number
groupId?: number
inviteeIds: number[] // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人
}
// 通话中追加邀请请求 VO仅群通话可用
export interface ImRtcCallInviteReqVO {
room: string
inviteeIds: number[]
}
// 通话会话 VOcreate / join / accept / refreshToken 共用
export interface ImRtcCallRespVO {
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 ImRtcGroupCallRespVO {
room: string
groupId: number
mediaType: number
inviterId: number
joinedUserIds?: number[]
inviteeIds?: number[]
}
// 创建新通话;私聊或群聊根据 conversationType 区分
export const createCall = (data: ImRtcCallCreateReqVO) => {
return request.post<ImRtcCallRespVO>({ url: '/im/rtc/create', data })
}
// 通话中追加邀请;仅群通话可用
export const inviteCall = (data: ImRtcCallInviteReqVO) => {
return request.post<boolean>({ url: '/im/rtc/invite', data })
}
// 加入已有群通话;用于胶囊条「加入」按钮
export const joinCall = (room: string) => {
return request.post<ImRtcCallRespVO>({ url: '/im/rtc/join', params: { room } })
}
// 接听通话
export const acceptCall = (room: string) => {
return request.post<ImRtcCallRespVO>({ url: '/im/rtc/accept', params: { room } })
}
// 拒绝通话
export const rejectCall = (room: string) => {
return request.post<boolean>({ url: '/im/rtc/reject', params: { room } })
}
// 取消邀请;主叫接通前调用
export const cancelCall = (room: string) => {
return request.post<boolean>({ url: '/im/rtc/cancel', params: { room } })
}
// 离开通话;接通后调用
export const leaveCall = (room: string) => {
return request.post<boolean>({ url: '/im/rtc/leave', params: { room } })
}
// 振铃超时检查RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING接口静默
export const noAnswerCallCheck = (room: string) => {
return request.post<boolean>({ url: '/im/rtc/no-answer-call-check', params: { room } })
}
// 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话
export const getActiveCall = (groupId: number) => {
return request.get<ImRtcGroupCallRespVO | null>({
url: '/im/rtc/get-active-call',
params: { groupId }
})
}

View File

@ -10,6 +10,9 @@ export interface AlertConfig {
sceneRuleIds: string // 关联的场景联动规则编号数组
receiveUserIds: string // 接收的用户编号数组
receiveTypes: string // 接收的类型数组
smsTemplateCode?: string // 短信模板编号
mailTemplateCode?: string // 邮件模板编号
notifyTemplateCode?: string // 站内信模板编号
}
// IoT 告警配置 API

View File

@ -0,0 +1,31 @@
import request from '@/config/axios'
/** Modbus 连接配置 VO */
export interface DeviceModbusConfigVO {
id?: number // 主键
deviceId: number // 设备编号
ip: string // Modbus 服务器 IP 地址
port: number // Modbus 服务器端口
slaveId: number // 从站地址
timeout: number // 连接超时时间,单位:毫秒
retryInterval: number // 重试间隔,单位:毫秒
mode: number // 模式
frameFormat: number // 帧格式
status: number // 状态
}
/** Modbus 连接配置 API */
export const DeviceModbusConfigApi = {
/** 获取设备的 Modbus 连接配置 */
getModbusConfig: async (deviceId: number) => {
return await request.get<DeviceModbusConfigVO>({
url: `/iot/device-modbus-config/get`,
params: { deviceId }
})
},
/** 保存 Modbus 连接配置 */
saveModbusConfig: async (data: DeviceModbusConfigVO) => {
return await request.post({ url: `/iot/device-modbus-config/save`, data })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
/** Modbus 点位配置 VO */
export interface DeviceModbusPointVO {
id?: number // 主键
deviceId: number // 设备编号
thingModelId?: number // 物模型属性编号
identifier: string // 属性标识符
name: string // 属性名称
functionCode?: number // Modbus 功能码
registerAddress?: number // 寄存器起始地址
registerCount?: number // 寄存器数量
byteOrder?: string // 字节序
rawDataType?: string // 原始数据类型
scale: number // 缩放因子
pollInterval: number // 轮询间隔,单位:毫秒
status: number // 状态
}
/** Modbus 点位配置 API */
export const DeviceModbusPointApi = {
/** 获取设备的 Modbus 点位分页 */
getModbusPointPage: async (params: any) => {
return await request.get({ url: `/iot/device-modbus-point/page`, params })
},
/** 获取 Modbus 点位详情 */
getModbusPoint: async (id: number) => {
return await request.get<DeviceModbusPointVO>({
url: `/iot/device-modbus-point/get?id=${id}`
})
},
/** 创建 Modbus 点位配置 */
createModbusPoint: async (data: DeviceModbusPointVO) => {
return await request.post({ url: `/iot/device-modbus-point/create`, data })
},
/** 更新 Modbus 点位配置 */
updateModbusPoint: async (data: DeviceModbusPointVO) => {
return await request.put({ url: `/iot/device-modbus-point/update`, data })
},
/** 删除 Modbus 点位配置 */
deleteModbusPoint: async (id: number) => {
return await request.delete({ url: `/iot/device-modbus-point/delete?id=${id}` })
}
}

View File

@ -16,7 +16,8 @@ export interface ProductVO {
status: number // 产品状态
deviceType: number // 设备类型
netType: number // 联网方式
codecType: string // 数据格式(编解码器类型)
protocolType: string // 协议类型
serializeType: string // 序列化类型
deviceCount: number // 设备数量
createTime: Date // 创建时间
}
@ -27,9 +28,23 @@ export enum DeviceTypeEnum {
GATEWAY_SUB = 1, // 网关子设备
GATEWAY = 2 // 网关设备
}
// IOT 数据格式(编解码器类型)枚举类
export enum CodecTypeEnum {
ALINK = 'Alink' // 阿里云 Alink 协议
// IoT 协议类型枚举
export enum ProtocolTypeEnum {
TCP = 'tcp',
UDP = 'udp',
WEBSOCKET = 'websocket',
HTTP = 'http',
MQTT = 'mqtt',
EMQX = 'emqx',
COAP = 'coap',
MODBUS_TCP_CLIENT = 'modbus_tcp_client',
MODBUS_TCP_SERVER = 'modbus_tcp_server'
}
// IoT 序列化类型枚举
export enum SerializeTypeEnum {
JSON = 'json',
BINARY = 'binary'
}
// IoT 产品 API

View File

@ -13,6 +13,7 @@ export interface DataSinkVO {
| TcpConfig
| WebSocketConfig
| MqttConfig
| DatabaseConfig
| RocketMQConfig
| KafkaMQConfig
| RabbitMQConfig
@ -73,6 +74,14 @@ export interface MqttConfig extends Config {
topic: string
}
/** Database 配置 */
export interface DatabaseConfig extends Config {
jdbcUrl: string
username: string
password: string
tableName: string
}
/** RocketMQ 配置 */
export interface RocketMQConfig extends Config {
nameServer: string

View File

@ -5,6 +5,7 @@ export interface IotSceneRule {
id?: number // 场景编号
name: string // 场景名称
description?: string // 场景描述
lastTriggerTime?: string // 最近触发时间
status: number // 场景状态0-开启1-关闭
triggers: Trigger[] // 触发器数组
actions: Action[] // 执行器数组

View File

@ -215,8 +215,8 @@ export const ThingModelFormRules = {
identifier: [
{ required: true, message: '标识符不能为空', trigger: 'blur' },
{
pattern: /^[a-zA-Z0-9_]{1,50}$/,
message: '支持大小写字母、数字和下划线,不超过 50 个字符',
pattern: /^[a-zA-Z][a-zA-Z0-9_]{0,31}$/,
message: '支持大小写字母、数字和下划线,必须以字母开头,不超过 32 个字符',
trigger: 'blur'
},
{

View File

@ -79,7 +79,7 @@ export const getMemberSummary = () => {
export const getMemberAnalyse = (params: MemberAnalyseReqVO) => {
return request.get<MemberAnalyseRespVO>({
url: '/statistics/member/analyse',
params: { times: [formatDate(params.times[0]), formatDate(params.times[1])] }
params: { times: [formatDate(params.times[0] as any), formatDate(params.times[1] as any)] }
})
}
@ -118,6 +118,6 @@ export const getMemberRegisterCountList = (
) => {
return request.get<MemberRegisterCountRespVO[]>({
url: '/statistics/member/register-count-list',
params: { times: [formatDate(beginTime), formatDate(endTime)] }
params: { times: [formatDate(beginTime as any), formatDate(endTime as any)] }
})
}

View File

@ -9,6 +9,7 @@ export interface UserVO {
loginIp: string
mark: string
mobile: string
email: string | undefined
name: string | undefined
nickname: string | undefined
registerIp: string

View File

@ -0,0 +1,25 @@
import request from '@/config/axios'
// 排班日历 - 班组排班项
export interface CalCalendarTeamShiftItem {
teamId: number
teamName: string
shiftId: number
shiftName: string
sort: number
}
// 排班日历 - 日历天 VO
export interface CalCalendarDayVO {
day: string // yyyy-MM-dd
shiftType: number // 轮班方式
teamShifts: CalCalendarTeamShiftItem[]
}
// 排班日历 API
export const CalCalendarApi = {
// 查询排班日历列表
getCalendarList: async (params: any) => {
return await request.get({ url: `/mes/cal/calendar/list`, params })
}
}

View File

@ -0,0 +1,28 @@
import request from '@/config/axios'
// MES 假期设置 VO
export interface CalHolidayVO {
id: number // 编号
day: number // 日期(时间戳)
type: number // 日期类型
remark: string // 备注
createTime: string // 创建时间
}
// MES 假期设置 API
export const CalHolidayApi = {
// 查询假期设置列表(支持可选日期范围过滤)
getHolidayList: async (params?: { startDay?: string; endDay?: string }) => {
return await request.get({ url: `/mes/cal/holiday/list`, params })
},
// 根据日期查询假期设置
getHolidayByDay: async (day: string) => {
return await request.get({ url: `/mes/cal/holiday/get-by-day`, params: { day } })
},
// 保存假期设置(含 upsert 逻辑)
saveHoliday: async (data: CalHolidayVO) => {
return await request.post({ url: `/mes/cal/holiday/save`, data })
}
}

View File

@ -0,0 +1,54 @@
import request from '@/config/axios'
// MES 排班计划 VO
export interface CalPlanVO {
id: number
code: string // 计划编码
name: string // 计划名称
calendarType: number // 班组类型
startDate: number // 开始日期
endDate: number // 结束日期
shiftType: number // 轮班方式
shiftMethod: number // 倒班方式
shiftCount: number // 倒班天数
status: number // 状态
remark: string // 备注
}
// MES 排班计划 API
export const CalPlanApi = {
// 查询排班计划分页
getPlanPage: async (params: any) => {
return await request.get({ url: `/mes/cal/plan/page`, params })
},
// 查询排班计划详情
getPlan: async (id: number) => {
return await request.get({ url: `/mes/cal/plan/get?id=` + id })
},
// 新增排班计划
createPlan: async (data: CalPlanVO) => {
return await request.post({ url: `/mes/cal/plan/create`, data })
},
// 修改排班计划
updatePlan: async (data: CalPlanVO) => {
return await request.put({ url: `/mes/cal/plan/update`, data })
},
// 确认排班计划
confirmPlan: async (id: number) => {
return await request.put({ url: `/mes/cal/plan/confirm?id=` + id })
},
// 删除排班计划
deletePlan: async (id: number) => {
return await request.delete({ url: `/mes/cal/plan/delete?id=` + id })
},
// 导出排班计划 Excel
exportPlan: async (params: any) => {
return await request.download({ url: `/mes/cal/plan/export-excel`, params })
}
}

View File

@ -0,0 +1,35 @@
import request from '@/config/axios'
// MES 计划班次 VO
export interface CalPlanShiftVO {
id: number
planId: number // 排班计划编号
sort: number // 显示顺序
name: string // 班次名称
startTime: string // 开始时间
endTime: string // 结束时间
remark: string // 备注
}
// MES 计划班次 API
export const CalPlanShiftApi = {
// 查询指定排班计划的班次列表
getPlanShiftListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/cal/plan-shift/list-by-plan?planId=` + planId })
},
// 新增计划班次
createPlanShift: async (data: CalPlanShiftVO) => {
return await request.post({ url: `/mes/cal/plan-shift/create`, data })
},
// 修改计划班次
updatePlanShift: async (data: CalPlanShiftVO) => {
return await request.put({ url: `/mes/cal/plan-shift/update`, data })
},
// 删除计划班次
deletePlanShift: async (id: number) => {
return await request.delete({ url: `/mes/cal/plan-shift/delete?id=` + id })
}
}

View File

@ -0,0 +1,31 @@
import request from '@/config/axios'
// MES 计划班组关联 VO
export interface CalPlanTeamVO {
id: number
planId: number // 排班计划编号
teamId: number // 班组编号
teamCode: string // 班组编码
teamName: string // 班组名称
remark: string // 备注
}
// TODO @AI挪到 team/index.ts 中
// MES 计划班组关联 API
export const CalPlanTeamApi = {
// 查询指定排班计划的班组列表
getPlanTeamListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/cal/plan-team/list-by-plan?planId=` + planId })
},
// 新增计划班组关联
createPlanTeam: async (data: CalPlanTeamVO) => {
return await request.post({ url: `/mes/cal/plan-team/create`, data })
},
// 删除计划班组关联
deletePlanTeam: async (id: number) => {
return await request.delete({ url: `/mes/cal/plan-team/delete?id=` + id })
}
}

View File

@ -0,0 +1,29 @@
import request from '@/config/axios'
// MES 计划班组关联 VO
export interface CalPlanTeamVO {
id: number
planId: number // 排班计划编号
teamId: number // 班组编号
teamCode: string // 班组编码
teamName: string // 班组名称
remark: string // 备注
}
// MES 计划班组关联 API
export const CalPlanTeamApi = {
// 查询指定排班计划的班组列表
getPlanTeamListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/cal/plan-team/list-by-plan?planId=` + planId })
},
// 新增计划班组关联
createPlanTeam: async (data: CalPlanTeamVO) => {
return await request.post({ url: `/mes/cal/plan-team/create`, data })
},
// 删除计划班组关联
deletePlanTeam: async (id: number) => {
return await request.delete({ url: `/mes/cal/plan-team/delete?id=` + id })
}
}

View File

@ -0,0 +1,37 @@
import request from '@/config/axios'
// TODO @AI挪到 plan/shift 目录下
// MES 计划班次 VO
export interface CalPlanShiftVO {
id: number
planId: number // 排班计划编号
sort: number // 显示顺序
name: string // 班次名称
startTime: string // 开始时间
endTime: string // 结束时间
remark: string // 备注
}
// MES 计划班次 API
export const CalPlanShiftApi = {
// 查询指定排班计划的班次列表
getPlanShiftListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/cal/plan-shift/list-by-plan?planId=` + planId })
},
// 新增计划班次
createPlanShift: async (data: CalPlanShiftVO) => {
return await request.post({ url: `/mes/cal/plan-shift/create`, data })
},
// 修改计划班次
updatePlanShift: async (data: CalPlanShiftVO) => {
return await request.put({ url: `/mes/cal/plan-shift/update`, data })
},
// 删除计划班次
deletePlanShift: async (id: number) => {
return await request.delete({ url: `/mes/cal/plan-shift/delete?id=` + id })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// MES 班组 VO
export interface CalTeamVO {
id: number
code: string // 班组编码
name: string // 班组名称
calendarType: number // 班组类型
remark: string // 备注
}
// MES 班组 API
export const CalTeamApi = {
// 查询班组分页
getTeamPage: async (params: any) => {
return await request.get({ url: `/mes/cal/team/page`, params })
},
// 查询班组详情
getTeam: async (id: number) => {
return await request.get({ url: `/mes/cal/team/get?id=` + id })
},
// 新增班组
createTeam: async (data: CalTeamVO) => {
return await request.post({ url: `/mes/cal/team/create`, data })
},
// 修改班组
updateTeam: async (data: CalTeamVO) => {
return await request.put({ url: `/mes/cal/team/update`, data })
},
// 删除班组
deleteTeam: async (id: number) => {
return await request.delete({ url: `/mes/cal/team/delete?id=` + id })
},
// 获得班组列表(全量,用于下拉选择)
getTeamList: async () => {
return await request.get({ url: `/mes/cal/team/list` })
},
// 导出班组 Excel
exportTeam: async (params: any) => {
return await request.download({ url: `/mes/cal/team/export-excel`, params })
}
}

View File

@ -0,0 +1,42 @@
import request from '@/config/axios'
// MES 班组成员 VO
export interface CalTeamMemberVO {
id: number
teamId: number // 班组编号
userId: number // 用户编号
nickname: string // 用户昵称(关联查询)
telephone: string // 用户手机号(关联查询)
remark: string // 备注
}
// MES 班组成员 API
export const CalTeamMemberApi = {
// 创建班组成员
createTeamMember: async (data: CalTeamMemberVO) => {
return await request.post({ url: `/mes/cal/team-member/create`, data })
},
// 删除班组成员
deleteTeamMember: async (id: number) => {
return await request.delete({ url: `/mes/cal/team-member/delete?id=` + id })
},
// 查询班组成员分页
getTeamMemberPage: async (params: any) => {
return await request.get({ url: `/mes/cal/team-member/page`, params })
},
// 查询指定班组的成员列表
getTeamMemberListByTeam: async (teamId: number) => {
return await request.get({ url: `/mes/cal/team-member/list-by-team`, params: { teamId } })
},
// 查询多个班组的成员列表
getTeamMemberListByTeamIds: async (teamIds: number[]) => {
return await request.get({
url: `/mes/cal/team-member/list-by-team`,
params: { teamIds: teamIds.join(',') }
})
}
}

View File

@ -0,0 +1,22 @@
import request from '@/config/axios'
// MES 班组排班 VO
export interface CalTeamShiftVO {
id: number
planId: number // 排班计划编号
teamId: number // 班组编号
shiftId: number // 班次编号
day: number // 日期
sort: number // 排序
teamName: string // 班组名称(关联查询)
shiftName: string // 班次名称(关联查询)
remark: string // 备注
}
// MES 班组排班 API
export const CalTeamShiftApi = {
// 查询班组排班列表
getTeamShiftList: async (params: any) => {
return await request.get({ url: `/mes/cal/team-shift/list`, params })
}
}

View File

@ -0,0 +1,58 @@
import request from '@/config/axios'
// MES 点检保养方案 VO
export interface DvCheckPlanVO {
id: number // 编号
code: string // 方案编码
name: string // 方案名称
type: number // 方案类型
startDate: Date // 开始日期
endDate: Date // 结束日期
cycleType: number // 周期类型
cycleCount: number // 周期数量
status: number // 状态
remark: string // 备注
}
// MES 点检保养方案 API
export const DvCheckPlanApi = {
// 查询点检保养方案分页
getCheckPlanPage: async (params: any) => {
return await request.get({ url: `/mes/dv/check-plan/page`, params })
},
// 查询点检保养方案详情
getCheckPlan: async (id: number) => {
return await request.get({ url: `/mes/dv/check-plan/get?id=` + id })
},
// 新增点检保养方案
createCheckPlan: async (data: DvCheckPlanVO) => {
return await request.post({ url: `/mes/dv/check-plan/create`, data })
},
// 修改点检保养方案
updateCheckPlan: async (data: DvCheckPlanVO) => {
return await request.put({ url: `/mes/dv/check-plan/update`, data })
},
// 启用点检保养方案
enableCheckPlan: async (id: number) => {
return await request.put({ url: `/mes/dv/check-plan/enable?id=` + id })
},
// 停用点检保养方案
disableCheckPlan: async (id: number) => {
return await request.put({ url: `/mes/dv/check-plan/disable?id=` + id })
},
// 删除点检保养方案
deleteCheckPlan: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-plan/delete?id=` + id })
},
// 导出点检保养方案 Excel
exportCheckPlan: async (params: any) => {
return await request.download({ url: `/mes/dv/check-plan/export-excel`, params })
}
}

View File

@ -0,0 +1,32 @@
import request from '@/config/axios'
// TODO @AI放到 machinery/index.ts
// MES 点检保养方案设备 VO
export interface DvCheckPlanMachineryVO {
id: number
planId: number // 方案编号
machineryId: number // 设备编号
machineryCode: string // 设备编码
machineryName: string // 设备名称
machineryBrand: string // 品牌
machinerySpec: string // 规格型号
remark: string // 备注
}
// MES 点检保养方案设备 API
export const DvCheckPlanMachineryApi = {
// 查询指定方案的设备列表
getListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/dv/check-plan-machinery/list-by-plan?planId=` + planId })
},
// 新增方案设备关联
create: async (data: DvCheckPlanMachineryVO) => {
return await request.post({ url: `/mes/dv/check-plan-machinery/create`, data })
},
// 删除方案设备关联
delete: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-plan-machinery/delete?id=` + id })
}
}

View File

@ -0,0 +1,31 @@
import request from '@/config/axios'
// MES 点检保养方案设备 VO
export interface DvCheckPlanMachineryVO {
id: number
planId: number // 方案编号
machineryId: number // 设备编号
machineryCode: string // 设备编码
machineryName: string // 设备名称
machineryBrand: string // 品牌
machinerySpecification: string // 规格型号
remark: string // 备注
}
// MES 点检保养方案设备 API
export const DvCheckPlanMachineryApi = {
// 查询指定方案的设备列表
getListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/dv/check-plan-machinery/list-by-plan?planId=` + planId })
},
// 新增方案设备关联
create: async (data: DvCheckPlanMachineryVO) => {
return await request.post({ url: `/mes/dv/check-plan-machinery/create`, data })
},
// 删除方案设备关联
delete: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-plan-machinery/delete?id=` + id })
}
}

View File

@ -0,0 +1,33 @@
import request from '@/config/axios'
// TODO @AI放到 subject/index.ts
// MES 点检保养方案项目 VO
export interface DvCheckPlanSubjectVO {
id: number
planId: number // 方案编号
subjectId: number // 项目编号
subjectCode: string // 项目编码
subjectName: string // 项目名称
subjectType: number // 项目类型
subjectContent: string // 项目内容
subjectStandard: string // 标准
remark: string // 备注
}
// MES 点检保养方案项目 API
export const DvCheckPlanSubjectApi = {
// 查询指定方案的项目列表
getListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/dv/check-plan-subject/list-by-plan?planId=` + planId })
},
// 新增方案项目关联
create: async (data: DvCheckPlanSubjectVO) => {
return await request.post({ url: `/mes/dv/check-plan-subject/create`, data })
},
// 删除方案项目关联
delete: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-plan-subject/delete?id=` + id })
}
}

View File

@ -0,0 +1,32 @@
import request from '@/config/axios'
// MES 点检保养方案项目 VO
export interface DvCheckPlanSubjectVO {
id: number
planId: number // 方案编号
subjectId: number // 项目编号
subjectCode: string // 项目编码
subjectName: string // 项目名称
subjectType: number // 项目类型
subjectContent: string // 项目内容
subjectStandard: string // 标准
remark: string // 备注
}
// MES 点检保养方案项目 API
export const DvCheckPlanSubjectApi = {
// 查询指定方案的项目列表
getListByPlan: async (planId: number) => {
return await request.get({ url: `/mes/dv/check-plan-subject/list-by-plan?planId=` + planId })
},
// 新增方案项目关联
create: async (data: DvCheckPlanSubjectVO) => {
return await request.post({ url: `/mes/dv/check-plan-subject/create`, data })
},
// 删除方案项目关联
delete: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-plan-subject/delete?id=` + id })
}
}

View File

@ -0,0 +1,56 @@
import request from '@/config/axios'
// MES 设备点检记录 VO
export interface DvCheckRecordVO {
id: number // 编号
planId: number // 点检计划编号
planName?: string // 计划名称
machineryId: number // 设备编号
machineryCode?: string // 设备编码
machineryName?: string // 设备名称
machineryBrand?: string // 品牌
machinerySpecification?: string // 规格型号
checkTime: Date // 点检时间
userId: number // 点检人编号
nickname?: string // 点检人名称
status: number // 状态
remark: string // 备注
}
// MES 设备点检记录 API
export const DvCheckRecordApi = {
// 查询设备点检记录分页
getCheckRecordPage: async (params: any) => {
return await request.get({ url: `/mes/dv/check-record/page`, params })
},
// 查询设备点检记录详情
getCheckRecord: async (id: number) => {
return await request.get({ url: `/mes/dv/check-record/get?id=` + id })
},
// 新增设备点检记录
createCheckRecord: async (data: DvCheckRecordVO) => {
return await request.post({ url: `/mes/dv/check-record/create`, data })
},
// 修改设备点检记录
updateCheckRecord: async (data: DvCheckRecordVO) => {
return await request.put({ url: `/mes/dv/check-record/update`, data })
},
// 提交设备点检记录
submitCheckRecord: async (id: number) => {
return await request.put({ url: `/mes/dv/check-record/submit?id=` + id })
},
// 删除设备点检记录
deleteCheckRecord: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-record/delete?id=` + id })
},
// 导出设备点检记录 Excel
exportCheckRecord: async (params: any) => {
return await request.download({ url: `/mes/dv/check-record/export-excel`, params })
}
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
// MES 设备点检记录明细 VO
export interface DvCheckRecordLineVO {
id: number // 编号
recordId: number // 点检记录编号
subjectId: number // 点检项目编号
subjectCode?: string // 项目编码
subjectName?: string // 项目名称
subjectContent?: string // 检查内容
subjectStandard?: string // 检查标准
checkStatus: number // 点检结果
checkResult?: string // 异常描述
remark: string // 备注
}
// MES 设备点检记录明细 API
export const DvCheckRecordLineApi = {
// 查询设备点检记录明细分页
getCheckRecordLinePage: async (params: any) => {
return await request.get({ url: `/mes/dv/check-record-line/page`, params })
},
// 查询设备点检记录明细详情
getCheckRecordLine: async (id: number) => {
return await request.get({ url: `/mes/dv/check-record-line/get?id=` + id })
},
// 新增设备点检记录明细
createCheckRecordLine: async (data: DvCheckRecordLineVO) => {
return await request.post({ url: `/mes/dv/check-record-line/create`, data })
},
// 修改设备点检记录明细
updateCheckRecordLine: async (data: DvCheckRecordLineVO) => {
return await request.put({ url: `/mes/dv/check-record-line/update`, data })
},
// 删除设备点检记录明细
deleteCheckRecordLine: async (id: number) => {
return await request.delete({ url: `/mes/dv/check-record-line/delete?id=` + id })
}
}

View File

@ -0,0 +1,56 @@
import request from '@/config/axios'
// MES 设备台账 VO
export interface DvMachineryVO {
id: number // 编号
code: string // 设备编码
name: string // 设备名称
brand: string // 品牌
specification: string // 规格型号
machineryTypeId: number // 设备类型编号
machineryTypeName: string // 设备类型名称
workshopId: number // 所属车间编号
workshopName: string // 所属车间名称
status: number // 设备状态
lastMaintenTime: Date // 最近保养时间
lastCheckTime: Date // 最近点检时间
remark: string // 备注
}
// MES 设备台账 API
export const DvMachineryApi = {
// 查询设备台账分页
getMachineryPage: async (params: any) => {
return await request.get({ url: `/mes/dv/machinery/page`, params })
},
// 查询设备台账详情
getMachinery: async (id: number) => {
return await request.get({ url: `/mes/dv/machinery/get?id=` + id })
},
// 新增设备台账
createMachinery: async (data: DvMachineryVO) => {
return await request.post({ url: `/mes/dv/machinery/create`, data })
},
// 修改设备台账
updateMachinery: async (data: DvMachineryVO) => {
return await request.put({ url: `/mes/dv/machinery/update`, data })
},
// 删除设备台账
deleteMachinery: async (id: number) => {
return await request.delete({ url: `/mes/dv/machinery/delete?id=` + id })
},
// 导出设备台账 Excel
exportMachinery: async (params: any) => {
return await request.download({ url: `/mes/dv/machinery/export-excel`, params })
},
// 下载设备导入模板
importTemplate: async () => {
return await request.download({ url: `/mes/dv/machinery/get-import-template` })
}
}

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// MES 设备类型 VO
export interface DvMachineryTypeVO {
id: number // 编号
parentId: number // 父类型编号
code: string // 类型编码
name: string // 类型名称
sort: number // 显示排序
status: number // 状态
remark: string // 备注
}
// MES 设备类型 API
export const DvMachineryTypeApi = {
// 查询设备类型列表
getMachineryTypeList: async (params?: any) => {
return await request.get({ url: `/mes/dv/machinery-type/list`, params })
},
// 查询设备类型精简列表
getMachineryTypeSimpleList: async () => {
return await request.get({ url: `/mes/dv/machinery-type/simple-list` })
},
// 查询设备类型详情
getMachineryType: async (id: number) => {
return await request.get({ url: `/mes/dv/machinery-type/get?id=` + id })
},
// 新增设备类型
createMachineryType: async (data: DvMachineryTypeVO) => {
return await request.post({ url: `/mes/dv/machinery-type/create`, data })
},
// 修改设备类型
updateMachineryType: async (data: DvMachineryTypeVO) => {
return await request.put({ url: `/mes/dv/machinery-type/update`, data })
},
// 删除设备类型
deleteMachineryType: async (id: number) => {
return await request.delete({ url: `/mes/dv/machinery-type/delete?id=` + id })
}
}

View File

@ -0,0 +1,56 @@
import request from '@/config/axios'
// MES 设备保养记录 VO
export interface DvMaintenRecordVO {
id: number // 编号
planId: number // 计划编号
planName?: string // 计划名称
machineryId: number // 设备编号
machineryCode?: string // 设备编码
machineryName?: string // 设备名称
machineryBrand?: string // 品牌
machinerySpecification?: string // 规格型号
maintenTime: Date // 保养时间
userId: number // 用户编号
nickname?: string // 保养人名称
status: number // 状态
remark: string // 备注
}
// MES 设备保养记录 API
export const DvMaintenRecordApi = {
// 查询设备保养记录分页
getMaintenRecordPage: async (params: any) => {
return await request.get({ url: `/mes/dv/mainten-record/page`, params })
},
// 查询设备保养记录详情
getMaintenRecord: async (id: number) => {
return await request.get({ url: `/mes/dv/mainten-record/get?id=` + id })
},
// 新增设备保养记录
createMaintenRecord: async (data: DvMaintenRecordVO) => {
return await request.post({ url: `/mes/dv/mainten-record/create`, data })
},
// 修改设备保养记录
updateMaintenRecord: async (data: DvMaintenRecordVO) => {
return await request.put({ url: `/mes/dv/mainten-record/update`, data })
},
// 提交设备保养记录
submitMaintenRecord: async (id: number) => {
return await request.put({ url: `/mes/dv/mainten-record/submit?id=` + id })
},
// 删除设备保养记录
deleteMaintenRecord: async (id: number) => {
return await request.delete({ url: `/mes/dv/mainten-record/delete?id=` + id })
},
// 导出设备保养记录 Excel
exportMaintenRecord: async (params: any) => {
return await request.download({ url: `/mes/dv/mainten-record/export-excel`, params })
}
}

View File

@ -0,0 +1,42 @@
import request from '@/config/axios'
// MES 设备保养记录明细 VO
export interface DvMaintenRecordLineVO {
id: number // 编号
recordId: number // 保养记录编号
subjectId: number // 项目编号
subjectName?: string // 项目名称
subjectContent?: string // 项目内容
subjectStandard?: string // 项目标准
status: number // 保养结果
result: string // 异常描述
remark: string // 备注
}
// MES 设备保养记录明细 API
export const DvMaintenRecordLineApi = {
// 查询设备保养记录明细分页
getMaintenRecordLinePage: async (params: any) => {
return await request.get({ url: `/mes/dv/mainten-record-line/page`, params })
},
// 查询设备保养记录明细详情
getMaintenRecordLine: async (id: number) => {
return await request.get({ url: `/mes/dv/mainten-record-line/get?id=` + id })
},
// 新增设备保养记录明细
createMaintenRecordLine: async (data: DvMaintenRecordLineVO) => {
return await request.post({ url: `/mes/dv/mainten-record-line/create`, data })
},
// 修改设备保养记录明细
updateMaintenRecordLine: async (data: DvMaintenRecordLineVO) => {
return await request.put({ url: `/mes/dv/mainten-record-line/update`, data })
},
// 删除设备保养记录明细
deleteMaintenRecordLine: async (id: number) => {
return await request.delete({ url: `/mes/dv/mainten-record-line/delete?id=` + id })
}
}

View File

@ -0,0 +1,74 @@
import request from '@/config/axios'
// MES 维修工单 VO
export interface DvRepairVO {
id: number // 编号
code: string // 维修工单编码
name: string // 维修工单名称
machineryId: number // 设备编号
machineryCode?: string // 设备编码
machineryName?: string // 设备名称
machineryBrand?: string // 品牌
machinerySpecification?: string // 规格型号
requireDate: Date // 报修日期
finishDate: Date // 维修完成日期
confirmDate: Date // 验收日期
result: number // 维修结果
acceptedUserId: number // 维修人用户编号
acceptedUserNickname?: string // 维修人名称
confirmUserId: number // 验收人用户编号
confirmUserNickname?: string // 验收人名称
sourceDocType: number // 来源单据类型
sourceDocId: number // 来源单据编号
sourceDocCode: string // 来源单据编码
status: number // 状态
remark: string // 备注
}
// MES 维修工单 API
export const DvRepairApi = {
// 查询维修工单分页
getRepairPage: async (params: any) => {
return await request.get({ url: `/mes/dv/repair/page`, params })
},
// 查询维修工单详情
getRepair: async (id: number) => {
return await request.get({ url: `/mes/dv/repair/get?id=` + id })
},
// 新增维修工单
createRepair: async (data: DvRepairVO) => {
return await request.post({ url: `/mes/dv/repair/create`, data })
},
// 修改维修工单
updateRepair: async (data: DvRepairVO) => {
return await request.put({ url: `/mes/dv/repair/update`, data })
},
// 删除维修工单
deleteRepair: async (id: number) => {
return await request.delete({ url: `/mes/dv/repair/delete?id=` + id })
},
// 导出维修工单 Excel
exportRepair: async (params: any) => {
return await request.download({ url: `/mes/dv/repair/export-excel`, params })
},
// 提交维修工单(草稿→维修中)
submitRepair: async (id: number) => {
return await request.put({ url: `/mes/dv/repair/submit?id=` + id })
},
// 确认维修完成(维修中→待验收)
confirmRepair: async (data: any) => {
return await request.put({ url: `/mes/dv/repair/confirm`, data })
},
// 完成验收(待验收→已确认)
finishRepair: async (id: number, result: number) => {
return await request.put({ url: `/mes/dv/repair/finish?id=` + id + `&result=` + result })
}
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
// MES 维修工单行 VO
export interface DvRepairLineVO {
id: number // 编号
repairId: number // 维修工单编号
subjectId: number // 项目编号
subjectName?: string // 项目名称
subjectContent?: string // 项目内容
subjectStandard?: string // 项目标准
malfunction: string // 故障描述
malfunctionUrl: string // 故障图片 URL
description: string // 维修描述
remark: string // 备注
}
// MES 维修工单行 API
export const DvRepairLineApi = {
// 查询维修工单行分页
getRepairLinePage: async (params: any) => {
return await request.get({ url: `/mes/dv/repair-line/page`, params })
},
// 查询维修工单行详情
getRepairLine: async (id: number) => {
return await request.get({ url: `/mes/dv/repair-line/get?id=` + id })
},
// 新增维修工单行
createRepairLine: async (data: DvRepairLineVO) => {
return await request.post({ url: `/mes/dv/repair-line/create`, data })
},
// 修改维修工单行
updateRepairLine: async (data: DvRepairLineVO) => {
return await request.put({ url: `/mes/dv/repair-line/update`, data })
},
// 删除维修工单行
deleteRepairLine: async (id: number) => {
return await request.delete({ url: `/mes/dv/repair-line/delete?id=` + id })
}
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
// MES 点检保养项目 VO
export interface DvSubjectVO {
id: number // 编号
code: string // 项目编码
name: string // 项目名称
type: number // 项目类型
content: string // 项目内容
standard: string // 标准
status: number // 状态
remark: string // 备注
}
// MES 点检保养项目 API
export const DvSubjectApi = {
// 查询点检保养项目分页
getSubjectPage: async (params: any) => {
return await request.get({ url: `/mes/dv/subject/page`, params })
},
// 查询点检保养项目详情
getSubject: async (id: number) => {
return await request.get({ url: `/mes/dv/subject/get?id=` + id })
},
// 新增点检保养项目
createSubject: async (data: DvSubjectVO) => {
return await request.post({ url: `/mes/dv/subject/create`, data })
},
// 修改点检保养项目
updateSubject: async (data: DvSubjectVO) => {
return await request.put({ url: `/mes/dv/subject/update`, data })
},
// 删除点检保养项目
deleteSubject: async (id: number) => {
return await request.delete({ url: `/mes/dv/subject/delete?id=` + id })
},
// 导出点检保养项目 Excel
exportSubject: async (params: any) => {
return await request.download({ url: `/mes/dv/subject/export-excel`, params })
}
}

51
src/api/mes/home/index.ts Normal file
View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 首页汇总统计 VO
export interface MesHomeSummaryVO {
workOrderActiveCount: number
workOrderPrepareCount: number
workOrderFinishedCount: number
todayOutput: number
yesterdayOutput: number
todayQualifiedQuantity: number
todayUnqualifiedQuantity: number
machineryTotal: number
machineryProducing: number
machineryStop: number
machineryMaintenance: number
andonActiveCount: number
repairActiveCount: number
}
// MES 工单状态分布 VO
export interface MesHomeWorkOrderStatusVO {
status: number
statusName: string
count: number
}
// MES 生产趋势 VO
export interface MesHomeProductionTrendVO {
date: string
quantity: number
qualifiedQuantity: number
unqualifiedQuantity: number
}
// MES 首页统计 API
export const MesHomeStatisticsApi = {
// 获得首页汇总统计
getHomeSummary: async (): Promise<MesHomeSummaryVO> => {
return await request.get({ url: `/mes/home-statistics/summary` })
},
// 获得工单状态分布
getWorkOrderStatusDistribution: async (): Promise<MesHomeWorkOrderStatusVO[]> => {
return await request.get({ url: `/mes/home-statistics/work-order-status` })
},
// 获得生产趋势
getProductionTrend: async (days?: number): Promise<MesHomeProductionTrendVO[]> => {
return await request.get({ url: `/mes/home-statistics/production-trend`, params: { days } })
}
}

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// MES 编码规则分段 VO
export interface AutoCodePartVO {
id: number // 分段编号
ruleId: number // 规则编号
sort: number // 排序
type: number // 分段类型
length: number // 长度
dateFormat: string // 日期格式
fixCharacter: string // 固定字符
serialStartNo: number // 流水号起始值
serialStep: number // 流水号步长
cycleFlag: boolean // 是否循环
cycleMethod: number // 循环方式
remark: string // 备注
}
// MES 编码规则分段 API
export const AutoCodePartApi = {
// 查询编码规则分段详情
getAutoCodePart: async (id: number) => {
return await request.get({ url: `/mes/md/auto-code-part/get?id=` + id })
},
// 查询编码规则分段列表
getAutoCodePartListByRuleId: async (ruleId: number) => {
return await request.get({ url: `/mes/md/auto-code-part/list-by-rule-id?ruleId=` + ruleId })
},
// 新增编码规则分段
createAutoCodePart: async (data: AutoCodePartVO) => {
return await request.post({ url: `/mes/md/auto-code-part/create`, data })
},
// 修改编码规则分段
updateAutoCodePart: async (data: AutoCodePartVO) => {
return await request.put({ url: `/mes/md/auto-code-part/update`, data })
},
// 删除编码规则分段
deleteAutoCodePart: async (id: number) => {
return await request.delete({ url: `/mes/md/auto-code-part/delete?id=` + id })
}
}

View File

@ -0,0 +1,12 @@
import request from '@/config/axios'
// MES 编码生成 API
export const AutoCodeRecordApi = {
// 生成编码
generateAutoCode: async (ruleCode: string, inputChar?: string) => {
return await request.post({
url: `/mes/md/auto-code-record/generate`,
data: { ruleCode, inputChar }
})
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// MES 编码规则 VO
export interface AutoCodeRuleVO {
id: number // 规则编号
code: string // 规则编码
name: string // 规则名称
description: string // 规则描述
maxLength: number // 最大长度
padded: boolean // 是否补齐
paddedChar: string // 补齐字符
paddedMethod: number // 补齐方式
status: number // 状态
remark: string // 备注
}
// MES 编码规则 API
export const AutoCodeRuleApi = {
// 查询编码规则分页
getAutoCodeRulePage: async (params: any) => {
return await request.get({ url: `/mes/md/auto-code-rule/page`, params })
},
// 查询编码规则详情
getAutoCodeRule: async (id: number) => {
return await request.get({ url: `/mes/md/auto-code-rule/get?id=` + id })
},
// 新增编码规则
createAutoCodeRule: async (data: AutoCodeRuleVO) => {
return await request.post({ url: `/mes/md/auto-code-rule/create`, data })
},
// 修改编码规则
updateAutoCodeRule: async (data: AutoCodeRuleVO) => {
return await request.put({ url: `/mes/md/auto-code-rule/update`, data })
},
// 删除编码规则
deleteAutoCodeRule: async (id: number) => {
return await request.delete({ url: `/mes/md/auto-code-rule/delete?id=` + id })
},
// 导出编码规则 Excel
exportAutoCodeRule: async (params: any) => {
return await request.download({ url: `/mes/md/auto-code-rule/export-excel`, params })
}
}

View File

@ -0,0 +1,64 @@
import request from '@/config/axios'
// MES 客户 VO
export interface MdClientVO {
id: number // 客户编号
code: string // 客户编码
name: string // 客户名称
nickname: string // 客户简称
englishName: string // 客户英文名称
description: string // 客户简介
logo: string // 客户LOGO地址
type: number // 客户类型
address: string // 客户地址
website: string // 客户官网地址
email: string // 客户邮箱地址
telephone: string // 客户电话
contact1Name: string // 联系人1
contact1Telephone: string // 联系人1-电话
contact1Email: string // 联系人1-邮箱
contact2Name: string // 联系人2
contact2Telephone: string // 联系人2-电话
contact2Email: string // 联系人2-邮箱
creditCode: string // 统一社会信用代码
status: number // 状态
remark: string // 备注
}
// MES 客户 API
export const MdClientApi = {
// 查询客户分页
getClientPage: async (params: any) => {
return await request.get({ url: `/mes/md-client/page`, params })
},
// 查询客户详情
getClient: async (id: number) => {
return await request.get({ url: `/mes/md-client/get?id=` + id })
},
// 新增客户
createClient: async (data: MdClientVO) => {
return await request.post({ url: `/mes/md-client/create`, data })
},
// 修改客户
updateClient: async (data: MdClientVO) => {
return await request.put({ url: `/mes/md-client/update`, data })
},
// 删除客户
deleteClient: async (id: number) => {
return await request.delete({ url: `/mes/md-client/delete?id=` + id })
},
// 导出客户 Excel
exportClient: async (params: any) => {
return await request.download({ url: `/mes/md-client/export-excel`, params })
},
// 下载客户导入模板
importTemplate: async () => {
return await request.download({ url: `/mes/md-client/get-import-template` })
}
}

View File

@ -0,0 +1,34 @@
import request from '@/config/axios'
// MES 物料批次属性配置 VO
export interface MdItemBatchConfigVO {
id?: number // 编号
itemId: number // 物料编号
produceDateFlag: boolean // 批次属性-生产日期
expireDateFlag: boolean // 批次属性-有效期
receiptDateFlag: boolean // 批次属性-入库日期
vendorFlag: boolean // 批次属性-供应商
clientFlag: boolean // 批次属性-客户
salesOrderCodeFlag: boolean // 批次属性-销售订单编号
purchaseOrderCodeFlag: boolean // 批次属性-采购订单编号
workorderFlag: boolean // 批次属性-生产工单
taskFlag: boolean // 批次属性-生产任务
workstationFlag: boolean // 批次属性-工作站
toolFlag: boolean // 批次属性-工具
moldFlag: boolean // 批次属性-模具
lotNumberFlag: boolean // 批次属性-生产批号
qualityStatusFlag: boolean // 批次属性-质量状态
}
// MES 物料批次属性配置 API
export const MdItemBatchConfigApi = {
// 根据物料编号获取批次属性配置
getBatchConfigByItemId: async (itemId: number) => {
return await request.get({ url: `/mes/md/item-batch-config/get-by-item-id?itemId=` + itemId })
},
// 保存批次属性配置(新增或更新)
saveBatchConfig: async (data: MdItemBatchConfigVO) => {
return await request.post({ url: `/mes/md/item-batch-config/save`, data })
}
}

View File

@ -0,0 +1,64 @@
import request from '@/config/axios'
// MES 物料产品 VO
export interface MdItemVO {
id: number // 物料编号
code: string // 物料编码
name: string // 物料名称
specification: string // 规格型号
unitMeasureId: number // 计量单位编号
unitMeasureName?: string // 计量单位名称
itemTypeId: number // 物料分类编号
itemTypeName?: string // 物料分类名称
itemOrProduct?: string // 物料/产品标识
status: number // 状态
safeStockFlag: boolean // 是否启用安全库存
minStock: number // 最低库存量
maxStock: number // 最高库存量
highValue: boolean // 是否高值物料
batchFlag: boolean // 是否启用批次管理
remark: string // 备注
}
// MES 物料产品 API
export const MdItemApi = {
// 查询物料产品分页
getItemPage: async (params: any) => {
return await request.get({ url: `/mes/md/item/page`, params })
},
// 查询物料产品详情
getItem: async (id: number) => {
return await request.get({ url: `/mes/md/item/get?id=` + id })
},
// 新增物料产品
createItem: async (data: MdItemVO) => {
return await request.post({ url: `/mes/md/item/create`, data })
},
// 修改物料产品
updateItem: async (data: MdItemVO) => {
return await request.put({ url: `/mes/md/item/update`, data })
},
// 修改物料产品状态
updateItemStatus: async (id: number, status: number) => {
return await request.put({ url: `/mes/md/item/update-status`, params: { id, status } })
},
// 删除物料产品
deleteItem: async (id: number) => {
return await request.delete({ url: `/mes/md/item/delete?id=` + id })
},
// 导出物料产品 Excel
exportItem: async (params: any) => {
return await request.download({ url: `/mes/md/item/export-excel`, params })
},
// 下载物料导入模板
importTemplate: async () => {
return await request.download({ url: `/mes/md/item/get-import-template` })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 产品BOM VO
export interface MdProductBomVO {
id?: number // BOM 编号
itemId: number // 物料产品 ID
bomItemId: number // BOM 物料 ID
quantity: number // 物料使用比例
status?: number // 是否启用
remark?: string // 备注
createTime?: Date // 创建时间
// ========== 关联展示字段 ==========
bomItemCode?: string // BOM 物料编码
bomItemName?: string // BOM 物料名称
bomItemSpecification?: string // BOM 物料规格
unitMeasureName?: string // 计量单位名称
itemOrProduct?: string // 产品物料标识
}
// MES 产品BOM API
export const MdProductBomApi = {
// 创建产品BOM
createProductBom: async (data: MdProductBomVO) => {
return await request.post({ url: `/mes/md/product-bom/create`, data })
},
// 更新产品BOM
updateProductBom: async (data: MdProductBomVO) => {
return await request.put({ url: `/mes/md/product-bom/update`, data })
},
// 删除产品BOM
deleteProductBom: async (id: number) => {
return await request.delete({ url: `/mes/md/product-bom/delete?id=` + id })
},
// 获得产品BOM
getProductBom: async (id: number) => {
return await request.get({ url: `/mes/md/product-bom/get?id=` + id })
},
// 获得产品BOM分页
getProductBomPage: async (params: any) => {
return await request.get({ url: `/mes/md/product-bom/page`, params })
},
// 根据物料产品编号获得产品BOM列表
getProductBomListByItemId: async (itemId: number) => {
return await request.get({ url: `/mes/md/product-bom/list-by-item-id?itemId=` + itemId })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// MES 产品SIP VO
export interface MdProductSipVO {
id?: number // SIP 编号
itemId: number // 物料产品 ID
sort: number // 排列顺序
processId?: number // 工序 ID
title: string // 标题
description?: string // 详细描述
url?: string // 图片地址
remark?: string // 备注
createTime?: Date // 创建时间
// ========== 关联展示字段 ==========
processCode?: string // 工序编号
processName?: string // 工序名称
}
// MES 产品SIP API
export const MdProductSipApi = {
// 创建产品SIP
createProductSip: async (data: MdProductSipVO) => {
return await request.post({ url: `/mes/md/product-sip/create`, data })
},
// 更新产品SIP
updateProductSip: async (data: MdProductSipVO) => {
return await request.put({ url: `/mes/md/product-sip/update`, data })
},
// 删除产品SIP
deleteProductSip: async (id: number) => {
return await request.delete({ url: `/mes/md/product-sip/delete?id=` + id })
},
// 获得产品SIP
getProductSip: async (id: number) => {
return await request.get({ url: `/mes/md/product-sip/get?id=` + id })
},
// 获得产品SIP分页
getProductSipPage: async (params: any) => {
return await request.get({ url: `/mes/md/product-sip/page`, params })
},
// 根据物料产品编号获得产品SIP列表
getProductSipListByItemId: async (itemId: number) => {
return await request.get({ url: `/mes/md/product-sip/list-by-item-id?itemId=` + itemId })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// MES 产品SOP VO
export interface MdProductSopVO {
id?: number // SOP 编号
itemId: number // 物料产品 ID
sort: number // 排列顺序
processId?: number // 工序 ID
title: string // 标题
description?: string // 详细描述
url?: string // 图片地址
remark?: string // 备注
createTime?: Date // 创建时间
// ========== 关联展示字段 ==========
processCode?: string // 工序编号
processName?: string // 工序名称
}
// MES 产品SOP API
export const MdProductSopApi = {
// 创建产品SOP
createProductSop: async (data: MdProductSopVO) => {
return await request.post({ url: `/mes/md/product-sop/create`, data })
},
// 更新产品SOP
updateProductSop: async (data: MdProductSopVO) => {
return await request.put({ url: `/mes/md/product-sop/update`, data })
},
// 删除产品SOP
deleteProductSop: async (id: number) => {
return await request.delete({ url: `/mes/md/product-sop/delete?id=` + id })
},
// 获得产品SOP
getProductSop: async (id: number) => {
return await request.get({ url: `/mes/md/product-sop/get?id=` + id })
},
// 获得产品SOP分页
getProductSopPage: async (params: any) => {
return await request.get({ url: `/mes/md/product-sop/page`, params })
},
// 根据物料产品编号获得产品SOP列表
getProductSopListByItemId: async (itemId: number) => {
return await request.get({ url: `/mes/md/product-sop/list-by-item-id?itemId=` + itemId })
}
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
// MES 物料产品分类 VO
export interface MdItemTypeVO {
id: number // 分类编号
parentId: number // 父分类编号
code: string // 分类编码
name: string // 分类名称
itemOrProduct: string // 物料/产品标识
sort: number // 显示排序
status: number // 状态
remark: string // 备注
}
// MES 物料产品分类 API
export const MdItemTypeApi = {
// 查询物料产品分类列表
getItemTypeList: async (params?: any) => {
return await request.get({ url: `/mes/md/item-type/list`, params })
},
// 查询物料产品分类精简列表
getItemTypeSimpleList: async () => {
return await request.get({ url: `/mes/md/item-type/simple-list` })
},
// 查询物料产品分类详情
getItemType: async (id: number) => {
return await request.get({ url: `/mes/md/item-type/get?id=` + id })
},
// 新增物料产品分类
createItemType: async (data: MdItemTypeVO) => {
return await request.post({ url: `/mes/md/item-type/create`, data })
},
// 修改物料产品分类
updateItemType: async (data: MdItemTypeVO) => {
return await request.put({ url: `/mes/md/item-type/update`, data })
},
// 删除物料产品分类
deleteItemType: async (id: number) => {
return await request.delete({ url: `/mes/md/item-type/delete?id=` + id })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 计量单位 VO
export interface MdUnitMeasureVO {
id: number // 单位编号
code: string // 单位编码
name: string // 单位名称
primaryFlag: boolean // 是否主单位
primaryId: number // 主单位编号
changeRate: number // 与主单位换算比例
status: number // 状态
remark: string // 备注
}
// MES 计量单位 API
export const MdUnitMeasureApi = {
// 查询计量单位分页
getUnitMeasurePage: async (params: any) => {
return await request.get({ url: `/mes/md/unit-measure/page`, params })
},
// 查询计量单位精简列表
getUnitMeasureSimpleList: async () => {
return await request.get({ url: `/mes/md/unit-measure/simple-list` })
},
// 查询计量单位详情
getUnitMeasure: async (id: number) => {
return await request.get({ url: `/mes/md/unit-measure/get?id=` + id })
},
// 新增计量单位
createUnitMeasure: async (data: MdUnitMeasureVO) => {
return await request.post({ url: `/mes/md/unit-measure/create`, data })
},
// 修改计量单位
updateUnitMeasure: async (data: MdUnitMeasureVO) => {
return await request.put({ url: `/mes/md/unit-measure/update`, data })
},
// 删除计量单位
deleteUnitMeasure: async (id: number) => {
return await request.delete({ url: `/mes/md/unit-measure/delete?id=` + id })
},
// 导出计量单位 Excel
exportUnitMeasure: async (params: any) => {
return await request.download({ url: `/mes/md/unit-measure/export-excel`, params })
}
}

65
src/api/mes/md/vendor/index.ts vendored Normal file
View File

@ -0,0 +1,65 @@
import request from '@/config/axios'
// MES 供应商 VO
export interface MdVendorVO {
id: number // 供应商编号
code: string // 供应商编码
name: string // 供应商名称
nickname: string // 供应商简称
englishName: string // 供应商英文名称
description: string // 供应商简介
logo: string // 供应商LOGO地址
level: string // 供应商等级
score: number // 供应商评分
address: string // 供应商地址
website: string // 供应商官网地址
email: string // 供应商邮箱地址
telephone: string // 供应商电话
contact1Name: string // 联系人1
contact1Telephone: string // 联系人1-电话
contact1Email: string // 联系人1-邮箱
contact2Name: string // 联系人2
contact2Telephone: string // 联系人2-电话
contact2Email: string // 联系人2-邮箱
creditCode: string // 统一社会信用代码
status: number // 状态
remark: string // 备注
}
// MES 供应商 API
export const MdVendorApi = {
// 查询供应商分页
getVendorPage: async (params: any) => {
return await request.get({ url: `/mes/md-vendor/page`, params })
},
// 查询供应商详情
getVendor: async (id: number) => {
return await request.get({ url: `/mes/md-vendor/get?id=` + id })
},
// 新增供应商
createVendor: async (data: MdVendorVO) => {
return await request.post({ url: `/mes/md-vendor/create`, data })
},
// 修改供应商
updateVendor: async (data: MdVendorVO) => {
return await request.put({ url: `/mes/md-vendor/update`, data })
},
// 删除供应商
deleteVendor: async (id: number) => {
return await request.delete({ url: `/mes/md-vendor/delete?id=` + id })
},
// 导出供应商 Excel
exportVendor: async (params: any) => {
return await request.download({ url: `/mes/md-vendor/export-excel`, params })
},
// 下载供应商导入模板
importTemplate: async () => {
return await request.download({ url: `/mes/md-vendor/get-import-template` })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 工作站 VO
export interface MdWorkstationVO {
id: number // 工作站编号
code: string // 工作站编码
name: string // 工作站名称
address: string // 工作站地点
workshopId: number // 所在车间 ID
workshopName: string // 所在车间名称
processId: number // 工序 ID
processName: string // 工序名称
warehouseId: number // 线边库 ID
locationId: number // 库区 ID
areaId: number // 库位 ID
status: number // 状态
remark: string // 备注
}
// MES 工作站 API
export const MdWorkstationApi = {
// 查询工作站分页
getWorkstationPage: async (params: any) => {
return await request.get({ url: `/mes/md-workstation/page`, params })
},
// 查询工作站详情
getWorkstation: async (id: number) => {
return await request.get({ url: `/mes/md-workstation/get?id=` + id })
},
// 新增工作站
createWorkstation: async (data: MdWorkstationVO) => {
return await request.post({ url: `/mes/md-workstation/create`, data })
},
// 修改工作站
updateWorkstation: async (data: MdWorkstationVO) => {
return await request.put({ url: `/mes/md-workstation/update`, data })
},
// 删除工作站
deleteWorkstation: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation/delete?id=` + id })
},
// 导出工作站 Excel
exportWorkstation: async (params: any) => {
return await request.download({ url: `/mes/md-workstation/export-excel`, params })
}
}

View File

@ -0,0 +1,32 @@
import request from '@/config/axios'
// MES 设备资源 VO
export interface MdWorkstationMachineVO {
id: number
workstationId: number // 工作站 ID
machineryId: number // 设备 ID
machineryName: string // 设备名称
machineryCode: string // 设备编码
quantity: number // 数量
remark: string // 备注
}
// MES 设备资源 API
export const MdWorkstationMachineApi = {
// 查询设备资源列表
getWorkstationMachineList: async (workstationId: number) => {
return await request.get({
url: `/mes/md-workstation-machine/list-by-workstation?workstationId=` + workstationId
})
},
// 新增设备资源
createWorkstationMachine: async (data: MdWorkstationMachineVO) => {
return await request.post({ url: `/mes/md-workstation-machine/create`, data })
},
// 删除设备资源
deleteWorkstationMachine: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-machine/delete?id=` + id })
}
}

View File

@ -0,0 +1,36 @@
import request from '@/config/axios'
// MES 工装夹具资源 VO
export interface MdWorkstationToolVO {
id: number
workstationId: number // 工作站 ID
toolTypeId: number // 工具类型 ID
toolTypeName: string // 工具类型名称
quantity: number // 数量
remark: string // 备注
}
// MES 工装夹具资源 API
export const MdWorkstationToolApi = {
// 查询工装夹具资源列表
getWorkstationToolList: async (workstationId: number) => {
return await request.get({
url: `/mes/md-workstation-tool/list-by-workstation?workstationId=` + workstationId
})
},
// 新增工装夹具资源
createWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.post({ url: `/mes/md-workstation-tool/create`, data })
},
// 修改工装夹具资源
updateWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.put({ url: `/mes/md-workstation-tool/update`, data })
},
// 删除工装夹具资源
deleteWorkstationTool: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-tool/delete?id=` + id })
}
}

View File

@ -0,0 +1,36 @@
import request from '@/config/axios'
// MES 人力资源 VO
export interface MdWorkstationWorkerVO {
id: number
workstationId: number // 工作站 ID
postId: number // 岗位 ID
postName: string // 岗位名称
quantity: number // 数量
remark: string // 备注
}
// MES 人力资源 API
export const MdWorkstationWorkerApi = {
// 查询人力资源列表
getWorkstationWorkerList: async (workstationId: number) => {
return await request.get({
url: `/mes/md-workstation-worker/list-by-workstation?workstationId=` + workstationId
})
},
// 新增人力资源
createWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.post({ url: `/mes/md-workstation-worker/create`, data })
},
// 修改人力资源
updateWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.put({ url: `/mes/md-workstation-worker/update`, data })
},
// 删除人力资源
deleteWorkstationWorker: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-worker/delete?id=` + id })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 车间 VO
export interface MdWorkshopVO {
id: number // 车间编号
code: string // 车间编码
name: string // 车间名称
area: number // 面积
chargeUserId: number // 负责人用户编号
chargeUserName: string // 负责人名称
status: number // 状态
remark: string // 备注
}
// MES 车间 API
export const MdWorkshopApi = {
// 查询车间分页
getWorkshopPage: async (params: any) => {
return await request.get({ url: `/mes/md-workshop/page`, params })
},
// 查询车间精简列表
getWorkshopSimpleList: async () => {
return await request.get({ url: `/mes/md-workshop/simple-list` })
},
// 查询车间详情
getWorkshop: async (id: number) => {
return await request.get({ url: `/mes/md-workshop/get?id=` + id })
},
// 新增车间
createWorkshop: async (data: MdWorkshopVO) => {
return await request.post({ url: `/mes/md-workshop/create`, data })
},
// 修改车间
updateWorkshop: async (data: MdWorkshopVO) => {
return await request.put({ url: `/mes/md-workshop/update`, data })
},
// 删除车间
deleteWorkshop: async (id: number) => {
return await request.delete({ url: `/mes/md-workshop/delete?id=` + id })
},
// 导出车间 Excel
exportWorkshop: async (params: any) => {
return await request.download({ url: `/mes/md-workshop/export-excel`, params })
}
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
// MES 安灯配置 VO
export interface ProAndonConfigVO {
id: number // 编号
reason: string // 呼叫原因
level: number // 级别
handlerRoleId: number // 处置人角色编号
handlerRoleName: string // 处置人角色名称
handlerUserId: number // 处置人编号
handlerUserNickname: string // 处置人昵称
remark: string // 备注
}
// MES 安灯配置 API
export const ProAndonConfigApi = {
// 查询安灯配置分页
getAndonConfigPage: async (params: any) => {
return await request.get({ url: `/mes/pro/andon-config/page`, params })
},
// 查询安灯配置列表
getAndonConfigList: async () => {
return await request.get({ url: `/mes/pro/andon-config/list` })
},
// 查询安灯配置详情
getAndonConfig: async (id: number) => {
return await request.get({ url: `/mes/pro/andon-config/get?id=` + id })
},
// 新增安灯配置
createAndonConfig: async (data: ProAndonConfigVO) => {
return await request.post({ url: `/mes/pro/andon-config/create`, data })
},
// 修改安灯配置
updateAndonConfig: async (data: ProAndonConfigVO) => {
return await request.put({ url: `/mes/pro/andon-config/update`, data })
},
// 删除安灯配置
deleteAndonConfig: async (id: number) => {
return await request.delete({ url: `/mes/pro/andon-config/delete?id=` + id })
}
}

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