徐总多门店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jiuhaoshenghuo/app/services/work/WorkGroupChatAuthServices.php

229 lines
7.9 KiB

2 months ago
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\work;
use app\dao\work\WorkGroupChatAuthDao;
use app\services\BaseServices;
use app\services\user\label\UserLabelServices;
use crmeb\services\wechat\Work;
use crmeb\traits\service\ContactWayQrCode;
use crmeb\traits\ServicesTrait;
use think\exception\ValidateException;
/**
* 企业微信自动拉群
* Class WorkGroupChatAuthServices
* @package app\services\work
* @mixin WorkGroupChatAuthDao
*/
class WorkGroupChatAuthServices extends BaseServices
{
use ServicesTrait, ContactWayQrCode;
/**
* WorkGroupChatAuthServices constructor.
* @param WorkGroupChatAuthDao $dao
*/
public function __construct(WorkGroupChatAuthDao $dao)
{
$this->dao = $dao;
}
/**
* @param array $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getList(array $where)
{
[$page, $limit] = $this->getPageValue();
$list = $this->dao->getDataList($where, ['*'], $page, $limit, 'create_time');
$chatIds = [];
$labels = [];
foreach ($list as $item) {
$chatIds = array_merge($chatIds, $item['chat_id']);
$labels = array_merge($labels, $item['label'] ?? []);
}
$chatIds = array_merge(array_unique(array_filter($chatIds)));
$labels = array_merge(array_unique(array_filter($labels)));
/** @var UserLabelServices $userLabelService */
$userLabelService = app()->make(UserLabelServices::class);
$labelList = $userLabelService->getColumn([
['tag_id', 'in', $labels]
], 'label_name', 'tag_id');
/** @var WorkGroupChatServices $service */
$service = app()->make(WorkGroupChatServices::class);
$chatList = $service->getColumn([
['chat_id', 'in', $chatIds]
], 'name', 'chat_id');
foreach ($list as &$item) {
$chatNewList = $labelNewList = [];
foreach ($chatList as $key => $val) {
if (in_array($key, $item['chat_id'])) {
$chatNewList[] = ['name' => $val, 'chat_id' => $key];
}
}
if ($item['label']) {
foreach ($labelList as $k => $v) {
if (in_array($k, $item['label'])) {
$labelNewList[] = ['name' => $v, 'label_id' => $k];
}
}
}
$item['chat_list'] = $chatNewList;
$item['label_list'] = $labelNewList;
}
$count = $this->dao->count($where);
return compact('list', 'count');
}
/**
* 保存或者修改自动拉群
* @param array $data
* @param int $id
* @return mixed
*/
public function saveGroupChatAuth(array $data, int $id = 0)
{
return $this->transaction(function () use ($data, $id) {
if ($id) {
$authInfo = $this->dao->get(['id' => $id], ['config_id']);
$this->dao->update($id, $data);
$this->handleGroupChat($data, $id, $authInfo->config_id);
} else {
$res = $this->dao->save($data);
$id = $res->id;
$this->handleGroupChat($data, $id);
}
return $id;
});
}
/**
* 配置加入群聊并获取二维码
* @param string $configId
* @param array $data
* @param int $id
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
protected function handleGroupChat(array $data, int $id, string $configId = '')
{
//设置进群配置
if ($configId) {
$qrCode = Work::groupChat()->updateJoinWay($configId, $data['group_name'], $data['chat_id'], 'groupChat-' . $id, (int)$data['auth_group_chat'], (int)$data['group_num']);
} else {
$qrCode = Work::groupChat()->addJoinWay($data['group_name'], $data['chat_id'], 'groupChat-' . $id, (int)$data['auth_group_chat'], (int)$data['group_num']);
}
if (0 !== $qrCode['errcode']) {
throw new ValidateException($qrCode['errmsg']);
}
if (!$configId) {
$this->dao->update($id, ['config_id' => $qrCode['config_id']]);
$configId = $qrCode['config_id'];
}
//获取群二维码
$qrCodeInfo = Work::groupChat()->getJoinWay($configId);
if (0 !== $qrCodeInfo['errcode']) {
throw new ValidateException($qrCodeInfo['errmsg']);
}
$this->dao->update($id, ['qr_code' => $qrCodeInfo['join_way']['qr_code']]);
}
/**
* 删除客户进群配置
* @param int $id
* @return bool
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function deleteGroupChatAuth(int $id)
{
$groupChatAuthInfo = $this->dao->get($id);
if (!$groupChatAuthInfo) {
throw new ValidateException('删除的群聊配置不存在');
}
//删除入群配置
if ($groupChatAuthInfo->config_id) {
$qrCode = Work::groupChat()->deleteJoinWay($groupChatAuthInfo->config_id);
if (0 !== $qrCode['errcode']) {
throw new ValidateException($qrCode['errmsg']);
}
}
return $this->dao->destroy($id);
}
/**
* 获取群配置
* @param int $id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getGrouChatAuthInfo(int $id)
{
$groupChatAuthInfo = $this->dao->get($id);
if (!$groupChatAuthInfo) {
throw new ValidateException('删除的群聊配置不存在');
}
$groupChatAuthInfo['labelList'] = $groupChatAuthInfo['chatList'] = [];
if ($groupChatAuthInfo->label) {
/** @var UserLabelServices $userLabelService */
$userLabelService = app()->make(UserLabelServices::class);
$groupChatAuthInfo['labelList'] = $userLabelService->getColumn([
['tag_id', 'in', $groupChatAuthInfo->label]
], 'label_name,tag_id');
}
if ($groupChatAuthInfo->chat_id) {
/** @var WorkGroupChatServices $service */
$service = app()->make(WorkGroupChatServices::class);
$groupChatAuthInfo['chatList'] = $service->getColumn([
['chat_id', 'in', $groupChatAuthInfo->chat_id]
], 'name,chat_id');
}
return $groupChatAuthInfo->toArray();
}
/**
*
* @param int $groupAuthId
* @param string $userid
* @param string $externalUserID
*/
public function clientAddLabel(int $groupAuthId, string $userid, string $externalUserID)
{
$label = $this->dao->value(['id' => $groupAuthId], 'label');
$resTage = Work::markTags($userid, $externalUserID, $label);
if (0 !== $resTage['errcode']) {
throw new ValidateException($resTage['errmsg']);
}
}
}