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);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
} |