增加分机状态获取

This commit is contained in:
lilong 2020-05-25 19:00:49 +08:00
parent 910c1f6e26
commit fd056ce83a
6 changed files with 51 additions and 12 deletions

View File

@ -60,6 +60,7 @@ class eslListen extends Command
}
//====================== 接收事件参数验证 ====================
$eventarr = [
'CHANNEL_CALLSTATE',
'CHANNEL_ANSWER',
'RECORD_START',
'RECORD_STOP',
@ -95,11 +96,22 @@ class eslListen extends Command
$info = $fs->serialize($received_parameters, "json");
$info = json_decode($info,true);
$eventname = Arr::get($info,"Event-Name"); //事件名称
$uuid = Arr::get($info,"Unique-ID"); //事件名称
$CallerCallerIDNumber = Arr::get($info,"Caller-Caller-ID-Number"); //事件名称
$CallerCalleeIDNumber = Arr::get($info,"Caller-Destination-Number"); //事件名称
$uuid = Arr::get($info,"Unique-ID"); //UUID
$CallerCallerIDNumber = Arr::get($info,"Caller-Caller-ID-Number"); //主叫
$CallerCalleeIDNumber = Arr::get($info,"Caller-Destination-Number"); //被叫
switch ($eventname){
//呼叫状态
case 'CHANNEL_CALLSTATE':
//是分机号才记录
if (preg_match('/\d{4,5}/',$CallerCallerIDNumber)){
$status = Arr::get($info,'Channel-Call-State');
$uniqueid = Arr::get($info,'Caller-Unique-ID');
Redis::set($CallerCallerIDNumber.'_state',$status);
Redis::setex($CallerCallerIDNumber.'_uuid',1200, $uniqueid);
}
break;
//通道应答
case 'CHANNEL_ANSWER':
$otherUuid = Arr::get($info,"Other-Leg-Unique-ID");
$cdr_uuid = md5($uuid.Redis::incr('cdr_uuid_incr_key'));
@ -150,6 +162,7 @@ class eslListen extends Command
unset($fullfile);
}
break;
//开始说话
case 'RECORD_START':
$channel = Redis::get($uuid);
if ($channel){
@ -159,6 +172,7 @@ class eslListen extends Command
Redis::set($uuid,json_encode($data));
}
break;
//结束说话
case 'RECORD_STOP':
if (Redis::get($this->asr_status_key)==1) {
$channel = Redis::get($uuid);
@ -192,6 +206,7 @@ class eslListen extends Command
unset($channel);
}
break;
//挂断
case 'CHANNEL_HANGUP_COMPLETE':
$channel = Redis::get($uuid);
if ($channel){
@ -214,6 +229,7 @@ class eslListen extends Command
$customer_caller = Arr::get($info,'variable_customer_caller',null);
if (empty($otherType) || $otherType == 'originatee') {
Redis::del($CallerCallerIDNumber.'_uuid');
$data = [
'table_name' => $this->cdr_table,
'leg_type' => 'A',

View File

@ -31,7 +31,7 @@ class SipController extends Controller
}
$res = $query->orderByDesc('id')->paginate($request->get('limit', 30));
foreach ($res->items() as $d){
$d->status = $d->getStatus($d->username);
//$d->status = $d->getStatus($d->username);
}
$data = [
'code' => 0,

View File

@ -73,10 +73,10 @@ class ApiController extends Controller
}
//检测10秒重复请求
if(Redis::get('check_'.$data['exten'])!=null){
if(Redis::get($data['exten'].'_check')!=null){
return Response::json(['code'=>1,'msg'=>'重复请求,请稍后再试']);
}else{
Redis::setex('check_'.$data['exten'],10,'exist');
Redis::setex($data['exten'].'_check',10,'exist');
}
//验证分机信息
@ -167,7 +167,7 @@ class ApiController extends Controller
$fs->bgapi($dialStr);
$fs->disconnect();
//20分钟过期
Redis::setex($data['exten'],1200, $aleg_uuid);
Redis::setex($data['exten'].'_uuid',1200, $aleg_uuid);
return Response::json(['code'=>0,'msg'=>'呼叫成功','data'=>['uuid'=>$aleg_uuid,'time'=>date('Y-m-d H:i:s')]]);
}catch (\Exception $exception){
Log::info("呼叫错误:".$exception->getMessage());
@ -184,9 +184,9 @@ class ApiController extends Controller
public function hangup(Request $request)
{
$exten = $request->get('exten');
$uuid = !empty($exten) ? Redis::get($exten) : '';
if(empty($uuid)){
return Response::json(['code'=>0,'msg'=>'无通话']);
$uuid = Redis::get($exten.'_uuid');
if($uuid == null){
return Response::json(['code'=>0,'msg'=>'已挂断']);
}
$sip = Sip::where('username',$exten)->first();
if ($sip == null) {
@ -199,7 +199,7 @@ class ApiController extends Controller
if ($fs->connect($service['host'],$service['port'],$service['password'])) {
$fs->bgapi("uuid_kill",$uuid);
$fs->disconnect();
Redis::del($exten);
Redis::del($exten.'_uuid');
return Response::json(['code'=>0,'msg'=>'已挂断']);
}

View File

@ -3,7 +3,9 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class Sip extends Model
{
@ -18,6 +20,18 @@ class Sip extends Model
'gateway_id',
];
protected $appends = ['status','state'];
public function getStateAttribute()
{
$state = Redis::get($this->username.'_state')??0;
return $this->attributes['state'] = Arr::get(config('freeswitch.channel_callstate'),$state,'-');
}
public function getStatusAttribute()
{
return $this->attributes['status'] = $this->getStatus($this->username);
}
/**
* 所属网关

View File

@ -52,6 +52,14 @@ return [
'random' => '随机振铃',
],
//呼叫状态
'channel_callstate' => [
'DOWN' => '空闲',
'RINGING' => '响铃',
'ACTIVE' => '通话中',
'HANGUP' => '已挂断',
],
//坐席状态status
'agent_status' => [
'Logged Out' => '签出',

View File

@ -60,7 +60,8 @@
,{field: 'effective_caller_id_number', title: '外显号码'}
,{field: 'outbound_caller_id_name', title: '出局名称'}
,{field: 'outbound_caller_id_number', title: '出局号码'}
,{field: 'status', title: '状态'}
,{field: 'status', title: '注册状态'}
,{field: 'state', title: '呼叫状态'}
,{field: 'created_at', title: '添加时间'}
,{fixed: 'right', width: 220, align:'center', toolbar: '#options', title:'操作'}
]]