在确认需求阶段或交付执行阶段,将项目需求调查问卷链接发送到当前群聊,方便客户填写。
效果:群聊中显示卡片式问卷链接,带标题、描述和封面图
代码示例:
// 在stage-requirements.component.ts或stage-delivery.component.ts中
async sendSurveyLinkToChat(): Promise<void> {
try {
console.log('📤 准备发送问卷链接到群聊...');
// 1. 构建问卷链接
const surveyUrl = `https://app.fmode.cn/dev/yss/#/wxwork/${this.cid}/project/survey/project/${this.projectId}`;
console.log('🔗 问卷链接:', surveyUrl);
// 2. 发送图文消息
await this.wxworkSDKService.sendChatMessage({
msgtype: 'news',
news: {
link: surveyUrl,
title: '📋 项目需求调查问卷',
desc: '请填写项目需求,我们会根据您的需求进行设计',
imgUrl: 'https://file-cloud.fmode.cn/storage/survey-cover.jpg' // 封面图
}
});
console.log('✅ 问卷链接已发送到群聊');
window?.fmode?.toast?.success?.('问卷链接已发送到群聊');
} catch (error: any) {
console.error('❌ 发送问卷链接失败:', error);
let errorMessage = '发送失败,请重试';
if (error?.errMsg?.includes('no permission')) {
errorMessage = '权限不足,请联系管理员配置sendChatMessage权限';
} else if (error?.errMsg?.includes('not in session')) {
errorMessage = '请从群聊侧边栏打开应用';
}
window?.fmode?.alert?.(errorMessage);
}
}
效果:群聊中显示纯文本问卷链接
代码示例:
async sendSurveyLinkAsText(): Promise<void> {
try {
const surveyUrl = `https://app.fmode.cn/dev/yss/#/wxwork/${this.cid}/project/survey/project/${this.projectId}`;
await this.wxworkSDKService.sendChatMessage({
msgtype: 'text',
text: {
content: `📋 项目需求调查问卷\n\n请点击以下链接填写项目需求:\n${surveyUrl}\n\n我们会根据您的需求进行设计,感谢配合!`
}
});
console.log('✅ 问卷链接已发送');
window?.fmode?.toast?.success?.('问卷链接已发送');
} catch (error) {
console.error('❌ 发送失败:', error);
window?.fmode?.alert?.('发送失败,请重试');
}
}
文件:stage-requirements.component.ts
import { WxworkSDKService } from '../../../services/wxwork-sdk.service';
constructor(
// ... 其他服务
private wxworkSDKService: WxworkSDKService
) {}
async ngOnInit() {
// 获取路由参数
this.cid = this.route.parent?.snapshot.paramMap.get('cid') || '';
this.projectId = this.route.parent?.snapshot.paramMap.get('projectId') || '';
// 🔥 初始化企业微信SDK
if (this.cid) {
console.log('🔐 初始化企业微信SDK...');
try {
await this.wxworkSDKService.initialize(this.cid, 'project');
console.log('✅ 企业微信SDK初始化成功');
} catch (error) {
console.error('❌ 企业微信SDK初始化失败:', error);
}
}
// ... 其他初始化
}
/**
* 发送问卷链接到群聊
*/
async sendSurveyLinkToChat(): Promise<void> {
if (!this.cid || !this.projectId) {
window?.fmode?.alert?.('缺少必要参数,无法发送问卷链接');
return;
}
try {
console.log('📤 准备发送问卷链接...');
console.log(' CID:', this.cid);
console.log(' ProjectID:', this.projectId);
// 构建问卷URL
const surveyUrl = `https://app.fmode.cn/dev/yss/#/wxwork/${this.cid}/project/survey/project/${this.projectId}`;
console.log('🔗 问卷URL:', surveyUrl);
// 发送图文消息
await this.wxworkSDKService.sendChatMessage({
msgtype: 'news',
news: {
link: surveyUrl,
title: '📋 项目需求调查问卷',
desc: '请填写项目需求,我们会根据您的需求进行设计。点击填写问卷 →',
imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
}
});
console.log('✅ 问卷链接发送成功');
window?.fmode?.toast?.success?.('✅ 问卷链接已发送到群聊');
} catch (error: any) {
console.error('❌ 发送问卷链接失败:', error);
console.error(' 错误消息:', error?.errMsg);
console.error(' 错误代码:', error?.errCode);
// 友好的错误提示
let errorMessage = '发送失败,请重试';
if (error?.errMsg?.includes('no permission')) {
errorMessage = '❌ 权限不足\n请联系管理员在企微后台配置sendChatMessage权限';
} else if (error?.errMsg?.includes('not in session')) {
errorMessage = '❌ 请从群聊侧边栏打开应用\n不能从工作台打开';
} else if (error?.message === 'JSSDK注册失败') {
errorMessage = '❌ JSSDK注册失败\n请从群聊侧边栏重新打开应用';
}
window?.fmode?.alert?.(errorMessage);
}
}
文件:stage-requirements.component.html
<!-- 在合适的位置添加发送问卷按钮 -->
<div class="survey-section">
<h3>需求调研</h3>
<p>请客户填写需求调查问卷</p>
<button class="btn-send-survey" (click)="sendSurveyLinkToChat()">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
</svg>
<span>发送问卷链接到群聊</span>
</button>
</div>
文件:stage-requirements.component.scss
.survey-section {
padding: 20px;
background: #f9fafb;
border-radius: 8px;
margin: 20px 0;
h3 {
margin: 0 0 8px 0;
font-size: 16px;
font-weight: 600;
color: #1f2937;
}
p {
margin: 0 0 16px 0;
font-size: 14px;
color: #6b7280;
}
.btn-send-survey {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
background: #4f46e5;
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
&:hover {
background: #4338ca;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(79, 70, 229, 0.3);
}
&:active {
transform: translateY(0);
}
svg {
flex-shrink: 0;
}
}
}
群聊中显示:
┌──────────────────────────────────┐
│ 📋 项目需求调查问卷 │
│ │
│ [封面图] │
│ │
│ 请填写项目需求,我们会根据您 │
│ 的需求进行设计。点击填写问卷 → │
└──────────────────────────────────┘
✅ 优点:视觉效果好,带封面图,点击跳转
群聊中显示:
📋 项目需求调查问卷
请点击以下链接填写项目需求:
https://app.fmode.cn/dev/yss/#/wxwork/...
我们会根据您的需求进行设计,感谢配合!
✅ 优点:简单直接,兼容性好
群聊 → 右上角"..." → 应用 → 你的应用
📤 准备发送问卷链接...
CID: cDL6R1hgSi
ProjectID: xxx
🔗 问卷URL: https://...
🔍 [sendChatMessage] ========== 开始发送消息 ==========
🔍 [sendChatMessage] 消息类型: news
✅ [sendChatMessage] 消息发送成功!
✅ 问卷链接发送成功
检查清单:
原因:问卷URL格式错误或域名未配置
检查:
// URL格式应该是:
https://app.fmode.cn/dev/yss/#/wxwork/{cid}/project/survey/project/{projectId}
// 确保cid和projectId都有值
console.log('CID:', this.cid);
console.log('ProjectID:', this.projectId);
解决:
原因:imgUrl路径错误或图片不可访问
解决:
// 确保使用可公开访问的图片URL
imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
// 或者使用项目中的图片
imgUrl: 'https://app.fmode.cn/dev/yss/assets/survey-cover.png'
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { WxworkSDKService } from '../../../services/wxwork-sdk.service';
@Component({
selector: 'app-stage-requirements',
templateUrl: './stage-requirements.component.html',
styleUrls: ['./stage-requirements.component.scss']
})
export class StageRequirementsComponent implements OnInit {
cid: string = '';
projectId: string = '';
constructor(
private route: ActivatedRoute,
private wxworkSDKService: WxworkSDKService
) {}
async ngOnInit() {
// 获取路由参数
this.cid = this.route.parent?.snapshot.paramMap.get('cid') || '';
this.projectId = this.route.parent?.snapshot.paramMap.get('projectId') || '';
// 初始化企业微信SDK
if (this.cid) {
console.log('🔐 初始化企业微信SDK...');
try {
await this.wxworkSDKService.initialize(this.cid, 'project');
console.log('✅ 企业微信SDK初始化成功');
} catch (error) {
console.error('❌ 企业微信SDK初始化失败:', error);
}
}
// ... 其他初始化
}
/**
* 发送问卷链接到群聊
*/
async sendSurveyLinkToChat(): Promise<void> {
if (!this.cid || !this.projectId) {
window?.fmode?.alert?.('缺少必要参数,无法发送问卷链接');
return;
}
try {
console.log('📤 准备发送问卷链接...');
// 构建问卷URL
const surveyUrl = `https://app.fmode.cn/dev/yss/#/wxwork/${this.cid}/project/survey/project/${this.projectId}`;
console.log('🔗 问卷URL:', surveyUrl);
// 发送图文消息
await this.wxworkSDKService.sendChatMessage({
msgtype: 'news',
news: {
link: surveyUrl,
title: '📋 项目需求调查问卷',
desc: '请填写项目需求,我们会根据您的需求进行设计。点击填写问卷 →',
imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
}
});
console.log('✅ 问卷链接发送成功');
window?.fmode?.toast?.success?.('✅ 问卷链接已发送到群聊');
} catch (error: any) {
console.error('❌ 发送问卷链接失败:', error);
let errorMessage = '发送失败,请重试';
if (error?.errMsg?.includes('no permission')) {
errorMessage = '❌ 权限不足\n请联系管理员配置sendChatMessage权限';
} else if (error?.errMsg?.includes('not in session')) {
errorMessage = '❌ 请从群聊侧边栏打开应用';
} else if (error?.message === 'JSSDK注册失败') {
errorMessage = '❌ JSSDK注册失败\n请从群聊侧边栏重新打开应用';
}
window?.fmode?.alert?.(errorMessage);
}
}
}
文档创建时间:2025-11-30 13:50
适用阶段:确认需求、交付执行
关键方法:wxworkSDKService.sendChatMessage()
消息类型:news(图文)或 text(纯文本)