Files
cunkebao_v3/Server/application/cunkebao/controller/device/GetDeviceListV1Controller.php

151 lines
4.2 KiB
PHP
Raw Normal View History

2025-04-16 13:51:29 +08:00
<?php
2025-04-16 13:51:29 +08:00
namespace app\cunkebao\controller\device;
2025-04-16 16:10:37 +08:00
use app\common\model\Device as DeviceModel;
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\WechatFriendShip as WechatFriendShipModel;
2025-04-16 16:10:37 +08:00
use app\cunkebao\controller\BaseController;
use library\ResponseHelper;
2025-04-16 13:51:29 +08:00
/**
* 设备管理控制器
*/
2025-04-16 16:10:37 +08:00
class GetDeviceListV1Controller extends BaseController
2025-04-16 13:51:29 +08:00
{
/**
* 构建查询条件
*
* @param array $params
* @return array
*/
protected function makeWhere(array $params = []): array
{
// 关键词搜索同时搜索IMEI和备注
if (!empty($keyword = $this->request->param('keyword'))) {
2025-04-16 13:51:29 +08:00
$where[] = ['exp', "d.imei LIKE '%{$keyword}%' OR d.memo LIKE '%{$keyword}%'"];
}
// 设备在线状态
if (is_numeric($alive = $this->request->param('alive'))) {
2025-04-16 13:51:29 +08:00
$where['d.alive'] = $alive;
}
2025-04-16 16:10:37 +08:00
$where['d.companyId'] = $this->getUserInfo('companyId');
2025-04-16 13:51:29 +08:00
return array_merge($params, $where);
}
/**
* 获取指定用户的所有设备ID
*
* @return array
*/
protected function makeDeviceIdsWhere(): array
{
$deviceIds = DeviceUserModel::where(
[
'userId' => $this->getUserInfo('id'),
'companyId' => $this->getUserInfo('companyId')
]
2025-04-16 13:51:29 +08:00
)
->column('deviceId');
if (empty($deviceIds)) {
throw new \Exception('请联系管理员绑定设备', 403);
}
$where['d.id'] = array('in', $deviceIds);
2025-04-16 13:51:29 +08:00
return $where;
}
/**
* 获取设备列表
2025-04-17 15:33:49 +08:00
*
2025-04-16 13:51:29 +08:00
* @param array $where 查询条件
* @return \think\Paginator 分页对象
*/
protected function getDeviceList(array $where): \think\Paginator
2025-04-16 13:51:29 +08:00
{
$query = DeviceModel::alias('d')
->field([
'd.id', 'd.imei', 'd.memo', 'd.alive',
'l.wechatId',
'a.nickname', 'a.alias', '0 totalFriend'
])
->leftJoin('device_wechat_login l', 'd.id = l.deviceId and l.alive =' . DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE)
->leftJoin('wechat_account a', 'l.wechatId = a.wechatId')
2025-04-17 17:18:35 +08:00
->order('d.id desc');
2025-04-16 13:51:29 +08:00
foreach ($where as $key => $value) {
if (is_numeric($key) && is_array($value) && isset($value[0]) && $value[0] === 'exp') {
$query->whereExp('', $value[1]);
continue;
}
$query->where($key, $value);
}
return $query->paginate($this->request->param('limit/d', 10), false, ['page' => $this->request->param('page/d', 1)]);
2025-04-16 13:51:29 +08:00
}
/**
* 统计微信好友
*
2025-04-17 14:34:31 +08:00
* @param \think\Paginator $list
2025-04-16 13:51:29 +08:00
* @return array
*/
2025-04-17 14:34:31 +08:00
protected function countFriend(\think\Paginator $list): array
2025-04-16 13:51:29 +08:00
{
$resultSets = [];
2025-04-16 13:51:29 +08:00
foreach ($list->items() as $item) {
$sections = $item->toArray();
2025-04-16 13:51:29 +08:00
if ($item->wechatId) {
$sections['totalFriend'] = WechatFriendShipModel::where(
[
'ownerWechatId' => $item->wechatId,
'companyId' => $this->getUserInfo('companyId')
]
)
->count();
2025-04-16 13:51:29 +08:00
}
array_push($resultSets, $sections);
2025-04-16 13:51:29 +08:00
}
return $resultSets;
2025-04-16 13:51:29 +08:00
}
/**
* 获取设备列表
* @return \think\response\Json
*/
public function index()
{
try {
if ($this->getUserInfo('isAdmin') == UserModel::ADMIN_STP) {
2025-04-16 13:51:29 +08:00
$where = $this->makeWhere();
$result = $this->getDeviceList($where);
}
else {
$where = $this->makeWhere( $this->makeDeviceIdsWhere() );
$result = $this->getDeviceList($where);
2025-04-16 13:51:29 +08:00
}
return ResponseHelper::success(
[
'list' => $this->countFriend($result),
2025-04-16 13:51:29 +08:00
'total' => $result->total(),
]
);
2025-04-16 13:51:29 +08:00
} catch (\Exception $e) {
return ResponseHelper::error($e->getMessage(), $e->getCode());
2025-04-16 13:51:29 +08:00
}
}
}