'状态', 'role' => '角色', 'code' => '微信code', 'mobile' => '手机号', 'smsCode' => '验证码', ]; } public function userlogin() { if (!$this->validate()) { throw new Exception($this->getErrorMsg()); } switch ($this->status) { case 1;//1微信登录 if (!$this->code) { throw new Exception('微信code不能为空'); } if (!$this->plate_type) { throw new Exception('平台plate_type不能为空'); } return $this->login(); case 3://3手机号登录 if (!$this->mobile) { throw new Exception('mobile不能为空'); } if (!$this->smsCode) throw new Exception('验证码不能为空'); return $this->phoneLogin(); case 4://4手机号注册 if (!$this->plate_type) { throw new Exception('平台plate_type不能为空'); } if (!$this->mobile) { throw new Exception('mobile不能为空'); } if (!$this->role) { throw new Exception('role不能为空'); } if (!$this->smsCode) throw new Exception('验证码不能为空'); return $this->PhoneRegister(); case 5: // 开发登陆 if (!YII_DEBUG) { return []; } if (!$this->mobile) { throw new Exception('mobile不能为空'); } $ServiceUser = ServiceUser::findOne(['mobile' => $this->mobile]); if (!$ServiceUser) { throw new Exception('用户不存在'); } $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $ServiceUser->id; $token = \Yii::$app->security->generateRandomString() . '_' . time(); $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); $StoreDoctor = StoreDoctor::find()->where([ 'su_id' => $ServiceUser->id, 'is_delete' => 0, ])->one(); if (!$StoreDoctor){ throw new Exception('您还没有门店,请先去完善信息'); } //更新登录时间 $StoreDoctor->su_id = $ServiceUser->id; $StoreDoctor->id = $StoreDoctor->id; $StoreDoctor->store_id = $StoreDoctor->store_id; $StoreDoctor->last_login_time = time(); $StoreDoctor->is_delete = 0; $StoreDoctor->saveOrFail(); return [ 'token' => $token, 'StoreDoctor' => $StoreDoctor, ]; } } /** * 微信登录 */ public function login() { $token = \Yii::$app->security->generateRandomString() . '_' . time(); $login = WechatService::getInstance()->app->auth->session($this->code); if(isset($login['errmsg'])){ throw new Exception($login['errmsg']); } $ServiceUser = ServiceUser::findOne(['openid' => $login['openid']]); switch ($this->plate_type){ //线上 case 1: try { $transaction = \Yii::$app->db->beginTransaction(); if (!$ServiceUser) { $ServiceUser = new ServiceUser(); } $ServiceUser->openid = $login['openid']; $ServiceUser->session_key = $login['session_key']; $ServiceUser->unionid = isset($login['unionid']) ? $login['unionid'] : ''; $ServiceUser->nickname = $ServiceUser['nickname'] ?? '微信用户'; $ServiceUser->plate_type = $this->plate_type; $ServiceUser->role=UserRoleEnum::DOCTOR; $ServiceUser->saveOrFail(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $ServiceUser->id; $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); $transaction->commit(); }catch (\Exception $e){ $transaction->rollBack(); throw new Exception($e->getMessage()); } try { $t = \Yii::$app->db1->beginTransaction(); \Yii::$app->db1->createCommand()->insert('yii_service_user',[ 'role'=>UserRoleEnum::DOCTOR, 'status'=>UserStatusEnum::WAIT_JH, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); $su_id=\Yii::$app->db1->getLastInsertID(); \Yii::$app->db1->createCommand()->insert('yii_service_user_token',[ 'su_id'=>$su_id, 'token'=>$token, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); $sql="select * from yii_doctor_platform where su_id=$su_id and platform_doctor_id=$ServiceUser->id"; $is_exist=\Yii::$app->db1->createCommand($sql)->queryOne(); $platform_id=1; if (!$is_exist){ //用户平台关系表 \Yii::$app->db1->createCommand()->insert('yii_doctor_platform',[ 'su_id'=>$su_id, 'platform_doctor_id'=>$ServiceUser->id, 'platform_id'=>$platform_id, 'platform_store_id'=>\Yii::$app->store, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); } $t->commit(); }catch (\Exception $e){ $t->rollBack(); throw new Exception($e->getMessage()); } $StoreDoctor = StoreDoctor::find()->where([ 'su_id' => $ServiceUser->id, ])->with(['serviceUser']) ->asArray()->one(); // 把ServiceUser信息存在Redis里面(使用DB 1,key前缀加上doctor_wx区分) $ServiceUserData = [ 'user' => [ 'id' => $ServiceUser->id, 'mobile' => $ServiceUser->mobile ?? '', 'nickname' => $ServiceUser->nickname ?? '微信用户', 'role' => $ServiceUser->role, 'status' => $ServiceUser->status, 'plate_type' => $ServiceUser->plate_type, ] ]; \Yii::$app->redis->select(1); \Yii::$app->redis->set('xiaokang_database_xk_user_doctor_wx_' . $token, json_encode($ServiceUserData)); return [ 'token'=>$token, 'data'=>$StoreDoctor ]; break; //线下 case 2: $transaction = \Yii::$app->db->beginTransaction(); try { if (!$ServiceUser) { $ServiceUser = new ServiceUser(); } if ($ServiceUser->status==UserStatusEnum::FORBID && $ServiceUser->role==UserRoleEnum::DOCTOR){ throw new Exception('您的账号已停用,请联系后台工作人员!!'); } $ServiceUser->openid = $login['openid']; $ServiceUser->session_key = $login['session_key']; $ServiceUser->unionid = isset($login['unionid']) ? $login['unionid'] : ''; $ServiceUser->nickname = $ServiceUser['nickname'] ?? '微信用户'; $ServiceUser->plate_type = $this->plate_type; $ServiceUser->role=UserRoleEnum::DOCTOR; $ServiceUser->saveOrFail(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $ServiceUser->id; $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); $StoreDoctor = StoreDoctor::find()->where([ 'su_id' => $ServiceUser->id, 'is_delete' => 0, ])->one(); if (!$StoreDoctor){ throw new Exception('您还没有门店'); } //更新门店登录时间 $StoreDoctor->id=$StoreDoctor->id; $StoreDoctor->last_login_time=time(); $StoreDoctor->saveOrFail(); $transaction->commit(); } catch (Exception $exception) { $transaction->rollBack(); throw new Exception('登录失败:' . $exception->getMessage() . ' APPID:' . WechatService::getInstance()->app->getConfig()['app_id']); } $StoreDoctor = StoreDoctor::find()->where([ 'su_id' => $ServiceUser->id, ])->with(['serviceUser'])->asArray()->one(); // 把ServiceUser信息存在Redis里面(使用DB 1,key前缀加上doctor_wx区分) $ServiceUserData = [ 'user' => [ 'id' => $ServiceUser->id, 'mobile' => $ServiceUser->mobile ?? '', 'nickname' => $ServiceUser->nickname ?? '微信用户', 'role' => $ServiceUser->role, 'status' => $ServiceUser->status, 'plate_type' => $ServiceUser->plate_type, ] ]; \Yii::$app->redis->select(1); \Yii::$app->redis->set('xiaokang_database_xk_user_doctor_wx_' . $token, json_encode($ServiceUserData)); return [ 'token'=>$token, 'data'=>$StoreDoctor, 'ServiceInfo'=>$ServiceUser ]; default: throw new \yii\db\Exception('参数错误'); } } /** * 手机号登录 */ public function phoneLogin() { $cache = \Yii::$app->cache; if ($cache->get('login_sms_code_'.$this->mobile) || $this->smsCode=='999999') { if ($this->smsCode!='999999' && $cache->get('login_sms_code_'.$this->mobile) != $this->smsCode) { throw new Exception('手机验证码错误'); } $t = \Yii::$app->db->beginTransaction(); try { $ServiceUser = ServiceUser::find()->where([ 'mobile' => $this->mobile, 'is_delete'=>0 ])->one(); if (!$ServiceUser) throw new Exception('您还没有注册,请先注册账号'); if ($ServiceUser->status==UserStatusEnum::FORBID && $ServiceUser->role==UserRoleEnum::DOCTOR){ throw new Exception('您的账号已停用,请联系后台工作人员!!'); } $ServiceUser->nickname = $ServiceUser->nickname ?? '微信用户'; $ServiceUser->saveOrFail(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $ServiceUser->id; $token = \Yii::$app->security->generateRandomString() . '_' . time(); $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); $StoreDoctor = StoreDoctor::find()->where([ 'su_id' => $ServiceUser->id, 'is_online' => 1, 'is_delete' => 0, ])->one(); if (!$StoreDoctor){ $StoreDoctor=new StoreDoctor(); $StoreDoctor->su_id=$ServiceUser->id; $StoreDoctor->is_online=1; $StoreDoctor->store_id=\Yii::$app->store; $StoreDoctor->last_login_time=time(); $StoreDoctor->saveOrFail(); }else{ \Yii::$app->db->createCommand()->update(StoreDoctor::tableName(),['is_online'=>0],['su_id'=>$ServiceUser->id])->execute(); //更新门店登录时间 $StoreDoctor->is_online=1; $StoreDoctor->last_login_time=time(); if (!$StoreDoctor->saveOrFail())throw new Exception('更新门店登录时间失败'); } $t->commit(); // 把ServiceUser信息存在Redis里面(使用DB 1,key前缀加上doctor_wx区分) $ServiceUserData = [ 'user' => [ 'id' => $ServiceUser->id, 'mobile' => $ServiceUser->mobile ?? '', 'nickname' => $ServiceUser->nickname ?? '微信用户', 'role' => $ServiceUser->role, 'status' => $ServiceUser->status, 'plate_type' => $ServiceUser->plate_type, ] ]; \Yii::$app->redis->select(1); \Yii::$app->redis->set('xiaokang_database_xk_user_doctor_wx_' . $token, json_encode($ServiceUserData)); return [ 'token'=>$token, 'StoreDoctor'=>$StoreDoctor, 'ServiceUser'=>$ServiceUser ]; } catch (\Exception $e) { $t->rollBack(); throw new Exception($e->getMessage()); } } else { throw new Exception('验证码已过期,请从新获取验证码'); } } /** * 手机号注册 */ public function PhoneRegister() { $token = \Yii::$app->security->generateRandomString() . '_' . time(); $cache = \Yii::$app->cache; if ($cache->get('login_sms_code_'.$this->mobile)) { if ($cache->get('login_sms_code_'.$this->mobile) != $this->smsCode) { throw new Exception('手机验证码错误'); } switch ($this->plate_type){ case 1://线上 $ServiceUser = ServiceUser::find()->where( ['mobile' => $this->mobile,'is_delete'=>0] )->one(); $transaction = \Yii::$app->db1->beginTransaction(); try { $sql="select * from yii_service_user where mobile=$this->mobile"; $is_exist=\Yii::$app->db1->createCommand($sql)->queryOne(); $id=$is_exist['id']; if (!$is_exist){ \Yii::$app->db1->createCommand()->insert('yii_service_user',[ 'mobile'=>$this->mobile, 'role'=>UserRoleEnum::DOCTOR, 'status'=>UserStatusEnum::WAIT_JH, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); $su_id=\Yii::$app->db1->getLastInsertID(); \Yii::$app->db1->createCommand()->insert('yii_service_user_token',[ 'su_id'=>$su_id, 'token'=>$token, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); //添加线下数据 if (!$ServiceUser){ $Service_Users=new ServiceUser(); $Service_Users->mobile = $this->mobile; $Service_Users->nickname = '微信用户'; $Service_Users->role=UserRoleEnum::DOCTOR; $Service_Users->plate_type = $this->plate_type; $Service_Users->saveOrFail(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $Service_Users->id; $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); } $platform_doctor_id=$ServiceUser['id']??$Service_Users->id; $service_id=$id??$su_id; $sql="select * from yii_doctor_platform where su_id=$service_id and platform_doctor_id=$platform_doctor_id"; $doctor_platform=\Yii::$app->db1->createCommand($sql)->queryOne(); $platform_id=1; if (!$doctor_platform){ //用户平台关系表 \Yii::$app->db1->createCommand()->insert('yii_doctor_platform',[ 'su_id'=>$service_id, 'platform_doctor_id'=>$platform_doctor_id, 'platform_id'=>$platform_id, 'platform_store_id'=>\Yii::$app->store, 'created_at'=>time(), 'updated_at'=>time(), ])->execute(); } $transaction->commit(); return [ 'token'=>$token, 'data'=>$ServiceUser??$Service_Users ]; } if (!$ServiceUser){ $Service_Users=new ServiceUser(); $Service_Users->mobile = $this->mobile; $Service_Users->nickname = '微信用户'; $Service_Users->role=UserRoleEnum::DOCTOR; $Service_Users->plate_type = $this->plate_type; $Service_Users->saveOrFail(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $Service_Users->id; $ServiceUserToken->token = $token; $ServiceUserToken->saveOrFail(); return [ 'token'=>$token, 'data'=>$ServiceUser??$Service_Users ]; }else{ throw new Exception('您已注册,请去登录'); } }catch (\Exception $e){ $transaction->rollBack(); throw new Exception($e->getMessage()); } break; case 2://线下 $t = \Yii::$app->db->beginTransaction(); try { $ServiceUser = ServiceUser::find()->where( ['mobile' => $this->mobile,'is_delete'=>0] )->one(); if (!$ServiceUser){ $ServiceUser=new ServiceUser(); } $ServiceUser->mobile = $this->mobile; $ServiceUser->nickname = '微信用户'; $ServiceUser->plate_type = $this->plate_type; $ServiceUser->role=$this->role; $ServiceUser->status=UserStatusEnum::WAIT_JH; $ServiceUser->save(); $ServiceUserToken = new ServiceUserToken(); $ServiceUserToken->su_id = $ServiceUser->id; $ServiceUserToken->token = $token; $ServiceUserToken->save(); $t->commit(); return [ 'token'=>$token, 'ServiceUser'=>$ServiceUser ]; } catch (\Exception $e) { $t->rollBack(); throw new Exception($e->getMessage()); } default: return []; } } else { throw new Exception('验证码已过期,请从新获取验证码'); } } }