|  | @@ -996,7 +996,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      if (phase === 'soft') markSynced(this.softDecorImages);
 | 
	
		
			
				|  |  |      if (phase === 'render') markSynced(this.renderLargeImages);
 | 
	
		
			
				|  |  |      if (phase === 'postProcess') markSynced(this.postProcessImages);
 | 
	
		
			
				|  |  | -    alert('已同步该阶段的图片信息(模拟)');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('已同步该阶段的图片信息(模拟)');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    reviewImage(imageId: string, phase: 'white' | 'soft' | 'render' | 'postProcess', status: 'approved' | 'rejected'): void {
 | 
	
	
		
			
				|  | @@ -1294,7 +1294,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    // 整理项目详情
 | 
	
		
			
				|  |  |    organizeProject(): void {
 | 
	
		
			
				|  |  |      // 模拟整理项目逻辑
 | 
	
		
			
				|  |  | -    alert('项目详情已整理');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('项目详情已整理');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // 检查当前阶段是否显示特定卡片
 | 
	
	
		
			
				|  | @@ -1570,7 +1570,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        if (/\.(jpg|jpeg|png)$/i.test(file.name)) {
 | 
	
		
			
				|  |  |          const ok = await this.validateImage4K(file).catch(() => false);
 | 
	
		
			
				|  |  |          if (!ok) {
 | 
	
		
			
				|  |  | -          alert(`图片不符合4K标准(最大边需≥4000像素):${file.name}`);
 | 
	
		
			
				|  |  | +         window?.fmode?.alert(`图片不符合4K标准(最大边需≥4000像素):${file.name}`);
 | 
	
		
			
				|  |  |            continue;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -1649,12 +1649,12 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (hoursRemaining <= 3 && hoursRemaining > 0) {
 | 
	
		
			
				|  |  |        // 弹窗预警
 | 
	
		
			
				|  |  | -      alert('渲染进度预警:交付前3小时,请关注渲染进度');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('渲染进度预警:交付前3小时,请关注渲染进度');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (hoursRemaining <= 1 && hoursRemaining > 0) {
 | 
	
		
			
				|  |  |        // 更严重的预警
 | 
	
		
			
				|  |  | -      alert('渲染进度严重预警:交付前1小时,渲染可能无法按时完成!');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('渲染进度严重预警:交付前1小时,渲染可能无法按时完成!');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1697,7 +1697,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          clearInterval(this.countdownInterval);
 | 
	
		
			
				|  |  |          // 超时提醒
 | 
	
		
			
				|  |  | -        alert('客户反馈已超过1小时未响应,请立即处理!');
 | 
	
		
			
				|  |  | +       window?.fmode?.alert('客户反馈已超过1小时未响应,请立即处理!');
 | 
	
		
			
				|  |  |          this.notifyTeamLeader('feedback-overdue');
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }, 1000);
 | 
	
	
		
			
				|  | @@ -1724,14 +1724,14 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    initiateDesignerChange(reason: string): void {
 | 
	
		
			
				|  |  |      // 实际应用中应调用API发起变更
 | 
	
		
			
				|  |  |      console.log(`发起设计师变更,原因:${reason}`);
 | 
	
		
			
				|  |  | -    alert('已发起设计师变更申请,请等待新设计师承接');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('已发起设计师变更申请,请等待新设计师承接');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 确认承接变更项目
 | 
	
		
			
				|  |  |    acceptDesignerChange(changeId: string): void {
 | 
	
		
			
				|  |  |      // 实际应用中应调用API确认承接
 | 
	
		
			
				|  |  |      console.log(`确认承接设计师变更:${changeId}`);
 | 
	
		
			
				|  |  | -    alert('已确认承接项目,系统已记录时间戳和责任人');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('已确认承接项目,系统已记录时间戳和责任人');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 格式化倒计时显示
 | 
	
	
		
			
				|  | @@ -1747,7 +1747,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    // 提交异常反馈
 | 
	
		
			
				|  |  |    submitExceptionFeedback(): void {
 | 
	
		
			
				|  |  |      if (!this.exceptionDescription.trim() || this.isSubmittingFeedback) {
 | 
	
		
			
				|  |  | -      alert('请填写异常类型和描述');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('请填写异常类型和描述');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1775,7 +1775,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        this.showExceptionForm = false;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 显示成功消息
 | 
	
		
			
				|  |  | -      alert('异常反馈已提交,技术支持将尽快处理');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('异常反馈已提交,技术支持将尽快处理');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        this.isSubmittingFeedback = false;
 | 
	
		
			
				|  |  |      }, 1000);
 | 
	
	
		
			
				|  | @@ -1807,7 +1807,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 联系组长
 | 
	
		
			
				|  |  |    contactTeamLeader() {
 | 
	
		
			
				|  |  | -    alert(`已联系${this.project?.assigneeName || '项目组长'}`);
 | 
	
		
			
				|  |  | +   window?.fmode?.alert(`已联系${this.project?.assigneeName || '项目组长'}`);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 处理渲染超时预警
 | 
	
	
		
			
				|  | @@ -1927,7 +1927,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    previewImage(img: any): void {
 | 
	
		
			
				|  |  |      const isRenderLarge = !!this.renderLargeImages.find(i => i.id === img?.id);
 | 
	
		
			
				|  |  |      if (isRenderLarge && img?.locked) {
 | 
	
		
			
				|  |  | -      alert('该渲染大图已加锁,需完成尾款结算并上传/识别支付凭证后方可预览。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('该渲染大图已加锁,需完成尾款结算并上传/识别支付凭证后方可预览。');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      this.previewImageData = img;
 | 
	
	
		
			
				|  | @@ -1942,7 +1942,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    downloadImage(img: any): void {
 | 
	
		
			
				|  |  |      const isRenderLarge = !!this.renderLargeImages.find(i => i.id === img?.id);
 | 
	
		
			
				|  |  |      if (isRenderLarge && img?.locked) {
 | 
	
		
			
				|  |  | -      alert('该渲染大图已加锁,需完成尾款结算并上传/识别支付凭证后方可下载。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('该渲染大图已加锁,需完成尾款结算并上传/识别支付凭证后方可下载。');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if (img) {
 | 
	
	
		
			
				|  | @@ -2115,7 +2115,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        this.isConfirmingSettlement = false;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 显示成功提示
 | 
	
		
			
				|  |  | -      alert('尾款结算已确认完成!');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('尾款结算已确认完成!');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 进入下一阶段
 | 
	
		
			
				|  |  |        this.advanceToNextStage('尾款结算');
 | 
	
	
		
			
				|  | @@ -2184,7 +2184,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      for (const f of files) {
 | 
	
		
			
				|  |  |        const ok = await this.validateImage4K(f).catch(() => false);
 | 
	
		
			
				|  |  |        if (!ok) {
 | 
	
		
			
				|  |  | -        alert(`图片不符合4K标准(最大边需≥4000像素):${f.name}`);
 | 
	
		
			
				|  |  | +       window?.fmode?.alert(`图片不符合4K标准(最大边需≥4000像素):${f.name}`);
 | 
	
		
			
				|  |  |          continue;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        const item = this.makeImageItem(f);
 | 
	
	
		
			
				|  | @@ -3066,7 +3066,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        this.expandedStages['订单分配'] = false;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 显示成功消息
 | 
	
		
			
				|  |  | -      alert('团队分配成功!已进入需求沟通阶段');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('团队分配成功!已进入需求沟通阶段');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        console.log('团队分配完成,已跳转到需求沟通阶段');
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -3622,7 +3622,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |              置信度:${(recognition.confidence * 100).toFixed(1)}%
 | 
	
		
			
				|  |  |            `;
 | 
	
		
			
				|  |  |            
 | 
	
		
			
				|  |  | -          alert(successMessage);
 | 
	
		
			
				|  |  | +         window?.fmode?.alert(successMessage);
 | 
	
		
			
				|  |  |            console.log('支付凭证识别完成', recognition);
 | 
	
		
			
				|  |  |            
 | 
	
		
			
				|  |  |            // 自动标记验证通过并解锁渲染大图
 | 
	
	
		
			
				|  | @@ -3634,13 +3634,13 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |            
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            const errorMessage = `支付凭证识别失败:${result.error || '未知错误'}`;
 | 
	
		
			
				|  |  | -          alert(errorMessage);
 | 
	
		
			
				|  |  | +         window?.fmode?.alert(errorMessage);
 | 
	
		
			
				|  |  |            console.error('支付凭证识别失败', result.error);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        error: (error) => {
 | 
	
		
			
				|  |  |          const errorMessage = `支付凭证处理出错:${error.message || '网络错误'}`;
 | 
	
		
			
				|  |  | -        alert(errorMessage);
 | 
	
		
			
				|  |  | +       window?.fmode?.alert(errorMessage);
 | 
	
		
			
				|  |  |          console.error('支付凭证处理出错', error);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      });
 | 
	
	
		
			
				|  | @@ -3674,7 +3674,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |          您现在可以下载4K高清渲染图了!
 | 
	
		
			
				|  |  |        `;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  | -      alert(notificationMessage);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(notificationMessage);
 | 
	
		
			
				|  |  |        console.log('自动通知发送完成');
 | 
	
		
			
				|  |  |      }, 1000);
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -3931,7 +3931,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 权限检查
 | 
	
		
			
				|  |  |      if (!this.isTechnicalView()) {
 | 
	
		
			
				|  |  | -      alert('⚠️ 仅技术人员可以启动自动化结算流程');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('⚠️ 仅技术人员可以启动自动化结算流程');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -3967,7 +3967,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        this.isAutoSettling = false;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 显示启动成功消息
 | 
	
		
			
				|  |  | -      alert(`🚀 自动化结算已成功启动!
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`🚀 自动化结算已成功启动!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ✅ 已启动功能:
 | 
	
		
			
				|  |  |  • 小程序支付自动监听
 | 
	
	
		
			
				|  | @@ -4166,7 +4166,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        if (!file) return;
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        console.log('📄 上传的凭证文件:', file.name);
 | 
	
		
			
				|  |  | -      alert(`📎 支付凭证已上传:${file.name}\n\n系统将自动识别支付金额和支付方式。`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`📎 支付凭证已上传:${file.name}\n\n系统将自动识别支付金额和支付方式。`);
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 模拟凭证识别和处理
 | 
	
		
			
				|  |  |        setTimeout(() => {
 | 
	
	
		
			
				|  | @@ -4188,7 +4188,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      console.log('🎨 启动全景图合成...');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 显示提示信息
 | 
	
		
			
				|  |  | -    alert('📸 请选择需要合成全景图的图片\n\n提示:\n1. 建议选择同一空间的多个角度照片\n2. 图片文件名可以包含空间名称(如:客厅-角度1.jpg)\n3. 系统会自动识别并分类');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('📸 请选择需要合成全景图的图片\n\n提示:\n1. 建议选择同一空间的多个角度照片\n2. 图片文件名可以包含空间名称(如:客厅-角度1.jpg)\n3. 系统会自动识别并分类');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 打开文件选择对话框,支持多文件选择
 | 
	
		
			
				|  |  |      const fileInput = document.createElement('input');
 | 
	
	
		
			
				|  | @@ -4341,7 +4341,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      console.log('📁 打开全景图画廊');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (this.panoramicSyntheses.length === 0) {
 | 
	
		
			
				|  |  | -      alert('📁 全景图画廊\n\n暂无全景图记录,请先进行全景图合成。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('📁 全景图画廊\n\n暂无全景图记录,请先进行全景图合成。');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -4350,20 +4350,20 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        `${index + 1}. ${item.projectName} - ${item.status === 'completed' ? '✅ 已完成' : '⏳ 处理中'} (${item.spaces?.length || 0}个空间)`
 | 
	
		
			
				|  |  |      ).join('\n');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert(`📁 全景图画廊(共${this.panoramicSyntheses.length}个)\n\n${galleryInfo}\n\n提示:点击列表中的全景图可查看详情或下载`);
 | 
	
		
			
				|  |  | +   window?.fmode?.alert(`📁 全景图画廊(共${this.panoramicSyntheses.length}个)\n\n${galleryInfo}\n\n提示:点击列表中的全景图可查看详情或下载`);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // 复制全景图链接
 | 
	
		
			
				|  |  |    copyPanoramicLink(synthesis: PanoramicSynthesis): void {
 | 
	
		
			
				|  |  |      if (!synthesis.shareLink) {
 | 
	
		
			
				|  |  | -      alert('全景图链接尚未生成');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('全景图链接尚未生成');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      navigator.clipboard.writeText(synthesis.shareLink).then(() => {
 | 
	
		
			
				|  |  | -      alert(`✅ 全景图链接已复制!\n\n${synthesis.shareLink}`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`✅ 全景图链接已复制!\n\n${synthesis.shareLink}`);
 | 
	
		
			
				|  |  |      }).catch(() => {
 | 
	
		
			
				|  |  | -      alert(`全景图链接:\n${synthesis.shareLink}`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`全景图链接:\n${synthesis.shareLink}`);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -4409,9 +4409,9 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 复制到剪贴板
 | 
	
		
			
				|  |  |      navigator.clipboard.writeText(reviewLink).then(() => {
 | 
	
		
			
				|  |  | -      alert(`✅ 评价链接已复制到剪贴板!\n\n链接:${reviewLink}\n\n有效期:30天\n\n请通过企业微信发送给客户`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`✅ 评价链接已复制到剪贴板!\n\n链接:${reviewLink}\n\n有效期:30天\n\n请通过企业微信发送给客户`);
 | 
	
		
			
				|  |  |      }).catch(() => {
 | 
	
		
			
				|  |  | -      alert(`评价链接:\n\n${reviewLink}\n\n有效期:30天\n\n请通过企业微信发送给客户`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`评价链接:\n\n${reviewLink}\n\n有效期:30天\n\n请通过企业微信发送给客户`);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 通知客服发送评价链接
 | 
	
	
		
			
				|  | @@ -4450,7 +4450,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        this.project.customerReviewCompletedAt = new Date();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert('✅ 客户评价已确认完成!');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('✅ 客户评价已确认完成!');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 可选:自动进入下一阶段
 | 
	
		
			
				|  |  |      // this.advanceToNextStage('客户评价');
 | 
	
	
		
			
				|  | @@ -4463,17 +4463,17 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    isKeywordMonitoringActive: boolean = false;
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // 手动创建投诉
 | 
	
		
			
				|  |  | -  createComplaintManually(): void {
 | 
	
		
			
				|  |  | +  async createComplaintManually(): Promise<void> {
 | 
	
		
			
				|  |  |      console.log('📝 手动创建投诉');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 显示创建投诉表单提示
 | 
	
		
			
				|  |  | -    alert('📝 创建投诉记录\n\n即将打开投诉创建表单,请填写以下信息:\n• 投诉环节\n• 核心问题\n• 客户反馈\n• 严重程度');
 | 
	
		
			
				|  |  | +   await window?.fmode?.alert('📝 创建投诉记录\n\n即将打开投诉创建表单,请填写以下信息:\n• 投诉环节\n• 核心问题\n• 客户反馈\n• 严重程度');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 弹出创建投诉表单
 | 
	
		
			
				|  |  | -    const complaintReason = prompt('请输入投诉原因:');
 | 
	
		
			
				|  |  | +    const complaintReason = await window?.fmode?.input('请输入投诉原因:');
 | 
	
		
			
				|  |  |      if (!complaintReason || complaintReason.trim() === '') return;
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    const complaintStage = prompt('请输入投诉环节(如:需求沟通、建模、渲染等):') || '未指定';
 | 
	
		
			
				|  |  | +    const complaintStage = await window?.fmode?.input('请输入投诉环节(如:需求沟通、建模、渲染等):') || '未指定';
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 创建投诉记录
 | 
	
		
			
				|  |  |      const complaint: any = {
 | 
	
	
		
			
				|  | @@ -4501,7 +4501,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      console.log('✅ 投诉记录已创建:', complaint);
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert(`✅ 投诉记录已创建!\n\n投诉环节:${complaintStage}\n核心问题:${complaint.tags.join('、')}\n\n系统将自动跟踪处理进度。`);
 | 
	
		
			
				|  |  | +   await window?.fmode?.alert(`✅ 投诉记录已创建!\n\n投诉环节:${complaintStage}\n核心问题:${complaint.tags.join('、')}\n\n系统将自动跟踪处理进度。`);
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 通知相关人员
 | 
	
		
			
				|  |  |      this.notifyComplaintHandlers(complaint);
 | 
	
	
		
			
				|  | @@ -4549,35 +4549,35 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 设置关键词监控
 | 
	
		
			
				|  |  | -  setupKeywordMonitoring(): void {
 | 
	
		
			
				|  |  | +  async setupKeywordMonitoring(): Promise<void> {
 | 
	
		
			
				|  |  |      console.log('⚙️ 设置关键词监控');
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (this.isKeywordMonitoringActive) {
 | 
	
		
			
				|  |  |        const confirmStop = confirm('⚙️ 关键词监控管理\n\n状态:✅ 已激活\n监控关键词:' + this.complaintKeywords.join('、') + '\n\n是否停止监控?');
 | 
	
		
			
				|  |  |        if (confirmStop) {
 | 
	
		
			
				|  |  |          this.isKeywordMonitoringActive = false;
 | 
	
		
			
				|  |  | -        alert('⏸️ 关键词监控已停止\n\n系统将不再自动抓取企业微信群中的投诉关键词');
 | 
	
		
			
				|  |  | +       await window?.fmode?.alert('⏸️ 关键词监控已停止\n\n系统将不再自动抓取企业微信群中的投诉关键词');
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 显示设置说明和当前关键词
 | 
	
		
			
				|  |  | -    alert('⚙️ 关键词监控功能\n\n功能说明:\n• 自动监测企业微信群消息\n• 识别投诉相关关键词\n• 自动创建投诉记录并标注\n• 实时通知相关处理人员\n\n当前监控关键词:\n' + this.complaintKeywords.join('、'));
 | 
	
		
			
				|  |  | +   await window?.fmode?.alert('⚙️ 关键词监控功能\n\n功能说明:\n• 自动监测企业微信群消息\n• 识别投诉相关关键词\n• 自动创建投诉记录并标注\n• 实时通知相关处理人员\n\n当前监控关键词:\n' + this.complaintKeywords.join('、'));
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      const currentKeywords = this.complaintKeywords.join('、');
 | 
	
		
			
				|  |  | -    const newKeywords = prompt(`当前监控关键词:\n${currentKeywords}\n\n请输入要添加的关键词(多个关键词用逗号分隔):`);
 | 
	
		
			
				|  |  | +    const newKeywords = await window?.fmode?.input(`当前监控关键词:\n${currentKeywords}\n\n请输入要添加的关键词(多个关键词用逗号分隔):`);
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (newKeywords && newKeywords.trim()) {
 | 
	
		
			
				|  |  |        const keywords = newKeywords.split(/[,,、]/).map(k => k.trim()).filter(k => k);
 | 
	
		
			
				|  |  |        this.complaintKeywords = [...new Set([...this.complaintKeywords, ...keywords])];
 | 
	
		
			
				|  |  | -      alert(`✅ 关键词已更新\n\n新增关键词:${keywords.join('、')}\n\n全部监控关键词:\n${this.complaintKeywords.join('、')}`);
 | 
	
		
			
				|  |  | +     await window?.fmode?.alert(`✅ 关键词已更新\n\n新增关键词:${keywords.join('、')}\n\n全部监控关键词:\n${this.complaintKeywords.join('、')}`);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      // 激活监控
 | 
	
		
			
				|  |  |      this.isKeywordMonitoringActive = true;
 | 
	
		
			
				|  |  |      this.startKeywordMonitoring();
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert(`✅ 关键词监控已激活!\n\n监控关键词:${this.complaintKeywords.join('、')}\n\n系统将自动检测企业微信群消息中的关键词并创建投诉记录。`);
 | 
	
		
			
				|  |  | +   await window?.fmode?.alert(`✅ 关键词监控已激活!\n\n监控关键词:${this.complaintKeywords.join('、')}\n\n系统将自动检测企业微信群消息中的关键词并创建投诉记录。`);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    // 开始关键词监控
 | 
	
	
		
			
				|  | @@ -4670,7 +4670,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        if (!confirmAnyway) return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert('✅ 所有投诉已确认处理完成!');
 | 
	
		
			
				|  |  | +   window?.fmode?.alert('✅ 所有投诉已确认处理完成!');
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 处理评价表单提交
 | 
	
	
		
			
				|  | @@ -4680,7 +4680,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      // 这里应该调用API将评价数据保存到服务器
 | 
	
		
			
				|  |  |      // 模拟API调用
 | 
	
		
			
				|  |  |      setTimeout(() => {
 | 
	
		
			
				|  |  | -      alert('客户评价提交成功!评价数据已保存。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('客户评价提交成功!评价数据已保存。');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 更新本地反馈数据
 | 
	
		
			
				|  |  |        const newFeedback: CustomerFeedback = {
 | 
	
	
		
			
				|  | @@ -4708,7 +4708,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      // 这里应该调用API将草稿数据保存到服务器
 | 
	
		
			
				|  |  |      // 模拟API调用
 | 
	
		
			
				|  |  |      setTimeout(() => {
 | 
	
		
			
				|  |  | -      alert('评价草稿保存成功!您可以稍后继续完善。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('评价草稿保存成功!您可以稍后继续完善。');
 | 
	
		
			
				|  |  |      }, 500);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -4838,7 +4838,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      // 这里应该调用API分配订单
 | 
	
		
			
				|  |  |      // 模拟API调用
 | 
	
		
			
				|  |  |      setTimeout(() => {
 | 
	
		
			
				|  |  | -      alert('订单分配成功!');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('订单分配成功!');
 | 
	
		
			
				|  |  |        // 订单分配成功后自动切换到下一环节
 | 
	
		
			
				|  |  |        this.advanceToNextStage('订单分配');
 | 
	
		
			
				|  |  |      }, 500);
 | 
	
	
		
			
				|  | @@ -4976,7 +4976,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        this.isGeneratingReview = false;
 | 
	
		
			
				|  |  | -      alert('复盘报告生成完成!基于真实SOP执行数据和智能分析生成。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('复盘报告生成完成!基于真实SOP执行数据和智能分析生成。');
 | 
	
		
			
				|  |  |      }, 3000);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5013,20 +5013,20 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |            // 复制到剪贴板
 | 
	
		
			
				|  |  |            if (navigator.clipboard) {
 | 
	
		
			
				|  |  |              navigator.clipboard.writeText(response.shareUrl).then(() => {
 | 
	
		
			
				|  |  | -              alert(`复盘报告分享链接已复制到剪贴板!\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  | +             window?.fmode?.alert(`复盘报告分享链接已复制到剪贴板!\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  |              }).catch(() => {
 | 
	
		
			
				|  |  | -              alert(`复盘报告分享链接:\n${response.shareUrl}\n\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  | +             window?.fmode?.alert(`复盘报告分享链接:\n${response.shareUrl}\n\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |            } else {
 | 
	
		
			
				|  |  | -            alert(`复盘报告分享链接:\n${response.shareUrl}\n\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  | +           window?.fmode?.alert(`复盘报告分享链接:\n${response.shareUrl}\n\n链接有效期:${response.expirationDate ? new Date(response.expirationDate).toLocaleDateString() : '30天'}`);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -          alert('分享失败:' + (response.message || '未知错误'));
 | 
	
		
			
				|  |  | +         window?.fmode?.alert('分享失败:' + (response.message || '未知错误'));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        error: (error) => {
 | 
	
		
			
				|  |  |          console.error('分享复盘报告失败:', error);
 | 
	
		
			
				|  |  | -        alert('分享失败,请稍后重试');
 | 
	
		
			
				|  |  | +       window?.fmode?.alert('分享失败,请稍后重试');
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -5349,7 +5349,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      if (!hasImages) {
 | 
	
		
			
				|  |  | -      alert('请先上传图片再确认');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('请先上传图片再确认');
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -5376,7 +5376,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        // 如果是最后一个阶段,标记为完成
 | 
	
		
			
				|  |  |        console.log(`交付执行阶段完成: ${currentStage}`);
 | 
	
		
			
				|  |  | -      alert('交付执行阶段已完成!');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('交付执行阶段已完成!');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    
 | 
	
	
		
			
				|  | @@ -5444,7 +5444,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |      console.log(`📋 功能详情: ${title}`);
 | 
	
		
			
				|  |  |      console.log(`📝 ${description}`);
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    alert(`✨ ${title}\n\n${description}\n\n点击确定关闭`);
 | 
	
		
			
				|  |  | +   window?.fmode?.alert(`✨ ${title}\n\n${description}\n\n点击确定关闭`);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // ==================== 需求映射辅助方法 ====================
 | 
	
	
		
			
				|  | @@ -5534,7 +5534,7 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        suggestion.acceptedAt = new Date();
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        // 显示成功消息
 | 
	
		
			
				|  |  | -      alert(`✅ 已采纳优化建议!\n\n类别:${suggestion.category}\n建议已加入您的改进计划中。`);
 | 
	
		
			
				|  |  | +     window?.fmode?.alert(`✅ 已采纳优化建议!\n\n类别:${suggestion.category}\n建议已加入您的改进计划中。`);
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |        console.log('已采纳建议:', suggestion);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -5573,11 +5573,11 @@ export class ProjectDetail implements OnInit, OnDestroy {
 | 
	
		
			
				|  |  |        // 转换为CSV格式并下载(简化版本)
 | 
	
		
			
				|  |  |        this.downloadAsCSV(data);
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  | -      alert('✅ 报告导出成功!\n\n报告已下载到您的下载文件夹。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('✅ 报告导出成功!\n\n报告已下载到您的下载文件夹。');
 | 
	
		
			
				|  |  |        
 | 
	
		
			
				|  |  |      } catch (error) {
 | 
	
		
			
				|  |  |        console.error('导出报告失败:', error);
 | 
	
		
			
				|  |  | -      alert('❌ 导出报告失败,请稍后重试。');
 | 
	
		
			
				|  |  | +     window?.fmode?.alert('❌ 导出报告失败,请稍后重试。');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 |