1
0

OutCall.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. <?php
  2. namespace app\api\controller;
  3. use app\model\Customer;
  4. use app\model\CustomerVisitLog;
  5. use app\model\Employee;
  6. use app\model\Org;
  7. use app\model\OutCallLog;
  8. use app\model\OutCallMbLog;
  9. use app\model\OutCallSetting;
  10. use call\Haoxiaoyun;
  11. use call\Yhuatong;
  12. use call\Luban;
  13. use think\facade\Request;
  14. use clue\Fish as clueFish;
  15. use app\model\FishData;
  16. use app\model\Company;
  17. use app\model\CustomerSource;
  18. class OutCall extends Base
  19. {
  20. /**
  21. * 回调方法
  22. *
  23. */
  24. public function callBack()
  25. {
  26. $params = request()->param();
  27. if (isset($params['oid'])) $type = 'luban';
  28. if (isset($params['sessionId']) || isset($params['session_id'])) $type = 'yhuatong';
  29. if (isset($params['bind_id'])) $type = 'haoxiaoyun';
  30. if (!isset($type)) return json(['code' => 1, 'msg' => '失败,未设置的外呼系统']);
  31. $method = $type . 'CallBack';
  32. return $this->$method();
  33. }
  34. /**
  35. * 云话统推送
  36. */
  37. public function yhuatongCallBack()
  38. {
  39. $params = request()->param();
  40. // 录音推送key
  41. $luyinKey = ['key' => '', 'hash' => '', 'fsize' => '', 'url' => '', 'sessionId' => '', 'call_id' => ''];
  42. $rs = array_diff_key($luyinKey, $params);
  43. // 判断是录音推送还是话单推送
  44. if (count($rs) == 0) { // 录音推送
  45. return $this->yhuatongLuyin($params);
  46. } else { // 话单推送
  47. return $this->yhuatongHuadan($params);
  48. }
  49. }
  50. public function yhuatongLuyin($params)
  51. {
  52. // 查询通话记录
  53. $log = OutCallLog::where(['session_id' => $params['sessionId']])->find();
  54. if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']);
  55. $log->save([
  56. 'key' => $params['key'],
  57. 'hash' => $params['hash'],
  58. 'fsize' => $params['fsize'],
  59. 'url' => $params['url'],
  60. 'call_id' => $params['call_id']
  61. ]);
  62. $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find();
  63. if (!empty($visitLog)) {
  64. $visitLog->remark = $visitLog->remark; //. '##' . $params['url'];
  65. $visitLog->save();
  66. }
  67. return json(['code' => 0, 'msg' => 'success']);
  68. }
  69. public function yhuatongHuadan($params)
  70. {
  71. // 查询通话记录
  72. $log = OutCallLog::where(['session_id' => $params['session_id']])->find();
  73. if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']);
  74. $data = [
  75. 'fwd_start_time' => $params['fwd_start_time'],
  76. 'call_end_time' => $params['call_end_time'],
  77. 'billsec' => $params['billsec'],
  78. 'status' => $params['status']
  79. ];
  80. if (isset($params['call_status'])) $data['call_status'] = $params['call_status'];
  81. $log->save($data);
  82. $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find();
  83. if (!empty($visitLog)) {
  84. if ($params['status'] == 1) {
  85. $visitLog->remark = '回访跟踪了客户,通话时长' . $params['billsec'] . 's';
  86. } else {
  87. $visitLog->remark = '回访跟踪了客户,电话未接通';
  88. }
  89. $visitLog->save();
  90. }
  91. return json(['code' => 0, 'msg' => 'success']);
  92. }
  93. /**
  94. * 鲁班外呼系统推送
  95. */
  96. public function lubanCallBack()
  97. {
  98. $params = request()->param();
  99. $log = OutCallLog::where(['session_id' => $params['oid']])->find();
  100. if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']);
  101. $log->save([
  102. 'fwd_start_time' => $params['stime'],
  103. 'call_end_time' => $params['etime'],
  104. 'billsec' => $params['htime'],
  105. 'status' => $params['htime'] > 0 ? 1 : -1,
  106. 'call_status' => 1000, // 为了区分
  107. 'url' => $params['voice'],
  108. 'call_msg' => $params['msg']
  109. ]);
  110. $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find();
  111. if (!empty($visitLog)) {
  112. if ($params['status'] == 1) {
  113. $visitLog->remark = '回访跟踪了客户,通话时长' . $params['htime'] . 's';
  114. } else {
  115. $visitLog->remark = '回访跟踪了客户,电话未接通';
  116. }
  117. $visitLog->save();
  118. }
  119. return json(['code' => 0, 'msg' => 'success']);
  120. }
  121. /**
  122. * 好销云回调
  123. */
  124. public function haoxiaoyunCallback()
  125. {
  126. $params = request()->param();
  127. // 查询通话记录
  128. $log = OutCallLog::where(['session_id' => $params['bind_id']])->find();
  129. if (empty($log)) return json(['code' => 1, 'msg' => '通话记录不存在']);
  130. $data = [
  131. 'fwd_start_time' => $params['begin_time'],
  132. 'call_end_time' => $params['end_time'],
  133. 'billsec' => $params['duration'],
  134. 'status' => $params['status'] >= 1 ? 1 : -1,
  135. 'bind_num' => $params['telX'],
  136. 'url' => $params['audio_url'],
  137. 'call_msg' => '',
  138. 'call_status' => 2000
  139. ];
  140. $log->save($data);
  141. $visitLog = CustomerVisitLog::where(['data_type' => 'out_call', 'data_id' => $log->id])->find();
  142. if (!empty($visitLog)) {
  143. if ($params['status'] == 1) {
  144. $visitLog->remark = '回访跟踪了客户,通话时长' . $params['billsec'] . 's';
  145. } else {
  146. $visitLog->remark = '回访跟踪了客户,电话未接通';
  147. }
  148. $visitLog->save();
  149. }
  150. return json(['code' => 0, 'msg' => 'success']);
  151. }
  152. public function bind()
  153. {
  154. $params = request()->param();
  155. //检查是否设置过飞鱼-检查线索是否是飞鱼线索
  156. $root_id = request()->token['root_org'];
  157. $channel_setting = Company::where(['root_id' => $root_id])->value('channel_setting');
  158. if (isset($channel_setting) && $channel_setting) {
  159. $source_id = CustomerSource::where(['root_id' => $root_id, 'source' => '飞鱼线索'])->value('id');
  160. $c_source_id = Customer::where([['id', '=', $params['customer_id']]])->value('source_id');
  161. if ($source_id == $c_source_id) {
  162. $tmp_data = $this->fishOutCall($params, $channel_setting);
  163. if ($tmp_data['code'] == 0) return json($tmp_data);
  164. }
  165. }
  166. $type = OutCallSetting::where(['root_id' => request()->token['root_org']])->value('type');
  167. if (empty($type)) return json(['code' => 1, 'msg' => '未配置外呼系统']);
  168. $method = $type . 'Bind';
  169. return $this->$method($params);
  170. }
  171. public function yhuatongBind($params)
  172. {
  173. $token = request()->token;
  174. $where = [
  175. ['id', '=', $params['customer_id']],
  176. ['state', '<>', '无效'],
  177. ['employee_id', '=', $token['employee_id']]
  178. ];
  179. //指派的客户
  180. $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]];
  181. $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]];
  182. $had = Customer::whereOr([$where, $where_or, $where_or1])->find();
  183. // 不是共有客户,检测是否是领导领导调用
  184. if ($had == null && $token['isManager']) {
  185. $had = Customer::find($params['customer_id']);
  186. // 检测数据是否存在
  187. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  188. $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id;
  189. $employeeIdListArr = explode(',', $employeeIdListStr);
  190. $employeeIdListArr = array_filter($employeeIdListArr);
  191. // 登陆人部门及子部门获取
  192. $my = Org::find($token['org_id']);
  193. $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id');
  194. // 查找分享人是否在部门下
  195. $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count();
  196. if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']);
  197. }
  198. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  199. if ($had->died == 2) {
  200. return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']);
  201. }
  202. // 查询客户电话
  203. $customerPhone = $had->phone;
  204. // 查询员工电话
  205. $employee = Employee::where(['id' => $token['employee_id']])->find();
  206. if (!empty($params['phone'])) {
  207. $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone;
  208. } else {
  209. $employeePhone = $employee->phone;
  210. }
  211. // 电话绑定
  212. $outCallSetting = OutCallSetting::where(['type' => 'yhuatong', 'root_id' => $token['root_org']])->find();
  213. if (empty($outCallSetting)) return json(['code' => 1, 'msg' => '未配置']);
  214. $yhuatong = new Yhuatong($outCallSetting->config['appid'], $outCallSetting->config['secretKey']);
  215. $r = $yhuatong->whiteShow($employeePhone);trace($r, 'info');
  216. if ($r['data'] !== false || $yhuatong->callerType($employeePhone) == false) {
  217. $rs = $yhuatong->bindv2($employeePhone, $customerPhone);
  218. } else {
  219. $telXList = explode(',', $outCallSetting->config['tel_x']);
  220. $randKey = array_rand($telXList);
  221. $telX = $telXList[$randKey];
  222. $rs = $yhuatong->bindv2($employeePhone, $customerPhone, $telX);
  223. }
  224. trace($rs, 'info');
  225. if ($rs['code'] !== 10000) {
  226. trace($rs['msg'], 'error');
  227. return json(['code' => 1, 'msg' => $rs['msg']]);
  228. } else {
  229. // 添加记录
  230. $log = OutCallLog::create([
  231. 'session_id' => $rs['data']['sessionId'],
  232. 'bind_num' => $rs['data']['telX'],
  233. 'caller_num' => $employeePhone,
  234. 'callee_num' => $customerPhone,
  235. 'employee_id' => $token['employee_id'],
  236. 'root_id' => $token['root_org'],
  237. 'customer_id' => $params['customer_id']
  238. ]);
  239. }
  240. $had->updatetime = date('Y-m-d H:i:s');
  241. $had->save();
  242. $customerEmployee = Employee::find($had->employee_id);
  243. // 添加访问记录
  244. CustomerVisitLog::Create([
  245. 'customer_id' => $params['customer_id'],
  246. 'type' => 1,
  247. 'employee_id' => $token['employee_id'],
  248. 'user_id' => $employee->uid,
  249. 'org_id' => $employee->org_id,
  250. 'customer_employee_id' => $had->employee_id,
  251. 'customer_org_id' => $customerEmployee->org_id,
  252. 'data_type' => 'out_call',
  253. 'data_id' => $log->id,
  254. 'remark' => '回访跟踪了客户'
  255. ]);
  256. return json(['code' => 0, 'msg' => '拨打中,请接听']);
  257. }
  258. public function lubanBind($params)
  259. {
  260. $token = request()->token;
  261. $where = [
  262. ['id', '=', $params['customer_id']],
  263. ['state', '<>', '无效'],
  264. ['employee_id', '=', $token['employee_id']]
  265. ];
  266. //指派的客户
  267. $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]];
  268. $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]];
  269. $had = Customer::whereOr([$where, $where_or, $where_or1])->find();
  270. // 不是共有客户,检测是否是领导领导调用
  271. if ($had == null && $token['isManager']) {
  272. $had = Customer::find($params['customer_id']);
  273. // 检测数据是否存在
  274. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  275. $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id;
  276. $employeeIdListArr = explode(',', $employeeIdListStr);
  277. $employeeIdListArr = array_filter($employeeIdListArr);
  278. // 登陆人部门及子部门获取
  279. $my = Org::find($token['org_id']);
  280. $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id');
  281. // 查找分享人是否在部门下
  282. $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count();
  283. if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']);
  284. }
  285. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  286. if ($had->died == 2) {
  287. return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']);
  288. }
  289. // 查询客户电话
  290. $customerPhone = $had->phone;
  291. // 查询员工电话
  292. $employee = Employee::where(['id' => $token['employee_id']])->find();
  293. if (!empty($params['phone'])) {
  294. $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone;
  295. } else {
  296. $employeePhone = $employee->phone;
  297. }
  298. // 电话绑定
  299. $outCallSetting = OutCallSetting::where(['type' => 'luban', 'root_id' => $token['root_org']])->find();
  300. if (empty($outCallSetting)) return json(['code' => 1, 'msg' => '未配置']);
  301. $outcallSetting = new Luban($outCallSetting->config['appid'], $outCallSetting->config['secretKey']);
  302. // 中间号获取
  303. $telXList = explode(',', $outCallSetting->config['tel_x']);
  304. $randKey = array_rand($telXList);
  305. $telX = $telXList[$randKey];
  306. $rs = $outcallSetting->bind($employeePhone, $customerPhone, $telX);
  307. if ($rs['code'] != 0) {
  308. trace($rs['msg'], 'error');
  309. return json(['code' => 1, 'msg' => $rs['msg']]);
  310. } else {
  311. // 添加记录
  312. $log = OutCallLog::create([
  313. 'session_id' => $rs['orderid'],
  314. 'bind_num' => $telX,
  315. 'caller_num' => $employeePhone,
  316. 'callee_num' => $customerPhone,
  317. 'employee_id' => $token['employee_id'],
  318. 'root_id' => $token['root_org'],
  319. 'customer_id' => $params['customer_id']
  320. ]);
  321. }
  322. $had->updatetime = date('Y-m-d H:i:s');
  323. $had->save();
  324. $customerEmployee = Employee::find($had->employee_id);
  325. // 添加访问记录
  326. CustomerVisitLog::Create([
  327. 'customer_id' => $params['customer_id'],
  328. 'type' => 1,
  329. 'employee_id' => $token['employee_id'],
  330. 'user_id' => $employee->uid,
  331. 'org_id' => $employee->org_id,
  332. 'customer_employee_id' => $had->employee_id,
  333. 'customer_org_id' => $customerEmployee->org_id,
  334. 'data_type' => 'out_call',
  335. 'data_id' => $log->id,
  336. 'remark' => '回访跟踪了客户'
  337. ]);
  338. return json(['code' => 0, 'msg' => '拨打中,请接听']);
  339. }
  340. /**
  341. * 好销云绑定
  342. */
  343. public function haoxiaoyunBind($params)
  344. {
  345. $token = request()->token;
  346. $where = [
  347. ['id', '=', $params['customer_id']],
  348. ['state', '<>', '无效'],
  349. ['employee_id', '=', $token['employee_id']]
  350. ];
  351. //指派的客户
  352. $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]];
  353. $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]];
  354. $had = Customer::whereOr([$where, $where_or, $where_or1])->find();
  355. // 不是共有客户,检测是否是领导领导调用
  356. if ($had == null && $token['isManager']) {
  357. $had = Customer::find($params['customer_id']);
  358. // 检测数据是否存在
  359. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  360. $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id;
  361. $employeeIdListArr = explode(',', $employeeIdListStr);
  362. $employeeIdListArr = array_filter($employeeIdListArr);
  363. // 登陆人部门及子部门获取
  364. $my = Org::find($token['org_id']);
  365. $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id');
  366. // 查找分享人是否在部门下
  367. $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count();
  368. if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']);
  369. }
  370. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  371. if ($had->died == 2) {
  372. return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']);
  373. }
  374. // 查询客户电话
  375. $customerPhone = $had->phone;
  376. // 查询员工电话
  377. $employee = Employee::where(['id' => $token['employee_id']])->find();
  378. if (!empty($params['phone'])) {
  379. $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone;
  380. } else {
  381. $employeePhone = $employee->phone;
  382. }
  383. // 电话绑定
  384. $outCallSetting = OutCallSetting::where(['type' => 'haoxiaoyun', 'root_id' => $token['root_org']])->find();
  385. if (empty($outCallSetting) || $outCallSetting->config['open'] != 1) return json(['code' => 1, 'msg' => '未配置']);
  386. $line = isset($outCallSetting->config['line_type']) ? $outCallSetting->config['line_type'] : 1; // 默认AXB线路
  387. $outcallSetting = new Haoxiaoyun();
  388. $rs = $outcallSetting->bind($employeePhone, $customerPhone, $line);
  389. if ($rs['code'] != 1) {
  390. trace($rs, 'info');
  391. return json(['code' => 1, 'msg' => $rs['info']]);
  392. } else {
  393. // 添加记录
  394. $logData = [
  395. 'session_id' => $rs['data']['bind_id'],
  396. 'bind_num' => '',
  397. 'caller_num' => $employeePhone,
  398. 'callee_num' => $customerPhone,
  399. 'employee_id' => $token['employee_id'],
  400. 'root_id' => $token['root_org'],
  401. 'customer_id' => $params['customer_id']
  402. ];
  403. if (isset($rs['data']['number'])) {
  404. $logData['bind_num'] = $rs['data']['number'];
  405. }
  406. $log = OutCallLog::create($logData);
  407. }
  408. $had->updatetime = date('Y-m-d H:i:s');
  409. $had->save();
  410. $customerEmployee = Employee::find($had->employee_id);
  411. // 添加访问记录
  412. CustomerVisitLog::Create([
  413. 'customer_id' => $params['customer_id'],
  414. 'type' => 1,
  415. 'employee_id' => $token['employee_id'],
  416. 'user_id' => $employee->uid,
  417. 'org_id' => $employee->org_id,
  418. 'customer_employee_id' => $had->employee_id,
  419. 'customer_org_id' => $customerEmployee->org_id,
  420. 'data_type' => 'out_call',
  421. 'data_id' => $log->id,
  422. 'remark' => '回访跟踪了客户'
  423. ]);
  424. if (isset($rs['data']['number'])) {
  425. return json(['code' => 0, 'msg' => '拨打中,请接听', 'mobile' => $rs['data']['number']]);
  426. } else {
  427. return json(['code' => 0, 'msg' => '拨打中,请接听']);
  428. }
  429. }
  430. /*
  431. * 设置员工外呼电话
  432. */
  433. public function setPhone()
  434. {
  435. $params = Request::only(['phones' => '']);
  436. $token = $this->request->token;
  437. Employee::where('id', $token['employee_id'])->update(['out_call_phone' => $params['phones']]);
  438. return json(['code' => 0, 'msg' => '保存成功']);
  439. }
  440. /**
  441. * 手机拨打
  442. */
  443. public function mobile($id)
  444. {
  445. $token = request()->token;
  446. $where = [
  447. ['id', '=', $id],
  448. ['state', '<>', '无效'],
  449. ['employee_id', '=', $token['employee_id']]
  450. ];
  451. //指派的客户
  452. $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $id]];
  453. // 指定的设计师
  454. $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $id]];
  455. $had = Customer::whereOr([$where, $where_or, $where_or1])->find();
  456. // 不是共有客户,检测是否是领导领导调用
  457. if ($had == null && $token['isManager']) {
  458. $had = Customer::find($id);
  459. // 检测数据是否存在
  460. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  461. $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id;
  462. $employeeIdListArr = explode(',', $employeeIdListStr);
  463. $employeeIdListArr = array_filter($employeeIdListArr);
  464. // 登陆人部门及子部门获取
  465. $my = Org::find($token['org_id']);
  466. $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id');
  467. // 查找分享人是否在部门下
  468. $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count();
  469. if ($exit == 0) return json(['code' => 1, 'msg' => '数据不存在']);
  470. }
  471. if (!$had) return json(['code' => 1, 'msg' => '数据不存在']);
  472. if ($had->died == 2) {
  473. return json(['code' => 1, 'msg' => '客户死单,暂无法跟踪']);
  474. }
  475. $had->updatetime = date('Y-m-d H:i:s');
  476. $had->save();
  477. // 添加记录
  478. if(input('type',0)==1){
  479. //安卓app打电话 按照外呼的方式处理 方便统计
  480. $log = OutCallLog::create([
  481. 'session_id' => 'andiroid'.time(),
  482. 'employee_id' => $token['employee_id'],
  483. 'customer_id' => $id,
  484. 'status' => -1,
  485. 'root_id' => $token['root_org']
  486. ]);
  487. }else{
  488. $log = OutCallMbLog::create([
  489. 'employee_id' => $token['employee_id'],
  490. 'root_id' => $token['root_org'],
  491. 'customer_id' => $id
  492. ]);
  493. }
  494. $customerEmployee = Employee::find($had->employee_id);
  495. $employee = Employee::where(['id' => $token['employee_id']])->find();
  496. // 添加访问记录
  497. CustomerVisitLog::Create([
  498. 'customer_id' => $id,
  499. 'type' => 1,
  500. 'employee_id' => $token['employee_id'],
  501. 'user_id' => $employee->uid,
  502. 'org_id' => $employee->org_id,
  503. 'customer_employee_id' => $had->employee_id,
  504. 'customer_org_id' => $customerEmployee->org_id,
  505. 'data_type' => 'mobile_call',
  506. 'data_id' => $log->id,
  507. 'remark' => '回访跟踪了客户'
  508. ]);
  509. return json(['code' => 0, 'msg' => '记录添加成功']);
  510. }
  511. /**
  512. * 飞鱼线索外呼
  513. */
  514. public function fishOutCall($params,$channel_setting)
  515. {
  516. $token = request()->token;
  517. $where = [
  518. ['id', '=', $params['customer_id']],
  519. ['state', '<>', '无效'],
  520. ['employee_id', '=', $token['employee_id']]
  521. ];
  522. //指派的客户
  523. $where_or = [['assigned_personnel', 'find in set', $token['employee_id']], ['id', '=', $params['customer_id']]];
  524. $where_or1 = [['designer_id', '=', $token['employee_id']], ['id', '=', $params['customer_id']]];
  525. $had = Customer::whereOr([$where, $where_or, $where_or1])->find();
  526. // 不是共有客户,检测是否是领导领导调用
  527. if ($had == null && $token['isManager']) {
  528. $had = Customer::find($params['customer_id']);
  529. // 检测数据是否存在
  530. if (!$had) return ['code' => 1, 'msg' => '数据不存在'];
  531. $employeeIdListStr = $had->employee_id . ',' . $had->assigned_personnel . ',' . $had->designer_id;
  532. $employeeIdListArr = explode(',', $employeeIdListStr);
  533. $employeeIdListArr = array_filter($employeeIdListArr);
  534. // 登陆人部门及子部门获取
  535. $my = Org::find($token['org_id']);
  536. $orgIdList = Org::where([['path', 'like', $my->path . '%']])->column('id');
  537. // 查找分享人是否在部门下
  538. $exit = Employee::where([['org_id', 'in', $orgIdList], ['id', 'in', $employeeIdListArr]])->count();
  539. if ($exit == 0) return ['code' => 1, 'msg' => '数据不存在'];
  540. }
  541. if (!$had) return ['code' => 1, 'msg' => '数据不存在'];
  542. if ($had->died == 2) {
  543. return ['code' => 1, 'msg' => '客户死单,暂无法跟踪'];
  544. }
  545. $fish_data = FishData::where(['customer_id' => $params['customer_id']])->find();
  546. if (!$fish_data) return ['code' => 1, 'msg' => '数据信息有误'];
  547. $tmp_data = json_decode($channel_setting, true);
  548. // 查询客户电话
  549. $customerPhone = $had->phone;
  550. // 查询员工电话
  551. $employee = Employee::where(['id' => $token['employee_id']])->find();
  552. if (!empty($params['phone'])) {
  553. $employeePhone = ($employee->phone == $params['phone'] || strpos($employee->out_call_phone, $params['phone']) !== false) ? $params['phone'] : $employee->phone;
  554. } else {
  555. $employeePhone = $employee->phone;
  556. }
  557. $appid = config('app.fish_clue_appid');
  558. $secret = config('app.fish_clue_secret');
  559. $fish = new clueFish($appid, $secret);
  560. $tmp_info = [
  561. //广告主id
  562. 'advertiser_id' => $fish_data['advertiser_id'],
  563. //线索id
  564. 'clue_id' => $fish_data['clue_id'],
  565. //主叫号码,必须为11位手机号码,否则呼叫失败
  566. 'caller_number' => $employeePhone,
  567. //被叫号码,即线索号码
  568. 'callee_number' => $customerPhone,
  569. ];
  570. $rs = $fish->getCallVirtualNumber($tmp_data['fish_access_token'], $tmp_info);
  571. if ($rs['code'] != 0) {
  572. return ['code' => 1, 'msg' => '呼叫失败'];
  573. } else {
  574. if($rs['data']['call_result_code'] != 103){
  575. return ['code' => 1, 'msg' => $rs['data']['call_result_message']];
  576. }
  577. // 添加记录
  578. $logData = [
  579. 'session_id' => $rs['data']['contact_id'],
  580. 'bind_num' => $rs['data']['virtual_number'],
  581. 'caller_num' => $employeePhone,
  582. 'callee_num' => $customerPhone,
  583. 'employee_id' => $token['employee_id'],
  584. 'root_id' => $token['root_org'],
  585. 'customer_id' => $params['customer_id']
  586. ];
  587. $log = OutCallLog::create($logData);
  588. }
  589. $had->updatetime = date('Y-m-d H:i:s');
  590. $had->save();
  591. $customerEmployee = Employee::find($had->employee_id);
  592. // 添加访问记录
  593. CustomerVisitLog::Create([
  594. 'customer_id' => $params['customer_id'],
  595. 'type' => 1,
  596. 'employee_id' => $token['employee_id'],
  597. 'user_id' => $employee->uid,
  598. 'org_id' => $employee->org_id,
  599. 'customer_employee_id' => $had->employee_id,
  600. 'customer_org_id' => $customerEmployee->org_id,
  601. 'data_type' => 'out_call',
  602. 'data_id' => $log->id,
  603. 'remark' => '回访跟踪了飞鱼线索客户'
  604. ]);
  605. if (isset($rs['data']['virtual_number'])) {
  606. return ['code' => 0, 'msg' => '拨打中,请接听', 'mobile' => $rs['data']['virtual_number']];
  607. } else {
  608. return ['code' => 1, 'msg' => '拨打中,请接听'];
  609. }
  610. }
  611. }