employeeId],['status','=',2]])->limit(5)->order('id desc')->field('id,pic_path,title,sid,status')->select()->toArray(); //今日新增数量 $count = VrGroup::where([['emp_id','=',$this->employeeId],['createtime','>=',strtotime(date('Y-m-d'))]])->count(); return json(['code'=>0,'data'=>$res,'count'=>$count,'msg'=>'']); } /** * 作品列表 */ public function list() { $param = Request::only(['floder_id'=>0,'limit'=>10,'page'=>1,'status'=>'']); $where = [ ['floder_id','=',$param['floder_id']], ['emp_id','=',$this->employeeId], ['status','<>',0] ]; if($param['status']!=='') $where[] = ['status','=',$param['status']]; $res = VrGroup::where($where)->page((int)$param['page'],(int)$param['limit'])->order('id desc')->select()->toArray(); $count = VrGroup::where($where)->count(); return json(['code'=>0,'data'=>$res,'msg'=>'']); } /** * 获取草稿箱作品 */ public function getDraftsList() { $param = Request::only(['page'=>1,'limit'=>10]); $where = [ ['status','=',0], ['emp_id','=',$this->employeeId] ]; $data = VrGroup::where($where)->field('id,pic_path,updatetime,title,sid,status')->order('id desc')->page((int)$param['page'],(int)$param['limit'])->select()->toArray(); foreach ($data as $k => $v) { $data[$k]['updatetime'] = $v['updatetime'] ? date('Y.m.d H:i',strtotime($v['updatetime'])) : ''; } $count = VrGroup::where($where)->count(); return json(['code'=>0,'data'=>$data,'count'=>$count]); } /** * 获取文件夹直属作品 */ public function getGroupList() { $param = Request::only(['page'=>1,'limit'=>10,'id'=>0]); $where = [ ['floder_id','=',$param['id']], ['root_id','=',$this->rootId], ['status','<>',0] ]; $data = VrGroup::where($where)->field('id,pic_path,updatetime,title,sid,status')->page((int)$param['page'],(int)$param['limit'])->select()->toArray(); foreach ($data as $k => $v) { $data[$k]['updatetime'] = $v['updatetime'] ? date('Y.m.d H:i',strtotime($v['updatetime'])) : ''; } $count = VrGroup::where($where)->count(); return json(['code'=>0,'data'=>$data,'count'=>$count]); } /** * 获取作品详情 */ public function getGroupRead() { $param = Request::only(['id'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::with(['views'=>function($query){ $query->order('sort asc,id asc'); }])->where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'获取失败','msg'=>'获取失败']); $where = [ ['vr_group_id','=',$info->id] ]; $views = VrView::with(['hotspot'])->where($where)->order('sort asc')->select()->toArray(); $ali_oss_bindurl = config('app.vr_ali_oss_bindurl'); $url = 'https://' . $ali_oss_bindurl; foreach ($views as $k => $v) { $views[$k]['vr_path'] = $url.'/'.$v['structure']; foreach ($v['hotspot'] as $k2 => $v2) { $arr = []; $arr1 = $v2['embedValue'] ? explode('|',$v2['embedValue']) : []; foreach ($arr1 as $v3) { $arr1_1 = explode(',',$v3); $arr[] = ['ath'=>$arr1_1[0],'atv'=>$arr1_1[1]]; } $v2['embedValue'] = $arr; $arr2 = $v2['titlePosition'] ? explode(',',$v2['titlePosition']) : []; $v2['titlePosition'] = $arr2 ? ['ath'=>$arr2[0],'atv'=>$arr2[1]] : []; $json = json_encode($v2); $views[$k]['hotspot'][$k2] = ['content'=>$json]; unset($json); } } $info->views = $views; //头像手机号二维码 $emp = Employee::where('id',$this->employeeId)->field('uid,qrcode,phone')->find(); $emp->headimgurl = User::where('id',$emp->uid)->value('headimgurl'); return json(['code'=>0,'data'=>$info,'emp'=>$emp]); } /** * 编辑作品 */ public function editGroup() { $param = Request::only(['id'=>0,'title'=>'','logo_path'=>'','desc'=>'','size'=>'','pic_path'=>'','floder_id'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'','msg'=>'编辑失败']); unset($param['id']); if(empty($param['title'])) unset($param['title']); if(empty($param['logo_path'])) unset($param['logo_path']); if(empty($param['desc'])) unset($param['desc']); if(empty($param['size'])) unset($param['size']); if(empty($param['pic_path'])) unset($param['pic_path']); foreach ($param as $k => $v) { $info->$k = $v; } $info->updatetime = time(); $info->save(); return json(['code'=>0,'data'=>'保存完成','msg'=>'保存完成']); } /** * 发布作品 */ public function releaseGroup() { $param = Request::only(['id'=>0,'floder_id'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); //2023-06-02 修改 可以重复编辑 可以重复发布 // $msg = $info->isEmpty() ? '发布失败' : ($info->status==2 ? '作品已发布' : false); $msg = $info->isEmpty() ? '发布失败' : false; if($msg !== false) return json(['code'=>1,'data'=>$msg,'msg'=>$msg]); $switch = AppSetting::where([['code','=','auditSwitch'],['root_id','=',$this->rootId],['content','=',1]])->findOrEmpty(); $info->status = $switch->isEmpty() ? 2 : 1; $info->publish_time = time(); $info->review_time = time(); if($param['floder_id']) $info->floder_id = $param['floder_id']; $info->save(); $msg = $switch->isEmpty() ? '发布成功' : '发布完成,等待审核'; if($info->status==2) dataStatistics($this->rootId,'group_count',1,'inc');//manage应用首页统计数据 return json(['code'=>0,'data'=>$msg,'msg'=>$msg]); } /** * 创建一个作品 */ public function saveGroup() { $param = Request::only(['floder_id'=>0]); $sid = md5(time().'@'.mt_rand(1,99999999)); $id = VrGroup::insertGetId([ 'title'=>'', 'createtime'=>time(), 'status'=>0, 'updatetime'=>time(), 'emp_id'=>$this->employeeId, 'org_path'=>'', 'logo_path'=>'', 'floder_id'=>$param['floder_id'], 'desc'=>'', 'pic_path'=>'', 'view_count'=>0, 'root_id'=>$this->rootId, 'size'=>0, 'sid'=>$sid ]); return json(['code'=>0,'id'=>$id,'sid'=>$sid]); } /** * 保存场景 * id 作品id * size 图片大小 */ public function saveImg() { $param = Request::only(['urls'=>'','id'=>0,'size'=>0,'view_title'=>'']); //垃圾数据 if(empty($param['urls']) || strpos($param['urls'],'.jpg')===false) return json(['code'=>1,'data'=>'创建失败','msg'=>'创建失败']); //oss文件是否存在 if(!$this->ossCheck($param['urls'])) return json(['code'=>1,'data'=>'文件不存在','msg'=>'文件不存在']); $group_info = VrGroup::where([['emp_id','=',$this->employeeId],['id','=',$param['id']]])->findOrEmpty(); if($group_info->isEmpty() || !$param['size']) return json(['code'=>1,'data'=>'创建失败','msg'=>'创建失败']); $floder = explode('/',$param['urls']);//文件夹结构 $img = end($floder);//文件名+后缀 $img_arr = explode('.',$img); $vid = VrView::insertGetId([ 'view_title'=>$param['view_title'], 'createtime'=>time(), 'updatetime'=>time(), 'pic_path'=>$param['urls'],//封面图 'emp_id'=>$this->employeeId, 'org_path'=>'', 'size'=>$param['size'], 'sort'=>9999, 'vr_group_id'=>$param['id'], 'vr_path'=>$img_arr[0], 'logo_path'=>'', 'structure'=>implode('/',array_diff($floder,[$img])).'/', 'root_id' => $this->rootId, 'cut_img_status'=>0 ]); //作品大小 $group_info->size = $group_info->size ? $group_info->size+$param['size'] : $param['size']; $group_info->view_count = $group_info->view_count ? $group_info->view_count+1 : 1; if (empty($group_info->pic_path)) $group_info->pic_path = $param['urls']; $group_info->save(); //入队列然后返回 $this->queued($vid); dataStatistics($this->rootId,'use_count',$param['size'],'inc');//manage应用首页统计数据 return json(['code'=>0,'id'=>$param['id'],'sid'=>$group_info->sid]); } /** * 入切图队列 */ public function queued($id) { $jobHandlerClassName = 'app\jobs\CutImg'; $jobQueueName = 'cutimg2'; $orderData = [ //这个是需要传到消费者的数据 'view_id'=>$id ]; $isPushed = Queue::later(0, $jobHandlerClassName, $orderData, $jobQueueName); return true; } /** * 编辑作品logo */ public function editGroupLogo() { $param = Request::only(['id'=>0,'logo_path'=>'']); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'','msg'=>'编辑失败']); $info->logo_path = $param['logo_path']; $info->save(); return json(['code'=>0,'data'=>'保存完成','msg'=>'保存完成']); } /** * 编辑作品遮罩 */ public function editGroupMask() { $param = Request::only(['id'=>0,'mask'=>'','times'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'','msg'=>'编辑失败']); $info->mask = $param['mask']; $info->times = $param['times'];//放大缩小倍数 $info->save(); return json(['code'=>0,'data'=>'保存完成','msg'=>'保存完成']); } /** * 作品场景排序 */ public function groupOrder() { $param = Request::only(['id'=>0,'order'=>'']); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); if($info->isEmpty() || empty($param['order'])) return json(['code'=>1,'data'=>'','msg'=>'编辑失败']); $orders = explode(',',$param['order']); foreach ($orders as $k => $v) { VrView::where([['vr_group_id','=',$param['id']],['id','=',$v]])->update(['sort'=>$k]); } return json(['code'=>0,'data'=>'排序完成','msg'=>'排序完成']); } /** * 编辑热点 */ public function editHotspot() { $param = Request::only(['id'=>0,'hotspot'=>'']); $where = [ ['id','=',$param['id']], ['emp_id','=',$this->employeeId] ]; $info = VrHotspot::where($where)->findOrEmpty(); if($info->isEmpty() || empty($param['hotspot'])) return json(['code'=>1,'data'=>'','msg'=>'编辑失败']); $arr = $this->checkArr($param['hotspot']); foreach ($arr as $key => $value) { $info->$key = $value; } $info->save(); return json(['code'=>0,'data'=>'保存完成','msg'=>'保存完成']); } private function checkArr($json){ $arr = json_decode($json,true); $data = []; foreach ($arr as $key => $val) { if ($key=='embedValue') { $embedValue = []; foreach ($val as $value) { $embedValue[] = $value['ath'].','.$value['atv']; } $data['embedValue'] = $embedValue ? implode('|',$embedValue) : ''; }elseif ($key=='titlePosition' && !empty($arr[$key])) { $data['titlePosition'] = $val['ath'].','.$val['atv']; }else{ $data[$key] = $val; } } if(isset($data['isSelected'])) unset($data['isSelected']); $data['embedType'] = !empty($data['embedValue']) ? 1 : 0; return $data; } /** * 添加热点 */ public function addHotspot() { $param = Request::only(['view_id'=>0,'hotspot'=>'']); $where = [ ['id','=',$param['view_id']], ['emp_id','=',$this->employeeId] ]; $info = VrView::where($where)->findOrEmpty(); if($info->isEmpty() || empty($param['hotspot'])) return json(['code'=>1,'data'=>'','msg'=>'添加失败']); $save = [ 'view_id'=>$param['view_id'], 'emp_id'=>$this->employeeId, 'root_id'=>$this->rootId ]; $arr = $this->checkArr($param['hotspot']); $save = array_merge($save,$arr); $res = VrHotspot::create($save); return json(['code'=>0,'data'=>$res,'msg'=>'保存完成']); } /** * 删除热点 */ public function delHotspot() { $param = Request::only(['id'=>0]); $where = [ ['id','=',$param['id']], ['emp_id','=',$this->employeeId] ]; $info = VrHotspot::where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'','msg'=>'删除失败']); VrHotspot::where($where)->delete(); return json(['code'=>0,'data'=>'删除完成','msg'=>'删除完成']); } /** * 删除作品 */ public function delGroup() { $param = Request::only(['id'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); $msg = $info->isEmpty() ? '删除失败' : ($info->status==1 ? '审核中无法删除' : false); if($msg !== false) return json(['code'=>1,'data'=>'','msg'=>$msg]); //关联楼盘户型之后不让删除 $del_arr = ['app\model\Building'=>'营销楼盘','app\model\BuildingHousetype'=>'楼盘户型','app\model\BuildingProgress'=>'楼盘进度','app\model\ConstructionRecord'=>'在施工地']; $check_res = false; foreach ($del_arr as $key => $value) { $obj = new $key(); $del_where = [['vr_group_ids','=',$param['id']]]; $check = $obj->where($del_where)->value('id'); if($check){ $check_res = $value; break; } } if($check_res !== false) return json(['code'=>1,'data'=>'','msg'=>'已经关联'.$check_res.',无法删除']); //所有场景 $where1 = [['vr_group_id','=',$info->id]]; $views = VrView::where($where1)->column('id,cut_img_size,size,vr_path,structure'); //所有热点 $vids = array_column($views,'id'); $where2 = [['view_id','in',$vids]]; VrGroup::where($where)->delete(); VrView::where($where1)->delete(); VrHotspot::where($where2)->delete(); //删除oss文件 foreach ($views as $val) { $file = $val['structure']; $this->delOss($val['structure'],$val['vr_path']); } dataStatistics($this->rootId,'group_count',1,'dec');//manage应用首页统计数据 dataStatistics($this->rootId,'use_count',$info->size,'dec');//manage应用首页统计数据 return json(['code'=>0,'data'=>'删除完成','msg'=>'删除完成']); } /** * 删除oss */ public function delOss($str,$name) { $arr = ['image_b','image_d','image_f','image_l','image_r','image_u','preview','thumb',$name]; $objects = []; foreach ($arr as $v) { $objects[] = $str.$v.'.jpg'; } $accessKeyId = config('app.vr_ali_oss_access_key_id'); $accessKeySecret = config('app.vr_ali_oss_access_key_secret'); $endpoint = config('app.vr_ali_oss_end_point'); $bucket = config('app.vr_ali_oss_bucket'); $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint); try { $exist = $oss->deleteObjects($bucket, $objects); //删除空文件夹 oss自动删除空文件夹 // $res = $oss->deleteBucket($bucket, $str); return true; } catch (OssException $e) { return false; } } /* * oss检测文件 */ private function ossCheck($file) { // $file = 'vr/2023/03/18/9F8E30932ECE44EB9C7FBC87A44FBD3D/9F8E30932ECE44EB9C7FBC87A44FBD3D.jpg'; $accessKeyId = config('app.vr_ali_oss_access_key_id'); $accessKeySecret = config('app.vr_ali_oss_access_key_secret'); $endpoint = config('app.vr_ali_oss_end_point'); $bucket = config('app.vr_ali_oss_bucket'); $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint); try { $exist = $oss->doesObjectExist($bucket, $file); return $exist; } catch (OssException $e) { return false; } } /** * 作品转移 */ public function shiftGroup() { $param = Request::only(['id'=>0,'floder_id'=>0]); $where = [ ['id','=',$param['id']], ['root_id','=',$this->rootId], ['emp_id','=',$this->employeeId] ]; $info = VrGroup::where($where)->findOrEmpty(); if($info->isEmpty()) return json(['code'=>1,'data'=>'','msg'=>'转移失败']); $info->floder_id = $param['floder_id']; $info->save(); return json(['code'=>0,'data'=>'转移完成','msg'=>'转移完成']); } /** * 获取小程序分享信息 * pages/other/other?ctp=wzh68h&uid=123&type=vr&vrurl=https%3A//saastest.zhuangqixiaoguan.com/vr/%23/fe6d15f92136038ac49882238b3392d3/0/WmlRbllhTnl0MWtTMTFpSzkvcGRoUT09&emp=1 */ public function getShareApplet($id) { $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); $where = [ ['id','=',$id], ['root_id','=',$this->rootId] ]; $info = VrGroup::where($where)->field('id,title,sid,pic_path,emp_id')->findOrEmpty(); $info->content = ''; $info->url = config('app.vr_show_domain').$info->sid.'/'.'0/'.$aec->encrypt($this->rootId.'#'.$info->emp_id); $info->thumbImg = $info->pic_path; $info->appid = Wechat::where('id',3)->value('account'); $info->path = ''; $info->ProgramType = 0;//0正式 1体验版 2开发板 $info->isShareProgram = 1;//是否分享小程序 1分享 0跳转 // $notify = Miniprogram::where('root_id',$this->rootId)->value('notify'); $emp = Employee::where('id',$info->emp_id)->field('id,uid')->find(); $str = 'pages/other/other?ctp='.$notify.'&uid='.$emp->uid.'&type=vr&vrurl='.$info->url.'&emp=1&cty=groupVr&aid='.$id; $info->path = $str; return json(['code'=>0,'data'=>$info]); } }