authCheck(); $user_service = new UserService(); if($mine){ $merchant_user = $user_service->syncSaasUser($mine); } $order_id = $request->order_id; $history_id = $request->history_id; if($request->history_id){ $history = CollageGroupHistories::find($history_id); $order_id = $history->m_order_id; } $linkmen['name'] = $mine ? $mine->name : ''; $linkmen['mobile'] = $mine ? $mine->mobile : ''; if(!isset($history)){ $history = CollageGroupHistories::where('m_order_id',$order_id)->select('id','deadline','m_order_id','status','group_id')->first(); } if ($history && !empty($history->group_id)){ $group = CollageGroup::where('id',$history->group_id)->select('id','type','type_id','describe','require_num','sku','price')->first(); }else{ $group = null; } if(!$group) return $this->failure('拼团信息已完成或不存在'); $group->sku = json_decode($group->sku); $group->linkmen = $linkmen; //todo 其他类型拼团 目前先做活动 $type = $group->type; $title = $group->$type ? $group->$type->title : '未获取'; $result = $group->$type; $result->sku = json_decode($result->sku,true); $group->insurance = $result->insurance; $group->anchor_id = $result->anchor_id; unset($group->$type); //目前参与人员 $user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql) { $sql->whereIn('pay_status',[1,4]); })->where('group_id',$history->group_id)->where('deadline',$history->deadline)->orderBy('id','desc')->pluck('m_user_id')->toArray(); if(count($user_ids) == 0) return $this->failure('该团已解散'); $str = implode(',', $user_ids); //团长id $initiator_id = CollageGroupHistories::where('group_id',$history->group_id)->where('deadline',$history->deadline)->where('is_initiator',1)->value('m_user_id'); $merchant_user_id = $mine ? $this->matchMerchantUser($mine->id) : 0; $is_head = $initiator_id == $merchant_user_id ? 1 : 0; //订单 $order = TouristOrder::where('id',$order_id)->select('id','price','desc','goods','group_id','account_id','pay_status','pay_type','created_at','trade_no')->first(); $original_price = $result->price; if($group && $group->sku){ foreach ($group->sku as $skus) { if($order->goods == $skus->name){ $original_price = $skus->price; break; } } } $result->single_buy = $original_price; $save_money = $original_price - $order->price; $result->save_money = number_format($save_money,2); $order->title = $title; $order->pic = $result->pic; $users = MerchantUser::whereIn('id',$user_ids)->select('id','user_id','pic')->orderByRaw(DB::raw('FIELD(id,'.$str.') desc'))->get(); $count = $users->count(); $need = $history->status == 1 ? 0 : ($group->require_num - $count);//还差几人拼团成功 $history->need_count = $need <= 0 ? 0 : $need; $batch = CollageGroupBatch::where('history_id',$history->id)->value('batch'); $virtual_num = CollageGroupBatch::where('history_id',0)->where('batch',$batch)->get()->count();//本团虚拟用户数量 $group_users = []; foreach ($users as $key => $value) { if($value->user_id){ $user = User::find($value->user_id); $group_users[$key]['avatar'] = $user->getOriginal('circle_avatar') ? : User::DefaultAvatar; }else{ $group_users[$key]['avatar'] = User::DefaultAvatar; } $group_users[$key]['is_initiator'] = $value->id == $initiator_id ? 1 : 0; } if($virtual_num > 0){ for ($i=1; $i <=$virtual_num ; $i++) { $group_users[$key+$i]['avatar'] = User::DefaultAvatar; $group_users[$key+$i]['is_initiator'] = 0; } } $qrcode = $this->shareGroupMp($history->id); //当前用户是否参与此团 $is_member = in_array($merchant_user_id,$user_ids) ? 1 : 0; return $this->success('ok',compact('group','order','group_users','history','result','is_head','qrcode','is_member')); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //个人中心 我发起的拼团(未过有效期) public function myGroups(Request $request){ $now = date('Y-m-d H:i:s'); $mine = $this->authCheck(); if($mine){ $m_user_id = $this->matchMerchantUser($mine->id); // $histories = CollageGroupHistories::where('m_user_id',$m_user_id)->where('deadline','>',$now)->where('status',0)->where('is_initiator',1)->get(); $m_order_ids = CollageGroupHistories::where('m_user_id',$m_user_id)->where('deadline','>',$now)->where('status',0)->where('is_initiator',1)->pluck('m_order_id')->toArray(); $pay_ids = TouristOrder::whereIn('id',$m_order_ids)->whereIn('pay_status',[1,4])->pluck('id')->toArray(); $histories = CollageGroupHistories::whereIn('m_order_id',$pay_ids)->get(); foreach ($histories as $key => $value) { $type = $value->group->type; $value->pic = $value->group->$type->pic; //目前参与人员 $user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql) { $sql->whereIn('pay_status',[1,4]); })->where('group_id',$value->group_id)->where('deadline',$value->deadline)->pluck('m_user_id')->toArray(); $count = count($user_ids); $need_count = $value->group->require_num-$count; $value->need_count = $need_count; unset($value->group); } return $this->success('ok',$histories); }else{ return $this->success('ok',[]); } } //参与别人拼单 public function joinGroup(Request $request){ $id = $request->id; $mine = $this->authCheck(); $userId = 0; $openid = null; if ($mine) $userId = $mine->id; $history = CollageGroupHistories::find($id); if(!$history) return $this->failure('拼团信息不存在'); $team_order = TouristOrder::where('id',$history->m_order_id)->whereIn('pay_status',[1,4])->first(); if(!$history) return $this->failure('拼团订单不存在'); $m_order_ids = CollageGroupHistories::where('group_id',$history->group_id)->where('deadline',$history->deadline)->pluck('m_order_id')->toArray(); // 目前参与人员数量 $num = TouristOrder::whereIn('id',$m_order_ids)->whereIn('pay_status',[1,4])->get()->count(); $group = CollageGroup::where('id',$history->group_id)->select('id','type','type_id','describe','require_num')->first(); $type = $group->type; $title = $group->$type ? $group->$type->title : '未获取'; if($group->require_num <= $num) return $this->failure('你来晚了一步~本次拼团已被他人抢先一步完成'); $now = date('Y-m-d H:i:s'); if($history->deadline < $now) return $this->failure('你来晚了一步~本次拼团有效期已过'); $wechat = Wechat::where('user_id', $userId)->first(); if($wechat) $openid = $wechat->openid; $merchant_user_id = $this->matchMerchantUser($userId); $trade_no = $this->getTradeNo(); $order = array( 'open_id' => $openid, 'price'=> $team_order->price, 'num'=>1, 'pay_type'=>'wechat', 'type'=>$team_order->type, 'type_id'=>$team_order->type_id, 'pay_status'=>0, 'trade_no'=>$trade_no, 'withdrawal_radio'=>100, 'from_openid'=>$request->from_openid, 'share_channel_id'=>$request->share_channel_id, 'alliance_id'=>$request->alliance_id, 'group_id'=>$team_order->group_id, // 'name'=>$request->name ?? ($wechat->nickname ?: ($request->linkmen[0]['name'] ?? '未获取')), 'name'=>1, 'mobile'=>$request->mobile ?? ($request->linkmen[0]['mobile'] ?? '未获取'), 'area_code'=>$request->area_code, 'channel'=>3, 'account_id'=>$merchant_user_id, 'goods'=>$team_order->goods, 'desc'=>$team_order->desc, 'linkmen'=>isset($request->linkmen) ? json_encode($request->linkmen) : '', 'insurance'=>isset($request->insurance) ? $request->insurance : 0, 'insurance_info'=>(isset($request->insurance) && $request->insurance == 1) ? json_encode($request->insurance_info):null, ); $order = TouristOrder::create($order); CollageGroupHistories::create([ 'm_user_id'=>$merchant_user_id, 'group_id'=>$order->group_id, 'm_order_id'=>$order->id, 'group_master_id' => $history->id, 'is_initiator'=>0, 'status'=>0, 'deadline'=>$history->deadline, ]); $callback = config('app.url') . '/api/app/callback/Community/' . $trade_no; $score = 0; $pay_order = array( 'user_id' => $userId, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => floatval($team_order->price), 'pay_type' => 'wechat', 'score' => $score, ); $wx_pay = \WechatService::constructWXPay($pay_order, $userId, $title, $callback); $order->save(); $order->wx_pay = $wx_pay; //同步订单相关的用户 \App\Jobs\SyncSaasUserByOrder::dispatch($order)->onQueue('love'); return $this->success('ok', $order); } //分享拼团二维码 public function shareGroupMp($history_id){ try { $history = CollageGroupHistories::find($history_id); $order_id = $history->m_order_id; $app = EasyWeChat::miniProgram(); $optional = [ 'page' => 'pages/party/SpellGroupData', 'width' => 260, 'is_hyaline'=>true, 'auto_color'=>true, ]; // $data = []; // $data['is_hyaline'] = true; // $response = $app->app_code->get('/pages/party/SpellGroupData?history_id='.$history_id.'&order_id='.$order_id, $data); $response = $app->app_code->getUnlimit('id='.$history_id.'&o_id='.$order_id, $optional); $qrcode_path = storage_path('qrcode'); $file_name = time().$history_id.'shareGroupMp.png'; if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { $response->saveAs($qrcode_path, $file_name); } $qrcode = ''; $qrcode_path = storage_path()."/qrcode/".$file_name; if(file_exists($qrcode_path)){ $qrcode = $this->uploadFile($qrcode_path); unlink($qrcode_path); } return $qrcode; } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } }