平安外呼系统

This commit is contained in:
lcc
2025-08-15 13:58:48 +08:00
parent 4a598a7233
commit b11441c590
7 changed files with 257 additions and 13 deletions
@@ -0,0 +1,78 @@
<?php
defined('BASEPATH') or exit('No direct script access allowed');
require_once APPPATH . 'controllers/pingan/BaseController.php';
class Log extends BaseController
{
public function __construct()
{
parent::__construct();
$this->load->model('receiver/receiver_call_model', 'callModel');
$this->load->model('receiver/receiver_clues_model', 'cluesModel');
$this->cluesModel->set_db('ssdb');
$this->callModel->set_db('ssdb');
}
public function page_get()
{
$params = $this->input_param();
$page = $params['page'] ?: 1;
$limit = $params['limit'] ?: 10;
$sort_order = 'id desc';
$where = $this->buildWhere();
$count = $this->callModel->count($where);
$list = [];
if ($count) {
$rows = $this->callModel->select($where, $sort_order, $page, $limit);
foreach ($rows as $v) {
$temp = $v;
$temp['customerPhoneNo'] = mobile_asterisk($v['customerPhoneNo']);
$temp['finishTypeCn'] = Receiver_call_model::finishTypeList[$v['finishType']] ?: '';
$temp['callTypeCn'] = Receiver_call_model::callTypeList[$v['callType']] ?: '';
$temp['hangupTypeCn'] = Receiver_call_model::hangupTypeList[$v['hangupType']] ?: '';
$list[] = $temp;
}
}
$data = ['list' => $list, 'count' => $count];
$this->return_response_list($data);
}
/**
* 搜索条件
* @return void
*/
public function search_get()
{
$data = [];
$data['finishTypeList'] = Receiver_call_model::finishTypeList;;
$data['callTypeList'] = Receiver_call_model::callTypeList;
$data['hangupTypeList'] = Receiver_call_model::hangupTypeList;
$this->return_response_list($data);
}
private function buildWhere()
{
$params = $this->input_param();
$where = [
'cfUid' => $_SESSION['id']
];
$params['orderId'] && $where["orderId like '%{$params['orderId']}%'"] = null;
$params['agentId'] && $where['agentId'] = $params['agentId'];
$params['voiceId'] && $where['voiceId'] = $params['voiceId'];
$params['customerPhoneNo'] && $where['customerPhoneNo'] = $params['customerPhoneNo'];
strlen($params['finishType']) && $where['finishType'] = $params['finishType'];
strlen($params['callType']) && $where['callType'] = $params['callType'];
strlen($params['hangupType']) && $where['hangupType'] = $params['hangupType'];
if ($params['startTime'][0] && $params['startTime'][1]) {
$where['startTime >='] = $params['startTime'][0] . ' 00:00:00';
$where['startTime <='] = $params['startTime'][1] . ' 23:59:59';
}
if ($params['endTime'][0] && $params['endTime'][1]) {
$where['endTime >='] = $params['endTime'][0] . ' 00:00:00';
$where['endTime <='] = $params['endTime'][1] . ' 23:59:59';
}
return $where;
}
}
@@ -27,6 +27,7 @@ class Clues extends BaseController
$this->mdReceiverXz->set_db('ssdb');
$this->mdOplogs->set_db('ssdb');
$this->receiver_enroll_model->set_db('ssdb');
$this->load->library('api/callPhone');
}
public function page_get()
@@ -380,5 +381,23 @@ class Clues extends BaseController
}
$this->return_response();
}
/**
* 拨打电话
* @return void
*/
public function call_post()
{
$params = $this->input_param();
if (!$params['id']) {
$this->return_json('参数错误!');
}
$callPhone = new CallPhone();
$result = $callPhone->Call(Receiver_call_model::CF_TYPE_CLUE, $params['id'], $_SESSION['id'], $_SESSION['username'], $_SESSION['userCode']);
if (!$result->isSuccess()) {
$this->return_json($result->getMessage());
}
$this->return_response();
}
}
@@ -32,7 +32,9 @@ class UserInfo extends BaseController
'bankCardNum' => $row['bankCardNum'] ?: '',
'bankName' => $row['bankName'] ?: '',
'cardA' => $row['cardA'] ? changeImg(explode(',', $row['cardA'])) : [],
'cardB' => $row['cardB'] ? changeImg(explode(',', $row['cardB'])) : []
'cardB' => $row['cardB'] ? changeImg(explode(',', $row['cardB'])) : [],
'mobile' => $row['mobile'],
'cti' => $row['cti']
];
$this->return_response($data);
}
@@ -56,4 +58,23 @@ class UserInfo extends BaseController
}
$this->return_response();
}
/**
* 修改手机号
* @return void
*/
public function mobile_put()
{
$userId = $_SESSION['id'];
$params = $this->input_param();
$upData = [
'mobile' => $params['mobile'] ?: '',
'cti' => $params['cti'] ?: ''
];
$res = $this->userData->update($upData, ['userId' => $userId]);
if (!$res) {
$this->return_json("更新失败");
}
$this->return_response();
}
}
+92
View File
@@ -0,0 +1,92 @@
<?php
class CallPhone
{
private $ci;
public function __construct()
{
$this->ci = &get_instance();
$this->ci->load->model('agent/pingan/pingan_users_data_model', 'userData');
$this->ci->load->model('receiver/receiver_clues_model', 'clues_model');
$this->ci->load->model('receiver/receiver_clue_oplogs_model', 'mdOplogs');
$this->ci->load->model('receiver/receiver_call_model', 'callModel');
$this->ci->clues_model->set_db('ssdb');
$this->ci->mdOplogs->set_db('ssdb');
$this->ci->callModel->set_db('ssdb');
$this->ci->load->library('carHome/CallOut');
}
/**
* @param $cfType int 类型 1线索
* @param $cfId int 来源id
* @param $cfUid int 用户id
* @param $cfName string 操作用户名
* @return MyResponse
*/
public function Call($cfType, $cfId, $cfUid, $cfName, $userCode)
{
$this->ci->callModel->db->trans_begin();
try {
$userData = $this->ci->userData->get(['userId' => $cfUid]);
if (!$userData['mobile']) {
throw new Exception('请先配置分机号');
}
$agentPhoneNo = $userData['mobile'];
$agentId = $userData['cti'];
$agentUm = $userCode;
$cityId = 350200;
if ($cfType == Receiver_call_model::CF_TYPE_CLUE) {
$clues = $this->ci->clues_model->get(['id' => $cfId]);
if (!$clues) {
throw new Exception('线索不存在');
}
$orderId = $clues['sid'];
$customerPhoneNo = $clues['mobile'];
$clues['city_id'] && $cityId = $clues['city_id'];
} else {
throw new Exception('来源类型错误');
}
$requestId = create_order_no($cityId, 'pingan');
$callOut = new CallOut();
$callReq = $callOut->call($orderId, $requestId, $agentPhoneNo, $customerPhoneNo, $agentId, $agentUm);
if (!$callReq->isSuccess()) {
throw new Exception($callReq->getMessage());
}
$callData = [
'reqId' => $requestId,
'orderId' => $orderId,
'customerPhoneNo' => $customerPhoneNo,
'agentPhoneNo' => $agentPhoneNo,
'apiResult' => json_encode($callReq->getData(), JSON_UNESCAPED_UNICODE),
'cfUid' => $cfUid,
'cfId' => $cfId,
'cfType' => $cfType,
'cfPlatform' => Receiver_call_model::CF_PLATFORM_AGENT_PINGAN,
'createTime' => time(),
];
$callLogId = $this->ci->callModel->add($callData);
if (!is_numeric($callLogId)) {
throw new Exception('添加通话记录失败');
}
if ($cfType == Receiver_call_model::CF_TYPE_CLUE) {
$optLogId = $this->ci->mdOplogs->add([
'clue_id' => $cfId,
'pingan_user_id' => $cfUid,
'uname' => $cfName,
'type' => Receiver_clue_oplogs_model::OP_TYPE_AUTO_CALL,
'log' => '',
'c_time' => time()
]);
if (!is_numeric($optLogId)) {
throw new Exception('添加操作日志失败');
}
}
$this->ci->callModel->db->trans_commit();
return new MyRESPONSE(EXIT_SUCCESS, '提交成功');
} catch (Exception $e) {
$this->ci->callModel->db->trans_rollback();
return new MyResponse(EXIT_ERROR, "参数错误");
}
}
}
+22 -10
View File
@@ -23,6 +23,7 @@ class CallOut
// 测试环境:
// 汽车之家外呼接口(互联网主线): http://202.105.128.251:18081/bas_car_home_ping_tai/car/v1/call
// 汽车之家外呼接口(互联网备线): http://218.18.234.155:18081/bas_car_home_ping_tai/car/v1/call
private $logDir = 'carHome';
public function __construct()
{
@@ -34,30 +35,41 @@ class CallOut
}
}
public function call()
public function call($orderId, $requestId, $agentPhoneNo, $customerPhoneNo, $agentId = '', $agentUm = '', $pushUrl = '')
{
$logPath = 'call.log';
try {
$agentPhoneNo = '18350451617';
$customerPhoneNo = '13365081602';
// $agentPhoneNo = '18350451617';
// $customerPhoneNo = '13365081602';
debug_log("加密前手机号:" . json_encode(['agentPhoneNo' => $agentPhoneNo, 'customerPhoneNo' => $customerPhoneNo]), $logPath, $this->logDir);
$enAgentPhoneNo = $this->aesEcbPkcs5Encrypt($agentPhoneNo, $this->aesKey);
$enCustomerPhoneNo = $this->aesEcbPkcs5Encrypt($customerPhoneNo, $this->aesKey);
$params = [
'orderId' => md5(time()), //必选 String 订单号
'orderId' => $orderId, //必选 String 订单号
'agentPhoneNo' => $enAgentPhoneNo, //必选 String 坐席分机。坐席分机如采用AES加密,汽车之家系统传加密后的号码
'customerPhoneNo' => $enCustomerPhoneNo, //必选 String 客户手机号码。加密规则与坐席分机一致
// 'agentId' => '', //备选 String 坐席工号(汽车之家上报开通的中兴平台唯一cti号码)
// 'agentUm' => '', //备选 String 坐席Um(汽车之家人员um账号)
'displayedPhoneNo' => '0', //必选 String 外显号码(传“0”和空值均为云中继外显)
];
$agentId && $params['agentId'] = $agentId; //备选 String 坐席工号(汽车之家上报开通的中兴平台唯一cti号码)
$agentUm && $params['agentUm'] = $agentUm; //备选 String 坐席Um(汽车之家人员um账号)
$pushUrl && $params['pushUrl'] = $pushUrl; //如果有传此字段,那么推送话单数据,就推到这里
$reqParams = [
'ctiType' => $this->ctiType,
'requestId' => time(),
'requestId' => $requestId,
'para' => $params
];
$req = $this->send($this->baseUrl, $reqParams, self::METHOD_POST);
print_r($req);
debug_log("请求参数:" . json_encode($reqParams, JSON_UNESCAPED_UNICODE), $logPath, $this->logDir);
list($req, $header, $httpStatus) = $this->send($this->baseUrl, $reqParams, self::METHOD_POST);
debug_log("响应状态码:" . $httpStatus, $logPath, $this->logDir);
debug_log("响应结果:" . $req, $logPath, $this->logDir);
$reqArr = json_decode($req, true);
if (isset($reqArr['code']) && intval($reqArr['code']) == 200) {
return new Myresponse(EXIT_SUCCESS, '操作成功', $reqArr);
} else {
throw new Exception($reqArr['msg']);
}
} catch (\Exception $e) {
return new MyResponse(EXIT_ERROR, $e->getMessage());
}
}
@@ -0,0 +1,20 @@
<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Receiver_call_model extends HD_Model
{
private $table_name = 'lc_receiver_call';
// cfType 类型 1线索
const CF_TYPE_CLUE = 1;
// cfPlatform 来源平台
const CF_PLATFORM_AGENT_PINGAN = 'AgentPingAn';
const finishTypeList = [0 => '通话未完成', 1 => '通话完成', 2 => '通话失败'];
const callTypeList = [0 => '呼入', 1 => '呼出'];
const hangupTypeList = [0 => '客户挂断', 1 => '坐席挂断'];
public function __construct()
{
parent::__construct($this->table_name, 'default');
}
}
@@ -6,11 +6,12 @@
* Time: 13:47
*/
defined('BASEPATH') OR exit('No direct script access allowed');
defined('BASEPATH') or exit('No direct script access allowed');
class Receiver_clue_oplogs_model extends HD_Model
{
private $table_name = 'lc_receiver_clue_oplogs';
const OP_TYPE_AUTO_CALL = 4; //汽车之家外呼
public function __construct()
{
@@ -25,7 +26,8 @@ class Receiver_clue_oplogs_model extends HD_Model
*/
public function typeAry()
{
return array(0 => '小记', 1 => '发短信', 2 => '拨打电话', 3 => '新增', 9 => '系统');
//4 汽车之家外呼拨打拨打电话
return array(0 => '小记', 1 => '发短信', 2 => '拨打电话', 3 => '新增', 4 => '拨打电话', 9 => '系统');
}
}