| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987 | <?phpnamespace common\modules\user\models;use abei2017\wx\mini\qrcode\Qrcode;use backend\models\search\SearchModelTrait;use common\enums\DataTypeEnum;use common\enums\StatusEnum;use common\helpers\GrafikaHelper;use common\helpers\Regexp;use common\helpers\wx\Application;use common\models\Data;use common\models\DataRank;use common\models\ShareLevel;use common\models\Store;use common\models\UserCar;use common\models\UserLevel;use common\models\VipUser;use common\models\Voice;use common\modules\attachment\behaviors\UploadBehavior;use common\modules\attachment\models\Attachment;use common\modules\rbac\controllers\AssignmentController;use common\modules\user\Module;use common\modules\user\traits\ModuleTrait;use Exception;use Grafika\Color;use Grafika\Grafika;use Yii;use yii\behaviors\TimestampBehavior;use yii\db\ActiveRecord;use yii\helpers\ArrayHelper;use yii\web\IdentityInterface;use yii\web\ServerErrorHttpException;/** * User model. * * @property int $id * @property int $pid * @property int $jucai_id * @property string $username * @property string $password_hash * @property string $password_reset_token * @property string $access_token * @property int $expired_at * @property string $email * @property string $tel * @property string $auth_key * @property int $created_at * @property int $updated_at * @property int $confirmed_at * @property int $blocked_at * @property int $login_at * @property int $type * @property int $level_id * @property int $is_vip * @property int $vip_time * @property string $password write-only password * @property Profile $profile * @property UserCar $car * @property string $privilege * @property string $openid * @property string $unionid * @property string $nickname * @property Module $module * @property Store $store * @property ShareLevel $shareLevel * @property Attachment $qrcode * @property array $dataCount */class User extends ActiveRecord implements IdentityInterface{    use ModuleTrait;    use SearchModelTrait;    public $password;    const TYPE_WEB = 0;//后台用户    const TYPE_PERSON = 1;//个人用户    const TYPE_COMPANY = 2;//企业用户    /**     * {@inheritdoc}     */    public static function tableName()    {        return '{{%user}}';    }    /**     * {@inheritdoc}     */    public function behaviors()    {        return [            TimestampBehavior::className(),            [                'class' => UploadBehavior::className(),                'attribute' => 'qrcode',                'entity' => __CLASS__            ],        ];    }    public function scenarios()    {        $scenarios = parent::scenarios();        return array_merge($scenarios, [            'register' => ['username', 'openid', 'password', 'email', 'tel', 'pid'],            'connect' => ['username', 'email'],            'create' => ['jucai_id', 'email', 'tel'],            'update' => ['username', 'password', 'email', 'tel', 'nickname', 'level_id', 'pid'],            'settings' => ['username', 'password', 'email', 'tel'],            'resetPassword' => ['password']        ]);    }    /**     * {@inheritdoc}     */    public function rules()    {        return [            ['username', 'string', 'on' => 'search'],            ['username', 'required', 'on' => 'create'],            ['password', 'required', 'on' => ['register']],            [['tel'], 'match', 'pattern' => Regexp::$mobile],            [['email'], 'match', 'pattern' => Regexp::$email],            [['privilege'], 'string', 'max' => 255],            [['qrcode', 'dataCount'], 'safe'],        ];    }    public function attributeLabels()    {        return [            'pid' => '上级用户',            'jucai_id' => '聚才网ID',            'username' => '用户名',//openid共用字段            'openid' => '微信ID',            'nickname' => '昵称',            'password' => '密码',            'email' => ' 绑定邮箱',            'tel' => '绑定手机',            'avatar' => '头像',            'created_at' => '注册时间',            'login_at' => '最后登录时间',            'type' => '用户类型',            'privilege' => '特权',//微信用户属性            'unionid' => '联合ID',//微信用户属性            'level_id' => '分销等级',//微信用户属性            'qrcode' => '分销码',         //小程序码            'is_vip' => '是否vip',        //是否vip            'vip_time' => 'vip有效期',        //是否vip            'dataCount' => '数据统计',        ];    }    /**     * 根据id查询用户     * {@inheritdoc}     */    public static function findIdentity($id)    {        return static::findOne(['id' => $id, 'blocked_at' => null]);    }    /**     * 根据访问令牌查询用户     * api访问专用     * {@inheritdoc}     */    public static function findIdentityByAccessToken($token, $type = null)    {        return static::find()->where(['access_token' => $token])->andWhere(['>', 'expired_at', time()])->one();    }    /**     * 根据用户名查询用户     *     * @param string $username     *     * @return mixed     */    public static function findByUsername($username)    {        return static::find()->where(['username' => $username])            ->andWhere(['blocked_at' => null])            ->one();    }    /**     * 根据用openid查询用户     *     * @param string $openId     *     * @return mixed     */    public static function findByOpenid($openId)    {        return static::find()->where(['openid' => $openId])            ->andWhere(['blocked_at' => null])            ->one();    }    /**     * 根据绑定邮箱查询用户     * @param $email     * @return array|ActiveRecord|null     * @author nodelog     */    public static function findByEmail($email)    {        return static::find()->where(['email' => $email])            ->andWhere(['blocked_at' => null])            ->one();    }    /**     * 根据绑定手机号查询用户     * @param $tel     * @return array|ActiveRecord|null     * @author nodelog     */    public static function findByTel($tel)    {        return static::find()->where(['email' => $tel])            ->andWhere(['blocked_at' => null])            ->one();    }    /**     * 根据用户名、邮箱、手机号查询用户     * @param $login     * @return array|ActiveRecord|null     * @author nodelog     */    public static function findByUsernameOrEmailTel($login)    {        return static::find()->where(['or', ['username' => $login], ['email' => $login], ['tel' => $login]])            ->andWhere(['blocked_at' => null])            ->one();    }    /**     * 根据重置密码令牌查询用户     * Finds user by password reset token.     *     * @param string $token password reset token     *     * @return static|null     */    public static function findByPasswordResetToken($token)    {        if (!static::isPasswordResetTokenValid($token)) {            return;        }        return static::findOne([            'password_reset_token' => $token,            'blocked_at' => null        ]);    }    /**     * Finds out if password reset token is valid.     *     * @param string $token password reset token     *     * @return bool     */    public static function isPasswordResetTokenValid($token)    {        if (empty($token)) {            return false;        }        $timestamp = (int)substr($token, strrpos($token, '_') + 1);        $expire = Yii::$app->params['user.passwordResetTokenExpire'];        return $timestamp + $expire >= time();    }    /**     * 获取当前用户id,认证身份identity使用     * {@inheritdoc}     */    public function getId()    {        return $this->getPrimaryKey();    }    /**     * 获取当前身份验证密钥     * {@inheritdoc}     */    public function getAuthKey()    {        return $this->auth_key;    }    /**     * 验证身份验证密钥     * {@inheritdoc}     */    public function validateAuthKey($authKey)    {        return $this->getAuthKey() === $authKey;    }    /**     * 验证密码     * @param string $password password to validate     *     * @return bool if password provided is valid for current user     */    public function validatePassword($password)    {        return Yii::$app->security->validatePassword($password, $this->password_hash);    }    /**     * 从密码生成密码哈希并将其赋值给当前用户。     * @param $password     * @throws \yii\base\Exception     * @author nodelog     */    public function setPassword($password)    {        $this->password_hash = Yii::$app->security->generatePasswordHash($password);    }    /**     * 验证二维码哈希值     * @param $qrcodeHash     * @return bool     * @author nodelog     */    public function validateQrcodeHash($qrcodeHash)    {        return $qrcodeHash == md5(self::generateQrcodeLoginUrl($this->access_token));    }    /**     * 生成“记住我”身份验证密钥。     */    public function generateAuthKey()    {        $this->auth_key = Yii::$app->security->generateRandomString();    }    /**     * 生成新的密码重置令牌。     */    public function generatePasswordResetToken()    {        $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();    }    /**     * 删除密码重置令牌。     */    public function removePasswordResetToken()    {        $this->password_reset_token = null;    }    /**     * 生成访问令牌和过期时间     * @param null $access_token     * @throws \yii\base\Exception     * @author nodelog     */    public function generateAccessToken($access_token = null)    {        if (!$access_token) {//            $access_token = Yii::$app->security->generateRandomString();        }        $this->access_token = $access_token;        $this->expired_at = time() + 60 * 60 * 2;//2小时    }    /**     * 删除访问令牌和过期时间     * @author nodelog     */    public function removeAccessToken()    {        $this->access_token = null;        $this->expired_at = null;    }    /**     * 创建用户     * @param int $type     * @return bool     * @author nodelog     */    public function create()    {        if ($this->getIsNewRecord() == false) {            throw new \RuntimeException('Calling "' . __CLASS__ . '::' . __METHOD__ . '" on existing user');        }        $this->confirmed_at = time();        $this->password = $this->password == null ? $this->getModule()->defaultPassword : $this->password;        $this->generateAuthKey();        if (!$this->save()) {            return false;        }        return true;    }    /**     * 创建微信用户 并授权公司管理员角色     * @throws \Exception     * @author nodelog     */    public function createWechat()    {        $this->type = self::TYPE_PERSON;        if ($this->create()) {//            try {//                $auth = \Yii::$app->authManager;//                //todo 具体授权//                $authorRole = $auth->getRole('superAdmin');//                $auth->assign($authorRole, $this->id);//            } catch (Exception $e) {//                $this->addError('username', $e->getMessage());//                return false;//            }            //创建个人数据设置            return true;        }        return false;    }    /**     * 保存之前生成密码哈希     * @param bool $insert     * @return bool     * @throws \yii\base\Exception     * @author nodelog     */    public function beforeSave($insert)    {        if (!empty($this->password)) {            $this->password_hash = Yii::$app->security->generatePasswordHash($this->password);        }        return parent::beforeSave($insert);    }    /**     * 禁用用户     * @return bool     * @throws \yii\base\Exception     * @author nodelog     */    public function block()    {        return (bool)$this->updateAttributes([            'blocked_at' => time(),            'auth_key' => \Yii::$app->security->generateRandomString(),        ]);    }    /**     * 解除禁用     * UnBlocks the user by setting 'blocked_at' field to null.     */    public function unblock()    {        return (bool)$this->updateAttributes(['blocked_at' => null]);    }    /**     * 发送绑定邮箱确认邮件     * @param $email     * @return array     * @throws \yii\base\InvalidConfigException     * @author nodelog     */    public function sendConfirm($email)    {        $exist = User::find()->where(['<>', 'id', Yii::$app->user->id])->andWhere(['email' => $email])->exists();        $user = Yii::$app->user->identity;        if (!$exist && !$user->isConfirmed) {            /** @var Token $token */            $token = \Yii::createObject([                'class' => Token::className(),                'user_id' => $user->id,                'type' => Token::TYPE_CONFIRMATION,            ]);            $token->save(false);            $mailer = Yii::$app->mailer;            $mailer->viewPath = '@common/modules/user/mail';            try {                $mailer->compose(['html' => 'confirmation'], ['user' => $user, 'token' => $token])                    ->setTo($email)                    ->setSubject(Yii::t('user', 'Confirm account on {0}', Yii::$app->config->get('name')))                    ->send();                return [true, null];            } catch (\Exception $e) {                return [false, '发送失败,请确认邮箱是否存在!'];            }        } else {            return [false, '邮箱已存在'];        }    }    /**     * 用户邮箱验证     * @param $code     * @return array     * @throws \yii\db\StaleObjectException     * @author nodelog     */    public function attemptConfirmation($code)    {        if ($this->getIsConfirmed()) {            return [false, '该用户已验证邮箱'];        }        $token = Token::find()->where(['user_id' => $this->id, 'code' => $code, 'type' => Token::TYPE_CONFIRMATION])->one();        if ($token !== null && !$token->isExpired) {            $token->delete();            if (($success = $this->confirm())) {                $message = \Yii::t('user', 'Thank you, registration is now complete.');            } else {                $message = \Yii::t('user', 'Something went wrong and your account has not been confirmed.');            }        } else {            $success = false;            $message = \Yii::t('user', 'The confirmation link is invalid or expired. Please try requesting a new one.');        }        return [$success, $message];    }    /**     * Confirms the user by setting 'confirmed_at' field to current time.     */    public function confirm()    {        $result = (bool)$this->updateAttributes(['confirmed_at' => time()]);        return $result;    }    /**     * 获取用户头像     * @param int $width     * @param int $height     * @return string     * @author nodelog     */    public function getAvatar($width = 96, $height = 0)    {        if (empty($height)) {            $height = $width;        }        if ($this->profile->avatar) {            return Yii::$app->storage->thumbnail($this->profile->avatar, $width, $height);        }        return $this->getDefaultAvatar($width, $height);    }    /**     * 获取用户信息     * @return \yii\db\ActiveQuery     * @author nodelog     */    public function getProfile()    {        return $this->hasOne(Profile::className(), ['user_id' => 'id']);    }    /**     * 认证车辆     * @return \yii\db\ActiveQuery     * @author nodelog     */    public function getCar()    {        return $this->hasOne(UserCar::className(), ['user_id' => 'id']);    }    /**     * 获取用户签名     * @return string     * @author nodelog     */    public function getSignature()    {        return $this->profile->signature;    }    /**     * 获取默认头像     * @param $width     * @param $height     * @return string     * @author nodelog     */    public static function getDefaultAvatar($width, $height)    {        list ($basePath, $baseUrl) = \Yii::$app->getAssetManager()->publish("@common/static");        $name = "avatars/avatar_" . $width . "x" . $height . ".png";        if (file_exists($basePath . DIRECTORY_SEPARATOR . $name)) {            return $baseUrl . "/" . $name;        }        return $baseUrl . "/" . "avatar_200x200.png";    }    /**     * 保存头像     * @param $avatar     * @author nodelog     */    public function saveAvatar($avatar)    {        $this->profile->updateAttributes(['avatar' => $avatar]);    }    /**     * 初始化插入数据库后置事件     * @author nodelog     */    public function init()    {        $this->on(self::EVENT_AFTER_INSERT, [$this, 'afterInsertInternal']);    }    /**     * 设置用户信息的外键关联     * @param $event     * @author nodelog     */    public function afterInsertInternal($event)    {        $profile = new Profile();//        $profile->voice_id = Voice::getDefaultId();        $this->link('profile', $profile);        //创建个人配置    }    /**     * 是否管理员用户     * @return bool     */    public function getIsAdmin()    {        return            (\Yii::$app->getAuthManager() && $this->module->adminPermission ?                Yii::$app->getAuthManager()->checkAccess($this->getId(), $this->module->adminPermission) : false)            || in_array($this->username, $this->module->admins);    }    /**     * 是否确认     * @return bool Whether the user is confirmed or not.     */    public function getIsConfirmed()    {        return $this->confirmed_at != null;    }    /**     * 是否禁用     * @return bool Whether the user is blocked or not.     */    public function getIsBlocked()    {        return $this->blocked_at != null;    }    /**     * 获取等级     * @return string     */    public function getLevel()    {        return UserLevel::getLevel($this->profile->money);    }    /**     * 生成二维码登录url     * @param $access_token     * @return string     * @author nodelog     */    public static function generateQrcodeLoginUrl($access_token)    {        return Yii::$app->request->hostInfo . '/api/v1/weixin/code?access_token=' . $access_token;    }    public static $typeList = [        self::TYPE_COMPANY => '企业用户',        self::TYPE_PERSON => '个人用户',        self::TYPE_WEB => '后台用户'    ];    public static $typeIconList = [        self::TYPE_PERSON => '<i class="fa fa-fw fa-wechat"></i>',        self::TYPE_WEB => '<i class="fa fa-fw fa-desktop"></i>'    ];    /**     * 格式化昵称     * @return string     * @author nodelog     */    private function formatNickname()    {//        $name = $this->profile->nickname ?: $this->username;//        if ($htmlFormat) {//            return Html::tag('span', $name . ' ' . self::$typeIconList[$this->type], ['title' => self::$typeList[$this->type]]);//        }        return $this->nickname ? $this->nickname : $this->username;    }    /**     * 获得用户所有角色描述     * @return string     * @author nodelog     */    public function getAllRoleDesc()    {        $roles = Yii::$app->authManager->getRolesByUser($this->id);        return implode(' | ', ArrayHelper::getColumn($roles, 'description'));    }    /**     * 查询 左连接 去除公共部分,如教练查询未绑定教练微信用户,销售查询未绑定销售微信用户,FOR 后台添加教练和销售 筛选选择列表数据     * @param $model                    模型类名     * @param $inIdArray                过滤的id数组     * @return array|User[]     */    public static function getAllSelectFromModel($model, $inIdArray = null)    {        if (empty($inIdArray)) {            $list = User::find()->joinWith($model::relationName())->where([self::tableName() . '.blocked_at' => null, $model::tableName() . '.user_id' => null])->all();        } else {            $list = User::find()->joinWith($model::relationName())->where([self::tableName() . '.blocked_at' => null])->andWhere(['or', [$model::tableName() . '.user_id' => null], [$model::tableName() . '.user_id' => $inIdArray]])->all();        }        return $list;    }    /**     * 获取可选管理员用户列表     * @author nodelog     */    public static function lists()    {        if (Yii::$app->user->identity->getIsAdmin()) {            //已经使用的用户ids//            $usedUserIds = Company::find()->select('user_id')->distinct()->asArray()->indexBy('user_id')->column();//            //去掉当前包含的当前公司id//            if (!empty($this->user_id) && isset($usedUserIds[$this->user_id])) {//                unset($usedUserIds[$this->user_id]);//            }//            return User::find()->where(['not in', 'id', $usedUserIds])->asArray()->indexBy('id')->all();            $lists = User::find()->indexBy('id')->all();            $lists = ArrayHelper::map($lists, 'id', 'nickname');            return $lists;        } else {            return [                Yii::$app->user->id => Yii::$app->user->identity->nickname            ];        }    }    /**     * 获取用户的供应商     * @return \yii\db\ActiveQuery     * @author nodelog     */    public function getStore()    {        return $this->hasOne(Store::className(), ['user_id' => 'id']);    }    /**     * 查询后对数据处理     * @author nodelog     */    public function afterFind()    {        parent::afterFind();//        $this->nickname = $this->formatNickname();        //更新vip状态//        $this->isVip();    }    /**     * 获取分销等级     * @return \yii\db\ActiveQuery     * @author nodelog     */    public function getShareLevel()    {        return $this->hasOne(ShareLevel::className(), ['id' => 'level_id']);    }    /**     * 分销海报     *     * @param bool $force     * @return bool|mixed|string     * @throws ServerErrorHttpException     * @author nodelog     */    public function generateQrcode($force = false)    {        //海报存在直接返回        if ($this->qrcode && !$force) {            return $this->qrcode->url;        }        //小程序码中  scene 放入用户id        $scene = 'pid:' . \Yii::$app->user->id;        $hash = md5($scene);        $qrcodeFile = \Yii::getAlias('@storagePath/upload/qrcode/' . $hash . '.png');//path        $qrcodeUrl = \Yii::getAlias('@storageUrl/upload/qrcode/' . $hash . '.png');//path        try {            ini_set('memory_limit', '256M');            $editor = Grafika::createEditor(GrafikaHelper::getSupportEditorLib());            //背景图            $editor->open($userPoster, Yii::$app->storage->getPath(\Yii::$app->config->get('share_poster_bg')));            //生成推广码            /* @var Qrcode $qrcode */            $qrcode = (new Application())->driver("mini.qrcode");            //小程序码 buffer,宽度220            $qrcodeStream = $qrcode->unLimit($scene, 'pages/index/index', $extra = []);//buffer            $tempFile = \Yii::getAlias('@storagePath/upload/thumb/' . $hash . '.png');            if (!file_exists(dirname($tempFile))) {                @mkdir(dirname($tempFile), 0755, true);            }            file_put_contents($tempFile, $qrcodeStream);//            Yii::$app->storage->put($tempFile, $qrcodeStream);            $editor->open($wxappQrcode, $tempFile);            //测试二维码//            $editor->open($wxappQrcode, Yii::$app->storage->getPath('https://es.jiangzi.xin/storage/upload/20220408/OGGUn-K8HxojZfSesNv0OuVuAhRLYPzSJX0zEiyE.png'));            $avatarPath = Yii::$app->storage->getPath($this->getAvatar(540));            if (strpos($avatarPath, 'http') !== false) {                $avatarPath = Yii::$app->storage->thumbnail(\Yii::$app->config->get('share_image'), 540, 540);                $editor->open($avatar, Yii::$app->storage->getPath($avatarPath));            } else {                $editor->open($avatar, $avatarPath);            }//            $editor->resizeFill($goodsCover, 750, 750);            $editor->resizeExactWidth($avatar, 540);            //附加头像            $editor->blend($userPoster, $avatar, 'normal', 1.0, 'top-left', 105, 4900);            //写入文字            $fontFile = Yii::getAlias('@root/web/assets/fonts/st-heiti-light.ttc');            //加用户昵称            $editor->text($userPoster, mb_substr($this->nickname, 0, 12), 100, 750, 5000, new Color('#ffffff'), $fontFile, 0);            $editor->text($userPoster, Yii::$app->config->get('share_poster_text'), 70, 750, 5250, new Color('#ffffff'), $fontFile, 0);            //调整小程序码图片            $editor->resizeExactWidth($wxappQrcode, 660);            //附加小程序码图片            $editor->blend($userPoster, $wxappQrcode, 'normal', 1.0, 'top-right', -105, 4800);            //保存图片            $editor->save($userPoster, $qrcodeFile, 85);            //删除临时图片            unlink($tempFile);            //上传分销码            list($attachment, $error) = Attachment::uploadFromFile('qrcode', $qrcodeFile);            if ($error == null) {                $this->qrcode = [                    'id' => $attachment->id,                    'name' => $attachment->name,                    'hash' => $attachment->hash,                    'url' => $attachment->url,                    'path' => $attachment->path,                    'extension' => $attachment->extension,                    'type' => $attachment->type,                    'size' => $attachment->size                ];                if ($this->save(false)) {                    return ArrayHelper::getValue($this, 'qrcode.url', '');                }            }        } catch (Exception $e) {            throw new ServerErrorHttpException($e->getMessage());        }        return $qrcodeUrl;    }    /**     * 用户是否vip,并且未过期     * @author nodelog     */    public function isVip()    {        //vip自动过期        if ($this->is_vip) {            $vip = VipUser::find()->where(['user_id' => $this->id])->orderBy(['end_time' => SORT_DESC])->one();            if (!empty($vip) && $vip->isExpire()) {                $this->is_vip = StatusEnum::STATUS_OFF;                $this->save(false);            }        }        return $this->is_vip;    }    /**     * 获取当前vip     * @author nodelog     */    public function getCurrentVip()    {        $now = time();        return VipUser::find()->where(['user_id' => $this->id])->andWhere(['and', ['<=', 'start_time', $now], ['>', 'end_time', $now]])->one();    }////    public function fields() {//        $fields = parent::fields();////        $fields[] = 'dataCount';//        return $fields;//    }    /**     * 数据统计     * @author nodelog     */    public function getDataCount()    {        $data = [            [                'text' => '日课',                'count' => 0            ],            [                'text' => '总课',                'count' => 0            ],            [                'text' => '辅助课',                'count' => 0            ],        ];        //每日功课//        $data[0]['count'] = Data::find()->active()->andWhere(['user_id' => $this->id])->today()->count();        //累积功课//        $data[1]['count'] = Data::find()->active()->andWhere(['user_id' => $this->id])->count();        //辅助功课//        $userIds = VipUser::find()->active()->andWhere(['pay_user_id' => $this->id])->andWhere(['!=', 'user_id', $this->id])->select(['user_id'])->distinct()->column();//        $data[2]['count'] = Data::find()->active()->andWhere(['in', 'user_id', $userIds])->count();        //直接获取辅助榜数据//        $helpCount = DataRank::find()->active()->andWhere(['user_id' => $this->id, 'level' => DataTypeEnum::TYPE_HELP])->total()->select(['count'])->scalar();//        $data[2]['count'] = $helpCount ? $helpCount : 0;        return $data;    }}
 |