Browse Source

feat(nutrition): nutrition_product 添加 local_product_id 字段关联本平台商品

Xiaogang Liao 1 month ago
parent
commit
c4a555d861

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

@@ -8738,5 +8738,32 @@ private void runMigration100() {
 		} catch (Exception e) {
 			log.warn("创建nutrition_product_review表失败(可能已存在): " + e.getMessage());
 		}
+
+		// 迁移220: 创建 file_record 表(文件去重+维护)
+		try {
+			jdbcTemplate.execute(
+				"CREATE TABLE IF NOT EXISTS file_record (" +
+				"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+				"hash VARCHAR(64) NOT NULL COMMENT 'SHA-256 文件哈希', " +
+				"url VARCHAR(500) NOT NULL COMMENT '文件访问URL', " +
+				"file_size BIGINT NOT NULL COMMENT '文件大小(字节)', " +
+				"content_type VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型', " +
+				"original_filename VARCHAR(255) DEFAULT NULL COMMENT '原始文件名', " +
+				"category VARCHAR(50) DEFAULT 'general' COMMENT '分类', " +
+				"description VARCHAR(500) DEFAULT NULL COMMENT '描述', " +
+				"created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, " +
+				"updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+				"UNIQUE KEY uk_hash (hash), " +
+				"INDEX idx_category (category), " +
+				"INDEX idx_created_at (created_at)" +
+				") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件记录表(去重&维护)'"
+			);
+			log.info("已创建file_record表");
+		} catch (Exception e) {
+			log.warn("创建file_record表失败(可能已存在): " + e.getMessage());
+		}
+
+		// 迁移221: nutrition_product 添加 local_product_id 字段(关联本平台商品)
+		ensureColumn("nutrition_product", "local_product_id", "BIGINT DEFAULT NULL COMMENT '本平台商品ID,关联products.id'");
 	}
 }

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/NutritionProduct.java

@@ -37,6 +37,9 @@ public class NutritionProduct implements Serializable {
 
     private Integer status;
 
+    /** 本平台商品ID(关联 products.id),有则直接跳转购买 */
+    private Long localProductId;
+
     private Date createTime;
 
     private Date updateTime;

+ 16 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/NutritionProductService.java

@@ -35,6 +35,9 @@ public class NutritionProductService {
     @Resource
     private NutritionProductReviewMapper reviewMapper;
 
+    @Resource
+    private ProductService productService;
+
     /** 分类列表(树结构) */
     public List<NutritionCategory> listCategories() {
         return categoryMapper.selectList(
@@ -116,6 +119,19 @@ public class NutritionProductService {
             }
         }
         result.put("reviews", reviewMap);
+        // 如果有关联的本平台商品,返回其信息
+        if (product.getLocalProductId() != null) {
+            Product localProduct = productService.getById(product.getLocalProductId());
+            if (localProduct != null) {
+                Map<String, Object> localInfo = new HashMap<>();
+                localInfo.put("id", localProduct.getId());
+                localInfo.put("name", localProduct.getName());
+                localInfo.put("price", localProduct.getPrice());
+                localInfo.put("coverImage", localProduct.getCoverImage());
+                localInfo.put("status", localProduct.getStatus());
+                result.put("localProduct", localInfo);
+            }
+        }
         return result;
     }
 

+ 18 - 0
cfc-backend/src/main/resources/schema.sql

@@ -4517,6 +4517,7 @@ CREATE TABLE IF NOT EXISTS nutrition_product (
     image_url VARCHAR(500) DEFAULT NULL COMMENT '产品图',
     description TEXT COMMENT '产品描述',
     status TINYINT DEFAULT 1 COMMENT '状态 0下架/1上架',
+    local_product_id BIGINT DEFAULT NULL COMMENT '本平台商品ID,关联products.id',
     create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
     update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     INDEX idx_brand (brand_id),
@@ -4568,3 +4569,20 @@ CREATE TABLE IF NOT EXISTS nutrition_product_review (
     last_updated DATETIME DEFAULT NULL COMMENT '最后更新时间',
     INDEX idx_listing (platform_listing_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营养产品评价';
+
+-- 文件记录表(迁移220:去重 + 维护)
+CREATE TABLE IF NOT EXISTS file_record (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY,
+    hash VARCHAR(64) NOT NULL COMMENT 'SHA-256 文件哈希',
+    url VARCHAR(500) NOT NULL COMMENT '文件访问URL',
+    file_size BIGINT NOT NULL COMMENT '文件大小(字节)',
+    content_type VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型',
+    original_filename VARCHAR(255) DEFAULT NULL COMMENT '原始文件名',
+    category VARCHAR(50) DEFAULT 'general' COMMENT '分类: articles/dan-reports/assessment-reports/health-reports/general',
+    description VARCHAR(500) DEFAULT NULL COMMENT '描述',
+    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY uk_hash (hash),
+    INDEX idx_category (category),
+    INDEX idx_created_at (created_at)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件记录表(去重&维护)';