decrypt($share); $arr = explode('#',$value); if (empty($value) || count($arr) != 2) return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); $share_emp = Employee::where([['root_id','=',$arr[0]],['id','=',$arr[1]]])->findOrEmpty(); if($share_emp->isEmpty()) return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); $wxUser = new OffiaccountUser(); $appid = config('app.xq_official_appid'); $secret = config('app.xq_official_secret'); $data = $wxUser->getAccessTokenByCode($appid, $secret, $code); if (isset($data['errcode']) && in_array($data['errcode'], [40029, 40163, 41008, 42003])) { // code已经被使用 return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); } elseif (isset($data['errcode'])) { return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); } $userInfo = $wxUser->getH5UserInfo($data['access_token'], $data['openid']); if (isset($userInfo['errcode']) || $userInfo['nickname']=='微信用户') return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); // 查询用户信息是否存在 $user = User::whereOr([[['xq_official_openid', '=', $data['openid']], ['root_id', '=', $arr[0]]], [['xq_unionid', '=', $data['unionid']], ['root_id', '=', $arr[0]]]])->order('updatetime desc')->findOrEmpty(); if ($user->isEmpty()) { // $userInfo = $wxUser->getH5UserInfo($data['access_token'], $data['openid']); // if (isset($userInfo['errcode'])) return json(['code' => 1, 'data' => '获取失败', 'msg' => '获取失败']); $uid = User::insertGetId([ 'nickname' => $userInfo['nickname'], 'sex' => $userInfo['sex'], 'headimgurl' => $userInfo['headimgurl'], 'province' => $userInfo['province'], 'city' => $userInfo['city'], 'country' => $userInfo['country'], 'xq_official_openid' => $userInfo['openid'], 'xq_unionid' => $userInfo['unionid'] ?: '', 'root_id' => $arr[0], 'updatetime' => date('Y-m-d H:i:s') ]); } else { $user->updatetime = date('Y-m-d H:i:s'); if (empty($user->unionid)) $user->unionid = $data['unionid']; if (empty($user->xq_official_openid)) $user->xq_official_openid = $data['openid']; $user->nickname = $userInfo['nickname']; $user->headimgurl = $userInfo['headimgurl']; $user->save(); $uid = $user->id; } //员工不产生线索 $employee = Employee::whereOr([[['xq_official_openid', '=', $data['openid']], ['root_id', '=', $arr[0]]], [['xq_unionid', '=', $data['unionid']], ['root_id', '=', $arr[0]]]])->findOrEmpty(); if ($employee->isEmpty()){ $had = CustomerClue::where([['employee_id','=',$arr[1]],['uid','=',$uid]])->findOrEmpty(); if ($had->isEmpty()) { //建立线索关系 $data = [ 'employee_id' => $arr[1], 'uid' => $uid, 'org_id' => Employee::where('id',$arr[1])->value('org_id') ]; CustomerClue::create($data); } else { $had->updatetime = date('Y-m-d H:i:s'); $had->save(); } } $str = $arr[0].'#'.$user->id; $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = $aec->encrypt($str); return json(['code' => 0,'data'=>$token, 'msg' => '']); } /** * 分享页产生足迹api * 产生足迹条件 授权登陆成功 并且 进入详情成功 * * 足迹一定有访问时长 * 分享人一定存在 * 浏览人员uid一定存在 */ public function saveFoots() { $token = input('token'); //浏览人信息 root_id # uid 23#89 $type = input('type'); //浏览内容 $id = input('id'); //浏览内容 $time = input('time',3); //浏览时长 $share = input('share'); //分享人信息 root_id # eid 23#4116 //产生足迹的页面 这里的新分类需要在model 中 添加修改 $type_arr = [ 'building',//浏览楼盘 'groupVr', 'materialCase', 'construction', 'buildingHousetype' ]; if(!in_array($type,$type_arr)) return json(['code' => 1,'data'=>'无效参数', 'msg' => '无效参数']); $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = $aec->decrypt($token); $arr = explode('#',$token); if(!$token || count($arr) != 2) return json(['code' => 1,'data'=>'无效参数', 'msg' => '无效参数']); $share = $aec->decrypt($share); $arr1 = explode('#',$share); if(!$share || count($arr1) != 2) return json(['code' => 1,'data'=>'无效参数', 'msg' => '无效参数']); $emp = Employee::where([['root_id','=',$arr1[0]],['id','=',$arr1[1]]])->field('id,org_id')->findOrEmpty(); if($emp->isEmpty()) return json(['code' => 1,'data'=>'无效参数', 'msg' => '无效参数']); if ($type == 'building') { $data = Building::where([['root_id','=',$arr[0]],['id','=',$id]])->field('id,name,community_id')->findOrEmpty(); }elseif ($type == 'groupVr') { $data = VrGroup::where([['root_id','=',$arr[0]],['id|sid','=',$id]])->field('id,title')->findOrEmpty(); }elseif ($type=='materialCase') { $data = MaterialCase::where([['root_id','=',$arr[0]],['id','=',$id]])->field('id,title')->findOrEmpty(); }elseif($type=='construction'){ $data = Construction::where([['root_id','=',$arr[0]],['id','=',$id]])->field('id,name')->findOrEmpty(); }elseif ($type=='buildingHousetype') { $data = BuildingHousetype::where([['root_id','=',$arr[0]],['id','=',$id]])->field(['id','room','hall','bathroom'])->findOrEmpty(); } if($data->isEmpty()) return json(['code' => 1,'data'=>'无效参数', 'msg' => '无效参数']); $prompt = input('prompt',''); if($prompt) $data->prompt = $prompt;//提示 浏览了某个楼盘的vr 户型的vr $phone = input('phone',''); if($phone) $data->phone = $phone;//分享vr中有填写手机号量贩 $id = FootPrints::insertGetId([ 'uid' => $arr[1], 'employee_id' => $arr1[1], 'pipe_type' => $type, 'reg_info' => json_encode($data->toArray()), 'visit_due_time'=>$time, 'org_id' => $emp->org_id ]); return json(['code' => 0,'data'=>'保存完成', 'msg' => '','fid'=>$id]); } /** * 修改浏览时长 * 产生足迹条件 授权登陆成功 并且 进入详情成功 */ public function updateSaveFoot($fid,$time) { FootPrints::where('id',$fid)->update(['visit_due_time'=>$time]); } /** * vr作品场景 浏览详情 * 作品中的每个场景具体浏览了多长时间 * fid 足迹id * view_id 场景id * time 浏览时长 */ public function saveViewFoots() { $param = Request::only(['fid','view_id','time'=>0,'viewtime'=>'']); $info = FootPrints::where([['id','=',$param['fid']],['pipe_type','=','groupVr']])->findOrEmpty(); if($info->isEmpty()) return json(['code' => 1,'data'=>'足迹不存在', 'msg' => '足迹不存在']); $arr = $info->getData('reg_info') ? json_decode($info->getData('reg_info'),true) : []; $ls_arr = [['vid'=>$param['view_id'],'time'=>$param['time'],'viewtime'=>$param['viewtime']]]; $arr['view_foots'] = isset($arr['view_foots']) ? array_merge($arr['view_foots'],$ls_arr) : $ls_arr; $info->reg_info = json_encode($arr); $info->save(); return json(['code'=>0,'data'=>'保存完成','msg'=>'保存完成']); } /** * 活动详情 */ public function activityRead($str) { $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = $aec->decrypt($str); $arr = explode('#',$token); $id = $arr[2]; $where = [ ['root_id','=',0], ['id','=',$id] ]; $info = ActivityModel::where($where)->order('id desc')->findOrEmpty(); if(!$info->isEmpty()){ //是否结束 $info['is_end'] = date('Y-m-d')>$info['end_date'] ? 1 : 0; $info['start_date'] = date('m月d日',strtotime($info['start_date'])); $info['end_date'] = date('m月d日',strtotime($info['end_date'])); $info['sign_count'] = 0; $info['is_collor'] = !ActivityCollor::where([['employee_id','=',$arr[1]],['aid','=',$id],['type','=',0]])->findOrEmpty()->isEmpty(); $info['is_sign'] = ActivityCollor::where([['employee_id','=',$arr[1]],['aid','=',$id],['type','=',1]])->findOrEmpty()->isEmpty(); } return json(['code'=>0,'data'=>$info]); } /** * 薛鹊主体 公众号算法 * */ public function getJsApiTicket($url) { $jssdk = new JsSdk(); $appid = config('app.official_appid'); $secret = config('app.official_secret'); //ticket if (cache('?jsapi_ticket')) { $ticket = cache('jsapi_ticket'); } else { // 获取普通access_token if (!$token = Cache::get('zqxg_offi_access_token')) { $token = getAccessToken($appid,$secret); Cache::set('zqxg_offi_access_token', $token, 7100); } $ticket = $jssdk->getJsApiTicket($token); } //随机字符 $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; $randStr = str_shuffle($str);//打乱字符串 $data['noncestr'] = substr($randStr,0,20); $data['jsapi_ticket'] = $ticket; $data['timestamp'] = time(); $data['url'] = $url; ksort($data); $get = []; foreach ($data as $key => $value) { $get[] = $key.'='.$value; } $get = implode('&',$get); $data['sign'] = sha1($get); return json(['sign1'=>$get,'code'=>0,'data'=>$data,'appid'=>$appid,'jsapi_ticket'=>$ticket,'token'=>$token]); } /** * 活动详情 */ public function getBuildingLabel($str) { $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = $aec->decrypt($str); $arr = explode('#',$token); $data = ModelBuildingLabel::where(['root_id' => $arr[0]])->field('id,name')->select(); return json(['code'=>0, 'data'=>$data]); } /** * 楼盘催更新 */ public function urge() { $token = input('token'); //浏览人信息 root_id#uid 23#89 $share = input('share'); //分享人信息 root_id#eid 23#4116 $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = explode('#',$aec->decrypt($token)); $share = explode('#',$aec->decrypt($share)); $building_id = input('building_id', '', 'intval'); $employee_id = $share[1]; $phone = input('mobile'); $uid = $token[1]; $data['building_id'] = $building_id; $data['urge_uid'] = $uid; $data['employee_id'] = $employee_id; $data['root_id'] = Employee::where('id', $employee_id)->value('root_id'); $result = BuildingUrge::create($data); if ($result) { $user = User::find($uid); $user_name = '客户'; $user_phone = $phone ? $phone : '未获取'; if (!empty($user)) { $user_name = $user['nickname']; } $building = BuildingModel::find($building_id)->toArray(); if (!empty($building)) { event(new Msg($employee_id, $user_name . '于' . date('Y-m-d H:i:s') . ' 催更' . $building['name'] . '施工进展。', 'building', $building_id)); if (!empty($uid)) { $org_id = Employee::where('id', '=', $employee_id)->value('org_id'); $building['phone'] = $user_phone; event(new FootPrintsEvent($uid, $employee_id, $org_id, $building, 'building_urge')); } } return json(['code' => 0, 'msg' => '催更成功']); } else { return json(['code' => 1, 'msg' => '操作失败']); } } /** * 案例预约设计师 * $id 案例id * */ public function signup() { $token = input('token'); //浏览人信息 root_id#uid 23#89 $share = input('share'); //分享人信息 root_id#eid 23#4116 $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $token = explode('#',$aec->decrypt($token)); $share = explode('#',$aec->decrypt($share)); $id = input('id',0); $objData = MaterialCase::where('id',$id)->findOrEmpty(); if ($objData->isEmpty()) abort(404, '页面不存在'); $employee_id = isset($share[1]) ? intval($share[1]) : 0; $root_id = $share[0]; if ($employee_id) { $employee = Employee::find($employee_id); $org_id = $employee->org_id; $root_id = $employee->root_id; } $e_where[] = ['uid', '=', $token[1]]; $e_where[] = ['state', 'in', ['在职', '待审核']]; $e_where[] = ['root_id', '=', $root_id]; $isEmployee = Employee::where($e_where)->findOrEmpty(); if (!$isEmployee->isEmpty()) return json(['code' => 1, 'msg' => '员工无需报名']); $data = $this->request->only(['name', 'remark', 'mobile']); $data = array_filter($data); $data['data'] = $objData->toArray(); $data['uid'] = $token[1]; $hadList = ModelFootprints::where([['uid', '=', $data['uid']], ['employee_id', '=', $employee_id], ['pipe_type', '=', 'share'],['reg_info','like','%materialCase%'], ['reg_info', 'like', '{"mobile":"' . $data['mobile'] . '","data":{"id":' . $data['data']['id'] . ',%']])->select(); if ($hadList) return json(['code' => 1, 'msg' => '您已预约成功,请勿重复预约']); $users = User::where('id',$data['uid'])->field('nickname')->findOrEmpty(); if ($objData['designer_id']) { $designer = Employee::where('id', $objData['designer_id'])->find(); if (!$designer->isEmpty()) { $new = $users['nickname'] . '预约了' . $designer['name'] . '设计师,请及时跟进'; if ($employee_id) { event(new Msg($employee_id, $new, 'material_case')); // 通知到设计师 /*$d_msg = "“" . $employee['nickname'] . "”名下的“" . $this->user['nickname] . "”预约了您,请及时沟通"; event(new Msg($objData['designer_id'], $d_msg, 'designer'));*/ } $designer_data['designer_id'] = $objData['designer_id']; $designer_data['uid'] = $data['uid']; $designer_data['employee_id'] = $employee_id; $designer_data['pipe_type'] = 'materialCase'; $designer_data['data_id'] = $id; $designer_data['root_id'] = $root_id; DesignerReserve::create($designer_data); $d_where[] = ['id', '=', $objData['designer_id']]; $d_where[] = ['root_id', '=', $root_id]; $root_id = $root_id; $designer_find = Employee::with(['designer' => function ($query) use ($root_id) { $query->where('root_id', $root_id)->visible(['headimgurl', 'employee_id', 'desc', 'good_at', 'position', 'work_years', 'addtime', 'good_house', 'design_concept', 'vcr', 'id designer_id'])->bind(['desc', 'good_at', 'position', 'work_years', 'addtime', 'good_house', 'design_concept', 'vcr', 'name', 'headimgurl']); }])->where($d_where)->field('name title,id,show,id designer_id,root_id')->findOrEmpty(); $designer_find['share_pipe_type'] = 'materialCase'; $designer_find['share_data_id'] = $id; $designer_find['mobile'] = !empty($data['mobile']) ? $data['mobile'] : '未获取'; event(new FootPrintsEvent($data['uid'], $employee_id, $org_id ?? 0, $designer_find, 'designer')); } else { $new = $users['nickname'] . '预约了设计师,请及时跟进'; if ($employee_id) { event(new Msg($employee_id, $new, 'material_case')); } } } else { $designer_find['share_pipe_type'] = 'materialCase'; $designer_find['share_data_id'] = $id; $designer_find['mobile'] = !empty($data['mobile']) ? $data['mobile'] : ''; event(new FootPrintsEvent($data['uid'], $employee_id ?? 0, $org_id ?? 0, $designer_find, 'designer')); } return json(['code' => 0, 'msg' => '报名成功']); } /** * 获取vr作品字段 */ public function getEasyRead($sid) { $info = VrGroup::where('sid',$sid)->field('id,sid,title,pic_path')->findOrEmpty(); $info = $info->isEmpty() ? [] : $info; return json(['code'=>0,'data'=>$info]); } }