Forráskód Böngészése

feat: add ecommerce DDL blocks to DatabaseInitializer

Add table creation for cart_items, shop_categories, distribution_systems, after_sales_requests, shop_discount_rules. Add ALTER TABLE for products and product_orders new columns.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
liaoxg 2 hónapja
szülő
commit
366e8fcae3

+ 207 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -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("数据库迁移完成");