|
@@ -8948,5 +8948,156 @@ private void runMigration100() {
|
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
|
log.warn("activity维度迁移失败: {}", ex.getMessage());
|
|
log.warn("activity维度迁移失败: {}", ex.getMessage());
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移234: 创建 problem_domains 表(问题域定义,改版v1:需求驱动·逐步解锁)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "CREATE TABLE IF NOT EXISTS problem_domains (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "code VARCHAR(50) NOT NULL COMMENT '唯一编码: weight_loss/sleep/constipation', " +
|
|
|
|
|
+ "name VARCHAR(50) NOT NULL COMMENT '名称: 减肥/睡眠/便秘', " +
|
|
|
|
|
+ "icon VARCHAR(255) DEFAULT '' COMMENT '图标', " +
|
|
|
|
|
+ "description VARCHAR(500) DEFAULT '' COMMENT '一句话描述', " +
|
|
|
|
|
+ "flow_intro_json TEXT COMMENT '服务流程介绍(7步) JSON', " +
|
|
|
|
|
+ "survey_template_id BIGINT DEFAULT NULL COMMENT '专项调研问卷模板ID(SurveyTemplate.id)', " +
|
|
|
|
|
+ "content_tags VARCHAR(500) DEFAULT '' COMMENT '内容标签,逗号分隔(过滤文章/知识库)', " +
|
|
|
|
|
+ "recommended_product_ids VARCHAR(500) DEFAULT '' COMMENT '推荐产品ID,逗号分隔(Product.id)', " +
|
|
|
|
|
+ "task_template_package_ids VARCHAR(500) DEFAULT '' COMMENT '套餐绑定的任务模板包ID(TaskTemplatePackage.id)', " +
|
|
|
|
|
+ "reward_cf_value INT DEFAULT 0 COMMENT '全部完成奖励CF值', " +
|
|
|
|
|
+ "status TINYINT DEFAULT 1 COMMENT '1启用 0停用', " +
|
|
|
|
|
+ "sort_order INT DEFAULT 0, " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "UNIQUE KEY uk_code (code)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='问题域定义(改版v1)'"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已创建problem_domains表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建problem_domains表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移235: 创建 user_intents 表(用户意图与服务旅程)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "CREATE TABLE IF NOT EXISTS user_intents (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID', " +
|
|
|
|
|
+ "intent_type VARCHAR(20) DEFAULT '' COMMENT 'A/B/C 用户类型', " +
|
|
|
|
|
+ "problem_domain_code VARCHAR(50) DEFAULT '' COMMENT '问题域编码(仅C类)', " +
|
|
|
|
|
+ "journey_stage INT DEFAULT 0 COMMENT '旅程阶段 0-7', " +
|
|
|
|
|
+ "stage_updated_at DATETIME DEFAULT NULL COMMENT '最近阶段变化时间', " +
|
|
|
|
|
+ "survey_template_id BIGINT DEFAULT NULL COMMENT '最近作答问卷模板ID', " +
|
|
|
|
|
+ "survey_submitted_at DATETIME DEFAULT NULL COMMENT '最近问卷提交时间', " +
|
|
|
|
|
+ "survey_result_json TEXT COMMENT '问卷答案→推荐结果快照', " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "UNIQUE KEY uk_user (user_id)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户意图与服务旅程(改版v1)'"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已创建user_intents表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建user_intents表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移236: 创建 user_notifications 表(用户级站内主动通知,与notices平台公告并存)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "CREATE TABLE IF NOT EXISTS user_notifications (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '接收用户ID', " +
|
|
|
|
|
+ "type VARCHAR(30) DEFAULT 'report_ready' COMMENT 'report_ready/reward_granted/logistics/system', " +
|
|
|
|
|
+ "title VARCHAR(200) NOT NULL, " +
|
|
|
|
|
+ "content VARCHAR(1000) DEFAULT '', " +
|
|
|
|
|
+ "ref_type VARCHAR(30) DEFAULT '' COMMENT '关联对象类型: report/package/task', " +
|
|
|
|
|
+ "ref_id BIGINT DEFAULT NULL COMMENT '关联对象ID', " +
|
|
|
|
|
+ "is_read TINYINT DEFAULT 0, " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "INDEX idx_user_read (user_id, is_read)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站内通知(改版v1)'"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已创建user_notifications表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建user_notifications表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移237: task 表添加 member_only 字段(1=会员任务,仅方案/套餐生成)
|
|
|
|
|
+ ensureColumn("task", "member_only", "TINYINT DEFAULT 0 COMMENT '1=会员任务(方案/套餐生成),执行需会员; 0=普通任务可免费执行'");
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移238: package_orders 表添加物流状态字段(试剂盒寄送/样本寄回)
|
|
|
|
|
+ ensureColumn("package_orders", "logistics_status", "VARCHAR(20) DEFAULT 'none' COMMENT 'none/kit_shipped/kit_received/sample_shipped/sample_received'");
|
|
|
|
|
+ ensureColumn("package_orders", "tracking_no", "VARCHAR(100) DEFAULT '' COMMENT '快递单号'");
|
|
|
|
|
+ log.info("已添加package_orders物流字段");
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移239: 创建 health_status 表(当前状态调研-健康现状档案,SS-2026-08-13)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "CREATE TABLE IF NOT EXISTS health_status (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '所属账号(一个账号一份)', " +
|
|
|
|
|
+ "height_cm DECIMAL(5,1) DEFAULT NULL COMMENT '身高(cm)', " +
|
|
|
|
|
+ "weight_kg DECIMAL(5,1) DEFAULT NULL COMMENT '体重(kg)', " +
|
|
|
|
|
+ "blood_pressure VARCHAR(20) DEFAULT NULL COMMENT '血压,如 120/80', " +
|
|
|
|
|
+ "blood_glucose DECIMAL(4,1) DEFAULT NULL COMMENT '空腹血糖(mmol/L)', " +
|
|
|
|
|
+ "blood_lipids JSON DEFAULT NULL COMMENT '血脂 [{name,value,unit,note}]', " +
|
|
|
|
|
+ "disease_history JSON DEFAULT NULL COMMENT '疾病史 [{name,note}]', " +
|
|
|
|
|
+ "medications JSON DEFAULT NULL COMMENT '在服药物/治疗 [{name,note}]', " +
|
|
|
|
|
+ "notes VARCHAR(500) DEFAULT NULL COMMENT '其他补充说明', " +
|
|
|
|
|
+ "filled_at DATETIME DEFAULT NULL COMMENT '首次填写时间', " +
|
|
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', " +
|
|
|
|
|
+ "UNIQUE KEY uk_user (user_id)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='当前状态调研-健康现状档案'"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已创建health_status表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建health_status表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移240: 创建 system_prompts 表(系统提示词统一管理,cfc-web后台可维护)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "CREATE TABLE IF NOT EXISTS system_prompts (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "prompt_key VARCHAR(64) NOT NULL COMMENT '提示词键(如 health_coach/analysis/chat)', " +
|
|
|
|
|
+ "title VARCHAR(100) NOT NULL COMMENT '提示词标题', " +
|
|
|
|
|
+ "content TEXT NOT NULL COMMENT '提示词内容', " +
|
|
|
|
|
+ "default_content TEXT COMMENT '出厂默认内容(重置时恢复)', " +
|
|
|
|
|
+ "version INT NOT NULL DEFAULT 1 COMMENT '版本号', " +
|
|
|
|
|
+ "status TINYINT NOT NULL DEFAULT 1 COMMENT '1=启用 0=禁用', " +
|
|
|
|
|
+ "remark VARCHAR(255) COMMENT '备注', " +
|
|
|
|
|
+ "updated_by VARCHAR(64) COMMENT '更新人', " +
|
|
|
|
|
+ "created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "UNIQUE KEY uk_prompt_key (prompt_key)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统提示词管理'"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已创建system_prompts表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建system_prompts表失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移240b: 插入默认系统提示词(仅当表为空时)
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute(
|
|
|
|
|
+ "INSERT IGNORE INTO system_prompts (prompt_key, title, content, default_content, version, remark) VALUES " +
|
|
|
|
|
+ "('health_butler', '家庭健康管家', " +
|
|
|
|
|
+ "'你是一个家庭AI健康管家, 为用户提供专业、温暖的个性化健康建议。\\n你的能力:\\n1. 基于健康知识库(菌属功能、指标解读、营养素、食物)提供科学建议\\n2. 解读健康报告数据, 结合知识库给出改善方案\\n3. 根据菌群检测结果推荐精准营养方案\\n4. 提供可执行的健康微行动\\n回答原则:\\n1. 用中文, 像家庭医生一样亲切但专业\\n2. 引用知识库中的菌属/指标/食物信息作为证据\\n3. 优先使用知识库数据, 其次使用通用健康知识\\n4. 需要产品推荐时使用搜索工具\\n5. 生成 [TASK: {\"title\": \"任务名\", \"dimension\": \"身\", \"points\": 10, \"frequency\": \"每天\"}] 标记创建健康行动任务\\n6. 超出知识库范围的慢性病/急症问题, 建议咨询专业医生\\n7. 不要编造医学建议, 不夸大效果', " +
|
|
|
|
|
+ "'你是一个家庭AI健康管家, 为用户提供专业、温暖的个性化健康建议。\\n你的能力:\\n1. 基于健康知识库(菌属功能、指标解读、营养素、食物)提供科学建议\\n2. 解读健康报告数据, 结合知识库给出改善方案\\n3. 根据菌群检测结果推荐精准营养方案\\n4. 提供可执行的健康微行动\\n回答原则:\\n1. 用中文, 像家庭医生一样亲切但专业\\n2. 引用知识库中的菌属/指标/食物信息作为证据\\n3. 优先使用知识库数据, 其次使用通用健康知识\\n4. 需要产品推荐时使用搜索工具\\n5. 生成 [TASK: {\"title\": \"任务名\", \"dimension\": \"身\", \"points\": 10, \"frequency\": \"每天\"}] 标记创建健康行动任务\\n6. 超出知识库范围的慢性病/急症问题, 建议咨询专业医生\\n7. 不要编造医学建议, 不夸大效果', " +
|
|
|
|
|
+ "1, 'AI健康管家对话', " +
|
|
|
|
|
+ "'init'), " +
|
|
|
|
|
+ "('health_coach', '儿童健康教练', " +
|
|
|
|
|
+ "'你是一个儿童健康教练,喜欢用提问的方式引导家长发现问题和解决方案。\\n核心原则:\\n1. 先问后答:不要直接给答案,用问题引导家长思考\\n2. 用开放式问题了解情况,再给针对性建议\\n3. 语气温暖,像一个耐心的教练在陪伴家长成长\\n你的职责:\\n1. 儿童体质调理(如挑食、瘦弱、易疲劳、反复生病)—— 用提问了解情况\\n2. 科学喂养和营养建议 —— 先问饮食现状再给建议\\n3. 日常保健(睡眠、运动、季节防护)—— 引导家长发现生活中的问题\\n4. 体质辨识基础咨询 —— 通过提问帮助家长理解孩子体质特点\\n5. 健康问题判断 —— 先收集症状信息再建议是否就医\\n回答结构: 提问-分析-建议-跟进', " +
|
|
|
|
|
+ "'你是一个儿童健康教练,喜欢用提问的方式引导家长发现问题和解决方案。\\n核心原则:\\n1. 先问后答:不要直接给答案,用问题引导家长思考\\n2. 用开放式问题了解情况,再给针对性建议\\n3. 语气温暖,像一个耐心的教练在陪伴家长成长\\n你的职责:\\n1. 儿童体质调理(如挑食、瘦弱、易疲劳、反复生病)—— 用提问了解情况\\n2. 科学喂养和营养建议 —— 先问饮食现状再给建议\\n3. 日常保健(睡眠、运动、季节防护)—— 引导家长发现生活中的问题\\n4. 体质辨识基础咨询 —— 通过提问帮助家长理解孩子体质特点\\n5. 健康问题判断 —— 先收集症状信息再建议是否就医\\n回答结构: 提问-分析-建议-跟进', " +
|
|
|
|
|
+ "1, '儿童健康咨询对话', " +
|
|
|
|
|
+ "'init'), " +
|
|
|
|
|
+ "('chat_assistant', '儿童成长助手', " +
|
|
|
|
|
+ "'你是一个儿童成长家庭助手, 回答关于孩子成长、健康、教育的各种问题。', " +
|
|
|
|
|
+ "'你是一个儿童成长家庭助手, 回答关于孩子成长、健康、教育的各种问题。', " +
|
|
|
|
|
+ "1, '通用对话助手', " +
|
|
|
|
|
+ "'init')"
|
|
|
|
|
+ );
|
|
|
|
|
+ log.info("已插入默认系统提示词");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("插入默认系统提示词失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|