Prechádzať zdrojové kódy

未读消息接口与联系人列表

shizhongqi 11 mesiacov pred
rodič
commit
a5e3978565

+ 6 - 0
app-hd/controllers/ChatController.php

@@ -163,4 +163,10 @@ class ChatController extends BaseController
         util::success($respond);
     }
 
+    //门店的未读消息总数
+    public function actionUnReadMsgCount()
+    {
+        $c = ChatService::getUnReadMsgCount($this->shopId);
+        util::success(['msg_count'=>$c]);
+    }
 }

+ 8 - 1
app-mall/controllers/ChatController.php

@@ -114,7 +114,7 @@ class ChatController extends BaseController
     //最近聊天人
     public function actionLatestUsers()
     {
-        $respond = ChatService::getLatestUsers($this->userId);
+        $respond = ChatService::getLatestUsers(intval($this->userId));
         util::success($respond);
     }
 
@@ -128,4 +128,11 @@ class ChatController extends BaseController
         $respond = ChatService::getChatHistory($roomName);
         util::success($respond);
     }
+
+    //客户的未读消息总数
+    public function actionUnReadMsgCount()
+    {
+        $c = ChatService::getUnReadMsgCount(intval($this->userId));
+        util::success(['msg_count'=>$c]);
+    }
 }

+ 47 - 5
biz-hd/message/services/ChatService.php

@@ -171,7 +171,7 @@ class ChatService extends BaseService
             if ($key % 2 == 0) {
                 $arr[$i]['cId'] = $val;
             } else {
-                $arr[$i]['time'] = $val;
+                $arr[$i]['score'] = $val;
                 $i++;
             }
         }
@@ -179,10 +179,10 @@ class ChatService extends BaseService
         //组合出最后聊天时间和未读消息数
         foreach ($arr as $val) {
             $customId = $val['cId'];
-            $float = floatval($val['time']);
-            $decimalPart = $float - floor($float);
-            $unReadNum = intval($decimalPart * 10000);
-            $time = intval($val['time']);
+            $score = floatval($val['score']);
+            $decimalPart = $score - floor($score);
+            $unReadNum = intval($decimalPart * 10000 + 0.5);// 加0.5 -- 使用四舍五入来处理浮点数精度问题
+            $time = intval($val['score']);
             $date = date("Y-m-d H:i", $time);
 
             $userData[$customId] = ['time' => $date, 'unReadNum' => $unReadNum];
@@ -222,4 +222,46 @@ class ChatService extends BaseService
             return [];
         }
     }
+
+    /**
+     * @param int $shopId 门店id
+     * @param string $unit 单位分:个数(person)消息(message)
+     * @return int
+     */
+    public static function getUnReadMsgCount($shopId, $unit='person')
+    {
+        $cacheKey = ChatClass::getLatestUsersKey($shopId);
+        //返回有序集合,从高分到低分排序
+        $return = Yii::$app->redis->executeCommand('ZREVRANGE', [$cacheKey, 0, -1, 'WITHSCORES']);
+        if (empty($return)) {
+            return 0;
+        }
+        $i = 0;
+        $arr = [];
+        foreach ($return as $key => $val) {
+            if ($key % 2 == 0) {
+                $arr[$i]['cId'] = $val;//customerId
+            } else {
+                $arr[$i]['score'] = $val;
+                $i++;
+            }
+        }
+
+        $msgCount = 0;
+        foreach ($arr as $val) {
+            //$customId = $val['cId'];
+            $score = floatval($val['score']);
+            $decimalPart = $score - floor($score);
+            $unReadNum = intval($decimalPart * 10000 + 0.5); // 加0.5 -- 使用四舍五入来处理浮点数精度问题
+
+            //根据未读消息数的单位进行计算总数
+            if ($unit == 'person'){
+                $msgCount += ($unReadNum >= 1 ? 1 : 0);
+            } else if ($unit == 'message'){
+                $msgCount += $unReadNum;
+            }
+        }
+
+        return $msgCount;
+    }
 }

+ 47 - 2
biz-mall/message/services/ChatService.php

@@ -162,7 +162,6 @@ class ChatService extends BaseService
 			return [];
 		}
 		try {
-            $re = Yii::$app->redis;
 			$list = Yii::$app->redis->executeCommand('LRANGE', [$roomName, 0, -1]);
 			if (empty($list)) {
 				return [];
@@ -183,7 +182,12 @@ class ChatService extends BaseService
     }
 
 	// ------------------------------------------------  以下是新增的聊天方法  ------------------------------------------------
-    //最近聊天人(人:可能是客户,也可能是商家)
+
+    /**
+     * 最近聊天人(人:可能是客户,也可能是商家)
+     * @param int $userId
+     * @return array|\yii\db\ActiveRecord[]
+     */
     public static function getLatestUsers($userId)
     {
         $cacheKey = ChatClass::getLatestUsersKey($userId);
@@ -231,4 +235,45 @@ class ChatService extends BaseService
         return array_values($shopList);
     }
 
+    /**
+     * @param int $userId 用户id
+     * @param string $unit 单位分:个数(person)消息(message)
+     * @return int
+     */
+    public static function getUnReadMsgCount($userId, $unit='person')
+    {
+        $cacheKey = ChatClass::getLatestUsersKey($userId);
+        //返回有序集合,从高分到低分排序
+        $return = Yii::$app->redis->executeCommand('ZREVRANGE', [$cacheKey, 0, -1, 'WITHSCORES']);
+        if (empty($return)) {
+            return 0;
+        }
+        $i = 0;
+        $arr = [];
+        foreach ($return as $key => $val) {
+            if ($key % 2 == 0) {
+                $arr[$i]['sId'] = $val;//shopId
+            } else {
+                $arr[$i]['score'] = $val;
+                $i++;
+            }
+        }
+
+        $msgCount = 0;
+        foreach ($arr as $val) {
+            $score = floatval($val['score']);
+            $decimalPart = $score - floor($score);
+            $unReadNum = intval($decimalPart * 10000 + 0.5); // 加0.5 -- 使用四舍五入来处理浮点数精度问题
+
+            //根据未读消息数的单位进行计算总数
+            if ($unit == 'person'){
+                $msgCount += ($unReadNum >= 1 ? 1 : 0);
+            } else if ($unit == 'message'){
+                $msgCount += $unReadNum;
+            }
+        }
+
+        return $msgCount;
+    }
+
 }