|
|
@@ -955,6 +955,17 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("创建sys_config表失败: {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
+ // Migration: product_orders add logistics fields
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_no VARCHAR(64) COMMENT '物流单号'");
|
|
|
+ log.info("已添加logistics_no列到product_orders表");
|
|
|
+ } catch (Exception e) { }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN logistics_company VARCHAR(100) COMMENT '物流公司'");
|
|
|
+ log.info("已添加logistics_company列到product_orders表");
|
|
|
+ } catch (Exception e) { }
|
|
|
+
|
|
|
// SysConfig 种子数据
|
|
|
try {
|
|
|
insertSysConfigSeed("points_exchange_rate", "1", "积分兑换汇率(1积分=1分,即0.01元)");
|
|
|
@@ -1304,6 +1315,182 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("创建energy_source_config表失败: {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
+ // 购物车
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS cart_items (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID'," +
|
|
|
+ "product_id BIGINT NOT NULL COMMENT '商品ID'," +
|
|
|
+ "quantity INT DEFAULT 1 COMMENT '数量'," +
|
|
|
+ "selected TINYINT(1) DEFAULT 1 COMMENT '是否选中'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_user (user_id)," +
|
|
|
+ "INDEX idx_product (product_id)," +
|
|
|
+ "UNIQUE KEY uk_user_product (user_id, product_id)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车'");
|
|
|
+ log.info("已创建cart_items表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建cart_items表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_categories (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "name VARCHAR(64) NOT NULL COMMENT '分类名称'," +
|
|
|
+ "parent_id BIGINT DEFAULT 0 COMMENT '父分类ID(0=根节点)'," +
|
|
|
+ "level INT DEFAULT 0 COMMENT '层级(0/1/2/3)'," +
|
|
|
+ "sort INT DEFAULT 0 COMMENT '排序'," +
|
|
|
+ "image VARCHAR(512) COMMENT '分类图标'," +
|
|
|
+ "enabled TINYINT(1) DEFAULT 1 COMMENT '启用'," +
|
|
|
+ "dimension_codes VARCHAR(128) COMMENT '维度编码(逗号分隔: body,mind,heart)'," +
|
|
|
+ "product_types VARCHAR(128) COMMENT '商品类型(逗号分隔: PHYSICAL,COURSE,ASSESSMENT)'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_parent (parent_id)," +
|
|
|
+ "INDEX idx_sort (sort)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品类目'");
|
|
|
+ log.info("已创建shop_categories表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建shop_categories表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_systems (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "name VARCHAR(64) NOT NULL COMMENT '体系名称'," +
|
|
|
+ "description VARCHAR(255) COMMENT '描述'," +
|
|
|
+ "owner_id BIGINT COMMENT '创建者ID'," +
|
|
|
+ "profit_rate INT DEFAULT 0 COMMENT '平台利润率(千分比)'," +
|
|
|
+ "enabled TINYINT(1) DEFAULT 1 COMMENT '启用'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销体系'");
|
|
|
+ log.info("已创建distribution_systems表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建distribution_systems表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS distribution_relations (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "system_id BIGINT NOT NULL COMMENT '体系ID'," +
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID'," +
|
|
|
+ "parent_id BIGINT COMMENT '上级用户ID(null=根)'," +
|
|
|
+ "depth INT DEFAULT 0 COMMENT '层级深度'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_system (system_id)," +
|
|
|
+ "INDEX idx_user (user_id)," +
|
|
|
+ "INDEX idx_parent (parent_id)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分销关系'");
|
|
|
+ log.info("已创建distribution_relations表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建distribution_relations表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS after_sales_requests (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "order_id BIGINT NOT NULL COMMENT '订单ID'," +
|
|
|
+ "order_no VARCHAR(32) NOT NULL COMMENT '订单号'," +
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID'," +
|
|
|
+ "type VARCHAR(32) NOT NULL COMMENT '类型: REFUND/RETURN_REFUND'," +
|
|
|
+ "reason VARCHAR(255) COMMENT '原因'," +
|
|
|
+ "description TEXT COMMENT '描述'," +
|
|
|
+ "images TEXT COMMENT '凭证图片(JSON数组)'," +
|
|
|
+ "refund_amount INT DEFAULT 0 COMMENT '退款金额(分)'," +
|
|
|
+ "status VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending/approved/rejected/completed'," +
|
|
|
+ "reject_reason VARCHAR(255) COMMENT '驳回原因'," +
|
|
|
+ "handled_by BIGINT COMMENT '处理人ID'," +
|
|
|
+ "handled_at DATETIME COMMENT '处理时间'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_order (order_id)," +
|
|
|
+ "INDEX idx_user (user_id)," +
|
|
|
+ "INDEX idx_status (status)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='售后申请'");
|
|
|
+ log.info("已创建after_sales_requests表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建after_sales_requests表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS shop_discount_rules (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "name VARCHAR(64) NOT NULL COMMENT '规则名称'," +
|
|
|
+ "type VARCHAR(32) NOT NULL COMMENT '类型: PERCENT/FIXED/THRESHOLD'," +
|
|
|
+ "value INT NOT NULL COMMENT '折扣值(PERCENT=百分比数字, FIXED/THRESHOLD=金额分)'," +
|
|
|
+ "threshold_amount INT COMMENT '满减门槛(分,仅THRESHOLD)'," +
|
|
|
+ "category_id BIGINT COMMENT '适用类目ID(null=全部)'," +
|
|
|
+ "distribution_system_id BIGINT COMMENT '适用体系ID(null=全部)'," +
|
|
|
+ "product_ids TEXT COMMENT '适用商品ID(逗号分隔,null=全部)'," +
|
|
|
+ "start_time DATETIME COMMENT '开始时间'," +
|
|
|
+ "end_time DATETIME COMMENT '结束时间'," +
|
|
|
+ "max_uses INT DEFAULT 0 COMMENT '最大使用次数(0=不限)'," +
|
|
|
+ "used_count INT DEFAULT 0 COMMENT '已使用次数'," +
|
|
|
+ "enabled TINYINT(1) DEFAULT 1 COMMENT '启用'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_category (category_id)," +
|
|
|
+ "INDEX idx_enabled (enabled)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='折扣规则'");
|
|
|
+ log.info("已创建shop_discount_rules表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建shop_discount_rules表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 电商扩展字段 - products表
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE products ADD COLUMN category_id BIGINT COMMENT '商品类目ID'");
|
|
|
+ log.info("已添加category_id列到products表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE products ADD COLUMN distribution_system_id BIGINT COMMENT '分销体系ID'");
|
|
|
+ log.info("已添加distribution_system_id列到products表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+
|
|
|
+ // 电商扩展字段 - product_orders表
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN discount_amount INT DEFAULT 0 COMMENT '优惠金额(分)'");
|
|
|
+ log.info("已添加discount_amount列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN coupon_id BIGINT COMMENT '优惠券ID'");
|
|
|
+ log.info("已添加coupon_id列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cancel_at DATETIME COMMENT '取消时间'");
|
|
|
+ log.info("已添加cancel_at列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN transaction_id VARCHAR(64) COMMENT '微信支付交易号'");
|
|
|
+ log.info("已添加transaction_id列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN cover_image VARCHAR(512) COMMENT '商品封面图快照'");
|
|
|
+ log.info("已添加cover_image列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN address_snapshot TEXT COMMENT '收货地址快照(JSON)'");
|
|
|
+ log.info("已添加address_snapshot列到product_orders表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+
|
|
|
// 能量流水表
|
|
|
try {
|
|
|
jdbcTemplate.execute(
|
|
|
@@ -2358,6 +2545,26 @@ log.info("已添加template_id列到tasks表");
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.warn("numsoul_config 种子数据初始化失败: {}", e.getMessage());
|
|
|
+ // Migration: user_address table (收货地址)
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_address (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+ "user_id BIGINT NOT NULL COMMENT '用户ID', " +
|
|
|
+ "receiver_name VARCHAR(50) NOT NULL COMMENT '收货人姓名', " +
|
|
|
+ "phone VARCHAR(20) NOT NULL COMMENT '收货人电话', " +
|
|
|
+ "province VARCHAR(50) COMMENT '省份', " +
|
|
|
+ "city VARCHAR(50) COMMENT '城市', " +
|
|
|
+ "district VARCHAR(50) COMMENT '区县', " +
|
|
|
+ "street VARCHAR(200) COMMENT '详细地址', " +
|
|
|
+ "is_default INT DEFAULT 0 COMMENT '是否默认 1=是 0=否', " +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
+ "INDEX idx_user_id (user_id)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收货地址表'");
|
|
|
+ log.info("已创建 user_address 表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建 user_address 表失败: {}", e.getMessage());
|
|
|
+
|
|
|
}
|
|
|
|
|
|
log.info("数据库迁移完成");
|