Przeglądaj źródła

feat(supply-system): 添加 api_endpoint/api_key 字段; fix(sku): specs 字段类型改为 Object 支持JSON数组

Xiaogang Liao 2 miesięcy temu
rodzic
commit
eb7ba46039

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

@@ -5263,6 +5263,7 @@ try {
         runMigration86();
         runMigration88();
         runMigration89();
+        runMigration90();
     }
 
     private void runMigration81() {
@@ -5762,4 +5763,11 @@ try {
         ensureColumn("supply_system", "models", "TEXT COMMENT 'AI模型列表JSON,如[\"agnes-image-2.0-flash\",\"agnes-2.5-flash\"]'");
         log.info("已添加models列到supply_system表");
     }
+
+    private void runMigration90() {
+        // 迁移 90: supply_system表添加api_endpoint和api_key字段
+        ensureColumn("supply_system", "api_endpoint", "VARCHAR(512) COMMENT 'API端点'");
+        ensureColumn("supply_system", "api_key", "VARCHAR(256) COMMENT 'API密钥'");
+        log.info("已添加api_endpoint和api_key列到supply_system表");
+    }
 }

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

@@ -17,7 +17,7 @@ public class ProductSku implements Serializable {
 
     private Long productId;
     private String skuCode;
-    private String specs;
+    private Object specs;
     private BigDecimal price;
     private Integer stock;
     private BigDecimal originalPrice;

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

@@ -20,6 +20,8 @@ public class SupplySystem implements Serializable {
     private String description;
     private String status;
     private String models;
+    private String apiEndpoint;
+    private String apiKey;
     private Date createdAt;
     private Date updatedAt;
 }

+ 31 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/ProductSkuService.java

@@ -94,9 +94,39 @@ public class ProductSkuService {
         }
         String trimmed = specs.trim();
         // 已是合法 JSON 对象/数组,直接返回
-        if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
+        if (trimmed.startsWith("{")) {
             return trimmed;
         }
+        // 数组格式转 JSON 对象:["红色","M码"] → {"规格":"红色","规格2":"M码"}
+        if (trimmed.startsWith("[")) {
+            if (trimmed.contains("[object Object]") || trimmed.contains("[undefined]")) {
+                return "{}";
+            }
+            String body = trimmed.substring(1, trimmed.length() - 1);
+            Map<String, String> map = new LinkedHashMap<>();
+            int idx = 1;
+            for (String item : body.split(",", -1)) {
+                item = item.trim();
+                if (item.isEmpty()) continue;
+                if (item.startsWith("\"")) item = item.substring(1);
+                if (item.endsWith("\"")) item = item.substring(0, item.length() - 1);
+                map.put("规格" + idx, item);
+                idx++;
+            }
+            if (map.isEmpty()) {
+                return "{}";
+            }
+            StringBuilder sb = new StringBuilder("{");
+            boolean first = true;
+            for (Map.Entry<String, String> entry : map.entrySet()) {
+                if (!first) sb.append(",");
+                first = false;
+                sb.append("\"").append(escapeJson(entry.getKey())).append("\":");
+                sb.append("\"").append(escapeJson(entry.getValue())).append("\"");
+            }
+            sb.append("}");
+            return sb.toString();
+        }
         // 将 k1:v1;k2:v2 格式转为 JSON 对象
         Map<String, String> map = new LinkedHashMap<>();
         String[] pairs = trimmed.split("[;;]");

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

@@ -2227,6 +2227,8 @@ CREATE TABLE IF NOT EXISTS supply_system (
     platform_profit_rate DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '平台留利比例(%)',
     description TEXT COMMENT '描述',
     models TEXT COMMENT 'AI模型列表JSON,如["agnes-image-2.0-flash","agnes-2.5-flash"]',
+    api_endpoint VARCHAR(512) COMMENT 'API端点',
+    api_key VARCHAR(256) COMMENT 'API密钥',
     status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态: active/disabled',
     created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,