瀏覽代碼

fix(backend): Product entity column mapping + test param fixes

E2E Test Bot 3 月之前
父節點
當前提交
608376c111

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

@@ -6044,6 +6044,16 @@ try {
     // 迁移132: points_exchange_records表确保family_member_id列
     ensureColumn("points_exchange_records", "family_member_id", "BIGINT COMMENT '家庭成员ID'");
 
+    // 迁移133: products表列对齐 — rename min_quantity→purchase_count_threshold, add missing columns
+    try {
+        jdbcTemplate.execute("ALTER TABLE products CHANGE COLUMN min_quantity purchase_count_threshold INT DEFAULT 0 COMMENT '最小购买数量限制'");
+        log.info("已重命名products.min_quantity→purchase_count_threshold");
+    } catch (Exception e) {
+        log.warn("重命名products列可能已处理: {}", e.getMessage());
+    }
+    ensureColumn("products", "recommendation_tags", "VARCHAR(500) DEFAULT NULL COMMENT '推荐标签'");
+    ensureColumn("products", "repurchase_interval_days", "INT DEFAULT 30 COMMENT '复购间隔天数'");
+
     private void runMigration82() {
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS ai_conversation_summary (" +

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/Product.java

@@ -1,6 +1,7 @@
 package com.etotem.cfc.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -50,6 +51,7 @@ public class Product implements Serializable {
     private Long distributionSystemId;     // 销售体系ID
 
     private Integer deliveryMethod;        // 配送方式: 1=快递 2=自提 3=两者皆可
+    @TableField("purchase_count_threshold")
     private Integer minQuantity;           // 最小购买数量限制
 
     private Date createdAt;

+ 1 - 1
cfc-backend/src/main/resources/schema.sql

@@ -1086,7 +1086,7 @@ CREATE TABLE IF NOT EXISTS products (
     dimension_weights JSON DEFAULT NULL COMMENT '五维权重百分比: {"body":0,"mind":0,"wisdom":0,"action":0,"wealth":0}',
     profit_rate INT DEFAULT 0 COMMENT '平台利润率(千分比)',
     delivery_method TINYINT DEFAULT 1 COMMENT '配送方式: 1=快递 2=自提 3=两者皆可',
-    min_quantity INT DEFAULT 1 COMMENT '最小购买数量限制',
+    purchase_count_threshold INT DEFAULT 0 COMMENT '最小购买数量限制',
     category_id BIGINT COMMENT '商品类目ID',
     distribution_system_id BIGINT COMMENT '销售体系ID',
     external_source VARCHAR(64) COMMENT '外部来源系统',

+ 2 - 2
tests/e2e/flow-l1-tests.js

@@ -893,7 +893,7 @@ async function testNutritionFlow() {
   record(F, 'parent', '营养摄入统计', r.status === 200 && r.body && r.body.code === 200, r.body ? 'nutrition summary OK' : r.raw);
 
   // 食材推荐指数
-  r = await apiCall('POST', '/api/food/recommendation/index', {}, t);
+  r = await apiCall('POST', '/api/food/recommendation/index', { userId: 1002 }, t);
   record(F, 'parent', '食材推荐指数', r.status === 200 && r.body && r.body.code === 200, r.body ? 'food index OK' : r.raw);
 
   // 营养偏好
@@ -1045,7 +1045,7 @@ async function testContentFlow() {
   record(F, 'parent', '我的分享', r.status === 200 && r.body && r.body.code === 200, r.body ? 'my shares OK' : r.raw);
 
   // 媒体
-  r = await apiCall('POST', '/api/media/upload-text', { text: 'Test media text' }, t);
+  r = await apiCall('POST', '/api/media/upload-text', { taskId: 1, creatorId: 1002, content: 'Test media text' }, t);
   record(F, 'parent', '保存文字记录', r.status === 200 && r.body && r.body.code === 200, r.body ? 'text upload OK' : r.body ? r.body.message : r.raw);
 }