Commit Graph

4535 Commits (f86cd30af4c7cfcd43ee5b43c2faee29f3e97345)

Author SHA1 Message Date
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 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
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 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 d6f8fb7b55 ♻️ refactor(mes): 修正质检缺陷记录删除权限 2026-04-12 20:38:01 +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
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