diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index dc9450cb..a91e4665 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -3,8 +3,27 @@
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -16,24 +35,24 @@
$PROJECT_DIR$/composer.json
-
-
-
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
@@ -64,6 +83,7 @@
堆积柱状图
直接
array_get
+ time
department
@@ -83,14 +103,6 @@
@@ -291,19 +311,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -317,15 +324,15 @@
-
-
-
+
+
+
-
-
-
+
+
+
@@ -378,7 +385,9 @@
-
+
+
+
1588737340771
@@ -429,17 +438,23 @@
1588994483788
-
+
+ 1588996402230
+
+
+
+ 1588996402230
+
+
-
+
-
-
+
@@ -452,7 +467,7 @@
-
+
@@ -491,192 +506,10 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -701,20 +534,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -722,33 +541,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -805,26 +600,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -832,20 +608,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -856,15 +618,262 @@
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Console/Commands/asrListen.php b/app/Console/Commands/asrListen.php
index 75d0ecff..a8e2b55d 100644
--- a/app/Console/Commands/asrListen.php
+++ b/app/Console/Commands/asrListen.php
@@ -25,7 +25,6 @@ class asrListen extends Command
protected $channel;
protected $fs_record = '/usr/local/freeswitch/recordings/';
- protected $record_table = null;
/**
* Create a new command instance.
diff --git a/app/Console/Commands/callcenterRun.php b/app/Console/Commands/callcenterRun.php
index f7a6be12..34c2987a 100644
--- a/app/Console/Commands/callcenterRun.php
+++ b/app/Console/Commands/callcenterRun.php
@@ -4,7 +4,6 @@ namespace App\Console\Commands;
use Illuminate\Console\Command;
use GuzzleHttp\Client;
-use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use App\Models\Task;
diff --git a/app/Http/Controllers/Admin/CdrController.php b/app/Http/Controllers/Admin/CdrController.php
index 2cc81b6c..1c965a68 100644
--- a/app/Http/Controllers/Admin/CdrController.php
+++ b/app/Http/Controllers/Admin/CdrController.php
@@ -5,9 +5,12 @@ namespace App\Http\Controllers\Admin;
use App\Models\Cdr;
use App\Models\Sip;
use App\Models\User;
+use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Response;
+use Illuminate\Support\Facades\View;
class CdrController extends Controller
{
@@ -89,5 +92,111 @@ class CdrController extends Controller
return response()->download($cdr->record_file,$uuid.".wav");
}
+ /**
+ * 人员统计
+ * @param Request $request
+ * @return \Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
+ */
+ public function count(Request $request)
+ {
+ $users = User::where('id','!=',config('freeswitch.user_root_id'))->get();
+ if ($request->ajax()){
+ $res = $request->all(['user_id','start_stamp_start','start_stamp_end']);
+ $data = $users->keyBy('id')->all();
+ foreach ($data as &$d){
+ $d['todayCalls'] = 0;
+ $d['todaySuccessCalls'] = 0;
+ $d['todayRateCalls'] = '0.00%';
+ $d['todayThirtyCalls'] = 0;
+ $d['todaySixtyCalls'] = 0;
+ $d['weekCalls'] = 0;
+ $d['weekSuccessCalls'] = 0;
+ $d['weekRateCalls'] = '0.00%';
+ $d['weekThirtyCalls'] = 0;
+ $d['weekSixtyCalls'] = 0;
+ $d['monthCalls'] = 0;
+ $d['monthSuccessCalls'] = 0;
+ $d['monthRateCalls'] = '0.00%';
+ $d['monthThirtyCalls'] = 0;
+ $d['monthSixtyCalls'] = 0;
+ }
+ Cdr::when($res['user_id'],function ($q) use($res){
+ return $q->where('user_id',$res['user_id']);
+ })
+ ->when($res['start_stamp_start'] && !$res['start_stamp_end'],function ($q) use($res){
+ return $q->where('aleg_start_at','>=',$res['start_stamp_start']);
+ })
+ ->when(!$res['start_stamp_start'] && $res['start_stamp_end'],function ($q) use($res){
+ return $q->where('aleg_start_at','<=',$res['start_stamp_end']);
+ })
+ ->when($res['start_stamp_start'] && $res['start_stamp_end'],function ($q) use($res){
+ return $q->whereBetween('aleg_start_at',[$res['start_stamp_start'],$res['start_stamp_end']]);
+ })
+ ->where('user_id','!=',config('freeswitch.user_root_id'))
+ ->orderBy('id','asc')
+ ->chunk(1000,function ($cdrs) use(&$data){
+ foreach ($cdrs as $cdr){
+ foreach ($data as $d){
+ if ($cdr->user_id==$d['id']){
+ $time = strtotime($cdr->aleg_start_at);
+ //当天
+ if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp){
+ $d['todayCalls'] += 1;
+ }
+ if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>0){
+ $d['todaySuccessCalls'] += 1;
+ }
+ if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>30){
+ $d['todayThirtyCalls'] += 1;
+ }
+ if ($time>=Carbon::today()->timestamp && $time<=Carbon::tomorrow()->timestamp && $cdr->billsec>60){
+ $d['todaySixtyCalls'] += 1;
+ }
+ //本周
+ if ($time>=Carbon::now()->startOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp){
+ $d['weekCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>0){
+ $d['weekSuccessCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>30){
+ $d['weekThirtyCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->endOfWeek()->timestamp && $time<=Carbon::now()->endOfWeek()->timestamp && $cdr->billsec>60){
+ $d['weekSixtyCalls'] += 1;
+ }
+ //本月
+ if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp){
+ $d['monthCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>0){
+ $d['monthSuccessCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>30){
+ $d['monthThirtyCalls'] += 1;
+ }
+ if ($time>=Carbon::now()->startOfMonth()->timestamp && $time<=Carbon::now()->endOfMonth()->timestamp && $cdr->billsec>60){
+ $d['monthSixtyCalls'] += 1;
+ }
+ break;
+ }
+ }
+ }
+ });
+ foreach ($data as &$d){
+ $d['todayRateCalls'] = $d['todayCalls']>0?100*round($d['todaySuccessCalls']/$d['todayCalls'],4).'%':'0.00%';
+ $d['weekRateCalls'] = $d['weekCalls']>0?100*round($d['weekSuccessCalls']/$d['weekCalls'],4).'%':'0.00%';
+ $d['monthRateCalls'] = $d['monthCalls']>0?100*round($d['monthSuccessCalls']/$d['monthCalls'],4).'%':'0.00%';
+ }
+ return Response::json([
+ 'code' => 0,
+ 'msg' => '正在请求中...',
+ 'count' => count($data),
+ 'data' => $data,
+ ]);
+ }
+
+ return View::make('admin.cdr.count',compact('users'));
+ }
}
diff --git a/app/Http/Controllers/Admin/IndexController.php b/app/Http/Controllers/Admin/IndexController.php
index d435c070..6553a4a6 100644
--- a/app/Http/Controllers/Admin/IndexController.php
+++ b/app/Http/Controllers/Admin/IndexController.php
@@ -66,5 +66,10 @@ class IndexController extends Controller
});
return Response::json(['code'=>0,'msg'=>'请求成功','data'=>$data]);
}
+
+ public function onlinecall()
+ {
+ return View::make('admin.index.onlinecall');
+ }
}
diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php
index 0189b0e7..2518ac1f 100644
--- a/app/Http/Controllers/ApiController.php
+++ b/app/Http/Controllers/ApiController.php
@@ -67,7 +67,7 @@ class ApiController extends Controller
{
$data = $request->all(['exten','phone','user_data']);
if ($data['exten'] == null || $data['phone'] == null) {
- return Response::json(['code'=>1,'msg'=>'参数错误']);
+ return Response::json(['code'=>1,'msg'=>'号码不能为空']);
}
//检测10秒重复请求
diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php
deleted file mode 100644
index 138c1f08..00000000
--- a/app/Http/Controllers/Auth/ConfirmPasswordController.php
+++ /dev/null
@@ -1,40 +0,0 @@
-middleware('auth');
- }
-}
diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php
deleted file mode 100644
index 465c39cc..00000000
--- a/app/Http/Controllers/Auth/ForgotPasswordController.php
+++ /dev/null
@@ -1,22 +0,0 @@
-middleware('guest')->except('logout');
- }
-}
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
deleted file mode 100644
index c6a6de67..00000000
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ /dev/null
@@ -1,73 +0,0 @@
-middleware('guest');
- }
-
- /**
- * Get a validator for an incoming registration request.
- *
- * @param array $data
- * @return \Illuminate\Contracts\Validation\Validator
- */
- protected function validator(array $data)
- {
- return Validator::make($data, [
- 'name' => ['required', 'string', 'max:255'],
- 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
- 'password' => ['required', 'string', 'min:8', 'confirmed'],
- ]);
- }
-
- /**
- * Create a new user instance after a valid registration.
- *
- * @param array $data
- * @return \App\User
- */
- protected function create(array $data)
- {
- return User::create([
- 'name' => $data['name'],
- 'email' => $data['email'],
- 'password' => Hash::make($data['password']),
- ]);
- }
-}
diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php
deleted file mode 100644
index b1726a36..00000000
--- a/app/Http/Controllers/Auth/ResetPasswordController.php
+++ /dev/null
@@ -1,30 +0,0 @@
-middleware('auth');
- $this->middleware('signed')->only('verify');
- $this->middleware('throttle:6,1')->only('verify', 'resend');
- }
-}
diff --git a/app/Http/Requests/Admin/User/StoreRequest.php b/app/Http/Requests/Admin/User/StoreRequest.php
index 3d6a0464..a530ba9d 100644
--- a/app/Http/Requests/Admin/User/StoreRequest.php
+++ b/app/Http/Requests/Admin/User/StoreRequest.php
@@ -27,11 +27,18 @@ class StoreRequest extends FormRequest
{
return [
'phone' => 'required|numeric|regex:/^1[3456789][0-9]{9}$/|unique:users',
- 'nickname' => 'required|min:4|max:14|unique:users',
+ 'nickname' => 'required|min:2|max:14|unique:users',
'password' => 'required|confirmed|min:6|max:14'
];
}
+ public function attributes()
+ {
+ return [
+ 'nickname' => '昵称',
+ ];
+ }
+
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(['code'=>1,'msg'=>$validator->errors()->first()]));
diff --git a/app/Http/Requests/Admin/User/UpdateRequest.php b/app/Http/Requests/Admin/User/UpdateRequest.php
index dff22592..bf51ada6 100644
--- a/app/Http/Requests/Admin/User/UpdateRequest.php
+++ b/app/Http/Requests/Admin/User/UpdateRequest.php
@@ -31,6 +31,13 @@ class UpdateRequest extends FormRequest
];
}
+ public function attributes()
+ {
+ return [
+ 'nickname' => '昵称',
+ ];
+ }
+
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(['code'=>1,'msg'=>$validator->errors()->first()]));
diff --git a/bootstrap/Freeswitchesl.php b/bootstrap/Freeswitchesl.php
new file mode 100644
index 00000000..33b05044
--- /dev/null
+++ b/bootstrap/Freeswitchesl.php
@@ -0,0 +1,288 @@
+socket = "";
+ $this->sorts = "";
+ $this->length = 1024;
+ }
+
+ public function eliminate($parameter)
+ {
+ $array = array(" "," ","\t","\n","\r");
+ return str_replace($array, '', $parameter);
+ }
+
+ public function eliminateLine($parameter)
+ {
+ return str_replace("\n\n", "\n", $parameter);
+ }
+
+ public function typeClear($response)
+ {
+ $commenType = array("Content-Type: text/event-xml\n","Content-Type: text/event-plain\n","Content-Type: text/event-json\n");
+ return str_replace($commenType, '', $response);
+ }
+
+ public function connect($host,$port,$password)
+ {
+ $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+ $connection = socket_connect($this->socket, $host,$port);
+ $connect = false;
+ $error = "";
+ while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)) {
+ $eliminate_socket_info = $this->eliminate($socket_info);
+ if ($eliminate_socket_info == "Content-Type:auth/request") {
+ socket_write($this->socket, "auth ".$password."\r\n\r\n");
+ }elseif ($eliminate_socket_info == "") {
+ continue;
+ }elseif ($eliminate_socket_info == "Content-Type:command/reply") {
+ continue;
+ }elseif ($eliminate_socket_info == "Reply-Text:+OKaccepted") {
+ $connect = true;
+ break;
+ } else {
+ $error .= $eliminate_socket_info."\r\n";
+ }
+ }
+ if (!$connect) {
+ echo $error;
+ }
+ return $connect;
+ }
+
+ public function api($api,$args="")
+ {
+ if ($this->socket) {
+ socket_write($this->socket, "api ".$api." ".$args."\r\n\r\n");
+ }
+ $response = $this->recvEvent("common");
+ return $response;
+ }
+
+ public function bgapi($api,$args="",$custom_job_uuid="")
+ {
+ if ($this->socket) {
+ socket_write($this->socket, "bgapi ".$api." ".$args." ".$custom_job_uuid."\r\n\r\n");
+ }
+ return "executed";
+ }
+
+ public function execute($app,$args,$uuid)
+ {
+ if ($this->socket) {
+ $str = "sendmsg ".$uuid."\ncall-command: execute\nexecute-app-name: ".$app."\nexecute-app-arg: ".$args."\n\n";
+ socket_write($this->socket, $str);
+ }
+ $response = $this->recvEvent("common");
+ return $response;
+ }
+
+ public function executeAsync($app,$args,$uuid)
+ {
+ if ($this->socket) {
+ $str = "sendmsg ".$uuid."\ncall-command: executeAsync\nexecute-app-name: ".$app."\nexecute-app-arg: ".$args."\n\n";
+ socket_write($this->socket, $str);
+ }
+ return "executed";
+ }
+
+ public function sendmsg($uuid)
+ {
+ if ($this->socket) {
+ socket_write($this->socket, "sendmsg ".$uuid."\r\n\r\n");
+ }
+ return "executed";
+ }
+
+ public function events($sorts,$args)
+ {
+ $this->sorts = $sorts;
+ if ($sorts == "json") {
+ $sorts = "xml";
+ }
+ if ($this->socket) {
+ socket_write($this->socket, "event ".$sorts." ".$args."\r\n\r\n");
+ }
+ return true;
+ }
+
+ public function getHeader($response,$args)
+ {
+ $serialize = $this->serialize($response,"json");
+ $serializearray = json_decode($serialize);
+ try {
+ return $serializearray->$args;
+ } catch (Exception $e) {
+ return "";
+ }
+ }
+
+ public function recvEvent($type="event")
+ {
+ $response = '';
+ $length = 0;
+ $x = 0;
+ /*while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)){
+ $x++;
+ usleep(100);
+ if ($length > 0) {
+ $response .= $socket_info;
+ }
+ if ($length == 0 && strpos($socket_info, 'Content-Length:') !== false) {
+ $lengtharray = explode("Content-Length:",$socket_info);
+ if ($type == "event") {
+ $length = (int)$lengtharray[1]+30;
+ } else {
+ $length = (int)$lengtharray[1];
+ }
+ }
+
+ if ($length > 0 && strlen($response) >= $length) {
+ break;
+ }
+
+ if ($x > 10000) break;
+ }*/
+ //-------------------------------- 2020.02.26 lilong update -----------------------
+ if($type=='common'){
+
+ while ($socket_info = @socket_read($this->socket, 1024, PHP_BINARY_READ)){
+ $x++;
+ usleep(100);
+ $response .= $socket_info;
+ if (strpos($socket_info, 'Content-Length:') !== false) {
+ $lengtharray = explode("Content-Length:",$socket_info);
+ if ($type == "event") {
+ $length = (int)$lengtharray[1]+30;
+ } else {
+ $length = (int)$lengtharray[1];
+ }
+ }
+ if ($length > 0 && strlen(substr($response, strpos($response, "Content-Length: {$length}"))) == $length+strlen("Content-Length: {$length}\r\n")) {
+ break;
+ }
+
+ if ($x > 10000) break;
+ }
+
+ $replace_arr = ["Content-Type: api/response\n","Content-Length: {$length}"];
+ $response = str_replace($replace_arr, '', $response);
+
+
+ }else{
+ //与原代码做兼容
+ while ($socket_info = @socket_read($this->socket, 1024, PHP_NORMAL_READ)){
+ $x++;
+ usleep(100);
+ if ($length > 0) {
+ $response .= $socket_info;
+ }
+ if ($length == 0 && strpos($socket_info, 'Content-Length:') !== false) {
+ $lengtharray = explode("Content-Length:",$socket_info);
+ if ($type == "event") {
+ $length = (int)$lengtharray[1]+30;
+ } else {
+ $length = (int)$lengtharray[1];
+ }
+ }
+
+ if ($length > 0 && strlen($response) >= $length) {
+ break;
+ }
+
+ if ($x > 10000) break;
+ }
+ }
+ //-------------------------------- 2020.02.26 lilong update -----------------------
+
+
+ if ($this->sorts == "json" && $type == "event") {
+ $response = $this->typeClear($response);
+ $responsedata = simplexml_load_string($response);
+ $response = [];
+ foreach ($responsedata->headers->children() as $key => $value) {
+ $response[(string)$key] = (string)$value;
+ }
+ return json_encode($response);
+ } else {
+ $response = $this->eliminateLine($response);
+ }
+ return $response;
+ }
+
+ public function serialize($response,$type)
+ {
+ $response = $this->typeClear($response);
+ if ($this->sorts == $type) return $response;
+ if ($this->sorts == "json") {
+ $responsedata = json_decode($response);
+ if ($type == "plain") {
+ $response = "";
+ foreach ($responsedata as $key => $value) {
+ $responseline = $key.": ".$value."\r\n";
+ $response .= $responseline;
+ }
+ } else {
+ $response = "\r\n \r\n";
+ foreach ($responsedata as $key => $value) {
+ $responseline = " <".$key.">".$value."".$key.">"."\r\n";
+ $response .= $responseline;
+ }
+ $response .= " \r\n";
+ }
+ return $response;
+ } elseif ($this->sorts == "xml") {
+ $responsedata = simplexml_load_string($response);
+ if ($type == "plain") {
+ $response = "";
+ foreach ($responsedata->headers->children() as $key => $value) {
+ $responseline = (string)$key.": ".(string)$value."\r\n";
+ $response .= $responseline;
+ }
+ return $response;
+ } else {
+ $response = [];
+ foreach ($responsedata->headers->children() as $key => $value) {
+ $response[(string)$key] = (string)$value;
+ }
+ return json_encode($response);
+ }
+ } else {
+ $response = str_replace("\n", '","', $response);
+ $response = str_replace(": ", '":"', $response);
+ $response = substr($response, 0, -2);
+ $response = '{"'.$response.'}';
+ if ($type == "json") return $response;
+ $responsedata = json_decode($response);
+ $response = "\r\n \r\n";
+ foreach ($responsedata as $key => $value) {
+ $responseline = " <".$key.">".$value."".$key.">"."\r\n";
+ $response .= $responseline;
+ }
+ $response .= " \r\n";
+ return $response;
+ }
+ }
+
+ public function disconnect()
+ {
+ //-------------------------------- 2020.02.26 lilong add -----------------------
+ socket_write($this->socket, "exit"."\r\n\r\n");
+ //-------------------------------- 2020.02.26 lilong add -----------------------
+ socket_close($this->socket);
+ }
+
+ //只订阅uuid事件
+ public function filteruuid($uuid)
+ {
+ if ($this->socket) {
+ socket_write($this->socket, "filter Unique-ID ".$uuid."\r\n\r\n");
+ }
+ return "filter";
+ }
+
+}
+
diff --git a/bootstrap/Snowflake.php b/bootstrap/Snowflake.php
new file mode 100644
index 00000000..3f9d2bf9
--- /dev/null
+++ b/bootstrap/Snowflake.php
@@ -0,0 +1,77 @@
+
+ */
+class Snowflake
+{
+ //开始时间戳,固定小于当前时间的毫秒,用于缩减时间位数
+ const EPOCH = 1575388800000;
+ //最大机器标识位数,8->255 10->1023
+ const MAX_MACHINE_BIT = 8;
+ //最大随机数位数,12->4095
+ const MAX_RANDOM_BIT = 12;
+
+ /**
+ * 获取一个10进制唯一ID
+ *
+ * 如果$machineId为0,则会忽略掉机器标识位
+ *
+ * @param integer $machineId
+ * @param array $options 数组形式,只包含epoch,maxMachineBit和maxRandomBit
+ * @return integer
+ */
+ public static function nextId($machineId = 1, $options = [])
+ {
+ $epoch = isset($options['epoch']) ? $options['epoch'] : self::EPOCH;
+ $maxMachineBit = isset($options['maxMachineBit']) ? $options['maxMachineBit'] : self::MAX_MACHINE_BIT;
+ $maxRandomBit = isset($options['maxRandomBit']) ? $options['maxRandomBit'] : self::MAX_RANDOM_BIT;
+ //机器标识范围判断
+ $maxMachineId = ~(-1 << $maxMachineBit);
+ if ($machineId > $maxMachineId || $machineId < 0) {
+ throw new \Exception("MachineId can't be less than " . $maxMachineId . " or greater than 0");
+ }
+ //毫秒时间戳
+ $time = \floor(\microtime(true) * 1000);
+ $time -= $epoch;
+
+ //生成随机数,因为php不是内存持久化的,在并发时无法做到维护一个唯一的序列,所以用随机数替代
+ $random = \mt_rand(0, ~(-1 << $maxRandomBit));
+
+ //组合数据 {时间戳差值|机器标识|随机数}
+ //机器标识为0则抛弃掉机器标识
+ if ($machineId == 0) {
+ //时间戳要左移的位数
+ $timeLeftShift = $maxRandomBit;
+ $nextId = ($time << $timeLeftShift) | $random;
+ } else {
+ //时间戳要左移的位数
+ $timeLeftShift = $maxRandomBit + $maxMachineBit;
+ $nextId = ($time << $timeLeftShift) | ($machineId << $maxRandomBit) | $random;
+ }
+
+ return $nextId;
+ }
+
+ /**
+ * 获取一个36进制的唯一ID
+ *
+ * @param integer $machineId
+ * @return string
+ */
+ public static function nextHash($machineId = 0, $options = [])
+ {
+ return \strtoupper(\base_convert(self::nextId($machineId, $options), 10, 36));
+ }
+}
diff --git a/composer.json b/composer.json
index b6b89fc0..bf053c7f 100644
--- a/composer.json
+++ b/composer.json
@@ -42,6 +42,10 @@
"classmap": [
"database/seeds",
"database/factories"
+ ],
+ "files": [
+ "bootstrap/Freeswitchesl.php",
+ "bootstrap/Snowflake.php"
]
},
"autoload-dev": {
diff --git a/config/permission.php b/config/permission.php
index 940fcfc8..e172e784 100644
--- a/config/permission.php
+++ b/config/permission.php
@@ -13,7 +13,7 @@ return [
* `Spatie\Permission\Contracts\Permission` contract.
*/
- 'permission' => Spatie\Permission\Models\Permission::class,
+ 'permission' => App\Models\Permission::class,
/*
* When using the "HasRoles" trait from this package, we need to know which
@@ -24,7 +24,7 @@ return [
* `Spatie\Permission\Contracts\Role` contract.
*/
- 'role' => Spatie\Permission\Models\Role::class,
+ 'role' => App\Models\Role::class,
],
diff --git a/database/seeds/MenuTableSeeder.php b/database/seeds/MenuTableSeeder.php
index 283e401f..2a028517 100644
--- a/database/seeds/MenuTableSeeder.php
+++ b/database/seeds/MenuTableSeeder.php
@@ -210,7 +210,14 @@ class MenuTableSeeder extends Seeder
'type' => 1,
'permission_name' => 'data.cdr',
],
-
+ [
+ 'name' => '呼叫统计',
+ 'route' => 'admin.cdr.count',
+ 'url' => null,
+ 'icon' => 'layui-icon-ios',
+ 'type' => 1,
+ 'permission_name' => 'data.cdr.count',
+ ],
]
],
];
diff --git a/database/seeds/UserTableSeeder.php b/database/seeds/UserTableSeeder.php
index 4a7c7cbd..530f7329 100644
--- a/database/seeds/UserTableSeeder.php
+++ b/database/seeds/UserTableSeeder.php
@@ -248,7 +248,13 @@ class UserTableSeeder extends Seeder
['name' => 'data.cdr.list_department', 'display_name' => '查看部门记录'],
]
],
+ [
+ 'name' => 'data.cdr.count',
+ 'display_name' => '呼叫统计',
+ 'child' => [
+ ]
+ ],
]
],
];
diff --git a/public/layuiadmin/style/keyboard-call.css b/public/layuiadmin/style/keyboard-call.css
new file mode 100644
index 00000000..846b2e3d
--- /dev/null
+++ b/public/layuiadmin/style/keyboard-call.css
@@ -0,0 +1,248 @@
+
+/*打电话键盘*/
+/*.call-warp {*/
+/*background: #FFFFFF;*/
+/*position: absolute;*/
+/*top: 50%;*/
+/*left: 50%;*/
+/*-webkit-transform: translateX(-50%) translateY(-50%);*/
+/*-moz-transform: translateX(-50%) translateY(-50%);*/
+/*-o-transform: translateX(-50%) translateY(-50%);*/
+/*-ms-transform: translateX(-50%) translateY(-50%);*/
+/*transform: translateX(-50%) translateY(-50%);*/
+/*width: 316px;*/
+/*margin: 0 auto;*/
+/*padding: 15px;*/
+/*border: 1px solid rgba(0, 0, 0, .2);*/
+/*border-radius: 8px;*/
+/*outline: 0;*/
+/*-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);*/
+/*box-shadow: 0 3px 9px rgba(0, 0, 0, .5);*/
+/*}*/
+/*.call-input {*/
+/*position: relative;*/
+/*}*/
+/*.call-input input {*/
+/*width: 100%;*/
+/*font-size: 18px;*/
+/*height: 54px;*/
+/*line-height: 24px;*/
+/*padding: 15px 60px 15px 10px;*/
+/*border: 1px solid #D8D8D8;*/
+/*box-sizing: border-box;*/
+/*}*/
+/*.call-input input.error-tips {*/
+/*border: 1px solid #e78081;*/
+/*}*/
+
+/*.number-key {*/
+/*padding: 5px 0 15px;*/
+/*overflow: hidden;*/
+/*}*/
+/*.number-key>a {*/
+/*display: block;*/
+/*float: left;*/
+/*width: 33.3333%;*/
+/*box-sizing: border-box;*/
+/*border: 1px solid #D8D8D8;*/
+/*border-top: none;*/
+/*border-right: none;*/
+/*text-align: center;*/
+/*line-height: 52px;*/
+/*color: #333;*/
+/*font-size: 24px;*/
+/*font-weight: bold;*/
+/*}*/
+/*.number-key>a:hover {*/
+/*background: #eee;*/
+/*}*/
+/*.number-key>a:first-child,*/
+/*.number-key>a:nth-child(2),*/
+/*.number-key>a:nth-child(3) {*/
+/*border-top: 1px solid #D8D8D8;*/
+/*}*/
+/*.number-key>a:nth-child(3n) {*/
+/*border-right: 1px solid #D8D8D8;*/
+/*}*/
+/*.inline {*/
+/*display: inline-block;*/
+/*vertical-align: middle;*/
+/*}*/
+/*.call-btn {*/
+/*display: block;*/
+/*font-size: 18px;*/
+/*text-align: center;*/
+/*border-radius: 4px;*/
+/*color: #fff;*/
+/*line-height: 54px;*/
+/*background: -moz-linear-gradient(top, #02BB92 0%, #09CBA1 100%);*/
+/*background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#02BB92), color-stop(100%,#09CBA1));*/
+/*background: -webkit-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
+/*background: -o-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
+/*background: -ms-linear-gradient(top, #02BB92 0%,#09CBA1 100%);*/
+/*background: linear-gradient(to bottom, #02BB92 0%,#09CBA1 100%);*/
+/*}*/
+/*.call-btn.down{*/
+/*background: -moz-linear-gradient(top, #E47172 0%, #E68181 100%);*/
+/*background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E47172), color-stop(100%,#E68181));*/
+/*background: -webkit-linear-gradient(top,#E47172 0%,#E68181 100%);*/
+/*background: -o-linear-gradient(top, #E47172 0%,#E68181 100%);*/
+/*background: -ms-linear-gradient(top, #E47172 0%,#E68181 100%);*/
+/*background: linear-gradient(to bottom,#E47172 0%,#E68181 100%);*/
+/*}*/
+/*.call-btn.none {*/
+/*display: none;*/
+/*}*/
+/*.del-num:hover,*/
+/*.del-all:hover,*/
+/*.call-btn:hover{*/
+/*color: #fff;*/
+/*opacity: 0.8;*/
+/*}*/
+/*.call-icon {*/
+/*display: inline-block;*/
+/*vertical-align: middle;*/
+/*width: 28px;*/
+/*height: 28px;*/
+/*background: url(../../static/images/dianhua.png);*/
+/*margin-right: 15px;*/
+/*}*/
+/*.del-all {*/
+/*position: absolute;*/
+/*display: block;*/
+/*width: 30px;*/
+/*top: 0;*/
+/*right: 0;*/
+/*bottom: 0;*/
+/*background: url(../../static/images/close.png) no-repeat center center;*/
+/*}*/
+/*.del-num {*/
+/*position: absolute;*/
+/*display: block;*/
+/*width: 30px;*/
+/*top: 0;*/
+/*right: 30px;*/
+/*bottom: 0;*/
+/*background: url(../../static/images/quchu.png) no-repeat center center;*/
+/*}*/
+
+
+/*new 弹窗样式*/
+
+.call-warp {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translateX(-50%) translateY(-50%);
+ -moz-transform: translateX(-50%) translateY(-50%);
+ -o-transform: translateX(-50%) translateY(-50%);
+ -ms-transform: translateX(-50%) translateY(-50%);
+ transform: translateX(-50%) translateY(-50%);
+ width: 240px;
+ margin: 0 auto;
+ padding: 15px;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: 8px;
+ outline: 0;
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.call-input {
+ position: relative;
+}
+.call-input input {
+ width: 100%;
+ font-size: 16px;
+ height: 30px;
+ padding: 15px 60px 15px 10px;
+ border: 1px solid #D8D8D8;
+}
+.call-input input.error-tips {
+ border: 1px solid #e78081;
+}
+.number-key {
+ padding: 5px 0 10px;
+ overflow: hidden;
+}
+.number-key>a {
+ display: block;
+ float: left;
+ width: 33.3333%;
+ box-sizing: border-box;
+ border: 1px solid #D8D8D8;
+ border-top: none;
+ border-right: none;
+ text-align: center;
+ line-height: 30px;
+ color: #333;
+ font-size: 18px;
+ font-weight: bold;
+}
+.number-key>a:hover {
+ background: #eee;
+}
+.number-key>a:first-child,
+.number-key>a:nth-child(2),
+.number-key>a:nth-child(3) {
+ border-top: 1px solid #D8D8D8;
+}
+.number-key>a:nth-child(3n) {
+ border-right: 1px solid #D8D8D8;
+}
+.call-btn {
+ display: block;
+ font-size: 14px;
+ text-align: center;
+ border-radius: 4px;
+ color: #fff;
+ line-height: 36px;
+ background: -moz-linear-gradient(top, #02BB92 0%, #09CBA1 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#02BB92), color-stop(100%,#09CBA1));
+ background: -webkit-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
+ background: -o-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
+ background: -ms-linear-gradient(top, #02BB92 0%,#09CBA1 100%);
+ background: linear-gradient(to bottom, #02BB92 0%,#09CBA1 100%);
+}
+.call-btn.down{
+ background: -moz-linear-gradient(top, #E47172 0%, #E68181 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E47172), color-stop(100%,#E68181));
+ background: -webkit-linear-gradient(top,#E47172 0%,#E68181 100%);
+ background: -o-linear-gradient(top, #E47172 0%,#E68181 100%);
+ background: -ms-linear-gradient(top, #E47172 0%,#E68181 100%);
+ background: linear-gradient(to bottom,#E47172 0%,#E68181 100%);
+}
+.call-btn.none {
+ display: none;
+}
+.del-num:hover,
+.del-all:hover,
+.call-btn:hover{
+ color: #fff;
+ opacity: 0.8;
+}
+/*.call-icon {*/
+/*display: inline-block;*/
+/*vertical-align: middle;*/
+/*width: 28px;*/
+/*height: 28px;*/
+/*background: url(../../static/images/dianhua.png);*/
+/*margin-right: 15px;*/
+/*}*/
+.del-all {
+ position: absolute;
+ display: block;
+ width: 30px;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: url(./res/close.png) no-repeat center center;
+}
+.del-num {
+ position: absolute;
+ display: block;
+ width: 30px;
+ top: 0;
+ right: 30px;
+ bottom: 0;
+ background: url(./res/quchu.png) no-repeat center center;
+}
\ No newline at end of file
diff --git a/resources/views/admin/cdr/count.blade.php b/resources/views/admin/cdr/count.blade.php
new file mode 100644
index 00000000..85daf5ba
--- /dev/null
+++ b/resources/views/admin/cdr/count.blade.php
@@ -0,0 +1,96 @@
+@extends('admin.base')
+
+@section('content')
+
+@endsection
+
+@section('script')
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/admin/index/index.blade.php b/resources/views/admin/index/index.blade.php
index 4a1b3178..36ff395b 100644
--- a/resources/views/admin/index/index.blade.php
+++ b/resources/views/admin/index/index.blade.php
@@ -139,7 +139,7 @@
-
+
diff --git a/resources/views/admin/index/onlinecall.blade.php b/resources/views/admin/index/onlinecall.blade.php
new file mode 100644
index 00000000..63d82d79
--- /dev/null
+++ b/resources/views/admin/index/onlinecall.blade.php
@@ -0,0 +1,182 @@
+@extends('admin.base')
+
+@section('content')
+
+
+@endsection
+
+@section('script')
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/admin/layout.blade.php b/resources/views/admin/layout.blade.php
index 60f1cbc1..fe585ef8 100644
--- a/resources/views/admin/layout.blade.php
+++ b/resources/views/admin/layout.blade.php
@@ -90,6 +90,11 @@
控制台
+
+ -
+ 在线拨号
+
+
@foreach(\Illuminate\Support\Facades\Cache::get('menus') as $menu1)
diff --git a/routes/admin.php b/routes/admin.php
index 01ae311f..ddfac6d5 100644
--- a/routes/admin.php
+++ b/routes/admin.php
@@ -27,6 +27,8 @@ Route::group(['namespace'=>'Admin','prefix'=>'admin','middleware'=>'auth'],funct
Route::get('/index','IndexController@index')->name('admin.index');
//后台首页图表统计
Route::post('/index/chart','IndexController@chart')->name('admin.index.chart');
+ //在线拨号
+ Route::get('/index/onlinecall','IndexController@onlinecall')->name('admin.index.onlinecall');
});
/*
@@ -372,5 +374,5 @@ Route::group(['namespace'=>'Admin','prefix'=>'admin','middleware'=>['auth','perm
Route::get('cdr/{uuid}/download','CdrController@download')->name('admin.cdr.download')->middleware('permission:data.cdr.download');
});
-
+ Route::get('cdr/count','CdrController@count')->name('admin.cdr.count')->middleware('permission:data.cdr.count');
});
\ No newline at end of file
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 04944463..bff4e7c0 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,11 +6,17 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'App\\Console\\Commands\\asrListen' => $baseDir . '/app/Console/Commands/asrListen.php',
+ 'App\\Console\\Commands\\asrRecord' => $baseDir . '/app/Console/Commands/asrRecord.php',
+ 'App\\Console\\Commands\\callcenterListen' => $baseDir . '/app/Console/Commands/callcenterListen.php',
+ 'App\\Console\\Commands\\callcenterRun' => $baseDir . '/app/Console/Commands/callcenterRun.php',
+ 'App\\Console\\Commands\\submeter' => $baseDir . '/app/Console/Commands/submeter.php',
'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php',
'App\\Exceptions\\Handler' => $baseDir . '/app/Exceptions/Handler.php',
'App\\Exports\\ProjectExport' => $baseDir . '/app/Exports/ProjectExport.php',
'App\\Http\\Controllers\\Admin\\ActionController' => $baseDir . '/app/Http/Controllers/Admin/ActionController.php',
'App\\Http\\Controllers\\Admin\\AgentController' => $baseDir . '/app/Http/Controllers/Admin/AgentController.php',
+ 'App\\Http\\Controllers\\Admin\\CdrController' => $baseDir . '/app/Http/Controllers/Admin/CdrController.php',
'App\\Http\\Controllers\\Admin\\ConditionController' => $baseDir . '/app/Http/Controllers/Admin/ConditionController.php',
'App\\Http\\Controllers\\Admin\\DepartmentController' => $baseDir . '/app/Http/Controllers/Admin/DepartmentController.php',
'App\\Http\\Controllers\\Admin\\ExtensionController' => $baseDir . '/app/Http/Controllers/Admin/ExtensionController.php',
@@ -23,16 +29,13 @@ return array(
'App\\Http\\Controllers\\Admin\\ProjectController' => $baseDir . '/app/Http/Controllers/Admin/ProjectController.php',
'App\\Http\\Controllers\\Admin\\ProjectDesignController' => $baseDir . '/app/Http/Controllers/Admin/ProjectDesignController.php',
'App\\Http\\Controllers\\Admin\\QueueController' => $baseDir . '/app/Http/Controllers/Admin/QueueController.php',
+ 'App\\Http\\Controllers\\Admin\\RemindController' => $baseDir . '/app/Http/Controllers/Admin/RemindController.php',
'App\\Http\\Controllers\\Admin\\RoleController' => $baseDir . '/app/Http/Controllers/Admin/RoleController.php',
'App\\Http\\Controllers\\Admin\\SipController' => $baseDir . '/app/Http/Controllers/Admin/SipController.php',
'App\\Http\\Controllers\\Admin\\TaskController' => $baseDir . '/app/Http/Controllers/Admin/TaskController.php',
'App\\Http\\Controllers\\Admin\\UserController' => $baseDir . '/app/Http/Controllers/Admin/UserController.php',
- 'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ConfirmPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ForgotPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\LoginController' => $baseDir . '/app/Http/Controllers/Auth/LoginController.php',
- 'App\\Http\\Controllers\\Auth\\RegisterController' => $baseDir . '/app/Http/Controllers/Auth/RegisterController.php',
- 'App\\Http\\Controllers\\Auth\\ResetPasswordController' => $baseDir . '/app/Http/Controllers/Auth/ResetPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\VerificationController' => $baseDir . '/app/Http/Controllers/Auth/VerificationController.php',
+ 'App\\Http\\Controllers\\Admin\\WasteController' => $baseDir . '/app/Http/Controllers/Admin/WasteController.php',
+ 'App\\Http\\Controllers\\ApiController' => $baseDir . '/app/Http/Controllers/ApiController.php',
'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => $baseDir . '/app/Http/Middleware/Authenticate.php',
@@ -67,6 +70,7 @@ return array(
'App\\Models\\Action' => $baseDir . '/app/Models/Action.php',
'App\\Models\\Agent' => $baseDir . '/app/Models/Agent.php',
'App\\Models\\Call' => $baseDir . '/app/Models/Call.php',
+ 'App\\Models\\Cdr' => $baseDir . '/app/Models/Cdr.php',
'App\\Models\\Condition' => $baseDir . '/app/Models/Condition.php',
'App\\Models\\Department' => $baseDir . '/app/Models/Department.php',
'App\\Models\\Extension' => $baseDir . '/app/Models/Extension.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 566fe62a..725c04d2 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -87,4 +87,6 @@ return array(
'ed962a97bd972bc82007176b647d4e36' => $vendorDir . '/facade/ignition/src/helpers.php',
'5e8fe2a5ffaded85af682684fe3bbf5a' => $vendorDir . '/mews/captcha/src/helpers.php',
'377b22b161c09ed6e5152de788ca020a' => $vendorDir . '/spatie/laravel-permission/src/helpers.php',
+ 'a38b85dec9d83a5d3b31723990f6f122' => $baseDir . '/bootstrap/Freeswitchesl.php',
+ '14cd3a4930749f01c4f7f007ebf2139a' => $baseDir . '/bootstrap/Snowflake.php',
);
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 5ced9250..ed5f1a64 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -88,6 +88,8 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'ed962a97bd972bc82007176b647d4e36' => __DIR__ . '/..' . '/facade/ignition/src/helpers.php',
'5e8fe2a5ffaded85af682684fe3bbf5a' => __DIR__ . '/..' . '/mews/captcha/src/helpers.php',
'377b22b161c09ed6e5152de788ca020a' => __DIR__ . '/..' . '/spatie/laravel-permission/src/helpers.php',
+ 'a38b85dec9d83a5d3b31723990f6f122' => __DIR__ . '/../..' . '/bootstrap/Freeswitchesl.php',
+ '14cd3a4930749f01c4f7f007ebf2139a' => __DIR__ . '/../..' . '/bootstrap/Snowflake.php',
);
public static $prefixLengthsPsr4 = array (
@@ -527,11 +529,17 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
);
public static $classMap = array (
+ 'App\\Console\\Commands\\asrListen' => __DIR__ . '/../..' . '/app/Console/Commands/asrListen.php',
+ 'App\\Console\\Commands\\asrRecord' => __DIR__ . '/../..' . '/app/Console/Commands/asrRecord.php',
+ 'App\\Console\\Commands\\callcenterListen' => __DIR__ . '/../..' . '/app/Console/Commands/callcenterListen.php',
+ 'App\\Console\\Commands\\callcenterRun' => __DIR__ . '/../..' . '/app/Console/Commands/callcenterRun.php',
+ 'App\\Console\\Commands\\submeter' => __DIR__ . '/../..' . '/app/Console/Commands/submeter.php',
'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php',
'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php',
'App\\Exports\\ProjectExport' => __DIR__ . '/../..' . '/app/Exports/ProjectExport.php',
'App\\Http\\Controllers\\Admin\\ActionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ActionController.php',
'App\\Http\\Controllers\\Admin\\AgentController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/AgentController.php',
+ 'App\\Http\\Controllers\\Admin\\CdrController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/CdrController.php',
'App\\Http\\Controllers\\Admin\\ConditionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ConditionController.php',
'App\\Http\\Controllers\\Admin\\DepartmentController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/DepartmentController.php',
'App\\Http\\Controllers\\Admin\\ExtensionController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ExtensionController.php',
@@ -544,16 +552,13 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'App\\Http\\Controllers\\Admin\\ProjectController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ProjectController.php',
'App\\Http\\Controllers\\Admin\\ProjectDesignController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/ProjectDesignController.php',
'App\\Http\\Controllers\\Admin\\QueueController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/QueueController.php',
+ 'App\\Http\\Controllers\\Admin\\RemindController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/RemindController.php',
'App\\Http\\Controllers\\Admin\\RoleController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/RoleController.php',
'App\\Http\\Controllers\\Admin\\SipController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/SipController.php',
'App\\Http\\Controllers\\Admin\\TaskController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/TaskController.php',
'App\\Http\\Controllers\\Admin\\UserController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/UserController.php',
- 'App\\Http\\Controllers\\Auth\\ConfirmPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ConfirmPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\ForgotPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ForgotPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\LoginController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/LoginController.php',
- 'App\\Http\\Controllers\\Auth\\RegisterController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/RegisterController.php',
- 'App\\Http\\Controllers\\Auth\\ResetPasswordController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/ResetPasswordController.php',
- 'App\\Http\\Controllers\\Auth\\VerificationController' => __DIR__ . '/../..' . '/app/Http/Controllers/Auth/VerificationController.php',
+ 'App\\Http\\Controllers\\Admin\\WasteController' => __DIR__ . '/../..' . '/app/Http/Controllers/Admin/WasteController.php',
+ 'App\\Http\\Controllers\\ApiController' => __DIR__ . '/../..' . '/app/Http/Controllers/ApiController.php',
'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php',
@@ -588,6 +593,7 @@ class ComposerStaticInita823d0d9fdfb372460e15358f4fe1e65
'App\\Models\\Action' => __DIR__ . '/../..' . '/app/Models/Action.php',
'App\\Models\\Agent' => __DIR__ . '/../..' . '/app/Models/Agent.php',
'App\\Models\\Call' => __DIR__ . '/../..' . '/app/Models/Call.php',
+ 'App\\Models\\Cdr' => __DIR__ . '/../..' . '/app/Models/Cdr.php',
'App\\Models\\Condition' => __DIR__ . '/../..' . '/app/Models/Condition.php',
'App\\Models\\Department' => __DIR__ . '/../..' . '/app/Models/Department.php',
'App\\Models\\Extension' => __DIR__ . '/../..' . '/app/Models/Extension.php',