用户需求:在交付执行阶段实现企业微信端发送消息功能,支持纯文本消息和图片消息。
实现状态:✅ 已完成
原因:
<!-- ❌ 旧代码 -->
<button (click)="openMessageModal(space.id, type.id); ...">
发送消息
</button>
openMessageModal方法没有传递图片URLs参数,导致弹窗中imageUrls为空数组。
修复:
<!-- ✅ 新代码 -->
<button (click)="openMessageModalWithFiles(space.id, type.id); ...">
发送消息
</button>
新方法openMessageModalWithFiles会自动获取该阶段的所有图片文件。
原因:
// ❌ 旧代码
catch (error) {
console.error('❌ 发送消息到企业微信失败:', error);
// 发送失败不影响主流程,只记录错误 ← ⚠️ 错误被吞掉
}
修复:
// ✅ 新代码
catch (error) {
console.error('❌ 发送消息到企业微信失败:', error);
throw error; // 🔥 向上抛出错误
}
文件:stage-delivery-new.component.html
位置:第215行
- <button class="send-message-btn" (click)="openMessageModal(space.id, type.id); ...">
+ <button class="send-message-btn" (click)="openMessageModalWithFiles(space.id, type.id); ...">
发送消息
</button>
文件:stage-delivery.component.ts
位置:第3252-3266行
/**
* 打开消息发送弹窗(自动获取阶段所有图片)
*/
openMessageModalWithFiles(spaceId: string, stage: string): void {
// 获取该阶段的所有图片文件
const files = this.getProductDeliveryFiles(spaceId, stage);
const imageUrls = files
.filter(f => this.isImageFile(f.name))
.map(f => f.url);
console.log(`📤 [打开消息弹窗] 空间: ${spaceId}, 阶段: ${stage}, 图片数量: ${imageUrls.length}`);
// 调用原有方法,传入图片URLs
this.openMessageModal(spaceId, stage, imageUrls);
}
文件:delivery-message.service.ts
位置:第257-258行
} catch (error) {
console.error('❌ 发送消息到企业微信失败:', error);
- // 发送失败不影响主流程,只记录错误
+ // 🔥 修复:必须抛出错误,让上层知道发送失败
+ throw error;
}
文件:stage-delivery.component.ts
位置:第3284-3337行
改进:
cdr.markForCheck())用户点击"发送消息"
↓
openMessageModalWithFiles(spaceId, stage)
↓
获取该阶段所有文件
↓
过滤出图片文件 (isImageFile)
↓
提取图片URL数组
↓
openMessageModal(spaceId, stage, imageUrls)
↓
弹出消息窗口
- 显示空间和阶段信息
- 显示将要发送的图片数量
- 预设话术选择
- 自定义消息输入
- 图片预览(最多6张)
↓
用户选择话术或输入自定义消息
↓
点击"发送"按钮
↓
sendMessage()
↓
deliveryMessageService.createImageMessage(...)
↓
1️⃣ saveMessageToProject (保存到数据库)
2️⃣ sendToWxwork (发送到企业微信)
↓
wxworkService.initialize(cid, appId)
- 注册JSSDK
- 包含sendChatMessage权限
↓
发送文本消息 (如果有内容)
wxworkService.sendChatMessage({
msgtype: 'text',
text: { content: '...' }
})
↓
发送图片消息 (逐张发送)
wxworkService.sendChatMessage({
msgtype: 'news',
news: {
link: imageUrl,
title: '图片 1/3',
desc: '点击查看大图',
imgUrl: imageUrl
}
})
↓
延迟300ms (避免发送过快)
↓
继续发送下一张图片...
↓
✅ 所有消息发送完成
↓
关闭弹窗,显示成功提示
条件:有文本内容,没有图片
发送内容:
{
msgtype: 'text',
text: {
content: '老师,白模阶段已完成,请查看确认'
}
}
企业微信显示:
老师,白模阶段已完成,请查看确认
条件:有图片URL
发送内容:
{
msgtype: 'news',
news: {
link: 'https://file-cloud.fmode.cn/xxx/image.jpg',
title: '图片 1/3',
desc: '点击查看大图',
imgUrl: 'https://file-cloud.fmode.cn/xxx/image.jpg'
}
}
企业微信显示:
┌─────────────────────┐
│ [图片缩略图] │
│ │
│ 图片 1/3 │
│ 点击查看大图 │
└─────────────────────┘
条件:有文本内容,也有图片
发送顺序:
企业微信显示:
老师,白模阶段已完成,请查看确认
┌─────────────────────┐
│ [图片1缩略图] │
│ 图片 1/3 │
│ 点击查看大图 │
└─────────────────────┘
┌─────────────────────┐
│ [图片2缩略图] │
│ 图片 2/3 │
│ 点击查看大图 │
└─────────────────────┘
┌─────────────────────┐
│ [图片3缩略图] │
│ 图片 3/3 │
│ 点击查看大图 │
└─────────────────────┘
布局:
┌─────────────────────────────────────┐
│ 发送消息 × │
├─────────────────────────────────────┤
│ │
│ 空间:办公区 │
│ 阶段:白模 │
│ 图片:3 张 │
│ │
│ 选择话术(可选): │
│ [软装好了,准备渲染...] (已选) │
│ [老师,白模阶段已完成...] │
│ [硬装好了,待命] │
│ │
│ 自定义消息: │
│ ┌─────────────────────────────┐ │
│ │ 输入自定义消息,如不填写将 │ │
│ │ 使用选中的话术... │ │
│ │ │ │
│ └─────────────────────────────┘ │
│ 0/500 │
│ │
│ 将发送的图片: │
│ [图1] [图2] [图3] │
│ │
├─────────────────────────────────────┤
│ [取消] [发送] │
└─────────────────────────────────────┘
交互:
成功日志示例:
📤 [打开消息弹窗] 空间: prod_abc123, 阶段: white_model, 图片数量: 3
📤 [发送消息] 开始发送...
📝 [发送消息] 内容: 软装好了,准备渲染,有问题以此为准
📸 [发送消息] 图片数量: 3
🏷️ [发送消息] 阶段: white_model
📧 准备发送消息到企业微信...
✅ 文本消息已发送
✅ 图文消息 1/3 已发送
✅ 图文消息 2/3 已发送
✅ 图文消息 3/3 已发送
✅ 所有消息已发送到企业微信
✅ [发送消息] 发送成功
🔄 [发送消息] 流程结束
验证点:
# 构建项目
ng build yss-project --base-href=/dev/yss/
# 部署到OBS
.\deploy.ps1
| 功能 | 状态 | 说明 |
|---|---|---|
| 纯文本消息 | ✅ | 发送文字描述 |
| 图文消息 | ✅ | news类型,带预览和标题 |
| 文本+图片组合 | ✅ | 先发文本,再逐张发图片 |
| 预设话术 | ✅ | 4个阶段各3条话术 |
| 自定义消息 | ✅ | 500字限制 |
| 图片预览 | ✅ | 弹窗中显示最多6张 |
| 自动获取图片 | ✅ | 点击按钮自动获取阶段所有图片 |
| 错误处理 | ✅ | 权限错误、网络错误等 |
| UI状态管理 | ✅ | 发送中、成功、失败状态 |
| 降级方案 | ✅ | news失败降级为text |
| 权限注册 | ✅ | 自动注册sendChatMessage |
| 日志输出 | ✅ | 详细的发送流程日志 |
所有功能已完成,包括:
可以立即部署测试! 🚀
创建时间:2025-11-29
状态:✅ 功能完成
待办:部署测试