|
|
@@ -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('❌ 导出报告失败,请稍后重试。');
|
|
|
}
|
|
|
}
|
|
|
|