314 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | likeshop开源商城系统
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | ||
| // | gitee下载:https://gitee.com/likeshop_gitee
 | ||
| // | github下载:https://github.com/likeshop-github
 | ||
| // | 访问官网:https://www.likeshop.cn
 | ||
| // | 访问社区:https://home.likeshop.cn
 | ||
| // | 访问手册:http://doc.likeshop.cn
 | ||
| // | 微信公众号:likeshop技术社区
 | ||
| // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | ||
| // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | ||
| // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | ||
| // | likeshop团队版权所有并拥有最终解释权
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | author: likeshop.cn.team
 | ||
| // +----------------------------------------------------------------------
 | ||
| namespace app\common\logic;
 | ||
| 
 | ||
| 
 | ||
| use app\common\basics\Logic;
 | ||
| use app\common\enum\ChatMsgEnum;
 | ||
| use app\common\model\kefu\ChatRelation;
 | ||
| use app\common\model\kefu\Kefu;
 | ||
| use app\common\model\user\User;
 | ||
| use app\common\server\ConfigServer;
 | ||
| use app\common\server\UrlServer;
 | ||
| use app\common\utils\Redis;
 | ||
| 
 | ||
| class ChatLogic extends Logic
 | ||
| {
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes
 | ||
|      * @param $shop_id
 | ||
|      * @return array|bool
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/14 12:07
 | ||
|      */
 | ||
|     public static function getOnlineKefu($shop_id)
 | ||
|     {
 | ||
|         $key = self::getChatPrefix() . 'shop_' . $shop_id . '_kefu';
 | ||
|         return (new Redis())->getSmembersArray($key);
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 在线用户
 | ||
|      * @return array|bool
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/14 12:11
 | ||
|      */
 | ||
|     public static function getOnlineUser()
 | ||
|     {
 | ||
|         $key = self::getChatPrefix() . 'user';
 | ||
|         return (new Redis())->getSmembersArray($key);
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 格式化聊天记录
 | ||
|      * @param $records
 | ||
|      * @param $count
 | ||
|      * @param $page
 | ||
|      * @param $size
 | ||
|      * @return array
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/13 10:20
 | ||
|      */
 | ||
|     public static function formatChatRecords($records, $count, $page, $size)
 | ||
|     {
 | ||
|         if (empty($records)) {
 | ||
|             return [
 | ||
|                 'list' => $records,
 | ||
|                 'page' => $page,
 | ||
|                 'size' => $size,
 | ||
|                 'count' => $count,
 | ||
|                 'more' => is_more($count, $page, $size)
 | ||
|             ];
 | ||
|         }
 | ||
| 
 | ||
|         $kefu = [];
 | ||
|         $user = [];
 | ||
| 
 | ||
|         // 获取到客服和用户不同的两组id
 | ||
|         foreach ($records as $item) {
 | ||
|             if ($item['from_type'] == 'kefu') {
 | ||
|                 $kefu[] = $item['from_id'];
 | ||
|             } else {
 | ||
|                 $user[] = $item['from_id'];
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         $kefu = array_unique($kefu);
 | ||
|         $user = array_unique($user);
 | ||
| 
 | ||
| 
 | ||
|         $kefu = Kefu::where('id', 'in', $kefu)->column('nickname, avatar', 'id');
 | ||
|         $user = User::where('id', 'in', $user)->column('nickname, avatar', 'id');
 | ||
| 
 | ||
| 
 | ||
|         foreach ($records as &$item) {
 | ||
|             $item['from_nickname'] = '';
 | ||
|             $item['from_avatar'] = '';
 | ||
| 
 | ||
|             if ($item['from_type'] == 'kefu') {
 | ||
|                 $kefu_id = $item['from_id'];
 | ||
|                 if (isset($kefu[$kefu_id])) {
 | ||
|                     $item['from_nickname'] = $kefu[$kefu_id]['nickname'] ?? '';
 | ||
|                     $item['from_avatar'] = $kefu[$kefu_id]['avatar'] ?? '';
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if ($item['from_type'] == 'user') {
 | ||
|                 $user_id = $item['from_id'];
 | ||
|                 if (isset($user[$user_id])) {
 | ||
|                     $item['from_nickname'] = $user[$user_id]['nickname'] ?? '';
 | ||
|                     $item['from_avatar'] = $user[$user_id]['avatar'] ?? '';
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
|             $item['goods'] = [];
 | ||
|             if ($item['msg_type'] == ChatMsgEnum::TYPE_GOODS) {
 | ||
|                 $item['goods'] = json_decode($item['msg'], true);
 | ||
|             }
 | ||
| 
 | ||
|             $item['create_time_stamp'] = strtotime($item['create_time']);
 | ||
|         }
 | ||
| 
 | ||
|         $records = array_reverse($records);
 | ||
| 
 | ||
|         return [
 | ||
|             'list' => $records,
 | ||
|             'page' => $page,
 | ||
|             'size' => $size,
 | ||
|             'count' => $count,
 | ||
|             'more' => is_more($count, $page, $size)
 | ||
|         ];
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 配置
 | ||
|      * @param $shop_id
 | ||
|      * @return array
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/17 11:24
 | ||
|      * @remark code => 0时显示人工客服页,code => 1时显示在线客服页
 | ||
|      */
 | ||
|     public static function getConfig($shop_id)
 | ||
|     {
 | ||
|         // 后台客服配置 1->人工客服; 2->在线客服
 | ||
|         if (self::getConfigSetting($shop_id) == 1) {
 | ||
|             return ['code' => 0, 'msg' => ''];
 | ||
|         }
 | ||
| 
 | ||
|         // 缓存配置
 | ||
|         if ('redis' != self::getCacheDrive()) {
 | ||
|             return ['code' => 0, 'msg' => '请联系管理员设置缓存驱动为redis'];
 | ||
|         }
 | ||
| 
 | ||
|         // 当前在线客服
 | ||
|         $online = self::getOnlineKefu($shop_id);
 | ||
|         if (empty($online)) {
 | ||
|             return ['code' => 0, 'msg' => '当前客服不在线,有问题请联系人工客服'];
 | ||
|         }
 | ||
| 
 | ||
|         return ['code' => 1, 'msg' => ''];
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 检查配置
 | ||
|      * @param int $shop_id
 | ||
|      * @return bool
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/20 14:11
 | ||
|      */
 | ||
|     public static function checkConfig(int $shop_id = 0)
 | ||
|     {
 | ||
|         try {
 | ||
|             if (self::getConfigSetting($shop_id) == 1) {
 | ||
|                 throw new \Exception('请联系管理员开启在线客服');
 | ||
|             }
 | ||
|             if ('redis' != self::getCacheDrive()) {
 | ||
|                 throw new \Exception('请联系管理员设置缓存驱动为redis');
 | ||
|             }
 | ||
|             return true;
 | ||
|         } catch (\Exception $e) {
 | ||
|             self::$error = $e->getMessage();
 | ||
|             return false;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 绑定关系
 | ||
|      * @param $user_id
 | ||
|      * @param $kefu_id
 | ||
|      * @param $shop_id
 | ||
|      * @param $data
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/17 15:52
 | ||
|      */
 | ||
|     public static function bindRelation($user_id, $kefu_id, $shop_id, $data, $is_read = 0)
 | ||
|     {
 | ||
|         $relation = ChatRelation::where(['user_id' => $user_id, 'shop_id' => $shop_id])->findOrEmpty();
 | ||
| 
 | ||
|         $user = User::where(['id' => $user_id])->findOrEmpty();
 | ||
| 
 | ||
|         if ($relation->isEmpty()) {
 | ||
|             $relation = ChatRelation::create([
 | ||
|                 'shop_id' => $shop_id,
 | ||
|                 'user_id' => $user_id,
 | ||
|                 'kefu_id' => $kefu_id,
 | ||
|                 'nickname' => $user['nickname'],
 | ||
|                 'avatar' => $user['avatar'],
 | ||
|                 'client' => $data['client'] ?? 0,
 | ||
|                 'msg' => $data['msg'] ?? '',
 | ||
|                 'msg_type' => $data['msg_type'] ?? ChatMsgEnum::TYPE_TEXT,
 | ||
|                 'is_read' => 1, // 新创建关系都算已读
 | ||
|                 'create_time' => time(),
 | ||
|                 'update_time' => time(),
 | ||
|             ]);
 | ||
|         } else {
 | ||
|             ChatRelation::update(
 | ||
|                 [
 | ||
|                     'kefu_id' => $kefu_id,
 | ||
|                     'nickname' => $user['nickname'],
 | ||
|                     'avatar' => $user['avatar'],
 | ||
|                     'client' => $data['client'] ?? 0,
 | ||
|                     'msg' => $data['msg'] ?? '',
 | ||
|                     'msg_type' => $data['msg_type'] ?? ChatMsgEnum::TYPE_TEXT,
 | ||
|                     'update_time' => time(),
 | ||
|                     'is_read' => $is_read
 | ||
|                 ],
 | ||
|                 ['id' => $relation['id']]
 | ||
|             );
 | ||
|         }
 | ||
| 
 | ||
|         return $relation['id'];
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 后台客服配置
 | ||
|      * @param $shop_id
 | ||
|      * @return array|int|mixed|string|null
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/20 11:51
 | ||
|      */
 | ||
|     public static function getConfigSetting($shop_id)
 | ||
|     {
 | ||
|         // 后台客服配置 1->人工客服; 2->在线客服
 | ||
|         if ($shop_id > 0) {
 | ||
|             $config = ConfigServer::get('shop_customer_service', 'type', 1, $shop_id);
 | ||
|         } else {
 | ||
|             $config = ConfigServer::get('customer_service', 'type', 1);
 | ||
|         }
 | ||
|         return $config;
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 当前缓存驱动
 | ||
|      * @return mixed
 | ||
|      * @author 段誉
 | ||
|      * @date 2021/12/20 11:51
 | ||
|      */
 | ||
|     public static function getCacheDrive()
 | ||
|     {
 | ||
|         return config('cache.default');
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 聊天前缀
 | ||
|      * @return mixed
 | ||
|      * @author 段誉
 | ||
|      * @date 2022/4/14 17:42
 | ||
|      */
 | ||
|     public static function getChatPrefix()
 | ||
|     {
 | ||
|         return config('default.websocket_prefix');
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * @notes 禁用客服
 | ||
|      * @param $shop_id
 | ||
|      * @param $kefu_id
 | ||
|      * @author 段誉
 | ||
|      * @date 2022/4/14 17:42
 | ||
|      */
 | ||
|     public static function setChatDisable($shop_id, $kefu_id)
 | ||
|     {
 | ||
|         $cache = new Redis();
 | ||
|         $prefix = self::getChatPrefix();
 | ||
|         $key = $prefix . 'shop_' . $shop_id . '_kefu';
 | ||
| 
 | ||
|         $result = $cache->getSmembersArray($key);
 | ||
|         $fds = $cache->getSmembersArray($prefix . 'kefu_' . $kefu_id);
 | ||
| 
 | ||
|         if (in_array($kefu_id, $result) && $fds) {
 | ||
|             $cache->srem($key, $kefu_id);
 | ||
|             foreach ($fds as $fd) {
 | ||
|                 $cache->srem($prefix . 'kefu_' . $kefu_id, $fd);
 | ||
|                 $cache->del($prefix . 'fd_' . $fd);
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| } |