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

263 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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