WechatGroup.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. namespace wechat\models;
  3. use Yii;
  4. /**
  5. * This is the model class for table "bit_wechat_group".
  6. *
  7. * @property int $id
  8. * @property string $group_name
  9. * @property string $group_logo
  10. * @property string $group_link
  11. * @property string $group_qrcode
  12. * @property int $qrcode_expire
  13. * @property int $scan_count
  14. * @property int $sort
  15. * @property int $is_enable
  16. * @property int $is_current
  17. * @property int $create_time
  18. * @property int $update_time
  19. */
  20. class WechatGroup extends \yii\db\ActiveRecord
  21. {
  22. /**
  23. * @var int 入群人数的上限,达到这个数的话则替换成下一个微信群
  24. */
  25. public static $limit = 100;
  26. /**
  27. * @inheritdoc
  28. */
  29. public static function tableName()
  30. {
  31. return 'bit_wechat_group';
  32. }
  33. /**
  34. * @inheritdoc
  35. */
  36. public function rules()
  37. {
  38. return [
  39. [['group_name', 'group_logo', 'group_link', 'group_qrcode'], 'string'],
  40. [['qrcode_expire', 'scan_count', 'sort', 'is_enable', 'is_current', 'create_time', 'update_time'], 'number'],
  41. [['id'], 'safe'],
  42. ];
  43. }
  44. /**
  45. * 按照规则选择一个微信群
  46. * 1.微信群的扫描次数阀值为100,达到后按排序规则替换成下一个微信群为当前微信群
  47. * 2.微信群替换顺序将按照排序号从小到大开始,相同排序号的按更新时间大小,进行先后排序
  48. * 3.未启用的微信群不列入群替换的排序中
  49. * 4.如果没有可以使用的群里了,则使用is_current的群,如果没有is_current的话,则使用update_time最大的一个群
  50. *
  51. * @param bool $from_admin 是否为后台的请求,后台请求的话不给记录数加1
  52. * @param string $session_id
  53. * @return WechatGroup|false 没有群的话返回false
  54. */
  55. public static function getCurrentGroup($from_admin = false, $session_id = '')
  56. {
  57. $time = time();
  58. // 如果该用户登录的话,那么则返回原来的微信群信息
  59. if (!$from_admin && $session_id) {
  60. $where = [
  61. 'and',
  62. ['=', 'g.is_enable', 1],
  63. ['>', 'g.qrcode_expire', $time],
  64. ['=', 'r.session_id', $session_id],
  65. ];
  66. $query = static::find()->alias('g')
  67. ->innerJoin(ScanQrcodeRecord::tableName() . ' r', 'g.id = r.wechat_group_id')
  68. ->where($where)
  69. ->orderBy(['r.id' => SORT_DESC])
  70. ->limit(1);
  71. $groupModel = $query->one();
  72. if ($groupModel) {
  73. return $groupModel;
  74. }
  75. }
  76. $where = [
  77. 'and',
  78. ['=', 'is_current', 1],
  79. ['=', 'is_enable', 1],
  80. ['>', 'qrcode_expire', $time],
  81. ['<', 'scan_count', static::$limit],
  82. ];
  83. $groupModel = static::find()->where($where)->limit(1)->one();
  84. if (!$groupModel) {
  85. $newGroupModel = static::chooseNewGroup($from_admin);
  86. // 没有可用的群了
  87. if ($newGroupModel === false) {
  88. return false;
  89. }
  90. $groupModel = $newGroupModel;
  91. }
  92. // 请求数加1
  93. if (!$from_admin) {
  94. $groupModel->scan_count = $groupModel->scan_count + 1;
  95. $groupModel->save();
  96. }
  97. return $groupModel;
  98. }
  99. /**
  100. * 筛选一个新的微信群
  101. * @param bool $from_admin 是否为后台的请求
  102. * @return WechatGroup|false 后台没添加群的话返回false
  103. */
  104. protected static function chooseNewGroup($from_admin = false)
  105. {
  106. // 先把所有的is_current设为0
  107. static::updateAll(['is_current' => 0]);
  108. // 微信群替换顺序将按照排序号从小到大开始,相同排序号的按更新时间大小,进行先后排序
  109. $time = time();
  110. $where = [
  111. 'and',
  112. ['=', 'is_enable', 1],
  113. ['>', 'qrcode_expire', $time],
  114. ['<', 'scan_count', static::$limit],
  115. ];
  116. $groupModel = static::find()->where($where)->orderBy(['sort' => SORT_ASC, 'update_time' => SORT_ASC])->limit(1)->one();
  117. // 把当前的群的is_current设成1
  118. if ($groupModel) {
  119. $groupModel->is_current = 1;
  120. $groupModel->update_time = $time;
  121. $groupModel->save();
  122. } else {
  123. // 后台请求进来,没有群的话直接返回false
  124. if ($from_admin) {
  125. return false;
  126. }
  127. // 如果没有符合条件的群的话,获取最近访问的群,为了让页面显示二维码,不能显示空的
  128. $recordModel = ScanQrcodeRecord::find()->orderBy(['id' => SORT_DESC])->limit(1)->one();
  129. if ($recordModel) {
  130. $where = [
  131. 'and',
  132. ['=', 'id', $recordModel->wechat_group_id],
  133. ['=', 'is_enable', 1],
  134. ['>', 'qrcode_expire', $time],
  135. ];
  136. $groupModel = static::find()->where($where)->limit(1)->one();
  137. }
  138. // 如果还是没有符合条件的群的话,则获取最近更新时间的一个群
  139. if (!$groupModel) {
  140. $where = [
  141. 'and',
  142. ['=', 'is_enable', 1],
  143. ['>', 'qrcode_expire', $time],
  144. ];
  145. $groupModel = static::find()->where($where)->orderBy(['update_time' => SORT_DESC])->limit(1)->one();
  146. }
  147. }
  148. return $groupModel ? $groupModel : false;
  149. }
  150. }