Chat.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 山西牛酷信息科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\servicer\api\controller;
  11. use addon\servicer\model\Dialogue;
  12. use addon\servicer\model\Member;
  13. use addon\servicer\model\Servicer;
  14. use app\api\controller\BaseApi;
  15. use app\model\goods\Goods;
  16. use app\model\order\Order;
  17. use app\model\shop\Shop;
  18. use app\model\system\Site;
  19. use app\model\upload\Upload;
  20. use Exception;
  21. use GatewayClient\Gateway;
  22. use think\db\exception\DataNotFoundException;
  23. use think\db\exception\DbException;
  24. use think\db\exception\ModelNotFoundException;
  25. use think\facade\Db;
  26. use think\facade\Request;
  27. use think\facade\Config;
  28. use app\model\web\WebSite as WebsiteModel;
  29. use addon\servicer\model\Keyword as KeywordModel;
  30. use addon\servicer\model\Config as ServicerConfig;
  31. /**
  32. * 客户端客服相关API
  33. */
  34. class Chat extends BaseApi
  35. {
  36. /**
  37. * 构造函数
  38. */
  39. public function __construct()
  40. {
  41. Config::load(__DIR__ . "/../../config/gateway_client.php");
  42. // 注册GateWayClient 到 GatewayWorker
  43. Gateway::$registerAddress = @config()['registeraddress'] ?? '127.0.0.1:1241';
  44. parent::__construct();
  45. }
  46. /**
  47. * 查找当前是否有客服在线
  48. * @return false|string
  49. * @throws DataNotFoundException
  50. * @throws DbException
  51. * @throws ModelNotFoundException
  52. */
  53. public function hasServicers()
  54. {
  55. $token = $this->checkToken();
  56. if ($token['code'] < 0) {
  57. return $this->response($token);
  58. }
  59. $site_id = $this->site_id;
  60. if (empty($site_id)) {
  61. return $this->response($this->error('没有指定店铺'));
  62. }
  63. $result = (new Servicer)->getOnlineServicers($site_id);
  64. if ($result['code'] != 0) {
  65. return $this->response($result);
  66. }
  67. $list = $result['data'];
  68. $onlineCount = 0;
  69. foreach ($list as $item) {
  70. $online = @Gateway::isUidOnline('ns_servicer_' . $item['user_id']) ?? 0;
  71. if ($online) {
  72. $onlineCount += 1;
  73. }
  74. }
  75. return $this->response($this->success(['online_count' => $onlineCount]));
  76. }
  77. /**
  78. * 绑定WebSocket client_id 和 member_id / user_id
  79. * @return false|string
  80. * @throws DataNotFoundException
  81. * @throws DbException
  82. * @throws ModelNotFoundException
  83. */
  84. public function bind()
  85. {
  86. $token = $this->checkToken();
  87. if ($token['code'] < 0) {
  88. return $this->response($token);
  89. }
  90. $site_id = $this->site_id;
  91. if (empty($site_id) && $site_id != 0) {
  92. return $this->response($this->error('', '没有指定商家'));
  93. }
  94. $client_id = $this->params['client_id'] ?? '';
  95. $member_id = $this->member_id;
  96. if (empty($client_id)) {
  97. return $this->response($this->error('', '缺少必要的参数'));
  98. }
  99. // 检测当前用户是否仍然在线
  100. $isOnline = Gateway::isOnline($client_id);
  101. Gateway::bindUid($client_id, $member_id);
  102. // 获取匹配的客服
  103. $servicerModel = new Servicer();
  104. $servicerList = @$servicerModel->getUsefulServicer($site_id, $member_id);
  105. if (empty($servicerList)) {
  106. return $this->response($this->error('', '客服不在线'));
  107. }
  108. foreach ($servicerList as $item) {
  109. // ws是否在线
  110. $online = @Gateway::isUidOnline('ns_servicer_' . $item['user_id']) ?? 0;
  111. if (!$online) {
  112. continue;
  113. }
  114. $servicer = $item;
  115. if (!empty($servicer)) {
  116. break;
  117. }
  118. }
  119. if (empty($servicer)) {
  120. return $this->response($this->error('', '客服不在线'));
  121. }
  122. // 绑定客服
  123. $memberModel = new Member();
  124. $id = $memberModel->createMember($member_id, $servicer['user_id'], $isOnline, $client_id);
  125. if (!$id) {
  126. return $this->response($this->error('', '客服连接异常'));
  127. }
  128. // 向客服通知,有会员咨询
  129. $member = (new Member)->getMember($member_id, $servicer['user_id'], $this->site_id);
  130. Gateway::sendToUid(
  131. 'ns_servicer_' . $servicer['user_id'],
  132. json_encode(['type' => 'connect', 'data' => $member])
  133. );
  134. return $this->response($this->success(['servicer_id' => $servicer['user_id']]));
  135. }
  136. /**
  137. * 获取店铺信息
  138. * @return false|string
  139. */
  140. public function siteInfo()
  141. {
  142. $token = $this->checkToken();
  143. if ($token['code'] < 0) {
  144. return $this->response($token);
  145. }
  146. $site_id = $this->site_id;
  147. if (empty($site_id) && $site_id != 0) {
  148. return $this->response($this->error('没有指定站点'));
  149. }
  150. if ($site_id == 0) {
  151. $website_model = new WebsiteModel();
  152. $website_info = $website_model->getWebSite([['site_id', '=', 0]], '*');
  153. $result['data']['logo'] = $website_info['data']['logo'];
  154. $result['data']['site_name'] = '平台客服';
  155. } else {
  156. $result = (new Site())->getSiteInfo(['site_id' => $site_id, ['site_name', 'logo']]);
  157. }
  158. return $this->response($this->success($result));
  159. }
  160. /**
  161. * 订单详情
  162. * @return array|false|string
  163. */
  164. public function orderDetail()
  165. {
  166. $token = $this->checkToken();
  167. if ($token['code'] < 0) {
  168. return $this->response($token);
  169. }
  170. $orderId = $this->params['order_id'] ?? 0;
  171. $condition = array(
  172. ['order_id', '=', $orderId]
  173. );
  174. $orderDetail = (new Order)->getOrderDetail($condition);
  175. return $orderDetail;
  176. }
  177. /**
  178. * 商品详情
  179. * @return array|false|string
  180. */
  181. public function goodSkuDetial()
  182. {
  183. $token = $this->checkToken();
  184. if ($token['code'] < 0) {
  185. return $this->response($token);
  186. }
  187. $skuId = $this->params['sku_id'] ?? 0;
  188. $goodsSkuDetail = (new Goods)->getGoodsSkuInfo(['sku_id' => $skuId]);
  189. return $goodsSkuDetail;
  190. }
  191. /**
  192. * 发送聊天内容
  193. * @return false|string
  194. * @throws DataNotFoundException
  195. * @throws DbException
  196. * @throws ModelNotFoundException
  197. */
  198. public function say()
  199. {
  200. $token = $this->checkToken();
  201. if ($token['code'] < 0) return $this->response($token);
  202. $servicer_id = $this->params['servicer_id'] ?? 0;
  203. $contentType = $this->params['content_type'] ?? '';
  204. $message = $this->params['message'] ?? '';
  205. $goodsId = $this->params['goods_id'] ?? 0;
  206. $orderId = $this->params['order_id'] ?? 0;
  207. $relate_data = $this->params['relate_data'] ?? '';
  208. if (empty($message) && empty($goodsId) && empty($orderId)) {
  209. return $this->response($this->error('不能发送空消息哦!'));
  210. }
  211. try {
  212. $isServicerOnline = @Gateway::isUidOnline('ns_servicer_' . $servicer_id);
  213. } catch (Exception $e) {
  214. $isServicerOnline = false;
  215. }
  216. $siteId = 1;
  217. // $read = $isServicerOnline ? 1 : 0;
  218. $read = 0;
  219. // 消息持久化逻辑
  220. $dialogueModel = new Dialogue();
  221. $servicerModel = new Servicer();
  222. // 客服不在线时,不推送
  223. if (!$isServicerOnline) {
  224. // 重新匹配的客服
  225. $servicerList = $servicerModel->assigning([]);
  226. $servicer = [];
  227. foreach ($servicerList as $item) {
  228. // ws是否在线
  229. $online = @Gateway::isUidOnline('ns_servicer_' . $item['user_id']) ?? 0;
  230. if (!$online) {
  231. continue;
  232. }
  233. $servicer = $item;
  234. if (!empty($servicer)) {
  235. break;
  236. }
  237. }
  238. if (empty($servicer)) {
  239. $dialogueModel->createDialogue(0, $this->member_id, 0, $contentType, 0, $siteId, 0, $message, '', $goodsId, $orderId, $relate_data);
  240. // 关键词回复
  241. if ($contentType == Dialogue::CONTENTTYPE_STRING) {
  242. $keyword_model = new KeywordModel();
  243. $keyword_reply = $keyword_model->getContentByKeyword($siteId, strip_tags($message));
  244. if (!empty($keyword_reply)) {
  245. $keyword_reply = '<p>' . $keyword_reply . '</p>';
  246. $dialogueModel = new Dialogue();
  247. $dialogueId = $dialogueModel->createDialogue(1, $this->member_id, 0, $contentType, 0, $siteId, 0, '', $keyword_reply, 0, 0);
  248. // 客服信息
  249. $servicer_info = $servicerModel->handleServicerInfo([], $siteId);
  250. $servicer_info['servicer_id'] = 0;
  251. Gateway::sendToUid(
  252. $this->member_id,
  253. json_encode(['type' => 'connect', 'data' => $servicer_info])
  254. );
  255. $keyword_reply_dialogue = array_merge($dialogueModel->getDialogue($dialogueId), $servicer_info);
  256. // 转发消息至会员
  257. Gateway::sendToUid($this->member_id, json_encode(['type' => Dialogue::contentType($contentType)['type'], 'data' => $keyword_reply_dialogue]));
  258. }
  259. }
  260. return $this->response($this->success(['read' => $read]));
  261. }
  262. // 绑定客服
  263. $servicer_id = $servicer['user_id'];
  264. $client_id = Gateway::getClientIdByUid($this->member_id);
  265. $memberModel = new Member();
  266. $id = $memberModel->createMember($this->member_id, $servicer['user_id'], 1, $client_id);
  267. if (!$id) {
  268. return $this->response($this->success(['read' => $read]));
  269. }
  270. // 向客服通知,有会员咨询
  271. $member = (new Member)->getMember($this->member_id, $servicer['user_id'], $this->site_id);
  272. Gateway::sendToUid(
  273. 'ns_servicer_' . $servicer['user_id'],
  274. json_encode(['type' => 'connect', 'data' => $member])
  275. );
  276. // 客服信息
  277. $servicer_info = $servicerModel->handleServicerInfo([['user_id', '=', $servicer['user_id']]], $siteId);
  278. $servicer_info['servicer_id'] = $servicer['user_id'];
  279. Gateway::sendToUid(
  280. $this->member_id,
  281. json_encode(['type' => 'connect', 'data' => $servicer_info])
  282. );
  283. } else {
  284. // 客服信息
  285. $servicer_info = $servicerModel->handleServicerInfo([['user_id', '=', $servicer_id]], $siteId);
  286. $servicer_info['servicer_id'] = $servicer_id;
  287. }
  288. // 消息持久化逻辑
  289. $dialogueId = $dialogueModel->createDialogue(0, $this->member_id, $servicer_id, $contentType, $read, $siteId, 0, $message, '', $goodsId, $orderId, $relate_data);
  290. // 获取消息数据
  291. $dialogue = $dialogueModel->getDialogue($dialogueId);
  292. $type = Dialogue::contentType($contentType)['type'];
  293. // 关键词回复
  294. if ($contentType == Dialogue::CONTENTTYPE_STRING) {
  295. $keyword_model = new KeywordModel();
  296. $keyword_reply = $keyword_model->getContentByKeyword($siteId, strip_tags($message));
  297. if (!empty($keyword_reply)) {
  298. $keyword_reply = '<p>' . $keyword_reply . '</p>';
  299. $dialogueModel = new Dialogue();
  300. $dialogue_id = $dialogueModel->createDialogue(1, $this->member_id, $servicer_id, $contentType, 0, $siteId, $servicer['user_id'] ?? 0, '', $keyword_reply, 0, 0);
  301. $keyword_reply_dialogue = array_merge($dialogueModel->getDialogue($dialogue_id), $servicer_info);
  302. // 转发消息至会员
  303. Gateway::sendToUid($this->member_id, json_encode(['type' => $type, 'data' => $keyword_reply_dialogue]));
  304. }
  305. }
  306. // 发送给所有连接的客服
  307. $memberModel = new Member();
  308. $memberList = $memberModel->getList([['member_id', '=', $this->member_id], ['online', '=', 1]]);
  309. if (!empty($memberList)) {
  310. foreach ($memberList as $item) {
  311. $isServicerOnline = @Gateway::isUidOnline('ns_servicer_' . $item['servicer_id']);
  312. $isServicerOnline = $isServicerOnline ? 1 : 0;
  313. if ($isServicerOnline) {
  314. // 转发消息至客服·
  315. Gateway::sendToUid('ns_servicer_' . $item['servicer_id'], json_encode(['type' => $type, 'data' => $dialogue]));
  316. // 关键词自动回复的消息转发到客服端
  317. if (isset($keyword_reply_dialogue) && !empty($keyword_reply_dialogue)) {
  318. Gateway::sendToUid('ns_servicer_' . $item['servicer_id'], json_encode(['type' => 'keyword_reply', 'data' => $keyword_reply_dialogue]));
  319. }
  320. }
  321. }
  322. } else {
  323. if (!empty($servicer_id)) {
  324. // 向客服通知,有会员咨询
  325. $member = (new Member)->getMember($this->member_id, $servicer_id, $this->site_id);
  326. Gateway::sendToUid(
  327. 'ns_servicer_' . $servicer_id,
  328. json_encode(['type' => 'connect', 'data' => $member])
  329. );
  330. // 客服信息
  331. $servicer_info = $servicerModel->handleServicerInfo([['user_id', '=', $servicer_id]], $siteId);
  332. $servicer_info['servicer_id'] = $servicer_id;
  333. Gateway::sendToUid(
  334. $this->member_id,
  335. json_encode(['type' => 'connect', 'data' => $servicer_info])
  336. );
  337. Gateway::sendToUid('ns_servicer_' . $servicer_id, json_encode(['type' => $type, 'data' => $dialogue]));
  338. // 关键词自动回复的消息转发到客服端
  339. if (isset($keyword_reply_dialogue) && !empty($keyword_reply_dialogue)) {
  340. Gateway::sendToUid('ns_servicer_' . $servicer_id, json_encode(['type' => 'keyword_reply', 'data' => $keyword_reply_dialogue]));
  341. }
  342. }
  343. }
  344. return $this->response($this->success(['read' => $read]));
  345. }
  346. /**
  347. * 获取聊天记录表
  348. * @return false|string
  349. * @throws DataNotFoundException
  350. * @throws DbException
  351. * @throws ModelNotFoundException
  352. */
  353. public function dialogs()
  354. {
  355. $token = $this->checkToken();
  356. if ($token['code'] < 0) {
  357. return $this->response($token);
  358. }
  359. $page = $this->params['page'] ?? 1;
  360. $limit = $this->params['limit'] ?? 5;
  361. // $siteId = input('site_id', '');
  362. $siteId = $this->site_id;
  363. // $servicer_id = input('servicer_id', 0);
  364. if (empty($siteId) && $siteId != 0) {
  365. return $this->response($this->error('没有指定商家'));
  366. }
  367. $pagelist = (new Dialogue())->getDialogueList($this->member_id, $page, $limit, $siteId);
  368. if (!empty($pagelist) && !empty($pagelist['list']) && count($pagelist['list']) > 0) {
  369. $pagelist['list'] = array_reverse($pagelist['list']);
  370. }
  371. return $this->response($this->success($pagelist));
  372. }
  373. /**
  374. * 客户端主动结束会话
  375. * @return false|string
  376. * @throws DbException
  377. */
  378. public function bye()
  379. {
  380. $token = $this->checkToken();
  381. if ($token['code'] < 0) {
  382. return $this->response($token);
  383. }
  384. $servicer_id = $this->params['servicer_id'] ?? 0;
  385. if (empty($servicer_id)) {
  386. return $this->response($this->error('没有指定客服'));
  387. }
  388. $member_id = $this->member_id;
  389. $client_id = Gateway::getClientIdByUid($member_id);
  390. // if (empty($client_id) || count($client_id) == 0) {
  391. // return $this->response($this->success($client_id, '会话已结束!'));
  392. // }
  393. // 发送给所有连接的客服
  394. $memberModel = new Member();
  395. $memberList = $memberModel->getList([['member_id', '=', $this->member_id], ['online', '=', 1]]);
  396. if (!empty($memberList)) {
  397. foreach ($memberList as $item) {
  398. $isServicerOnline = @Gateway::isUidOnline('ns_servicer_' . $item['servicer_id']);
  399. $isServicerOnline = $isServicerOnline ? 1 : 0;
  400. if ($isServicerOnline) {
  401. // 转发消息至客服·
  402. Gateway::sendToUid('ns_servicer_' . $item['servicer_id'], json_encode(['type' => 'disconnect', 'data' => ['member_id' => $member_id]]));
  403. }
  404. }
  405. }
  406. $memberModel = new Member();
  407. $memberModel->setMemberOnline($member_id, false);
  408. // // 关闭WS客户端(会员)
  409. if(!empty($client_id)){
  410. Gateway::closeClient($client_id[0], json_encode(['type' => 'close', 'data' => ['status' => true]]));
  411. }
  412. return $this->response($this->success('', '会话已结束!'));
  413. }
  414. /**
  415. * 在线信息
  416. * @return false|string
  417. */
  418. public function checkOnline()
  419. {
  420. $uidList = Gateway::getAllUidList();
  421. $clientList = Gateway::getAllClientIdList();
  422. return json_encode(['code'=>1, 'msg'=>'success', 'data'=>compact('uidList', 'clientList')]);
  423. }
  424. /**
  425. * 在线信息
  426. * @return false|string
  427. */
  428. public function checkClient()
  429. {
  430. $client_id = $this->params['client_id'] ?? '';
  431. $uid = $this->params['uid'] ?? 0;
  432. $online = 0;
  433. if (!empty($client_id)) {
  434. $session = Gateway::getSession($client_id);
  435. $uid = Gateway::getUidByClientId($client_id);
  436. $online = @Gateway::isOnline($client_id) ?? 0;
  437. }
  438. if (!empty($uid)) {
  439. $clients = Gateway::getClientIdByUid($uid);
  440. $client_id = $clients[0];
  441. $session = Gateway::getSession($client_id);
  442. $uid = Gateway::getUidByClientId($client_id);
  443. $online = @Gateway::isUidOnline($uid) ?? 0;
  444. }
  445. if (!$online) {
  446. return json_encode(['code'=>0, 'msg'=>'客服不在线', 'data'=>compact('session', 'uid', 'client_id')]);
  447. }
  448. return json_encode(['code'=>1, 'msg'=>'客服在线', 'data'=>compact('session', 'uid', 'client_id')]);
  449. }
  450. /**
  451. * 在线信息
  452. * @return false|string
  453. */
  454. public function sendMsg()
  455. {
  456. $client_id = $this->params['client_id'] ?? '';
  457. $uid = Gateway::getUidByClientId($client_id);
  458. Gateway::sendToUid(
  459. $uid,
  460. json_encode(['type' => 'connect', 'data' => ['servicer_id' => 111]])
  461. );
  462. return json_encode(['code'=>1, 'msg'=>'发送成功']);
  463. }
  464. /**
  465. * 客服列表
  466. * @return false|string
  467. * @throws DataNotFoundException
  468. * @throws DbException
  469. * @throws ModelNotFoundException
  470. */
  471. public function servicerList()
  472. {
  473. $token = $this->checkToken();
  474. if ($token['code'] < 0) {
  475. return $this->response($token);
  476. }
  477. $page = $this->params['page'] ?? '';
  478. $size = $this->params['size'] ?? PAGE_LIST_ROWS;
  479. $map = [['sd.member_id', '=', $this->member_id]];
  480. $field = 'sd.shop_id,sh.logo,sh.site_name';
  481. $join = [
  482. ['user u', 'u.uid=sd.member_id', 'left'],
  483. ['site sh', 'sh.site_id=sd.shop_id', 'left'],
  484. ];
  485. $model = new Dialogue();
  486. $list = $model->getPageList($map, $field, 'sd.create_time desc', $page, $size, 'sd', $join, 'sd.shop_id');
  487. $shop = array_column($list['list'], 'shop_id');
  488. if (in_array(0, $shop)) {
  489. // 查询店铺信息
  490. $site_model = new Site();
  491. $site_info = $site_model->getSiteInfo([['site_id', '=', $this->site_id]], '*')['data'] ?? [];
  492. $key = array_search(0, $shop);
  493. $list['list'][$key]['logo'] = $site_info['logo'];
  494. $list['list'][$key]['site_name'] = '平台客服';
  495. }
  496. return $this->response($this->success($list));
  497. }
  498. /**
  499. * 客服聊天列表
  500. * @return false|string
  501. */
  502. public function chatList()
  503. {
  504. $token = $this->checkToken();
  505. if ($token['code'] < 0) return $this->response($token);
  506. $prefix = config('database.connections.mysql.prefix');
  507. $member_id = $this->member_id;
  508. // 获取有过聊天记录的客服列表,获取未读消息数量,头像、昵称、在线状态,获取最后一次聊天内容、类型
  509. $sql = "SELECT * FROM (SELECT sd.id,sd.shop_id,sd.create_time,sd.servicer_say,sd.consumer_say,sd.type,sd.content,sd.content_type,sd.add_time,"
  510. . "IFNULL(s.site_name, '') as shop_name,IFNULL(s.logo,'') as logo,IFNULL(s.logo,'') as avatar,IFNULL(sr.`online`, 0) as online,"
  511. . "(SELECT count(sd1.member_id) FROM {$prefix}servicer_dialogue sd1 where sd1.type=1 AND sd1.`read`=0 AND sd1.shop_id = sd.shop_id AND sd1.member_id={$member_id}) AS unread "
  512. . "FROM {$prefix}servicer_dialogue sd "
  513. . "LEFT JOIN {$prefix}site s on s.site_id=sd.shop_id "
  514. . "LEFT JOIN {$prefix}servicer sr on sr.shop_id=sd.shop_id AND sr.online=1 "
  515. . "WHERE sd.member_id={$member_id} "
  516. . "ORDER BY `online` desc,sd.id desc) as part "
  517. . "GROUP BY shop_id ORDER BY `online` desc,id desc";
  518. $chat_list = Db::query($sql);
  519. return $this->response($this->success($chat_list));
  520. }
  521. /**
  522. * 聊天图片上传
  523. */
  524. public function chatimg()
  525. {
  526. $upload_model = new Upload($this->site_id);
  527. $param = array(
  528. "thumb_type" => "",
  529. "name" => "file",
  530. "watermark" => 0,
  531. "cloud" => 1
  532. );
  533. $result = $upload_model->setPath("chat_img/" . date("Ymd") . '/')->image($param);
  534. return $this->response($result);
  535. }
  536. /**
  537. * @return false|string
  538. */
  539. public function checkServicer()
  540. {
  541. $servicer_id = $this->params['servicer_id'] ?? 0;
  542. $servicer = (new Servicer)->getDetail([['user_id', '=', $servicer_id]])['data'];
  543. $online = 0;
  544. if (!empty($servicer)) {
  545. $uid = 'ns_servicer_'.$servicer['user_id'];
  546. $clients = Gateway::getClientIdByUid($uid);
  547. if (empty($clients)) return $this->response($this->error('', '客服不在线'));
  548. $client_id = $clients[0];
  549. $session = Gateway::getSession($client_id);
  550. $uid = Gateway::getUidByClientId($client_id);
  551. $online = @Gateway::isUidOnline($uid) ?? 0;
  552. }
  553. if (!$online) {
  554. return $this->response($this->error(compact('servicer', 'session'), '客服不在线'));
  555. }
  556. return $this->response($this->success(compact('servicer', 'session'), '客服在线'));
  557. }
  558. /**
  559. * 消息设为已读
  560. * @return false|string
  561. */
  562. public function setRead()
  563. {
  564. $token = $this->checkToken();
  565. if ($token['code'] < 0) return $this->response($token);
  566. $site_id = $this->params['site_id'] ?? 0;
  567. if (empty($site_id)) return $this->response($this->error('没有指定店铺'));
  568. // 查询后设为已读
  569. $condition = [
  570. ['member_id', '=', $this->member_id],
  571. ['type', '=', 1],
  572. ];
  573. (new Dialogue())->setDialoguesRead($condition, true);
  574. return $this->response($this->success());
  575. }
  576. /**
  577. * 关键词回复设置
  578. * @return false|string
  579. */
  580. public function keyword()
  581. {
  582. $condition = [['site_id', '=', $this->site_id], ['is_use', '=', 1]];
  583. $keyword_model = new KeywordModel();
  584. $keyword_list = $keyword_model->getPageList($condition, 1, 100, 'sort desc', 'keyword')['data']['list'];
  585. $servicer_model = new ServicerConfig();
  586. $config = $servicer_model->getKeywordConfig();
  587. $is_open = $config['data']['value']['is_open'] ?? 0;
  588. return $this->response($this->success(compact('is_open', 'keyword_list')));
  589. }
  590. public function check()
  591. {
  592. $client = Gateway::getAllGroupClientIdList();
  593. $client_count = Gateway::getAllGroupClientIdCount();
  594. $group_uid = Gateway::getAllGroupUidList();
  595. $group_id = Gateway::getAllGroupIdList();
  596. return json(compact('client', 'client_count', 'group_uid', 'group_id'));
  597. }
  598. public function test()
  599. {
  600. $order_id = request()->param('order_id');
  601. $result = ( new Order )->getOrderDetail($order_id);
  602. return json($result);
  603. }
  604. }