wxwork-message-sending-fix-summary.md 7.9 KB

企业微信消息发送"一直显示发送中"问题修复总结

🐛 问题现象

用户点击"发送"按钮后,界面一直显示"发送中...",不会消失。

发送中状态


🔍 根本原因

问题1:错误被内部吞掉

文件: delivery-message.service.ts (line 257)

// ❌ 问题代码
catch (error) {
  console.error('❌ 发送消息到企业微信失败:', error);
  // 发送失败不影响主流程,只记录错误  ← ⚠️ 这行注释导致错误被吞掉
}

后果

  • 即使发送失败,方法也正常返回
  • 上层调用者不知道发生了错误
  • sendingMessage状态不会更新
  • UI一直显示"发送中..."

问题2:权限错误

{
  errmsg: 'fail_no permission',
  errMsg: 'sendChatMessage:no permission',
  errCode: -1
}

这是因为:

  1. WxworkSDKService未注册sendChatMessage权限
  2. 或JSSDK注册失败

✅ 修复方案

修复1:正确抛出错误

文件: delivery-message.service.ts

// ✅ 修复后
catch (error) {
  console.error('❌ 发送消息到企业微信失败:', error);
  // 🔥 修复:必须抛出错误,让上层知道发送失败
  throw error;
}

效果

  • ✅ 错误会传递到上层
  • stage-delivery.component.ts的catch块会捕获
  • sendingMessage状态会正确更新为false
  • ✅ UI停止显示"发送中..."

修复2:增强错误处理和日志

文件: stage-delivery.component.ts

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. 部署修复后的代码

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

  } catch (error) {
    console.error('❌ 发送消息到企业微信失败:', error);
-   // 发送失败不影响主流程,只记录错误
+   // 🔥 修复:必须抛出错误,让上层知道发送失败
+   throw error;
  }

2. stage-delivery.component.ts

新增日志

+ console.log('📤 [发送消息] 开始发送...');
+ console.log('📝 [发送消息] 内容:', content);
+ console.log('📸 [发送消息] 图片数量:', ...);
+ console.log('🏷️ [发送消息] 阶段:', ...);
+ console.log('✅ [发送消息] 发送成功');
+ console.log('🔄 [发送消息] 流程结束');

新增错误处理

+ catch (error: any) {
+   console.error('❌ [发送消息] 发送失败:', error);
+   console.error('❌ [发送消息] 错误详情:', {...});
+   
+   // 根据错误类型提供更具体的提示
+   let errorMessage = '❌ 发送失败,请重试';
+   if (error?.errMsg?.includes('no permission')) {
+     errorMessage = '❌ 企业微信权限不足\n...';
+   }
+   window?.fmode?.alert?.(errorMessage);
+ }

✅ 验证清单

部署后请验证:

  • 日志完整:控制台有完整的发送流程日志
  • 错误捕获:发送失败时有错误日志和提示
  • UI状态:"发送中..."会正确消失
  • 权限提示:权限错误时显示正确提示
  • 成功发送:权限正常时消息成功发送到企业微信

📚 相关文档


创建时间:2025-11-28
状态:✅ 修复完成,待部署测试
优先级:🔥 高(影响核心功能)