From 2d28a912539838427265461d573916afda5d6262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E6=B8=85=E7=88=BD?= Date: Mon, 31 Mar 2025 17:33:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cunkebao/api/devices.ts | 16 ++ Cunkebao/app/devices/[id]/page.tsx | 163 +++++++++++++++++- Server/application/devices/config/route.php | 1 + .../application/devices/controller/Device.php | 69 ++++++++ 4 files changed, 240 insertions(+), 9 deletions(-) diff --git a/Cunkebao/api/devices.ts b/Cunkebao/api/devices.ts index eece0035..e07f0cfc 100644 --- a/Cunkebao/api/devices.ts +++ b/Cunkebao/api/devices.ts @@ -33,6 +33,22 @@ export const fetchDeviceDetail = async (id: string | number): Promise>(`/v1/devices/${id}`); }; +// 更新设备任务配置 +export const updateDeviceTaskConfig = async ( + id: string | number, + config: { + autoAddFriend?: boolean; + autoReply?: boolean; + momentsSync?: boolean; + aiChat?: boolean; + } +): Promise> => { + return api.post>(`/v1/devices/task-config`, { + id, + ...config + }); +}; + // 删除设备 export const deleteDevice = async (id: number): Promise> => { return api.delete>(`/v1/devices/${id}`); diff --git a/Cunkebao/app/devices/[id]/page.tsx b/Cunkebao/app/devices/[id]/page.tsx index cd258090..b0107eff 100644 --- a/Cunkebao/app/devices/[id]/page.tsx +++ b/Cunkebao/app/devices/[id]/page.tsx @@ -10,7 +10,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Switch } from "@/components/ui/switch" import { Label } from "@/components/ui/label" import { ScrollArea } from "@/components/ui/scroll-area" -import { fetchDeviceDetail } from "@/api/devices" +import { fetchDeviceDetail, updateDeviceTaskConfig } from "@/api/devices" import { toast } from "sonner" interface WechatAccount { @@ -37,7 +37,7 @@ interface Device { features: { autoAddFriend: boolean autoReply: boolean - contentSync: boolean + momentsSync: boolean aiChat: boolean } history: { @@ -68,6 +68,12 @@ export default function DeviceDetailPage() { const [device, setDevice] = useState(null) const [activeTab, setActiveTab] = useState("info") const [loading, setLoading] = useState(true) + const [savingFeatures, setSavingFeatures] = useState({ + autoAddFriend: false, + autoReply: false, + momentsSync: false, + aiChat: false + }) useEffect(() => { if (!params.id) return @@ -91,16 +97,47 @@ export default function DeviceDetailPage() { historicalIds: [], // 服务端暂无此数据 wechatAccounts: [], // 默认空数组 history: [], // 服务端暂无此数据 - features: serverData.features || { + features: { autoAddFriend: false, autoReply: false, - contentSync: false, + momentsSync: false, aiChat: false }, totalFriend: serverData.totalFriend || 0, thirtyDayMsgCount: serverData.thirtyDayMsgCount || 0 } + // 解析features + if (serverData.features) { + // 如果后端直接返回了features对象,使用它 + formattedDevice.features = { + autoAddFriend: Boolean(serverData.features.autoAddFriend), + autoReply: Boolean(serverData.features.autoReply), + momentsSync: Boolean(serverData.features.momentsSync || serverData.features.contentSync), + aiChat: Boolean(serverData.features.aiChat) + } + } else if (serverData.taskConfig) { + try { + // 解析taskConfig字段 + let taskConfig = serverData.taskConfig + if (typeof taskConfig === 'string') { + taskConfig = JSON.parse(taskConfig) + } + + if (taskConfig) { + console.log('解析的taskConfig:', taskConfig); + formattedDevice.features = { + autoAddFriend: Boolean(taskConfig.autoAddFriend), + autoReply: Boolean(taskConfig.autoReply), + momentsSync: Boolean(taskConfig.momentsSync), + aiChat: Boolean(taskConfig.aiChat) + } + } + } catch (err) { + console.error('解析taskConfig失败:', err) + } + } + // 如果有微信账号信息,构建微信账号对象 if (serverData.wechatId) { formattedDevice.wechatAccounts = [ @@ -169,7 +206,7 @@ export default function DeviceDetailPage() { features: { autoAddFriend: true, autoReply: true, - contentSync: false, + momentsSync: false, aiChat: true, }, history: [ @@ -193,6 +230,74 @@ export default function DeviceDetailPage() { fetchDevice() }, [params.id]) + // 处理功能开关状态变化 + const handleFeatureChange = async (feature: keyof Device['features'], checked: boolean) => { + if (!device) return + + // 避免已经在处理中的功能被重复触发 + if (savingFeatures[feature]) { + return + } + + setSavingFeatures(prev => ({ ...prev, [feature]: true })) + + try { + // 准备更新后的功能状态 + const updatedFeatures = { ...device.features, [feature]: checked } + + // 创建API请求参数 + const configUpdate = { [feature]: checked } + + // 立即更新UI状态,提供即时反馈 + setDevice(prev => prev ? { + ...prev, + features: updatedFeatures + } : null) + + // 调用API更新服务器配置 + const response = await updateDeviceTaskConfig(device.id, configUpdate) + + if (response && response.code === 200) { + toast.success(`${getFeatureName(feature)}${checked ? '已启用' : '已禁用'}`) + } else { + // 如果请求失败,回滚UI变更 + setDevice(prev => prev ? { + ...prev, + features: { ...prev.features, [feature]: !checked } + } : null) + + // 处理错误信息,使用类型断言解决字段不一致问题 + const anyResponse = response as any; + const errorMsg = anyResponse ? (anyResponse.message || anyResponse.msg || '未知错误') : '未知错误'; + toast.error(`更新失败: ${errorMsg}`) + } + } catch (error) { + console.error(`更新${getFeatureName(feature)}失败:`, error) + + // 异常情况下也回滚UI变更 + setDevice(prev => prev ? { + ...prev, + features: { ...prev.features, [feature]: !checked } + } : null) + + toast.error('更新失败,请稍后重试') + } finally { + setSavingFeatures(prev => ({ ...prev, [feature]: false })) + } + } + + // 获取功能中文名称 + const getFeatureName = (feature: string): string => { + const nameMap: Record = { + autoAddFriend: '自动加好友', + autoReply: '自动回复', + momentsSync: '朋友圈同步', + aiChat: 'AI会话' + } + + return nameMap[feature] || feature + } + if (loading || !device) { return
加载中...
} @@ -261,28 +366,68 @@ export default function DeviceDetailPage() {
自动通过好友验证
- +
+ {savingFeatures.autoAddFriend && ( +
+ )} + handleFeatureChange('autoAddFriend', checked)} + disabled={savingFeatures.autoAddFriend} + className="data-[state=checked]:bg-blue-500 transition-all duration-200" + /> +
自动回复好友消息
- +
+ {savingFeatures.autoReply && ( +
+ )} + handleFeatureChange('autoReply', checked)} + disabled={savingFeatures.autoReply} + className="data-[state=checked]:bg-blue-500 transition-all duration-200" + /> +
自动同步朋友圈内容
- +
+ {savingFeatures.momentsSync && ( +
+ )} + handleFeatureChange('momentsSync', checked)} + disabled={savingFeatures.momentsSync} + className="data-[state=checked]:bg-blue-500 transition-all duration-200" + /> +
启用AI智能对话
- +
+ {savingFeatures.aiChat && ( +
+ )} + handleFeatureChange('aiChat', checked)} + disabled={savingFeatures.aiChat} + className="data-[state=checked]:bg-blue-500 transition-all duration-200" + /> +
diff --git a/Server/application/devices/config/route.php b/Server/application/devices/config/route.php index c7efd83f..5c92d024 100644 --- a/Server/application/devices/config/route.php +++ b/Server/application/devices/config/route.php @@ -16,6 +16,7 @@ Route::group('v1/', function () { Route::post('', 'app\\devices\\controller\\Device@save'); // 添加设备 Route::put('refresh', 'app\\devices\\controller\\Device@refresh'); // 刷新设备状态 Route::delete(':id', 'app\\devices\\controller\\Device@delete'); // 删除设备 + Route::post('task-config', 'app\\devices\\controller\\Device@updateTaskConfig'); // 更新设备任务配置 }); // 设备微信相关 diff --git a/Server/application/devices/controller/Device.php b/Server/application/devices/controller/Device.php index db574c48..24595a65 100644 --- a/Server/application/devices/controller/Device.php +++ b/Server/application/devices/controller/Device.php @@ -396,4 +396,73 @@ class Device extends Controller ]); } } + + /** + * 更新设备任务配置 + * @return \think\response\Json + */ + public function updateTaskConfig() + { + // 获取请求参数 + $data = $this->request->post(); + + // 验证参数 + if (empty($data['id'])) { + return json(['code' => 400, 'msg' => '设备ID不能为空']); + } + + // 转换为整型,确保ID格式正确 + $deviceId = intval($data['id']); + + // 先获取设备信息,确认设备存在且未删除 + $device = \app\devices\model\Device::where('id', $deviceId) + ->where('isDeleted', 0) + ->find(); + + if (!$device) { + return json(['code' => 404, 'msg' => '设备不存在或已删除']); + } + + // 读取原taskConfig,如果存在则解析 + $taskConfig = []; + if (!empty($device['taskConfig'])) { + $taskConfig = json_decode($device['taskConfig'], true) ?: []; + } + + // 更新需要修改的配置项 + $updateFields = ['autoAddFriend', 'autoReply', 'momentsSync', 'aiChat']; + $hasUpdate = false; + + foreach ($updateFields as $field) { + if (isset($data[$field])) { + // 将值转换为布尔类型存储 + $taskConfig[$field] = (bool)$data[$field]; + $hasUpdate = true; + } + } + + // 如果没有需要更新的字段,直接返回成功 + if (!$hasUpdate) { + return json(['code' => 200, 'msg' => '更新成功', 'data' => ['taskConfig' => $taskConfig]]); + } + + // 更新设备taskConfig字段 + $result = \app\devices\model\Device::where('id', $deviceId) + ->update([ + 'taskConfig' => json_encode($taskConfig), + 'updateTime' => time() + ]); + + if ($result) { + return json([ + 'code' => 200, + 'msg' => '更新任务配置成功', + 'data' => [ + 'taskConfig' => $taskConfig + ] + ]); + } else { + return json(['code' => 500, 'msg' => '更新任务配置失败']); + } + } } \ No newline at end of file From 23fcc47d55e4563bc6485d255758572ab016dfef Mon Sep 17 00:00:00 2001 From: Ghost <106998207@qq.com> Date: Tue, 1 Apr 2025 09:26:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=98=9F=E5=88=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/DeviceController.php | 20 +++- .../controller/WechatChatroomController.php | 69 ++++++----- .../api/controller/WechatFriendController.php | 35 ++++-- .../command/WechatFriendCommand.php | 2 +- Server/application/job/DeviceListJob.php | 2 +- Server/application/job/WechatChatroomJob.php | 4 +- Server/application/job/WechatFriendJob.php | 17 +-- Server/application/store/config/route.php | 7 ++ .../store/controller/BaseController.php | 66 +++++++++++ .../controller/SystemConfigController.php | 107 ++++++++++++++++++ 10 files changed, 274 insertions(+), 55 deletions(-) create mode 100644 Server/application/store/controller/BaseController.php create mode 100644 Server/application/store/controller/SystemConfigController.php diff --git a/Server/application/api/controller/DeviceController.php b/Server/application/api/controller/DeviceController.php index a10a9a1d..fa1d52d5 100644 --- a/Server/application/api/controller/DeviceController.php +++ b/Server/application/api/controller/DeviceController.php @@ -14,12 +14,16 @@ class DeviceController extends BaseController * 获取设备列表 * @return \think\response\Json */ - public function getlist($pageIndex = '',$pageSize = '',$authorization = '') + public function getlist($pageIndex = '',$pageSize = '',$authorization = '',$isJob = false) { // 获取授权token $authorization = !empty($authorization) ? $authorization : trim($this->request->header('authorization', '')); if (empty($authorization)) { - return errorJson('缺少授权信息'); + if($isJob){ + return json_encode(['code'=>500,'msg'=>'缺少授权信息']); + }else{ + return errorJson('缺少授权信息'); + } } try { @@ -61,9 +65,17 @@ class DeviceController extends BaseController } } - return successJson($response); + if($isJob){ + return json_encode(['code'=>200,'msg'=>'success','data'=>$response]); + }else{ + return successJson($response); + } } catch (\Exception $e) { - return errorJson('获取设备列表失败:' . $e->getMessage()); + if($isJob){ + return json_encode(['code'=>500,'msg'=>'获取设备列表失败:' . $e->getMessage()]); + }else{ + return errorJson('获取设备列表失败:' . $e->getMessage()); + } } } diff --git a/Server/application/api/controller/WechatChatroomController.php b/Server/application/api/controller/WechatChatroomController.php index e78569a6..0e9059e3 100644 --- a/Server/application/api/controller/WechatChatroomController.php +++ b/Server/application/api/controller/WechatChatroomController.php @@ -13,13 +13,17 @@ class WechatChatroomController extends BaseController * 获取微信群聊列表 * @return \think\response\Json */ - public function getlist() + public function getlist($pageIndex = '',$pageSize = '',$authorization = '',$isJob = false) { // 获取授权token - $authorization = trim($this->request->header('authorization', '')); - if (empty($authorization)) { + $authorization = !empty($authorization) ? $authorization : trim($this->request->header('authorization', '')); + if (empty($authorization)) { + if($isJob){ + return json_encode(['code'=>500,'msg'=>'缺少授权信息']); + }else{ return errorJson('缺少授权信息'); } + } try { // 构建请求参数 @@ -31,16 +35,16 @@ class WechatChatroomController extends BaseController 'groupId' => $this->request->param('groupId', ''), 'wechatChatroomId' => $this->request->param('wechatChatroomId', 0), 'memberKeyword' => $this->request->param('memberKeyword', ''), - 'pageIndex' => $this->request->param('pageIndex', 0), - 'pageSize' => $this->request->param('pageSize', 20) + 'pageIndex' => !empty($pageIndex) ? $pageIndex : input('pageIndex', 0), + 'pageSize' => !empty($pageSize) ? $pageSize : input('pageSize', 20) ]; // 设置请求头 $headerData = ['client:system']; - $header = setHeader($headerData, $authorization, 'plain'); + $header = setHeader($headerData, $authorization, 'json'); // 发送请求获取群聊列表 - $result = requestCurl($this->baseUrl . 'api/WechatChatroom/pagelist', $params, 'GET', $header); + $result = requestCurl($this->baseUrl . 'api/WechatChatroom/pagelist', $params, 'GET', $header,'json'); $response = handleApiResponse($result); // 保存数据到数据库 @@ -50,7 +54,11 @@ class WechatChatroomController extends BaseController } } - return successJson($response); + if($isJob){ + return json_encode(['code'=>200,'msg'=>'success','data'=>$response]); + }else{ + return successJson($response); + } } catch (\Exception $e) { return errorJson('获取微信群聊列表失败:' . $e->getMessage()); } @@ -63,6 +71,7 @@ class WechatChatroomController extends BaseController private function saveChatroom($item) { $data = [ + 'id' => $item['id'], 'wechatAccountId' => $item['wechatAccountId'], 'wechatAccountAlias' => $item['wechatAccountAlias'], 'wechatAccountWechatId' => $item['wechatAccountWechatId'], @@ -70,29 +79,27 @@ class WechatChatroomController extends BaseController 'wechatAccountNickname' => $item['wechatAccountNickname'], 'chatroomId' => $item['chatroomId'], 'hasMe' => $item['hasMe'], - 'chatroomOwnerNickname' => $item['chatroomOwnerNickname'], - 'chatroomOwnerAvatar' => $item['chatroomOwnerAvatar'], + 'chatroomOwnerNickname' => isset($item['chatroomOwnerNickname']) ? $item['chatroomOwnerNickname'] : '', + 'chatroomOwnerAvatar' => isset($item['chatroomOwnerAvatar']) ? $item['chatroomOwnerAvatar'] : '', 'conRemark' => isset($item['conRemark']) ? $item['conRemark'] : '', - 'nickname' => $item['nickname'], - 'pyInitial' => $item['pyInitial'], - 'quanPin' => $item['quanPin'], - 'chatroomAvatar' => $item['chatroomAvatar'], + 'nickname' => isset($item['nickname']) ? $item['nickname'] : '', + 'pyInitial' => isset($item['pyInitial']) ? $item['pyInitial'] : '', + 'quanPin' => isset($item['quanPin']) ? $item['quanPin'] : '', + 'chatroomAvatar' => isset($item['chatroomAvatar']) ? $item['chatroomAvatar'] : '', 'members' => is_array($item['members']) ? json_encode($item['members']) : json_encode([]), - 'isDeleted' => $item['isDeleted'], - 'deleteTime' => $item['deleteTime'], - 'createTime' => $item['createTime'], - 'accountId' => $item['accountId'], - 'accountUserName' => $item['accountUserName'], - 'accountRealName' => $item['accountRealName'], - 'accountNickname' => $item['accountNickname'], - 'groupId' => $item['groupId'] + 'isDeleted' => isset($item['isDeleted']) ? $item['isDeleted'] : 0, + 'deleteTime' => isset($item['deleteTime']) ? $item['deleteTime'] : 0, + 'createTime' => isset($item['createTime']) ? $item['createTime'] : time(), + 'accountId' => isset($item['accountId']) ? $item['accountId'] : 0, + 'accountUserName' => isset($item['accountUserName']) ? $item['accountUserName'] : '', + 'accountRealName' => isset($item['accountRealName']) ? $item['accountRealName'] : '', + 'accountNickname' => isset($item['accountNickname']) ? $item['accountNickname'] : '', + 'groupId' => isset($item['groupId']) ? $item['groupId'] : 0, + 'updateTime' => time() ]; // 使用chatroomId和wechatAccountId的组合作为唯一性判断 - $chatroom = WechatChatroomModel::where([ - ['chatroomId', '=', $item['chatroomId']], - ['wechatAccountId', '=', $item['wechatAccountId']] - ])->find(); + $chatroom = WechatChatroomModel::where('id',$item['id'])->find(); if ($chatroom) { $chatroom->save($data); @@ -161,12 +168,13 @@ class WechatChatroomController extends BaseController { $data = [ 'chatroomId' => $wechatChatroomId, - 'wechatId' => $item['wechatId'], - 'nickname' => $item['nickname'], - 'avatar' => $item['avatar'], + 'wechatId' => isset($item['wechatId']) ? $item['wechatId'] : '', + 'nickname' => isset($item['nickname']) ? $item['nickname'] : '', + 'avatar' => isset($item['avatar']) ? $item['avatar'] : '', 'conRemark' => isset($item['conRemark']) ? $item['conRemark'] : '', 'alias' => isset($item['alias']) ? $item['alias'] : '', - 'friendType' => isset($item['friendType']) ? $item['friendType'] : false + 'friendType' => isset($item['friendType']) ? $item['friendType'] : false, + 'updateTime' => time() ]; // 使用chatroomId和wechatId的组合作为唯一性判断 @@ -178,6 +186,7 @@ class WechatChatroomController extends BaseController if ($member) { $member->save($data); } else { + $data['createTime'] = time(); WechatChatroomMemberModel::create($data); } } diff --git a/Server/application/api/controller/WechatFriendController.php b/Server/application/api/controller/WechatFriendController.php index 4e53df3f..cbdcd360 100644 --- a/Server/application/api/controller/WechatFriendController.php +++ b/Server/application/api/controller/WechatFriendController.php @@ -4,6 +4,7 @@ namespace app\api\controller; use app\api\model\WechatFriendModel; use think\facade\Request; +use think\facade\Log; class WechatFriendController extends BaseController { @@ -11,13 +12,17 @@ class WechatFriendController extends BaseController * 获取微信好友列表数据 * @return \think\response\Json */ - public function getlist() + public function getlist($pageIndex = '',$pageSize = '',$preFriendId = '',$authorization = '',$isJob = false) { - // 获取授权token - $authorization = trim($this->request->header('authorization', '')); - if (empty($authorization)) { + // 获取授权token + $authorization = !empty($authorization) ? $authorization : trim($this->request->header('authorization', '')); + if (empty($authorization)) { + if($isJob){ + return json_encode(['code'=>500,'msg'=>'缺少授权信息']); + }else{ return errorJson('缺少授权信息'); } + } try { // 构建请求参数 @@ -34,12 +39,11 @@ class WechatFriendController extends BaseController 'isPass' => null, 'keyword' => input('keyword', ''), 'labels' => '[]', - 'pageIndex' => input('pageIndex', 0), - 'pageSize' => input('pageSize', 20), - 'preFriendId' => input('preFriendId', ''), + 'pageIndex' => !empty($pageIndex) ? $pageIndex : input('pageIndex', 0), + 'pageSize' => !empty($pageSize) ? $pageSize : input('pageSize', 20), + 'preFriendId' => !empty($preFriendId) ? $preFriendId : input('preFriendId', ''), 'wechatAccountKeyword' => input('wechatAccountKeyword', '') ]; - // 设置请求头 $headerData = ['client:system']; $header = setHeader($headerData, $authorization); @@ -55,9 +59,19 @@ class WechatFriendController extends BaseController } } - return successJson($response); + if($isJob){ + return json_encode(['code'=>200,'msg'=>'success','data'=>$response]); + }else{ + return successJson($response); + } + + } catch (\Exception $e) { - return errorJson('获取微信好友列表失败:' . $e->getMessage()); + if($isJob){ + return json_encode(['code'=>500,'msg'=>'获取微信好友列表失败:' . $e->getMessage()]); + }else{ + return errorJson('获取微信好友列表失败:' . $e->getMessage()); + } } } @@ -104,6 +118,7 @@ class WechatFriendController extends BaseController 'province' => isset($item['province']) ? $item['province'] : '', 'city' => isset($item['city']) ? $item['city'] : '', 'createTime' =>isset($item['createTime']) ? $item['createTime'] : '', + 'updateTime' => time() ]; // 使用三个字段的组合作为唯一性判断 diff --git a/Server/application/command/WechatFriendCommand.php b/Server/application/command/WechatFriendCommand.php index f3381056..c4b8cbdd 100644 --- a/Server/application/command/WechatFriendCommand.php +++ b/Server/application/command/WechatFriendCommand.php @@ -24,7 +24,7 @@ class WechatFriendCommand extends Command try { // 初始页码 $pageIndex = 0; - $pageSize = 100; // 每页获取100条记录 + $pageSize = 1000; // 每页获取1000条记录 // 将第一页任务添加到队列 $this->addToQueue($pageIndex, $pageSize); diff --git a/Server/application/job/DeviceListJob.php b/Server/application/job/DeviceListJob.php index 9e3ec969..9e383b8a 100644 --- a/Server/application/job/DeviceListJob.php +++ b/Server/application/job/DeviceListJob.php @@ -81,7 +81,7 @@ class DeviceListJob } // 调用设备列表获取方法 - $result = $deviceController->getlist($pageIndex,$pageSize,$authorization); + $result = $deviceController->getlist($pageIndex,$pageSize,$authorization,true); $response = json_decode($result,true); diff --git a/Server/application/job/WechatChatroomJob.php b/Server/application/job/WechatChatroomJob.php index 99563f05..ec20bf8a 100644 --- a/Server/application/job/WechatChatroomJob.php +++ b/Server/application/job/WechatChatroomJob.php @@ -81,9 +81,9 @@ class WechatChatroomJob } // 调用设备列表获取方法 - $result = $wechatChatroomController->getlist($pageIndex,$pageSize,$authorization); + $result = $wechatChatroomController->getlist($pageIndex,$pageSize,$authorization,true); + $response = json_decode($result,true); - // 判断是否成功 if ($response['code'] == 200) { diff --git a/Server/application/job/WechatFriendJob.php b/Server/application/job/WechatFriendJob.php index 769c7a06..a427f862 100644 --- a/Server/application/job/WechatFriendJob.php +++ b/Server/application/job/WechatFriendJob.php @@ -56,7 +56,8 @@ class WechatFriendJob { // 获取参数 $pageIndex = isset($data['pageIndex']) ? $data['pageIndex'] : 0; - $pageSize = isset($data['pageSize']) ? $data['pageSize'] : 100; + $pageSize = isset($data['pageSize']) ? $data['pageSize'] : 1000; + $preFriendId = isset($data['preFriendId']) ? $data['preFriendId'] : ''; Log::info('开始获取微信列表,页码:' . $pageIndex . ',页大小:' . $pageSize); @@ -66,7 +67,8 @@ class WechatFriendJob // 构建请求参数 $params = [ 'pageIndex' => $pageIndex, - 'pageSize' => $pageSize + 'pageSize' => $pageSize, + 'preFriendId' => $preFriendId ]; // 设置请求信息 @@ -81,7 +83,7 @@ class WechatFriendJob } // 调用设备列表获取方法 - $result = $wechatFriendController->getlist($pageIndex,$pageSize,$authorization); + $result = $wechatFriendController->getlist($pageIndex,$pageSize,$preFriendId,$authorization,true); $response = json_decode($result,true); @@ -90,10 +92,10 @@ class WechatFriendJob $data = $response['data']; // 判断是否有下一页 - if (!empty($data) && count($data['results']) > 0) { + if (!empty($data) && count($data) > 0) { // 有下一页,将下一页任务添加到队列 $nextPageIndex = $pageIndex + 1; - $this->addNextPageToQueue($nextPageIndex, $pageSize); + $this->addNextPageToQueue($nextPageIndex, $pageSize,$data[count($data)-1]['id']); Log::info('添加下一页任务到队列,页码:' . $nextPageIndex); } @@ -110,11 +112,12 @@ class WechatFriendJob * @param int $pageIndex 页码 * @param int $pageSize 每页大小 */ - protected function addNextPageToQueue($pageIndex, $pageSize) + protected function addNextPageToQueue($pageIndex, $pageSize,$preFriendId) { $data = [ 'pageIndex' => $pageIndex, - 'pageSize' => $pageSize + 'pageSize' => $pageSize, + 'preFriendId' => $preFriendId ]; // 添加到队列,设置任务名为 wechat_friends diff --git a/Server/application/store/config/route.php b/Server/application/store/config/route.php index 57212848..4e0b1b94 100644 --- a/Server/application/store/config/route.php +++ b/Server/application/store/config/route.php @@ -23,4 +23,11 @@ Route::group('v1/store', function () { Route::group('customers', function () { Route::get('list', 'app\\store\\controller\\CustomerController@getList'); // 获取客户列表 }); + + + // 系统配置相关路由 + Route::group('system-config', function () { + Route::get('switch-status', 'app\\store\\controller\\SystemConfigController@getSwitchStatus'); // 获取系统开关状态 + Route::post('update-switch-status', 'app\\store\\controller\\SystemConfigController@updateSwitchStatus'); // 更新系统开关状态 + }); })->middleware(['jwt']); \ No newline at end of file diff --git a/Server/application/store/controller/BaseController.php b/Server/application/store/controller/BaseController.php new file mode 100644 index 00000000..b3e77a7e --- /dev/null +++ b/Server/application/store/controller/BaseController.php @@ -0,0 +1,66 @@ +userInfo = request()->userInfo; + + // 生成缓存key + $cacheKey = 'device_info_' . $this->userInfo['id'] . '_' . $this->userInfo['companyId']; + + // 尝试从缓存获取设备信息 + $device = Cache::get($cacheKey); + $device = ''; + // 如果缓存不存在,则从数据库获取 + if (!$device) { + $device = Db::name('device_user') + ->alias('du') + ->join('device d', 'd.id = du.deviceId','left') + ->where([ + 'du.userId' => $this->userInfo['id'], + 'du.companyId' => $this->userInfo['companyId'] + ]) + ->field('d.*') + ->find(); + + // 将设备信息存入缓存 + if ($device) { + Cache::set($cacheKey, $device, $this->cacheExpire); + } + } + + $this->device = $device; + } + + /** + * 清除设备信息缓存 + */ + protected function clearDeviceCache() + { + $cacheKey = 'device_info_' . $this->userInfo['id'] . '_' . $this->userInfo['companyId']; + Cache::delete($cacheKey); + } +} \ No newline at end of file diff --git a/Server/application/store/controller/SystemConfigController.php b/Server/application/store/controller/SystemConfigController.php new file mode 100644 index 00000000..cb56b582 --- /dev/null +++ b/Server/application/store/controller/SystemConfigController.php @@ -0,0 +1,107 @@ +device['id'] ?? 0; + if (!$deviceId) { + return $this->error('设备不存在'); + } + + // 获取已解析的配置 + $config = $this->device['taskConfig'] ?? []; + + // 返回开关状态 + return $this->success('获取成功', [ + 'autoLike' => $config['autoLike'] ?? false, + 'momentsSync' => $config['momentsSync'] ?? false, + 'autoCustomerDev' => $config['autoCustomerDev'] ?? false, + 'groupMessageDeliver' => $config['groupMessageDeliver'] ?? false, + 'autoGroup' => $config['autoGroup'] ?? false + ]); + + } catch (\Exception $e) { + Log::error('获取开关状态异常:' . $e->getMessage()); + return $this->error('获取开关状态失败'); + } + } + + /** + * 更新系统开关状态 + * + * @return \think\Response + */ + public function updateSwitchStatus() + { + try { + // 获取参数 + if (empty($this->device)) { + return errorJson('设备不存在'); + } + + $switchName = $this->request->param('switchName'); + $deviceId = $this->device['id']; + + if (empty($switchName)) { + return errorJson('开关名称不能为空'); + } + + // 验证开关名称是否有效 + $validSwitches = ['autoLike', 'momentsSync', 'autoCustomerDev', 'groupMessageDeliver', 'autoGroup']; + if (!in_array($switchName, $validSwitches)) { + return errorJson('无效的开关名称'); + } + + // 获取当前配置并确保是数组 + $taskConfig = json_decode($this->device['taskConfig'], true); + + // 更新指定开关状态 + $taskConfig[$switchName] = !$taskConfig[$switchName]; + $taskConfig = json_encode($taskConfig); + + + // 更新数据库 + $result = Db::name('device') + ->where('id', $deviceId) + ->update([ + 'taskConfig' => $taskConfig, + 'updateTime' => time() + ]); + + + if ($result === false) { + Log::error("更新设备{$switchName}开关状态失败,设备ID:{$deviceId}"); + return errorJson('更新失败'); + } + + // 清除缓存 + // $this->clearDeviceCache(); + + return successJson([], '更新成功'); + + } catch (\Exception $e) { + return errorJson('系统错误'. $e->getMessage()); + } + } +} \ No newline at end of file