getUserInfo('s2_accountId'); $userId = $this->getUserInfo('id'); $companyId = $this->getUserInfo('companyId'); if (empty($accountId)){ return ResponseHelper::error('请先登录'); } // 侧栏真源:与存客宝 ck_device 绑定一致;有项目设备链时不混入客服个人 IM 号(避免 2 台设备却显示 3 个号) $accountIds = CompanyWechatScopeService::resolveKefuSidebarAccountIds((int)$companyId, (int)$accountId); if (empty($accountIds)) { return ResponseHelper::success([]); } $list = Db::table('s2_wechat_account')->alias('wa') ->join(['s2_device' => 'd'],'wa.currentDeviceId = d.id','LEFT') ->whereIn('wa.id',$accountIds) ->order('wa.id desc') ->group('wa.id') ->field([ 'wa.*', 'd.imei', 'd.memo as deviceMemoFromDevice', 'd.extra', 'd.alive as s2DeviceAlive', ]) ->select(); $ckDevicesByImei = []; try { $imeis = []; foreach ($list as $row) { if (!empty($row['imei'])) { $imeis[] = $row['imei']; } } if (!empty($imeis)) { $ckRows = Db::name('device') ->where('companyId', $companyId) ->where('deleteTime', 0) ->whereIn('imei', array_unique($imeis)) ->field('imei,alive,memo,model,brand,extra') ->select(); foreach ($ckRows as $ck) { $ckDevicesByImei[$ck['imei']] = $ck; } } } catch (\Exception $e) { // ck device 表不可用时仍返回 S2 列表 } foreach ($list as $k=>&$v){ $v['createTime'] = !empty($v['createTime']) ? date('Y-m-d H:i:s',$v['createTime']) : ''; $v['updateTime'] = !empty($v['updateTime']) ? date('Y-m-d H:i:s',$v['updateTime']) : ''; $v['labels'] = json_decode($v['labels'] ?? '', true) ?: []; $momentsSetting = Db::name('kf_moments_settings')->where(['userId' => $userId,'companyId' => $companyId,'wechatId' =>$v['id']])->find(); $v['momentsMax'] = !empty($momentsSetting['max']) ? $momentsSetting['max'] : 5; $v['momentsNum'] = !empty($momentsSetting['sendNum']) ? $momentsSetting['sendNum'] : 0; $v['deviceExtra'] = json_decode($v['extra'],true) ?: []; $v['deviceExtra']['imei'] = $v['imei']; $memoFromDevice = $v['deviceMemoFromDevice'] ?? ($v['deviceMemo'] ?? ''); $v['deviceExtra']['memo'] = $memoFromDevice ?: ($v['deviceExtra']['memo'] ?? ''); $imei = $v['imei'] ?? ''; if ($imei && isset($ckDevicesByImei[$imei])) { $ck = $ckDevicesByImei[$imei]; $ckExtra = !empty($ck['extra']) ? (json_decode($ck['extra'], true) ?: []) : []; if (!empty($ck['memo'])) { $v['deviceExtra']['memo'] = $ck['memo']; } if (!empty($ck['model']) || !empty($ck['brand'])) { $v['deviceExtra']['market_name'] = trim(($ck['brand'] ?? '') . ' ' . ($ck['model'] ?? '')); } if (isset($ck['alive'])) { $v['deviceAlive'] = (int)$ck['alive']; } if (isset($ckExtra['battery'])) { $v['deviceExtra']['battery'] = $ckExtra['battery']; } } if (!empty($v['s2DeviceAlive']) && (int)$v['s2DeviceAlive'] === 1) { $v['deviceAlive'] = 1; } $v['isOnline'] = ((int)($v['deviceAlive'] ?? 0) === 1) || ((int)($v['wechatAlive'] ?? 0) === 1) || ((int)($v['keFuAlive'] ?? 0) === 1); unset( $v['accountUserName'], $v['accountRealName'], $v['accountNickname'], $v['extra'], $v['imei'], $v['deviceMemo'], $v['deviceMemoFromDevice'], $v['s2DeviceAlive'], ); } unset($v); usort($list, function ($a, $b) { $oa = !empty($a['isOnline']) ? 1 : 0; $ob = !empty($b['isOnline']) ? 1 : 0; if ($oa !== $ob) { return $ob - $oa; } return strcmp($a['nickname'] ?? '', $b['nickname'] ?? ''); }); return ResponseHelper::success($list); } }