123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- <?php
- namespace app\api\controller;
- use app\event\Msg;
- use app\logics\EmployeeLogic;
- use app\logics\OrgLogic;
- use app\model\Company;
- use app\model\CustomerClue;
- use app\model\Employee;
- use app\model\Miniprogram;
- use app\model\User as ModelUser;
- use app\model\Wechat;
- use Firebase\JWT\JWT;
- use openssl\Aes;
- use wx\miniprogram\User as MiniprogramUser;
- class Users extends Base
- {
- /**
- * 用户登陆
- * @return json [code:状态,token:jwt_token, exist:是否已注册]
- */
- public function code2session($code)
- {
- // 小程序类型获取
- $miniType = $this->request->param('client_type');
- // 查找小程序根部门
- if (!empty($miniType)) {
- $miniprogram = Miniprogram::where([['notify', '=', $miniType]])->findOrEmpty();
- $rootOrg = $miniprogram->root_id;
- $miniprogramId = Company::where('root_id', $rootOrg)->value('mini');
- $miniprogram = Wechat::findOrEmpty($miniprogramId);
- } else {
- $defaultRootOrg = Miniprogram::where([['notify', '=', config('app.cgi')]])->value('root_id');
- if (empty($client)) {
- $miniprogram = Wechat::findOrEmpty(1);
- } else {
- $miniprogram = Wechat::where('appid', $client)->findOrEmpty();
- }
- }
- if ($miniprogram->isEmpty()) return json(['code' => self::error_msg, 'msg' => '未授权的小程序']);
- // code获取用户信息
- $rs = (new MiniprogramUser())->code2session($miniprogram->appid, $miniprogram->secret, $code);
- if (isset($rs['errcode']) && $rs['errcode'] != 0) {
- return json(['code' => self::error_debug_msg, 'msg' => $rs['errmsg']]);
- }
- // 初始token
- $token = [
- 'openid' => $rs['openid'],
- 'session_key' => $rs['session_key'],
- 'client_type' => $miniType,
- 'isEmployee' => false,
- 'mini' => $miniprogram->id
- ];
- $multi = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->count(); // 查询用户数量
- if ($multi == 1) {
- $user = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->find();
- if (!empty($rootOrg) && $user->root_id != $rootOrg) $user = null;
- } elseif ($multi > 1) {
- if (!empty($rootOrg)) {
- $user = ModelUser::whereOr([[['unionid', '=', $rs['unionid']], ['root_id', '=', $rootOrg]], [['mini_openid', '=', $rs['openid']], ['root_id', '=', $rootOrg]]])->find();
- } else {
- // 查询用户最后进入记录
- $user = ModelUser::whereOr([['unionid', '=', $rs['unionid']], ['mini_openid', '=', $rs['openid']]])->order('updatetime desc')->find();
- }
- }
- if (empty($user)) {
- $data = [
- 'mini_openid' => $rs['openid'],
- 'unionid' => $rs['unionid'],
- 'root_id' => $rootOrg ?? $defaultRootOrg,
- 'updatetime' => date('Y-m-d H:i:s')
- ];
- $user = ModelUser::create($data);
- } else {
- $user->updatetime = date('Y-m-d H:i:s');
- if (empty($user->unionid)) $user->unionid = $rs['unionid'];
- $user->mini_openid = $rs['openid'];
- $user->save();
- }
- $rootOrg = $user->root_id;
- $token['root_org'] = $rootOrg;
- $token['client_type'] = Miniprogram::where(['root_id' => $rootOrg])->value('notify');
- $token['uid'] = $user->id;
- $userData = $user->visible(['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone'])->toArray();
- $employee = Employee::where([['uid', '=', $user->id], ['state', 'in', ['在职', '待审核']]])->find();
- if ($employee) {
- $employee->save(['updatetime' => date('Y-m-d H:i:s')]);
- if ($employee->disable == 0) {
- $userData['binded'] = [
- 'id' => $employee->id,
- 'name' => $employee->name,
- 'org_name' => $employee->org->name,
- 'org_id' => $employee->org_id,
- 'isManager' => $employee->is_manager,
- 'isNewbie' => $employee->is_newbie,
- 'state' => $employee->state,
- 'qrcode' => $employee->qrcode
- ];
- }
- $token['isEmployee'] = true;
- $token['employee_id'] = $employee->id;
- $token['org_id'] = $employee->org_id;
- }
- $shareuser = null;
- $share = $this->request->param('share');
- $share_agent_id = $this->request->param('share_agent_id'); //通过经纪人分享打开的
- $share_agent_id = isset($share_agent_id)&&!empty($share_agent_id) ? $share_agent_id : 0;
- if ($share && !$token['isEmployee']) {
- $shareuser = ModelUser::where(['id' => $share, 'root_id' => $rootOrg])->field('id,nickname,headimgurl,phone')->find();
- if ($shareuser) {
- $shareBind = Employee::where(['uid' => $shareuser->id])->find();
- if ($shareBind && $shareBind['state'] == '离职' && $shareBind['left_to_empid']) { // 如果分享人已离职
- $shareBind = Employee::where(['id' => $shareBind['left_to_empid']])->find();
- $shareuser = ModelUser::where('id', $shareBind->uid)->field('id,nickname,headimgurl,phone')->find();
- }
- $token['share'] = $shareuser->id;
- if ($shareBind && $shareBind['state'] == '在职') {
- $token['share_employee'] = $shareBind->id;
- $token['share_org'] = $shareBind->org_id;
- $token['share_agent_id'] = $share_agent_id; //经纪人分享的
- $shareuser['qrcode'] = $shareBind->qrcode;
- }
- if (!$token['isEmployee'] && !empty($user->nickname) && !empty($user->headimgurl)) {
- $this->addClue([
- 'uid' => $userData['id'],
- 'employee_id' => $token['share_employee'] ?? 0,
- 'org_id' => $token['share_org'] ?? $token['root_org'],
- 'agent_id' => $share_agent_id
- ], $token['root_org']);
- }
- }
- }
- $company = Company::where('root_id', $rootOrg)->find()->toArray();
- $company['client_type'] = $token['client_type'];
- // 信息加密
- $data = http_build_query($token);
- $aes = new Aes(config('app.jwt_key'));
- $key = $aes->encrypt($data);
- // token数据设置
- $payload = array(
- "iss" => "https://" . $this->request->domain(),
- "aud" => 'mini',
- "iat" => time(),
- "nbf" => time(),
- "data" => $key
- );
- // 自定义登陆状态
- $token = JWT::encode($payload, config('app.jwt_key'));
- $returnData = ['code' => self::success, 'token' => $token, 'user' => $userData, 'company' => $company['company_name'], 'company_data' => $company];
- empty($shareuser) ?: $returnData['share'] = $shareuser;
- return json($returnData);
- }
- private function addClue($data, $root_id)
- {
- // 如果线索是员工(包含运维,已离职,待审核)
- $isEmployee = Employee::where([['uid', '=', $data['uid']], ['root_id', '=', $root_id], ['state', 'in', ['在职', '待审核']]])->find();
- if ($isEmployee) return false;
- // 如果线索已经获取过,更新时间
- if ($data['employee_id'] == 0) { // 判断是否有员工已获取
- CustomerClue::where([['uid', '=', $data['uid']]])->update(['updatetime' => date('Y-m-d H:i:s')]);
- } else { // 判读是否重复获取
- $rs = CustomerClue::where([['uid', '=', $data['uid']], ['employee_id', '=', $data['employee_id']]])->update(['updatetime' => date('Y-m-d H:i:s')]);
- // 没有更新过,创建线索
- if (!$rs && $data['employee_id'] !== 0) {
- CustomerClue::create($data);
- }
- }
- }
- /**
- * 授权获取用户信息(客户小程序调用)
- */
- public function setUserInfo($encryptedData, $iv, $signature, $rawData)
- {
- $request = request();
- $token = $request->token;
- // 计算签名是否正确
- $sign = sha1($rawData . $token['session_key']);
- if ($sign != $signature) {
- return json(['code' => self::error_debug_msg, 'msg' => '签名验证失败']);
- }
- $miniprogram = Wechat::where([['id', '=', $token['mini']]])->find();
- // 解析获取用户数据
- $mini = new MiniprogramUser();
- $data = $mini->getInfo($miniprogram->appid, $token['session_key'], $encryptedData, $iv);
- $user = ModelUser::where([['mini_openid', '=', $request->token['openid']], ['root_id', '=', $token['root_org']]])->find();
- // 保存用户信息
- $user->save([
- 'city' => $data['city'],
- 'province' => $data['province'],
- 'country' => $data['country'],
- 'sex' => $data['gender'],
- 'nickname' => $data['nickName'],
- 'headimgurl' => $data['avatarUrl']
- ]);
- // 更新token
- if (!$token['isEmployee']) {
- // 添加客户线索
- $this->addClue([
- 'uid' => $token['uid'],
- 'employee_id' => $token['share_employee'] ?? 0,
- 'org_id' => $token['share_org'] ?? $token['root_org'],
- 'agent_id' => $token['share_agent_id'] ?? 0
- ], $token['root_org']);
- }
- return json(['code' => self::success, 'msg' => '信息保存成功']);
- }
- /**
- * 授权获取并保存用户手机号
- */
- public function setUserMobile($encryptedData, $iv)
- {
- $request = request();
- $miniprogram = Wechat::where([['id', '=', $request->token['mini']]])->find();
- $mini = new MiniprogramUser();
- $data = $mini->getInfo($miniprogram->appid, $request->token['session_key'], $encryptedData, $iv);
- $user = ModelUser::where([['mini_openid', '=', $request->token['openid']], ['root_id', '=', $request->token['root_org']]])->find();
- $user->save(['phone' => $data['phoneNumber']]);
- // 线索更新手机号
- if (!$request->token['isEmployee'] && !empty($request->token['share_employee'])) {
- CustomerClue::where([
- 'uid' => $request->token['uid'],
- 'employee_id' => $request->token['share_employee']
- ])->update(['phone' => $data['phoneNumber']]);
- }
- return json(['code' => self::success, 'msg' => '信息保存成功', 'mobile' => $data['phoneNumber']]);
- }
- /**
- * 员工注册
- */
- public function register()
- {
- $params = request()->param(['is_manager', 'name', 'orgid']);
- $result = EmployeeLogic::addemployee($params, $msg);
- if ($result) {
- $leader = Employee::where(['org_id' => $params['orgid'], 'is_manager' => 1])->column('id');
- event(new Msg($leader, '您接收到一条新审批,请点击前往审阅', 'register'));
- return json(['code' => 0, 'msg' => '成功提交', 'data' => $result]);
- } else {
- return json(['code' => 1, 'msg' => $msg]);
- }
- }
- /**
- * 组织结构
- */
- public function org()
- {
- $token = request()->token;
- $data = OrgLogic::struc($token['root_org']);
- return json(['code' => 0, 'data' => $data]);
- }
- }
|