From 3f7995202dc4c00efdbfee21b6afb045fefde5fb Mon Sep 17 00:00:00 2001 From: lcc <1127794702@qq.com> Date: Tue, 4 Jun 2024 21:11:34 +0800 Subject: [PATCH] 20240604 --- admin/controllers/receiver/Customer.php | 22 +- api/config/ycall.php | 5 + api/controllers/Welcome.php | 11 +- api/controllers/plan/Yxcall.php | 289 ++++++++++++++++++ api/controllers/wxapp/licheb/Cusorder.php | 58 ++-- api/controllers/wxapp/licheb/Customerlogs.php | 10 +- api/controllers/wxapp/licheb/Loan.php | 61 ++++ api/controllers/wxapp/licheb/Yx.php | 72 +++++ common/helpers/comm_helper.php | 19 +- common/libraries/Hd_wechat.php | 4 +- .../libraries/receiver/Order_datas_entity.php | 31 +- common/models/receiver/Receiver_yx_model.php | 12 + common/third_party/Ycall/Ycall.php | 125 ++++++++ .../Ycall/sdk/PrivacyAxBindBody.php | 25 ++ .../Ycall/sdk/PrivacyAxTransferBody.php | 24 ++ .../Ycall/sdk/PrivacyAxbBindBody.php | 26 ++ .../Ycall/sdk/PrivacyUnbindBoody.php | 21 ++ common/third_party/Ycall/sdk/VoiceHostUrl.php | 11 + common/third_party/Ycall/sdk/VoiceResult.php | 19 ++ .../Ycall/sdk/WinnerVoiceSender.php | 112 +++++++ 20 files changed, 901 insertions(+), 56 deletions(-) create mode 100644 api/config/ycall.php create mode 100644 api/controllers/plan/Yxcall.php create mode 100644 api/controllers/wxapp/licheb/Loan.php create mode 100644 api/controllers/wxapp/licheb/Yx.php create mode 100644 common/models/receiver/Receiver_yx_model.php create mode 100644 common/third_party/Ycall/Ycall.php create mode 100644 common/third_party/Ycall/sdk/PrivacyAxBindBody.php create mode 100644 common/third_party/Ycall/sdk/PrivacyAxTransferBody.php create mode 100644 common/third_party/Ycall/sdk/PrivacyAxbBindBody.php create mode 100644 common/third_party/Ycall/sdk/PrivacyUnbindBoody.php create mode 100644 common/third_party/Ycall/sdk/VoiceHostUrl.php create mode 100644 common/third_party/Ycall/sdk/VoiceResult.php create mode 100644 common/third_party/Ycall/sdk/WinnerVoiceSender.php diff --git a/admin/controllers/receiver/Customer.php b/admin/controllers/receiver/Customer.php index ad572d3e..308115a1 100644 --- a/admin/controllers/receiver/Customer.php +++ b/admin/controllers/receiver/Customer.php @@ -23,9 +23,7 @@ class Customer extends HD_Controller $this->load->model('receiver/receiver_customer_tagdata_model', 'mdCustomerTagdata'); $this->load->model('receiver/receiver_clues_model', 'clues_model'); $this->load->model('receiver/receiver_clues_cfrom_model', 'clues_cfrom_model'); -// $this->load->model('receiver/Receiver_customer_stat_plan_model', 'statplan'); -// $this->load->model('receiver/Receiver_customer_stat_data_model', 'statdata'); -// $this->load->model('receiver/Receiver_customer_stat_data_log_model', 'statdatalog'); + $this->load->model('receiver/receiver_yx_model'); $this->load->model('app/licheb/app_licheb_users_model'); $this->load->model("biz/biz_model"); $this->load->model('area_model'); @@ -63,7 +61,7 @@ class Customer extends HD_Controller $biz_id_arr = array_unique(array_column($rows, 'biz_id')); $biz_id_arr && $biz_rows = $this->biz_model->get_map_by_ids($biz_id_arr, 'id,biz_name,county_id'); - foreach ($biz_rows as $v){ + foreach ($biz_rows as $v) { $county_id_arr[] = $v[0]['county_id']; } @@ -487,7 +485,7 @@ class Customer extends HD_Controller $where["biz_id in(select id from lc_biz where county_id={$params['county_id_admin']})"] = null; } else if ($params['city_id_admin']) { $where["biz_id in(select id from lc_biz where city_id={$params['city_id_admin']})"] = null; - }else if ($params['province_id_admin']) { + } else if ($params['province_id_admin']) { $where["biz_id in(select id from lc_biz where province_id={$params['province_id_admin']})"] = null; } @@ -575,7 +573,7 @@ class Customer extends HD_Controller if ($row['of_id']) { $of = $this->clues_cfrom_model->get(array('id' => $row['of_id'])); $of_title = $of['title']; - if($row['of2_id']){ + if ($row['of2_id']) { $of = $this->clues_cfrom_model->get(array('id' => $row['of2_id'])); $of_title .= '-' . $of['title']; } @@ -591,10 +589,10 @@ class Customer extends HD_Controller if ($row['county_id']) { $area = $this->area_model->get(array('county_id' => $row['county_id'])); $poi = "{$area['province_name']}-{$area['city_name']}-{$area['county_name']}"; - }elseif ($row['city_id']) { + } elseif ($row['city_id']) { $area = $this->area_model->get(array('city_id' => $row['city_id'])); $poi = "{$area['province_name']}-{$area['city_name']}"; - }elseif ($row['province_id']) { + } elseif ($row['province_id']) { $area = $this->area_model->get(array('province_id' => $row['province_id'])); $poi = "{$area['province_name']}"; } @@ -634,7 +632,13 @@ class Customer extends HD_Controller foreach ($rows_log as $key => $value) { $rec_text = $rec_url = ''; if ($value['type'] == 2) { - $rec_text = '未接通'; + $rec_row = $this->receiver_yx_model->get(['id' => $value['log']], 'rec_url,duration'); + if ($rec_row['duration']) { + $rec_row['rec_url'] && $rec_url = get_yx_video($rec_row['rec_url']); + !$rec_row['rec_url'] && $rec_text = '录音暂未生成'; + } else { + $rec_text = '未接通'; + } } $imgs = []; if ($value['imgs']) { diff --git a/api/config/ycall.php b/api/config/ycall.php new file mode 100644 index 00000000..83eaa213 --- /dev/null +++ b/api/config/ycall.php @@ -0,0 +1,5 @@ +load->view('welcome_message'); } - public function test(){ - + public function test() + { } } diff --git a/api/controllers/plan/Yxcall.php b/api/controllers/plan/Yxcall.php new file mode 100644 index 00000000..b7a0bef5 --- /dev/null +++ b/api/controllers/plan/Yxcall.php @@ -0,0 +1,289 @@ +log_file = 'call.log'; + $this->load->model('receiver/receiver_yx_model'); + $this->load->model('receiver/receiver_customers_model', 'customers_model'); + $this->load->library('receiver/customers_entity'); + } + + public function index() + { + debug_log("start", $this->log_file); + $str = file_get_contents('php://input'); + debug_log('string:' . $str, $this->log_file); + $data = json_decode($str, true); + if ($data && $data['customerData']) { + $row = $this->receiver_yx_model->get(array('call_id' => $data['customerData'])); + if ($row) { + $jsondata = json_decode($row['json_data'], true); + $data['uname'] = $jsondata['uname']; + $up_data['caller_state'] = $data['callerState']; + $up_data['status'] = 1; + $data['displayNumber'] && $up_data['mid'] = $data['displayNumber']; + $data['calleeNumber'] && $up_data['called_num'] = $data['calleeNumber']; + $data['callerNumber'] && $up_data['caller_num'] = $data['callerNumber']; + if ($data['calleeDuration'] > 0) { + $up_data['duration'] = $data['calleeDuration']; + $up_data['answer_time'] = $data['callerAnsweredTime']; + } + $data['startCallTime'] && $up_data['start_time'] = $data['startCallTime']; + $data['recUrl'] && $up_data['rec_url'] = $data['recUrl']; + $data['endTime'] && $up_data['end_time'] = $data['endTime']; + $up_data['json_data'] = json_encode($data, JSON_UNESCAPED_UNICODE); + $this->receiver_yx_model->update($up_data, ['id' => $row['id']]); + if ($row['cf_id'] && $row['cf_platform'] == 'admin') { //后台 + $admin_id = $row['cf_uid']; + $this->load->model('sys/sys_admin_model'); + $admin = $this->sys_admin_model->get(array('id' => $admin_id)); + $addData = array( + 'uid' => $admin_id, + 'uname' => $admin['username'] ? $admin['username'] : '', + 'type' => 2,//类型 0 普通 1短信 2电话 + 'log' => $row['id'], + 'c_time' => time() + ); + if ($row['cf_title'] == 'clues') {//线索拨打电话回调 + $this->load->model('receiver/receiver_clue_oplogs_model', 'mdOplogs'); + $addData['clue_id'] = $row['cf_id']; + } else if ($row['cf_title'] == 'customer') {//客户拨打电话回调 + $this->load->model('receiver/receiver_customer_oplogs_model', 'mdOplogs'); + $addData['customer_id'] = $row['cf_id']; + } else if ($row['cf_title'] == 'owners') {//车主拨打电话回调 + $this->load->model('receiver/receiver_owners_oplogs_model', 'mdOplogs'); + $addData['own_id'] = $row['cf_id']; + } + $this->mdOplogs->add($addData); + $xcall = new Xcall($this->admin_config); + //解绑 + $xcall->SWunbind($data['to'], $data['virtualMobile']); + } elseif ($row['cf_id'] && $row['cf_platform'] == 'api') { //理车宝 + $ycall = new Ycall(); + //解绑 + $result = $ycall->AXBUnbind($data['displayNumber'], $data['calleeNumber'], $data['callerNumber']); + //删除redis + $cache_key = "XZ_LICHEB_MOBILEA_{$data['calleeNumber']}_MOBILEB_{$data['callerNumber']}_{$row['cf_uid']}"; + $redis = &load_cache('redis'); + $redis->delete($cache_key); + $cust = $this->customers_model->get(['id' => $row['cf_id']]); + $visit = $row['cf_title'] == 'customer' ? 1 : 0; + $this->customers_entity->add_log_visit($cust['id'], $row['cf_uid'], $data['uname'], $row['id'], 2, $visit); + } + } else { + debug_log("error: 未找到拨打记录", $this->log_file); + } + } + debug_log("end", $this->log_file); + die(json_encode(array('resultCode' => 200))); + } + + //未绑定关系用户打入指定手机号 + public function axb() + { + $this->config->load('ycall', TRUE); + $mobile_list = $this->config->item('mobile_list', 'ycall'); + /**设置为平台分配的account*/ + $account = "985437"; + /**设置为平台分配的token*/ + $token = "5c5ee9cfcb2948a1aadefc445cf96b13"; + require_once(COMMPATH . "/third_party/Ycall/sdk/PrivacyUnbindBoody.php"); + require_once(COMMPATH . "/third_party/Ycall/sdk/PrivacyAxbBindBody.php"); + require_once(COMMPATH . "/third_party/Ycall/sdk/PrivacyAxTransferBody.php"); + require_once(COMMPATH . "/third_party/Ycall/sdk/WinnerVoiceSender.php"); + foreach ($mobile_list as $key => $value) { + $axTransferBody = new PrivacyAxTransferBody(); + $axTransferBody->transferMiddleNumber = $value; + $axTransferBody->transferToNumberA = '19959277910'; + $axTransferBody->callRec = 1; + $axTransferBody->callbackUrl = "https://api.haodian.cn/plan/yxcall"; + $sender = new WinnerVoiceSender($account, $token, true); + $result = $sender->sendRequest('/voice/1.0.0/axbTransfer', json_encode($axTransferBody)); + var_dump($result); + } + } + + //后台接单宝添加日志 + private function jdb_add_log($admin_id, $rc_id, $log_id, $duration) + { + $this->load->model('app/jdb/receiver_oplogs_model'); + $this->load->model('app/jdb/receiver_customers_model'); + $this->load->model('sys/sys_admin_model'); + $admin = $this->sys_admin_model->get(array('id' => $admin_id)); + $data = array( + 'rc_id' => $rc_id, + 'admin_id' => $admin_id, + 'admin_name' => $admin['username'], + 'type' => 4, + 'log' => $log_id, + 'c_time' => time() + ); + $res = $this->receiver_oplogs_model->add($data);//增加操作记录 + if ($res) { + $updateData = array('last_admin_id' => $admin_id, 'last_op_time' => date('Y-m-d H:i:s')); + $duration && $updateData['call_records = call_records+1'] = null; + $this->receiver_customers_model->update($updateData, array('id' => $rc_id)); + } + } + + //下载链接到七牛云 + public function down_video() + { + $redis = &load_cache('redis'); + $key = "RECEIVER_LAST_ID"; + $last_id = $redis->get($key); + $where = array( + "rec_url <> ''" => null, + 'c_time<' => time() - 50 * 60 + ); + if ($last_id) { + $where['id>'] = $last_id; + } else { + $where["rec_url like '%winnerlook-voice.oss-cn-hangzhou.aliyuncs.com%'"] = null; + } + $count = $this->receiver_yx_model->count($where); + $failed_num = $success_num = $do_num = 0; + if ($count) { + $rows = $this->receiver_yx_model->select($where, 'id asc', 1, 20, 'id,rec_url'); + foreach ($rows as $key => $val) { + $file = $this->upload($val['rec_url']); + if ($file) { + $this->receiver_yx_model->update(array('rec_url' => $file), array('id' => $val['id'])); + $success_num++; + } else { + $failed_num++; + } + $do_num++; + $last_id = $val['id']; + } + $redis->save($key, $last_id); + } + echo "do_num:{$do_num},success_num:{$success_num},failed_num:{$failed_num}"; + } + + private function upload($url, $i = '') + { + $this->load->helper('image'); + $arr = explode('?', $url); + $this->load->library('qiniu'); + $filename = $this->qiniu->getFileName($arr[0] . $i); + $filename = 'yx/' . $filename; + $info = $this->qiniu->getInfo($filename); + if ($info) { + return $filename; + } else { + $file = $this->qiniu->fetch($url, $filename); + return $file ? $file['file'] : ''; + } + } + + //检测录音文件为空的数据 + public function check_wav() + { + $this->load->model('app/jdb/receiver_yx_model'); + $cache = $this->input->get('cache'); + $size = $this->input->get('size'); + !$size && $size = 20; + $where = array( + "duration>" => 0, + ); + $redis = &load_cache('redis'); + $save_key = "RECEIVER_CHECK_WAV_LAST_ID"; + if (!$cache) { + $last_id = $redis->get($save_key); + $last_id && $where['id>'] = $last_id; + } + $total = $this->receiver_yx_model->count($where); + if ($total) { + $rows = $this->receiver_yx_model->select($where, 'id asc', 1, $size, 'id,call_id,rec_url'); + $this->load->library('qiniu'); + foreach ($rows as $key => $val) { + $filename = $val['rec_url']; + $info = $this->qiniu->getInfo($filename); + if (!$info['fsize']) { + debug_log(json_encode($val, JSON_UNESCAPED_UNICODE), 'jdb_call_null_rec_url.log'); + } + $last_id = $val['id']; + } + $res = $redis->save($save_key, $last_id); + } + $left = $total > count($rows) ? $total - count($rows) : 0; + echo 'total:' . $total . ',left:' . $left; + } + + //重新下载空录音文件 + public function check_wav_update() + { + $this->load->model('app/jdb/receiver_yx_model'); + $id = $this->input->get('id'); + $cache = $this->input->get('cache'); + $size = $this->input->get('size'); + !$size && $size = 20; + $where = array( + "duration>" => 0, + ); + $id && $where['id'] = $id; + $redis = &load_cache('redis'); + $save_key = "RECEIVER_UPDATE_WAV_LAST_ID"; + if (!$cache) { + $last_id = $redis->get($save_key); + $last_id && $where['id>'] = $last_id; + } + $total = $this->receiver_yx_model->count($where); + if ($total) { + $rows = $this->receiver_yx_model->select($where, 'id asc', 1, $size, 'id,call_id,rec_url,json_data'); + $this->load->library('qiniu'); + foreach ($rows as $key => $val) { + $filename = $val['rec_url']; + if (strpos($filename, 'hdi/yx') !== false) { + echo $val['id']; + $info = $this->qiniu->getInfo($filename); + if (!$info['fsize']) { + $res = $this->qiniu->rm($filename); + $res = $this->qiniu->rm(str_replace('hdi/', '', $filename)); + $json_data = json_decode($val['json_data'], true); + $file = $this->upload($json_data['recUrl'], 1); + if ($file) { + $this->receiver_yx_model->update(array('rec_url' => $file), array('id' => $val['id'])); + $val['result'] = $file; + debug_log(json_encode($val, JSON_UNESCAPED_UNICODE), 'jdb_call_update_rec_url.log'); + } + } + if (!$id) { + $last_id = $val['id']; + } + } + } + $res = $redis->save($save_key, $last_id); + } + $left = $total > count($rows) ? $total - count($rows) : 0; + echo 'total:' . $total . ',left:' . $left; + } + + //更新空录音通话记录 + public function up_empty() + { + $this->load->model('app/jdb/receiver_yx_model'); + $id = $this->input->get('id'); + $callid = $this->input->get('callid'); + $filename = $this->input->get('filename'); + $where = array( + 'id' => $id, + 'call_id' => $callid + ); + $row = $this->receiver_yx_model->get($where); + $filename = base64_decode($filename); + if ($row && $filename) { + $res = $this->receiver_yx_model->update(array('rec_url' => $filename), array('id' => $row['id'])); + die(json_encode(array('code' => $res))); + } else { + die(json_encode(array('code' => 0))); + } + } +} diff --git a/api/controllers/wxapp/licheb/Cusorder.php b/api/controllers/wxapp/licheb/Cusorder.php index 625c8380..107b4e6b 100644 --- a/api/controllers/wxapp/licheb/Cusorder.php +++ b/api/controllers/wxapp/licheb/Cusorder.php @@ -379,25 +379,38 @@ class Cusorder extends Wxapp $img_status = $this->order_datas_entity->data_status($order_datas[$val['id']][0]); $title = "{$brand_name}-{$serie_name}"; - $other_data = [ - '客户' => ['type' => 'text', 'value' => $val['name'], 'bg_color' => ''], + $o_data_1 = [ + '购车主体' => ['type' => 'text', 'value' => $val['main_type'] ? '公司' : '个人', 'bg_color' => ''], '品牌' => ['type' => 'text', 'value' => $title, 'bg_color' => ''], '车型' => ['type' => 'text', 'value' => $car_name, 'bg_color' => ''], - '付款方式' => ['type' => 'text', 'value' => $val['payway'] ? '全款' : '按揭', 'bg_color' => ''], ]; - $other_data['订单合同'] = ['type' => 'text', 'value' => $img_status['contract_img']['text'], 'bg_color' => $img_status['contract_img']['color']]; - $other_data['付款凭证'] = ['type' => 'text', 'value' => $img_status['pay_img']['text'], 'bg_color' => $img_status['pay_img']['color']]; if ($val['main_type']) {//公司 - $other_data['营业执照'] = ['type' => 'text', 'value' => $img_status['business_licence']['text'], 'bg_color' => $img_status['business_licence']['color']]; + $o_data_1['营业执照'] = ['type' => 'text', 'value' => $img_status['business_licence']['text'], 'bg_color' => $img_status['business_licence']['color']]; } else { - $other_data['客户身份证'] = ['type' => 'text', 'value' => $img_status['cardida']['text'], 'bg_color' => $img_status['cardida']['color']]; + $o_data_1['客户身份证'] = ['type' => 'text', 'value' => $img_status['cardida']['text'], 'bg_color' => $img_status['cardida']['color']]; } - $other_data['权益确认书'] = ['type' => 'text', 'value' => $img_status['equity_ck_img']['text'], 'bg_color' => $img_status['equity_ck_img']['color']]; - $val['order_time'] != '0000-00-00 00:00:00' && $other_data['下定时间'] = ['type' => 'text', 'value' => date('Y-m-d', strtotime($val['order_time'])), 'bg_color' => '']; - $val['delry_time'] != '0000-00-00 00:00:00' && $other_data['期望交付'] = ['type' => 'text', 'value' => date('Y-m-d', strtotime($val['delry_time'])), 'bg_color' => '']; + $o_data_1['订单合同'] = ['type' => 'text', 'value' => $img_status['contract_img']['text'], 'bg_color' => $img_status['contract_img']['color']]; + $o_data_1['付款凭证'] = ['type' => 'text', 'value' => $img_status['pay_img']['text'], 'bg_color' => $img_status['pay_img']['color']]; + $o_data_1['权益确认书'] = ['type' => 'text', 'value' => $img_status['equity_ck_img']['text'], 'bg_color' => $img_status['equity_ck_img']['color']]; + $o_data_2 = [ + '付款方式' => ['type' => 'text', 'value' => $val['payway'] ? '全款' : '按揭', 'bg_color' => ''], + '发票' => ['type' => 'text', 'value' => $img_status['bill_img']['text'], 'bg_color' => $img_status['bill_img']['color']] + ]; + $o_data_3 = [ + '行驶证' => ['type' => 'text', 'value' => $img_status['car_img']['text'], 'bg_color' => $img_status['car_img']['color']], + '保单' => ['type' => 'text', 'value' => $img_status['insurance_img']['text'], 'bg_color' => $img_status['insurance_img']['color']], + '交车合照' => ['type' => 'text', 'value' => $img_status['delivery_ck_img']['text'], 'bg_color' => $img_status['delivery_ck_img']['color']] + ]; + $o_data_4 = []; + $val['order_time'] != '0000-00-00 00:00:00' && $o_data_4['下定时间'] = ['type' => 'text', 'value' => date('Y-m-d', strtotime($val['order_time'])), 'bg_color' => '']; + $val['delry_time'] != '0000-00-00 00:00:00' && $o_data_4['期望交付'] = ['type' => 'text', 'value' => date('Y-m-d', strtotime($val['delry_time'])), 'bg_color' => '']; if ($map_users[$val['admin_id']]) { - $other_data['销售顾问'] = ['type' => 'text', 'value' => $map_users[$val['admin_id']], 'bg_color' => '']; + $o_data_4['销售顾问'] = ['type' => 'text', 'value' => $map_users[$val['admin_id']], 'bg_color' => '']; } + $other_data['o_data_1'] = $o_data_1; + $other_data['o_data_2'] = $o_data_2; + $other_data['o_data_3'] = $o_data_3; + $other_data['o_data_4'] = $o_data_4; $lists[] = [ 'id' => $val['id'], 'cus_id' => $val['customer_id'], @@ -408,7 +421,6 @@ class Cusorder extends Wxapp 'other_data' => $other_data, 'allot' => $allot, ]; - } } $data = [ @@ -437,20 +449,22 @@ class Cusorder extends Wxapp $row['color'] && $car_data['车身颜色'] = $row['color']; $row['in_color'] && $car_data['内饰颜色'] = $row['in_color']; $car_data['付款方式'] = $payway ? '全款' : '分期'; - $car_data['期望交付时间'] = date('Y-m-d', strtotime($row['delry_time'])); + $row['delry_time'] != '0000-00-00 00:00:00' && $car_data['期望交付时间'] = date('Y-m-d', strtotime($row['delry_time'])); if (!$payway) { // 分期 - $car_data['首付款方式'] = $this->orders_model->downpayment_type($row['downpayment_type']); - $car_data['贷款额度'] = $money_json['loan_amount']; - $car_data['贷款期数'] = $money_json['loan_periods']; - $car_data['月供'] = $money_json['monthly_payment']; - } - $car_data['是否店内上牌'] = $row['if_num'] ? '是' : '否'; - $car_data['是否店内投保'] = $row['if_insure'] ? '是' : '否'; - if ($row['if_num']) { - $car_data['上牌费'] = $money_json['register_amount'] ? $money_json['register_amount'] : 0; + $car_data['按揭信息'] = ''; +// $car_data['首付款方式'] = $this->orders_model->downpayment_type($row['downpayment_type']); +// $car_data['贷款额度'] = $money_json['loan_amount']; +// $car_data['贷款期数'] = $money_json['loan_periods']; +// $car_data['月供'] = $money_json['monthly_payment']; } $money_json['confirm_amount'] && $car_data['定金'] = $money_json['confirm_amount']; $money_json['discount_amount'] && $car_data['车身优惠'] = $money_json['discount_amount']; + $car_data['是否店内投保'] = $row['if_insure'] ? '是' : '否'; + $car_data['是否店内上牌'] = $row['if_num'] ? '是' : '否'; + if ($row['if_num']) { + $car_data['上牌费'] = $money_json['register_amount'] ? $money_json['register_amount'] : 0; + } + $bt_cn_array = [0 => '下定信息确认无误', 1 => '发票信息确认无误', 2 => '车辆交付']; $data = [ 'id' => $id, diff --git a/api/controllers/wxapp/licheb/Customerlogs.php b/api/controllers/wxapp/licheb/Customerlogs.php index c81d531b..55f2746f 100644 --- a/api/controllers/wxapp/licheb/Customerlogs.php +++ b/api/controllers/wxapp/licheb/Customerlogs.php @@ -1,5 +1,5 @@ load->model('receiver/receiver_customers_model', 'customers_model'); $this->load->model('receiver/receiver_customer_oplogs_model', 'customer_oplogs_model'); $this->load->model('receiver/receiver_comments_model', 'mdComments'); -// $this->load->model('receiver/receiver_xz_model'); + $this->load->model('receiver/receiver_yx_model'); } protected function get() @@ -53,11 +53,11 @@ class Customerlogs extends Wxapp } } if ($val['type'] == 2) { - $rec_row = $this->receiver_xz_model->get(['id' => $val['log']], 'rec_url,duration'); + $rec_row = $this->receiver_yx_model->get(['id' => $val['log']], 'rec_url,duration'); $content = '拨打电话'; !$rec_row['duration'] && $content .= '(未接通)'; - $rec_row['rec_url'] && $record = $rec_row['rec_url']; - $rec_row['duration'] && $second = intval($rec_row['duration'] / 1000); + $rec_row['rec_url'] && $record = get_yx_video($rec_row['rec_url']); + $rec_row['duration'] && $second = intval($rec_row['duration']); } $comments = []; $res = $this->mdComments->select(['pid' => $val['id'], 'status' => 1, 'type' => 0], 'id asc', 0, 0 diff --git a/api/controllers/wxapp/licheb/Loan.php b/api/controllers/wxapp/licheb/Loan.php new file mode 100644 index 00000000..66eb5669 --- /dev/null +++ b/api/controllers/wxapp/licheb/Loan.php @@ -0,0 +1,61 @@ +login_white = array();//登录白名单 + $this->check_status = array();//用户状态校验 + $this->check_mobile = array();//需要手机号 + $this->check_headimg = array();//授权微信信息 + + $this->load->model('receiver/order/receiver_orders_model', 'orders_model'); + } + + protected function get() + { + } + + protected function post() + { + + } + + protected function put() + { + + $oid = $this->input_param('o_id'); + //贷款相关参数 + $downpayment_type = $this->input_param('downpayment_type'); + $loan_amount = $this->input_param('loan_amount'); + $loan_periods = $this->input_param('loan_periods'); + $monthly_payment = $this->input_param('monthly_payment'); + + $row = $this->orders_model->get(['id' => $oid]); + if (!$row) throw new Exception('参数错误', ERR_PARAMS_ERROR); + $money_json = json_decode($row['money_json'], true); + $data['downpayment_type'] = $downpayment_type; + $money_json['loan_amount'] = $loan_amount ? $loan_amount : 0; + $money_json['loan_periods'] = $loan_periods ? $loan_periods : 0; + $money_json['monthly_payment'] = $monthly_payment ? $monthly_payment : 0; + $data['money_json'] = json_encode($money_json, JSON_UNESCAPED_UNICODE); + $result = $this->orders_model->update($data, ['id' => $row['id']]); + if ($result) { + throw new Exception('修改成功', API_CODE_SUCCESS); + } else { + throw new Exception('修改失败', ERR_PARAMS_ERROR); + } + } +} diff --git a/api/controllers/wxapp/licheb/Yx.php b/api/controllers/wxapp/licheb/Yx.php new file mode 100644 index 00000000..a7e5d698 --- /dev/null +++ b/api/controllers/wxapp/licheb/Yx.php @@ -0,0 +1,72 @@ +login_white = array();//登录白名单 + + $this->load->model('receiver/receiver_customers_model', 'customers_model'); + + $this->load->model('receiver/receiver_yx_model'); + $this->log_file = 'call.log'; + } + + protected function get() + { + $id = $this->input_param('id'); + $session = $this->session; + $admin_id = $session['uid']; + $cf_title = 'customer'; + $cus_id = $id; + $row = $this->customers_model->get(['id' => $cus_id]); + if (!$row || !$row['mobile']) { + throw new Hd_Exception('用户不存在', API_CODE_INVILD_PARAM); + } + $customer_mobile = $row['mobile']; + $user_mobile = $session['mobile']; + $json = $session['jsondata'] ? json_decode($session['jsondata'], true) : array(); + if ($json && $json['hdy'] && $json['hdy']['tel']) { + $user_mobile = $json['hdy']['tel']; + } + $redis = &load_cache('redis'); + $cache_key = "XZ_LICHEB_MOBILEA_{$user_mobile}_MOBILEB_{$customer_mobile}_{$admin_id}"; + $call_mobile = $redis->get($cache_key); + if (!$call_mobile) { + $seq_id = create_order_no(); + $ycall = new Ycall(); + $maxBindingTime = 10;//绑定时间 + $result = $ycall->ABXbind($user_mobile, $customer_mobile, $seq_id, $maxBindingTime); + if ($result['result'] != '000000') { //绑定失败 + debug_log("xz_failed_bind:customer_mobile【{$customer_mobile}】", $this->log_file); + debug_log("xz_result:" . json_encode($result, JSON_UNESCAPED_UNICODE), $this->log_file); + throw new Hd_Exception($result['message'], API_CODE_FAIL); + } else { + $call_mobile = $result['middleNumber']; + $add_data = [ + 'call_id' => $seq_id, + 'display_number' => $call_mobile, + 'biz_id' => $row['biz_id'], + 'cf_id' => $cus_id, + 'cf_uid' => $admin_id, + 'cf_title' => $cf_title, + 'cf_platform' => 'api', + 'json_data' => json_encode(['uname' => $session['uname']], JSON_UNESCAPED_UNICODE), + 'c_time' => time() + ]; + $this->receiver_yx_model->add($add_data); + + $redis->save($cache_key, $call_mobile, $maxBindingTime * 60); + } + } + $data['mobile'] = $call_mobile; + return $data; + } +} diff --git a/common/helpers/comm_helper.php b/common/helpers/comm_helper.php index e7d21185..49efe4fe 100644 --- a/common/helpers/comm_helper.php +++ b/common/helpers/comm_helper.php @@ -962,11 +962,11 @@ if (!function_exists('http_host_com')) { } } else { // 正式 if ($type == 'api') { - $url = ""; + $url = "https://sapi.liche.cn"; } else if ($type == 'home') { $url = ""; } else if ($type == 'admin') { - $url = ""; + $url = "https://sadmin.liche.cn"; } } return $url; @@ -1198,3 +1198,18 @@ if (!function_exists('isValidLatLng')) { return preg_match($longitudePattern, $lng) && preg_match($latitudePattern, $lat); } } +/** + * 获取云信录音 + */ +if (!function_exists('get_yx_video')) { + function get_yx_video($string) + { + if (strpos($string, 'hangzhou.aliyuncs.com') !== false) { + $record = $string; + } else { + $record = build_qiniu_image_url($string); + } + return $record; + } + +} diff --git a/common/libraries/Hd_wechat.php b/common/libraries/Hd_wechat.php index 749362c7..55487247 100644 --- a/common/libraries/Hd_wechat.php +++ b/common/libraries/Hd_wechat.php @@ -25,13 +25,13 @@ class Hd_wechat if (false !== strpos($_SERVER['HTTP_HOST'], 'dev')) { //dev 测试 $this->env = 'd'; } elseif (false !== strpos($_SERVER['HTTP_HOST'], 'api.ss.haodian.cn')) {//test 测试 - $this->env = 'p'; + $this->env = 't'; } else { // 正式 $this->env = 'p'; } if ('p' != $this->env) { - $this->url_wechat = http_host_com('api') . 'weixin'; + $this->url_wechat = 'https://sapi.liche.cn/weixin'; } $this->redis = &load_cache('redis'); diff --git a/common/libraries/receiver/Order_datas_entity.php b/common/libraries/receiver/Order_datas_entity.php index bc833af5..6bfa52c6 100644 --- a/common/libraries/receiver/Order_datas_entity.php +++ b/common/libraries/receiver/Order_datas_entity.php @@ -1,11 +1,13 @@ ci = & get_instance(); + public function __construct() + { + $this->ci = &get_instance(); } - public function data_status($o_data){ + public function data_status($o_data) + { $result = [ - 'contract_img' => ['text'=>'未传','type'=>1,'color'=>self::COLOR_UN_UPLOAD], //合同图片 - 'pay_img' => ['text'=>'未传','type'=>1,'color'=>self::COLOR_UN_UPLOAD], //支付凭证 - 'cardida' => ['text'=>'未传','type'=>2,'color'=>self::COLOR_UN_UPLOAD], //身份证 - 'business_licence' => ['text'=>'未传','type'=>3,'color'=>self::COLOR_UN_UPLOAD], //营业执照 - 'equity_ck_img' => ['text'=>'未传','type'=>4,'color'=>self::COLOR_UN_UPLOAD], //权益确认书 + 'contract_img' => ['text' => '未传', 'type' => 1, 'color' => self::COLOR_UN_UPLOAD], //合同图片 + 'pay_img' => ['text' => '未传', 'type' => 1, 'color' => self::COLOR_UN_UPLOAD], //支付凭证 + 'cardida' => ['text' => '未传', 'type' => 2, 'color' => self::COLOR_UN_UPLOAD], //身份证 + 'business_licence' => ['text' => '未传', 'type' => 3, 'color' => self::COLOR_UN_UPLOAD], //营业执照 + 'equity_ck_img' => ['text' => '未传', 'type' => 4, 'color' => self::COLOR_UN_UPLOAD], //权益确认书 + 'bill_img' => ['text' => '未传', 'type' => 5, 'color' => self::COLOR_UN_UPLOAD], //发票 + 'delivery_ck_img' => ['text' => '未传', 'type' => 5, 'color' => self::COLOR_UN_UPLOAD], //交车确认图片 + 'car_img' => ['text' => '未传', 'type' => 5, 'color' => self::COLOR_UN_UPLOAD], //行驶证 + 'car_auth_img' => ['text' => '未传', 'type' => 5, 'color' => self::COLOR_UN_UPLOAD], //车机实名认证 + 'insurance_img' => ['text' => '未传', 'type' => 5, 'color' => self::COLOR_UN_UPLOAD], //交强险图片 ]; - foreach ($result as $key=>$item) { - if($o_data[$key]){ + foreach ($result as $key => $item) { + if ($o_data[$key]) { $result[$key]['text'] = '已传'; $result[$key]['color'] = self::COLOR_IS_UPLOAD; } diff --git a/common/models/receiver/Receiver_yx_model.php b/common/models/receiver/Receiver_yx_model.php new file mode 100644 index 00000000..42e7f715 --- /dev/null +++ b/common/models/receiver/Receiver_yx_model.php @@ -0,0 +1,12 @@ +table_name, 'default'); + } +} diff --git a/common/third_party/Ycall/Ycall.php b/common/third_party/Ycall/Ycall.php new file mode 100644 index 00000000..332fe5b2 --- /dev/null +++ b/common/third_party/Ycall/Ycall.php @@ -0,0 +1,125 @@ +ci = &get_instance(); + + $params['app_id'] && $this->account = $params['app_id']; + $params['app_key'] && $this->token = $params['app_key']; + } + + public function ABXPoll($mobileA, $mobileB, $customerData, $callbackUrl, $maxBindingTime = 0, $callRec = 1, $rand = False) + { //轮询 + $ci = &get_instance(); + $ci->config->load('ycall', TRUE); + if ($this->phones) { + $mobile_list = $this->phones; + } else { + $mobile_list = $ci->config->item($this->mobileList, 'ycall'); + } + if ($rand) { //随机 + shuffle($mobile_list); + } + foreach ($mobile_list as $item) { + $middleNumber = $item; + $result = $this->ABXbind($mobileA, $mobileB, $middleNumber, $customerData, $callbackUrl, $maxBindingTime, $callRec); + if ($result['result'] == '000000') { + break; + } + } + return $result; + } + + public function ABXbind($mobileA, $mobileB, $customerData, $maxBindingTime = 0, $middleNumber = '', $callbackUrl = '', $callRec = 1) + { + !$callbackUrl && $callbackUrl = $this->callbackUrl; + $axbBody = new PrivacyAxbBindBody(); + + /**设置为平台分配的隐私号码*/ + $middleNumber && $axbBody->middleNumber = $middleNumber; + /**设置为需要绑定的号码A*/ + $axbBody->bindNumberA = $mobileA; + /**设置为需要绑定的号码B*/ + $axbBody->bindNumberB = $mobileB; + /**用户自定义字段, 呼叫结束后,推送回用户*/ + $axbBody->customerData = $customerData; + /**是否需要录音,需要录音设置为1,不需要录音设置为0*/ + $axbBody->callRec = $callRec; + /**设置绑定时间,单位秒,当设置为0时,则永久绑定*/ + $axbBody->maxBindingTime = $maxBindingTime; + /**设置话单的推送地址*/ + $axbBody->callbackUrl = $callbackUrl; + + /**设置为平台分配的account*/ + $account = $this->account; + /**设置为平台分配的token*/ + $token = $this->token; + $sender = new WinnerVoiceSender($account, $token, true); + $result = $sender->sendRequest('/voice/1.0.0/middleNumberAXB', json_encode($axbBody)); + + $voice_result = json_decode($result, true); + + return $voice_result; + } + + /** AX,AXB 模式小号解绑 */ + function AXBUnbind($middleNumber, $mobileA, $mobileB = '') + { + $unbindBody = new PrivacyUnbindBoody(); + $unbindBody->middleNumber = $middleNumber; + $unbindBody->bindNumberA = $mobileA; + $mobileB && $unbindBody->bindNumberB = $mobileB; //AXB 模式时必填 + + /**设置为平台分配的account*/ + $account = $this->account; + /**设置为平台分配的token*/ + $token = $this->token; + + $sender = new WinnerVoiceSender($account, $token, true); + $result = $sender->sendRequest('/voice/1.0.0/middleNumberUnbind', json_encode($unbindBody)); + + $voice_result = json_decode($result, true); + + return $voice_result; + } + + /** + * AXN绑定 + * @return void + */ + public function AXbind($middleNumber, $mobileA, $mobileB = '') + { + $axBody = new PrivacyAxBindBody(); + $axBody->middleNumber = $middleNumber; + $axBody->bindNumberA = $mobileA; + $mobileB && $axBody->bindNumberB = $mobileB; + $axBody->callbackUrl = $this->callbackUrl; + $axBody->callRec = 1; + $axBody->mode = 1; //1: AXN; 2: AX, 默认为 AXN 模式 + /**设置为平台分配的account*/ + $account = $this->account; + /**设置为平台分配的token*/ + $token = $this->token; + $sender = new WinnerVoiceSender($account, $token, true); + $result = $sender->sendRequest('/voice/1.0.0/middleNumberAX', json_encode($axBody, JSON_UNESCAPED_UNICODE)); + $voice_result = json_decode($result, true); + + return $voice_result; + } +} diff --git a/common/third_party/Ycall/sdk/PrivacyAxBindBody.php b/common/third_party/Ycall/sdk/PrivacyAxBindBody.php new file mode 100644 index 00000000..c6aa0b95 --- /dev/null +++ b/common/third_party/Ycall/sdk/PrivacyAxBindBody.php @@ -0,0 +1,25 @@ +account = $accountId; + $this->token = $token; + $this->isHttps = $isHttps; + } + + /** + * + *返回字符串的毫秒数时间戳 + */ + function get_total_millisecond() + { + $time = explode (" ", microtime () ); + $time = $time[1] . "000"; + return $time; + } + + function getAuthorizationHeader($timeStamp) + { + $str = $this->account.":".$timeStamp; + $header = base64_encode($str); + return $header; + } + + function getSig($timeStamp) + { + return md5("$this->account$this->token$timeStamp"); + } + + function sendRequest($voice_url,$body) + { + global $HTTP_VOICE_SERVER,$HTTPS_VOICE_SERVER; + if($this->isHttps) + { + $url=$this->HTTPS_VOICE_SERVER . $voice_url; + } + else { + $url=$this->HTTP_VOICE_SERVER . $voice_url; + } + + $timeStamp = $this->get_total_millisecond(); + + + $sig = $this->getSig($timeStamp); + + + $post_url = "$url/$this->account/$sig"; + $auth_header = $this->getAuthorizationHeader($timeStamp); + $header = array("Accept:application/json","Content-Type:application/json;charset=utf-8","Authorization:$auth_header"); + + $result = $this->curl_post($post_url,$body,$header); + + return $result; + } + + /** + * 发起HTTPS请求 + * @param $url + * @param $data + * @param $header + * @param int $post + * @return bool|string + */ + function curl_post($url,$data,$header,$post=1) + { + //初始化curl + $ch = curl_init(); + //参数设置 + $res= curl_setopt ($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt ($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_POST, $post); + if($post) + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch,CURLOPT_HTTPHEADER,$header); + $result = curl_exec ($ch); + //连接失败 + if($result == FALSE){ + $result = "{\"result\":\"172001\",\"message\":\"网络错误\"}"; + } + curl_close($ch); + return $result; + } + +} + + + + +