', 'g.qrcode_expire', $time], ['=', 'r.session_id', $session_id], ]; $query = static::find()->alias('g') ->innerJoin(ScanQrcodeRecord::tableName() . ' r', 'g.id = r.wechat_group_id') ->where($where) ->orderBy(['r.id' => SORT_DESC]) ->limit(1); $groupModel = $query->one(); if ($groupModel) { return $groupModel; } } $where = [ 'and', ['=', 'is_current', 1], ['=', 'is_enable', 1], ['>', 'qrcode_expire', $time], ['<', 'scan_count', static::$limit], ]; $groupModel = static::find()->where($where)->limit(1)->one(); if (!$groupModel) { $newGroupModel = static::chooseNewGroup($from_admin); // 没有可用的群了 if ($newGroupModel === false) { return false; } $groupModel = $newGroupModel; } // 请求数加1 if (!$from_admin) { $groupModel->scan_count = $groupModel->scan_count + 1; $groupModel->save(); } return $groupModel; } /** * 筛选一个新的微信群 * @param bool $from_admin 是否为后台的请求 * @return WechatGroup|false 后台没添加群的话返回false */ protected static function chooseNewGroup($from_admin = false) { // 先把所有的is_current设为0 static::updateAll(['is_current' => 0]); // 微信群替换顺序将按照排序号从小到大开始,相同排序号的按更新时间大小,进行先后排序 $time = time(); $where = [ 'and', ['=', 'is_enable', 1], ['>', 'qrcode_expire', $time], ['<', 'scan_count', static::$limit], ]; $groupModel = static::find()->where($where)->orderBy(['sort' => SORT_ASC, 'update_time' => SORT_ASC])->limit(1)->one(); // 把当前的群的is_current设成1 if ($groupModel) { $groupModel->is_current = 1; $groupModel->update_time = $time; $groupModel->save(); } else { // 后台请求进来,没有群的话直接返回false if ($from_admin) { return false; } // 如果没有符合条件的群的话,获取最近访问的群,为了让页面显示二维码,不能显示空的 $recordModel = ScanQrcodeRecord::find()->orderBy(['id' => SORT_DESC])->limit(1)->one(); if ($recordModel) { $where = [ 'and', ['=', 'id', $recordModel->wechat_group_id], ['=', 'is_enable', 1], ['>', 'qrcode_expire', $time], ]; $groupModel = static::find()->where($where)->limit(1)->one(); } // 如果还是没有符合条件的群的话,则获取最近更新时间的一个群 if (!$groupModel) { $where = [ 'and', ['=', 'is_enable', 1], ['>', 'qrcode_expire', $time], ]; $groupModel = static::find()->where($where)->orderBy(['update_time' => SORT_DESC])->limit(1)->one(); } } return $groupModel ? $groupModel : false; } }