| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- <?php
- namespace wechat\models;
- use Yii;
- /**
- * This is the model class for table "bit_wechat_group".
- *
- * @property int $id
- * @property string $group_name
- * @property string $group_logo
- * @property string $group_link
- * @property string $group_qrcode
- * @property int $qrcode_expire
- * @property int $scan_count
- * @property int $sort
- * @property int $is_enable
- * @property int $is_current
- * @property int $create_time
- * @property int $update_time
- */
- class WechatGroup extends \yii\db\ActiveRecord
- {
- /**
- * @var int 入群人数的上限,达到这个数的话则替换成下一个微信群
- */
- public static $limit = 100;
-
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return 'bit_wechat_group';
- }
-
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['group_name', 'group_logo', 'group_link', 'group_qrcode'], 'string'],
- [['qrcode_expire', 'scan_count', 'sort', 'is_enable', 'is_current', 'create_time', 'update_time'], 'number'],
- [['id'], 'safe'],
- ];
- }
-
- /**
- * 按照规则选择一个微信群
- * 1.微信群的扫描次数阀值为100,达到后按排序规则替换成下一个微信群为当前微信群
- * 2.微信群替换顺序将按照排序号从小到大开始,相同排序号的按更新时间大小,进行先后排序
- * 3.未启用的微信群不列入群替换的排序中
- * 4.如果没有可以使用的群里了,则使用is_current的群,如果没有is_current的话,则使用update_time最大的一个群
- *
- * @param bool $from_admin 是否为后台的请求,后台请求的话不给记录数加1
- * @param string $session_id
- * @return WechatGroup|false 没有群的话返回false
- */
- public static function getCurrentGroup($from_admin = false, $session_id = '')
- {
- $time = time();
-
- // 如果该用户登录的话,那么则返回原来的微信群信息
- if (!$from_admin && $session_id) {
- $where = [
- 'and',
- ['=', 'g.is_enable', 1],
- ['>', '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;
- }
- }
|