/* 花镇 · 婚姻关系判断H5 — 文案/题库/规则配置 */ /* 所有面向用户的文案集中于此,页面组件只做渲染 */ const MARRIAGE_COPY = { /* ===== Step 0:首屏 ===== */ step0: { eyebrow: '花镇AI婚姻关系评估', title: '你们的婚姻,现在还有可以共同修复的基础吗?', description: '结合你们目前的婚姻状态、现实联系、对方态度和主要矛盾,生成一份基于真实情况的专属AI婚姻关系判断报告。', values: [ '你们当前更接近的婚姻关系阶段', '对方是在参与修复、观望还是继续退出', '目前仍存在的婚姻连接与关键阻力', '现阶段更适合沟通、观察还是暂停原来的做法' ], lightTip: '约2分钟 · 根据你的真实情况生成 · 不是固定答案测试', cta: '开始梳理我的婚姻关系', bottomNote: '评估用于梳理关系状态,不替你或伴侣作出婚姻决定,也不保证修复结果。请勿填写姓名、电话、住址等敏感信息。' }, /* ===== Step 1:4项基本婚姻情况(1.0 表单文案,保留兼容) ===== */ /* 2.0 已改为由 index.html 依 q2/q4 自动映射生成 basic,下列选项文案即映射目标值 */ step1: { eyebrow: 'AI正在了解你的婚姻情况', title: '先简单说说你的婚姻情况', description: '不需要写得很完整,按你现在最真实的情况填写即可。', fields: { marriageDuration: { id: 'marriageDuration', label: '婚龄或关系持续多久', placeholder: '例如:结婚5年、在一起10年', maxLen: 30, type: 'text', required: true }, marriageStatus: { id: 'marriageStatus', label: '目前婚姻状态', type: 'select', required: true, placeholder: '请选择', options: [ '未分居,正常共同生活', '已分居,但仍有正常联系', '已分居,联系较少或已断联', '已离婚,但仍有一定联系', '已离婚,基本不再联系', '处于离婚协商或诉讼阶段' /* 1.0 旧表单遗留,2.0 由 q2 映射时不再产生该值 */ ] }, children: { id: 'children', label: '是否有子女及主要照顾情况', type: 'select', required: true, placeholder: '请选择', options: [ '没有子女', '有子女,目前主要跟我生活', '有子女,目前主要跟对方生活', '有子女,目前轮流或共同照顾' ] }, mainConcerns: { id: 'mainConcerns', label: '当前主要困扰或最关心的问题(可多选)', type: 'multi', required: true, options: [ '沟通困难 / 争吵频繁', '对方态度冷淡或拒绝沟通', '婚外情或信任问题', '经济 / 家务 / 育儿矛盾', '婆媳关系或原生家庭影响', '对方有离婚意愿', '存在暴力、威胁、跟踪等人身安全担忧', '其他' ], otherIndex: 7, otherLabel: '请简述你目前最担心的问题', otherPlaceholder: '例如:他经常很晚回家,问他细节就发火,我不知道这段关系还要不要继续。', otherMaxLen: 200, maxSelect: 3, maxError: '最多选择三项,请先取消一项再选择。', emptyError: '请至少选择一项当前最困扰你的问题。' } }, privacyHint: '请勿填写姓名、电话、详细住址、身份证号或账号密码。', btnBack: '返回', btnSubmit: '下一步,回答判断题', 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: '当前婚姻中仍然存在的连接', sectionTitle3: '当前需要特别注意', sectionTitle4: '完整报告将重点帮你梳理', btnReport: '查看完整报告领取方式', btnModify: '修改我的答案', bottomNote: '本摘要基于你提交的信息生成,用于梳理关系状态,不替你或伴侣作出婚姻决定。' }, /* ===== Step 9:完整报告领取 ===== */ step9: { eyebrow: '完整报告领取', title: '你的婚姻关系阶段摘要已生成', description: '添加花镇婚姻关系咨询师助理企微,可领取完整AI婚姻关系评估报告。', values: [ '你的婚姻关系阶段结论', '目前最主要的婚姻阻力', '当前婚姻状态拆解', '当前婚姻中仍然存在的连接', '当前最需要观察的信号', '现阶段建议先做什么' ], btnWechat: '添加企微,领取完整AI婚姻报告', wechatNote: '添加后发送"婚姻报告",系统将根据本次摘要为你匹配完整报告。', coachNote: '如需进一步核对,可附上近期关键聊天截图,并简单说明最近发生了什么、对方的态度变化,以及你最想判断什么。提交前请遮盖姓名、头像、电话、住址等个人信息。', btnBack: '返回查看我的摘要' }, /* ===== 安全分支 ===== */ safety: { eyebrow: '安全优先提醒', title: '你描述的情况可能涉及人身或心理安全风险', warning: '在存在暴力、威胁、跟踪等人身安全担忧的情况下,婚姻关系修复不是当前第一目标。请优先确保自身安全,联系可信赖的亲友、当地警方或专业支持机构。如存在紧急危险,请立即联系当地紧急服务。', resourcesTitle: '你可以考虑的联系渠道', resources: [ '可信赖的家人或朋友', '当地公安机关(如情况紧急,请拨打110)', '当地妇联、社区或心理援助热线', '专业法律援助机构' ], btnSupport: '联系助理,获取安全支持资源', btnModify: '返回修改我的答案', supportNote: '我们不会要求你提供敏感身份或实时位置,也不会把自由文本写入URL或埋点。' } }; /* ===== 题库配置(婚姻测试2.0,与 index.html 内联题库一致) ===== */ const MARRIAGE_RISK_OPTION = '暴力、威胁、跟踪等安全风险'; const MARRIAGE_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: '用于判断对方更接近参与、观望还是退出。', emptyError: '请先选择最接近的情况。' }, { id: 'q4', step: 5, title: '主要阻力判断 4/5', question: '现在最影响婚姻的是什么?', subtitle: '最多选择两项。', type: 'multi', signalName: '主要阻力', maxSelect: 2, options: [ '频繁争吵或沟通失效', '长期冷战或关系冷淡', '出轨、暧昧或信任破裂', '金钱、家务或育儿分工', '婆媳或原生家庭介入', '亲密关系不和谐', '控制、指责或言语伤害', '对方坚持分居或离婚', '暴力、威胁、跟踪等安全风险', '其他' ], feedback: '已记录目前最影响婚姻的问题', helper: '用于识别目前最主要的关系阻力。', emptyError: '请至少选择一项。', maxError: '最多选择两项。', otherIndex: 9, otherLabel: '还有什么最困扰你?', otherPlaceholder: '例如:一谈到家庭责任他就沉默。', otherMaxLen: 80, safetyIndex: 8 }, { id: 'q5', step: 6, title: '报告重点判断 5/5', question: '你最想先判断什么?', subtitle: '最多选择两项。', type: 'multi', maxSelect: 2, signalName: '报告重点', options: [ '还有没有共同修复基础', '对方是真的想离婚吗', '现在该沟通还是先停一停', '怎样减少争吵或冷战', '孩子或家庭事务影响多大', '下一步应该先做什么', '其他' ], feedback: '已记录你最想先判断的问题', helper: '你的选择将决定完整报告优先回答什么。', emptyError: '请至少选择一项。', maxError: '最多选择两项。', otherIndex: 6, otherLabel: '你还想重点判断什么?', otherPlaceholder: '例如:他说想离婚但没找律师,是不是还有余地?', otherMaxLen: 80 } ]; /* ===== 1.0 旧题选项 → 2.0 选项别名(历史落库数据仍可判出正确阶段) ===== */ const MARRIAGE_LEGACY_ALIAS = { q1: { '基本稳定,偶尔有小摩擦': '总体稳定,只是偶有矛盾', '总体还可以,但近几年明显冷淡': '关系明显变冷或长期冷战', '经常争吵,但还没有认真谈过离婚': '频繁争吵,但还没认真谈离婚', '已经多次谈到离婚或分开': '已多次谈到分居或离婚', '对方已经明确提出离婚': '对方已明确提出或推进离婚', '我们基本不再沟通婚姻问题': '基本不再谈婚姻问题' }, q2: { '仍然同住': '同住,仍有日常交流', '分居但仍有日常联系': '分居,仍有日常联系', '分居,联系很少或基本断联': '分居,联系很少或已断联', '已离婚,但仍因为孩子或事务有联系': '已离婚,仍因孩子或事务联系' }, q3: { '愿意一起面对问题,尝试修复': '愿意面对问题,并有实际行动', '态度中立,观望多于表态': '态度中立,还在观望', '忽冷忽热,有时愿意沟通有时回避': '忽冷忽热', '明显冷淡,不愿多谈感情': '明显回避或不愿谈', '明确坚持离婚或结束关系': '明确拒绝修复,坚持离婚' }, q4: { '沟通方式冲突 / 争吵频繁': '频繁争吵或沟通失效', '长期冷战或拒绝沟通': '长期冷战或关系冷淡', '婚外关系或信任问题': '出轨、暧昧或信任破裂', '经济 / 家务 / 育儿分工矛盾': '金钱、家务或育儿分工', '婆媳关系 / 原生家庭介入': '婆媳或原生家庭介入', '性生活或亲密关系不和谐': '亲密关系不和谐', '情绪问题 / 控制 / 言语伤害': '控制、指责或言语伤害', '对方有明确离婚或分居意愿': '对方坚持分居或离婚', '存在暴力、威胁、跟踪或人身安全担忧': '暴力、威胁、跟踪等安全风险' }, q5: { '我们的婚姻是否还有共同修复的基础': '还有没有共同修复基础', '对方是真的想离婚还是一时情绪': '对方是真的想离婚吗', '现阶段我应该继续沟通还是暂时保持距离': '现在该沟通还是先停一停', '孩子 / 家庭事务对关系判断的影响': '孩子或家庭事务影响多大', '如何减少无效争吵或冷战': '怎样减少争吵或冷战', '我需要优先处理哪个问题': '下一步应该先做什么' } }; /* 把任意版本落库答案统一成 2.0 选项文案;已是 2.0 的取值原样保留 */ function normalizeMarriageAnswers(state) { const a = (state && state.answers) || {}; const mapOne = function (qid, v) { const tbl = MARRIAGE_LEGACY_ALIAS[qid]; if (v == null || !tbl) return v; return Object.prototype.hasOwnProperty.call(tbl, v) ? tbl[v] : v; }; return { q1: mapOne('q1', a.q1 || ''), q2: mapOne('q2', a.q2 || ''), q3: mapOne('q3', a.q3 || ''), q4: (a.q4 || []).map(function (v) { return mapOne('q4', v); }), q5: (a.q5 || []).map(function (v) { return mapOne('q5', v); }), q4Other: a.q4Other || '', q5Other: a.q5Other || '' }; } /* ===== 阶段摘要样例(文案与2.0摘要页一致;stageTag沿用原阶段名) ===== */ const MARRIAGE_STAGE_SAMPLES = { M1: { stageCode: 'M1', stageName: '仍有共同修复参与基础', stageTag: '双方仍愿意面对婚姻问题', summary: '你们目前仍有一定沟通基础,至少一方仍在尝试参与修复,婚姻尚未进入完全僵死的阶段。', connection: '仍有日常互动,婚姻中的现实联系没有完全断裂;至少有一方表达了改善意愿;共同责任仍在维系部分连接。', attention: '不要因为焦虑而急于要求对方表态;避免把“愿意沟通”直接等同于“问题已经解决”。', focus: ['还有没有共同修复基础', '现在该沟通还是先停一停', '怎样减少争吵或冷战'] }, M2: { stageCode: 'M2', stageName: '有限沟通观察期', stageTag: '一方仍在表达,另一方回应有限', summary: '你们仍保持有限联系,但沟通质量不高,婚姻是否能继续修复,需要观察对方是否从被动回应转为主动参与。', connection: '联系方式保留,部分家庭事务仍能正常对接;没有发生彻底断联或极端对立;双方对婚姻仍有情绪反应,说明关系仍有影响。', attention: '减少追问、指责和情绪输出;避免把对方的礼貌回应误解为关系已经缓和。', focus: ['对方是真的想离婚吗', '现在该沟通还是先停一停', '下一步应该先做什么'] }, M3: { stageCode: 'M3', stageName: '反复靠近与退出期', stageTag: '关系节奏不稳定', summary: '婚姻中仍有靠近时刻,但对方态度反复,容易在沟通后再次冷淡或回避,关系节奏尚未稳定。', connection: '双方在情绪平稳时仍能交流,甚至会有一些亲密或合作行为;共同生活或责任仍在制造接触机会。', attention: '重点在于打破“靠近—冲突—后退”的循环,而不是在每次靠近时急于推进复合或要求承诺。', focus: ['还有没有共同修复基础', '怎样减少争吵或冷战', '孩子或家庭事务影响多大'] }, M4: { stageCode: 'M4', stageName: '离婚推进与边界收紧期', stageTag: '对方已明确释放退出信号', summary: '对方已经通过言行建立了较明确的离婚或分居边界,继续强行沟通可能进一步压缩现有空间。', connection: '共同经历、子女、财产等现实连接仍然存在;对方的边界行为本身也说明婚姻仍对其有影响。', attention: '当前最重要的不是说服对方回头,而是避免情绪对抗升级,并为后续沟通和决策保留空间。', focus: ['对方是真的想离婚吗', '现在该沟通还是先停一停', '孩子或家庭事务影响多大'] }, M5: { stageCode: 'M5', stageName: '婚姻关系已结束,仍有现实连接', stageTag: '离婚后重新评估期', summary: '你们已经离婚,但由于子女、财产或事务性联系,关系仍在持续互动中,需要重新定位彼此边界。', connection: '子女抚养、共同财务或事务性沟通让你们仍需保持联系;离婚后仍有一定情绪牵绊。', attention: '明确离婚后关系的角色边界,避免把事务性联系重新卷入情感冲突。', focus: ['孩子或家庭事务影响多大', '现在该沟通还是先停一停', '下一步应该先做什么'] } }; /* ===== 婚姻关系阶段生成规则 ===== */ /* 优先级与 index.html 的 getAssessment 一致:安全风险 > 关系已结束 > 离婚推进 > 反复拉扯 > 共同修复基础 > 默认 */ function getAssessmentReport(state) { const basic = (state && state.basic) || {}; const ans = normalizeMarriageAnswers(state); const q1 = ans.q1; const q2 = ans.q2; const q3 = ans.q3; const q4 = ans.q4; // SAFETY detection with negation handling const allConcerns = (basic.mainConcerns || []).join(" "); const reasonText = allConcerns + " " + (basic.otherConcernText || "") + " " + (q4OtherText(state) || ""); const negationPatterns = /没有暴力|没有威胁|没有跟踪|没有控制|不是暴力|不是威胁|不是跟踪|无暴力|无威胁|无跟踪|无控制|没有家暴|不是家暴/g; const cleanedText = reasonText.replace(negationPatterns, ""); const hasSafetyConcern = (basic.mainConcerns || []).some(function(c){return /存在暴力/.test(c);}); const hasSafetyQ4 = q4.indexOf(MARRIAGE_RISK_OPTION) >= 0; const hasSafetyKeyword = /人身安全|安全担忧/.test(cleanedText) && !/没有.*安全|不是.*安全/.test(cleanedText); if (hasSafetyConcern || hasSafetyQ4 || hasSafetyKeyword) { return { ...MARRIAGE_STAGE_SAMPLES.M2, isSafety: true, stageCode: 'SAFETY', stageName: MARRIAGE_COPY.safety.title, stageTag: '安全优先' }; } // 婚姻关系已结束,仍有现实连接 if (q2 === '已离婚,仍因孩子或事务联系' || q2 === '已离婚,基本没有联系') { return MARRIAGE_STAGE_SAMPLES.M5; } // 离婚推进与边界收紧 if (q1 === '对方已明确提出或推进离婚' || q3 === '明确拒绝修复,坚持离婚') { return MARRIAGE_STAGE_SAMPLES.M4; } // 反复靠近与退出 if (q3 === '忽冷忽热') { return MARRIAGE_STAGE_SAMPLES.M3; } // 仍有共同修复参与基础 if ( q3 === '愿意面对问题,并有实际行动' && q1 !== '对方已明确提出或推进离婚' && q2 !== '已离婚,仍因孩子或事务联系' && q2 !== '已离婚,基本没有联系' && q2 !== '分居,联系很少或已断联' ) { return MARRIAGE_STAGE_SAMPLES.M1; } // 默认:有限沟通观察期 return MARRIAGE_STAGE_SAMPLES.M2; } function q4OtherText(state) { const q4Cfg = MARRIAGE_QUESTIONS.find(q => q.id === 'q4'); if (!q4Cfg || !state || !state.answers || !state.answers.q4Other) return ''; if (normalizeMarriageAnswers(state).q4.indexOf(q4Cfg.options[q4Cfg.otherIndex]) >= 0) { return state.answers.q4Other; } return ''; } if (typeof module !== 'undefined' && module.exports) { module.exports = { MARRIAGE_COPY, MARRIAGE_QUESTIONS, MARRIAGE_STAGE_SAMPLES, MARRIAGE_RISK_OPTION, MARRIAGE_LEGACY_ALIAS, normalizeMarriageAnswers, getAssessmentReport, q4OtherText }; }