Просмотр исходного кода

feat(product): 商品规格最小购买数限制(minQuantity字段 + 订单校验)

ProductSku: 新增 minQuantity 字段
schema.sql: 补充 product_skus 建表语句(含 min_quantity 列)
DatabaseInitializer: runMigration101() 定义(添加 min_quantity 列)
ProductOrderService.createMultiItem(): SKU 级别最小购买数量校验
Xiaogang Liao 1 месяц назад
Родитель
Сommit
f2762997c0

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

@@ -6411,4 +6411,9 @@ private void runMigration100() {
 		// 表已不存在,忽略
 	}
 }
+
+	// 迁移101: product_skus表添加min_quantity列(商品规格最小购买数限制)
+	private void runMigration101() {
+		ensureColumn("product_skus", "min_quantity", "INT DEFAULT 1 COMMENT '最小购买数量限制'");
+	}
 }

+ 1 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ProductSku.java

@@ -20,6 +20,7 @@ public class ProductSku implements Serializable {
     private Object specs;
     private BigDecimal price;
     private Integer stock;
+    private Integer minQuantity; // 最小购买数量限制
     private BigDecimal originalPrice;
     private String image;
     private Integer enabled;

+ 7 - 2
cfc-backend/src/main/java/com/etotem/cfc/service/ProductOrderService.java

@@ -180,8 +180,13 @@ public class ProductOrderService {
             int unitPrice = product.getPrice();
             if (item.getSkuId() != null) {
                 ProductSku sku = productSkuService.getById(item.getSkuId());
-                if (sku != null && sku.getPrice() != null) {
-                    unitPrice = sku.getPrice().multiply(new java.math.BigDecimal(100)).intValue();
+                if (sku != null) {
+                    if (sku.getMinQuantity() != null && item.getQuantity() < sku.getMinQuantity()) {
+                        return Result.error(product.getName() + " 该规格最低需购买" + sku.getMinQuantity() + "件");
+                    }
+                    if (sku.getPrice() != null) {
+                        unitPrice = sku.getPrice().multiply(new java.math.BigDecimal(100)).intValue();
+                    }
                 }
             }
             totalAmount += unitPrice * item.getQuantity();

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

@@ -1075,6 +1075,24 @@ CREATE TABLE IF NOT EXISTS products (
     updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
 
+-- 商品规格SKU表(product_skus)
+CREATE TABLE IF NOT EXISTS product_skus (
+    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
+    product_id BIGINT NOT NULL COMMENT '所属商品ID',
+    sku_code VARCHAR(64) COMMENT 'SKU编码',
+    specs JSON COMMENT '规格选项JSON: [{"name":"颜色","value":"红色"},{"name":"尺码","value":"M"}]',
+    price INT DEFAULT 0 COMMENT 'SKU价格(分)',
+    stock INT DEFAULT 0 COMMENT '库存数量',
+    min_quantity INT DEFAULT 1 COMMENT '最小购买数量限制',
+    original_price INT DEFAULT 0 COMMENT '原价(分)',
+    image VARCHAR(500) COMMENT 'SKU图片',
+    enabled TINYINT DEFAULT 1 COMMENT '是否启用: 0=禁用 1=启用',
+    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX idx_product_id (product_id),
+    INDEX idx_sku_code (sku_code)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品规格SKU表';
+
 -- 商品订单表
 CREATE TABLE IF NOT EXISTS product_orders (
     id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',