Web.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. namespace app\index\controller;
  3. use app\model\Building as BuildingModel;
  4. use app\model\BuildingHousetype;
  5. use app\model\BuildingProgress;
  6. use app\model\Construction;
  7. use app\model\ConstructionRecord;
  8. use app\model\ConstructionStep;
  9. use app\model\Miniprogram;
  10. use app\model\ShortUrl;
  11. use app\model\User;
  12. use app\model\Company;
  13. use think\facade\Cache;
  14. use think\facade\View;
  15. use wx\miniprogram\Qrcode;
  16. use wx\miniprogram\UrlScheme;
  17. use app\model\BuildingConstruction;
  18. use app\model\BuildingMaterialCase;
  19. use app\model\Community;
  20. use wx\offiaccount\JsSdk;
  21. use app\model\AgentArticle;
  22. class Web
  23. {
  24. /**
  25. * 短链接页面
  26. */
  27. public function index($tag)
  28. {
  29. // if(!request()->isMobile()) return redirect('index/index');
  30. // 查询参数获取
  31. $shortUrl = ShortUrl::where(['uri' => $tag, 'type' => 'share'])->find();
  32. if (empty($shortUrl)) {
  33. abort(404, '内容不存在');
  34. }
  35. $param = json_decode($shortUrl->content, true);
  36. $scheme = new UrlScheme();
  37. // class
  38. $type = $param['type'];
  39. $strpos = strpos($type, '_vr');
  40. if ($strpos){
  41. $type = str_replace('_vr', '', $type);
  42. }
  43. $className = 'app\\model\\' . ucfirst($type);
  44. if (!class_exists($className)) {
  45. abort(404, '内容不存在');
  46. }
  47. $mini = Miniprogram::where(['notify' => $param['client_type']])->find();
  48. view::assign('mini_account', $mini->account);
  49. $accessToken = $mini->accesstoken;
  50. $company = Company::with(['brand'])->where('root_id', $mini->root_id)->field(['company_name', 'logo', 'company_brand'])->find();
  51. if (!empty($param['id'])) {
  52. if ($strpos) {
  53. $data['title'] = 'VR预览';
  54. $data['vr_link'] = $param['other_data'];
  55. } elseif (strtolower($param['type']) == 'construction') {
  56. // 在施工地信息处理
  57. $data = Construction::with(['style', 'designer', 'housetype', 'community'])->find($param['id']);
  58. $root_id = $data['root_id'];
  59. $step_list = ConstructionStep::where('root_id', '=', $root_id)->order('order asc')->select()->toArray();
  60. if (!empty($step_list)) {
  61. $record_list = ConstructionRecord::where([['construction_id', '=', $param['id']]])->order('update_time desc')->select();
  62. $step_now = 0; //进行到哪一步了
  63. foreach ($step_list as $k => $v) {
  64. foreach ($record_list as $kk => $vv) {
  65. if ($v['id'] == $vv['step_id'] && $v['order'] > $step_now) {
  66. $step_now = $v['order'];
  67. }
  68. }
  69. }
  70. foreach ($step_list as $k => $v) {
  71. $step_list[$k]['upload'] = 0; // 判断是否上传
  72. $step_list[$k]['need_upload'] = 0; // 判断节点是否变色(已过此节点,但是没上传)
  73. $have = false; //是否有上传 true有
  74. $need_have = false; //没上传,但是后面的节点上传了 true是
  75. $step_list[$k]['data'] = [];
  76. foreach ($record_list as $kk => $vv) {
  77. if ($v['id'] == $vv['step_id']) {
  78. $have = true;
  79. $step_list[$k]['data'] = $vv;
  80. }
  81. }
  82. if ($have == false && $v['order'] < $step_now) {
  83. $need_have = true;
  84. }
  85. if ($have) {
  86. $step_list[$k]['upload'] = 1;
  87. } elseif ($need_have) {
  88. $step_list[$k]['need_upload'] = 1;
  89. }
  90. }
  91. $data['step_list'] = $step_list;
  92. } else {
  93. $data['step_list'] = [];
  94. }
  95. } elseif (strtolower($param['type']) == 'building') {
  96. $data = BuildingModel::find($param['id']);
  97. //关联在施工地数量
  98. $data['start_num']=BuildingConstruction::where('building_id', '=', $param['id'])->count();
  99. $data['end_num'] = BuildingMaterialCase::where([['building_id', '=', $param['id']]])->count();
  100. $area_list = BuildingHousetype::where('building_id', '=', $param['id'])->order('area asc')->limit(3)->column('area');
  101. $data['area_list'] = implode('/', array_values(array_unique(array_filter($area_list))));
  102. //小区户型
  103. $housetype = BuildingHousetype::where('building_id', '=', $param['id'])->withCount(['materialCase'])->select();
  104. $data['housetype'] = $housetype->toArray();
  105. $data['housetype_count'] = $housetype->count();
  106. $progress_list = BuildingProgress::where('building_id', '=', $param['id'])->order('addtime desc')->select()->each(function ($item) {
  107. $item->vr = explode(',', $item['vr']);
  108. });
  109. $data['progress'] = $progress_list;
  110. } elseif (strtolower($param['type']) == 'housetype') {
  111. //
  112. $data = BuildingHousetype::find($param['id']);
  113. $build = BuildingModel::where('id',$data->building_id)->field('id,name,address,community_id')->findOrEmpty();
  114. if (!$build->isEmpty()){
  115. $build->community = $build->community_id ? Community::where('id',$build->community_id)->value('name') : '';
  116. }
  117. View::assign('build', $build);
  118. } elseif(strtolower($param['type']) == 'agentarticle'){
  119. $data = AgentArticle::find($param['id']);
  120. $data->files = !empty($data['file'][0]) ? str_replace('https://'.config('app.ali_oss_bindurl').'/','',$data['file'][0]) : '';
  121. } else {
  122. $className = 'app\\model\\' . ucfirst($param['type']);
  123. if (!class_exists($className)) {
  124. abort(404, '内容不存在');
  125. }
  126. $obj = new $className();
  127. $data = $obj->find($param['id']);
  128. }
  129. //短链中间页展示内容
  130. $data['cover_file'] = $this->param_content($param['path'], $data);
  131. View::assign('data', $data);
  132. } else {
  133. // 获取小程序二维码
  134. $qrObj = new Qrcode;
  135. $qrdata = [
  136. 'scene' => $param['query'],
  137. 'page' => $param['path'],
  138. 'width' => '280px',
  139. ];
  140. $qr = $qrObj->getUnlimited($accessToken, $qrdata);
  141. $rs = json_decode($qr, true);
  142. if (!is_null($rs)) {
  143. trace('名片二维码生成失败' . ';error:' . $qr, 'error');
  144. }
  145. $path = 'share_qr_unlimit' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg';
  146. ossContentUpload($path, $qr);
  147. View::assign('qrcode', request()->domain() . '/' . $path);
  148. }
  149. // 设置分享人昵称
  150. $nickname = User::where('id', $param['user_id'])->value('nickname');
  151. View::assign('nickname', $nickname);
  152. $data = [
  153. 'jump_wxa' => [
  154. 'path' => $param['path'],
  155. 'query' => $param['query'],
  156. 'env_version' => isset($param['env_version']) ? $param['env_version'] : 'release',
  157. ],
  158. 'expire_type' => 1,
  159. 'expire_interval' => 30 // 链接有效时间30天
  160. ];
  161. $rs = $scheme->generate($accessToken, $data);
  162. if (isset($rs['errcode']) && $rs['errcode'] != 0) {
  163. trace($rs['errmsg'], 'error');
  164. }
  165. // 设置分享链接
  166. $jssdk = new JsSdk();
  167. $appid = config('app.official_appid');
  168. if (cache('?jsapi_ticket')) {
  169. $ticket = cache('jsapi_ticket');
  170. } else {
  171. // 获取普通access_token
  172. if (!$token = Cache::get('zqxg_offi_access_token')) {
  173. $token = getAccessToken($appid, config('app.official_secret'));
  174. Cache::set('zqxg_offi_access_token', $token, 7100);
  175. }
  176. $ticket = $jssdk->getJsApiTicket($token);
  177. cache('jsapi_ticket', $ticket, 7200);
  178. }
  179. $signPackage = $jssdk->getSignPackage($ticket);
  180. $signPackage['appid'] = $appid;
  181. View::assign('wxconfig', $signPackage);
  182. View::assign('company', $company);
  183. View::assign('query', $param['query']);
  184. View::assign('path', $param['path']);
  185. View::assign('urlsheme', $rs['openlink']);
  186. return View::fetch();
  187. }
  188. /*
  189. * 短链接中间页面需要展示的不同内容定义
  190. * path:分享的路径
  191. */
  192. private function param_content($path, $data)
  193. {
  194. $dufault_img = 'https://o.nczyzs.com/xcx/nonedata.jpg';
  195. $cover_file = '';
  196. switch ($path) {
  197. //口碑详情
  198. case '/share/pages/publicpraisemsg/publicpraisemsg':
  199. if ($data['difference'] == 1) {
  200. $cover_file = $data['cover'] ?: (!empty($data['pics']) ? $data['pics'][0].'?x-oss-process=video/snapshot,t_100,f_jpg,w_375,m_fast' : $dufault_img);
  201. }else{
  202. $cover_file = !empty($data['pics']) ? $data['pics'][0] : $dufault_img;
  203. }
  204. break;
  205. //视频详情
  206. case '/share/pages/videoshare/videoshare':
  207. //$cover_file = !empty($data['video_url']) ? $data['video_url'].'?x-oss-process=video/snapshot,t_100,f_jpg,w_500,m_fast' : $dufault_img;
  208. $cover_file = !empty($data['cover']) ? $data['cover'] : $data['video_url'] . '?x-oss-process=video/snapshot,t_100,f_jpg,w_500,m_fast';
  209. break;
  210. //图文详情
  211. case '/share/pages/articleshare/articleshare':
  212. //案例详情
  213. case '/share/pages/materialcase/materialcase':
  214. $cover_file = !empty($data['cover_img']) ? $data['cover_img'] : $dufault_img;
  215. break;
  216. // 活动详情
  217. case '/share/pages/activitymsg/activitymsg':
  218. // 在施工地
  219. case '/share/pages/constructsite/constructsite':
  220. $cover_file = !empty($data['cover']) ? $data['cover'] : $dufault_img;
  221. break;
  222. // vr楼书
  223. case '/share/pages/buildprogress/buildprogress':
  224. $cover_file = !empty($data['cover'][0]) ? $data['cover'][0] : $dufault_img;
  225. break;
  226. // 活码
  227. case '/share/pages/channelsignup/channelsignup':
  228. $cover_file = !empty($data['poster_img']) ? $data['poster_img'] : $dufault_img;
  229. break;
  230. case '/share/pages/other/other':
  231. // vr
  232. //$cover_file = !empty($data['vr_link']) ? $data['vr_link'] : $dufault_img;
  233. $cover_file = $dufault_img;
  234. break;
  235. }
  236. return $cover_file;
  237. }
  238. /**
  239. * 访问链接打开小程序
  240. */
  241. public function open($uri)
  242. {
  243. // 查询参数获取
  244. $shortUrl = ShortUrl::where(['uri' => $uri, 'type' => 'join_company'])->find();
  245. if (empty($shortUrl)) {
  246. abort(404, '内容不存在');
  247. }
  248. $param = json_decode($shortUrl->content, true);
  249. $scheme = new UrlScheme();
  250. $mini = Miniprogram::where(['notify' => $param['client_type']])->find();
  251. view::assign('mini_account', $mini->account);
  252. $accessToken = $mini->accesstoken;
  253. $company = Company::with(['brand'])->where('root_id', $mini->root_id)->field(['company_name', 'logo', 'company_brand'])->find();
  254. $data = [
  255. 'jump_wxa' => [
  256. 'path' => $param['path'],
  257. 'query' => $param['query'],
  258. 'env_version' => isset($param['env_version']) ? $param['env_version'] : 'release',
  259. ],
  260. 'expire_type' => 1,
  261. 'expire_interval' => 30 // 链接有效时间30天
  262. ];
  263. $rs = $scheme->generate($accessToken, $data);
  264. if (isset($rs['errcode']) && $rs['errcode'] != 0) {
  265. trace($rs['errmsg'], 'error');
  266. }
  267. // 设置分享链接
  268. $jssdk = new JsSdk();
  269. $appid = config('app.official_appid');
  270. if (cache('?jsapi_ticket')) {
  271. $ticket = cache('jsapi_ticket');
  272. } else {
  273. // 获取普通access_token
  274. if (!$token = Cache::get('zqxg_offi_access_token')) {
  275. $token = getAccessToken($appid, config('app.official_secret'));
  276. Cache::set('zqxg_offi_access_token', $token, 7100);
  277. }
  278. $ticket = $jssdk->getJsApiTicket($token);
  279. cache('jsapi_ticket', $ticket, 7200);
  280. }
  281. $signPackage = $jssdk->getSignPackage($ticket);
  282. $signPackage['appid'] = $appid;
  283. View::assign('wxconfig', $signPackage);
  284. View::assign('company', $company);
  285. View::assign('query', $param['query']);
  286. View::assign('path', $param['path']);
  287. View::assign('urlsheme', $rs['openlink']);
  288. return View::fetch();
  289. }
  290. /**
  291. * vr作品预览页面
  292. */
  293. public function vr()
  294. {
  295. return View::fetch();
  296. }
  297. }