love_php/app/Http/Controllers/Server/H5/SaasMemberController.php

263 lines
12 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?php
namespace App\Http\Controllers\Server\H5;
use App\Models\FellowingCard;
use App\Models\MerchantUsers;
use App\Models\Server\SaasMemberBuyInfo;
use App\Models\Server\SaasMemberColumns;
use App\Models\Server\SaasMemberLevel;
use App\Models\Server\SaasMemberUser;
use App\Models\Server\SaasMemberVipGain;
use App\Models\Server\TouristOrder;
use App\Services\EvaluateService;
use App\Services\SaasVipGainService;
use App\Services\SaasVipService;
use App\Services\SaasVipSpreadEarningService;
use App\Services\SaasVipSpreadService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
class SaasMemberController extends Controller
{
/**
* Vip会员购买
* @param Request $request
*/
public function buySaasMember(Request $request){
try {
$merchant_id = $request->merchant_id;
$merchant_user_id = $request->merchant_user_id;
$level_id = $request->level_id;
$level_price = $request->level_price;
$level_column = $request->level_column ?? [];
$vip_user_spread_carrier_id = $request->vip_user_spread_carrier_id ?? 0;
$merchant_user = MerchantUsers::select('openid', 'mobile', 'nickname')->where('id', $merchant_user_id)
->first();
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$open_id = $wechatUser->getId();
} else {
$open_id = $merchant_user->openid;
}
if(!$merchant_id || !$level_id || !isset($level_price) ){
return $this->failure('参数不全');
}
$level = SaasMemberLevel::with('memberColumn')->where('merchant_id',$merchant_id)
->where('id',$level_id)
->first();
if(!$level){
return $this->failure('会员等级不存在');
}
if($level['level_price'] != $level_price){
return $this->failure('价格不符');
}
//查询是否已购买且未过期
$expire_time = SaasMemberUser::where('merchant_id',$merchant_id)->where('merchant_user_id',$merchant_user_id)
->where('member_level_id',$level_id)
->value('expire_time');
if($expire_time){
$expire = Carbon::parse($expire_time)->timestamp;
}else{
$expire = 0;
}
if($expire > Carbon::now()->timestamp){
return $this->failure('您上次购买的VIP还未到期不能再次购买');
}
//写订单
$trade_no = $this->getTradeNO();
$touristOrder = new TouristOrder();
$touristOrder->open_id = $open_id;
$touristOrder->price = $level_price;
$touristOrder->num = 1;
$touristOrder->pay_type = 'wechat';
$touristOrder->type = 'member';
$touristOrder->type_id = $level_id;
$touristOrder->pay_status = 0;
$touristOrder->desc = $level['level_title'];
$touristOrder->goods = 'VIP_' . $level['level_title'];
$touristOrder->trade_no = $trade_no;
$touristOrder->withdrawal_radio = 100; //分成比例
$touristOrder->from_openid = $request->from_openid;
$touristOrder->share_channel_id = $request->share_channel_id;
$touristOrder->alliance_id = $request->alliance_id;
$link_name = $request->linkmen['name']??($request->linkmen[0]['name']??null);
$link_mobile = $request->linkmen['mobile']??($request->linkmen[0]['mobile']??'');
$touristOrder->name = $request->name ?? ($MerchantUser->nickname ?? $link_name);
$touristOrder->mobile = $request->mobile ?? ($MerchantUser->mobile ?? $link_mobile);
$touristOrder->withdrawal_radio = 100;
$touristOrder->account_id = $merchant_user_id;
$touristOrder->merchant_id = $merchant_id;
$touristOrder->channel = 0;
$touristOrder->area_code = null;
$linkmen = json_encode($request->linkmen);
$touristOrder->linkmen = $linkmen == 'null' || $linkmen == null ? null : $linkmen ;
$extend = [
'level_id' => $level_id,
'spread_merchant_id' => $request->spread_merchant_id, //推广的商家id
'facilitate_ratio' => $level->facilitate_ratio,
'merchant_ratio' => $level->merchant_ratio,
'vip_user_spread_carrier_id' => $vip_user_spread_carrier_id //vip用户推广载体数据id
];
$touristOrder->spread_merchant_id = $request->spread_merchant_id ?? 0;
$touristOrder->extend = json_encode($extend);
$touristOrder->save();
if(!empty($level_column) && is_array($level_column)) {
foreach ($level_column as $key => $val) {
$buy_info = SaasMemberBuyInfo::where('merchant_id',$merchant_id)
->where('level_id',$level_id)->where('merchant_user_id',$merchant_user_id)
->where('column_name',$val['column_name'])
->first();
if($buy_info){
if($val != $buy_info->column_value){
$buy_info->column_value = $val['column_value'];
$buy_info->save();
}
}else{
$buy_info = new SaasMemberBuyInfo();
$buy_info->merchant_id = $merchant_id;
$buy_info->level_id = $level_id;
$buy_info->merchant_user_id = $merchant_user_id;
$buy_info->order_id = $touristOrder->id;
$buy_info->column_name = $val['column_name'];
$buy_info->column_value = $val['column_value'];
$buy_info->save();
}
}
}
//支付参数
if($level_price){
$callback = config('app.url') . '/api/app/callback/Community/' . $trade_no;
$attributes = array(
'trade_type' => 'JSAPI', // JSAPINATIVEAPP...
'body' => $level['level_title'],
'detail' => $level['level_sub_title'],
'out_trade_no' => $trade_no,
'total_fee' => intval($level_price * 100) ,
'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'openid' => $open_id,
);
$result = \WechatService::officialPay($attributes);
return $this->success('ok', $result);
}
}catch (\Exception $e) {
$this->getError($e);
return $this->failure('操作失败');
}
}
/**
* 查询商家会员等级列表
* @param Request $request
*/
public function getSaasMemberLevelList(Request $request){
try {
$merchant_id = $request->merchant_id;
$member_level = SaasMemberLevel::with('memberColumn')->where('merchant_id',$merchant_id)
->orderBy('id','desc')
->paginate();
return $this->success('ok',$member_level);
}catch (\Exception $e) {
$this->getError($e);
return $this->failure('操作失败');
}
}
/**
* 查询商家会员等级详情
* @param Request $request
*/
public function getSaasMemberLevelDetail(Request $request,SaasVipSpreadService $s1,SaasVipService $s2){
try {
$merchant_id = $request->merchant_id;
$level_id = $request->level_id;
$merchant_user_id = $request->merchant_user_id;
$member_level = SaasMemberLevel::with('memberColumn')
->where('merchant_id',$merchant_id)
->where('id',$level_id)
->first();
if(!$member_level){
return $this->success('ok',$member_level);
}
$member_level->is_buy = $s2->checkBuyVip($merchant_id,$merchant_user_id,$level_id) ? 1 : 0;//是否购买状态
$member_level->give_vip_receive_status = 0; //赠送vip领取状态
if($member_level->is_buy){
$order = $s2->getBuyVipOrder($merchant_id, $merchant_user_id, $level_id);
if($order){
$member_level->give_vip_receive_status = SaasMemberVipGain::where('order_id',$order->id)
->where('merchant_user_id',$merchant_user_id)
->where('merchant_id',$merchant_id)
->where('level_id',$level_id)
->where('type','vip')
->value('status') ?: 0;
}
}
$gain = json_decode($member_level->gain);
$member_level->gain = $gain;
if(!$gain){
return $this->success('ok',$member_level);
}
foreach ($gain as $item){
if($item->type && isset($item->merchant_id) && $item->id){
$item->data = $s1->getGain($item->type,$item->merchant_id,$item->id);
$where = [
['type','=',$item->type],
['type_id','=',$item->id],
['level_id','=',$level_id],
['merchant_user_id','=',$request->merchant_user_id]
];
$receive_status = SaasMemberVipGain::where($where)->value('status');
$item->receive_status = $receive_status ?? 0;
}
}
return $this->success('ok',$member_level);
}catch (\Exception $e) {
$this->getError($e);
return $this->failure($e->getMessage());
}
}
/**
* 我的VIP订单
* @param Request $request
*/
public function getSaasMemberOrder(Request $request)
{
try {
// 记得删除 TouristOrder的记录同步merchant_id 和course表里删除多余的数据
$merchant_user_id = $request->merchant_user_id;
$merchant_id = $request->merchant_id;
$result = TouristOrder::where('tourist_orders.account_id', $merchant_user_id)->where('tourist_orders.type', 'member')
->where('tourist_orders.merchant_id',$merchant_id)
->join('saas_member_users', function ($join) use($merchant_user_id,$merchant_id){
$join->on('saas_member_users.member_level_id', '=', 'tourist_orders.type_id')
->where('saas_member_users.merchant_user_id',$merchant_user_id)
->where('saas_member_users.merchant_id',$merchant_id);
}, null, null, 'left')
->join('saas_member_levels', function ($join) use($merchant_user_id,$merchant_id){
$join->on('saas_member_levels.id', '=', 'tourist_orders.type_id')
->where('saas_member_levels.merchant_id',$merchant_id);;
}, null, null, 'left')
->orderBy('tourist_orders.id', 'desc')
->select('tourist_orders.created_at','tourist_orders.price','saas_member_levels.level_title','saas_member_levels.level_pic',
'saas_member_users.expire_time','saas_member_levels.level_sub_title','saas_member_levels.id')
->paginate();
return $this->success('ok', $result);
}catch (\Exception $e){
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
}