私域操盘手 - 重写微信号管理

This commit is contained in:
柳清爽
2025-05-10 10:17:58 +08:00
parent 50cd82f5d3
commit c09864ee89
10 changed files with 306 additions and 204 deletions

View File

@@ -12,7 +12,7 @@ use think\Db;
/**
* 设备控制器
*/
class GetAddResultedDevicesController extends BaseController
class GetAddResultedV1Controller extends BaseController
{
/**
* 通过账号id 获取项目id。

View File

@@ -5,7 +5,7 @@ namespace app\cunkebao\controller\device;
use app\common\model\Device as DeviceModel;
use app\common\model\DeviceUser as DeviceUserModel;
use app\common\model\User as UserModel;
use app\common\model\WechatFriend;
use app\common\model\WechatFriend as WechatFriendModel;
use app\cunkebao\controller\BaseController;
use library\ResponseHelper;
@@ -22,8 +22,6 @@ class GetDeviceListV1Controller extends BaseController
*/
protected function makeWhere(array $params = []): array
{
$where = [];
// 关键词搜索同时搜索IMEI和备注
if (!empty($keyword = $this->request->param('keyword'))) {
$where[] = ['exp', "d.imei LIKE '%{$keyword}%' OR d.memo LIKE '%{$keyword}%'"];
@@ -47,8 +45,10 @@ class GetDeviceListV1Controller extends BaseController
protected function makeDeviceIdsWhere(): array
{
$deviceIds = DeviceUserModel::where(
$this->getUserInfo('id'),
$this->getUserInfo('companyId')
[
'userId' => $this->getUserInfo('id'),
'companyId' => $this->getUserInfo('companyId')
]
)
->column('deviceId');
@@ -56,7 +56,7 @@ class GetDeviceListV1Controller extends BaseController
throw new \Exception('请联系管理员绑定设备', 403);
}
$where['d.id'] = ['in', $deviceIds];
$where['d.id'] = array('in', $deviceIds);
return $where;
}
@@ -65,11 +65,9 @@ class GetDeviceListV1Controller extends BaseController
* 获取设备列表
*
* @param array $where 查询条件
* @param int $page 页码
* @param int $limit 每页数量
* @return \think\Paginator 分页对象
*/
protected function getDeviceList(array $where, int $page = 1, int $limit = 10): \think\Paginator
protected function getDeviceList(array $where): \think\Paginator
{
$query = DeviceModel::alias('d')
->field([
@@ -101,16 +99,16 @@ class GetDeviceListV1Controller extends BaseController
*/
protected function countFriend(\think\Paginator $list): array
{
$result = [];
$resultSets = [];
foreach ($list->items() as $item) {
$section = $item->toArray();
$sections = $item->toArray();
if ($item->wechatId) {
$section['totalFriend'] = WechatFriend::where(['ownerWechatId' => $section['wechatId']])->count();
$sections['totalFriend'] = WechatFriendModel::where(['ownerWechatId' => $item->wechatId])->count();
}
array_push($result, $section);
array_push($result, $sections);
}
return $result;
@@ -126,8 +124,10 @@ class GetDeviceListV1Controller extends BaseController
if ($this->getUserInfo('isAdmin') == UserModel::ADMIN_STP) {
$where = $this->makeWhere();
$result = $this->getDeviceList($where);
} else {
$where = $this->makeWhere($this->makeDeviceIdsWhere());
}
else {
$where = $this->makeWhere( $this->makeDeviceIdsWhere() );
$result = $this->getDeviceList($where);
}

View File

@@ -0,0 +1,263 @@
<?php
namespace app\cunkebao\controller\wechat;
use app\common\model\Device as DeviceModel;
use app\common\model\Device as DevicesModel;
use app\common\model\DeviceUser as DeviceUserModel;
use app\common\model\DeviceWechatLogin as DeviceWechatLoginModel;
use app\common\model\User as UserModel;
use app\common\model\WechatAccount as WechatAccountModel;
use app\common\model\WechatFriend as WechatFriendModel;
use app\cunkebao\controller\BaseController;
use library\ResponseHelper;
/**
* 微信控制器
*/
class GetWechatsOnDevicesV1Controller extends BaseController
{
/**
* TODO 计算今日可添加好友数量
*
* @param string $wechatId
* @return int
*/
protected function getCanAddFriendCount(string $wechatId): int
{
$canAddFriendCount = 20; // 最多限制 20 次
return $canAddFriendCount < 0 ? 0 : $canAddFriendCount;
}
/**
* TODO 计算今日新增好友数量
*
* @param string $wechatId
* @return int
*/
protected function getTodayNewFriendCount(string $wechatId): int
{
return 0;
}
/**
* TODO 获取微信加友状态
*
* @param string $wechatId
* @return int
*/
protected function getWechatAddFriendStatus(string $wechatId): int
{
return 1;
}
/**
* 获取微信好友数量
*
* @param string $ownerWechatId
* @return int
*/
protected function getFriendsCount(string $ownerWechatId): int
{
return WechatFriendModel::where(compact('ownerWechatId'))->count();
}
/**
* 获取微信所属设备
*
* @param string $wechatId
* @return string
*/
protected function getWhereOnDevice(string $wechatId): string
{
return DeviceModel::alias('d')
->where(
[
'l.wechatId' => $wechatId,
'l.alive' => DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE
]
)
->join('device_wechat_login l', 'd.id = l.deviceId')
->value('d.imei');
}
/**
* 主操盘手获取项目下所有设备的id
*
* @return array
* @throws \Exception
*/
protected function getCompanyDevicesId(): array
{
return DevicesModel::where(
[
'companyId' => $this->getUserInfo('companyId')
]
)
->column('id');
}
/**
* 非主操盘手获取分配的设备
*
* @return array
*/
protected function getUserDevicesId(): array
{
return DeviceUserModel::where(
[
'userId' => $this->getUserInfo('id'),
'companyId' => $this->getUserInfo('companyId')
]
)
->column('deviceId');
}
/**
* 根据不同角色,显示的设备数量不同
*
* @return array
* @throws \Exception
*/
protected function getDevicesId(): array
{
return ($this->getUserInfo('isAdmin') == UserModel::ADMIN_STP)
? $this->getCompanyDevicesId() // 主操盘手获取所有的设备
: $this->getUserDevicesId(); // 非主操盘手获取分配的设备
}
/**
* 获取有登录设备的微信id
*
* @return array
*/
protected function getWechatIdsOnDevices(): array
{
// 关联设备id查询过滤掉已删除的设备
if (empty($deviceIds = $this->getDevicesId())) {
throw new \Exception('暂无设备数据', 200);
}
return DeviceWechatLoginModel::where(
[
'companyId' => $this->getUserInfo('companyId'),
'alive' => DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE,
]
)
->where('deviceId', 'in', $deviceIds)
->column('wechatId');
}
/**
* 获取设备最新活跃时间
*
* @param string $wechatId
* @return string
*/
protected function getLatestActiveTime(string $wechatId): string
{
return date('Y-m-d H:i:s', strtotime('-1 day'));
}
/**
* 构建查询条件
*
* @param array $params
* @return array
*/
protected function makeWhere(array $params = []): array
{
if (empty($wechatIds = $this->getWechatIdsOnDevices())) {
throw new \Exception('设备尚未有登录微信', 200);
}
// 关键词搜索(同时搜索微信号和昵称)
if (!empty($keyword = $this->request->param('keyword'))) {
$where[] = ['exp', "w.alias LIKE '%{$keyword}%' OR w.nickname LIKE '%{$keyword}%'"];
}
$where['w.wechatId'] = array('in', implode(',', $wechatIds));
return array_merge($params, $where);
}
/**
* 获取在线微信账号列表
*
* @param array $where
* @return \think\Paginator 分页对象
*/
protected function getOnlineWechatList(array $where): \think\Paginator
{
$query = WechatAccountModel::alias('w')
->field([
'w.id', 'w.wechatId', 'w.nickname', 'w.avatar', 'w.s2_wechatAccountId'
])
->order('w.id desc');
foreach ($where as $key => $value) {
if (is_numeric($key) && is_array($value) && isset($value[0]) && $value[0] === 'exp') {
$query->whereExp('', $value[1]);
continue;
}
if (is_array($value)) {
$query->where($key, ...$value);
continue;
}
$query->where($key, $value);
}
return $query->paginate($this->request->param('limit/d', 10), false, ['page' => $this->request->param('page/d', 1)]);
}
/**
* 构建返回数据
*
* @param \think\Paginator $result
* @return array
*/
protected function makeResultedSet(\think\Paginator $result): array
{
$resultSets = [];
foreach ($result->items() as $item) {
$sections = $item->toArray() + [
'times' => $this->getCanAddFriendCount($item->wechatId),
'addedCount' => $this->getTodayNewFriendCount($item->wechatId),
'wechatStatus' => $this->getWechatAddFriendStatus($item->wechatId),
'totalFriend' => $this->getFriendsCount($item->wechatId),
'deviceMemo' => $this->getWhereOnDevice($item->wechatId),
'activeTime' => $this->getLatestActiveTime($item->wechatId),
];
array_push($resultSets, $sections);
}
return $resultSets;
}
/**
* 获取在线微信账号列表
* @return \think\response\Json
*/
public function index()
{
try {
$result = $this->getOnlineWechatList(
$this->makeWhere()
);
return ResponseHelper::success(
[
'list' => $this->makeResultedSet($result),
'total' => $result->total(),
]
);
} catch (\Exception $e) {
return ResponseHelper::error($e->getMessage(), $e->getCode());
}
}
}