CozeKefuReplyJob.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\jobs;
  13. use app\services\kefu\CozeServices;
  14. use app\services\kefu\service\StoreServiceLogServices;
  15. use app\services\kefu\service\StoreServiceRecordServices;
  16. use app\services\kefu\service\StoreServiceServices;
  17. use crmeb\basic\BaseJobs;
  18. use crmeb\services\workerman\ChannelService;
  19. use crmeb\traits\QueueTrait;
  20. use crmeb\utils\Queue;
  21. use think\facade\Env;
  22. use think\facade\Log;
  23. /**
  24. * 在线客服 Coze 智能体回复任务。
  25. */
  26. class CozeKefuReplyJob extends BaseJobs
  27. {
  28. use QueueTrait;
  29. public static function dispatchAsync(array $payload)
  30. {
  31. if (sys_config('queue_open', 0) != 1 || Env::get('cache.driver', 'file') !== 'redis') {
  32. Log::error('在线客服 Coze 回复未入队:请开启 Redis 缓存和队列,避免阻塞 Workerman 聊天进程');
  33. return false;
  34. }
  35. return Queue::instance()->job(__CLASS__)->do('doJob')->data($payload)->errorCount(1)->push();
  36. }
  37. public function doJob(array $payload): bool
  38. {
  39. if (!CozeServices::isEnabled()) {
  40. return true;
  41. }
  42. $uid = (int)($payload['uid'] ?? 0);
  43. $toUid = (int)($payload['to_uid'] ?? 0);
  44. $content = trim((string)($payload['content'] ?? ''));
  45. $formType = (int)($payload['form_type'] ?? 0);
  46. $isTourist = (int)($payload['is_tourist'] ?? 0);
  47. if (!$uid || !$toUid || $content === '') {
  48. return true;
  49. }
  50. try {
  51. /** @var CozeServices $coze */
  52. $coze = app()->make(CozeServices::class);
  53. $reply = $coze->chatText(($isTourist ? 'tourist_' : 'uid_') . $uid, $content);
  54. $reply = trim(strip_tags(htmlspecialchars_decode($reply)));
  55. if ($reply === '') {
  56. return true;
  57. }
  58. /** @var StoreServiceLogServices $logServices */
  59. $logServices = app()->make(StoreServiceLogServices::class);
  60. /** @var StoreServiceRecordServices $recordServices */
  61. $recordServices = app()->make(StoreServiceRecordServices::class);
  62. $autoReply = [
  63. 'to_uid' => $uid,
  64. 'msn_type' => 1,
  65. 'msn' => $reply,
  66. 'uid' => $toUid,
  67. 'add_time' => time(),
  68. 'is_tourist' => $isTourist,
  69. 'type' => 1,
  70. ];
  71. $autoReply = $logServices->save($autoReply)->toArray();
  72. $autoReply['_add_time'] = $autoReply['add_time'];
  73. $autoReply['add_time'] = strtotime($autoReply['add_time']);
  74. /** @var StoreServiceServices $serviceServices */
  75. $serviceServices = app()->make(StoreServiceServices::class);
  76. $kefuInfo = $serviceServices->get(['uid' => $toUid], ['nickname', 'avatar']);
  77. $replyMessagesCount = $logServices->getMessageNum([
  78. 'uid' => $toUid,
  79. 'to_uid' => $uid,
  80. 'type' => 0,
  81. 'is_tourist' => $isTourist,
  82. ]);
  83. $autoReply['recored'] = $recordServices->saveRecord(
  84. $toUid,
  85. $uid,
  86. $reply,
  87. $formType,
  88. 1,
  89. $replyMessagesCount,
  90. $isTourist,
  91. $kefuInfo['nickname'] ?? '',
  92. $kefuInfo['avatar'] ?? ''
  93. );
  94. ChannelService::instance()->setTrigger('crmeb_chat')->send('reply', $autoReply, [$uid]);
  95. } catch (\Throwable $e) {
  96. Log::error('在线客服 Coze 回复失败:' . $e->getMessage());
  97. }
  98. return true;
  99. }
  100. }