System.php 24 KB

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