/* 花镇 · 分手关系判断 — 完整文案/题库/规则配置 */ /* 所有面向用户的文案集中于此,页面组件只做渲染 */ const ASSESSMENT_COPY = { /* ===== Step 0:首屏 ===== */ step0: { eyebrow: '花镇AI关系评估', title: '你们现在,还有重新靠近的关系窗口吗?', description: '结合你们分开多久、目前的联系状态、最近互动和分开原因,生成一份基于你真实情况的专属AI关系判断报告。', values: [ '你们当前更接近的关系阶段', '对方是在靠近、观望还是继续拉远', '目前仍存在的关系连接与关键阻力', '现在更适合联系、观察还是暂停原来的做法' ], lightTip: '约2分钟 · 根据你的真实情况生成 · 不是固定答案测试', cta: '开始生成我的关系判断报告', bottomNote: '评估结果基于你提供的信息,不预测或保证复合结果。请勿填写姓名、电话、住址等敏感信息。' }, /* ===== Step 1:基本情况填写 ===== */ step1: { eyebrow: 'AI正在了解你的情况', title: '先简单说说你的情况', description: '不需要写得很完整,按你现在最真实的情况填写即可。', fields: { age: { label: '你的年龄', placeholder: '例如:28岁', maxLen: 10, type: 'text' }, gender: { label: '你的性别', placeholder: '例如:女', maxLen: 10, type: 'text' }, duration: { label: '你们分开多久了', placeholder: '例如:刚分开7天、分开2个月', maxLen: 30, type: 'text' }, reason: { label: '你们主要因为什么分开', placeholder: '例如:经常因为联系频率争吵,我情绪上来后说了分手,对方后来不愿意再沟通', maxLen: 300, type: 'textarea' } }, privacyHint: '请勿填写姓名、电话、详细住址、身份证号或账号密码。', btnBack: '返回', btnSubmit: 'AI开始理解我的情况', emptyError: '请先填写这4项基本情况。' }, /* ===== Step 2-6 共用 ===== */ btnBack: '返回', btnNext: '下一题', btnGenerate: '生成我的关系阶段摘要', /* ===== Step 7:AI 生成中 ===== */ step7: { title: 'AI正在生成关系阶段摘要', statuses: [ '正在整理你们目前的联系信号…', '正在核对现实互动和态度变化…', '正在结合分开原因与已采取的行动…', '正在生成你的关系阶段摘要…' ], failText: '摘要暂时没有生成成功,你的答案已经保留,可以重新尝试。', failBtn: '重新生成' }, /* ===== Step 8:关系阶段摘要 ===== */ step8: { eyebrow: 'AI关系阶段判断已生成', titleTemplate: '你们目前更接近:【{stageName}】', sectionTitle1: '阶段结论', sectionTitle2: 'AI识别到的主要情况', sectionTitle3: '当前关系窗口', sectionTitle4: '当前需要注意', sectionTitle5: '报告将重点回答', btnReport: '查看完整报告领取方式', bottomNote: '本摘要基于你提交的信息生成,不预测或保证复合结果。', btnModify: '修改我的答案' }, /* ===== Step 9:完整报告领取 ===== */ step9: { eyebrow: '完整报告领取', title: '你的关系阶段摘要已生成', description: '添加花镇情感咨询师助理企微,可领取完整AI关系评估报告。', values: [ '你的关系阶段结论', '目前最主要的关系阻力', '当前关系状态拆解', '当前关系中仍然存在的连接', '当前最需要观察的信号', '现阶段建议先做什么' ], btnWechat: '添加企微,领取完整AI报告', wechatNote: '添加后发送"关系报告",系统将根据本次摘要为你匹配完整报告。', coachNote: '如需进一步核对,可附上近期关键聊天截图,并简单说明是谁先联系、联系前发生了什么,以及你最想判断哪句话。提交前请遮盖姓名、头像、电话、住址等个人信息。', btnBack: '返回查看我的摘要' }, /* ===== 安全分支 ===== */ safety: { warning: '你描述的情况可能涉及人身或心理安全风险。现阶段不建议把恢复关系作为第一目标,请优先确保自身安全,并联系可信赖的亲友、当地警方或专业支持机构。若存在紧急危险,请立即联系当地紧急服务。', btnWechat: '联系助理,说明安全风险' } }; /* ===== 题库配置 ===== */ const ASSESSMENT_QUESTIONS = [ { id: 'q1', step: 2, title: '关系判断 1/5', question: '你们现在还有怎样的联系?', subtitle: '请选择最符合目前情况的一项。', type: 'single', signalName: '联系信号', options: [ '双方都会主动联系', '对方偶尔会主动联系', '主要是我主动,对方通常会回复', '对方会回复,但比较简短或敷衍', '对方很少回复或已经断联', '对方已经拉黑或明确不希望我联系', '情况反复,很难判断' ], feedback: '已记录你们目前的联系信号', helper: '你的选择将用于判断联系是双向、有限还是已经关闭。', emptyError: '请选择一项最接近的情况。' }, { id: 'q2', step: 3, title: '关系判断 2/5', question: '分开后,你们还有现实接触或见面的可能吗?', subtitle: '请选择最符合目前情况的一项。', type: 'single', signalName: '互动信号', options: [ '分开后仍然见过面', '已经谈到或约过见面', '因工作、住处、物品等事情仍会接触', '只有线上联系,暂时没有见面安排', '我提出过见面,但对方没有明确答应', '对方明确拒绝见面', '已经完全没有现实接触' ], feedback: '已记录你们目前的现实互动信号', helper: '正在判断你们是否还存在现实互动窗口。', emptyError: '请选择一项最接近的情况。' }, { id: 'q3', step: 4, title: '关系判断 3/5', question: '最近一次互动后,对方的态度更接近哪一种?', subtitle: '请选择你最直观的感受。', type: 'single', signalName: '态度信号', options: [ '比刚分开时明显缓和', '愿意交流,也不排斥继续接触', '会聊日常,但回避感情和分手原因', '忽冷忽热,有时靠近、有时拉远', '只是礼貌回复,没有继续交流', '明显更加冷淡、防备或拒绝', '我无法从目前的互动中判断' ], feedback: '已记录对方最近的态度变化', helper: 'AI将据此识别对方更接近靠近、观望还是拉远。', emptyError: '请选择一项最接近的情况。' }, { id: 'q4', step: 5, title: '关系判断 4/5', question: '分开后,你做过哪些事情?', subtitle: '可以选择多项,请按真实情况选择。', type: 'multi', signalName: '行动信号', options: [ '主动解释、道歉或承诺改变', '多次联系、追问对方态度', '请求见面把问题谈清楚', '暂停联系,给双方一些空间', '通过朋友或家人了解对方情况', '删除、拉黑后又重新联系', '还没有采取明显行动' ], feedback: '已记录你分开后的处理方式', helper: '正在判断哪些做法可能有效、哪些可能增加防备。', emptyError: '请至少选择一项;如果还没有行动,可以选择"还没有采取明显行动"。', exclusiveIndex: 6 // "还没有采取明显行动" 在选项中的索引(0-based) }, { id: 'q5', step: 6, title: '关系判断 5/5', question: '你最希望这份AI报告先帮你判断什么?', subtitle: '最多选择两项。', type: 'multi', maxSelect: 2, signalName: '关注信号', options: [ '我们现在处于什么关系阶段', '对方的回复是态度缓和还是礼貌回应', '目前还有没有继续沟通或见面的窗口', '现在应该主动联系、暂停观察还是停止原来的做法', '原来的争吵、情绪或控制问题是否仍在影响关系', '下一步最需要先处理什么', '我还有其他特别想判断的问题' ], feedback: '已记录你最关心的问题', helper: '你的选择将影响报告的分析重点。', emptyError: '请至少选择一项。', maxError: '最多选择两项,请先取消一项再选择。', otherIndex: 6, otherPlaceholder: '例如:他主动看我的动态,是否代表态度有变化?', otherLabel: '你还想重点判断什么?', otherMaxLen: 100 } ]; /* ===== 关系阶段生成规则 ===== */ function getAssessmentReport(state) { const q1 = state.answers.q1; const q2 = state.answers.q2; const q3 = state.answers.q3; const q4 = state.answers.q4 || []; const basic = state.basic; // 安全分支:检测是否涉及家暴/威胁/自伤等 const safetyKeywords = ['家暴','威胁','跟踪','强迫','报复','自伤','他伤','伤害自己','伤害他']; const reasonText = (basic.breakupReason || '').toLowerCase(); const isSafetyRisk = safetyKeywords.some(kw => reasonText.includes(kw)); if (isSafetyRisk) { return { stageCode: 'SAFETY', stageName: '安全优先', summary: ASSESSMENT_COPY.safety.warning, window: ASSESSMENT_COPY.safety.warning, actionNote: '', isSafety: true }; } // R1: 断联或边界关闭期 if ( q1 === '对方已经拉黑或明确不希望我联系' || (q1 === '对方很少回复或已经断联' && (q2 === '对方明确拒绝见面' || q2 === '已经完全没有现实接触')) ) { return { stageCode: 'R1', stageName: '断联或边界关闭期', summary: '目前没有看到稳定的互动窗口,应优先识别和尊重已经表达的边界。', window: '目前没有看到稳定的现实互动窗口。是否发生变化,应以对方后续自主、明确的行动为准。', actionNote: '' }; } // R2: 反复靠近与拉远期 if ( q1 === '情况反复,很难判断' || q3 === '忽冷忽热,有时靠近、有时拉远' ) { return { stageCode: 'R2', stageName: '反复靠近与拉远期', summary: '关系并非完全没有连接,但互动仍被旧有矛盾和情绪拉扯影响。', window: '存在有限窗口,但需要继续核对主动联系、见面和矛盾讨论等真实信号,不能只根据一次靠近或一次冷淡下结论。', actionNote: '' }; } // R3: 单向维持与防备期 if ( (q1 === '主要是我主动,对方通常会回复' || q1 === '对方会回复,但比较简短或敷衍') && (q3 === '只是礼貌回复,没有继续交流' || q3 === '明显更加冷淡、防备或拒绝') ) { return { stageCode: 'R3', stageName: '单向维持与防备期', summary: '现有联系主要由你维持,对方暂未表现出稳定、主动的靠近。', window: '目前没有看到稳定的双向互动窗口,需要观察对方是否从被动回应转为主动参与。', actionNote: '' }; } // R4: 仍有双向互动窗口 if ( (q1 === '双方都会主动联系' || q1 === '对方偶尔会主动联系') && (q2 === '分开后仍然见过面' || q2 === '已经谈到或约过见面' || q2 === '因工作、住处、物品等事情仍会接触') && (q3 === '比刚分开时明显缓和' || q3 === '愿意交流,也不排斥继续接触') ) { return { stageCode: 'R4', stageName: '仍有双向互动窗口', summary: '双方仍存在较明确的互动基础,但原有矛盾是否改变仍需继续核对。', window: '仍有较明确的互动窗口,但需要观察双方是否愿意进入具体沟通,而不只是维持表面联系。', actionNote: '' }; } // R5: 有限联系观察期(默认) return { stageCode: 'R5', stageName: '有限联系观察期', summary: '你们尚未完全失去联系,但现有互动是否代表修复意愿,还需要结合主动性和现实行动继续判断。', window: '存在有限窗口,但需要继续核对主动联系、见面和矛盾讨论等真实信号。', actionNote: '' }; } /* ===== 埋点(仅结构化事件,不记录自由文本) ===== */ function track(eventName, props) { if (typeof add_burial_point_log === 'function') { add_burial_point_log(1, { event: eventName, props: props }); } }