263 lines
12 KiB
PHP
263 lines
12 KiB
PHP
<?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', // JSAPI,NATIVE,APP...
|
||
'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('服务器休息中,请稍后再试');
|
||
}
|
||
}
|
||
}
|