KfjkLogic.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2019/7/6
  6. * Time: 16:59
  7. */
  8. namespace App\common;
  9. use app\admin\model\Kfonline as KfonlineModel;
  10. use app\admin\model\Users;
  11. use think\Db;
  12. /**
  13. * [
  14. * 用户名:
  15. * 会话量:今日客服累计的的会话量 hyl
  16. * 接待量:当前客服正在接待的会话数 jdl
  17. * 平均会话时长:今日客服的平均会话时长,即访客进入到会话结束时时间间隔的平均值 pjhusc
  18. * 参评率:今日客服的累计参评率,即参加评价的数量和接入会话数量的比值 cpl
  19. * 满意度率:今日客服的累计满意度率,即满意的数量和评价会话数量的比值 mydl
  20. * 平均响应时长:今日客服的平均响应时长,即访客访问和客服回复时间间隔的平均值。 pjxysc
  21. * 今日休息时长:今日客服的休息时长的累计值 jrxxsc
  22. * ]
  23. */
  24. class KfjkLogic
  25. {
  26. public function getAllData($kfuidarray)
  27. {
  28. if (empty($kfuidarray)) {
  29. return false;
  30. }
  31. $kfuidarray_index = kftoKey($kfuidarray, 1);
  32. $uidsname = $this->uidName($kfuidarray);
  33. $kfip = $this->getKfinline();
  34. foreach ($kfuidarray as $uid => $val) {
  35. $kfuidarray_index[$uid]['ip'] = $kfip['KF' . $uid]['ip'];
  36. $kfuidarray_index[$uid]['status'] = $this->getStatusName($kfip['KF' . $uid]['status']);
  37. $kfuidarray_index[$uid]['uid'] = $uid;
  38. $kfuidarray_index[$uid]['uidname'] = $uidsname[$uid];
  39. $kfuidarray_index[$uid]['hhl'] = 0;
  40. $kfuidarray_index[$uid]['jdl'] = 0;
  41. $kfuidarray_index[$uid]['pjhysc'] = 0;
  42. $kfuidarray_index[$uid]['cpl'] = 0;
  43. $kfuidarray_index[$uid]['mydl'] = 0;
  44. $kfuidarray_index[$uid]['pjxysc'] = 0;
  45. $kfuidarray_index[$uid]['jrxxsc'] = 0;
  46. $kfuidarray_index[$uid]['fxx'] = $this->makeBtn($uid);;
  47. }
  48. $todayall = $this->getTodayServiceData($kfuidarray);
  49. if (!$todayall) {
  50. GOTO DOLAST;
  51. }
  52. $uids = $kfuidarray;
  53. $hyl = $this->hyl($kfuidarray, $todayall);
  54. $jdl = $this->jdl($kfuidarray, $todayall);
  55. $pjhysc = $this->pjhusc($kfuidarray, $todayall);
  56. $cpl = $this->cpl($kfuidarray, $todayall);
  57. $mydl = $this->mydl($kfuidarray, $todayall);
  58. $pjxysc = $this->pjxysc($kfuidarray, $todayall);
  59. $jrxxsc = $this->jrxxsc($kfuidarray, $todayall);
  60. foreach ($kfuidarray_index as $uid => $val) {
  61. $kfuidarray_index[$uid]['ip'] = $kfip['KF' . $uid]['ip'];
  62. $kfuidarray_index[$uid]['status'] = $this->getStatusName($kfip['KF' . $uid]['status']);
  63. $kfuidarray_index[$uid]['uid'] = $uids[$uid];
  64. $kfuidarray_index[$uid]['uidname'] = $uidsname[$uid];
  65. $kfuidarray_index[$uid]['hhl'] = $hyl[$uid];
  66. $kfuidarray_index[$uid]['jdl'] = $jdl[$uid];
  67. $kfuidarray_index[$uid]['pjhysc'] = $pjhysc[$uid];
  68. $kfuidarray_index[$uid]['cpl'] = perDisplay($cpl[$uid]);
  69. $kfuidarray_index[$uid]['mydl'] = perDisplay($mydl[$uid]);
  70. $kfuidarray_index[$uid]['pjxysc'] = $pjxysc[$uid];
  71. $kfuidarray_index[$uid]['jrxxsc'] = $jrxxsc[$uid];
  72. $kfuidarray_index[$uid]['fxx'] = $this->makeBtn($uid);
  73. }
  74. DOLAST:
  75. $last = [];
  76. foreach ($kfuidarray_index as $val) {
  77. $last[] = $val;
  78. }
  79. return $last;
  80. }
  81. public function getStatusName($status)
  82. {
  83. $r = ['0' => '离线', '1' => '在线', '2' => '隐身', '3' => '休息'];
  84. return isset($r[$status]) ? $r[$status] : 'Error';
  85. }
  86. // 生成按钮
  87. private function makeBtn($id)
  88. {
  89. $operate = '<a href="javascript:msg(' . $id . ')"><button type="button" class="btn btn-info btn-sm">';
  90. $operate .= '发消息</button></a> ';
  91. return $operate;
  92. }
  93. //按条件获取用户数组 组ID, 在线状态 0为全部
  94. public function getValiKF($groupid, $onlinestatus)
  95. {
  96. $groupusers = (new Users)->getByGroup($groupid);
  97. $groupuserArray = [];
  98. if ($groupusers) {
  99. foreach ($groupusers as $val) {
  100. $groupuserArray[$val['id']] = $val['id'];
  101. }
  102. }
  103. $statusArr = (new KfonlineModel())->getOnlineAll($onlinestatus);
  104. $return = array_intersect($groupuserArray, $statusArr);
  105. return $return;
  106. }
  107. public function uidName($uidArray)
  108. {
  109. $users = (new Users)->where(['id' => ['IN', $uidArray]])->select();
  110. $return = kftoKey($uidArray);
  111. foreach ($return as $uid => $ttttt) {
  112. foreach ($users as $nowuser) {
  113. if ($uid == $nowuser['id']) {
  114. $return[$uid] = $nowuser['user_name'];
  115. }
  116. }
  117. }
  118. return $return;
  119. }
  120. //会话量 统计
  121. public function hyl($uidArray, $alllogs)
  122. {
  123. $rets = kftoKey($uidArray);
  124. foreach ($rets as $uid => $aaaa) {
  125. foreach ($alllogs as $log) {
  126. if ($uid == $log['kf_id'] && ($log['status'] == 1 || $log['status'] == 3)) {
  127. $rets[$uid]++;
  128. }
  129. }
  130. }
  131. return $rets;
  132. }
  133. //接待量 统计
  134. public function jdl($uidArray, $alllogs)
  135. {
  136. $rets = kftoKey($uidArray);
  137. foreach ($rets as $uid => $aaa) {
  138. foreach ($alllogs as $log) {
  139. if ($uid == $log['kf_id']) {
  140. $rets[$uid]++;
  141. }
  142. }
  143. }
  144. return $rets;
  145. }
  146. //平均会话时长 统计
  147. public function pjhusc($uidArray, $alllogs)
  148. {
  149. $rets = kftoKey($uidArray, 1);
  150. foreach ($rets as $uid => $aaa) {
  151. foreach ($alllogs as $log) {
  152. if ($uid == $log['kf_id']) {
  153. (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
  154. (!isset($rets[$uid]['times'])) ? ($rets[$uid]['times'] = 0) : ($rets[$uid]['times'] += (($log['end_time'] ? $log['end_time'] : $log['start_time']) - $log['start_time']));
  155. }
  156. }
  157. }
  158. $return = [];
  159. foreach ($rets as $uid => $val) {
  160. if (isset($rets[$uid]['count'])) {
  161. $return[$uid] = intval($rets[$uid]['times'] / $rets[$uid]['count']);
  162. } else {
  163. $return[$uid] = 0;
  164. }
  165. }
  166. return $return;
  167. }
  168. //参评率
  169. public function cpl($uidArray, $alllogs)
  170. {
  171. $rets = kftoKey($uidArray, 1);
  172. foreach ($rets as $uid => $aaa) {
  173. foreach ($alllogs as $log) {
  174. if ($uid == $log['kf_id']) {
  175. (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
  176. if (!isset($rets[$uid]['pl'])) {
  177. $rets[$uid]['pl'] = 0;
  178. }
  179. if (($log['evaluate_id'] > 0)) {
  180. $rets[$uid]['pl']++;
  181. }
  182. }
  183. }
  184. }
  185. $return = [];
  186. foreach ($rets as $uid => $val) {
  187. if (isset($rets[$uid]['count'])) {
  188. $return[$uid] = $rets[$uid]['pl'] / $rets[$uid]['count'];
  189. } else {
  190. $return[$uid] = 0;
  191. }
  192. }
  193. return $return;
  194. }
  195. //满意度率
  196. public function mydl($uidArray, $alllogs)
  197. {
  198. $rets = kftoKey($uidArray, 1);
  199. foreach ($rets as $uid => $aaa) {
  200. foreach ($alllogs as $log) {
  201. if ($uid == $log['kf_id'] && $log['evaluate_id'] > 0) {
  202. (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
  203. if (!isset($rets[$uid]['times'])) {
  204. $rets[$uid]['times'] = 0;
  205. }
  206. if ($log['evaluate_id'] == 1) {
  207. $rets[$uid]['times']++;
  208. }
  209. }
  210. }
  211. }
  212. $return = [];
  213. foreach ($rets as $uid => $val) {
  214. if (isset($rets[$uid]['count']) && isset($rets[$uid]['times'])) {
  215. $return[$uid] = $rets[$uid]['times'] / $rets[$uid]['count'];
  216. } else {
  217. $return[$uid] = 0;
  218. }
  219. }
  220. return $return;
  221. }
  222. //平均响应时长
  223. public function pjxysc($uidArray, $alllogs)
  224. {
  225. $rets = kftoKey($uidArray);
  226. if (empty($alllogs)) {
  227. return $rets;
  228. }
  229. $serids = [];
  230. foreach ($alllogs as $val) {
  231. $serids[] = $val['servicelog_id'];
  232. }
  233. $times = Db::name('alarm')->field('alarm_corresponding,servicelog_id')->where(['alarm_respond' => 2, 'servicelog_id' => ['IN', $serids]])->select();
  234. if ($times) {
  235. foreach ($alllogs as $key => $val) {
  236. foreach ($times as $sval) {
  237. if ($val['servicelog_id'] == $sval['servicelog_id']) {
  238. $alllogs[$key]['corresponding'] = $sval['alarm_corresponding'];
  239. }
  240. }
  241. }
  242. }
  243. $rets = kftoKey($uidArray, 1);
  244. foreach ($rets as $uid => $aaa) {
  245. foreach ($alllogs as $log) {
  246. if ($uid == $log['kf_id'] && isset($log['corresponding'])) {
  247. (!isset($rets[$uid]['count'])) ? ($rets[$uid]['count'] = 1) : $rets[$uid]['count']++;
  248. (!isset($rets[$uid]['times'])) ? ($rets[$uid]['times'] = intval($log['corresponding'])) : ($rets[$uid]['times'] += intval($log['corresponding']));
  249. }
  250. }
  251. }
  252. $return = [];
  253. foreach ($rets as $uid => $val) {
  254. if (isset($rets[$uid]['count']) && isset($rets[$uid]['times'])) {
  255. $return[$uid] = intval($rets[$uid]['times'] / $rets[$uid]['count']);
  256. } else {
  257. $return[$uid] = 0;
  258. }
  259. }
  260. return $return;
  261. }
  262. //今日休息时长统计
  263. public function jrxxsc($uidArray, $alllogs)
  264. {
  265. $kfuidarray = array_map(function ($i) {
  266. return 'KF' . $i;
  267. }, $uidArray);
  268. $return = kftoKey($uidArray);
  269. $rets = kftoKey($uidArray, 1);
  270. $today = date("Y-m-d");
  271. $ret = Db::name('kfstatetimes')->field('kfuid,stime')->where(['sday' => $today, 'kfuid' => ['IN', $kfuidarray], 'kstatus' => 3])->select();
  272. if (!$ret) {
  273. return $return;
  274. }
  275. foreach ($return as $uid => $ttttt) {
  276. foreach ($ret as $val) {
  277. $ruid = trim($val['kfuid'], 'KF');
  278. if ($uid == $ruid) {
  279. $return[$uid] = $val['stime'];
  280. }
  281. }
  282. }
  283. return $return;
  284. }
  285. public function getTodayServiceData($kfuidArray = [])
  286. {
  287. $today_begin = strtotime(date("Y-m-d"));
  288. $today_end = $today_begin + 86400;
  289. $filds = "servicelog_id,group_id,kf_id,user_id,status,start_time,intime,end_time,evaluate_id";
  290. if ($kfuidArray) {
  291. $ret = Db::name('service_log')->field($filds)->where(['start_time' => ['>=', $today_begin], 'kf_id' => ['IN', $kfuidArray]])->where(['start_time' => ['<', $today_end]])->select();
  292. } else {
  293. $ret = Db::name('service_log')->field($filds)->where(['start_time' => ['>=', $today_begin]])->where(['start_time' => ['<', $today_end]])->select();
  294. }
  295. return $ret;
  296. }
  297. //获取在线客服ip地址
  298. public function getKfinline()
  299. {
  300. $ret = Db::name('kfonline')->select();
  301. $return = [];
  302. if ($ret) {
  303. foreach ($ret as $item) {
  304. //'KF22'=>'192.168.1.1';
  305. $return[$item['uid']] = $item;
  306. }
  307. }
  308. return $return;
  309. }
  310. }