From 6f45735adfdcd973a19f638f9ced9629f79cd6de Mon Sep 17 00:00:00 2001
From: shimai <shimai@example.com>
Date: Wed, 15 Apr 2026 16:12:01 +0800
Subject: [PATCH] v2.0: 提交当前所有变更,准备创建v2.0标签

---
 web-app/src/services/OutboundBotAPIService.js |  240 ++++++++++++++++++++++-------------------------------------
 1 files changed, 91 insertions(+), 149 deletions(-)

diff --git a/web-app/src/services/OutboundBotAPIService.js b/web-app/src/services/OutboundBotAPIService.js
index 4ae4c4a..f582ded 100644
--- a/web-app/src/services/OutboundBotAPIService.js
+++ b/web-app/src/services/OutboundBotAPIService.js
@@ -7,188 +7,130 @@
 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} 重试结果
+   * 触发外呼任务(后端驱动,MQ异步处理)
+   * POST /api/v1/outbound-bot/trigger
+   * @param {Object} data - 请求数据
+   * @param {string} data.mediationId - 调解反馈表ID
+   * @param {string} data.caseId - 案件ID
+   * @param {number} data.callAuto - 呼叫模式 (0:自动, 1:手动)
+   * @param {string} data.callPersonId - 手动模式指定当事人ID
+   * @returns {Promise} 触发结果
    */
-  static retryCallTask(taskId) {
-    return request.post(`/api/v1/outbound-bot/task/${taskId}/retry`);
+  static triggerOutbound(data = {}) {
+    return request.post('/api/v1/outbound-bot/trigger', data);
   }
 
   /**
-   * 获取外呼统计信息
-   * GET /api/v1/outbound-bot/statistics
-   * @param {Object} params - 统计参数
-   * @param {string} params.caseRef - 案件编号
-   * @param {string} params.startTime - 开始时间
-   * @param {string} params.endTime - 结束时间
-   * @returns {Promise} 统计信息
+   * 获取当前节点活跃外呼记录(后端驱动模式下补充 localStorage)
+   * GET /api/v1/outbound-bot/active-records
+   * @param {Object} params
+   * @param {string} params.mediationId - 调解反馈表ID
+   * @returns {Promise} 活跃外呼记录列表
    */
-  static getCallStatistics(params = {}) {
-    return request.get('/api/v1/outbound-bot/statistics', params);
+  static getActiveRecords(params = {}) {
+    return request.get('/api/v1/outbound-bot/active-records', params);
   }
 
   /**
-   * 获取外呼话术模板
-   * GET /api/v1/outbound-bot/scripts
-   * @param {string} type - 外呼类型
-   * @param {string} stage - 调解阶段
-   * @returns {Promise} 话术模板列表
+   * 更新呼叫状态
+   * [已废弃] 状态更新现由后端回调驱动,前端不再调用
+   * POST /api/v1/outbound-bot/update-status
+   * @param {Object} data - 请求数据
+   * @param {string} data.jobId - 工作ID
+   * @param {string} data.callStatus - 外呼状态
+   * @returns {Promise} 状态更新结果
    */
-  static getCallScripts(type, stage) {
-    return request.get('/api/v1/outbound-bot/scripts', { type, stage });
+  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/task/{taskId}/logs
-   * @param {string} taskId - 任务ID
-   * @param {number} page - 页码
-   * @param {number} size - 每页数量
-   * @returns {Promise} 执行日志
+   * 查询AI处理状态(摘要生成/情绪识别是否进行中)
+   * GET /api/v1/outbound-bot/ai-processing-status
+   * @param {Object} params
+   * @param {string} params.mediation_id - 调解反馈表ID
+   * @returns {Promise} AI处理状态列表
    */
-  static getCallTaskLogs(taskId, page = 1, size = 20) {
-    return request.get(`/api/v1/outbound-bot/task/${taskId}/logs`, { page, size });
+  static getAiProcessingStatus(params = {}) {
+    return request.get('/api/v1/outbound-bot/ai-processing-status', params);
   }
 
   /**
-   * 批量创建外呼任务
-   * POST /api/v1/outbound-bot/batch-call
-   * @param {Array} tasks - 任务数组
-   * @returns {Promise} 批量创建结果
+   * 获取通话录音文件
+   * GET /api/v1/outbound-bot/file-play
+   * @param {string} recordUrl - 录音文件相对路径
+   * @returns {Promise} 音频文件Blob
    */
-  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;
\ No newline at end of file
+export default OutboundBotAPIService;

--
Gitblit v1.8.0