ChatMessageService.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services;
  12. use App\Models\ChatMessageModel;
  13. use App\Models\ConfigModel;
  14. /**
  15. * 聊天-服务类
  16. * Class ChatMessageService
  17. * @package App\Services
  18. */
  19. class ChatMessageService extends BaseService
  20. {
  21. // 静态对象
  22. protected static $instance = null;
  23. /**
  24. * 构造函数
  25. * ChatMessageService constructor.
  26. */
  27. public function __construct()
  28. {
  29. $this->model = new ChatMessageModel();
  30. }
  31. /**
  32. * 静态入口
  33. * @return static|null
  34. */
  35. public static function make(){
  36. if(!self::$instance){
  37. self::$instance = (new static());
  38. }
  39. return self::$instance;
  40. }
  41. /**
  42. * 绑定用户
  43. * @param $fd
  44. * @param $data
  45. * @return bool
  46. */
  47. public function bind($fd, $data)
  48. {
  49. $userId = isset($data['from_uid'])? intval($data['from_uid']) : 0;
  50. if($userId<=0){
  51. $this->error = '1013';
  52. return false;
  53. }
  54. RedisService::set("chats:bind:{$userId}", ['fd'=> $fd, 'user_id'=> $userId], 86400);
  55. return true;
  56. }
  57. /**
  58. * 获取列表
  59. * @param $params
  60. * @param int $pageSize
  61. * @return array
  62. */
  63. public function getDataList($params, $pageSize = 15)
  64. {
  65. $where = ['a.mark' => 1,'a.status'=>1];
  66. $type = isset($params['type'])? $params['type'] : 1;
  67. $chatKey = isset($params['chat_key'])? $params['chat_key'] : '';
  68. $fromUid = isset($params['from_uid'])? $params['from_uid'] : 0;
  69. $toUid = isset($params['to_uid'])? $params['to_uid'] : 0;
  70. $orderNo = isset($params['order_no'])? $params['order_no'] : '';
  71. if($type>0){
  72. $where['a.type'] = $type;
  73. }
  74. if($chatKey){
  75. $where['a.chat_key'] = $chatKey;
  76. }
  77. if($fromUid>0){
  78. $where['a.from_uid'] = $fromUid;
  79. }
  80. if($toUid>0){
  81. $where['a.to_uid'] = $toUid;
  82. }
  83. if($orderNo){
  84. $where['a.order_no'] = $orderNo;
  85. }
  86. $list = $this->model->from('chat_message as a')
  87. ->leftJoin('member as m', 'm.id', '=', 'a.from_uid')
  88. ->leftJoin('member as m1', 'm1.id', '=', 'a.to_uid')
  89. ->where($where)
  90. ->where(function ($query) use($params){
  91. $id = isset($params['id'])? $params['id'] : 0;
  92. if($id>0){
  93. $query->where('id','<', $id);
  94. }
  95. })
  96. ->where(function ($query) use($params){
  97. $userId = isset($params['user_id'])? $params['user_id'] : 0;
  98. if($userId){
  99. $query->where('a.from_uid','=',$userId)->orWhere('a.to_uid','=', $userId);
  100. }
  101. })
  102. ->select(['a.*', 'm.username as from_username','m.avatar as from_avatar','m1.username as to_username','m1.avatar as to_avatar'])
  103. ->orderBy('a.create_time','desc')
  104. ->orderBy('a.id','desc')
  105. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  106. $list = $list? $list->toArray() :[];
  107. if($list){
  108. foreach($list['data'] as &$item){
  109. $item['from_username_text'] = $item['from_username']? format_account($item['from_username']):'客服';
  110. $item['to_username_text'] = $item['to_username']? format_account($item['to_username']):'客服';
  111. $item['message_url'] = $item['message_type']==2? get_image_url($item['message']):'';
  112. $item['from_avatar'] = $item['from_avatar']? get_image_url($item['from_avatar']):'';
  113. $item['to_avatar'] = $item['to_avatar']? get_image_url($item['to_avatar']):'';
  114. $item['time_text'] = $item['create_time']? format_time(strtotime($item['create_time'])):'刚刚';
  115. $userId = isset($params['user_id'])? $params['user_id'] : 0;
  116. if($userId == $item['to_uid']){
  117. // 已读
  118. $this->model->where(['id'=> $item['id']])->update(['is_read'=>1,'update_time'=> time()]);
  119. }
  120. }
  121. }
  122. return [
  123. 'pageSize'=> $pageSize,
  124. 'total'=>isset($list['total'])? $list['total'] : 0,
  125. 'list'=> isset($list['data'])? $list['data'] : []
  126. ];
  127. }
  128. public function getNewList($params, $pageSize = 15)
  129. {
  130. $where = ['a.mark' => 1,'status'=>1];
  131. $type = isset($params['type'])? $params['type'] : 1;
  132. $chatKey = isset($params['chat_key'])? $params['chat_key'] : '';
  133. $fromUid = isset($params['from_uid'])? $params['from_uid'] : 0;
  134. $toUid = isset($params['to_uid'])? $params['to_uid'] : 0;
  135. $orderNo = isset($params['order_no'])? $params['order_no'] : '';
  136. if($type>0){
  137. $where['a.type'] = $type;
  138. }
  139. if($chatKey){
  140. $where['a.chat_key'] = $chatKey;
  141. }
  142. if($fromUid>0){
  143. $where['a.from_uid'] = $fromUid;
  144. }
  145. if($toUid>0){
  146. $where['a.to_uid'] = $toUid;
  147. }
  148. if($orderNo){
  149. $where['a.order_no'] = $orderNo;
  150. }
  151. $list = $this->model->from('chat_message as a')
  152. ->leftJoin('member as m', 'm.id', '=', 'a.from_uid')
  153. ->leftJoin('member as m1', 'm1.id', '=', 'a.to_uid')
  154. ->where($where)
  155. ->where(function ($query) use($params){
  156. $userId = isset($params['user_id'])? $params['user_id'] : 0;
  157. if($userId){
  158. $query->where('a.from_uid','=',$userId)->orWhere('a.to_uid','=', $userId);
  159. }
  160. })
  161. ->select(['a.id', 'a.from_uid','a.to_uid','a.type','a.chat_key','a.order_no','a.create_time', 'm.username as from_username','m.avatar as from_avatar','m1.username as to_username','m1.avatar as to_avatar'])
  162. ->groupBy('a.chat_key')
  163. ->orderBy('a.create_time','desc')
  164. ->orderBy('a.id','desc')
  165. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  166. $list = $list? $list->toArray() :[];
  167. if($list){
  168. foreach($list['data'] as &$item){
  169. $item['from_username_text'] = $item['from_username']? format_account($item['from_username']):'客服';
  170. $item['to_username_text'] = $item['to_username']? format_account($item['to_username']):'客服';
  171. $item['from_avatar'] = $item['from_avatar']? get_image_url($item['from_avatar']):'';
  172. $item['to_avatar'] = $item['to_avatar']? get_image_url($item['to_avatar']):'';
  173. $item['time_text'] = $item['create_time']? format_time(strtotime($item['create_time'])):'刚刚';
  174. $item['info'] = $this->getTempInfo($item['chat_key']);
  175. }
  176. }
  177. return [
  178. 'pageSize'=> $pageSize,
  179. 'total'=>isset($list['total'])? $list['total'] : 0,
  180. 'list'=> isset($list['data'])? $list['data'] : []
  181. ];
  182. }
  183. /**
  184. * 获取最新的聊天消息
  185. * @param $chatKey 聊天窗口标识
  186. * @return array|mixed
  187. */
  188. public function getTempInfo($chatKey)
  189. {
  190. $cacheKey = "caches:chats:temp:{$chatKey}";
  191. $info = RedisService::get($cacheKey);
  192. if($info){
  193. return $info;
  194. }
  195. $info = $this->model->where(['chat_key'=> $cacheKey,'status'=>1,'mark'=>1])
  196. ->select(['id','message','is_read','message_type','create_time'])
  197. ->orderBy('create_time','desc')
  198. ->orderBy('id','desc')
  199. ->first();
  200. if($info){
  201. $info['message_url'] = $info['message_type']==2? get_image_url($info['message']):'';
  202. $info['time_text'] = $info['create_time']? format_time(strtotime($info['create_time'])):'刚刚';
  203. RedisService::set($cacheKey, $info, rand(3,5));
  204. }
  205. return $info;
  206. }
  207. /**
  208. * 添加或编辑
  209. * @return array
  210. */
  211. public function saveData($data)
  212. {
  213. $data = [
  214. 'type'=> isset($data['type'])? $data['type'] : 1,
  215. 'message_type'=> isset($data['message_type'])? $data['message_type'] : 1,
  216. 'from_uid'=> isset($data['from_uid'])? $data['from_uid'] : 1,
  217. 'to_uid'=> isset($data['to_uid'])? $data['to_uid'] : 1,
  218. 'order_no'=> isset($data['order_no'])? $data['order_no'] : '',
  219. 'chat_key'=> getChatKey($data['from_uid'],$data['to_uid']),
  220. 'message'=> isset($data['message'])? $data['message'] : '',
  221. 'create_time'=> time(),
  222. 'update_time'=> time(),
  223. 'is_read'=> 2,
  224. 'status'=> 1,
  225. 'mark'=> 1,
  226. ];
  227. return $this->model->insertGetId($data);
  228. }
  229. /**
  230. * 推送保存消息,如订单消息
  231. * @param $data 消息数据
  232. * @return int|number
  233. */
  234. public function pushMessage($data)
  235. {
  236. return $this->model->edit($data);
  237. }
  238. }