|
@@ -888,7 +888,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
" intro TEXT," +
|
|
" intro TEXT," +
|
|
|
" cover_image VARCHAR(500)," +
|
|
" cover_image VARCHAR(500)," +
|
|
|
" images TEXT," +
|
|
" images TEXT," +
|
|
|
- " price DECIMAL(10,2) NOT NULL DEFAULT 0," +
|
|
|
|
|
|
|
+ " price INT NOT NULL DEFAULT 0 COMMENT '价格(分)'," +
|
|
|
" stock INT NOT NULL DEFAULT 0," +
|
|
" stock INT NOT NULL DEFAULT 0," +
|
|
|
" sales_count INT NOT NULL DEFAULT 0," +
|
|
" sales_count INT NOT NULL DEFAULT 0," +
|
|
|
" product_type VARCHAR(32) NOT NULL COMMENT 'activity/course/physical/digital/service'," +
|
|
" product_type VARCHAR(32) NOT NULL COMMENT 'activity/course/physical/digital/service'," +
|
|
@@ -896,7 +896,8 @@ log.info("已添加template_id列到tasks表");
|
|
|
" vendor_name VARCHAR(100)," +
|
|
" vendor_name VARCHAR(100)," +
|
|
|
" status VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/pending/approved/rejected/on_shelf/off_shelf'," +
|
|
" status VARCHAR(32) NOT NULL DEFAULT 'draft' COMMENT 'draft/pending/approved/rejected/on_shelf/off_shelf'," +
|
|
|
" reject_reason VARCHAR(500)," +
|
|
" reject_reason VARCHAR(500)," +
|
|
|
- " member_price DECIMAL(10,2)," +
|
|
|
|
|
|
|
+ " member_price INT COMMENT '会员价(分)'," +
|
|
|
|
|
+ " profit_rate INT DEFAULT 0 COMMENT '平台利润率(千分比)'," +
|
|
|
" member_eligible VARCHAR(32) DEFAULT 'none' COMMENT 'all/budget/none'," +
|
|
" member_eligible VARCHAR(32) DEFAULT 'none' COMMENT 'all/budget/none'," +
|
|
|
" domain VARCHAR(32) COMMENT 'action/mind/body/wisdom/wealth'," +
|
|
" domain VARCHAR(32) COMMENT 'action/mind/body/wisdom/wealth'," +
|
|
|
" external_source VARCHAR(64)," +
|
|
" external_source VARCHAR(64)," +
|
|
@@ -922,8 +923,8 @@ log.info("已添加template_id列到tasks表");
|
|
|
" buyer_id BIGINT NOT NULL," +
|
|
" buyer_id BIGINT NOT NULL," +
|
|
|
" family_id BIGINT," +
|
|
" family_id BIGINT," +
|
|
|
" quantity INT NOT NULL DEFAULT 1," +
|
|
" quantity INT NOT NULL DEFAULT 1," +
|
|
|
- " unit_price DECIMAL(10,2) NOT NULL," +
|
|
|
|
|
- " total_amount DECIMAL(10,2) NOT NULL," +
|
|
|
|
|
|
|
+ " unit_price INT NOT NULL COMMENT '单价(分)'," +
|
|
|
|
|
+ " total_amount INT NOT NULL COMMENT '总金额(分)'," +
|
|
|
" status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/completed/cancelled/refunded'," +
|
|
" status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/completed/cancelled/refunded'," +
|
|
|
" payment_method VARCHAR(32) COMMENT 'wechat/points/membership'," +
|
|
" payment_method VARCHAR(32) COMMENT 'wechat/points/membership'," +
|
|
|
" remark VARCHAR(500)," +
|
|
" remark VARCHAR(500)," +
|
|
@@ -953,7 +954,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
|
|
|
|
|
// SysConfig 种子数据
|
|
// SysConfig 种子数据
|
|
|
try {
|
|
try {
|
|
|
- insertSysConfigSeed("points_exchange_rate", "0.01", "积分兑换汇率(1积分=0.01元)");
|
|
|
|
|
|
|
+ insertSysConfigSeed("points_exchange_rate", "1", "积分兑换汇率(1积分=1分,即0.01元)");
|
|
|
insertSysConfigSeed("points_deduct_cap", "0.5", "积分抵扣上限(50%)");
|
|
insertSysConfigSeed("points_deduct_cap", "0.5", "积分抵扣上限(50%)");
|
|
|
insertSysConfigSeed("member_fee_standard", "1314", "标准会员年费(元)");
|
|
insertSysConfigSeed("member_fee_standard", "1314", "标准会员年费(元)");
|
|
|
insertSysConfigSeed("member_fee_premium", "3650", "高级会员年费(元)");
|
|
insertSysConfigSeed("member_fee_premium", "3650", "高级会员年费(元)");
|
|
@@ -979,11 +980,11 @@ log.info("已添加template_id列到tasks表");
|
|
|
|
|
|
|
|
// Product 种子数据(5 个示例商品,覆盖全部 5 种 productType)
|
|
// Product 种子数据(5 个示例商品,覆盖全部 5 种 productType)
|
|
|
try {
|
|
try {
|
|
|
- insertProductSeed("亲子关系工作坊", "线下半日工作坊,重建家庭对话模式", "activity", new java.math.BigDecimal("388.00"), "action", "all");
|
|
|
|
|
- insertProductSeed("情绪管理21天训练营", "21天视频课程,识别并管理情绪", "course", new java.math.BigDecimal("199.00"), "mind", "all");
|
|
|
|
|
- insertProductSeed("肠道菌群检测套装", "家用检测 + 报告解读", "physical", new java.math.BigDecimal("599.00"), "body", "budget");
|
|
|
|
|
- insertProductSeed("儿童多模态认知测评", "在线测评 + 个性化建议", "digital", new java.math.BigDecimal("99.00"), "wisdom", "none");
|
|
|
|
|
- insertProductSeed("成长规划师1对1咨询", "60分钟专业规划", "service", new java.math.BigDecimal("500.00"), "wealth", "budget");
|
|
|
|
|
|
|
+ insertProductSeed("亲子关系工作坊", "线下半日工作坊,重建家庭对话模式", "activity", 38800, "action", "all");
|
|
|
|
|
+ insertProductSeed("情绪管理21天训练营", "21天视频课程,识别并管理情绪", "course", 19900, "mind", "all");
|
|
|
|
|
+ insertProductSeed("肠道菌群检测套装", "家用检测 + 报告解读", "physical", 59900, "body", "budget");
|
|
|
|
|
+ insertProductSeed("儿童多模态认知测评", "在线测评 + 个性化建议", "digital", 9900, "wisdom", "none");
|
|
|
|
|
+ insertProductSeed("成长规划师1对1咨询", "60分钟专业规划", "service", 50000, "wealth", "budget");
|
|
|
log.info("Product 种子数据已加载");
|
|
log.info("Product 种子数据已加载");
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.warn("Product 种子数据初始化失败: {}", e.getMessage());
|
|
log.warn("Product 种子数据初始化失败: {}", e.getMessage());
|
|
@@ -1073,7 +1074,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
"SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'products' AND COLUMN_NAME = 'profit_rate'",
|
|
"SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'products' AND COLUMN_NAME = 'profit_rate'",
|
|
|
Integer.class);
|
|
Integer.class);
|
|
|
if (exists == null || exists == 0) {
|
|
if (exists == null || exists == 0) {
|
|
|
- jdbcTemplate.execute("ALTER TABLE products ADD COLUMN profit_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '平台利润率(%)'");
|
|
|
|
|
|
|
+ jdbcTemplate.execute("ALTER TABLE products ADD COLUMN profit_rate INT DEFAULT 0 COMMENT '平台利润率(bps,100=1%)'");
|
|
|
log.info("已添加profit_rate列到products表");
|
|
log.info("已添加profit_rate列到products表");
|
|
|
} else {
|
|
} else {
|
|
|
log.info("profit_rate列已存在,跳过");
|
|
log.info("profit_rate列已存在,跳过");
|
|
@@ -1091,9 +1092,9 @@ log.info("已添加template_id列到tasks表");
|
|
|
"referrer_id BIGINT NOT NULL COMMENT '推荐人ID', " +
|
|
"referrer_id BIGINT NOT NULL COMMENT '推荐人ID', " +
|
|
|
"buyer_id BIGINT NOT NULL COMMENT '购买人ID', " +
|
|
"buyer_id BIGINT NOT NULL COMMENT '购买人ID', " +
|
|
|
"commission_type VARCHAR(16) NOT NULL COMMENT '佣金类型: member/profit', " +
|
|
"commission_type VARCHAR(16) NOT NULL COMMENT '佣金类型: member/profit', " +
|
|
|
- "order_amount DECIMAL(10,2) NOT NULL COMMENT '订单金额', " +
|
|
|
|
|
- "profit_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '利润率(%)', " +
|
|
|
|
|
- "commission_amount DECIMAL(10,2) NOT NULL COMMENT '佣金金额', " +
|
|
|
|
|
|
|
+ "order_amount INT NOT NULL COMMENT '订单金额(分)', " +
|
|
|
|
|
+ "profit_rate INT DEFAULT 0 COMMENT '利润率(bps,100=1%)', " +
|
|
|
|
|
+ "commission_amount INT NOT NULL COMMENT '佣金金额(分)', " +
|
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'settled' COMMENT '状态: pending/settled', " +
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'settled' COMMENT '状态: pending/settled', " +
|
|
|
"remark VARCHAR(255) DEFAULT NULL, " +
|
|
"remark VARCHAR(255) DEFAULT NULL, " +
|
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
@@ -1111,7 +1112,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS withdrawal_requests (" +
|
|
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS withdrawal_requests (" +
|
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
"user_id BIGINT NOT NULL COMMENT '用户ID', " +
|
|
"user_id BIGINT NOT NULL COMMENT '用户ID', " +
|
|
|
- "amount DECIMAL(10,2) NOT NULL COMMENT '提现金额', " +
|
|
|
|
|
|
|
+ "amount INT NOT NULL COMMENT '提现金额(分)', " +
|
|
|
"account_info TEXT COMMENT '账户信息(JSON)', " +
|
|
"account_info TEXT COMMENT '账户信息(JSON)', " +
|
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '状态: pending/approved/rejected', " +
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '状态: pending/approved/rejected', " +
|
|
|
"audit_by BIGINT DEFAULT NULL COMMENT '审核人ID', " +
|
|
"audit_by BIGINT DEFAULT NULL COMMENT '审核人ID', " +
|
|
@@ -1283,7 +1284,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
"source_id BIGINT NOT NULL COMMENT '来源业务表ID', " +
|
|
"source_id BIGINT NOT NULL COMMENT '来源业务表ID', " +
|
|
|
"source_name VARCHAR(200) COMMENT '冗余名称', " +
|
|
"source_name VARCHAR(200) COMMENT '冗余名称', " +
|
|
|
"dimension_id BIGINT NOT NULL COMMENT '维度ID', " +
|
|
"dimension_id BIGINT NOT NULL COMMENT '维度ID', " +
|
|
|
- "ratio DECIMAL(5,4) NOT NULL COMMENT '占比如0.6000=60%', " +
|
|
|
|
|
|
|
+ "ratio INT NOT NULL COMMENT '占比(bps,10000=100%)', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"INDEX idx_source (source_type, source_id)" +
|
|
"INDEX idx_source (source_type, source_id)" +
|
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务-维度比例配置表'"
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务-维度比例配置表'"
|
|
@@ -1366,7 +1367,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
for (String[] mapping : domainMapping) {
|
|
for (String[] mapping : domainMapping) {
|
|
|
jdbcTemplate.execute(
|
|
jdbcTemplate.execute(
|
|
|
"INSERT INTO energy_source_config (source_type, source_id, source_name, dimension_id, ratio) " +
|
|
"INSERT INTO energy_source_config (source_type, source_id, source_name, dimension_id, ratio) " +
|
|
|
- "SELECT 'product', p.id, p.name, d.id, 1.0000 " +
|
|
|
|
|
|
|
+ "SELECT 'product', p.id, p.name, d.id, 10000 " +
|
|
|
"FROM products p " +
|
|
"FROM products p " +
|
|
|
"JOIN energy_dimension d ON d.code = '" + mapping[1] + "' " +
|
|
"JOIN energy_dimension d ON d.code = '" + mapping[1] + "' " +
|
|
|
"WHERE p.domain = '" + mapping[0] + "' " +
|
|
"WHERE p.domain = '" + mapping[0] + "' " +
|
|
@@ -1382,6 +1383,58 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("初始化商品能量比例配置失败: {}", e.getMessage());
|
|
log.warn("初始化商品能量比例配置失败: {}", e.getMessage());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // ==================== 精准营养 P0: health_report_survey ====================
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_report_survey (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "report_id BIGINT NOT NULL COMMENT '关联报告ID', " +
|
|
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID', " +
|
|
|
|
|
+ "child_id BIGINT NOT NULL COMMENT '孩子ID', " +
|
|
|
|
|
+ "survey_data JSON COMMENT '调研问卷结果JSON', " +
|
|
|
|
|
+ "status VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending/completed', " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "UNIQUE KEY uk_report (report_id)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报告调研问卷'");
|
|
|
|
|
+ log.info("已创建 health_report_survey 表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建 health_report_survey 表失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ==================== 精准营养 P0: health_gut_flora + health_disease_risk ====================
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_gut_flora (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "report_id BIGINT NOT NULL COMMENT '关联报告ID', " +
|
|
|
|
|
+ "bacteria_name VARCHAR(100) NOT NULL COMMENT '菌种名称', " +
|
|
|
|
|
+ "bacteria_value VARCHAR(50) COMMENT '菌种丰度值', " +
|
|
|
|
|
+ "normal_range VARCHAR(100) COMMENT '正常范围', " +
|
|
|
|
|
+ "status VARCHAR(20) COMMENT '状态: 正常/偏低/偏高', " +
|
|
|
|
|
+ "category VARCHAR(50) COMMENT '分类: 有益菌/有害菌/中性菌', " +
|
|
|
|
|
+ "sort_order INT DEFAULT 0 COMMENT '排序', " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "INDEX idx_report (report_id)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菌群检测专项数据'");
|
|
|
|
|
+ log.info("已创建 health_gut_flora 表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建 health_gut_flora 表失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_disease_risk (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "report_id BIGINT NOT NULL COMMENT '关联报告ID', " +
|
|
|
|
|
+ "disease_name VARCHAR(100) NOT NULL COMMENT '疾病名称', " +
|
|
|
|
|
+ "risk_value VARCHAR(50) COMMENT '风险值(0-1)', " +
|
|
|
|
|
+ "risk_level VARCHAR(20) COMMENT '风险等级: 高风险/需注意/低风险', " +
|
|
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
|
|
+ "INDEX idx_report (report_id)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疾病风险评估数据'");
|
|
|
|
|
+ log.info("已创建 health_disease_risk 表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建 health_disease_risk 表失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// ==================== 迁移: guides 表统一 ====================
|
|
// ==================== 迁移: guides 表统一 ====================
|
|
|
|
|
|
|
|
// 迁移: guides 添加 type 字段(区分服务商类型)
|
|
// 迁移: guides 添加 type 字段(区分服务商类型)
|
|
@@ -1415,7 +1468,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
} catch (Exception e) {}
|
|
} catch (Exception e) {}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN rating DECIMAL(3,2) DEFAULT 5.00 COMMENT '评分'");
|
|
|
|
|
|
|
+ jdbcTemplate.execute("ALTER TABLE guides ADD COLUMN rating INT DEFAULT 500 COMMENT '评分(百分位,500=5.00)'");
|
|
|
} catch (Exception e) {}
|
|
} catch (Exception e) {}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
@@ -1515,6 +1568,27 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("检查/添加 dan_assessment_results EMI 心理子维度字段失败: {}", e.getMessage());
|
|
log.warn("检查/添加 dan_assessment_results EMI 心理子维度字段失败: {}", e.getMessage());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 迁移: dan_assessment_results 表添加大五人格维度字段
|
|
|
|
|
+ try {
|
|
|
|
|
+ Integer colExists = jdbcTemplate.queryForObject(
|
|
|
|
|
+ "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'dan_assessment_results' AND COLUMN_NAME = 'openness_score'",
|
|
|
|
|
+ Integer.class);
|
|
|
|
|
+ if (colExists == null || colExists == 0) {
|
|
|
|
|
+ jdbcTemplate.execute("ALTER TABLE dan_assessment_results " +
|
|
|
|
|
+ "ADD COLUMN openness_score INT COMMENT '开放性(0-100)', " +
|
|
|
|
|
+ "ADD COLUMN conscientiousness_score INT COMMENT '尽责性(0-100)', " +
|
|
|
|
|
+ "ADD COLUMN extraversion_score INT COMMENT '外向性(0-100)', " +
|
|
|
|
|
+ "ADD COLUMN agreeableness_score INT COMMENT '宜人性(0-100)', " +
|
|
|
|
|
+ "ADD COLUMN neuroticism_score INT COMMENT '神经质(0-100)', " +
|
|
|
|
|
+ "ADD COLUMN big_five_overall_score INT COMMENT '大五人格综合分'");
|
|
|
|
|
+ log.info("已为 dan_assessment_results 表添加大五人格维度字段");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.info("dan_assessment_results 大五人格维度字段已存在,跳过");
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("检查/添加 dan_assessment_results 大五人格维度字段失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 迁移: users 表添加出生时辰字段
|
|
// 迁移: users 表添加出生时辰字段
|
|
|
try {
|
|
try {
|
|
|
jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birth_hour VARCHAR(10) COMMENT '出生时辰: 子丑寅卯辰巳午未申酉戌亥'");
|
|
jdbcTemplate.execute("ALTER TABLE users ADD COLUMN birth_hour VARCHAR(10) COMMENT '出生时辰: 子丑寅卯辰巳午未申酉戌亥'");
|
|
@@ -1541,8 +1615,8 @@ log.info("已添加template_id列到tasks表");
|
|
|
"wuxing_elements JSON COMMENT '五行星盘元素JSON', " +
|
|
"wuxing_elements JSON COMMENT '五行星盘元素JSON', " +
|
|
|
"zodiac VARCHAR(16) COMMENT '生肖: rat/ox/tiger/rabbit/dragon/snake/horse/sheep/monkey/rooster/dog/pig', " +
|
|
"zodiac VARCHAR(16) COMMENT '生肖: rat/ox/tiger/rabbit/dragon/snake/horse/sheep/monkey/rooster/dog/pig', " +
|
|
|
"blood_type VARCHAR(5) COMMENT '血型: A/B/AB/O', " +
|
|
"blood_type VARCHAR(5) COMMENT '血型: A/B/AB/O', " +
|
|
|
- "mind_base_score DECIMAL(5,2) DEFAULT 0 COMMENT '心维度基础分(先天)', " +
|
|
|
|
|
- "wisdom_base_score DECIMAL(5,2) DEFAULT 0 COMMENT '智维度基础分(先天)', " +
|
|
|
|
|
|
|
+ "mind_base_score INT DEFAULT 0 COMMENT '心维度基础分(百分位,500=5.00)', " +
|
|
|
|
|
+ "wisdom_base_score INT DEFAULT 0 COMMENT '智维度基础分(百分位,500=5.00)', " +
|
|
|
"behavior_modifier JSON COMMENT '行为修正因子JSON', " +
|
|
"behavior_modifier JSON COMMENT '行为修正因子JSON', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
@@ -1616,9 +1690,9 @@ log.info("已添加template_id列到tasks表");
|
|
|
"description TEXT COMMENT '商品详细描述', " +
|
|
"description TEXT COMMENT '商品详细描述', " +
|
|
|
"cover_image VARCHAR(512) COMMENT '封面图URL', " +
|
|
"cover_image VARCHAR(512) COMMENT '封面图URL', " +
|
|
|
"images TEXT COMMENT '多图(JSON数组)', " +
|
|
"images TEXT COMMENT '多图(JSON数组)', " +
|
|
|
- "price DECIMAL(10,2) NOT NULL COMMENT '售价(元)', " +
|
|
|
|
|
- "member_price DECIMAL(10,2) DEFAULT NULL COMMENT '会员价', " +
|
|
|
|
|
- "cost_price DECIMAL(10,2) DEFAULT NULL COMMENT '成本价', " +
|
|
|
|
|
|
|
+ "price INT NOT NULL COMMENT '售价(分)', " +
|
|
|
|
|
+ "member_price INT DEFAULT NULL COMMENT '会员价(分)', " +
|
|
|
|
|
+ "cost_price INT DEFAULT NULL COMMENT '成本价(分)', " +
|
|
|
"stock INT DEFAULT 0 COMMENT '库存数量', " +
|
|
"stock INT DEFAULT 0 COMMENT '库存数量', " +
|
|
|
"sales_count INT DEFAULT 0 COMMENT '销量', " +
|
|
"sales_count INT DEFAULT 0 COMMENT '销量', " +
|
|
|
"product_type VARCHAR(32) NOT NULL COMMENT '类型: physical/virtual/coupon/course', " +
|
|
"product_type VARCHAR(32) NOT NULL COMMENT '类型: physical/virtual/coupon/course', " +
|
|
@@ -1626,7 +1700,7 @@ log.info("已添加template_id列到tasks表");
|
|
|
"vendor_name VARCHAR(64) COMMENT '供应商名称', " +
|
|
"vendor_name VARCHAR(64) COMMENT '供应商名称', " +
|
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/approved/rejected/on_shelf/off_shelf', " +
|
|
"status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/approved/rejected/on_shelf/off_shelf', " +
|
|
|
"reject_reason VARCHAR(255) DEFAULT NULL COMMENT '审核拒绝原因', " +
|
|
"reject_reason VARCHAR(255) DEFAULT NULL COMMENT '审核拒绝原因', " +
|
|
|
- "profit_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '平台利润率(%)', " +
|
|
|
|
|
|
|
+ "profit_rate INT DEFAULT 0 COMMENT '平台利润率(bps,100=1%)', " +
|
|
|
"external_source VARCHAR(32) COMMENT '外部商品来源', " +
|
|
"external_source VARCHAR(32) COMMENT '外部商品来源', " +
|
|
|
"external_id VARCHAR(64) COMMENT '外部商品ID', " +
|
|
"external_id VARCHAR(64) COMMENT '外部商品ID', " +
|
|
|
"external_data TEXT COMMENT '外部商品完整数据(JSON)', " +
|
|
"external_data TEXT COMMENT '外部商品完整数据(JSON)', " +
|
|
@@ -1648,9 +1722,9 @@ log.info("已添加template_id列到tasks表");
|
|
|
"order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号(DS+时间戳+6位随机)', " +
|
|
"order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号(DS+时间戳+6位随机)', " +
|
|
|
"buyer_id BIGINT NOT NULL COMMENT '买家ID', " +
|
|
"buyer_id BIGINT NOT NULL COMMENT '买家ID', " +
|
|
|
"family_id BIGINT DEFAULT NULL COMMENT '家庭ID', " +
|
|
"family_id BIGINT DEFAULT NULL COMMENT '家庭ID', " +
|
|
|
- "total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额(标价)', " +
|
|
|
|
|
- "discount_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '优惠金额', " +
|
|
|
|
|
- "actual_amount DECIMAL(10,2) NOT NULL COMMENT '实付金额', " +
|
|
|
|
|
|
|
+ "total_amount INT NOT NULL COMMENT '订单总金额(分)', " +
|
|
|
|
|
+ "discount_amount INT DEFAULT 0 COMMENT '优惠金额(分)', " +
|
|
|
|
|
+ "actual_amount INT NOT NULL COMMENT '实付金额(分)', " +
|
|
|
"status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/shipped/completed/refunding/refunded/cancelled', " +
|
|
"status VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/paid/shipped/completed/refunding/refunded/cancelled', " +
|
|
|
"payment_method VARCHAR(16) DEFAULT 'wechat' COMMENT 'wechat/alipay', " +
|
|
"payment_method VARCHAR(16) DEFAULT 'wechat' COMMENT 'wechat/alipay', " +
|
|
|
"transaction_id VARCHAR(64) DEFAULT NULL COMMENT '微信/支付宝交易号', " +
|
|
"transaction_id VARCHAR(64) DEFAULT NULL COMMENT '微信/支付宝交易号', " +
|
|
@@ -1662,8 +1736,8 @@ log.info("已添加template_id列到tasks表");
|
|
|
"receiver_name VARCHAR(32) DEFAULT NULL COMMENT '收件人姓名', " +
|
|
"receiver_name VARCHAR(32) DEFAULT NULL COMMENT '收件人姓名', " +
|
|
|
"receiver_phone VARCHAR(16) DEFAULT NULL COMMENT '收件人电话', " +
|
|
"receiver_phone VARCHAR(16) DEFAULT NULL COMMENT '收件人电话', " +
|
|
|
"receiver_address VARCHAR(256) DEFAULT NULL COMMENT '收件人地址', " +
|
|
"receiver_address VARCHAR(256) DEFAULT NULL COMMENT '收件人地址', " +
|
|
|
- "freight DECIMAL(10,2) DEFAULT 0.00 COMMENT '运费', " +
|
|
|
|
|
- "profit_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '分润金额', " +
|
|
|
|
|
|
|
+ "freight INT DEFAULT 0 COMMENT '运费(分)', " +
|
|
|
|
|
+ "profit_amount INT DEFAULT 0 COMMENT '分润金额(分)', " +
|
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
"updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
"INDEX idx_buyer (buyer_id), " +
|
|
"INDEX idx_buyer (buyer_id), " +
|
|
@@ -1684,10 +1758,10 @@ log.info("已添加template_id列到tasks表");
|
|
|
"product_id BIGINT NOT NULL COMMENT '商品ID', " +
|
|
"product_id BIGINT NOT NULL COMMENT '商品ID', " +
|
|
|
"product_name VARCHAR(128) NOT NULL COMMENT '商品名称(快照)', " +
|
|
"product_name VARCHAR(128) NOT NULL COMMENT '商品名称(快照)', " +
|
|
|
"cover_image VARCHAR(512) COMMENT '封面图(快照)', " +
|
|
"cover_image VARCHAR(512) COMMENT '封面图(快照)', " +
|
|
|
- "unit_price DECIMAL(10,2) NOT NULL COMMENT '单价(快照)', " +
|
|
|
|
|
- "price DECIMAL(10,2) NOT NULL COMMENT '单价(别名,兼容)', " +
|
|
|
|
|
|
|
+ "unit_price INT NOT NULL COMMENT '单价(分,快照)', " +
|
|
|
|
|
+ "price INT NOT NULL COMMENT '单价(分,别名兼容)', " +
|
|
|
"quantity INT NOT NULL DEFAULT 1 COMMENT '购买数量', " +
|
|
"quantity INT NOT NULL DEFAULT 1 COMMENT '购买数量', " +
|
|
|
- "subtotal DECIMAL(10,2) NOT NULL COMMENT '小计', " +
|
|
|
|
|
|
|
+ "subtotal INT NOT NULL COMMENT '小计(分)', " +
|
|
|
"product_type VARCHAR(32) COMMENT '商品类型(快照)', " +
|
|
"product_type VARCHAR(32) COMMENT '商品类型(快照)', " +
|
|
|
"vendor_id BIGINT COMMENT '供应商ID(快照)', " +
|
|
"vendor_id BIGINT COMMENT '供应商ID(快照)', " +
|
|
|
"vendor_name VARCHAR(64) COMMENT '供应商名称(快照)', " +
|
|
"vendor_name VARCHAR(64) COMMENT '供应商名称(快照)', " +
|
|
@@ -1754,10 +1828,10 @@ log.info("已添加template_id列到tasks表");
|
|
|
"rule_name VARCHAR(64) NOT NULL COMMENT '规则名称', " +
|
|
"rule_name VARCHAR(64) NOT NULL COMMENT '规则名称', " +
|
|
|
"rule_type VARCHAR(32) NOT NULL COMMENT '规则类型: product_category/vendor_level/global', " +
|
|
"rule_type VARCHAR(32) NOT NULL COMMENT '规则类型: product_category/vendor_level/global', " +
|
|
|
"target_id BIGINT DEFAULT NULL COMMENT '关联目标ID', " +
|
|
"target_id BIGINT DEFAULT NULL COMMENT '关联目标ID', " +
|
|
|
- "platform_profit_rate DECIMAL(5,2) NOT NULL COMMENT '平台利润率(%)', " +
|
|
|
|
|
- "referrer_l1_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '直接推荐人分润比例(占利润%)', " +
|
|
|
|
|
- "referrer_l2_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '间接推荐人分润比例(占利润%)', " +
|
|
|
|
|
- "platform_service_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '平台服务费率(占订单金额%)', " +
|
|
|
|
|
|
|
+ "platform_profit_rate INT NOT NULL COMMENT '平台利润率(bps,100=1%)', " +
|
|
|
|
|
+ "referrer_l1_rate INT DEFAULT 0 COMMENT '直接推荐人分润比例(bps,占利润%)', " +
|
|
|
|
|
+ "referrer_l2_rate INT DEFAULT 0 COMMENT '间接推荐人分润比例(bps,占利润%)', " +
|
|
|
|
|
+ "platform_service_rate INT DEFAULT 0 COMMENT '平台服务费率(bps,占订单金额%)', " +
|
|
|
"is_active INT DEFAULT 1 COMMENT '1启用/0禁用', " +
|
|
"is_active INT DEFAULT 1 COMMENT '1启用/0禁用', " +
|
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
"updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
@@ -1775,13 +1849,13 @@ log.info("已添加template_id列到tasks表");
|
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
"order_id BIGINT NOT NULL COMMENT '订单ID', " +
|
|
"order_id BIGINT NOT NULL COMMENT '订单ID', " +
|
|
|
"order_no VARCHAR(32) NOT NULL COMMENT '订单号', " +
|
|
"order_no VARCHAR(32) NOT NULL COMMENT '订单号', " +
|
|
|
- "order_amount DECIMAL(10,2) NOT NULL COMMENT '订单实付金额', " +
|
|
|
|
|
- "cost_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '成本金额', " +
|
|
|
|
|
- "profit_amount DECIMAL(10,2) NOT NULL COMMENT '利润金额', " +
|
|
|
|
|
- "platform_retained DECIMAL(10,2) NOT NULL COMMENT '平台留存金额', " +
|
|
|
|
|
- "vendor_income DECIMAL(10,2) NOT NULL COMMENT '供应商实收金额', " +
|
|
|
|
|
- "commission_l1 DECIMAL(10,2) DEFAULT 0.00 COMMENT 'L1推荐人佣金', " +
|
|
|
|
|
- "commission_l2 DECIMAL(10,2) DEFAULT 0.00 COMMENT 'L2推荐人佣金', " +
|
|
|
|
|
|
|
+ "order_amount INT NOT NULL COMMENT '订单实付金额(分)', " +
|
|
|
|
|
+ "cost_amount INT DEFAULT 0 COMMENT '成本金额(分)', " +
|
|
|
|
|
+ "profit_amount INT NOT NULL COMMENT '利润金额(分)', " +
|
|
|
|
|
+ "platform_retained INT NOT NULL COMMENT '平台留存金额(分)', " +
|
|
|
|
|
+ "vendor_income INT NOT NULL COMMENT '供应商实收金额(分)', " +
|
|
|
|
|
+ "commission_l1 INT DEFAULT 0 COMMENT 'L1推荐人佣金(分)', " +
|
|
|
|
|
+ "commission_l2 INT DEFAULT 0 COMMENT 'L2推荐人佣金(分)', " +
|
|
|
"rule_id BIGINT DEFAULT NULL COMMENT '使用的分润规则ID', " +
|
|
"rule_id BIGINT DEFAULT NULL COMMENT '使用的分润规则ID', " +
|
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"INDEX idx_order (order_id), " +
|
|
"INDEX idx_order (order_id), " +
|
|
@@ -1829,6 +1903,21 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("创建 danshop_addresses 表失败: {}", e.getMessage());
|
|
log.warn("创建 danshop_addresses 表失败: {}", e.getMessage());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // ==================== 迁移: activities表添加visible_scope列 ====================
|
|
|
|
|
+ try {
|
|
|
|
|
+ Integer colExists = jdbcTemplate.queryForObject(
|
|
|
|
|
+ "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'visible_scope'",
|
|
|
|
|
+ Integer.class);
|
|
|
|
|
+ if (colExists == null || colExists == 0) {
|
|
|
|
|
+ jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visible_scope VARCHAR(20) DEFAULT NULL COMMENT '可见范围: family(家庭)/role(角色)/user(用户)' AFTER visibility");
|
|
|
|
|
+ log.info("已添加visible_scope列到activities表");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.info("activities表visible_scope列已存在,跳过");
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("检查/添加activities表visible_scope列失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
log.info("数据库迁移完成");
|
|
log.info("数据库迁移完成");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2170,7 +2259,7 @@ try {
|
|
|
"content TEXT COMMENT '富文本内容', " +
|
|
"content TEXT COMMENT '富文本内容', " +
|
|
|
"duration INT COMMENT '建议时长(分钟)', " +
|
|
"duration INT COMMENT '建议时长(分钟)', " +
|
|
|
"age_range VARCHAR(50) COMMENT '适用年龄', " +
|
|
"age_range VARCHAR(50) COMMENT '适用年龄', " +
|
|
|
- "price DECIMAL(10,2) COMMENT '参考价格', " +
|
|
|
|
|
|
|
+ "price INT COMMENT '参考价格(分)', " +
|
|
|
"status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT/ACTIVE', " +
|
|
"status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT/ACTIVE', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
|
|
"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
|
|
@@ -2185,8 +2274,8 @@ try {
|
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
"name VARCHAR(100) NOT NULL COMMENT '模板名称', " +
|
|
"name VARCHAR(100) NOT NULL COMMENT '模板名称', " +
|
|
|
"validity_months INT COMMENT '有效期(月)', " +
|
|
"validity_months INT COMMENT '有效期(月)', " +
|
|
|
- "reference_price DECIMAL(10,2) COMMENT '参考价格', " +
|
|
|
|
|
- "min_price DECIMAL(10,2) COMMENT '最低售价', " +
|
|
|
|
|
|
|
+ "reference_price INT COMMENT '参考价格(分)', " +
|
|
|
|
|
+ "min_price INT COMMENT '最低售价(分)', " +
|
|
|
"description VARCHAR(500) COMMENT '说明', " +
|
|
"description VARCHAR(500) COMMENT '说明', " +
|
|
|
"status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/DISABLED', " +
|
|
"status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/DISABLED', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
@@ -2216,7 +2305,7 @@ try {
|
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
|
"template_id BIGINT COMMENT '关联模板', " +
|
|
"template_id BIGINT COMMENT '关联模板', " +
|
|
|
"name VARCHAR(100) NOT NULL COMMENT '套餐名称', " +
|
|
"name VARCHAR(100) NOT NULL COMMENT '套餐名称', " +
|
|
|
- "price DECIMAL(10,2) NOT NULL COMMENT '销售价格', " +
|
|
|
|
|
|
|
+ "price INT NOT NULL COMMENT '销售价格(分)', " +
|
|
|
"validity_months INT COMMENT '有效期(月)', " +
|
|
"validity_months INT COMMENT '有效期(月)', " +
|
|
|
"description VARCHAR(500) COMMENT '套餐说明', " +
|
|
"description VARCHAR(500) COMMENT '套餐说明', " +
|
|
|
"status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT/PUBLISHED/PAUSED', " +
|
|
"status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT/PUBLISHED/PAUSED', " +
|
|
@@ -2241,7 +2330,7 @@ try {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN commission_rate DECIMAL(5,2) COMMENT '佣金比例' AFTER package_id");
|
|
|
|
|
|
|
+ jdbcTemplate.execute("ALTER TABLE guide_packages ADD COLUMN commission_rate INT COMMENT '佣金比例(bps,100=1%)' AFTER package_id");
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2294,7 +2383,7 @@ try {
|
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
|
"family_id BIGINT NOT NULL COMMENT '家庭ID', " +
|
|
"family_id BIGINT NOT NULL COMMENT '家庭ID', " +
|
|
|
"package_id BIGINT NOT NULL COMMENT '套餐ID', " +
|
|
"package_id BIGINT NOT NULL COMMENT '套餐ID', " +
|
|
|
- "amount DECIMAL(10,2) NOT NULL COMMENT '金额', " +
|
|
|
|
|
|
|
+ "amount INT NOT NULL COMMENT '金额(分)', " +
|
|
|
"status VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态:PENDING/PAID/COMPLETED/REFUNDED', " +
|
|
"status VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态:PENDING/PAID/COMPLETED/REFUNDED', " +
|
|
|
"pay_time DATETIME COMMENT '支付时间', " +
|
|
"pay_time DATETIME COMMENT '支付时间', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
@@ -2310,8 +2399,8 @@ try {
|
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
"teacher_id BIGINT NOT NULL COMMENT '成长规划师ID', " +
|
|
|
"order_id BIGINT NOT NULL COMMENT '订单ID', " +
|
|
"order_id BIGINT NOT NULL COMMENT '订单ID', " +
|
|
|
- "amount DECIMAL(10,2) NOT NULL COMMENT '佣金金额', " +
|
|
|
|
|
- "rate DECIMAL(5,2) COMMENT '佣金比例', " +
|
|
|
|
|
|
|
+ "amount INT NOT NULL COMMENT '佣金金额(分)', " +
|
|
|
|
|
+ "rate INT COMMENT '佣金比例(bps,100=1%)', " +
|
|
|
"status VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态:PENDING/COMPLETED', " +
|
|
"status VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态:PENDING/COMPLETED', " +
|
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
|
|
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP" +
|
|
|
")");
|
|
")");
|
|
@@ -2370,7 +2459,7 @@ try {
|
|
|
"child_id BIGINT NOT NULL COMMENT '孩子ID', " +
|
|
"child_id BIGINT NOT NULL COMMENT '孩子ID', " +
|
|
|
"checkin_type VARCHAR(20) NOT NULL COMMENT '打卡类型: daily_plan/saving/expense/review', " +
|
|
"checkin_type VARCHAR(20) NOT NULL COMMENT '打卡类型: daily_plan/saving/expense/review', " +
|
|
|
"checkin_date DATE NOT NULL COMMENT '打卡日期', " +
|
|
"checkin_date DATE NOT NULL COMMENT '打卡日期', " +
|
|
|
- "amount DECIMAL(10,2) COMMENT '金额(收支记录)', " +
|
|
|
|
|
|
|
+ "amount INT COMMENT '金额(分,收支记录)', " +
|
|
|
"category VARCHAR(50) COMMENT '收支分类', " +
|
|
"category VARCHAR(50) COMMENT '收支分类', " +
|
|
|
"note VARCHAR(200) COMMENT '备注', " +
|
|
"note VARCHAR(200) COMMENT '备注', " +
|
|
|
"mood VARCHAR(20) COMMENT '心情', " +
|
|
"mood VARCHAR(20) COMMENT '心情', " +
|
|
@@ -2394,8 +2483,8 @@ try {
|
|
|
"insurance_company VARCHAR(100) COMMENT '保险公司', " +
|
|
"insurance_company VARCHAR(100) COMMENT '保险公司', " +
|
|
|
"policy_type VARCHAR(50) COMMENT '保单类型: medical/life/accident/education/endowment', " +
|
|
"policy_type VARCHAR(50) COMMENT '保单类型: medical/life/accident/education/endowment', " +
|
|
|
"insured_person VARCHAR(50) NOT NULL COMMENT '被保人姓名', " +
|
|
"insured_person VARCHAR(50) NOT NULL COMMENT '被保人姓名', " +
|
|
|
- "premium DECIMAL(10,2) COMMENT '保费', " +
|
|
|
|
|
- "sum_insured DECIMAL(10,2) COMMENT '保额', " +
|
|
|
|
|
|
|
+ "premium INT COMMENT '保费(分)', " +
|
|
|
|
|
+ "sum_insured INT COMMENT '保额(分)', " +
|
|
|
"start_date DATE COMMENT '生效日期', " +
|
|
"start_date DATE COMMENT '生效日期', " +
|
|
|
"end_date DATE COMMENT '到期日期', " +
|
|
"end_date DATE COMMENT '到期日期', " +
|
|
|
"renewal_type VARCHAR(20) DEFAULT 'annual' COMMENT '续费类型: annual/monthly/single', " +
|
|
"renewal_type VARCHAR(20) DEFAULT 'annual' COMMENT '续费类型: annual/monthly/single', " +
|
|
@@ -2512,6 +2601,24 @@ try {
|
|
|
log.warn("创建contacts表可能已存在: {}", e.getMessage());
|
|
log.warn("创建contacts表可能已存在: {}", e.getMessage());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 创建文章阅读记录表
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS article_reading_records (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "user_id BIGINT COMMENT '用户ID', " +
|
|
|
|
|
+ "child_id BIGINT NOT NULL COMMENT '孩子ID', " +
|
|
|
|
|
+ "content VARCHAR(500) COMMENT '阅读内容摘要', " +
|
|
|
|
|
+ "duration_seconds INT DEFAULT 0 COMMENT '阅读时长(秒)', " +
|
|
|
|
|
+ "read_at DATETIME COMMENT '阅读时间', " +
|
|
|
|
|
+ "created_at DATETIME, " +
|
|
|
|
|
+ "INDEX idx_child_id (child_id), " +
|
|
|
|
|
+ "INDEX idx_read_at (read_at)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章阅读记录表'");
|
|
|
|
|
+ log.info("已创建article_reading_records表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("创建article_reading_records表可能已存在: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 迁移30: activities表添加visibility和visible_to字段
|
|
// 迁移30: activities表添加visibility和visible_to字段
|
|
|
try {
|
|
try {
|
|
|
jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visibility VARCHAR(20) DEFAULT 'all' COMMENT '可见性: all/member'");
|
|
jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN visibility VARCHAR(20) DEFAULT 'all' COMMENT '可见性: all/member'");
|
|
@@ -2539,7 +2646,7 @@ try {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void insertProductSeed(String name, String desc, String type,
|
|
private void insertProductSeed(String name, String desc, String type,
|
|
|
- java.math.BigDecimal price,
|
|
|
|
|
|
|
+ Integer price,
|
|
|
String domain, String memberEligible) {
|
|
String domain, String memberEligible) {
|
|
|
Integer count = jdbcTemplate.queryForObject(
|
|
Integer count = jdbcTemplate.queryForObject(
|
|
|
"SELECT COUNT(*) FROM products WHERE name = ? AND product_type = ?", Integer.class, name, type);
|
|
"SELECT COUNT(*) FROM products WHERE name = ? AND product_type = ?", Integer.class, name, type);
|