Explorar o código

refactor: 商品列表查询参数统一为 dimensionCode

E2E Test Bot hai 3 meses
pai
achega
81ce39df86

+ 2 - 1
cfc-backend/src/main/java/com/etotem/cfc/dto/ProductListQueryDTO.java

@@ -7,7 +7,8 @@ public class ProductListQueryDTO {
     private Integer page = 1;
     private Integer size = 10;
     private String productType;
-    private String domain;
+    private String domain;       // 兼容旧版,优先使用 dimensionCode
+    private String dimensionCode; // 统一参数名,与活动/文章/任务一致
     private Long vendorId;
     private String keyword;
 }

+ 5 - 4
cfc-backend/src/main/java/com/etotem/cfc/service/ProductService.java

@@ -53,12 +53,13 @@ public class ProductService {
         if (query.getProductType() != null && !query.getProductType().isEmpty()) {
             wrapper.eq(Product::getProductType, query.getProductType());
         }
-        if (query.getDomain() != null && !query.getDomain().isEmpty()) {
+        // 统一参数名: dimensionCode 优先,兼容旧版 domain
+        String dimCode = query.getDimensionCode() != null ? query.getDimensionCode() : query.getDomain();
+        if (dimCode != null && !dimCode.isEmpty()) {
             // P1: 权重感知查询 — 匹配 dimension_weights > 0 或兼容旧版 domain
-            String domain = query.getDomain();
             wrapper.and(w -> w
-                .apply("COALESCE(JSON_EXTRACT(dimension_weights, '$." + domain + "'), 0) > 0")
-                .or().eq(Product::getDomain, domain)
+                .apply("COALESCE(JSON_EXTRACT(dimension_weights, '$." + dimCode + "'), 0) > 0")
+                .or().eq(Product::getDomain, dimCode)
             );
         }
         if (query.getKeyword() != null && !query.getKeyword().isEmpty()) {

+ 11 - 13
docs/analysis/dimension-filter-design.md

@@ -43,20 +43,20 @@ private String domain;               // 旧: 单值, 如 "body"
 private String dimensionWeights;     // 新: JSON, 如 {"body":30,"mind":0,"wisdom":0,"action":70,"wealth":0}
 ```
 
-**筛选逻辑(ProductService.list() 第56-62行):**
+**筛选逻辑(ProductService.list() 第56-67行):**
 ```java
-if (query.getDomain() != null && !query.getDomain().isEmpty()) {
-    String domain = query.getDomain();
+String dimCode = query.getDimensionCode() != null ? query.getDimensionCode() : query.getDomain();
+if (dimCode != null && !dimCode.isEmpty()) {
     wrapper.and(w -> w
-        .apply("COALESCE(JSON_EXTRACT(dimension_weights, '$." + domain + "'), 0) > 0")
-        .or().eq(Product::getDomain, domain)
+        .apply("COALESCE(JSON_EXTRACT(dimension_weights, '$." + dimCode + "'), 0) > 0")
+        .or().eq(Product::getDomain, dimCode)
     );
 }
 ```
 
-**注意:** 查询参数名为 `domain`(ProductListQueryDTO 中定义),前端传的是 `dimensionCode` 还是 `domain` 需要确认对齐。
+**注意:** 查询参数名已统一为 `dimensionCode`,兼容旧版 `domain`。`ProductListQueryDTO` 中同时保留两个字段,优先使用 `dimensionCode`。
 
-**状态:** ✅ 已实现权重感知筛选,兼容旧版 `domain`
+**状态:** ✅ 已实现权重感知筛选,参数名已统一
 
 ### 3. Article(文章)✅ 已实现
 
@@ -178,13 +178,11 @@ COALESCE(JSON_EXTRACT(dimension_weights, '$.body'), 0) > 0
 
 ## 建议
 
-### 统一参数名
-商品列表使用 `domain` 而非 `dimensionCode`,与其他三个不统一。建议在 `ProductListQueryDTO` 中增加 `dimensionCode` 别名,内部映射到 `domain`。
+### 统一参数名 ✅ 已完成
+商品列表已将查询参数统一为 `dimensionCode`(兼容旧版 `domain`),与活动/文章/任务一致。
 
-### Task 增加维度支持
-如果任务需要按维度筛选,有两种方案:
-1. **轻量方案**:在 Task 实体增加 `dimensionCode` 字段(单值),通过 `category` → `dimensionCode` 映射表自动填充
-2. **完整方案**:增加 `dimensionWeights` JSON 字段,与活动/商品/文章保持一致
+### Task 增加维度支持 ✅ 已完成
+Task 已增加 `dimensionCode` + `dimensionWeights` 字段,创建任务时可传入,今日任务列表支持按维度筛选。
 
 ### 创建/编辑时的维度设置
 | 实体 | 创建接口 | 维度参数 | 说明 |