tony.cheng
2026-02-09 d31819515e4aac228f26e7cbb92c89e0f520e8ac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/**
 * 推荐API Service
 * 处理类案推荐和法条推荐相关接口
 * 接口前缀: /api/v1/case/similarity 和 /api/v1/law/similarity
 */
 
import { request } from './request';
 
class RecommendAPIService {
  /**
   * 类案推荐查询
   * POST /api/v1/case/similarity
   * @param {Object} data - 请求数据
   * @param {string} data.caseId - 案件ID
   * @param {string} data.caseContent - 案件内容
   * @param {number} data.topK - 返回相似案例数量
   * @param {Object} data.filters - 筛选条件
   * @returns {Promise} 相似案例推荐结果
   */
  static getSimilarCases(data = {}) {
    return request.post('/api/v1/case/similarity', data);
  }
 
  /**
   * 法条推荐查询
   * POST /api/v1/law/similarity
   * @param {Object} data - 请求数据
   * @param {string} data.caseId - 案件ID
   * @param {string} data.caseContent - 案件内容
   * @param {number} data.topK - 返回相似法条数量
   * @param {Object} data.filters - 筛选条件
   * @returns {Promise} 相似法条推荐结果
   */
  static getSimilarLaws(data = {}) {
    return request.post('/api/v1/law/similarity', data);
  }
 
  /**
   * 综合推荐(同时获取类案和法条推荐)
   * @param {Object} params - 推荐参数
   * @param {string} params.caseId - 案件ID
   * @param {string} params.caseContent - 案件内容
   * @param {number} params.caseTopK - 类案推荐数量
   * @param {number} params.lawTopK - 法条推荐数量
   * @param {Object} params.filters - 通用筛选条件
   * @returns {Promise} 综合推荐结果
   */
  static async getComprehensiveRecommendations(params = {}) {
    const {
      caseId,
      caseContent,
      caseTopK = 5,
      lawTopK = 10,
      filters = {}
    } = params;
    console.log('[getComprehensiveRecommendations] params', params)
    try {
      // 并行获取类案推荐和法条推荐
      const [casesResult, lawsResult] = await Promise.all([
        this.getSimilarCases({
          caseId,
          caseContent,
          topK: caseTopK,
          filters
        }),
        this.getSimilarLaws({
          caseId,
          caseContent,
          topK: lawTopK,
          filters
        })
      ]);
 
      return {
        cases: casesResult.data.similarCases || [],
        laws: lawsResult.data.similarCases || []
      };
    } catch (error) {
      return Promise.reject(error);
    }
  }
 
  /**
   * 基于案件特征的智能推荐
   * @param {Object} caseFeatures - 案件特征对象
   * @param {string} caseFeatures.disputeType - 纠纷类型
   * @param {string} caseFeatures.amount - 涉及金额
   * @param {string} caseFeatures.region - 地区
   * @param {string} caseFeatures.industry - 行业
   * @param {Array} caseFeatures.keywords - 关键词数组
   * @param {Object} options - 推荐选项
   * @returns {Promise} 智能推荐结果
   */
  static getSmartRecommendations(caseFeatures = {}, options = {}) {
    const {
      caseTopK = 5,
      lawTopK = 10,
      includeCourtCases = true,
      includeMediationCases = true
    } = options;
 
    // 构造推荐请求数据
    const requestData = {
      caseContent: this._buildCaseContent(caseFeatures),
      topK: Math.max(caseTopK, lawTopK),
      filters: {
        disputeType: caseFeatures.disputeType,
        region: caseFeatures.region,
        industry: caseFeatures.industry
      }
    };
 
    return this.getComprehensiveRecommendations({
      ...requestData,
      caseTopK,
      lawTopK
    });
  }
 
  /**
   * 构建案件内容字符串(用于推荐算法)
   * @private
   * @param {Object} features - 案件特征
   * @returns {string} 格式化的案件内容
   */
  static _buildCaseContent(features) {
    const parts = [];
    
    if (features.disputeType) {
      parts.push(`纠纷类型:${features.disputeType}`);
    }
    
    if (features.amount) {
      parts.push(`涉及金额:${features.amount}`);
    }
    
    if (features.region) {
      parts.push(`地区:${features.region}`);
    }
    
    if (features.industry) {
      parts.push(`行业:${features.industry}`);
    }
    
    if (features.keywords && features.keywords.length > 0) {
      parts.push(`关键词:${features.keywords.join('、')}`);
    }
    
    if (features.description) {
      parts.push(`案件描述:${features.description}`);
    }
 
    return parts.join('\n');
  }
 
  /**
   * 获取推荐历史记录
   * @param {string} userId - 用户ID
   * @param {number} page - 页码
   * @param {number} size - 每页数量
   * @returns {Promise} 推荐历史
   */
  static getRecommendationHistory(userId, page = 1, size = 10) {
    return request.get('/api/v1/recommend/history', {
      userId,
      page,
      size
    });
  }
 
  /**
   * 反馈推荐结果质量
   * @param {Object} feedback - 反馈数据
   * @param {string} feedback.recommendationId - 推荐ID
   * @param {number} feedback.rating - 评分(1-5)
   * @param {string} feedback.comment - 评论
   * @returns {Promise} 反馈结果
   */
  static submitFeedback(feedback = {}) {
    return request.post('/api/v1/recommend/feedback', feedback);
  }
}
 
export default RecommendAPIService;