-- 物业 AI HR 对练记录最小表结构。 -- ponytail: one session table covers history, review list and profile aggregation for MVP. CREATE TABLE IF NOT EXISTS `aihr_practice_session` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `session_id` varchar(100) NOT NULL COMMENT '训练会话ID', `ext_party_id` varchar(100) DEFAULT NULL COMMENT '外部主体或手机号', `trainee_name` varchar(100) DEFAULT NULL COMMENT '学员名称', `scenario_id` varchar(80) DEFAULT NULL COMMENT '场景ID', `scenario_name` varchar(100) DEFAULT NULL COMMENT '场景名称', `mode` varchar(30) DEFAULT 'text' COMMENT '训练模式', `total_score` int DEFAULT NULL COMMENT '总分', `dim_compliance` int DEFAULT NULL COMMENT '合规分', `dim_emotion` int DEFAULT NULL COMMENT '情绪分', `dim_communication` int DEFAULT NULL COMMENT '沟通分', `dim_marketing` int DEFAULT NULL COMMENT '营销分', `mentor_rewrite` varchar(1000) DEFAULT NULL COMMENT '导师改写', `ai_comment` varchar(1000) DEFAULT NULL COMMENT 'AI点评', `review_advice` varchar(1000) DEFAULT NULL COMMENT '主管复盘建议', `incentive_point` int DEFAULT NULL COMMENT '主管人工贡献分', `satisfaction_score` tinyint DEFAULT NULL COMMENT '员工训练满意度1-5分', `satisfaction_comment` varchar(500) DEFAULT NULL COMMENT '员工训练满意度意见', `summary` varchar(1000) DEFAULT NULL COMMENT '摘要', `dialogue_json` text DEFAULT NULL COMMENT '对练话术JSON', `annotations_json` text DEFAULT NULL COMMENT '逐句标注JSON', `trust_curve` varchar(100) DEFAULT NULL COMMENT '信任曲线', `status` varchar(30) DEFAULT '待复盘' COMMENT '状态', `started_time` datetime DEFAULT NULL COMMENT '开始时间', `finished_time` datetime DEFAULT NULL COMMENT '完成时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_session` (`tenant_id`, `session_id`), KEY `idx_aihr_practice_party` (`tenant_id`, `ext_party_id`, `finished_time`), KEY `idx_aihr_practice_review` (`tenant_id`, `mode`, `status`, `finished_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练记录'; CREATE TABLE IF NOT EXISTS `aihr_practice_annotation` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `session_id` varchar(100) NOT NULL COMMENT '训练会话ID', `turn_index` int NOT NULL COMMENT '话术序号', `source_text` varchar(1000) DEFAULT NULL COMMENT '原话', `issue_text` varchar(1000) DEFAULT NULL COMMENT '问题点', `rewrite_text` varchar(1000) DEFAULT NULL COMMENT '推荐改写', `sop_point` varchar(1000) DEFAULT NULL COMMENT '命中或漏掉的SOP点', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_annotation` (`tenant_id`, `session_id`, `turn_index`), KEY `idx_aihr_practice_annotation_session` (`tenant_id`, `session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练逐句标注'; CREATE TABLE IF NOT EXISTS `aihr_practice_audio` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `session_id` varchar(100) NOT NULL COMMENT '训练会话ID', `turn_index` int NOT NULL COMMENT '话术序号', `role` varchar(30) NOT NULL COMMENT '音频角色', `oss_id` bigint DEFAULT NULL COMMENT 'OSS文件ID', `audio_url` varchar(1000) DEFAULT NULL COMMENT '音频URL', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_audio` (`tenant_id`, `session_id`, `turn_index`, `role`), KEY `idx_aihr_practice_audio_session` (`tenant_id`, `session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练音频'; CREATE TABLE IF NOT EXISTS `aihr_practice_assignment` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `ext_party_id` varchar(100) NOT NULL COMMENT '员工外部主体或手机号', `trainee_name` varchar(100) DEFAULT NULL COMMENT '员工姓名', `scenario_id` varchar(80) NOT NULL COMMENT '场景ID', `scenario_name` varchar(100) DEFAULT NULL COMMENT '场景名称', `source` varchar(30) NOT NULL DEFAULT 'manual' COMMENT '来源 daily/camp/retry/manual', `reason` varchar(500) DEFAULT NULL COMMENT '派发原因', `status` varchar(30) NOT NULL DEFAULT '待训练' COMMENT '状态', `answer_text` varchar(1000) DEFAULT NULL COMMENT '每日三题作答', `feedback` varchar(1000) DEFAULT NULL COMMENT '每日三题反馈', `correct` tinyint DEFAULT NULL COMMENT '是否答对', `finished_time` datetime DEFAULT NULL COMMENT '完成时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_aihr_assignment_party` (`tenant_id`, `ext_party_id`, `status`, `create_time`), KEY `idx_aihr_assignment_source` (`tenant_id`, `source`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练派发任务'; CREATE TABLE IF NOT EXISTS `aihr_practice_calibration` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `session_id` varchar(100) NOT NULL COMMENT '训练会话ID', `reviewer` varchar(100) DEFAULT NULL COMMENT '校准人', `original_score` int DEFAULT NULL COMMENT 'AI原始总分', `corrected_score` int DEFAULT NULL COMMENT '人工校准总分', `corrected_dimensions_json` text DEFAULT NULL COMMENT '校准维度JSON', `reason` varchar(500) DEFAULT NULL COMMENT '校准原因', `status` varchar(30) DEFAULT '已记录' COMMENT '状态', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_aihr_calibration_session` (`tenant_id`, `session_id`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 评分校准记录'; CREATE TABLE IF NOT EXISTS `aihr_practice_scenario` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `scenario_code` varchar(80) NOT NULL COMMENT '场景编码', `scenario_name` varchar(100) NOT NULL COMMENT '场景名称', `position` varchar(80) NOT NULL COMMENT '岗位', `scenario_type` varchar(50) NOT NULL COMMENT '场景类型', `project_type` varchar(80) DEFAULT NULL COMMENT '项目类型', `difficulty` tinyint DEFAULT 1 COMMENT '难度', `customer_persona` varchar(500) DEFAULT NULL COMMENT '业主人设', `opening_text` varchar(500) DEFAULT NULL COMMENT '开场白', `explicit_need` varchar(300) DEFAULT NULL COMMENT '显性诉求', `hidden_need` varchar(300) DEFAULT NULL COMMENT '隐性诉求', `irritants` varchar(500) DEFAULT NULL COMMENT '雷点', `delights` varchar(500) DEFAULT NULL COMMENT '爽点', `sop_refs` varchar(500) DEFAULT NULL COMMENT 'SOP引用', `success_criteria` varchar(500) DEFAULT NULL COMMENT '成功条件', `strategy` varchar(500) DEFAULT NULL COMMENT '训练策略', `goal` varchar(500) DEFAULT NULL COMMENT '训练目标', `trainee_name` varchar(100) DEFAULT '张三' COMMENT '默认学员', `trust_start` int DEFAULT 60 COMMENT '起始信任', `trust_end` int DEFAULT 80 COMMENT '目标信任', `rounds_json` text DEFAULT NULL COMMENT '回合seed JSON', `enabled` tinyint DEFAULT 1 COMMENT '是否启用', `sort_order` int DEFAULT 0 COMMENT '排序', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_scenario` (`tenant_id`, `scenario_code`), KEY `idx_aihr_practice_scenario_filter` (`tenant_id`, `position`, `scenario_type`, `enabled`, `sort_order`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练场景'; CREATE TABLE IF NOT EXISTS `aihr_practice_rubric` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `rubric_code` varchar(100) NOT NULL COMMENT 'Rubric编码', `scenario_code` varchar(80) NOT NULL COMMENT '场景编码', `rubric_name` varchar(100) NOT NULL COMMENT 'Rubric名称', `version` varchar(30) DEFAULT 'v1' COMMENT '版本', `enabled` tinyint DEFAULT 1 COMMENT '是否启用', `description` varchar(500) DEFAULT NULL COMMENT '说明', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_rubric` (`tenant_id`, `rubric_code`), KEY `idx_aihr_practice_rubric_scenario` (`tenant_id`, `scenario_code`, `enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练评分标准'; CREATE TABLE IF NOT EXISTS `aihr_practice_rubric_dimension` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `rubric_code` varchar(100) NOT NULL COMMENT 'Rubric编码', `dimension_code` varchar(50) NOT NULL COMMENT '维度编码', `dimension_name` varchar(50) NOT NULL COMMENT '维度名称', `weight` decimal(5,2) NOT NULL COMMENT '权重', `description` varchar(500) DEFAULT NULL COMMENT '评分说明', `sort_order` int DEFAULT 0 COMMENT '排序', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_practice_rubric_dimension` (`tenant_id`, `rubric_code`, `dimension_code`), KEY `idx_aihr_practice_rubric_dimension` (`tenant_id`, `rubric_code`, `sort_order`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练评分维度'; CREATE TABLE IF NOT EXISTS `aihr_prompt_template` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `code` varchar(80) NOT NULL COMMENT '模板编码', `name` varchar(100) NOT NULL COMMENT '模板名称', `category` varchar(50) NOT NULL COMMENT '业务分类', `output_format` varchar(50) NOT NULL COMMENT '输出文体', `system_prompt` text DEFAULT NULL COMMENT '系统提示词', `template` text NOT NULL COMMENT '用户提示词模板', `variables` varchar(1000) DEFAULT NULL COMMENT '变量清单', `version` varchar(30) DEFAULT 'v1' COMMENT '版本', `enabled` tinyint DEFAULT 1 COMMENT '是否启用', `description` varchar(500) DEFAULT NULL COMMENT '说明', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_prompt_template` (`tenant_id`, `code`, `output_format`, `version`), KEY `idx_aihr_prompt_template_enabled` (`tenant_id`, `code`, `enabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 提示词模板'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_gap` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `query_text` varchar(1000) NOT NULL COMMENT '未命中问题', `category` varchar(100) DEFAULT NULL COMMENT '知识分类', `position` varchar(80) DEFAULT NULL COMMENT '岗位', `source` varchar(50) DEFAULT 'knowledge_search' COMMENT '来源', `status` varchar(30) DEFAULT '待补充' COMMENT '状态', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_aihr_knowledge_gap_status` (`tenant_id`, `status`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识缺口日志'; CREATE TABLE IF NOT EXISTS `aihr_sop_answer_review` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `query_text` varchar(1000) NOT NULL COMMENT '问题', `category` varchar(100) DEFAULT NULL COMMENT '知识分类', `answer_text` varchar(2000) DEFAULT NULL COMMENT '回答', `reference_text` varchar(1000) DEFAULT NULL COMMENT '引用', `snippet_count` int DEFAULT 0 COMMENT '命中片段数', `source` varchar(50) DEFAULT 'knowledge_search' COMMENT '来源', `usable` tinyint DEFAULT NULL COMMENT '人工评审是否可用', `reviewer` varchar(100) DEFAULT NULL COMMENT '评审人', `note` varchar(500) DEFAULT NULL COMMENT '评审备注', `status` varchar(30) DEFAULT '待评审' COMMENT '状态', `reviewed_time` datetime DEFAULT NULL COMMENT '评审时间', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_aihr_sop_answer_review_status` (`tenant_id`, `status`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR SOP问答人工评审'; CREATE TABLE IF NOT EXISTS `aihr_knowledge_answer_feedback` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', `query_text` varchar(1000) NOT NULL COMMENT '问题原文', `query_norm` varchar(500) NOT NULL COMMENT '规范化问题', `fragment_id` bigint NOT NULL COMMENT '知识片段ID', `verdict` varchar(10) NOT NULL COMMENT '反馈: up/down', `category` varchar(100) DEFAULT NULL COMMENT '知识分类', `position` varchar(80) DEFAULT NULL COMMENT '岗位', `source` varchar(50) DEFAULT 'knowledge_search' COMMENT '来源', `review_id` bigint DEFAULT NULL COMMENT '对应SOP问答评审ID', `review_status` varchar(30) DEFAULT '待复核' COMMENT '复核状态', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_answer_feedback_pair` (`tenant_id`, `query_norm`, `fragment_id`), KEY `idx_aihr_answer_feedback_verdict` (`tenant_id`, `query_norm`, `fragment_id`, `verdict`), KEY `idx_aihr_answer_feedback_review` (`tenant_id`, `review_status`, `create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 知识答案反馈'; INSERT INTO `aihr_practice_scenario` (`tenant_id`, `scenario_code`, `scenario_name`, `position`, `scenario_type`, `project_type`, `difficulty`, `customer_persona`, `opening_text`, `explicit_need`, `hidden_need`, `irritants`, `delights`, `sop_refs`, `success_criteria`, `strategy`, `goal`, `trainee_name`, `trust_start`, `trust_end`, `rounds_json`, `enabled`, `sort_order`, `create_time`, `update_time`) VALUES ('000000', 'complaint-water', '客服应对投诉', '生活顾问', '投诉处理', '住宅', 2, '高情绪、追问进度、质疑服务的业主', '你们说今天处理,到现在都没人联系我,这个车库还怎么停?', '投诉车库积水未处理', '想确认物业是否持续跟进', '被敷衍、只讲流程、推给工程', '先安抚、给责任人、给首次反馈时间', '投诉处理SOP;高情绪沟通话术', '先承接情绪,确认点位,给责任人与首次反馈时间,说明升级路径', '仅在漏关键步骤时提示', '训练学员先安抚、再确认诉求,并给出责任人和首次反馈时间。', '张三', 68, 82, '[{"customer":"你们说今天处理,到现在都没人联系我,这个车库还怎么停?","coachHint":"命中安抚、责任人、首次反馈时间后继续追问处理承诺。","emotion":76,"trust":75},{"customer":"我不要流程,我要知道如果今天还处理不好怎么办。","coachHint":"补上升级路径和兜底承诺,可以进入评分。","emotion":64,"trust":82}]', 1, 10, NOW(), NOW()), ('000000', 'complaint-noise', '楼上噪音投诉', '生活顾问', '投诉处理', '住宅', 2, '长期受扰、睡眠受影响、对物业不信任的业主', '楼上每天晚上拖椅子,你们物业到底管不管?', '投诉夜间噪音', '希望物业持续跟踪而不是一次性劝说', '让业主自己协商、说没有执法权、不给反馈节点', '先共情睡眠影响、承诺核实、给回访时间', '噪音投诉SOP;邻里协调SOP', '记录时间段和房号,说明核实方式,约定首次沟通和回访时间', '提示不要先讲权限边界', '训练生活顾问在权限边界内给出可执行跟进。', '张三', 60, 80, '[{"customer":"楼上每天晚上拖椅子,你们物业到底管不管?","coachHint":"先承接睡眠受影响,再收集时间段和楼栋房号。","emotion":78,"trust":66},{"customer":"你别又说去问问,我要看到结果。","coachHint":"给出上门/电话沟通和回访节点,避免空泛承诺。","emotion":70,"trust":80}]', 1, 20, NOW(), NOW()), ('000000', 'complaint-attitude', '服务态度投诉', '生活顾问', '投诉处理', '住宅', 1, '对前台态度不满、要求道歉的业主', '你们前台刚才那是什么态度?我要投诉。', '投诉服务态度', '希望被尊重并看到内部改进', '替同事辩解、追问业主责任、让业主冷静', '先道歉、复述问题、承诺核查和反馈', '服务投诉SOP;客户情绪安抚', '表达歉意,记录经过,明确核查责任人和反馈时限', '提示先道歉不等于先定责', '训练生活顾问把道歉、核查和后续反馈拆开说清。', '张三', 62, 82, '[{"customer":"你们前台刚才那是什么态度?我要投诉。","coachHint":"先为体验道歉,再记录时间、地点和涉及岗位。","emotion":74,"trust":68},{"customer":"你是不是想包庇你同事?","coachHint":"强调会客观核查并按节点反馈,不做现场定责。","emotion":66,"trust":82}]', 1, 30, NOW(), NOW()), ('000000', 'fee-collection', '催缴沟通技巧', '生活顾问', '催费/停车费', '住宅', 2, '拒绝缴费、质疑服务、要求先整改的业主', '服务做成这样还让我缴费?你先把问题解决了再说。', '物业费催缴', '希望服务问题被负责到底', '压缴费、忽略服务问题、威胁停服务', '承接问题、争议复核、缴费与整改并行', '催缴沟通SOP;费用争议处理', '拆分费用和服务问题,说明复核、整改跟进和缴费节点', '提示服务改进与缴费并行', '训练学员把费用沟通和服务整改拆开处理,避免激化争议。', '张三', 61, 76, '[{"customer":"服务做成这样还让我缴费?你先把问题解决了再说。","coachHint":"表达方向正确,但要补争议项复核和责任人。","emotion":72,"trust":68},{"customer":"那我怎么知道你不是随便记一下?","coachHint":"补上主管复核和节点同步,可以进入评分。","emotion":66,"trust":76}]', 1, 40, NOW(), NOW()), ('000000', 'fee-parking', '停车费催缴', '生活顾问', '催费/停车费', '住宅', 2, '对停车费涨价敏感、担心权益受损的业主', '停车费又催,我车位入口问题一直没解决,凭什么交?', '停车费缴费提醒', '希望停车体验问题同步解决', '只重复收费规则、否认问题、催得太硬', '先记录停车问题、说明费用依据、给处理节点', '停车费催缴SOP;停车场服务SOP', '说明费用依据,记录入口问题,给整改反馈时间和缴费办理方式', '提示先服务后收费说明', '训练收费季停车费沟通时的共情和政策表达。', '张三', 58, 78, '[{"customer":"停车费又催,我车位入口问题一直没解决,凭什么交?","coachHint":"先确认入口问题,再说明费用依据和复核方式。","emotion":75,"trust":65},{"customer":"你说的优惠和截止时间到底是什么?","coachHint":"把折扣、截止时间和办理路径一次说清。","emotion":62,"trust":78}]', 1, 50, NOW(), NOW()), ('000000', 'fee-prepay-discount', '预交折扣沟通', '生活顾问', '催费/停车费', '住宅', 2, '精打细算、关注优惠边界和历史欠费的业主', '你们说预交有折扣,那我以前欠的怎么算?', '预交折扣咨询', '希望弄清优惠、欠费和办理路径', '含糊优惠口径、承诺无法兑现、回避欠费', '先说明以系统账单为准、再给办理路径', '预交折扣SOP;历史欠费沟通', '解释预交折扣、历史欠费处理口径和办理材料', '提示金额必须以系统账单为准', '训练收费季预交优惠和历史欠费的稳妥表达。', '张三', 65, 84, '[{"customer":"你们说预交有折扣,那我以前欠的怎么算?","coachHint":"先说明金额以系统账单为准,避免口头承诺具体金额。","emotion":60,"trust":72},{"customer":"我要今天就知道能省多少钱。","coachHint":"给出查询路径和反馈时间,不现场编金额。","emotion":58,"trust":84}]', 1, 60, NOW(), NOW()), ('000000', 'repair-leak-followup', '漏水报修跟进', '生活顾问', '报修跟进', '住宅', 2, '家中受损、担心维修拖延和赔偿的业主', '我家天花还在滴水,报修两天了怎么没人来?', '漏水报修跟进', '希望明确上门时间和后续责任', '只说已派单、不给时限、回避损失记录', '确认安全、给上门时间、记录受损情况', '报修跟进SOP;漏水应急SOP', '确认漏水现状,安排上门节点,记录损失并同步责任人', '提示先排安全风险', '训练报修跟进中的时限、责任人和证据记录。', '张三', 57, 81, '[{"customer":"我家天花还在滴水,报修两天了怎么没人来?","coachHint":"先确认是否仍在漏水和用电安全,再给上门安排。","emotion":77,"trust":64},{"customer":"如果家具泡坏了谁负责?","coachHint":"说明先记录现场和照片,后续按责任认定处理。","emotion":69,"trust":81}]', 1, 70, NOW(), NOW()), ('000000', 'repair-elevator-delay', '电梯故障跟进', '生活顾问', '报修跟进', '住宅', 3, '住高层、老人出行受影响、要求明确恢复时间的业主', '电梯坏了一上午,老人怎么下楼?你们给个准话。', '电梯故障跟进', '希望知道预计恢复和临时协助', '只说维保在路上、没有临时方案、不给播报', '先共情出行影响、说明维保进展、提供临时协助', '电梯故障SOP;应急协助SOP', '说明维保进展、预计反馈时间、老人出行临时协助和公告节奏', '提示不要承诺未经确认的恢复时间', '训练高影响报修的进展播报和临时协助。', '张三', 55, 80, '[{"customer":"电梯坏了一上午,老人怎么下楼?你们给个准话。","coachHint":"先承接老人出行影响,再说明维保进展和下一次反馈。","emotion":80,"trust":62},{"customer":"你就说几点能好。","coachHint":"不能编恢复时间,要承诺确认后反馈并给临时协助。","emotion":72,"trust":80}]', 1, 80, NOW(), NOW()), ('000000', 'repair-public-light', '公区照明维修', '生活顾问', '报修跟进', '住宅', 1, '晚上回家担心安全、希望小问题快处理的业主', '楼道灯坏了三天,晚上黑漆漆的。', '公区照明维修', '希望确认维修时间', '轻视小问题、不给工单、让业主等', '记录点位、给工单和处理时限', '公区维修SOP;夜间安全巡查', '记录楼栋楼层点位,说明派单和反馈时间', '提示给出工单闭环', '训练轻量报修也要闭环表达。', '张三', 66, 86, '[{"customer":"楼道灯坏了三天,晚上黑漆漆的。","coachHint":"记录准确点位,并给派单和预计反馈时间。","emotion":62,"trust":76},{"customer":"别又登记完没下文。","coachHint":"补充工单编号或责任人和回访时间。","emotion":56,"trust":86}]', 1, 90, NOW(), NOW()), ('000000', 'emergency-water-outage', '突发停水求助', '生活顾问', '突发求助', '住宅', 2, '家中有老人小孩、对突发停水焦虑的业主', '家里突然没水了,孩子还要洗澡,怎么回事?', '突发停水求助', '希望知道原因和临时供水办法', '不知道原因就乱猜、只让等待、不给通知渠道', '先核实范围、同步排查、提供临时取水信息', '停水应急SOP;突发通知SOP', '核实是否区域性停水,说明排查进展、通知渠道和临时方案', '提示未知原因时说排查中', '训练突发问题的原因核实和临时安置表达。', '张三', 60, 83, '[{"customer":"家里突然没水了,孩子还要洗澡,怎么回事?","coachHint":"先核实楼栋范围,不要猜测原因。","emotion":73,"trust":68},{"customer":"那现在怎么办?总不能一直等。","coachHint":"给临时取水点或下一次公告时间。","emotion":65,"trust":83}]', 1, 100, NOW(), NOW()), ('000000', 'emergency-elder-fall', '老人摔倒求助', '生活顾问', '突发求助', '住宅', 3, '情绪慌张、需要立即协助的家属', '我爸在楼下摔倒了,你们快来帮忙!', '老人摔倒求助', '希望物业迅速到场并联系救助', '先追责、慢吞吞登记、忽略急救安全', '先确认位置和意识状态、派人到场、建议急救电话', '突发救助SOP;急救协助SOP', '确认位置和安全状态,派人到场,提醒拨打急救电话并联系家属', '提示物业协助不替代专业急救', '训练高紧急求助中的优先级和措辞。', '张三', 52, 79, '[{"customer":"我爸在楼下摔倒了,你们快来帮忙!","coachHint":"先问清准确位置和意识状态,同时安排人员到场。","emotion":88,"trust":60},{"customer":"你们到了能不能处理?","coachHint":"说明会协助保护现场和联系急救,不替代医生判断。","emotion":78,"trust":79}]', 1, 110, NOW(), NOW()), ('000000', 'emergency-security', '陌生人尾随求助', '生活顾问', '突发求助', '住宅', 3, '夜间回家、感到被尾随、需要安全协助的业主', '我刚进小区感觉有人跟着我,你们保安在哪里?', '安全求助', '希望马上获得陪同和安全确认', '要求业主自己确认、轻描淡写、泄露巡逻盲区', '先确认位置、安排安保、保持通话或引导到安全点', '安全巡逻SOP;突发求助SOP', '确认实时位置,安排安保接应,引导到明亮公共区域并保留记录', '提示不要透露安防盲区', '训练夜间安全求助的接警式沟通。', '张三', 54, 82, '[{"customer":"我刚进小区感觉有人跟着我,你们保安在哪里?","coachHint":"先确认当前位置和是否安全,安排安保接应。","emotion":86,"trust":62},{"customer":"我要不要直接回家?","coachHint":"引导到明亮公共区域或岗亭,保持联系。","emotion":76,"trust":82}]', 1, 120, NOW(), NOW()) ON DUPLICATE KEY UPDATE `scenario_name` = VALUES(`scenario_name`), `position` = VALUES(`position`), `scenario_type` = VALUES(`scenario_type`), `project_type` = VALUES(`project_type`), `difficulty` = VALUES(`difficulty`), `customer_persona` = VALUES(`customer_persona`), `opening_text` = VALUES(`opening_text`), `explicit_need` = VALUES(`explicit_need`), `hidden_need` = VALUES(`hidden_need`), `irritants` = VALUES(`irritants`), `delights` = VALUES(`delights`), `sop_refs` = VALUES(`sop_refs`), `success_criteria` = VALUES(`success_criteria`), `strategy` = VALUES(`strategy`), `goal` = VALUES(`goal`), `trainee_name` = VALUES(`trainee_name`), `trust_start` = VALUES(`trust_start`), `trust_end` = VALUES(`trust_end`), `rounds_json` = VALUES(`rounds_json`), `enabled` = VALUES(`enabled`), `sort_order` = VALUES(`sort_order`), `update_time` = VALUES(`update_time`); INSERT INTO `aihr_practice_rubric` (`tenant_id`, `rubric_code`, `scenario_code`, `rubric_name`, `version`, `enabled`, `description`, `create_time`, `update_time`) SELECT `tenant_id`, CONCAT('rubric-', `scenario_code`), `scenario_code`, CONCAT(`scenario_name`, ' Rubric'), 'v1', 1, '生活顾问试点四维评分标准', NOW(), NOW() FROM `aihr_practice_scenario` WHERE `tenant_id` = '000000' ON DUPLICATE KEY UPDATE `rubric_name` = VALUES(`rubric_name`), `scenario_code` = VALUES(`scenario_code`), `enabled` = VALUES(`enabled`), `description` = VALUES(`description`), `update_time` = VALUES(`update_time`); INSERT INTO `aihr_practice_rubric_dimension` (`tenant_id`, `rubric_code`, `dimension_code`, `dimension_name`, `weight`, `description`, `sort_order`, `create_time`, `update_time`) SELECT r.`tenant_id`, r.`rubric_code`, d.`dimension_code`, d.`dimension_name`, CASE WHEN s.`scenario_type` = '催费/停车费' AND d.`dimension_code` = 'compliance' THEN 0.30 WHEN s.`scenario_type` = '催费/停车费' AND d.`dimension_code` = 'marketing' THEN 0.20 ELSE d.`weight` END, d.`description`, d.`sort_order`, NOW(), NOW() FROM `aihr_practice_rubric` r JOIN `aihr_practice_scenario` s ON s.`tenant_id` = r.`tenant_id` AND s.`scenario_code` = r.`scenario_code` JOIN ( SELECT 'compliance' AS `dimension_code`, '合规' AS `dimension_name`, 0.35 AS `weight`, 'SOP关键点、权限边界、承诺口径' AS `description`, 10 AS `sort_order` UNION ALL SELECT 'communication', '沟通', 0.25, '诉求确认、信息结构、反馈节点', 20 UNION ALL SELECT 'emotion', '情绪', 0.25, '共情承接、降温、信任恢复', 30 UNION ALL SELECT 'marketing', '营销', 0.15, '收费季转化、政策解释、办理引导', 40 ) d WHERE r.`tenant_id` = '000000' ON DUPLICATE KEY UPDATE `dimension_name` = VALUES(`dimension_name`), `weight` = VALUES(`weight`), `description` = VALUES(`description`), `sort_order` = VALUES(`sort_order`), `update_time` = VALUES(`update_time`); INSERT INTO `aihr_prompt_template` (`tenant_id`, `code`, `name`, `category`, `output_format`, `system_prompt`, `template`, `variables`, `version`, `enabled`, `description`, `create_time`, `update_time`) VALUES ('000000', 'summary_card', 'SOP总结卡', 'knowledge', 'json_card', '你是物业一线员工的SOP总结卡助手。只返回JSON,不要markdown。固定输出title、steps、objections、scripts、reminders。steps必须且只包含问题、建议、标准三项。', '员工问题:{{queryText}}。知识片段:{{context}}。请生成可拆分展示的总结卡,问题写员工当前要处理的核心问题,建议写下一步动作,标准写SOP依据和红线。', 'queryText,context', 'v1', 1, '总结卡固定问题/建议/标准三段式', NOW(), NOW()), ('000000', 'sop_answer', 'SOP问答直给', 'knowledge', 'json_answer', '你是物业一线员工的SOP助手。只返回 JSON,不要 markdown。字段固定为 answer, keyPoints, cautions。answer 必须结论先行,60字内直接告诉员工现在怎么做;keyPoints 必须是3到5条可执行步骤,每条以「一、」「二、」「三、」「四、」「五、」开头,包含责任人、动作、时限或留痕要求;cautions 是0到3条注意事项或红线。引用片段由系统后置展示,不要在 answer 中堆大段原文。硬约束:只能基于给定片段内容作答,片段中没有的信息不得编造;若片段无法回答问题,answer 固定为「未在已入库 SOP 中找到明确依据」且 keyPoints 为空数组。', '员工的问题:{{queryText}}\n\n检索命中的 SOP 片段:\n{{context}}', 'queryText,context', 'v1', 1, 'SOP问答结论先行+编号步骤+引用后置', NOW(), NOW()), ('000000', 'mentor_rewrite', '导师改写', 'practice', 'text', '你是物业管家带教师傅。只基于本场对话给出一段更稳妥的话术,不评价人格。', '场景:{{scenarioName}}。目标:{{goal}}。员工原话:{{traineeText}}。请改写成可直接说出口的版本,80字以内。', 'scenarioName,goal,traineeText', 'v1', 1, '训练后标杆话术生成', NOW(), NOW()), ('000000', 'review_annotation', '逐句标注', 'practice', 'json_annotation', '你是物业AI陪练复盘教练。只返回JSON数组,每项包含quote、problem、rewrite、sopPoint。', '场景:{{scenarioName}}。Rubric:{{rubric}}。对话:{{dialogue}}。请只标注员工关键句,指出问题、推荐改写和命中或漏掉的SOP点。', 'scenarioName,rubric,dialogue', 'v1', 1, 'finish后逐句标注', NOW(), NOW()), ('000000', 'prep_card', '训练前预习卡', 'practice', 'json_prep', '你是物业培训教练。只返回JSON,字段固定为keyPoints、redLines、scripts。', '场景:{{scenarioName}}。SOP引用:{{sopRefs}}。成功条件:{{successCriteria}}。请生成训练前预习卡:要点3条、红线3条、可说话术2条。', 'scenarioName,sopRefs,successCriteria', 'v1', 1, '训练前卡固定三栏结构', NOW(), NOW()), ('000000', 'supervision_image_analysis_maintenance', '图片督导分析', 'supervision', 'json_card', '你是物业现场督导助手。只返回JSON,字段固定为problem、suggestion、standard。', '图片/视频描述:{{visualText}}。相关标准:{{standard}}。请按问题、建议、标准三段输出,不要扩写无依据内容。', 'visualText,standard', 'v1', 1, '督导图片分析三段式', NOW(), NOW()) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `category` = VALUES(`category`), `system_prompt` = VALUES(`system_prompt`), `template` = VALUES(`template`), `variables` = VALUES(`variables`), `enabled` = VALUES(`enabled`), `description` = VALUES(`description`), `update_time` = VALUES(`update_time`);