Files
cunkebao_v3/Server/application/api/controller/DeviceController.php

408 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\controller;
use app\api\model\DeviceModel;
use app\api\model\DeviceGroupModel;
use think\facade\Request;
use think\facade\Env;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\ErrorCorrectionLevel;
class DeviceController extends BaseController
{
/************************ 设备管理相关接口 ************************/
/**
* 获取设备列表
* @param string $pageIndex 页码
* @param string $pageSize 每页数量
* @param bool $isJob 是否为定时任务调用
* @return \think\response\Json
*/
public function getlist($pageIndex = '',$pageSize = '',$isJob = false)
{
// 获取授权token
$authorization = trim($this->request->header('authorization', $this->authorization));
if (empty($authorization)) {
if($isJob){
return json_encode(['code'=>500,'msg'=>'缺少授权信息']);
}else{
return errorJson('缺少授权信息');
}
}
try {
// 构建请求参数
$params = [
'accountId' => $this->request->param('accountId', ''),
'keyword' => $this->request->param('keyword', ''),
'imei' => $this->request->param('imei', ''),
'groupId' => $this->request->param('groupId', ''),
'brand' => $this->request->param('brand', ''),
'model' => $this->request->param('model', ''),
'deleteType' => $this->request->param('deleteType', 'unDeleted'),
'operatingSystem' => $this->request->param('operatingSystem', ''),
'softwareVersion' => $this->request->param('softwareVersion', ''),
'phoneAppVersion' => $this->request->param('phoneAppVersion', ''),
'recorderVersion' => $this->request->param('recorderVersion', ''),
'contactsVersion' => $this->request->param('contactsVersion', ''),
'rooted' => $this->request->param('rooted', ''),
'xPosed' => $this->request->param('xPosed', ''),
'alive' => $this->request->param('alive', ''),
'hasWechat' => $this->request->param('hasWechat', ''),
'departmentId' => $this->request->param('departmentId', ''),
'pageIndex' => !empty($pageIndex) ? $pageIndex : $this->request->param('pageIndex', 0),
'pageSize' => !empty($pageSize) ? $pageSize : $this->request->param('pageSize', 20)
];
// 设置请求头
$headerData = ['client:system'];
$header = setHeader($headerData, $authorization, 'plain');
// 发送请求获取设备列表
$result = requestCurl($this->baseUrl . 'api/device/pageResult', $params, 'GET', $header);
$response = handleApiResponse($result);
// 保存数据到数据库
if (!empty($response['results'])) {
foreach ($response['results'] as $item) {
$this->saveDevice($item);
}
}
if($isJob){
return json_encode(['code'=>200,'msg'=>'success','data'=>$response]);
}else{
return successJson($response);
}
} catch (\Exception $e) {
if($isJob){
return json_encode(['code'=>500,'msg'=>'获取设备列表失败:' . $e->getMessage()]);
}else{
return errorJson('获取设备列表失败:' . $e->getMessage());
}
}
}
/**
* 生成设备二维码
* @param int $accountId 账号ID
* @return \think\response\Json
*/
public function addDevice($accountId = 0)
{
if (empty($accountId)) {
$accountId = $this->request->param('accountId', '');
}
if (empty($accountId)) {
return errorJson('账号ID不能为空');
}
try {
// 获取环境配置
$tenantGuid = Env::get('api.guid', '');
$deviceSocketHost = Env::get('api.deviceSocketHost', '');
if (empty($tenantGuid) || empty($deviceSocketHost)) {
return errorJson('环境配置不完整请检查api.guid和api.deviceSocketHost配置');
}
// 构建设备配置数据
$data = [
'tenantGuid' => $tenantGuid,
'deviceSocketHost' => $deviceSocketHost,
'checkVersionUrl' => '',
'accountId' => intval($accountId)
];
// 将数据转换为JSON
$jsonData = json_encode($data);
// 生成二维码图片
$qrCode = $this->generateQrCodeImage($jsonData);
return successJson([
'qrCode' => $qrCode,
'config' => $data
]);
} catch (\Exception $e) {
return errorJson('生成设备二维码失败:' . $e->getMessage());
}
}
/**
* 创建设备分组
* @return \think\response\Json
*/
public function createGroup()
{
// 获取授权token
$authorization = trim($this->request->header('authorization', $this->authorization));
if (empty($authorization)) {
return errorJson('缺少授权信息');
}
try {
// 获取参数
$groupName = $this->request->param('groupName', '');
$groupMemo = $this->request->param('groupMemo', '');
if (empty($groupName)) {
return errorJson('分组名称不能为空');
}
// 构建请求参数
$params = [
'groupName' => $groupName,
'groupMemo' => $groupMemo
];
// 设置请求头
$headerData = ['client:system'];
$header = setHeader($headerData, $authorization, 'plain');
// 发送请求
$result = requestCurl($this->baseUrl . 'api/DeviceGroup/new', $params, 'POST', $header);
$response = handleApiResponse($result);
return successJson($response);
} catch (\Exception $e) {
return errorJson('创建设备分组失败:' . $e->getMessage());
}
}
/**
* 更新设备分组
* @return \think\response\Json
*/
public function updateDeviceGroup()
{
// 获取授权token
$authorization = trim($this->request->header('authorization', $this->authorization));
if (empty($authorization)) {
return errorJson('缺少授权信息');
}
try {
// 获取参数
$id = $this->request->param('id', '');
$groupId = $this->request->param('groupId', '');
if (empty($id)) {
return errorJson('设备ID不能为空');
}
if (empty($groupId)) {
return errorJson('分组ID不能为空');
}
// 设置请求头
$headerData = ['client:system'];
$header = setHeader($headerData, $authorization, 'plain');
// 发送请求
$result = requestCurl($this->baseUrl . 'api/device/updateDeviceGroup?id=' . $id . '&groupId=' . $groupId, [], 'PUT', $header);
$response = handleApiResponse($result);
return successJson($response);
} catch (\Exception $e) {
return errorJson('更新设备分组失败:' . $e->getMessage());
}
}
/**
* 更新设备分组
* @return \think\response\Json
*/
public function updateaccount()
{
// 获取授权token
$authorization = trim($this->request->header('authorization', $this->authorization));
if (empty($authorization)) {
return errorJson('缺少授权信息');
}
try {
// 获取参数
$id = $this->request->param('id', '');
$accountId = $this->request->param('accountId', '');
if (empty($id)) {
return errorJson('设备ID不能为空');
}
if (empty($accountId)) {
return errorJson('账号id不能为空');
}
// 设置请求头
$headerData = ['client:system'];
$header = setHeader($headerData, $authorization, 'plain');
// 发送请求
$result = requestCurl($this->baseUrl . 'api/device/updateaccount?accountId=' . $accountId . '&deviceId=' . $id, [], 'PUT', $header);
$response = handleApiResponse($result);
if(empty($response)){
return successJson([],'操作成功');
}else{
return errorJson([],$response);
}
} catch (\Exception $e) {
return errorJson('更新设备分组失败:' . $e->getMessage());
}
}
/**
* 获取设备分组列表
* @return \think\response\Json
*/
public function getGroupList()
{
// 获取授权token
$authorization = trim($this->request->header('authorization', $this->authorization));
if (empty($authorization)) {
return errorJson('缺少授权信息');
}
try {
// 设置请求头
$headerData = ['client:system'];
$header = setHeader($headerData, $authorization, 'plain');
// 发送请求
$result = requestCurl($this->baseUrl . 'api/DeviceGroup/list', [], 'GET', $header);
$response = handleApiResponse($result);
// 保存数据到数据库
if (!empty($response)) {
foreach ($response as $item) {
$this->saveDeviceGroup($item);
}
}
return successJson($response);
} catch (\Exception $e) {
return errorJson('获取设备分组列表失败:' . $e->getMessage());
}
}
/************************ 私有辅助方法 ************************/
/**
* 保存设备数据到数据库
* @param array $item 设备数据
*/
private function saveDevice($item)
{
$data = [
'id' => isset($item['id']) ? $item['id'] : '',
'userName' => isset($item['userName']) ? $item['userName'] : '',
'nickname' => isset($item['nickname']) ? $item['nickname'] : '',
'realName' => isset($item['realName']) ? $item['realName'] : '',
'groupName' => isset($item['groupName']) ? $item['groupName'] : '',
'wechatAccounts' => isset($item['wechatAccounts']) ? json_encode($item['wechatAccounts']) : json_encode([]),
'alive' => isset($item['alive']) ? $item['alive'] : false,
'lastAliveTime' => isset($item['lastAliveTime']) ? $item['lastAliveTime'] : null,
'tenantId' => isset($item['tenantId']) ? $item['tenantId'] : 0,
'groupId' => isset($item['groupId']) ? $item['groupId'] : 0,
'currentAccountId' => isset($item['currentAccountId']) ? $item['currentAccountId'] : 0,
'imei' => $item['imei'],
'memo' => isset($item['memo']) ? $item['memo'] : '',
'createTime' => isset($item['createTime']) ? strtotime($item['createTime']) : 0,
'isDeleted' => isset($item['isDeleted']) ? $item['isDeleted'] : false,
'deletedAndStop' => isset($item['deletedAndStop']) ? $item['deletedAndStop'] : false,
'deleteTime' => empty($item['isDeleted']) ? 0 : strtotime($item['deleteTime']),
'rooted' => isset($item['rooted']) ? $item['rooted'] : false,
'xPosed' => isset($item['xPosed']) ? $item['xPosed'] : false,
'brand' => isset($item['brand']) ? $item['brand'] : '',
'model' => isset($item['model']) ? $item['model'] : '',
'operatingSystem' => isset($item['operatingSystem']) ? $item['operatingSystem'] : '',
'softwareVersion' => isset($item['softwareVersion']) ? $item['softwareVersion'] : '',
'extra' => isset($item['extra']) ? json_encode($item['extra']) : json_encode([]),
'phone' => isset($item['phone']) ? $item['phone'] : '',
'lastUpdateTime' => isset($item['lastUpdateTime']) ? ($item['lastUpdateTime'] == '0001-01-01T00:00:00' ? 0 : strtotime($item['lastUpdateTime'])) : 0
];
// 使用imei作为唯一性判断
$device = DeviceModel::where('id', $item['id'])->find();
if ($device) {
$device->save($data);
} else {
// autoLike自动点赞
// momentsSync朋友圈同步
// autoCustomerDev自动开发客户
// groupMessageDeliver群消息推送
// autoGroup自动建群
$data['taskConfig'] = json_encode([
'autoLike' => true,
'momentsSync' => true,
'autoCustomerDev' => true,
'groupMessageDeliver' => true,
'autoGroup' => true,
]);
DeviceModel::create($data);
}
}
/**
* 保存设备分组数据到数据库
* @param array $item 设备分组数据
*/
private function saveDeviceGroup($item)
{
$data = [
'id' => $item['id'],
'tenantId' => $item['tenantId'],
'groupName' => $item['groupName'],
'groupMemo' => $item['groupMemo'],
'count' => isset($item['count']) ? $item['count'] : 0,
'createTime' => $item['createTime'] == '0001-01-01T00:00:00' ? 0 : strtotime($item['createTime'])
];
// 使用ID作为唯一性判断
$group = DeviceGroupModel::where('id', $item['id'])->find();
if ($group) {
$group->save($data);
} else {
DeviceGroupModel::create($data);
}
}
/**
* 生成二维码图片base64格式
* @param string $data 二维码数据
* @return string base64编码的图片
*/
private function generateQrCodeImage($data)
{
// 使用endroid/qr-code 2.5版本生成二维码
$qrCode = new QrCode($data);
$qrCode->setSize(300);
$qrCode->setMargin(10);
$qrCode->setWriterByName('png');
$qrCode->setEncoding('UTF-8');
// 使用枚举常量而不是字符串
$qrCode->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
// 直接获取base64内容
$base64 = 'data:image/png;base64,' . base64_encode($qrCode->writeString());
return $base64;
}
}