param(); if (isset($params['oid'])) $type = 'luban'; if (isset($params['sessionId']) || isset($params['session_id'])) $type = 'yhuatong'; if (isset($params['bind_id'])) $type = 'haoxiaoyun'; if (!isset($type)) return json(['code' => 1, 'msg' => '失败,未设置的外呼系统']); $method = $type . 'CallBack'; return $this->$method(); } /** * 云话统推送 */ public function yhuatongCallBack() { $params = request()->param(); // 录音推送key $luyinKey = ['key' => '', 'hash' => '', 'fsize' => '', 'url' => '', 'sessionId' => '', 'call_id' => '']; $rs = array_diff_key($luyinKey, $params); // 判断是录音推送还是话单推送 if (count($rs) == 0) { // 录音推送 return $this->yhuatongLuyin($params); } else { // 话单推送 return $this->yhuatongHuadan($params); } } public function yhuatongLuyin($params) { // 查询通话记录 $log = OutCallLog::where(['session_id' => $params['sessionId']])->find(); if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']); $log->save([ 'key' => $params['key'], 'hash' => $params['hash'], 'fsize' => $params['fsize'], 'url' => $params['url'], 'call_id' => $params['call_id'] ]); $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find(); if (!empty($visitLog)) { $visitLog->remark = $visitLog->remark; //. '##' . $params['url']; $visitLog->save(); } return json(['code' => 0, 'msg' => 'success']); } public function yhuatongHuadan($params) { // 查询通话记录 $log = OutCallLog::where(['session_id' => $params['session_id']])->find(); if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']); $data = [ 'fwd_start_time' => $params['fwd_start_time'], 'call_end_time' => $params['call_end_time'], 'billsec' => $params['billsec'], 'status' => $params['status'] ]; if (isset($params['call_status'])) $data['call_status'] = $params['call_status']; $log->save($data); $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find(); if (!empty($visitLog)) { if ($params['status'] == 1) { $visitLog->remark = '回访跟踪了客户,通话时长' . $params['billsec'] . 's'; } else { $visitLog->remark = '回访跟踪了客户,电话未接通'; } $visitLog->save(); } return json(['code' => 0, 'msg' => 'success']); } /** * 鲁班外呼系统推送 */ public function lubanCallBack() { $params = request()->param(); $log = OutCallLog::where(['session_id' => $params['oid']])->find(); if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']); $log->save([ 'fwd_start_time' => $params['stime'], 'call_end_time' => $params['etime'], 'billsec' => $params['htime'], 'status' => $params['htime'] > 0 ? 1 : -1, 'call_status' => 1000, // 为了区分 'url' => $params['voice'], 'call_msg' => $params['msg'] ]); $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find(); if (!empty($visitLog)) { if ($params['status'] == 1) { $visitLog->remark = '回访跟踪了客户,通话时长' . $params['htime'] . 's'; } else { $visitLog->remark = '回访跟踪了客户,电话未接通'; } $visitLog->save(); } return json(['code' => 0, 'msg' => 'success']); } /** * 好销云回调 */ public function haoxiaoyunCallback() { $params = request()->param(); // 查询通话记录 $log = OutCallLog::where(['session_id' => $params['bind_id']])->find(); if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']); $data = [ 'fwd_start_time' => $params['begin_time'], 'call_end_time' => $params['end_time'], 'billsec' => $params['duration'], 'status' => $params['status'] >= 1 ? 1 : -1, 'bind_num' => $params['telX'], 'url' => $params['audio_url'], 'call_msg' => '', 'call_status' => 2000 ]; $log->save($data); $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find(); if (!empty($visitLog)) { if ($params['status'] == 1) { $visitLog->remark = '回访跟踪了客户,通话时长' . $params['billsec'] . 's'; } else { $visitLog->remark = '回访跟踪了客户,电话未接通'; } $visitLog->save(); } return json(['code' => 0, 'msg' => 'success']); } public function bind() { $params = request()->param(); //检查是否设置过飞鱼-检查线索是否是飞鱼线索 $root_id = request()->token['root_org']; $channel_setting = Company::where(['root_id' => $root_id])->value('channel_setting'); if (isset($channel_setting) && $channel_setting) { $source_id = CustomerSource::where(['root_id' => $root_id, 'source' => '飞鱼线索'])->value('id'); $c_source_id = Customer::where([['id', '=', $params['customer_id']]])->value('source_id'); if ($source_id == $c_source_id) { $tmp_data = $this->fishOutCall($params, $channel_setting); if ($tmp_data['code'] == 0) return json($tmp_data); } } $type = OutCallSetting::where(['root_id' => request()->token['root_org']])->value('type'); if (empty($type)) return json(['code' => 1, 'msg' => '未配置外呼系统']); $method = $type . 'Bind'; return $this->$method($params); } public function yhuatongBind($params) { $token = request()->token; $where = [ ['id', '=', $params['customer_id']], ['state', '<>', '无效'], ['employee_id', '=', $token['employee_id']] ]; //指派的客户 $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]]; $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]]; $had = Customer::whereOr([$where, $where_or, $where_or1])->find(); // 不是共有客户,检测是否是领导领导调用 if ($had == null && $token['isManager']) { $had = Customer::find($params['customer_id']); // 检测数据是否存在 if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id; $employeeIdListArr = explode(',', $employeeIdListStr); $employeeIdListArr = array_filter($employeeIdListArr); // 登陆人部门及子部门获取 $my = Org::find($token['org_id']); $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id'); // 查找分享人是否在部门下 $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count(); if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']); } if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); if ($had->died == 2) { return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']); } // 查询客户电话 $customerPhone = $had->phone; // 查询员工电话 $employee = Employee::where(['id' => $token['employee_id']])->find(); if (!empty($params['phone'])) { $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone; } else { $employeePhone = $employee->phone; } // 电话绑定 $outCallSetting = OutCallSetting::where(['type' => 'yhuatong', 'root_id' => $token['root_org']])->find(); if (empty($outCallSetting)) return json(['code' => 1, 'msg' => '未配置']); $yhuatong = new Yhuatong($outCallSetting->config['appid'], $outCallSetting->config['secretKey']); $r = $yhuatong->whiteShow($employeePhone);trace($r, 'info'); if ($r['data'] !== false || $yhuatong->callerType($employeePhone) == false) { $rs = $yhuatong->bindv2($employeePhone, $customerPhone); } else { $telXList = explode(',', $outCallSetting->config['tel_x']); $randKey = array_rand($telXList); $telX = $telXList[$randKey]; $rs = $yhuatong->bindv2($employeePhone, $customerPhone, $telX); } trace($rs, 'info'); if ($rs['code'] !== 10000) { trace($rs['msg'], 'error'); return json(['code' => 1, 'msg' => $rs['msg']]); } else { // 添加记录 $log = OutCallLog::create([ 'session_id' => $rs['data']['sessionId'], 'bind_num' => $rs['data']['telX'], 'caller_num' => $employeePhone, 'callee_num' => $customerPhone, 'employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'customer_id' => $params['customer_id'] ]); } $had->updatetime = date('Y-m-d H:i:s'); $had->save(); $customerEmployee = Employee::find($had->employee_id); // 添加访问记录 CustomerVisitLog::Create([ 'customer_id' => $params['customer_id'], 'type' => 1, 'employee_id' => $token['employee_id'], 'user_id' => $employee->uid, 'org_id' => $employee->org_id, 'customer_employee_id' => $had->employee_id, 'customer_org_id' => $customerEmployee->org_id, 'data_type' => 'out_call', 'data_id' => $log->id, 'remark' => '回访跟踪了客户' ]); return json(['code' => 0, 'msg' => '拨打中,请接听']); } public function lubanBind($params) { $token = request()->token; $where = [ ['id', '=', $params['customer_id']], ['state', '<>', '无效'], ['employee_id', '=', $token['employee_id']] ]; //指派的客户 $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]]; $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]]; $had = Customer::whereOr([$where, $where_or, $where_or1])->find(); // 不是共有客户,检测是否是领导领导调用 if ($had == null && $token['isManager']) { $had = Customer::find($params['customer_id']); // 检测数据是否存在 if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id; $employeeIdListArr = explode(',', $employeeIdListStr); $employeeIdListArr = array_filter($employeeIdListArr); // 登陆人部门及子部门获取 $my = Org::find($token['org_id']); $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id'); // 查找分享人是否在部门下 $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count(); if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']); } if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); if ($had->died == 2) { return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']); } // 查询客户电话 $customerPhone = $had->phone; // 查询员工电话 $employee = Employee::where(['id' => $token['employee_id']])->find(); if (!empty($params['phone'])) { $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone; } else { $employeePhone = $employee->phone; } // 电话绑定 $outCallSetting = OutCallSetting::where(['type' => 'luban', 'root_id' => $token['root_org']])->find(); if (empty($outCallSetting)) return json(['code' => 1, 'msg' => '未配置']); $outcallSetting = new Luban($outCallSetting->config['appid'], $outCallSetting->config['secretKey']); // 中间号获取 $telXList = explode(',', $outCallSetting->config['tel_x']); $randKey = array_rand($telXList); $telX = $telXList[$randKey]; $rs = $outcallSetting->bind($employeePhone, $customerPhone, $telX); if ($rs['code'] != 0) { trace($rs['msg'], 'error'); return json(['code' => 1, 'msg' => $rs['msg']]); } else { // 添加记录 $log = OutCallLog::create([ 'session_id' => $rs['orderid'], 'bind_num' => $telX, 'caller_num' => $employeePhone, 'callee_num' => $customerPhone, 'employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'customer_id' => $params['customer_id'] ]); } $had->updatetime = date('Y-m-d H:i:s'); $had->save(); $customerEmployee = Employee::find($had->employee_id); // 添加访问记录 CustomerVisitLog::Create([ 'customer_id' => $params['customer_id'], 'type' => 1, 'employee_id' => $token['employee_id'], 'user_id' => $employee->uid, 'org_id' => $employee->org_id, 'customer_employee_id' => $had->employee_id, 'customer_org_id' => $customerEmployee->org_id, 'data_type' => 'out_call', 'data_id' => $log->id, 'remark' => '回访跟踪了客户' ]); return json(['code' => 0, 'msg' => '拨打中,请接听']); } /** * 好销云绑定 */ public function haoxiaoyunBind($params) { $token = request()->token; $where = [ ['id', '=', $params['customer_id']], ['state', '<>', '无效'], ['employee_id', '=', $token['employee_id']] ]; //指派的客户 $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]]; $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]]; $had = Customer::whereOr([$where, $where_or, $where_or1])->find(); // 不是共有客户,检测是否是领导领导调用 if ($had == null && $token['isManager']) { $had = Customer::find($params['customer_id']); // 检测数据是否存在 if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id; $employeeIdListArr = explode(',', $employeeIdListStr); $employeeIdListArr = array_filter($employeeIdListArr); // 登陆人部门及子部门获取 $my = Org::find($token['org_id']); $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id'); // 查找分享人是否在部门下 $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count(); if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']); } if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); if ($had->died == 2) { return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']); } // 查询客户电话 $customerPhone = $had->phone; // 查询员工电话 $employee = Employee::where(['id' => $token['employee_id']])->find(); if (!empty($params['phone'])) { $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone; } else { $employeePhone = $employee->phone; } // 电话绑定 $outCallSetting = OutCallSetting::where(['type' => 'haoxiaoyun', 'root_id' => $token['root_org']])->find(); if (empty($outCallSetting) || $outCallSetting->config['open'] != 1) return json(['code' => 1, 'msg' => '未配置']); $line = isset($outCallSetting->config['line_type']) ? $outCallSetting->config['line_type'] : 1; // 默认AXB线路 $outcallSetting = new Haoxiaoyun(); $rs = $outcallSetting->bind($employeePhone, $customerPhone, $line); if ($rs['code'] != 1) { trace($rs, 'info'); return json(['code' => 1, 'msg' => $rs['info']]); } else { // 添加记录 $logData = [ 'session_id' => $rs['data']['bind_id'], 'bind_num' => '', 'caller_num' => $employeePhone, 'callee_num' => $customerPhone, 'employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'customer_id' => $params['customer_id'] ]; if (isset($rs['data']['number'])) { $logData['bind_num'] = $rs['data']['number']; } $log = OutCallLog::create($logData); } $had->updatetime = date('Y-m-d H:i:s'); $had->save(); $customerEmployee = Employee::find($had->employee_id); // 添加访问记录 CustomerVisitLog::Create([ 'customer_id' => $params['customer_id'], 'type' => 1, 'employee_id' => $token['employee_id'], 'user_id' => $employee->uid, 'org_id' => $employee->org_id, 'customer_employee_id' => $had->employee_id, 'customer_org_id' => $customerEmployee->org_id, 'data_type' => 'out_call', 'data_id' => $log->id, 'remark' => '回访跟踪了客户' ]); if (isset($rs['data']['number'])) { return json(['code' => 0, 'msg' => '拨打中,请接听', 'mobile' => $rs['data']['number']]); } else { return json(['code' => 0, 'msg' => '拨打中,请接听']); } } /* * 设置员工外呼电话 */ public function setPhone() { $params = Request::only(['phones' => '']); $token = $this->request->token; Employee::where('id', $token['employee_id'])->update(['out_call_phone' => $params['phones']]); return json(['code' => 0, 'msg' => '保存成功']); } /** * 手机拨打 */ public function mobile($id) { $token = request()->token; $where = [ ['id', '=', $id], ['state', '<>', '无效'], ['employee_id', '=', $token['employee_id']] ]; //指派的客户 $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $id]]; // 指定的设计师 $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $id]]; $had = Customer::whereOr([$where, $where_or, $where_or1])->find(); // 不是共有客户,检测是否是领导领导调用 if ($had == null && $token['isManager']) { $had = Customer::find($id); // 检测数据是否存在 if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id; $employeeIdListArr = explode(',', $employeeIdListStr); $employeeIdListArr = array_filter($employeeIdListArr); // 登陆人部门及子部门获取 $my = Org::find($token['org_id']); $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id'); // 查找分享人是否在部门下 $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count(); if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']); } if (!$had) return json(['code' => 1, 'msg' => '数据不存在']); if ($had->died == 2) { return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']); } $had->updatetime = date('Y-m-d H:i:s'); $had->save(); // 添加记录 if(input('type',0)==1){ //安卓app打电话 按照外呼的方式处理 方便统计 $log = OutCallLog::create([ 'session_id' => 'andiroid'.time(), 'employee_id' => $token['employee_id'], 'customer_id' => $id, 'status' => -1, 'root_id' => $token['root_org'] ]); }else{ $log = OutCallMbLog::create([ 'employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'customer_id' => $id ]); } $customerEmployee = Employee::find($had->employee_id); $employee = Employee::where(['id' => $token['employee_id']])->find(); // 添加访问记录 CustomerVisitLog::Create([ 'customer_id' => $id, 'type' => 1, 'employee_id' => $token['employee_id'], 'user_id' => $employee->uid, 'org_id' => $employee->org_id, 'customer_employee_id' => $had->employee_id, 'customer_org_id' => $customerEmployee->org_id, 'data_type' => 'mobile_call', 'data_id' => $log->id, 'remark' => '回访跟踪了客户' ]); return json(['code' => 0, 'msg' => '记录添加成功']); } /** * 飞鱼线索外呼 */ public function fishOutCall($params,$channel_setting) { $token = request()->token; $where = [ ['id', '=', $params['customer_id']], ['state', '<>', '无效'], ['employee_id', '=', $token['employee_id']] ]; //指派的客户 $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]]; $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]]; $had = Customer::whereOr([$where, $where_or, $where_or1])->find(); // 不是共有客户,检测是否是领导领导调用 if ($had == null && $token['isManager']) { $had = Customer::find($params['customer_id']); // 检测数据是否存在 if (!$had) return ['code' => 1, 'msg' => '数据不存在']; $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id; $employeeIdListArr = explode(',', $employeeIdListStr); $employeeIdListArr = array_filter($employeeIdListArr); // 登陆人部门及子部门获取 $my = Org::find($token['org_id']); $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id'); // 查找分享人是否在部门下 $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count(); if ($exit == 0) return ['code' => 1, 'msg' => '数据不存在']; } if (!$had) return ['code' => 1, 'msg' => '数据不存在']; if ($had->died == 2) { return ['code' => 1, 'msg' => '客户死单,暂无法跟踪']; } $fish_data = FishData::where(['customer_id' => $params['customer_id']])->find(); if (!$fish_data) return ['code' => 1, 'msg' => '数据信息有误']; $tmp_data = json_decode($channel_setting, true); // 查询客户电话 $customerPhone = $had->phone; // 查询员工电话 $employee = Employee::where(['id' => $token['employee_id']])->find(); if (!empty($params['phone'])) { $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone; } else { $employeePhone = $employee->phone; } $appid = config('app.fish_clue_appid'); $secret = config('app.fish_clue_secret'); $fish = new clueFish($appid, $secret); $tmp_info = [ //广告主id 'advertiser_id' => $fish_data['advertiser_id'], //线索id 'clue_id' => $fish_data['clue_id'], //主叫号码,必须为11位手机号码,否则呼叫失败 'caller_number' => $employeePhone, //被叫号码,即线索号码 'callee_number' => $customerPhone, ]; $rs = $fish->getCallVirtualNumber($tmp_data['fish_access_token'], $tmp_info); if ($rs['code'] != 0) { return ['code' => 1, 'msg' => '呼叫失败']; } else { if($rs['data']['call_result_code'] != 103){ return ['code' => 1, 'msg' => $rs['data']['call_result_message']]; } // 添加记录 $logData = [ 'session_id' => $rs['data']['contact_id'], 'bind_num' => $rs['data']['virtual_number'], 'caller_num' => $employeePhone, 'callee_num' => $customerPhone, 'employee_id' => $token['employee_id'], 'root_id' => $token['root_org'], 'customer_id' => $params['customer_id'] ]; $log = OutCallLog::create($logData); } $had->updatetime = date('Y-m-d H:i:s'); $had->save(); $customerEmployee = Employee::find($had->employee_id); // 添加访问记录 CustomerVisitLog::Create([ 'customer_id' => $params['customer_id'], 'type' => 1, 'employee_id' => $token['employee_id'], 'user_id' => $employee->uid, 'org_id' => $employee->org_id, 'customer_employee_id' => $had->employee_id, 'customer_org_id' => $customerEmployee->org_id, 'data_type' => 'out_call', 'data_id' => $log->id, 'remark' => '回访跟踪了飞鱼线索客户' ]); if (isset($rs['data']['virtual_number'])) { return ['code' => 0, 'msg' => '拨打中,请接听', 'mobile' => $rs['data']['virtual_number']]; } else { return ['code' => 1, 'msg' => '拨打中,请接听']; } } }