32], [['USER_NAME', 'SPOUSE_NAME', 'TEL'], 'string', 'max' => 16], [['PASSWORD_HASH', 'PAY_PASSWORD', 'ID_IMAGE', 'BANK_ADDRESS', 'AVATAR'], 'string', 'max' => 255], [['REAL_NAME', 'APP_CLIENT_ID', 'BONUS_APP_CLIENT_ID'], 'string', 'max' => 128], // [['ID_CARD', 'SPOUSE_IDCARD'], 'string','min' => 18, 'max' => 18], // [['MOBILE'], 'string','min' => 11, 'max' => 11], [['ADDRESS', 'DEC_ADDRESS'], 'string', 'max' => 2000], [['DEC_ACCOUNT_OLD', 'GUARANTOR_NAME'], 'string', 'max' => 64], [['PART_FUNC_CLOSED_REMARK'], 'string', 'max' => 4000], [['USER_NAME'], 'unique'], [['ID'], 'unique'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'ID' => 'ID', 'USER_NAME' => Yii::t('app', 'userName'), 'PASSWORD_HASH' => Yii::t('app', 'passwordHash'), 'PAY_PASSWORD' => Yii::t('app', 'payPassword'), 'NATION' => Yii::t('app', 'nation'), 'REAL_NAME' => Yii::t('app', 'realName'), 'ID_CARD' => Yii::t('app', 'IDCard'), 'ID_TYPE' => Yii::t('app', 'IDType'), 'MOBILE' => Yii::t('app', 'mobile'), 'ADDRESS' => Yii::t('app', 'address'), 'ID_IMAGE' => Yii::t('app', 'IDImage'), 'OPEN_BANK' => Yii::t('app', 'openBank'), 'BANK_ADDRESS' => Yii::t('app', 'bankAddress'), 'BANK_NO' => Yii::t('app', 'bankNo'), 'BANK_PROVINCE' => Yii::t('app', 'bankProvince'), 'BANK_CITY' => Yii::t('app', 'bankCity'), 'BANK_COUNTY' => Yii::t('app', 'bankCounty'), 'SPOUSE_NAME' => Yii::t('app', 'spouseName'), 'SPOUSE_IDCARD' => Yii::t('app', 'spouseIDCard'), 'CREATED_AT' => Yii::t('app', 'createAt'), 'UPDATED_AT' => Yii::t('app', 'updateAt'), 'STATUS' => Yii::t('app', 'status'), 'DEC_CLOSED' => Yii::t('app', 'decClosed'), 'DEC_CLOSED_AT' => Yii::t('app', 'decClosedAt'), 'DEC_LV' => Yii::t('app', 'decLv'), 'EMP_LV' => Yii::t('app', 'empLv'), 'CROWN_LV' => Yii::t('app', 'crownLv'), 'PROVINCE' => Yii::t('app', 'province'), 'CITY' => Yii::t('app', 'city'), 'COUNTY' => Yii::t('app', 'county'), 'TEL' => Yii::t('app', 'tel'), 'SUB_COM_ID' => Yii::t('app', 'subComID'), 'AVATAR' => Yii::t('app', 'avatar'), 'DELETED' => Yii::t('app', 'deleted'), 'DELETED_AT' => Yii::t('app', 'deletedAt'), 'IS_DEC' => Yii::t('app', 'isDec'), 'IS_ATLAS' => Yii::t('app', 'isAtlas'), 'IS_RECHARGE' => Yii::t('app', 'isRecharge'), 'DEC_ID' => Yii::t('app', 'DEC_ID'), 'BIRTHDAY' => Yii::t('app', 'birthday'), 'DEC_ROLE_ID' => Yii::t('app', 'decRoleID'), 'PERIOD_AT' => Yii::t('app', 'periodAt'), 'DEC_PROVINCE' => Yii::t('app', 'decProvince'), 'DEC_CITY' => Yii::t('app', 'decCity'), 'DEC_COUNTY' => Yii::t('app', 'decCounty'), 'IS_UNION' => Yii::t('app', 'isUnion'), 'STATUS_AT' => Yii::t('app', 'statusAt'), 'VERIFIED' => Yii::t('app', 'verified'), 'VERIFIED_AT' => Yii::t('app', 'verifiedAt'), 'ALLOW_LOGIN' => Yii::t('app', 'allowLogin'), 'NOT_OPERATING' => Yii::t('app', 'notOperating'), 'REG_FROM' => Yii::t('app', 'regFrom'), 'ID_CARD_PREFIX' => Yii::t('app', 'IDCardPrefix'), 'SEX' => Yii::t('app', 'sex'), 'DEC_ACCOUNT_OLD' => Yii::t('app', 'decAccountOld'), 'BANK_UPDATED_AT' => Yii::t('app', 'bankUpdatedAt'), 'IS_DIRECT_SELLER' => Yii::t('app', 'isDirectSeller'), 'DEC_LV_UPDATED_AT' => Yii::t('app', 'decLvUpdatedAt'), 'DEC_LV_UPDATED_PERIOD' => Yii::t('app', 'decLvUpdatedPeriod'), 'DEC_ADDRESS' => Yii::t('app', 'decAddress'), 'DEC_PHONE' => Yii::t('app', 'decPhone'), 'GUARANTOR' => Yii::t('app', 'guarantor'), 'GUARANTOR_NAME' => Yii::t('app', 'guarantorName'), 'PART_FUNC_CLOSED' => Yii::t('app', 'partFuncClosed'), 'LAST_DEC_LV_UPDATED_PERIOD' => Yii::t('app', 'lastDecLvUpdatedPeriod'), 'USER_CREATOR' => Yii::t('app', 'userCreator'), 'USER_UPDATER' => Yii::t('app', 'userUpdater'), 'LAST_DEC_LV_UPDATED_AT' => Yii::t('app', 'lastDecLvUpdatedAt'), 'DEC_CREATED_AT' => Yii::t('app', 'decCreatedAt'), 'PART_FUNC_CLOSED_REMARK' => Yii::t('app', 'partFuncClosedRemark'), 'DEC_CREATED_PERIOD' => Yii::t('app', 'decCreatedPeriod'), 'PASSWORD_CHANGED' => Yii::t('app', 'passwordChanged'), 'SUB_COM_LEADER' => Yii::t('app', 'subComLeader'), 'ZG_UPGRADE_PV' => Yii::t('app', 'zgUpgradePv'), 'APP_CLIENT_ID' => Yii::t('app', 'appClientID'), 'READ_AGREEMENT' => Yii::t('app', 'readAgreement'), 'LAST_DEC_LV' => Yii::t('app', 'lastDecLv'), 'BONUS_APP_CLIENT_ID' => Yii::t('app', 'bonusAppClientID'), 'IS_FIRST_OPEN' => Yii::t('app', 'isFirstOpen'), 'IS_MODIFY_PASSWORD' => Yii::t('app', 'isModifyPassword'), 'IS_STUDIO' => Yii::t('app', 'isStudio'), 'EMAIL' => Yii::t('app', 'email'), 'COUNTRY_ID' => Yii::t('app', 'country'), ]; } public function getUserInfo() { return $this->hasOne(UserInfo::class, ['USER_ID' => 'ID']); } /** * 获取会员基本信息 * @param $userId * @return array|null|\yii\db\ActiveRecord */ public static function getBaseInfo($userId){ return static::findUseSlaves()->where('ID=:ID', [':ID'=>$userId])->asArray()->one(); } /** * 获取用户基本信息从redis里面 * @param $userId * @return array|null|\yii\db\ActiveRecord */ public static function getBaseInfoFromRedis($userId) { return static::find()->select('ID,USER_NAME,NATION,COUNTRY_ID,LANGUAGE_ID,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,ELITE_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY,EMAIL')->where('ID=:ID', [':ID'=>$userId])->asArray()->one(); } /** * 更新缓存 * @param $userId * @return mixed */ public static function updateBaseInfoToRedis($userId){ $userInfo = static::find()->select('ID,USER_NAME,NATION,COUNTRY_ID,LANGUAGE_ID,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,ELITE_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY,EMAIL')->where('ID=:ID', [':ID'=>$userId])->asArray()->one(); return Yii::$app->redis->hset(Cache::USER_INFO_KEY, $userId, Json::encode($userInfo)); } /** * @param $userId * 删除用户信息缓存 */ public static function deleteBaseInfoFromRedis($userId) { Yii::$app->redis->hdel(Cache::USER_INFO_KEY, $userId); } /** * 批量删除用户 * @return void */ public static function deleteAllBaseInfoFromRedis() { \Yii::$app->redis->del(Cache::USER_INFO_KEY); } /** * 判断用户是否是观察期 * 观望期:自加入算起2个月 * 例子:2022年5月14日加入, 观望期至2022年7月31日。 * true为是观察期用户 false为不是观察期用户 */ public static function checkIsObserve($addAt, $month) { if (empty($month)) { // 如果0 代表全站全额升级 return false; } $appendMonth = date("Y-m", strtotime("first day of +$month month", $addAt)); // 指定月份 $lastDay = date("t", strtotime($appendMonth)); // 获取指定月的最后一天 $eTime = strtotime($appendMonth.'-'.$lastDay); return time() < $eTime; } // 获取用户报单PV总和 public static function sumDevPvByUserId($userId) { $decOrderPv = DecOrder::find() ->select('SUM(DEC_PV) AS PV_SUM') ->where('TO_USER_ID=:TO_USER_ID AND IS_DEL=0', ['TO_USER_ID'=>$userId] ) ->asArray() ->one(); $decOrderPv = isset($decOrderPv['PV_SUM']) ? $decOrderPv['PV_SUM'] : 0; $orderDecPv = OrderDec::find() ->select('SUM(PAY_PV) AS PV_SUM') ->where('USER_ID=:USER_ID AND IS_DELETE=0', [ 'USER_ID'=>$userId, ] ) ->asArray() ->one(); $orderDecPv = isset($orderDecPv['PV_SUM']) ? $orderDecPv['PV_SUM'] : 0; // 还得加上用户在老系统中的所有报单PV之和 $originPv = OriginDecPv::find() ->select('SUM(DEC_PV) AS PV_SUM') ->where('USER_ID=:USER_ID', [ 'USER_ID'=>$userId, ] ) ->asArray() ->one(); $originPv = isset($originPv['PV_SUM']) ? $originPv['PV_SUM'] : 0; $total = $orderDecPv + $decOrderPv + $originPv; return $total; } /** * 获取会员的部分信息并对敏感信息加密 * @param $userId * @return array */ public static function getEnCodeInfo($userId){ $userInfo = self::getBaseInfoFromRedis($userId); return [ 'ID' => $userId, 'USER_NAME' => $userInfo['USER_NAME'], 'NATION' => \Yii::$app->params['nation'][$userInfo['NATION']]['name']??'', 'NATION_ID' => \Yii::$app->params['nation'][$userInfo['NATION']]['id']??'', 'REAL_NAME' => $userInfo['REAL_NAME'], 'ID_CARD' => $userInfo['ID_CARD'], 'MOBILE' => $userInfo['MOBILE'], 'AVATAR' => $userInfo['AVATAR'], 'VERIFIED' => $userInfo['VERIFIED'], 'IS_UNION' => $userInfo['IS_UNION'], 'IS_DEC' => $userInfo['IS_DEC'], 'IS_ATLAS' => $userInfo['IS_ATLAS'], 'IS_RECHARGE' => $userInfo['IS_RECHARGE'], 'IS_STUDIO' => $userInfo['IS_STUDIO'], 'DEC_ROLE_ID' => $userInfo['DEC_ROLE_ID'], 'OPEN_BANK' => $userInfo['OPEN_BANK'], 'BANK_ADDRESS' => $userInfo['BANK_ADDRESS'], 'DEC_LV' => $userInfo['DEC_LV'] ?: DeclarationLevel::getDefaultLevelId(), 'EMP_LV' => $userInfo['EMP_LV'] ?: EmployLevel::getDefaultLevelId(), 'ELITE_LV' => $userInfo['ELITE_LV'] ?: EliteLevel::getDefaultLevelId(), 'PROVINCE' => $userInfo['PROVINCE'], 'CITY' => $userInfo['CITY'], 'COUNTY' => $userInfo['COUNTY'], 'BANK_NO' => $userInfo['BANK_NO'], 'EMAIL' => $userInfo['EMAIL'] ?? '', 'COUNTRY_ID' => $userInfo['COUNTRY_ID'], 'LANGUAGE_ID' => $userInfo['LANGUAGE_ID'], ]; } /** * 验证密码 * @param $password * @return bool */ public function validatePassword($password) { if( !$this->PASSWORD_HASH ) return false; return password_verify($password, $this->PASSWORD_HASH); } /** * 验证支付密码 * @param $payPassword * @return bool */ public function validatePasswordPay($payPassword) { if( !$this->PAY_PASSWORD ) return false; return password_verify($payPassword, $this->PAY_PASSWORD); } /** * 检验支付密码 * @param $userId * @param $password * @return bool */ public static function validatePayPassword($userId, $password){ $oneUser = static::find()->select('PAY_PASSWORD')->where('ID=:ID', [':ID'=>$userId])->asArray()->one(); if($oneUser){ return password_verify($password, $oneUser['PAY_PASSWORD']); } else { return false; } } /** * 操作日志记录条件 * @return array */ public function attrLabelsWithLogType(){ return [ 'ID' => 'ID', 'USER_NAME' => '帐号', 'NATION' => [ 'label' => '民族', 'type' => function($data){ $value = $data['value']; return \Yii::$app->params['nation'][$value]['name']??''; }, ], 'REAL_NAME' => '姓名', 'ID_CARD' => '身份证号', 'ID_TYPE' => [ 'label' => '证件类型', 'type' => function($data){ return '身份证'; }, ], 'MOBILE' => '手机号', 'ADDRESS' => '身份证地址', 'ID_IMAGE' => '证件图片', 'OPEN_BANK' => '开户行', 'BANK_ADDRESS' => '银行地址', 'BANK_NO' => '银行卡号', 'COUNTRY' => '国家', 'BANK_PROVINCE' => [ 'label' => '银行省份', 'type' => ValueTypeConfig::REGION_TYPE ], 'BANK_CITY' => [ 'label' => '银行城市', 'type' => ValueTypeConfig::REGION_TYPE ], 'BANK_COUNTY' => [ 'label' => '银行县区', 'type' => ValueTypeConfig::REGION_TYPE ], 'SPOUSE_NAME' => '配偶姓名', 'SPOUSE_IDCARD' => '配偶证件号', 'STATUS' => [ 'label' => '状态', 'type' => ValueTypeConfig::USER_STATUS_TYPE ], 'DEC_CLOSED' => [ 'label' => '是否关闭报单功能', 'type' => ValueTypeConfig::YES_NO_TYPE, ], 'DEC_CLOSED_AT' => [ 'label' => '关闭报单时间', 'type' => ValueTypeConfig::DATE_TIME_TYPE, ], 'DEC_LV' => [ 'label' => '报单级别', 'type' => ValueTypeConfig::DEC_LV_TYPE, ], 'EMP_LV' => [ 'label' => '聘级', 'type' => ValueTypeConfig::EMP_LV_TYPE, ], 'CROWN_LV' => [ 'label' => '星级', 'type' => ValueTypeConfig::CROWN_LV_TYPE, ], 'LAST_DEC_LV' => [ 'label' => '上次的报单级别', 'type' => ValueTypeConfig::DEC_LV_TYPE, ], 'PROVINCE' => [ 'label' => '省份', 'type' => ValueTypeConfig::REGION_TYPE ], 'CITY' => [ 'label' => '城市', 'type' => ValueTypeConfig::REGION_TYPE ], 'COUNTY' => [ 'label' => '县区', 'type' => ValueTypeConfig::REGION_TYPE ], 'TEL' => '备用手机号码', 'SUB_COM_ID' => '分公司ID', 'TRANSFER_PROP' => '转帐比例', 'IS_DEC' => [ 'label' => '是否为报单中心', 'type' => ValueTypeConfig::YES_NO_TYPE, ], 'DEC_ROLE_ID' => [ 'label' => '报单中心级别', 'type' => ValueTypeConfig::DEC_ROLE_ID_TYPE, ], 'IS_UNION' => [ 'label' => '是否为点位合作', 'type' => ValueTypeConfig::YES_NO_TYPE, ], 'STATUS_AT' => '状态修改时间', 'ALLOW_LOGIN' => [ 'label' => '是否允许商城登录', 'type' => ValueTypeConfig::YES_NO_TYPE, ], 'NOT_OPERATING' => [ 'label' => '不运作', 'type' => ValueTypeConfig::YES_NO_TYPE, ], 'BIRTHDAY' => '生日', 'SEX' => '性别', 'EMAIL' => 'Email' ]; } }