# 企业微信消息发送"一直显示发送中"问题修复总结 ## 🐛 问题现象 用户点击"发送"按钮后,界面一直显示"发送中...",不会消失。 ![发送中状态](../screenshots/sending-loading.png) --- ## 🔍 根本原因 ### 问题1:错误被内部吞掉 **文件**: `delivery-message.service.ts` (line 257) ```typescript // ❌ 问题代码 catch (error) { console.error('❌ 发送消息到企业微信失败:', error); // 发送失败不影响主流程,只记录错误 ← ⚠️ 这行注释导致错误被吞掉 } ``` **后果**: - 即使发送失败,方法也正常返回 - 上层调用者不知道发生了错误 - `sendingMessage`状态不会更新 - UI一直显示"发送中..." ### 问题2:权限错误 ```javascript { errmsg: 'fail_no permission', errMsg: 'sendChatMessage:no permission', errCode: -1 } ``` 这是因为: 1. `WxworkSDKService`未注册`sendChatMessage`权限 2. 或JSSDK注册失败 --- ## ✅ 修复方案 ### 修复1:正确抛出错误 **文件**: `delivery-message.service.ts` ```typescript // ✅ 修复后 catch (error) { console.error('❌ 发送消息到企业微信失败:', error); // 🔥 修复:必须抛出错误,让上层知道发送失败 throw error; } ``` **效果**: - ✅ 错误会传递到上层 - ✅ `stage-delivery.component.ts`的catch块会捕获 - ✅ `sendingMessage`状态会正确更新为`false` - ✅ UI停止显示"发送中..." ### 修复2:增强错误处理和日志 **文件**: `stage-delivery.component.ts` ```typescript try { console.log('📤 [发送消息] 开始发送...'); this.sendingMessage = true; this.cdr.markForCheck(); console.log('📝 [发送消息] 内容:', content); console.log('📸 [发送消息] 图片数量:', this.messageModalConfig.imageUrls.length); console.log('🏷️ [发送消息] 阶段:', this.messageModalConfig.stage); // ... 发送逻辑 ... console.log('✅ [发送消息] 发送成功'); window?.fmode?.toast?.success?.('✅ 消息发送成功!'); this.closeMessageModal(); } catch (error: any) { console.error('❌ [发送消息] 发送失败:', error); console.error('❌ [发送消息] 错误详情:', { message: error?.message, errMsg: error?.errMsg, errmsg: error?.errmsg, errCode: error?.errCode }); // 🔥 根据错误类型提供更具体的提示 let errorMessage = '❌ 发送失败,请重试'; if (error?.errMsg?.includes('no permission') || error?.errmsg?.includes('no permission')) { errorMessage = '❌ 企业微信权限不足\n请联系管理员配置sendChatMessage权限'; } else if (error?.message) { errorMessage = `❌ 发送失败: ${error.message}`; } window?.fmode?.alert?.(errorMessage); } finally { console.log('🔄 [发送消息] 流程结束'); this.sendingMessage = false; this.cdr.markForCheck(); } ``` **改进**: - ✅ 详细的日志记录(开始、内容、成功、失败、结束) - ✅ 错误类型识别(权限错误 vs 其他错误) - ✅ 更具体的错误提示 - ✅ 强制UI更新(`cdr.markForCheck()`) --- ## 📊 修复前后对比 ### ❌ 修复前 ``` 用户点击"发送" ↓ sendMessage()开始 ↓ sendingMessage = true ↓ 调用deliveryMessageService ↓ sendToWxwork()发送 ↓ 权限错误(no permission) ↓ 错误被内部catch吞掉 ↓ 方法正常返回 ↓ 上层以为成功 ↓ ❌ sendingMessage一直是true ↓ ❌ UI永远显示"发送中..." ``` ### ✅ 修复后 ``` 用户点击"发送" ↓ 📤 [发送消息] 开始发送... sendingMessage = true ↓ 📝 [发送消息] 内容: ... 📸 [发送消息] 图片数量: 3 ↓ 调用deliveryMessageService ↓ sendToWxwork()发送 ↓ 权限错误(no permission) ↓ ❌ [发送消息] 发送失败: ... 错误被抛出(throw error) ↓ 上层catch捕获 ↓ 显示错误提示:"企业微信权限不足" ↓ finally块执行 ↓ 🔄 [发送消息] 流程结束 sendingMessage = false ↓ ✅ UI停止显示"发送中..." ``` --- ## 🧪 测试步骤 ### 1. 部署修复后的代码 ```bash ng build yss-project --base-href=/dev/yss/ .\deploy.ps1 ``` ### 2. 打开浏览器控制台 ### 3. 测试场景1:权限错误 **操作**: 1. 上传图片并确认清单 2. 弹出"发送消息"窗口 3. 点击"发送" **预期日志**(如果有权限错误): ``` 📤 [发送消息] 开始发送... 📝 [发送消息] 内容: 老师我这里硬装模型做好了... 📸 [发送消息] 图片数量: 3 🏷️ [发送消息] 阶段: white_model 📧 准备发送消息到企业微信... CID: cDL6R1hgSi ❌ 消息发送失败: {errmsg: 'fail_no permission', ...} ❌ 发送消息到企业微信失败: ... ❌ [发送消息] 发送失败: ... ❌ [发送消息] 错误详情: {...} 🔄 [发送消息] 流程结束 ``` **预期UI**: - ❌ 弹窗提示:"企业微信权限不足,请联系管理员配置sendChatMessage权限" - ✅ "发送中..."消失 - ✅ 按钮恢复可点击 ### 4. 测试场景2:发送成功 **操作**:同上 **预期日志**(权限正常): ``` 📤 [发送消息] 开始发送... 📝 [发送消息] 内容: 老师我这里硬装模型做好了... 📸 [发送消息] 图片数量: 3 🏷️ [发送消息] 阶段: white_model 📧 准备发送消息到企业微信... CID: cDL6R1hgSi 文本: 老师我这里硬装模型做好了... 图片数量: 3 ✅ 文本消息已发送 ✅ 图文消息 1/3 已发送 ✅ 图文消息 2/3 已发送 ✅ 图文消息 3/3 已发送 ✅ 所有消息已发送到企业微信 ✅ [发送消息] 发送成功 🔄 [发送消息] 流程结束 ``` **预期UI**: - ✅ Toast提示:"✅ 消息发送成功!" - ✅ 弹窗自动关闭 - ✅ 企业微信聊天窗口收到消息 --- ## 📋 修改文件清单 | 文件 | 修改内容 | 行数 | |------|---------|------| | `delivery-message.service.ts` | 修改错误处理,正确抛出错误 | 257-258 | | `stage-delivery.component.ts` | 增强日志和错误提示 | 3284-3337 | --- ## 🎯 关键修改点 ### 1. delivery-message.service.ts ```diff } catch (error) { console.error('❌ 发送消息到企业微信失败:', error); - // 发送失败不影响主流程,只记录错误 + // 🔥 修复:必须抛出错误,让上层知道发送失败 + throw error; } ``` ### 2. stage-delivery.component.ts **新增日志**: ```typescript + console.log('📤 [发送消息] 开始发送...'); + console.log('📝 [发送消息] 内容:', content); + console.log('📸 [发送消息] 图片数量:', ...); + console.log('🏷️ [发送消息] 阶段:', ...); + console.log('✅ [发送消息] 发送成功'); + console.log('🔄 [发送消息] 流程结束'); ``` **新增错误处理**: ```typescript + catch (error: any) { + console.error('❌ [发送消息] 发送失败:', error); + console.error('❌ [发送消息] 错误详情:', {...}); + + // 根据错误类型提供更具体的提示 + let errorMessage = '❌ 发送失败,请重试'; + if (error?.errMsg?.includes('no permission')) { + errorMessage = '❌ 企业微信权限不足\n...'; + } + window?.fmode?.alert?.(errorMessage); + } ``` --- ## ✅ 验证清单 部署后请验证: - [ ] **日志完整**:控制台有完整的发送流程日志 - [ ] **错误捕获**:发送失败时有错误日志和提示 - [ ] **UI状态**:"发送中..."会正确消失 - [ ] **权限提示**:权限错误时显示正确提示 - [ ] **成功发送**:权限正常时消息成功发送到企业微信 --- ## 📚 相关文档 - [企业微信消息发送功能分析](./wxwork-message-sending-analysis.md) - [企业微信消息发送权限修复](./wxwork-message-fix.md) - [移动端适配与企业微信功能完整修复](./mobile-and-wxwork-fixes-complete.md) --- **创建时间**:2025-11-28 **状态**:✅ 修复完成,待部署测试 **优先级**:🔥 高(影响核心功能)