Эх сурвалжийг харах

feat: add dimension-products + repurchase-reminders endpoints with DTO fields

RecommendationResult gains matchScore/matchReason/reason/productId fields.
RecommendationController adds 3 @PostMapping endpoints:
- /dimension-products — query products by dimension code, sorted by matchScore
- /repurchase-reminders — list user's pending repurchase reminders
- /repurchase-reminder/{id}/click — mark reminder as clicked

Co-authored-by: Sisyphus <sisyphus@omo.codes>
Sisyphus 2 сар өмнө
parent
commit
1200294845

+ 31 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/ai/RecommendationController.java

@@ -6,13 +6,16 @@ import com.etotem.cfc.dto.RecommendationResult;
 import com.etotem.cfc.service.RecommendationService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.Map;
 
 @Tag(name = "营养推荐", description = "精准营养推荐搜索")
 @RestController
@@ -29,4 +32,32 @@ public class RecommendationController {
         List<RecommendationResult> results = recommendationService.search(query);
         return Result.success(results);
     }
+
+    @Operation(summary = "按维度获取匹配商品")
+    @PostMapping("/dimension-products")
+    public Result<List<RecommendationResult>> dimensionProducts(
+            @RequestBody Map<String, Object> params) {
+        String dimensionCode = (String) params.get("dimensionCode");
+        Long familyId = params.get("familyId") != null ? ((Number) params.get("familyId")).longValue() : null;
+        Integer limit = params.get("limit") != null ? ((Number) params.get("limit")).intValue() : null;
+        List<RecommendationResult> results = recommendationService.getDimensionProducts(dimensionCode, familyId, limit);
+        return Result.success(results);
+    }
+
+    @Operation(summary = "获取用户复购提醒列表")
+    @PostMapping("/repurchase-reminders")
+    public Result<List<RecommendationResult>> repurchaseReminders(
+            HttpServletRequest request) {
+        Long userId = (Long) request.getAttribute("userId");
+        List<RecommendationResult> results = recommendationService.getRepurchaseReminders(userId);
+        return Result.success(results);
+    }
+
+    @Operation(summary = "标记复购提醒已点击")
+    @PostMapping("/repurchase-reminder/{id}/click")
+    public Result<?> clickRepurchaseReminder(
+            @PathVariable Long id) {
+        recommendationService.markRepurchaseClicked(id);
+        return Result.success(null);
+    }
 }

+ 4 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/RecommendationResult.java

@@ -15,4 +15,8 @@ public class RecommendationResult {
     private Integer price;         // 单位:分
     private String url;            // 前端跳转路径
     private String source;         // "platform" 或 null
+    private Integer matchScore;     // 维度匹配度 0-100
+    private String matchReason;     // 匹配原因
+    private String reason;          // 推荐理由
+    private Long productId;         // 关联商品ID
 }