System.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. <?php
  2. namespace app\admin\controller;
  3. use app\admin\model\Office;
  4. use think\cache\driver\Redis;
  5. /**
  6. * 管理系统系统设置类
  7. */
  8. class System extends Base
  9. {
  10. /**
  11. * 基础设置
  12. *
  13. * @access public
  14. */
  15. public function basics()
  16. {
  17. // 表单提交.
  18. if (request()->isPost()) {
  19. $param = input('post.');
  20. try {
  21. // 修改系统欢迎语.
  22. if (empty($param['advertisement_img']) === false) {
  23. $updateAstData['advertisement_img'] = $param['advertisement_img'];
  24. }
  25. if (empty($param['logo_img']) === false) {
  26. $updateinfo['logo'] = $param['logo_img'];
  27. }
  28. $updateinfo['enterprise_name'] = $param['enterprise_name'];
  29. $updateAstData['advertisement_url'] = $param['advertisementUrl'];
  30. $updateAstData['advertisement_status'] = $param['status'];
  31. model('Advertisement')->updateAst($updateAstData);
  32. /*// 修改系统欢迎语.
  33. $updateSysData['word'] = $param['systemWord'];
  34. $updateSysWhere['id'] = 1;
  35. model('Reply')->updateReply($updateSysWhere, $updateSysData);*/
  36. // 修改客服欢迎语.
  37. $updateSevData['word'] = $param['serverWord'];
  38. $updateSevWhere['id'] = 2;
  39. model('Reply')->updateReply($updateSevWhere, $updateSevData);
  40. if(!empty($updateinfo)){
  41. db('settings')->where('id',1)->update($updateinfo);
  42. }
  43. return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
  44. } catch (\Exception $e) {
  45. return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
  46. }//end try
  47. }//end if
  48. // 获取广告.
  49. $advertisement = model('Advertisement')->findAst();
  50. /*// 获取系统欢迎语.
  51. $replySystemWhere['id'] = 1;
  52. $replySystem = model('Reply')->findReply($replySystemWhere);*/
  53. // 获取客服欢迎语.
  54. $replyServerWhere['id'] = 2;
  55. $replyServer = model('Reply')->findReply($replyServerWhere);
  56. // 获取logo.
  57. $settings = db('settings')->find();
  58. $this->assign(
  59. [
  60. 'advertisement' => $advertisement,
  61. //'replySystem' => $replySystem,
  62. 'replyServer' => $replyServer,
  63. 'settings' => $settings,
  64. 'status' => config('kf_status'),
  65. ]
  66. );
  67. return $this->fetch();
  68. }//end basics()
  69. /**
  70. * 系统欢迎语
  71. *
  72. * @access public
  73. */
  74. public function welcoming()
  75. {
  76. if (request()->isAjax()) {
  77. $replySystemWhere['type'] = 1;
  78. $result = model('Reply')->selectReply($replySystemWhere);
  79. foreach($result as $key=>$vo){
  80. // 生成操作按钮
  81. $result[$key]['operate'] = $this->makeBotton($vo['id']);
  82. $result[$key]['word'] = htmlspecialchars_decode($vo['word']);
  83. }
  84. $return['rows'] = $result;
  85. return json($return);
  86. }
  87. return $this->fetch();
  88. }//end welcoming()
  89. /**
  90. * 修改系统欢迎语
  91. *
  92. * @access public
  93. */
  94. public function editWelcome()
  95. {
  96. if(request()->isAjax()){
  97. $param = input('post.');
  98. $where['id'] = $param['id'];
  99. $data['sort'] = $param['sort'];
  100. $data['word'] = htmlspecialchars($param['word']);
  101. try{
  102. model('Reply')->updateReply($where, $data);
  103. }catch(\Exception $e){
  104. return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
  105. }
  106. return json(['code' => 1, 'data' => '', 'msg' => '编辑成功']);
  107. }
  108. $id = input('param.id');
  109. $replySystemWhere['id'] = $id;
  110. $replySystem = model('Reply')->findReply($replySystemWhere);
  111. $this->assign([
  112. 'replySystem' => $replySystem,
  113. ]);
  114. return $this->fetch('editwelcome');
  115. }//end editWelcome()
  116. /**
  117. * 新增系统欢迎语
  118. *
  119. * @access public
  120. */
  121. public function delWelcome()
  122. {
  123. if (request()->isAjax()) {
  124. $id = input('param.id');
  125. $where['id'] = $id;
  126. try {
  127. model('Reply')->delReply($where);
  128. } catch (\Exception $e) {
  129. return json(['code' => -1, 'data' => '', 'msg' => $e->getMessage()]);
  130. }
  131. return json(['code' => 1, 'data' => '', 'msg' => '删除成功']);
  132. }
  133. }
  134. /**
  135. * 新增系统欢迎语
  136. *
  137. * @access public
  138. */
  139. public function addWelcome()
  140. {
  141. if(request()->isAjax()){
  142. $param = input('post.');
  143. $data['sort'] = $param['sort'];
  144. $data['word'] = htmlspecialchars($param['word']);
  145. $data['status'] = 1;
  146. $data['type'] = 1;
  147. try{
  148. model('Reply')->addReply($data);
  149. }catch(\Exception $e){
  150. return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
  151. }
  152. return json(['code' => 1, 'data' => '', 'msg' => '新增成功']);
  153. }
  154. return $this->fetch('addwelcome');
  155. }//end addWelcome()
  156. /**
  157. * 会话设置
  158. *
  159. * @access public
  160. */
  161. public function conversation()
  162. {
  163. // 表单提交.
  164. if (request()->isPost()) {
  165. $param = input('post.');
  166. try {
  167. // 修改会话超时.
  168. $updateOvertimeData['systemconfig_data'] = $param['overtime'];
  169. $updateOvertimeData['systemconfig_content'] = $param['overtimeInfo'];
  170. $updateOvertimeWhere['systemconfig_id'] = 1;
  171. model('Systemconfig')->updateSystemconfig($updateOvertimeWhere, $updateOvertimeData);
  172. // 修改访客静默.
  173. $upUptdData['systemconfig_data'] = $param['unoperated'];
  174. $upUptdData['systemconfig_content'] = $param['unoperatedInfo'];
  175. $upUptdWhere['systemconfig_id'] = 2;
  176. model('Systemconfig')->updateSystemconfig($upUptdWhere, $upUptdData);
  177. // 质检会话时长设置.
  178. $upAllTimeData['systemconfig_data'] = $param['verifyAllTime'];
  179. $upAllTimeWhere['systemconfig_id'] = 3;
  180. model('Systemconfig')->updateSystemconfig($upAllTimeWhere, $upAllTimeData);
  181. // 质检会话响应时长设置.
  182. $upReturnTimeData['systemconfig_data'] = $param['verifyReturnTime'];
  183. $upReturnTimeWhere['systemconfig_id'] = 4;
  184. model('Systemconfig')->updateSystemconfig($upReturnTimeWhere, $upReturnTimeData);
  185. // 满意度评价回合限制.
  186. $upRoundData['systemconfig_data'] = $param['round'];
  187. $upRoundWhere['systemconfig_id'] = 5;
  188. model('Systemconfig')->updateSystemconfig($upRoundWhere, $upRoundData);
  189. // 客服接待人数设置.
  190. $upMSWhere['systemconfig_enName'] = 'KFMaxServices';
  191. $upMSData['systemconfig_data'] = $param['max_service'];
  192. model('Systemconfig')->updateSystemconfig($upMSWhere, $upMSData);
  193. // 最大排队人数设置.
  194. $upMWWhere['systemconfig_enName'] = 'maxWait';
  195. $upMWData['systemconfig_data'] = $param['kfConfig_maxWait'];
  196. model('Systemconfig')->updateSystemconfig($upMWWhere, $upMWData);
  197. return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
  198. } catch (\Exception $e) {
  199. return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
  200. }//end try
  201. }//end if
  202. // 获取设置.
  203. $systemconfig = model('Systemconfig')->selectSystemconfig();
  204. $this->assign(
  205. [
  206. 'systemconfig' => $systemconfig,
  207. 'status' => config('kf_status'),
  208. ]
  209. );
  210. return $this->fetch();
  211. }//end conversation()
  212. // 自动回复设置
  213. public function reply()
  214. {
  215. if(request()->isPost()){
  216. $param = input('post.');
  217. if(empty($param['word'])){
  218. return json(['code' => -1, 'data' => '', 'msg' => '回复内容不能为空']);
  219. }
  220. try{
  221. db('reply')->where('id', 1)->update($param);
  222. }catch(\Exception $e){
  223. return json(['code' => -2, 'data' => '', 'msg' => $e->getMessage()]);
  224. }
  225. return json(['code' => 1, 'data' => '', 'msg' => '设置成功']);
  226. }
  227. $info = db('reply')->where('id', 1)->find();
  228. $this->assign([
  229. 'info' => $info,
  230. 'status' => config('kf_status')
  231. ]);
  232. return $this->fetch();
  233. }
  234. // 历史会话记录
  235. public function wordsLog()
  236. {
  237. // $toExcel = input('param.toExcel', 0);
  238. if(request()->isAjax()){
  239. $param = input('param.');
  240. $limit = $param['pageSize'];
  241. $offset = ($param['pageNumber'] - 1) * $limit;
  242. // 默认显示最近7天
  243. $start = input('param.start');
  244. $end = input('param.end');
  245. $user_id = input('param.user_id');
  246. $group_id = input('param.group_id');
  247. $temp = db('service_log');
  248. $countTmp = db('service_log');
  249. if(strlen($param['searchText'])){
  250. $temp = $temp->whereLike('user_name', '%'.$param['searchText'].'%');
  251. $countTmp = $countTmp->whereLike('user_name', '%'.$param['searchText'].'%');
  252. }
  253. //日期
  254. if(!empty($start) && !empty($end) && $start <= $end){
  255. $temp = $temp->whereBetween('start_time', [strtotime($start), strtotime($end . ' 23:59:59')]);
  256. $countTmp = $countTmp->whereBetween('start_time', [strtotime($start), strtotime($end . ' 23:59:59')]);
  257. }
  258. //结束时间为空
  259. if(!empty($start) && empty($end)){
  260. $temp = $temp->where('start_time','>',strtotime($start));
  261. $countTmp = $countTmp->where('start_time','>',strtotime($start));
  262. }
  263. //开始时间为空
  264. if(empty($start) && !empty($end)){
  265. $temp = $temp->where('start_time','<',strtotime($end . ' 23:59:59'));
  266. $countTmp = $countTmp->where('start_time','<',strtotime($end . ' 23:59:59'));
  267. }
  268. //客服
  269. if($user_id != 0){
  270. $temp = $temp->where('kf_id', $user_id);
  271. $countTmp = $countTmp->where('kf_id', $user_id);
  272. }
  273. //客服组
  274. if($group_id != 0){
  275. $temp = $temp->where('group_id', $group_id);
  276. $countTmp = $countTmp->where('group_id', $group_id);
  277. }
  278. $result = $temp->limit($offset, $limit)->order('start_time', 'desc')->select();
  279. //所有客服
  280. $users = db('users')->select();
  281. //所有客服组
  282. $groups = db('groups')->select();
  283. //满意度
  284. $evaluate = db('evaluate')->select();
  285. //$alarm报警信息
  286. $alarm = db('alarm')->select();
  287. foreach($result as $key=>$vo){
  288. if($result[$key]['intime'] != 0){
  289. $result[$key]['intime'] = date('Y-m-d H:i:s', $vo['intime']);
  290. $date = explode(' ',$result[$key]['intime']);
  291. $year = explode('-',$result[$key]['intime']);
  292. if($date[0] == date('Y-m-d',time())){
  293. $result[$key]['intime'] = '<span style="float: right;">'.$date[1].'</span>';
  294. }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
  295. $result[$key]['intime'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
  296. }else{
  297. if($year[0] == date('Y',time())){
  298. $result[$key]['intime'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['intime'])).'</span>';
  299. }
  300. }
  301. }else{
  302. $result[$key]['intime'] = '-';
  303. }
  304. if($result[$key]['start_time'] != 0){
  305. $result[$key]['start_time'] = date('Y-m-d H:i:s', $vo['start_time']);
  306. $date = explode(' ',$result[$key]['start_time']);
  307. $year = explode('-',$result[$key]['start_time']);
  308. if($date[0] == date('Y-m-d',time())){
  309. $result[$key]['start_time'] = '<span style="float: right;">'.$date[1].'</span>';
  310. }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
  311. $result[$key]['start_time'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
  312. }else{
  313. if($year[0] == date('Y',time())){
  314. $result[$key]['start_time'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['start_time'])).'</span>';
  315. }
  316. }
  317. }else{
  318. $result[$key]['start_time'] = '-';
  319. }
  320. if($result[$key]['end_time'] != 0){
  321. $result[$key]['end_time'] = date('Y-m-d H:i:s', $vo['end_time']);
  322. $date = explode(' ',$result[$key]['end_time']);
  323. $year = explode('-',$result[$key]['end_time']);
  324. if($date[0] == date('Y-m-d',time())){
  325. $result[$key]['end_time'] = '<span style="float: right;">'.$date[1].'</span>';
  326. }else if($date[0] == date('Y-m-d',strtotime("-1 day"))){
  327. $result[$key]['end_time'] = '<span style="float: right;">'.'昨天 '.$date[1].'</span>';
  328. }else{
  329. if($year[0] == date('Y',time())){
  330. $result[$key]['end_time'] = '<span style="float: right;">'.date('m-d H:i:s',strtotime($result[$key]['end_time'])).'</span>';
  331. }
  332. }
  333. }else{
  334. $result[$key]['end_time'] = '-';
  335. }
  336. //客服名称
  337. for($i=0;$i<count($users);$i++){
  338. if($result[$key]['kf_id'] == $users[$i]['id']){
  339. $result[$key]['kefu_name'] = $users[$i]['user_name'];
  340. }
  341. }
  342. //满意度
  343. for($j=0;$j<count($evaluate);$j++){
  344. if($result[$key]['evaluate_id'] == $evaluate[$j]['evaluate_id']){
  345. $result[$key]['evaluate_name'] = $evaluate[$j]['evaluate_name'];
  346. }
  347. }
  348. //客服所在组
  349. for($a=0;$a<count($groups);$a++){
  350. if($result[$key]['group_id'] == $groups[$a]['id']){
  351. $result[$key]['group_name'] = $groups[$a]['name'];
  352. }
  353. }
  354. //会话时长/响应时长
  355. for($b=0;$b<count($alarm);$b++){
  356. if($result[$key]['servicelog_id'] == $alarm[$b]['servicelog_id']){
  357. //会话时长
  358. $conversation_min = intval($alarm[$b]['alarm_cvtOvertime']/60);
  359. $conversation_s = $alarm[$b]['alarm_cvtOvertime']%60;
  360. $result[$key]['conversation'] = $conversation_min.'分'.$conversation_s.'秒';
  361. //响应时长
  362. $response_min = intval($alarm[$b]['alarm_corresponding']/60);
  363. $response_s = $alarm[$b]['alarm_corresponding']%60;
  364. $result[$key]['response'] = $response_min.'分'.$response_s.'秒';
  365. }
  366. }
  367. if($vo['servicelog_close_type'] == 0){
  368. $result[$key]['servicelog_close_type'] = '未知';
  369. }
  370. if($vo['servicelog_close_type'] == 1){
  371. $result[$key]['servicelog_close_type'] = '无效会话';
  372. }
  373. if($vo['servicelog_close_type'] == 2){
  374. $result[$key]['servicelog_close_type'] = '双方静默';
  375. }
  376. if($vo['servicelog_close_type'] == 3){
  377. $result[$key]['servicelog_close_type'] = '客服关闭';
  378. }
  379. if($vo['servicelog_close_type'] == 4){
  380. $result[$key]['servicelog_close_type'] = '客服掉线';
  381. }
  382. if($vo['servicelog_close_type'] == 5){
  383. $result[$key]['servicelog_close_type'] = '转出';
  384. }
  385. // 生成操作按钮
  386. if(0 != $vo['servicelog_id']){
  387. $result[$key]['operate'] = $this->makeBtn($vo['servicelog_id']);
  388. }
  389. }
  390. $return['total'] = $countTmp->count(); //总数据
  391. $return['rows'] = $result;
  392. // if (!$toExcel) {
  393. // return json($return);
  394. // } else {
  395. // $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度'];
  396. // $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name'];
  397. // (new Office())->outdata('工作报表数据导出', $result, $head, $key);
  398. // return true;
  399. // }
  400. return json($return);
  401. }
  402. //所有客服
  403. $users = db('users')->select();
  404. $useroption = '';
  405. if(!empty($users)){
  406. $option = '<option value="0">全部客服</option>';
  407. for($i=0;$i<count($users);$i++){
  408. $option = $option.'<option value="'.$users[$i]['id'].'">'.$users[$i]['user_name'].'</option>';
  409. }
  410. $useroption = '<select class="selector_user" lay-verify="required" lay-filter="user_id">'.$option.'</select>';
  411. }
  412. //所有客服组
  413. $groups = db('groups')->select();
  414. $groupoption = '';
  415. if(!empty($groups)){
  416. $option = '<option value="0">全部客服组</option>';
  417. for($j=0;$j<count($groups);$j++){
  418. $option = $option.'<option value="'.$groups[$j]['id'].'">'.$groups[$j]['name'].'</option>';
  419. }
  420. $groupoption = '<select class="selector_group" lay-verify="required" lay-filter="group_id">'.$option.'</select>';
  421. }
  422. $this->assign([
  423. 'useroption' => $useroption,
  424. 'groupoption' => $groupoption
  425. ]);
  426. return $this->fetch('wordslog');
  427. }
  428. function matching($str, $a, $b)
  429. {
  430. $pattern = '/('.$a.')(.*)(?)('.$b.')/'; //正则规则匹配支付串中任何一个位置字符串
  431. //$pattern = '/(#\[)(.*)(?)(\]\/)/';
  432. preg_match_all($pattern,$str,$m);
  433. //preg_match_all($pattern, $str, $m); //返回一个匹配结果
  434. //print_r($m);die; //到时候在这里书写返回值就好了 .die;
  435. }
  436. // 历史会话记录详情
  437. public function detail($id, $type='')
  438. {
  439. $chat = db('chat_log')->where('servicelog_id',$id)->order('time_line')->select();
  440. $html = '';
  441. for($i=0;$i<count($chat);$i++){
  442. $content = json_decode($chat[$i]['content'], true);
  443. $chat[$i]['time_line'] = date('H:i',$chat[$i]['time_line']);
  444. if(!empty($content['text'])){
  445. $content['content'] = '&nbsp&nbsp'.$content['text'].'&nbsp&nbsp';
  446. }
  447. if(!empty($content['img'])){
  448. $content['content'] = '<img width="100%" src="'.$content['img'].'"/>';
  449. }
  450. if(!empty(strstr($chat[$i]['to_id'], 'KF'))){
  451. /*$preg1 = "/^#[*]$/";
  452. $preg= '/xue[\s\S]*?om/i';
  453. preg_match_all($preg1,"#[哈哈]/",$res);
  454. var_dump($res);*/
  455. $this->matching("#[哈哈]/","#\[","\]\/");
  456. //$this->getFacesIcon();
  457. $html = $html . '<div style="margin-top:15px;width:75%"><div>'.$chat[$i]['from_name'].'&nbsp&nbsp&nbsp'.$chat[$i]['time_line'].'</div>';
  458. $html = $html . '<div style="margin-top:5px;display:inline-block;*display:inline;*zoom:1;word-break:break-all;word-wrap:break-word" class="form-content">'.$content['content'].'</div></div>';
  459. }else{
  460. $html = $html . '<div style="margin-top:15px;width:75%;margin-left:25%;text-align:right;"><div>'.$chat[$i]['from_name'].'&nbsp&nbsp&nbsp'.$chat[$i]['time_line'].'</div>';
  461. $html = $html . '<div style="margin-top:5px;display:inline-block;*display:inline;*zoom:1;text-align:left;word-break:break-all;word-wrap:break-word" class="form-content">'.$content['content'].'</div></div>';
  462. }
  463. }
  464. $redis = new Redis;
  465. if ($type === 'onLine') {
  466. $servicelog = json_decode($redis->handler()->Hget('SERVICELOG', $id), true);
  467. } else {
  468. $servicelog = db('service_log')->where('servicelog_id',$id)->find();
  469. }
  470. //满意度
  471. $evaluate = db('evaluate')->where('evaluate_id',$servicelog['evaluate_id'])->find();
  472. $evaluate = '<img width="40px" style="margin-top:15px;" src="'.$evaluate['evaluate_url'].'"/>';
  473. //$alarm报警信息
  474. if ($type === 'onLine') {
  475. $alarm = json_decode($redis->handler()->Hget('SERVICELOG', $id), true);
  476. } else {
  477. $alarm = db('alarm')->where('servicelog_id',$id)->find();
  478. }
  479. //会话超时标准
  480. $verifyAllTime = db('systemconfig')->where('systemconfig_name','质检会话时长设置')->find();
  481. //会话响应时长标准
  482. $verifyReturnTime = db('systemconfig')->where('systemconfig_name','质检会话响应时长设置')->find();
  483. $span = '';
  484. if(!empty($alarm)){
  485. if($alarm['alarm_userSensitive'] != 0){
  486. $span = $span . '<span class="alarm_info">访客敏感词</span>';
  487. }
  488. if($alarm['alarm_serverSensitive'] != 0){
  489. $span = $span . '<span class="alarm_info">客服敏感词</span>';
  490. }
  491. if($alarm['alarm_corresponding'] > $verifyReturnTime['systemconfig_data']){
  492. $span = $span . '<span class="alarm_info">响应超时</span>';
  493. }
  494. if($alarm['alarm_cvtOvertime'] > $verifyAllTime['systemconfig_data']){
  495. $span = $span . '<span class="alarm_info">会话超时</span>';
  496. }
  497. if($alarm['alarm_respond'] == 1){
  498. $span = $span . '<span class="alarm_info">客服未回应</span>';
  499. }
  500. }
  501. //用户信息
  502. $account = db('accounts')->where('id',$servicelog['user_id'])->find();
  503. $label = db('accountslabel')->where('id', $account['label_id'])->find();
  504. $account['label'] = $label['name'];
  505. $this->assign([
  506. 'html' => $html,
  507. 'span' => $span,
  508. 'evaluate' => $evaluate,
  509. 'servicelog' => $servicelog,
  510. 'account' => $account
  511. ]);
  512. return $this->fetch();
  513. }
  514. // 生成按钮
  515. private function makeBtn($id)
  516. {
  517. $operate = '<a href="' . url('system/detail', ['id' => $id]) . '">';
  518. $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 详情</button></a> ';
  519. return $operate;
  520. }
  521. public function getFacesIcon($facesIcon) {
  522. $data = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", "[鄙视]",
  523. "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", "[嘘]", "[衰]",
  524. "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", "[汗]", "[困]", "[睡]",
  525. "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", "[黑线]", "[阴险]", "[怒骂]",
  526. "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", "[good]", "[NO]", "[赞]", "[来]",
  527. "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", "[威武]", "[奥特曼]", "[礼物]", "[钟]",
  528. "[话筒]", "[蜡烛]", "[蛋糕]"];
  529. $key = array_search($facesIcon, $data);
  530. return $key;
  531. }
  532. public function toexcel()
  533. {
  534. $param = input('param.');
  535. $limit = $param['pageSize'];
  536. $offset = ($param['pageNumber'] - 1) * $limit;
  537. $start = $param['start'];
  538. $end = $param['end'];
  539. $where = [];
  540. if($param['user_id'] != 0){
  541. $where['kf_id'] = $param['user_id'];
  542. }
  543. if($param['group_id'] != 0){
  544. $where['group_id'] = $param['group_id'];
  545. }
  546. if(!empty($param['username'])){
  547. $where['user_name'] = $param['username'];
  548. }
  549. $result = db('service_log')->whereBetween('start_time', [strtotime($start), strtotime($end . ' 23:59:59')])->where($where)->limit($offset, $limit)->order('start_time', 'desc')->select();
  550. //所有客服
  551. $users = db('users')->select();
  552. //所有客服组
  553. $groups = db('groups')->select();
  554. //满意度
  555. $evaluate = db('evaluate')->select();
  556. //$alarm报警信息
  557. $alarm = db('alarm')->select();
  558. foreach($result as $key=>$vo){
  559. if($result[$key]['intime'] != 0){
  560. $result[$key]['intime'] = date('Y-m-d H:i:s', $vo['intime']);
  561. }else{
  562. $result[$key]['intime'] = '-';
  563. }
  564. if($result[$key]['start_time'] != 0){
  565. $result[$key]['start_time'] = date('Y-m-d H:i:s', $vo['start_time']);
  566. }else{
  567. $result[$key]['start_time'] = '-';
  568. }
  569. if($result[$key]['end_time'] != 0){
  570. $result[$key]['end_time'] = date('Y-m-d H:i:s', $vo['end_time']);
  571. }else{
  572. $result[$key]['end_time'] = '-';
  573. }
  574. //客服昵称
  575. for($i=0;$i<count($users);$i++){
  576. if($result[$key]['kf_id'] == $users[$i]['id']){
  577. $result[$key]['kefu_name'] = $users[$i]['user_name'];
  578. }
  579. }
  580. //满意度
  581. $result[$key]['evaluate_name'] = '';
  582. for($j=0;$j<count($evaluate);$j++){
  583. if($result[$key]['evaluate_id'] == $evaluate[$j]['evaluate_id']){
  584. $result[$key]['evaluate_name'] = $evaluate[$j]['evaluate_name'];
  585. }
  586. }
  587. //客服所在组
  588. for($a=0;$a<count($groups);$a++){
  589. if($result[$key]['group_id'] == $groups[$a]['id']){
  590. $result[$key]['group_name'] = $groups[$a]['name'];
  591. }
  592. }
  593. //会话时长/响应时长
  594. $result[$key]['conversation'] = '';
  595. $result[$key]['response'] = '';
  596. for($b=0;$b<count($alarm);$b++){
  597. if($result[$key]['servicelog_id'] == $alarm[$b]['servicelog_id']){
  598. //会话时长
  599. $conversation_min = intval($alarm[$b]['alarm_cvtOvertime']/60);
  600. $conversation_s = $alarm[$b]['alarm_cvtOvertime']%60;
  601. $result[$key]['conversation'] = $conversation_min.'分'.$conversation_s.'秒';
  602. //响应时长
  603. $response_min = intval($alarm[$b]['alarm_corresponding']/60);
  604. $response_s = $alarm[$b]['alarm_corresponding']%60;
  605. $result[$key]['response'] = $response_min.'分'.$response_s.'秒';
  606. }
  607. }
  608. if($vo['servicelog_close_type'] == 0){
  609. $result[$key]['servicelog_close_type'] = '未知';
  610. }
  611. if($vo['servicelog_close_type'] == 1){
  612. $result[$key]['servicelog_close_type'] = '访客静默';
  613. }
  614. if($vo['servicelog_close_type'] == 2){
  615. $result[$key]['servicelog_close_type'] = '会话超时';
  616. }
  617. if($vo['servicelog_close_type'] == 3){
  618. $result[$key]['servicelog_close_type'] = '客服关闭';
  619. }
  620. if($vo['servicelog_close_type'] == 4){
  621. $result[$key]['servicelog_close_type'] = '客服掉线';
  622. }
  623. if($vo['servicelog_close_type'] == 5){
  624. $result[$key]['servicelog_close_type'] = '转接';
  625. }
  626. //工单聊天详情
  627. $chat_log = db('chat_log')->where('servicelog_id',$vo['servicelog_id'])->order('time_line', 'desc')->select();
  628. $result[$key]['detail'] = '';
  629. for($c=0;$c<count($chat_log);$c++){
  630. $content = json_decode($chat_log[$c]['content'], true);
  631. $chat_log[$c]['time_line'] = date('Y-m-d H:i:s',$chat_log[$c]['time_line']);
  632. $result[$key]['detail'] = $result[$key]['detail'].' '.$chat_log[$c]['time_line'].' '.$chat_log[$c]['from_name'];
  633. if(!empty($content['text'])){
  634. $content['content'] = $content['text'];
  635. }
  636. if(!empty($content['img'])){
  637. $content['content'] = '<img width="100%" src="'.$content['img'].'"/>';
  638. }
  639. $result[$key]['detail'] = $result[$key]['detail'].' '.$content['content'];
  640. }
  641. }
  642. $head = ['工单id', '访客进线时间', '接待客服', '所在组', '访客账号', '开始时间', '结束时间', '会话时长', '响应时长', '关闭原因', '满意度','来源ip','来源网站','来源系统','来源浏览器','聊天详情'];
  643. $key = ['servicelog_id', 'intime', 'kefu_name', 'group_name', 'user_name', 'start_time', 'end_time', 'conversation', 'response', 'servicelog_close_type', 'evaluate_name','user_ip','website','system','browse','detail'];
  644. (new Office())->outdata('工单数据导出', $result, $head, $key);
  645. return true;
  646. }
  647. // 生成按钮
  648. private function makeBotton($id)
  649. {
  650. $operate = '<a href="' . url('editWelcome', ['id' => $id]) . '">';
  651. $operate .= '<button type="button" class="btn btn-primary btn-sm"><i class="fa fa-paste"></i> 编辑</button></a> ';
  652. $operate .= '<a href="javascript:delWelcome(' . $id . ')"><button type="button" class="btn btn-danger btn-sm">';
  653. $operate .= '<i class="fa fa-trash-o"></i> 删除</button></a> ';
  654. return $operate;
  655. }
  656. }