love_php/app/Http/Controllers/CollageGroupController.php
2026-04-02 09:20:51 +08:00

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('服务器休息,请稍后再试');
}
}
}