| | |
| | | import { request } from './request'; |
| | | |
| | | class OutboundBotAPIService { |
| | | |
| | | |
| | | /** |
| | | * 创建外呼任务 |
| | | * POST /api/v1/outbound-bot/call |
| | | * @param {Object} data - 外呼任务数据 |
| | | * @param {string} data.caseRef - 案件编号 |
| | | * @param {string} data.personId - 申请方或被申请方id |
| | | * @param {string} data.mediationStage - 外呼话术阶段(10~14) |
| | | * @param {string} data.phoneNumber - 当事人电话号码 |
| | | * @param {string} data.type - 外呼类型(intent_survey/fact_finding/material_verify/agreement/follow_up) |
| | | * @param {string} data.partyType - 当事人类型(applicant/respondent) |
| | | * @param {boolean} data.forceUseInput - 是否强制使用输入号码 |
| | | * @returns {Promise} 外呼任务创建结果 |
| | | * 智能外呼拨打电话 |
| | | * POST /api/v1/outbound-bot/call-v2 |
| | | * @param {Object} data - 请求数据 |
| | | * @param {string} data.caseRef - 案件引用ID |
| | | * @param {string} data.phoneNumber - 电话号码 |
| | | * @param {string} data.scriptId - 脚本ID |
| | | * @param {Object} data.variables - 变量参数 |
| | | * @returns {Promise} 外呼结果 |
| | | */ |
| | | static createCallTask(data = {}) { |
| | | return request.post('/api/v1/outbound-bot/call', data); |
| | | static makeCallV2(data = {}) { |
| | | return request.post('/api/v1/outbound-bot/call-v2', data); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼任务详情 |
| | | * GET /api/v1/outbound-bot/task/{taskId} |
| | | * @param {string} taskId - 任务ID |
| | | * @returns {Promise} 任务详情 |
| | | */ |
| | | static getCallTaskDetail(taskId) { |
| | | return request.get(`/api/v1/outbound-bot/task/${taskId}`); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼任务列表 |
| | | * GET /api/v1/outbound-bot/tasks |
| | | * 获取通话录音接口 |
| | | * GET /api/v1/outbound-bot/conversation-log |
| | | * @param {Object} params - 查询参数 |
| | | * @param {string} params.caseRef - 案件编号 |
| | | * @param {string} params.status - 任务状态 |
| | | * @param {string} params.type - 外呼类型 |
| | | * @param {number} params.page - 页码 |
| | | * @param {number} params.size - 每页数量 |
| | | * @returns {Promise} 任务列表 |
| | | * @param {string} params.caseId - 案件ID |
| | | * @param {string} params.personId - 当事人ID |
| | | * @param {string} params.jobId - 工作ID |
| | | * @returns {Promise} 通话记录 |
| | | */ |
| | | static getCallTasks(params = {}) { |
| | | return request.get('/api/v1/outbound-bot/tasks', params); |
| | | static getConversationLog(params = {}) { |
| | | return request.get('/api/v1/outbound-bot/conversation-log', params); |
| | | } |
| | | |
| | | /** |
| | | * 取消外呼任务 |
| | | * POST /api/v1/outbound-bot/task/{taskId}/cancel |
| | | * @param {string} taskId - 任务ID |
| | | * @param {string} reason - 取消原因 |
| | | * @returns {Promise} 取消结果 |
| | | * 通话状态查询 |
| | | * GET /api/v1/outbound-bot/status |
| | | * @param {Object} params - 查询参数 |
| | | * @param {string} params.caseRef - 案件ID |
| | | * @param {string} params.phoneNumber - 电话号码 |
| | | * @param {string} params.jobId - 工作ID |
| | | * @returns {Promise} 通话状态 |
| | | */ |
| | | static cancelCallTask(taskId, reason) { |
| | | return request.post(`/api/v1/outbound-bot/task/${taskId}/cancel`, { reason }); |
| | | static getCallStatus(params = {}) { |
| | | return request.get('/api/v1/outbound-bot/status', params); |
| | | } |
| | | |
| | | /** |
| | | * 重试外呼任务 |
| | | * POST /api/v1/outbound-bot/task/{taskId}/retry |
| | | * @param {string} taskId - 任务ID |
| | | * @returns {Promise} 重试结果 |
| | | * 更新呼叫状态 |
| | | * POST /api/v1/outbound-bot/update-status |
| | | * @param {Object} data - 请求数据 |
| | | * @param {string} data.jobId - 工作ID |
| | | * @param {string} data.callStatus - 外呼状态 |
| | | * @returns {Promise} 状态更新结果 |
| | | */ |
| | | static retryCallTask(taskId) { |
| | | return request.post(`/api/v1/outbound-bot/task/${taskId}/retry`); |
| | | static updateCallStatus(data) { |
| | | return request.post('/api/v1/outbound-bot/update-status', data); |
| | | } |
| | | |
| | | static syncStatusByCase(data) { |
| | | return request.post('/api/v1/outbound-bot/sync-status-by-case', data); |
| | | } |
| | | |
| | | static backfillConversationByCase(data) { |
| | | return request.post('/api/v1/outbound-bot/backfill-conversation-by-case', data); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼统计信息 |
| | | * GET /api/v1/outbound-bot/statistics |
| | | * @param {Object} params - 统计参数 |
| | | * @param {string} params.caseRef - 案件编号 |
| | | * @param {string} params.startTime - 开始时间 |
| | | * @param {string} params.endTime - 结束时间 |
| | | * @returns {Promise} 统计信息 |
| | | * 获取通话录音文件 |
| | | * GET /api/v1/outbound-bot/file-play |
| | | * @param {string} recordUrl - 录音文件相对路径 |
| | | * @returns {Promise} 音频文件Blob |
| | | */ |
| | | static getCallStatistics(params = {}) { |
| | | return request.get('/api/v1/outbound-bot/statistics', params); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼话术模板 |
| | | * GET /api/v1/outbound-bot/scripts |
| | | * @param {string} type - 外呼类型 |
| | | * @param {string} stage - 调解阶段 |
| | | * @returns {Promise} 话术模板列表 |
| | | */ |
| | | static getCallScripts(type, stage) { |
| | | return request.get('/api/v1/outbound-bot/scripts', { type, stage }); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼任务执行日志 |
| | | * GET /api/v1/outbound-bot/task/{taskId}/logs |
| | | * @param {string} taskId - 任务ID |
| | | * @param {number} page - 页码 |
| | | * @param {number} size - 每页数量 |
| | | * @returns {Promise} 执行日志 |
| | | */ |
| | | static getCallTaskLogs(taskId, page = 1, size = 20) { |
| | | return request.get(`/api/v1/outbound-bot/task/${taskId}/logs`, { page, size }); |
| | | } |
| | | |
| | | /** |
| | | * 批量创建外呼任务 |
| | | * POST /api/v1/outbound-bot/batch-call |
| | | * @param {Array} tasks - 任务数组 |
| | | * @returns {Promise} 批量创建结果 |
| | | */ |
| | | static createBatchCallTasks(tasks = []) { |
| | | return request.post('/api/v1/outbound-bot/batch-call', { tasks }); |
| | | } |
| | | |
| | | /** |
| | | * 根据案件信息智能创建外呼任务 |
| | | * @param {Object} caseInfo - 案件信息 |
| | | * @param {string} caseInfo.caseRef - 案件编号 |
| | | * @param {string} caseInfo.mediationStage - 调解阶段 |
| | | * @param {Array} caseInfo.parties - 当事人信息数组 |
| | | * @param {Object} options - 创建选项 |
| | | * @returns {Promise} 创建结果 |
| | | */ |
| | | static async createSmartCallTasks(caseInfo, options = {}) { |
| | | const { |
| | | callType = 'material_verify', // 默认外呼类型 |
| | | forceUseInput = false // 是否强制使用输入号码 |
| | | } = options; |
| | | |
| | | const tasks = []; |
| | | |
| | | // 为每个当事人创建外呼任务 |
| | | caseInfo.parties.forEach(party => { |
| | | // 验证必要字段 |
| | | if (!party.personId || !party.phoneNumber) { |
| | | console.warn(`当事人信息不完整:`, party); |
| | | return; |
| | | } |
| | | |
| | | tasks.push({ |
| | | caseRef: caseInfo.caseRef, |
| | | personId: party.personId, |
| | | mediationStage: caseInfo.mediationStage, |
| | | phoneNumber: party.phoneNumber, |
| | | type: callType, |
| | | partyType: party.type || 'applicant', // 默认为申请人 |
| | | forceUseInput: forceUseInput |
| | | static async getAudioFile(recordUrl) { |
| | | try { |
| | | const response = await request.get('/api/v1/outbound-bot/file-play', { |
| | | recordUrl |
| | | }, { |
| | | responseType: 'blob', |
| | | headers: { |
| | | 'Content-Type': 'audio/wav', |
| | | 'Content-Disposition': 'inline' |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | if (tasks.length === 0) { |
| | | return Promise.reject(new Error('没有有效的当事人信息用于创建外呼任务')); |
| | | |
| | | // axios返回的是response对象,blob在response.data中 |
| | | return response.data; |
| | | } catch (error) { |
| | | console.error('获取录音文件失败:', error); |
| | | throw error; |
| | | } |
| | | |
| | | return this.createBatchCallTasks(tasks); |
| | | } |
| | | |
| | | /** |
| | | * 获取当事人外呼历史 |
| | | * GET /api/v1/outbound-bot/person/{personId}/history |
| | | * @param {string} personId - 当事人ID |
| | | * @param {Object} params - 查询参数 |
| | | * @returns {Promise} 外呼历史记录 |
| | | */ |
| | | static getPersonCallHistory(personId, params = {}) { |
| | | return request.get(`/api/v1/outbound-bot/person/${personId}/history`, params); |
| | | } |
| | | |
| | | /** |
| | | * 更新外呼任务 |
| | | * PUT /api/v1/outbound-bot/task/{taskId} |
| | | * @param {string} taskId - 任务ID |
| | | * @param {Object} data - 更新数据 |
| | | * @returns {Promise} 更新结果 |
| | | */ |
| | | static updateCallTask(taskId, data = {}) { |
| | | return request.put(`/api/v1/outbound-bot/task/${taskId}`, data); |
| | | } |
| | | |
| | | /** |
| | | * 获取外呼配置 |
| | | * GET /api/v1/outbound-bot/config |
| | | * @returns {Promise} 外呼配置信息 |
| | | */ |
| | | static getCallConfig() { |
| | | return request.get('/api/v1/outbound-bot/config'); |
| | | } |
| | | } |
| | | |
| | | export default OutboundBotAPIService; |
| | | export default OutboundBotAPIService; |