445 lines
13 KiB
PHP
445 lines
13 KiB
PHP
<?php
|
|
|
|
namespace addon\servicer\model;
|
|
|
|
use app\model\BaseModel;
|
|
use app\model\shop\Shop as ShopModel;
|
|
use app\model\system\User as UserModel;
|
|
use app\model\web\WebSite as WebsiteModel;
|
|
use think\db\exception\DataNotFoundException;
|
|
use think\db\exception\DbException;
|
|
use think\db\exception\ModelNotFoundException;
|
|
use think\Exception;
|
|
|
|
/**
|
|
* 客服
|
|
*/
|
|
class Servicer extends BaseModel
|
|
{
|
|
/**
|
|
* 表名称
|
|
*/
|
|
const TABLE_NAME = 'servicer';
|
|
|
|
/**
|
|
* 新建客服
|
|
* @param $isPlatform
|
|
* @param $siteId
|
|
* @param $userId
|
|
* @param int $online
|
|
* @return array
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function createServicer($isPlatform, $siteId, $userId, $online = 0)
|
|
{
|
|
// 客服与会员一对一绑定。也就是说,一个用户只能关联一个客服数据
|
|
$servicerExists = model('servicer')->getInfo(['user_id' => $userId]);
|
|
if ($servicerExists) {
|
|
return $this->success($servicerExists);
|
|
}
|
|
|
|
$model = model('servicer')->add([
|
|
'is_platform' => $isPlatform, // 此处一定为平台客服
|
|
'shop_id' => $siteId,
|
|
'user_id' => $userId,
|
|
'create_time' => time(),
|
|
'last_online_time' => time(),
|
|
'delete_time' => 0,
|
|
'client_id' => '',
|
|
'online' => $online,
|
|
]);
|
|
|
|
return $this->success($model);
|
|
}
|
|
|
|
/**
|
|
* 获取在线客服列表
|
|
* @param $site_id
|
|
* @return array
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function getOnlineServicers($site_id)
|
|
{
|
|
$list = model('servicer')->getList(['shop_id' => $site_id, 'online' => 1]);
|
|
// if (empty($list) || count($list) == 0) {
|
|
// return $this->error('没有在线客服');
|
|
// }
|
|
|
|
return $this->success($list);
|
|
}
|
|
|
|
/**
|
|
* 获取会员信息
|
|
* @param $where
|
|
* @param bool $field
|
|
* @return array|\think\Model|null
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function getServicer($where, $field = true)
|
|
{
|
|
return model('servicer')->getInfo($where, $field);
|
|
}
|
|
|
|
/**
|
|
* 设置客服在线状态
|
|
* @param $servicerId
|
|
* @param $clientId
|
|
* @param bool $online
|
|
* @return int
|
|
* @throws DbException
|
|
*/
|
|
public function setServicerOnlineStatus($servicerId, $clientId, $online = true)
|
|
{
|
|
if (!$online) {
|
|
model('servicer_member')->update(
|
|
['client_id' => '', 'online' => $online],
|
|
[['servicer_id', '=', $servicerId]]
|
|
);
|
|
}
|
|
return model('servicer')->update(
|
|
['client_id' => $online?$clientId:'', 'online' => $online, 'last_online_time' => time()],
|
|
[['user_id', '=', $servicerId]]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 获取客服列表
|
|
* @param array $condition
|
|
* @return array
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function getServicerList($condition = [])
|
|
{
|
|
$alias = 'sm';
|
|
$field = ['id'];
|
|
|
|
return model('servicer')->getList($condition, $field, '', $alias);
|
|
}
|
|
|
|
/**
|
|
* 获取当前客服服务的会员列表
|
|
* @param $user_id
|
|
* @param int $page
|
|
* @param int $limit
|
|
* @return mixed|null
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function getCurrentUserChatMembers($user_id, $page = 1, $limit = 10)
|
|
{
|
|
$servicer_ids = model('servicer')->getColumn(['user_id' => $user_id], 'id');
|
|
if (empty($servicer_ids)) {
|
|
return null;
|
|
}
|
|
|
|
$alias = 'sm';
|
|
$field = ['sm.id', 'sm.member_id', 'sm.servicer_id', 'sm.member_name', 'sm.online', 'sm.create_time', 'sm.headimg'];
|
|
|
|
$condition = ['sm.servicer_id', 'in', $servicer_ids];
|
|
$order = ['id' => 'desc'];
|
|
|
|
return model('servicer')->pageList($condition, $field, $order, $page, 10, $alias, [], null, $limit);
|
|
}
|
|
|
|
/**
|
|
* 删除客服
|
|
* @param $servicerId
|
|
* @return array
|
|
* @throws DbException
|
|
*/
|
|
public function delServicer($servicerId)
|
|
{
|
|
$del = model('servicer')->delete(['id' => $servicerId]);
|
|
if ($del) {
|
|
return $this->success();
|
|
}
|
|
|
|
return $this->error();
|
|
}
|
|
|
|
/**
|
|
* 为当前会员匹配一个客服人员
|
|
* @param $site_id
|
|
* @param $member_id
|
|
* @return array
|
|
* @throws DataNotFoundException
|
|
* @throws DbException
|
|
* @throws ModelNotFoundException
|
|
*/
|
|
public function getUsefulServicer($site_id, $member_id)
|
|
{
|
|
/**
|
|
* 目前采用的是最闲优先匹配原则
|
|
*/
|
|
$condition = [['online', '=', 1], ['shop_id', '=', $site_id]];
|
|
$list = model('servicer')->getList($condition, 'user_id');
|
|
if(!empty($list)){
|
|
foreach ($list as &$item){
|
|
$item_condition = [
|
|
['servicer_id', '=', $item['user_id']],
|
|
['online', '=', 1]
|
|
];
|
|
$item_count = model('servicer_member')->getCount($item_condition);
|
|
$item['chat_count'] = $item_count;//正在聊天的会员数
|
|
|
|
$condition_sd = [['member_id', '=', $member_id], ['type', '=', 1], ['servicer_id', 'in', array_column($list, 'user_id')]];
|
|
$info = model('servicer_dialogue')->getFirstData($condition_sd, 'servicer_id', 'create_time desc');
|
|
$item['last_count'] = !empty($info['servicer_id']) && $info['servicer_id']==$item['user_id'] ? 1:0;
|
|
}
|
|
}
|
|
array_multisort(array_column($list,'last_count'),SORT_ASC,$list);
|
|
array_multisort(array_column($list,'chat_count'),SORT_ASC,$list);
|
|
return $list;
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取客服列表
|
|
* @param array $condition
|
|
* @param int $page
|
|
* @param int $page_size
|
|
* @param string $order
|
|
* @param bool $field
|
|
* @param string $alias
|
|
* @param array $join
|
|
* @return array
|
|
*/
|
|
public function getPageList(array $condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'id desc', $field = true, $alias = '', $join = [])
|
|
{
|
|
$res = model(self::TABLE_NAME)->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
|
|
return $this->success($res);
|
|
}
|
|
|
|
/**
|
|
* 添加客服
|
|
* @param array $data
|
|
* @param array $params
|
|
* @return array
|
|
*/
|
|
public function add(array $data, array $params)
|
|
{
|
|
if (empty($data) || empty($params)) {
|
|
return $this->error('', 'PARAMETER_ERROR');
|
|
}
|
|
|
|
model(self::TABLE_NAME)->startTrans();
|
|
try {
|
|
$user_model = new UserModel();
|
|
$res = $user_model->addUser($data, 1);
|
|
if ($res['code'] < 0) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $res;
|
|
}
|
|
$user_info = $res['data'];
|
|
|
|
$res = model(self::TABLE_NAME)->add(array_merge($params, [
|
|
'shop_id' => 1,
|
|
'user_id' => $user_info,
|
|
'create_time' => time(),
|
|
]));
|
|
|
|
model(self::TABLE_NAME)->commit();
|
|
return $this->success($res);
|
|
} catch (\Exception $e) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $this->error('', '操作异常:' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 编辑客服
|
|
* @param array $data
|
|
* @param array $condition
|
|
* @param array $params
|
|
* @return array
|
|
*/
|
|
public function edit(array $data, array $condition, array $params = [])
|
|
{
|
|
if (empty($data)) {
|
|
return $this->error('', 'PARAMETER_ERROR');
|
|
}
|
|
|
|
$user_model = new UserModel();
|
|
$user_info = $user_model->getUserInfo($condition)['data'];
|
|
if (empty($user_info)) {
|
|
return $this->error('', '客服不存在');
|
|
}
|
|
|
|
model(self::TABLE_NAME)->startTrans();
|
|
try {
|
|
$res = $user_model->editUser($data, $condition);
|
|
if ($res['code'] < 0) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $res;
|
|
}
|
|
|
|
if (!empty($params)) {
|
|
model(self::TABLE_NAME)->update($params, [['shop_id', '=', $user_info['site_id']], ['user_id', '=', $user_info['uid']]]);
|
|
}
|
|
|
|
model(self::TABLE_NAME)->commit();
|
|
return $this->success($res);
|
|
} catch (\Exception $e) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $this->error('', '操作异常:' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除客服
|
|
* @param $site_id
|
|
* @param $uid
|
|
* @return array
|
|
*/
|
|
public function delete($site_id, $uid)
|
|
{
|
|
$condition = [
|
|
['site_id', '=', $site_id],
|
|
['uid', '=', $uid],
|
|
['app_module', '=', 'servicer']
|
|
];
|
|
|
|
$user_model = new UserModel();
|
|
$user_info = $user_model->getUserInfo($condition)['data'];
|
|
if (empty($user_info)) {
|
|
return $this->error('', '客服不存在');
|
|
}
|
|
|
|
model(self::TABLE_NAME)->startTrans();
|
|
try {
|
|
$res = $user_model->deleteUser($condition);
|
|
if ($res['code'] < 0) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $res;
|
|
}
|
|
|
|
$res = model(self::TABLE_NAME)->delete([['shop_id', '=', $site_id], ['user_id', '=', $uid]]);
|
|
|
|
model(self::TABLE_NAME)->commit();
|
|
return $this->success($res);
|
|
} catch (\Exception $e) {
|
|
model(self::TABLE_NAME)->rollback();
|
|
return $this->error('', '操作异常:' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取信息
|
|
* @param array $condition
|
|
* @param bool $field
|
|
* @return array
|
|
*/
|
|
public function getInfo($condition = [], $field = true)
|
|
{
|
|
$info = model(self::TABLE_NAME)->getInfo($condition, $field);
|
|
return $this->success($info);
|
|
}
|
|
|
|
/**
|
|
* 获取客服详情
|
|
* @param array $condition
|
|
* @param bool $field
|
|
* @return array
|
|
*/
|
|
public function getDetail($condition = [], $field = true)
|
|
{
|
|
$info = $this->getInfo($condition, $field)['data'];
|
|
if (!empty($info)) {
|
|
$user_model = new UserModel();
|
|
$info['user_info'] = $user_model->getUserInfo([['uid', '=', $info['user_id']]])['data'];
|
|
}
|
|
return $this->success($info);
|
|
}
|
|
|
|
/**
|
|
* 处理客服信息
|
|
* @param array $condition
|
|
* @param $site_id
|
|
* @return array
|
|
*/
|
|
public function handleServicerInfo(array $condition, $site_id)
|
|
{
|
|
$res = [
|
|
'nickname' => '',
|
|
'avatar' => '',
|
|
];
|
|
|
|
if (empty($condition)) {
|
|
$info = [];
|
|
} else {
|
|
$info = $this->getInfo($condition, 'nickname,avatar')['data'];
|
|
}
|
|
|
|
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* 获取列表
|
|
* @param array $condition
|
|
* @param bool $field
|
|
* @param string $order
|
|
* @param string $alias
|
|
* @param array $join
|
|
* @param string $group
|
|
* @param null $limit
|
|
* @return array
|
|
*/
|
|
public function getList($condition = [], $field = true, $order = 'id desc', $alias = '', $join = [], $group = '', $limit = null)
|
|
{
|
|
$res = model(self::TABLE_NAME)->getList($condition, $field, $order, $alias, $join, $group, $limit);
|
|
return $this->success($res);
|
|
}
|
|
|
|
/**
|
|
* 获取在线客服列表
|
|
* @param array $condition
|
|
* @param string $field
|
|
* @param string $order
|
|
* @return array
|
|
*/
|
|
public function getOnlineList(array $condition, $field = 'user_id', $order = 'id desc')
|
|
{
|
|
$res = $this->getList(array_merge($condition, [['online', '=', 1]]), $field, $order);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 分配客服
|
|
* @param array $condition
|
|
* @return array
|
|
*/
|
|
public function assigning(array $condition)
|
|
{
|
|
$servicer_list = $this->getOnlineList($condition)['data'];
|
|
$data = [];
|
|
|
|
foreach ($servicer_list as $val) {
|
|
$data[] = [
|
|
'user_id' => $val['user_id'],
|
|
'chat_count' => model('servicer_member')->getCount([
|
|
['servicer_id', '=', $val['user_id']],
|
|
['online', '=', 1],
|
|
])
|
|
];
|
|
}
|
|
if (!empty($data)) {
|
|
// 按照服务的会员人数最少的优先分配
|
|
$sort_data = array_column($data, 'chat_count');
|
|
array_multisort($sort_data, SORT_ASC, $data);
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
}
|