| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- <?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;
- }
- }
|