/**
|
* 推荐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;
|