ChatService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace biz\message\services;
  3. use biz\base\services\BaseService;
  4. use biz\message\classes\ChatClass;
  5. use biz\user\services\UserService;
  6. use common\components\arrayUtil;
  7. use jzweb\open\weixin\lib\user;
  8. use Yii;
  9. class ChatService extends BaseService
  10. {
  11. //新增未读消息数
  12. public static function addUnreadNum($userId)
  13. {
  14. $key = ChatClass::getUnreadNumKey($userId);
  15. Yii::$app->redis->executeCommand('INCRBY', [$key, 1]);
  16. }
  17. //新增未回复客户 shish 2019.12.29
  18. public static function addUnReplyUser($merchantId, $userId)
  19. {
  20. $now = time();
  21. $cacheKey = ChatClass::getUnReplyUserKey($merchantId);
  22. Yii::$app->redis->executeCommand('ZADD', [$cacheKey, $now, "{$userId}"]);
  23. }
  24. //取未回复客户列表 shish 2019.12.29
  25. public static function getUnReplyUserList($merchantId)
  26. {
  27. $cacheKey = ChatClass::getUnReplyUserKey($merchantId);
  28. $return = Yii::$app->redis->executeCommand('ZREVRANGE', [$cacheKey, 0, -1, 'WITHSCORES']);//返回有序集合,从高分到低分排序
  29. if (empty($return)) {
  30. return [];
  31. }
  32. $list = [];
  33. $i = 0;
  34. $arr = [];
  35. foreach ($return as $key => $val) {
  36. if ($key % 2 == 0) {
  37. $arr[$i]['value'] = $val;
  38. } else {
  39. $arr[$i]['key'] = $val;
  40. $i++;
  41. }
  42. }
  43. foreach ($arr as $key => $val) {
  44. $list[$val['key']] = $val['value'];
  45. }
  46. return $list;
  47. }
  48. //新增最近联系人
  49. public static function addRecentlyUser($merchantId, $userId)
  50. {
  51. $now = time();
  52. $cacheKey = ChatClass::getRecentlyUserKey($merchantId);
  53. //删除10天前的联系人
  54. $max = $now - 86400 * 10;
  55. Yii::$app->redis->executeCommand('ZREMRANGEBYSCORE', [$cacheKey, 0, $max]);
  56. Yii::$app->redis->executeCommand('ZADD', [$cacheKey, $now, "{$userId}"]);
  57. }
  58. //取最近联系人 shish 2019.12.29
  59. public static function getRecentlyUserList($merchantId)
  60. {
  61. $userIdList = [12536630, 12536631, 12536632, 12536633, 12536634, 12536635];
  62. $userId = $userIdList[array_rand($userIdList)];
  63. self::addRecentlyUser($merchantId, $userId);
  64. $cacheKey = ChatClass::getRecentlyUserKey($merchantId);
  65. //返回有序集合,从高分到低分排序
  66. $return = Yii::$app->redis->executeCommand('ZREVRANGE', [$cacheKey, 0, -1, 'WITHSCORES']);
  67. if (empty($return)) {
  68. return [];
  69. }
  70. $i = 0;
  71. $arr = [];
  72. foreach ($return as $key => $val) {
  73. if ($key % 2 == 0) {
  74. $arr[$i]['userId'] = $val;
  75. } else {
  76. $arr[$i]['time'] = $val;
  77. $i++;
  78. }
  79. }
  80. $userData = [];
  81. //组合出最后聊天时间和未读消息数
  82. foreach ($arr as $val) {
  83. $userId = $val['userId'];
  84. $time = $val['time'];
  85. $num = ChatClass::getUnreadNum($userId);
  86. $date = date("m-d H:i", $time);
  87. if (date("Ymd") == date("Ymd", $time)) {
  88. $date = date("H:i", $time);
  89. }
  90. $userData[$userId] = ['time' => $date, 'unReadNum' => $num];
  91. }
  92. $ids = array_column($arr, 'userId');
  93. $infoList = UserService::getUserByIds($ids);
  94. foreach ($infoList as $userId => $info) {
  95. $infoList[$userId]['unReadNum'] = isset($userData[$userId]['unReadNum']) ? $userData[$userId]['unReadNum'] : 0;
  96. $infoList[$userId]['chatTime'] = isset($userData[$userId]['time']) ? $userData[$userId]['time'] : date("m-d H:i", $info['visitTime']);
  97. }
  98. return array_values($infoList);
  99. }
  100. //保存消息记录 shish 2019.12.29
  101. public static function saveMessage($messageList, $userId)
  102. {
  103. //商家的消息,ourSelf表示自己的消息 themSelf表示对方的消息
  104. $now = time();
  105. $cacheKey = ChatClass::getMessageKey($userId);
  106. //删除15天前的已读消息
  107. $max = $now - 86400 * 16;
  108. Yii::$app->redis->executeCommand('ZREMRANGEBYSCORE', [$cacheKey, 0, $max]);
  109. foreach ($messageList as $message) {
  110. Yii::$app->redis->executeCommand('ZADD', [$cacheKey, $now, json_encode($message)]);
  111. }
  112. //self::getMessageList($userId);
  113. }
  114. //取消息记录 shish 2019.12.29
  115. public static function getMessageList($userId)
  116. {
  117. $cacheKey = ChatClass::getMessageKey($userId);
  118. //返回有序集合,从高分到低分排序
  119. $return = Yii::$app->redis->executeCommand('ZREVRANGE', [$cacheKey, 0, -1, 'WITHSCORES']);
  120. if (empty($return)) {
  121. return [];
  122. }
  123. $i = 0;
  124. $arr = [];
  125. foreach ($return as $key => $val) {
  126. if ($key % 2 == 0) {
  127. $arr[$i]['message'] = $val;
  128. } else {
  129. $arr[$i]['time'] = $val;
  130. $i++;
  131. }
  132. }
  133. $arr = arrayUtil::arraySort($arr, 'time');
  134. $data = [];
  135. foreach ($arr as $val) {
  136. $message = $val['message'];
  137. $data[] = json_decode($message);
  138. }
  139. return $data;
  140. }
  141. }