wesmiler 2 лет назад
Родитель
Сommit
775bc0b67e

+ 12 - 56
app/Http/Controllers/Api/v1/MessageController.php

@@ -16,7 +16,7 @@ use App\Services\ZegoService;
 class MessageController extends webApp
 {
     /**
-     * 站内消息窗口记录
+     * 聊天主页
      * @return array
      */
     public function index()
@@ -26,7 +26,7 @@ class MessageController extends webApp
     }
 
     /**
-     * 站内推送消息历史
+     * 消息列表
      * @return array|mixed
      */
     public function history()
@@ -38,28 +38,17 @@ class MessageController extends webApp
     }
 
     /**
-     * 聊天列表
+     * 聊天分组数据
      * @return array
      */
-    public function chat()
+    public function chatGroupList()
     {
         $params = request()->post();
         $pageSize = request()->post('pageSize', 20);
-        $datas = ImChatService::make()->getDataListFromatKey($this->userId, $params, $pageSize);
+        $datas = MessageService::make()->getDataListFromatKey($this->userId, $params, $pageSize);
         return message(1010, true, $datas);
     }
 
-    /**
-     * 消息历史
-     * @return array
-     */
-    public function chatHistory()
-    {
-        $params = request()->post();
-        $pageSize = request()->post('pageSize', 20);
-        $datas = ImChatService::make()->getDataList($this->userId, $params, $pageSize);
-        return message(1010, true, $datas);
-    }
 
     /**
      * 消息参数
@@ -101,23 +90,12 @@ class MessageController extends webApp
     public function setRead()
     {
         $chatKey = request()->post('chat_key','');
-        $type = request()->post('type',1);
         $msgType = request()->post('msg_type',1);
-        if($type == 1){
-            if(!$result = MessageService::make()->setRead($this->userId, $msgType)){
-                return message(1020, false);
-            }else{
-                return message(1019, true);
-            }
-        }else if($type == 2){
-            if(!$result = ImChatService::make()->setRead($this->userId, $chatKey)){
-                return message(1020, false);
-            }else{
-                return message(1019, true);
-            }
+        if(!$result = MessageService::make()->setRead($this->userId, $msgType, $chatKey)){
+            return message(1020, false);
+        }else{
+            return message(1019, true);
         }
-
-        return message(1020, false);
     }
 
 
@@ -186,36 +164,14 @@ class MessageController extends webApp
         }
     }
 
-    /**
-     * 获取token
-     * @return array
-     */
-    public function getToken()
-    {
-        $token = ZegoService::make()->getToken();
-        return message(1010, true, $token);
-    }
-
-    /**
-     * 获取token
-     * @return array
-     */
-    public function loginRoom()
-    {
-        $roomId = request()->post('roomId', '');
-        $toUserId = request()->post('userId', 0);
-        $token = ZegoService::make()->loginRoom($this->userId, $toUserId, $roomId);
-        return message(1010, true, $token);
-    }
 
     /**
-     * 计算聊天消息
+     * 未读消息
      * @return array
      */
-    public function chatCount()
+    public function unread()
     {
-        $userId = request()->post('id',0);
-        $result = ImChatService::make()->getCount($userId);
+        $result = MessageService::make()->getUnreadCount($this->userId);
         return message(1010, true, $result);
     }
 }

+ 25 - 0
app/Models/MemberSettingModel.php

@@ -0,0 +1,25 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Models;
+
+/**
+ * 用户参数设置管理-模型
+ * @author laravel开发员
+ * @since 2020/11/11
+ * Class MessageModel
+ * @package App\Models
+ */
+class MemberSettingModel extends BaseModel
+{
+    // 设置数据表
+    protected $table = 'member_setting';
+}

+ 115 - 0
app/Services/Api/MemberSettingService.php

@@ -0,0 +1,115 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Services\Api;
+
+use App\Models\MemberSettingModel;
+use App\Services\BaseService;
+use App\Services\RedisService;
+
+/**
+ * 用户参数设置服务管理-服务类
+ * @author laravel开发员
+ * @since 2020/11/11
+ * Class MemberSettingService
+ * @package App\Services\Common
+ */
+class MemberSettingService extends BaseService
+{
+    protected static $instance=null;
+
+    /**
+     * 构造函数
+     * @author laravel开发员
+     * @since 2020/11/11
+     * MemberSettingService constructor.
+     */
+    public function __construct()
+    {
+        $this->model = new MemberSettingModel();
+    }
+
+    /**
+     * 静态入口
+     * @return static|null
+     */
+    public static function make()
+    {
+        if (!self::$instance) {
+            self::$instance = (new static());
+        }
+        return self::$instance;
+    }
+
+    /**
+     * 获取用户设置参数
+     * @param $userId 用户ID
+     * @param int $type 参数字段,空为所有参数
+     * @param int $default 有字段时,为空返回的默认值
+     * @return array|int|mixed
+     */
+    public function getSetting($userId, $type=0, $default=0)
+    {
+        $cacheKey = "caches:member:setting:{$userId}_{$type}";
+        $datas = RedisService::get($cacheKey);
+        if($datas){
+            return $type? (isset($datas[$type])? $datas[$type] : $default) : $datas;
+        }
+
+        $datas = $this->model->where(['user_id'=> $userId, 'mark'=> 1])->first();
+        $datas = $datas? $datas->setHidden(['id','update_time','mark'])->toArray() : [];
+        if($datas){
+            RedisService::set($cacheKey, $datas, rand(10, 20));
+        }
+        return $type? (isset($datas[$type])? $datas[$type] : $default) : $datas;
+    }
+
+
+    /**
+     * 设置消息参数
+     * @param $userId
+     * @param $params
+     * @return false
+     */
+    public function setMsgData($userId, $params)
+    {
+        $type = isset($params['type'])? trim($params['type']) : '';
+        $value = isset($params['value'])? intval($params['value']) : 0;
+        $types = ['receive_app','receive_custom','receive_order','receive_account'];
+        if(!in_array($type, $types)){
+            $this->error = 1021;
+            return false;
+        }
+
+        // 参数值验证
+        if(!in_array($value, [1,2])){
+            $this->error =1022;
+            return false;
+        }
+
+        $data = [
+            'user_id'=> $userId,
+            'update_time'=> time(),
+            'mark'=> 1,
+        ];
+
+        // 更新设置
+        $data[$type] = $value;
+        if($id = $this->model->where(['user_id'=> $userId])->value('id')){
+            $id = $this->model->where(['id'=> $id])->update($data);
+        }else{
+            $id = $this->model->insertGetId($data);
+        }
+
+        return $id;
+    }
+
+}

+ 116 - 17
app/Services/Api/MessageService.php

@@ -74,7 +74,7 @@ class MessageService extends BaseService
             $where['a.to_uid'] = $userId;
         }
 
-        $field = ['a.id','a.title','a.type','a.description','a.content','a.from_uid','a.to_uid','a.create_time','a.is_read','a.pages','a.status','b.nickname as from_nickname','c.nickname as to_nickname'];
+        $field = ['a.id','a.title','a.type','a.msg_type','a.chat_type','a.description','a.content','a.from_user_name','a.from_user_avatar','a.from_uid','a.to_user_name','a.to_user_avatar','a.to_uid','a.create_time','a.is_read','a.pages','a.status'];
         $datas = $this->model->from('message as a')
             ->leftJoin('member as b','b.id','=','a.from_uid')
             ->leftJoin('member as c','c.id','=','a.to_uid')
@@ -90,6 +90,11 @@ class MessageService extends BaseService
                     $query->where('a.type', $type);
                 }
 
+                $chatType = isset($params['chat_type'])? intval($params['chat_type']) : 0;
+                if($chatType){
+                    $query->where('a.chat_type', $chatType);
+                }
+
                 $status = isset($params['status'])? intval($params['status']) : 0;
                 if($status){
                     $query->where('a.status', $status);
@@ -108,6 +113,7 @@ class MessageService extends BaseService
                 $item['content'] = $item['content']? json_decode($item['content'], true) : [];
             }
             unset($item);
+
             // 更新已读
             if($ids){
                 $this->model->whereIn('id', $ids)->update(['is_read'=> 1,'update_time'=>time()]);
@@ -134,7 +140,7 @@ class MessageService extends BaseService
             return $datas;
         }
 
-        $types = [1];
+        $types = [1,4,5];
         $setting = MemberSettingService::make()->getSetting($userId);
         if($setting){
             foreach ($setting as $k => $v){
@@ -144,8 +150,9 @@ class MessageService extends BaseService
                     $types[] = 3;
                 }
             }
+            asort($types);
         }else{
-            $types = [1,2,3];
+            $types = [1,2,3,4,5];
         }
 
         $field = ['title','type','to_uid','description','is_read','create_time'];
@@ -160,16 +167,15 @@ class MessageService extends BaseService
         $datas = $datas? $datas->toArray() : [];
         $total = 0;
         if($datas){
-            $titles = [1=>'消息通知',2=>'订单通知',3=>'账户通知'];
+            $titles = [1=>'公告通知',2=>'订单通知',3=>'账户通知',4=>'客服通知',5=>'互动消息'];
             foreach($datas as &$item){
-                $item['time_text'] = isset($item['create_time']) && $item['create_time']? dateFormat($item['create_time']) : '';
                 $item['title'] = isset($titles[$item['type']])? $titles[$item['type']] : '消息通知';
-                $data = $this->getNewMessage($item['type'],$userId);
-                $item['description'] = isset($data['description']) && $data['description']? $data['description'] : (isset($data['message'])? mb_substr($data['message'],0,20,'utf-8'):'有新消息');
+                $data = $this->getNewMessage($item['type'],0, $userId);
+                $item['description'] = isset($data['description']) && $data['description']? $data['description'] : (isset($data['message'])? mb_substr($data['message'],0,20,'utf-8'): lang('有新消息'));
                 $item['create_time'] = isset($data['create_time']) && $data['create_time']? $data['create_time'] : '';
                 $item['time_text'] = isset($item['create_time']) && $item['create_time'] ? dateFormat($item['create_time']) : '';
                 $item['create_time'] = isset($item['create_time']) ? datetime($item['create_time'], 'Y-m-d H.i.s') : '';
-                $unread = $this->getUnreadCount($userId, $item['type']);
+                $unread = $this->getUnreadCount($userId,0, $item['type']);
                 $item['unread'] = intval($unread);
                 $total += intval($unread);
             }
@@ -180,24 +186,108 @@ class MessageService extends BaseService
     }
 
     /**
+     * 聊天分组消息
+     * @param $userId
+     * @param $params
+     * @param int $pageSize
+     * @return array
+     */
+    public function getDataListFromatKey($userId, $params, $pageSize=0)
+    {
+        $page = request()->post('page', 1);
+        $cacheKey = "caches:message:chat_{$page}_".md5($userId.json_encode($params).$pageSize);
+        $datas = RedisService::get($cacheKey);
+        $data = isset($datas['data'])? $datas['data'] : [];
+        if($datas && $data) {
+            return [
+                'unread'=> isset($datas['unReadCount'])? $datas['unReadCount'] : 0,
+                'total'=> isset($datas['total'])? $datas['total'] : 0,
+                'list'=> $data,
+                'pageSize'=> $pageSize,
+                'cache'=> true,
+            ];
+        }
+
+        $where = ['a.type'=>9,'a.status'=> 1,'a.mark'=>1];
+        $expire = ConfigService::make()->getConfigByCode('chat_log_expire');
+        $expire = $expire? $expire*86400 : 60*86400;
+        $field = ['a.id','a.chat_key','a.from_user_id','a.to_user_id','a.msg_type','a.create_time','a.video_time','a.is_connect','a.is_read','a.from_is_show','a.to_is_show','a.status','b.avatar as from_avatar','b.nickname as from_nickname','c.avatar as to_avatar','c.nickname as to_nickname'];
+        $datas = $this->model->from('imchat as a')
+            ->where($where)
+            ->where('a.chat_key','>', 0)
+            ->where('a.create_time','>=', time() - $expire)
+            ->where(function($query) use($params){
+                $chatKey = isset($params['chat_key'])? trim($params['chat_key']) : '';
+                if($chatKey){
+                    $query->where('a.chat_key', $chatKey);
+                }
+
+                $isRead = isset($params['is_read'])? intval($params['is_read']) : 0;
+                if($isRead){
+                    $query->where('a.is_read', $isRead);
+                }
+
+                $chatType = isset($params['chat_type'])? intval($params['chat_type']) : 0;
+                if($chatType){
+                    $query->where('a.chat_type', $chatType);
+                }
+            })
+            ->select($field)
+            ->groupBy('chat_key')
+            ->orderBy('a.create_time','desc')
+            ->orderBy('a.id','desc')
+            ->paginate($pageSize > 0 ? $pageSize : 9999999);
+        $datas = $datas ? $datas->toArray() : [];
+        $unReadCount = 0;
+        if ($datas) {
+            foreach ($datas['data'] as &$item) {
+                $item['from_user_avatar'] = isset($item['from_user_avatar']) && $item['from_user_avatar'] ? get_image_url($item['from_user_avatar']) : get_image_url('/images/member/logo.png');
+                $item['to_user_avatar'] = isset($item['to_user_avatar']) && $item['to_user_avatar'] ? get_image_url($item['to_user_avatar']) : get_image_url('/images/member/logo.png');
+                $data = $this->getNewMessage(0,$item['chat_key']);
+                $item['description'] = isset($data['description']) && $data['description']? $data['description'] : (isset($data['message'])? mb_substr($data['message'],0,20,'utf-8'):lang('有新消息'));
+                $item['create_time'] = isset($data['create_time']) && $data['create_time']? $data['create_time'] : '';
+                $item['time_text'] = isset($item['create_time']) && $item['create_time'] ? dateFormat($item['create_time']) : '';
+                $item['create_time'] = isset($item['create_time']) ? datetime($item['create_time'], 'Y-m-d H.i.s') : '';
+                $item['unread'] = $this->getUnreadCount($userId, $item['chat_key'], 0);
+                $unReadCount += intval($item['unread']);
+            }
+            unset($item);
+            $datas['unReadCount'] = $unReadCount;
+            RedisService::set($cacheKey, $datas, rand(3, 5));
+        }
+        return [
+            'unread'=> $unReadCount,
+            'total'=> isset($datas['total'])? $datas['total'] : 0,
+            'list'=> isset($datas['data'])? $datas['data'] : [],
+            'pageSize'=> $pageSize,
+            'cache'=> false,
+        ];
+    }
+
+    /**
      * 获取最新消息
      * @param $chatKey
      * @return mixed
      */
-    public function getNewMessage($type,$userId=0)
+    public function getNewMessage($type=0, $chatKey=0, $userId=0)
     {
-        $cacheKey = "caches:messages:new_{$type}_{$userId}";
+        $cacheKey = "caches:messages:new_{$type}_{$chatKey}_{$userId}";
         $data = RedisService::get($cacheKey);
         if($data){
             return $data;
         }
 
-        $where = ['type'=>$type,'status'=>1,'mark'=>1];
+        $where = ['status'=>1,'mark'=>1];
+        if($type){
+            $where['type'] = $type;
+        }
+        if($chatKey){
+            $where['chat_key'] = $chatKey;
+        }
         if($userId){
             $where['to_uid'] = $userId;
         }
         $data = $this->model->where($where)->select('id','description','content','create_time')
-            //->orderBy('is_read','desc')
             ->orderBy('create_time','desc')
             ->orderBy('id','desc')
             ->first();
@@ -233,9 +323,9 @@ class MessageService extends BaseService
      * @param $userId
      * @return array|mixed
      */
-    public function getUnreadCount($userId, $type=0)
+    public function getUnreadCount($userId, $chatKey=0, $type=0)
     {
-        $cacheKey = "caches:messages:unReadCount:{$userId}_{$type}";
+        $cacheKey = "caches:messages:unReadCount:{$userId}_{$chatKey}_{$type}";
         $data = RedisService::get($cacheKey);
         if(RedisService::exists($cacheKey)){
             return $data;
@@ -244,6 +334,9 @@ class MessageService extends BaseService
         if($type>0){
             $where['type'] = $type;
         }
+        if($chatKey){
+            $where['chat_key'] = $chatKey;
+        }
         $data = $this->model->where($where)->count('id');
         RedisService::set($cacheKey, $data, rand(3, 5));
         return $data;
@@ -294,10 +387,16 @@ class MessageService extends BaseService
      * @param $chatKey 聊天窗口ID
      * @return bool
      */
-    public function setRead($userId, $type)
+    public function setRead($userId, $type=0, $chatKey='')
     {
-        $this->model->where(['to_uid'=> $userId,'type'=> $type])
-            ->update(['is_read'=>1,'update_time'=>time()]);
+        $where = ['to_uid'=> $userId];
+        if($type){
+            $where['type'] = $type;
+        }
+        if($chatKey){
+            $where['chat_key'] = $chatKey;
+        }
+        $this->model->where($where)->update(['is_read'=>1,'update_time'=>time()]);
 
         // 清除缓存
         RedisService::keyDel("caches:messages:bar*");

+ 11 - 1
routes/api.php

@@ -79,7 +79,6 @@ Route::prefix('v1')->group(function(){
     Route::post('/user/modify', [\App\Http\Controllers\Api\v1\MemberController::class, 'modify']);
     Route::post('/user/auth', [\App\Http\Controllers\Api\v1\MemberController::class, 'auth']);
     Route::post('/user/follow', [\App\Http\Controllers\Api\v1\MemberController::class, 'follow']);
-    Route::post('/user/transfer', [\App\Http\Controllers\Api\v1\MemberController::class, 'transfer']);
     //收藏用户
     Route::post('/collect/index', [\App\Http\Controllers\Api\v1\MemberCollectController::class, 'index']);
 
@@ -99,6 +98,17 @@ Route::prefix('v1')->group(function(){
     Route::post('/collect/collect', [\App\Http\Controllers\Api\v1\MemberCollectController::class, 'collect']);
     Route::post('/collect/cancel', [\App\Http\Controllers\Api\v1\MemberCollectController::class, 'cancel']);
 
+    // 聊天、消息
+    Route::post('/message/index', [\App\Http\Controllers\Api\v1\MessageController::class, 'index']);
+    Route::post('/message/chat', [\App\Http\Controllers\Api\v1\MessageController::class, 'chatGroupList']);
+    Route::post('/message/history', [\App\Http\Controllers\Api\v1\MessageController::class, 'history']);
+    Route::post('/message/unread', [\App\Http\Controllers\Api\v1\MessageController::class, 'unread']);
+    Route::post('/message/clear', [\App\Http\Controllers\Api\v1\MessageController::class, 'clear']);
+    Route::post('/message/clearAll', [\App\Http\Controllers\Api\v1\MessageController::class, 'clearAll']);
+    Route::post('/message/setRead', [\App\Http\Controllers\Api\v1\MessageController::class, 'setRead']);
+    Route::post('/message/setting', [\App\Http\Controllers\Api\v1\MessageController::class, 'setSetting']);
+    Route::post('/message/getSetting', [\App\Http\Controllers\Api\v1\MessageController::class, 'getSetting']);
+
 
 });