# 会话激活页面 - 完整使用指南 ## 🎯 快速开始 ### 方法1:使用HTML工具(推荐) 1. **打开测试工具**: ```bash # 在浏览器中打开 yss-project/GET-CHAT-ACTIVATION-TEST-URL.html ``` 2. **点击按钮**: - 📡 **获取所有群聊地址** - 列出所有现有群聊 - ➕ **创建测试群聊** - 创建新的测试数据 - 💾 **配置本地存储** - 自动配置localStorage 3. **复制或打开URL**: - 点击"复制"按钮复制地址 - 点击"打开"按钮直接访问 ### 方法2:浏览器控制台 1. **启动项目**: ```bash cd yss-project npm start ``` 2. **打开浏览器** (http://localhost:4200) 3. **打开控制台** (F12),运行: ```javascript // 🚀 一键获取测试地址 (async()=>{ try { // 配置 const cid='cDL6R1hgSi'; const userid='woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg'; // 设置localStorage localStorage.setItem('company',cid); localStorage.setItem(`${cid}/USERINFO`,JSON.stringify({ userid:userid, errcode:0, errmsg:'ok', cid:cid })); console.log('✅ localStorage配置成功'); // 导入Parse const{FmodeParse}=await import('fmode-ng/parse'); const Parse=FmodeParse.with('nova'); // 查询群聊 const query=new Parse.Query('GroupChat'); query.equalTo('company',{__type:'Pointer',className:'Company',objectId:cid}); query.include('project'); query.descending('createdAt'); query.limit(10); const chats=await query.find(); if(chats.length>0){ console.log(`\n✅ 找到 ${chats.length} 个群聊:\n`); chats.forEach((chat,i)=>{ const url=`http://localhost:4200/wxwork/${cid}/chat-activation/${chat.id}`; const name=chat.get('name')||'未命名'; const project=chat.get('project'); const projectName=project?project.get('title'):'无项目'; console.log(`${i+1}. ${name}`); console.log(` 项目: ${projectName}`); console.log(` 🔗 ${url}\n`); }); // 复制第一个 const firstUrl=`http://localhost:4200/wxwork/${cid}/chat-activation/${chats[0].id}`; await navigator.clipboard.writeText(firstUrl); alert(`✅ 已复制第一个群聊地址!\n\n${chats[0].get('name')}\n\n${firstUrl}\n\n点击确定后自动打开...`); setTimeout(()=>window.open(firstUrl,'_blank'),500); }else{ // 创建测试群聊 console.log('⚠️ 未找到群聊,正在创建测试数据...'); const GroupChat=Parse.Object.extend('GroupChat'); const testChat=new GroupChat(); testChat.set('name','测试群聊 - '+new Date().toLocaleString('zh-CN')); testChat.set('company',{__type:'Pointer',className:'Company',objectId:cid}); testChat.set('chat_id','test_chat_'+Date.now()); testChat.set('member_list',[ {type:1,userid:'tech_001',name:'技术员-张三',avatar:''}, {type:2,userid:'customer_001',name:'客户-李四',avatar:''}, {type:2,userid:'customer_002',name:'客户-王五',avatar:''} ]); testChat.set('messages',[ {msgid:'msg_001',from:'customer_001',msgtime:Math.floor(Date.now()/1000)-3600,msgtype:'text',text:{content:'你好,我想咨询一下项目进度'}}, {msgid:'msg_002',from:'tech_001',msgtime:Math.floor(Date.now()/1000)-3500,msgtype:'text',text:{content:'您好,项目正在进行中,预计本周完成'}}, {msgid:'msg_003',from:'customer_001',msgtime:Math.floor(Date.now()/1000)-700,msgtype:'text',text:{content:'可以帮我修改一下需求吗?'}}, {msgid:'msg_004',from:'customer_002',msgtime:Math.floor(Date.now()/1000)-300,msgtype:'text',text:{content:'设计稿什么时候能出来?'}} ]); const saved=await testChat.save(); const url=`http://localhost:4200/wxwork/${cid}/chat-activation/${saved.id}`; console.log(`\n✅ 测试群聊创建成功!`); console.log(`群聊名称: ${saved.get('name')}`); console.log(`群聊ID: ${saved.id}`); console.log(`🔗 ${url}\n`); await navigator.clipboard.writeText(url); alert(`✅ 测试群聊已创建!地址已复制\n\n${url}\n\n点击确定后自动打开...`); setTimeout(()=>window.open(url,'_blank'),500); } }catch(e){ console.error('❌ 错误:',e); alert('❌ 发生错误: '+e.message+'\n\n请确保:\n1. 项目已启动\n2. Parse Server已连接'); } })(); ``` --- ## 📱 URL格式 ``` http://localhost:4200/wxwork/{cid}/chat-activation/{chatId} ``` **参数说明**: - `{cid}` - 公司ID:`cDL6R1hgSi` - `{chatId}` - 群聊ID:从Parse数据库`GroupChat`表的`objectId` **示例**: ``` http://localhost:4200/wxwork/cDL6R1hgSi/chat-activation/Abc123Xyz456 ``` --- ## 🔑 配置信息 ### 您的企业微信配置 ```javascript { "cid": "cDL6R1hgSi", "userid": "woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg", "errcode": 0, "errmsg": "ok" } ``` ### localStorage配置 组件会自动配置,也可以手动设置: ```javascript localStorage.setItem('company', 'cDL6R1hgSi'); localStorage.setItem('cDL6R1hgSi/USERINFO', JSON.stringify({ userid: 'woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg', errcode: 0, errmsg: 'ok', cid: 'cDL6R1hgSi' })); ``` --- ## 🎨 页面功能 ### 1. 群聊信息显示 - ✅ 群聊名称 - ✅ 成员数量 - ✅ 关联项目 ### 2. 入群方式(3种) - ✅ **二维码入群** - 显示群聊二维码 - ✅ **复制链接入群** - 一键复制入群链接 - ✅ **手动拉群** - 打开企微群聊 ### 3. 消息筛选(3个按钮) - ✅ **全部消息** - 显示所有消息 - ✅ **客户消息** - 只显示客户发送的消息 - ✅ **未回复** - 只显示超过10分钟未回复的消息 ### 4. AI辅助回复 - ✅ 点击"辅助回复"按钮 - ✅ AI分析消息内容和项目背景 - ✅ 生成3-5条专业回复建议 - ✅ 一键发送选中的回复 ### 5. 自动化文案 - ✅ 点击"发送群介绍"按钮 - ✅ 自动发送项目介绍(主管、技术、需求) - ✅ 记录发送状态 ### 6. 下拉刷新 - ✅ 下拉页面刷新数据 - ✅ 头部刷新按钮 - ✅ 流畅的刷新动画 ### 7. 手机端适配 - ✅ 响应式布局 - ✅ 触摸优化 - ✅ 完美适配各种屏幕 --- ## 🔧 数据结构 ### GroupChat表 ```typescript { objectId: string; // 群聊ID(用于URL) chat_id: string; // 企微群聊ID name: string; // 群聊名称 company: Pointer; // 公司指针 project: Pointer; // 项目指针 member_list: Array<{ type: 1 | 2; // 1=内部成员, 2=外部联系人 userid: string; // 用户ID name: string; // 姓名 avatar?: string; // 头像URL }>; messages: Array<{ msgid: string; // 消息ID from: string; // 发送者ID msgtime: number; // 时间戳(秒) msgtype: string; // 消息类型 text?: { content: string }; }>; joinUrl?: { join_url: string }; // 入群链接 joinQrcode?: { qr_code: string }; // 入群二维码 introSent?: boolean; // 是否已发送介绍 introSentAt?: Date; // 发送时间 } ``` --- ## 🚀 企业微信API对接 ### 已实现的API调用 ```typescript // 1. 获取群聊详情 const chatInfo = await wecorp.externalContact.groupChat.get(chatId); // 2. 获取入群方式 const config_id = await wecorp.externalContact.groupChat.addJoinWay({ scene: 1, // 1=群聊列表, 2=二维码 chat_id_list: [chatId] }); const joinWay = await wecorp.externalContact.groupChat.getJoinWay(config_id); // 3. 发送消息到群聊 await wecorp.message.send({ chatid: chatId, msgtype: 'text', text: { content: '消息内容' } }); ``` ### 数据同步流程 ``` 页面初始化 ↓ 从Parse加载缓存数据 ↓ 调用企微API同步最新信息 ↓ 更新成员列表和群聊名称 ↓ 保存到Parse数据库 ↓ 显示在页面 ``` --- ## 📊 测试数据 ### 创建测试群聊包含: - **3个成员**:1个技术员 + 2个客户 - **4条消息**:包含1条超时未回复的消息 - **完整数据**:member_list、messages、data字段 ### 消息示例: 1. **客户消息**(1小时前):"你好,我想咨询一下项目进度" 2. **技术回复**(58分钟前):"您好,项目正在进行中,预计本周完成" 3. **客户消息**(12分钟前,未回复):"可以帮我修改一下需求吗?" 4. **客户消息**(5分钟前):"设计稿什么时候能出来?" --- ## ⚠️ 常见问题 ### Q1: 页面显示"未找到群聊" **原因**: 1. chatId无效 2. 数据库中没有该群聊记录 3. company字段不匹配 **解决**: 1. 使用HTML工具或控制台脚本创建测试群聊 2. 检查URL中的chatId是否正确 3. 确认群聊的company字段为`cDL6R1hgSi` ### Q2: 企微SDK初始化失败 **原因**:缺少localStorage配置 **解决**: ```javascript localStorage.setItem('company', 'cDL6R1hgSi'); localStorage.setItem('cDL6R1hgSi/USERINFO', JSON.stringify({ userid: 'woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg', cid: 'cDL6R1hgSi' })); ``` ### Q3: 消息列表为空 **原因**: 1. GroupChat的messages字段为空 2. 筛选条件过滤了所有消息 **解决**: 1. 创建包含测试消息的群聊 2. 点击"全部消息"查看所有消息 3. 检查Parse数据库中的messages字段 ### Q4: AI回复生成失败 **原因**: 1. AI服务不可用 2. 网络问题 **解决**: 1. 查看控制台错误信息 2. 使用默认回复(关键词匹配) 3. 确认网络连接正常 ### Q5: 下拉刷新不工作 **原因**:ion-content配置问题 **解决**: 1. 确认使用了``包裹内容 2. 检查`handleRefresh`方法 3. 查看控制台错误 --- ## 📝 开发者参考 ### 关键文件 ``` src/modules/project/pages/chat-activation/ ├── chat-activation.component.ts # 组件逻辑 ├── chat-activation.component.html # 模板 └── chat-activation.component.scss # 样式 src/modules/project/services/ └── chat-message-ai.service.ts # AI服务 src/app/app.routes.ts # 路由配置 ``` ### 路由配置 ```typescript { path: 'wxwork/:cid', children: [ { path: 'chat-activation/:chatId', loadComponent: () => import('./chat-activation.component').then(m => m.ChatActivationComponent), title: '会话激活' } ] } ``` ### 核心方法 ```typescript // 初始化 ngOnInit() { this.cid = this.route.snapshot.paramMap.get('cid'); this.chatId = this.route.snapshot.paramMap.get('chatId'); await this.initializeSDK(); await this.loadData(); } // 加载数据 async loadData() { // 从Parse加载群聊 const gcQuery = new Parse.Query('GroupChat'); gcQuery.equalTo('objectId', this.chatId); gcQuery.include('project'); this.groupChat = await gcQuery.first(); // 同步企微信息 if (this.wecorp && this.groupChat) { const chatInfo = await this.wecorp.externalContact.groupChat.get( this.groupChat.get('chat_id') ); // 更新数据... } } // AI生成回复 async generateSuggestedReplies(message: ChatMessage) { const suggestions = await this.chatAI.generateReplySuggestions({ customerMessage: message.content, projectContext: {...}, chatHistory: [...] }); } // 下拉刷新 async handleRefresh(event: any) { await this.loadData(); event.target.complete(); } ``` --- ## 🎉 总结 ### ✅ 已完成功能 1. ✅ 企业微信完整对接(使用您的密钥) 2. ✅ AI辅助回复生成 3. ✅ 下拉刷新功能 4. ✅ 手机端完美适配 5. ✅ 消息筛选(全部/客户/未回复) 6. ✅ 三种入群方式 7. ✅ 自动化群介绍 8. ✅ 超时未回复提醒 ### 🚀 快速测试 1. 打开 `GET-CHAT-ACTIVATION-TEST-URL.html` 2. 点击"获取所有群聊地址"或"创建测试群聊" 3. 复制URL并访问 4. 测试所有功能 ### 📞 技术支持 如有问题,请提供: 1. 浏览器控制台完整错误信息 2. 使用的URL地址 3. Parse Server运行状态 4. localStorage数据截图 --- **所有功能已完成!现在可以开始测试了。** 🎉