259 lines
12 KiB
PHP
259 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Server\CollageGroup;
|
|
use App\Models\Server\CollageGroupHistories;
|
|
use App\Models\CommunityActivity;
|
|
use App\Models\Server\CollageGroupBatch;
|
|
use App\Models\Server\MerchantUser;
|
|
use App\Models\Server\TouristOrder;
|
|
use App\Models\User;
|
|
use App\Models\Wechat;
|
|
use App\Services\UserService;
|
|
use EasyWeChat\Factory;
|
|
use EasyWeChat;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class CollageGroupController extends Controller
|
|
{
|
|
//拼团订单详情
|
|
public function groupOrderDetail(Request $request){
|
|
try {
|
|
$mine = $this->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('服务器休息,请稍后再试');
|
|
}
|
|
|
|
}
|
|
}
|