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

701 lines
37 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\Mobile;
use App\Http\Response\ResponseJson;
use App\Models\EarningAccount;
use App\Models\EarningTransfer;
use App\Models\EarningWithdraw;
use App\Models\MAdvanceEarning;
use App\Models\Server\MEarningwithdraws;
use App\Models\Server\MEarning;
use App\Models\Server\MEarningAccount;
use App\Models\Server\MerchantUser;
use App\Models\Server\TouristOrder;
use App\Models\User;
use App\Models\Wechat;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\MEarningTransfers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class EarningController extends Controller
{
use ResponseJson;
/**
* 授权saas收益账号
*/
public function authSaasAccount(){
$wechatUser = session('wechat.oauth_user.new');
return redirect(config('app.url').'/h5/#/accountPage');
}
public function authAccount(){
$wechatUser = session('wechat.oauth_user.new');
return redirect(config('app.url').'/h5/#/loveMpWithdraw');
}
/**
* @return \Illuminate\Http\JsonResponse|mixed
*/
public function checkUnionid()
{
try {
if (config('app.env') == 'production') {
//检查unionid
$wechat_user = session('wechat.oauth_user.new');
if (empty($wechat_user)) return ['is_wechat_auth'=>0];
$app = \WechatService::officialApp();
$app_user = $app->user->get($wechat_user->getId());
if (!isset($app_user['unionid']) || empty($app_user['unionid'])) return ['error_msg'=>'请关注福恋智能微信公众号!'];
$unionid = $app_user['unionid'];
return ['unionid'=>$unionid, 'openid'=>$wechat_user->getId()];
}else {
return ['unionid'=>"oVMWos7BVjhvSnunE3A0PfACzftY", 'openid'=>'oVEaG5JVDFI-1SVwhOHLwhzYHaHw'];
}
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* 通过unionid获取收益
* @param $unionid
* @return \Illuminate\Http\JsonResponse|null
*/
public function userByUnionid($unionid)
{
try {
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user_id)) return null;
$merchant_user = MerchantUser::where('user_id', $wechat->user_id)->first();
return $merchant_user;
}catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/**
* saas收益账号
* @param Request $request
*/
public function saasEarningAccount(Request $request)
{
try {
// return $this->failure("系统维护中");
$is_wechat_auth = 1;
if (env('APP_ENV') == 'production') {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$merchant_user = $this->userByUnionid($unionid);
if ($merchant_user === false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
if (empty($merchant_user)) return $this->success('ok', ['balance'=>0, 'withdrawl'=>0, 'is_wechat_auth'=>1,'total_value'=>0, 'frezzing_value'=>0]);
//更新用户账号
$other_merchnat_user = MerchantUser::where('openid', $result['openid'])->first();
\Log::info($merchant_user->id);
if (empty($other_merchnat_user) || $other_merchnat_user->id == $merchant_user->id) {
$merchant_user->openid = $result['openid'];
}
$other_merchnat_user = MerchantUser::where('unionid', $result['unionid'])->first();
if (empty($other_merchnat_user) || $other_merchnat_user->id == $merchant_user->id) $merchant_user->unionid = $result['unionid'];
$merchant_user->save();
}else {
$merchant_user = MerchantUser::find(223);
if ($merchant_user === false) throw new \Exception('获取merchant_user失败');
if (empty($merchant_user)) return $this->success('ok', ['balance'=>0, 'withdrawl'=>0, 'is_wechat_auth'=>1,'total_value'=>0, 'frezzing_value'=>0]);
}
// $merchant_user = MerchantUser::find(18);
//账号是否异常
$res = MEarningAccount::where('m_user_id', $merchant_user->id)->where('is_banned', 1)->first();
if ($res) throw new \Exception("账号id: {$res->id}异常");
//收益账号
$balance = MEarningAccount::where('m_user_id', $merchant_user->id)->sum('balance');
$withdrawl = MEarningAccount::where('m_user_id', $merchant_user->id)->sum('withdrawl');
//最近30次提现记录
$near_withdraws = MEarningwithdraws::select('id', 'real_value', 'value', 'name')->where('status', '<>', 'canceled')->where('m_user_id', '<>', $merchant_user->id)->orderBy('id', 'desc')->limit(30)->get();
foreach ($near_withdraws as $near_withdraw) {
$near_withdraw->name = mb_substr($near_withdraw->name, 0, 1)."*";
}
$poundage = Redis::get('withdrawal_poundage')??2;
//已经结算收益的订单id
$earning_order_ids = \App\Models\MEarning::query()->where('m_user_id', $merchant_user->id)
->whereNull('deleted_at')
->groupBy('m_order_id')
->pluck('m_order_id');
//总收益
$total_value = MEarningAccount::where('m_user_id', $merchant_user->id)->sum('total_value');
//冻结收益
$frezzing_value = MAdvanceEarning::where('m_user_id', $merchant_user->id)->whereNotIn('m_order_id',$earning_order_ids)->sum('value');
$total_value = number_format($total_value + $frezzing_value, 2, '.', '');
//提现账号
$account = MEarningTransfers::where('m_user_id',$merchant_user->id)->select('id','m_id','m_user_id','name','nick_name','pic','way','account','created_at','updated_at')->orderBy('updated_at','desc')->first();
return $this->success('ok',['balance'=>$balance, 'withdrawl'=>$withdrawl, 'is_wechat_auth'=>1, 'near_withdraws'=>$near_withdraws, 'poundage'=>$poundage, 'total_value'=>$total_value, 'frezzing_value'=>$frezzing_value,'account'=>$account]);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
/**
* 收益记录
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function saasEarningHistories(Request $request)
{
try {
$is_wechat_auth = 1;
if (env('APP_ENV') == 'production') {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$merchant_user = $this->userByUnionid($unionid);
}else {
$merchant_user = MerchantUser::find(223);
}
if ($merchant_user == false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
if (empty($merchant_user)) {
$earnings = MEarning::where('m_user_id', null)->orderBy('id', 'desc')->paginate();
} else {
// $earnings = MEarning::with('order:id,desc,account_id', 'order.user:id,nickname,pic')->whereHas('order.user')->where('m_user_id', $merchant_user->id)->select('m_order_id', 'm_user_id', 'value', 'created_at')->orderBy('id', 'desc')->paginate();
$earnings = MEarning::with('order:id,desc,account_id', 'order.user:id,nickname,pic')->where('m_user_id', $merchant_user->id)->where('value', '>', 0)->select('m_order_id', 'm_user_id', 'value', 'created_at', \DB::raw('sum(value) as value'))->groupBy('m_order_id')->orderBy('m_order_id', 'desc')->paginate();
$default_avatar = "https://images.ufutx.com/202007/01/e0de60525143427d4dd19515a5b387ba.png";
foreach ($earnings as $earning) {
if (empty($earning->order->user)) {
$order_user = [
'id'=>$earning->order?$earning->order->account_id:0,
'nickname'=>"未知",
'头像'=>$default_avatar
];
$earning->order_user = $order_user;
} else{
$earning->order_user = $earning->order->user;
$earning->order_user->pic = $earning->order_user->pic?:$default_avatar;
}
}
}
return $this->success('ok', compact('is_wechat_auth', 'earnings'));
}catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
public function EarningHistoriesV2(Request $request)
{
try {
$is_wechat_auth = 1;
//检查unionid
if (env('APP_ENV') == 'production') {
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$merchant_user = $this->userByUnionid($unionid);
} else {
$merchant_user = MerchantUser::find(223);
}
// $merchant_user = MerchantUser::find(18);
if ($merchant_user === false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
if (empty($merchant_user)) {
$earnings = MAdvanceEarning::where('m_user_id', null)->orderBy('id', 'desc')->paginate();
} else {
$status = $request->input('status');
$users = \DB::table('merchant_users')->selectRaw('id as order_user_id,nickname,pic');
$orders = \DB::table('tourist_orders')->leftJoinSub($users, 'ufutx_users', function($join) {
$join->on('tourist_orders.account_id', '=', 'users.order_user_id');
})->where('pay_status', '<>', 0)->select(\DB::raw('ufutx_users.*'), 'id', 'desc','type', 'type_id', 'goods', \DB::raw( 'created_at as o_created_at'));
//已经结算收益的订单id
$earning_order_ids = \App\Models\MEarning::query()->where('m_user_id', $merchant_user->id)
->whereNull('deleted_at')
->groupBy('m_order_id')
->pluck('m_order_id');
if ($status) {
if ($status == 1) {
$earnings = \DB::table('m_advance_earnings')->whereNotIn('m_order_id',$earning_order_ids)->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->leftJoinSub($orders, 'ufutx_orders', function($join) {
$join->on('m_order_id', '=', 'orders.id');
})->selectRaw('m_user_id,m_order_id,earning_time,sum(value) as value, created_at as e_created_at, 1 as status, ufutx_orders.*')->groupBy('m_order_id');
$value = \DB::table('m_advance_earnings')->whereNotIn('m_order_id',$earning_order_ids)->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->sum('value');
}elseif ($status == 2) {
$earnings = \DB::table('m_earnings')->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->leftJoinSub($orders, 'ufutx_orders', function($join) {
$join->on('m_order_id', '=', 'orders.id');
})->selectRaw('m_user_id,m_order_id,earning_time,sum(value) as value, created_at as e_created_at, 2 as status, ufutx_orders.*')->groupBy('m_order_id');
$value = \DB::table('m_earnings')->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->sum('value');
}
} else {
$m_earnings = \DB::table('m_earnings')->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->leftJoinSub($orders, 'ufutx_orders', function($join) {
$join->on('m_order_id', '=', 'orders.id');
})->selectRaw('m_user_id,m_order_id,earning_time,sum(value) as value, created_at as e_created_at, 2 as status, ufutx_orders.*')->groupBy('m_order_id');
$earnings = \DB::table('m_advance_earnings')->whereNotIn('m_order_id',$earning_order_ids)->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->union($m_earnings)->leftJoinSub($orders, 'ufutx_orders', function($join) {
$join->on('m_order_id', '=', 'orders.id');
})->selectRaw('m_user_id,m_order_id,earning_time,sum(value) as value, created_at as e_created_at, 1 as status, ufutx_orders.*');
$value1 = \DB::table('m_earnings')->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->sum('value');
$value2 = \DB::table('m_advance_earnings')->whereNotIn('m_order_id',$earning_order_ids)->where('m_user_id', $merchant_user->id)->whereNull('deleted_at')->sum('value');
$value = $value1 + $value2;
}
}
$earnings = $earnings->groupBy('m_order_id')->orderBy('e_created_at', 'desc')->paginate();
foreach ($earnings as $earning) {
$goods_name = $earning->desc?:$earning->goods;
$text = '在'.$earning->o_created_at.'通过你的分享购买了【'.$goods_name.'】';
$earning->text = $text;
}
return $this->success('ok', compact('is_wechat_auth', 'earnings', 'value'));
}catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
/**
* 提现记录
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function saasWithdrawHistories(Request $request)
{
try {
// return $this->failure("系统维护中");
//检查unio
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$is_wechat_auth = 1;
$merchant_user = $this->userByUnionid($unionid);
if ($merchant_user === false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
if (empty($merchant_user)) {
$withdraws = MEarningwithdraws::where('m_user_id', null)->orderBy('id', 'desc')->paginate();
} else {
$withdraws = MEarningwithdraws::where('m_user_id', $merchant_user->id)->select('m_user_id', 'real_value', 'value', 'created_at', 'status', 'err_msg','way')->orderBy('id', 'desc')->paginate();
}
return $this->success('ok', compact('is_wechat_auth', 'withdraws'));
}catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
public function saasWithdraw(Request $request)
{
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$merchant_user = $this->userByUnionid($unionid);
if ($merchant_user == false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
$account = $request->input("account");
$name = $request->input('name');
$way = $request->input('way','alipay');
if(empty($account) || empty($name)) return $this->failure("提现失败,请输入提现账号和真实姓名");
$res = MEarningAccount::where('m_user_id', $merchant_user->id)->where('is_banned', 1)->first();
if ($res) throw new \Exception("账号id: {$res->id}异常");
//检测余额是否充足
$balance = MEarningAccount::where('m_user_id', $merchant_user->id)->sum('balance');
$value = $request->input('value',0);
if (empty($value)) return $this->failure("请输入提现金额");
if ($balance < $value) return $this->failure("提现失败,余额不足");
if ($value < 1) return $this->failure("提现失败最低提现金额1元");
//提现
\DB::beginTransaction();
$accounts = MEarningAccount::where('m_user_id', $merchant_user->id)->where('balance', '>', 0)->orderBy('balance', 'desc')->get();
$remain_value = $value;
$ratio = 1 - (Redis::get('withdrawal_poundage')??2) / 100;
foreach ($accounts as $earning_account) {
$withdraw_array = [
'm_id'=>$earning_account->m_id,
'm_user_id'=>$earning_account->m_user_id,
'way'=>$way,
'account'=>$account,
'name'=>$name,
'trade_no'=>\CommonUtilsService::getTradeNO(),
'status'=>'freezing',
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
];
if ($earning_account->balance >= $remain_value) {
$withdraw_array['real_value'] = number_format($remain_value * $ratio, 2, '.', '');
$withdraw_array['value'] = $remain_value;
MEarningwithdraws::insert($withdraw_array);
$earning_account->increment('frozen_withdraw', $remain_value);
$earning_account->decrement('balance', $remain_value);
break;
}else {
$remain_value = $remain_value - $earning_account->balance;
$withdraw_array['real_value'] = number_format($earning_account->balance * $ratio, 2, '.', '');
$withdraw_array['value'] = $earning_account->balance;
MEarningwithdraws::insert($withdraw_array);
$earning_account->increment('frozen_withdraw', $earning_account->balance);
$earning_account->decrement('balance', $earning_account->balance);
}
}
\DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
\DB::rollBack();
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
//提现账号列表
public function saasTransferAccounts(Request $request){
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$merchant_user = $this->userByUnionid($unionid);
if ($merchant_user == false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
$way = $request->way ?? 'alipay';
$transfers = MEarningTransfers::where('m_user_id',$merchant_user->id)->where('way',$way)->select('id','m_user_id','way','account','pic','nick_name','name')->get();
return $this->success('ok',$transfers);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
//绑定提现账号(支付宝)
public function bindSaasTransferAccounts(Request $request){
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$merchant_user = $this->userByUnionid($unionid);
if(!$merchant_user){
throw new \Exception('获取merchant_user失败,unionid='.$unionid);
}
if($request->merchant_id){
$merchant_id = $request->merchant_id;
}else{
$merchant_id = MEarningAccount::where('m_user_id',$merchant_user->id)->orderBy('balance','desc')->value('m_id')?:0;
}
$way = $request->way ?? 'alipay';
$account = $request->account;
$name = $request->name;
if(empty($account) || empty($name)) return $this->failure("请完善提现信息");
$transfer = MEarningTransfers::where('m_user_id',$merchant_user->id)->where('name',$name)->where('account',$account)->first();
if($transfer) {
$transfer->updated_at = date('Y-m-d H:i:s');
$transfer->save();
return $this->success('ok');
}
$transfer = new MEarningTransfers();
$transfer->m_id = $merchant_id;
$transfer->m_user_id = $merchant_user->id;
$transfer->way = $way;
$transfer->name = $name;
$transfer->account = $account;
$transfer->save();
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure("服务器休息,请稍后再试");
}
}
public function saasAuthUrl(Request $request){
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$merchant_user = $this->userByUnionid($unionid);
if ($merchant_user === false) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
if($merchant_user){
$m_user_id = $merchant_user->id;
}else{
$m_user_id = MerchantUser::where('openid',$request->openid)->value('id');
}
if($request->merchant_id){
$merchant_id = $request->merchant_id;
}else{
$merchant_id = MEarningAccount::where('m_user_id',$m_user_id)->orderBy('balance','desc')->value('m_id');
}
$jump_url = urlencode(env('APP_URL').'/h5/#/accountPage');
$share_url = env('APP_URL').'/api/official/live/wechat/oauth?merchant_id='.$merchant_id.'&account_id='.$m_user_id.'&auth_state=0&url='.$jump_url;
return $this->success('ok',$share_url);
}
/**
* 小程序收益账号
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View|void
* @throws \Exception
*/
public function earningAccount(Request $request)
{
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user)) return $this->success('ok', ['balance' => 0, 'withdrawl' => 0, 'is_wechat_auth' => 1, 'total_value' => 0, 'frezzing_value' => 0]);
$user = $wechat->user;
$balance = $withdrawl = $total_value = $frezzing_value = 0;
$account = EarningAccount::where('user_id', $user->id)->first();
if ($account) {
$balance = $account->balance;
$withdrawl = $account->withdrawl;
$total_value = $account->total_value;
//冻结收益
$frezzing_value = $account->frozen_earning;
}
//最近30次提现记录
$near_withdraws = EarningWithdraw::where('status', '<>', 'canceled')->where('user_id', '<>', $user->id)->select('id', 'real_value', 'value', 'name')->orderBy('id', 'desc')->limit(30)->get();
foreach ($near_withdraws as $near_withdraw) {
$near_withdraw->name = mb_substr($near_withdraw->name, 0, 1)."*";
}
$poundage = Redis::get('withdrawal_poundage')??2;
// $total_value = number_format($balance + $frezzing_value, 2, '.', '');
//提现账号
$account = EarningTransfer::where('user_id',$user->id)->select('id','user_id','name','nickname','pic','way','account','created_at','updated_at')->orderBy('updated_at','desc')->first();
return $this->success('ok',['balance'=>$balance, 'withdrawl'=>$withdrawl, 'is_wechat_auth'=>1, 'near_withdraws'=>$near_withdraws, 'poundage'=>$poundage, 'total_value'=>$total_value, 'frezzing_value'=>$frezzing_value,'account'=>$account]);
}
public function earningHistories(Request $request)
{
try {
$is_wechat_auth = 1;
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
$earnings = null;
$value = 0;
if (empty($wechat) || empty($wechat->user)) return $this->success('ok', compact('is_wechat_auth', 'earnings', 'value'));
$user = $wechat->user;
$earnings = DB::table('earnings')->where('user_id', $user->id)->selectRaw('user_id as e_user_id,order_id,earning_time,sum(value) as value, status, created_at')->groupBy('order_id');
$orders = DB::table('orders')->joinSub($earnings, 'ufutx_earnings', function($join) {
$join->on('id', '=', 'earnings.order_id');
})->selectRaw('ufutx_earnings.*, user_id, type, id as orders_id, type_id, goods, ufutx_orders.created_at as o_created_at');
$earnings = DB::table('users')->joinSub($orders, 'ufutx_orders', function ($join) {
$join->on('id','=', 'orders.user_id');
})->selectRaw('ufutx_orders.*, id as order_user_id,nickname,photo');
$value = \DB::table('earnings')->where('user_id', $user->id)->sum('value');
$earnings = $earnings->groupBy('order_id')->orderBy('created_at', 'desc')->paginate();
foreach ($earnings as $earning) {
$text = '在'.$earning->o_created_at.'通过你的分享购买了【'.$earning->goods.'】';
$earning->text = $text;
}
return $this->success('ok', compact('is_wechat_auth', 'earnings', 'value'));
}catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
/**
* 提现记录
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function withdrawHistories(Request $request)
{
try {
//检查unio
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$is_wechat_auth = 1;
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
$user = $wechat->user;
if (empty($wechat) || empty($wechat->user)) {
$withdraws = EarningWithdraw::where('user_id', null)->select('user_id', 'real_value', 'value', 'created_at', 'status', 'err_msg','way')->orderBy('id', 'desc')->paginate();
} else {
$withdraws = EarningWithdraw::where('user_id', $user->id)->select('user_id', 'real_value', 'value', 'created_at', 'status', 'err_msg','way')->orderBy('id', 'desc')->paginate();
}
return $this->success('ok', compact('is_wechat_auth', 'withdraws'));
}catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
/**
* 提现申请
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function withdraw(Request $request)
{
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
// $unionid = "oVMWos64S25ILZN-eh-4HoCr7iss";
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user)) return $this->failure("暂无可提现金额");
$user = $wechat->user;
$account = $request->input("account");
$name = $request->input('name');
$way = $request->input('way','alipay');
if ($way == 'alipay') {
if(empty($account) || empty($name)) return $this->failure("提现失败,请输入提现账号和真实姓名");
}elseif ($way == 'weixin') {
$account = $result['openid'];
$name = $user->nickname;
}
//检测余额是否充足
$earning_account = EarningAccount::where('user_id', $user->id)->first();
if (empty($earning_account)) return $this->failure("暂无可提现金额");
$value = $request->input('value',0);
if (empty($value)) return $this->failure("请输入提现金额");
if ($earning_account->balance < $value) return $this->failure("提现失败,余额不足");
if ($value < 1) return $this->failure("提现失败最低提现金额1元");
//提现
\DB::beginTransaction();
$remain_value = $value;
$ratio = 1 - (Redis::get('withdrawal_poundage')??2) / 100;
$withdraw = [
'user_id'=>$earning_account->user_id,
'way'=>$way,
'account'=>$account,
'name'=>$name,
'trade_no'=>\CommonUtilsService::getTradeNO(),
'status'=>'freezing',
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
];
$withdraw['real_value'] = number_format($remain_value * $ratio, 2, '.', '');
$withdraw['value'] = $remain_value;
EarningWithdraw::insert($withdraw);
$earning_account->increment('frozen_withdraw', $remain_value);
$earning_account->decrement('balance', $remain_value);
\DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
\DB::rollBack();
$this->getError($e);
return $this->failure();
}
}
/**
* 提现账号列表
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View
*/
public function transferAccounts(Request $request){
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user)) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
$way = $request->way ?? 'alipay';
$transfers = EarningTransfer::where('user_id',$wechat->user->id)->select('id','user_id','way','account','pic','nickname','name')->get();
return $this->success('ok',$transfers);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
//绑定提现账号(支付宝)
public function bindTransferAccounts(Request $request){
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user)) throw new \Exception('获取merchant_user失败. unionid='.$unionid);
$user = $wechat->user;
$way = $request->way ?? 'alipay';
$account = $request->account;
$name = $request->name;
if ($way == 'alipay') {
if(empty($account) || empty($name)) return $this->failure("请完善提现信息");
}elseif ($way == 'weixin') {
$account = $result['openid'];
$name = null;
}
$transfer = EarningTransfer::where('user_id',$user->id)->where('name',$name)->where('account',$account)->first();
if(empty($transfer)) {
$transfer = new EarningTransfer();
$transfer->user_id = $user->id;
$transfer->way = $way;
$transfer->name = $name;
$transfer->account = $account;
$transfer->save();
}
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
public function authUrl(Request $request){
try {
//检查unionid
$result = $this->checkUnionid();
if (empty($result)) throw new \Exception('获取微信unionid信息失败');
if (isset($result['is_wechat_auth'])) return $this->success('ok', $result);
if (isset($result['error_msg'])) return $this->failure('ok', $result['error_msg']);
$unionid = $result['unionid'];
$wechat = Wechat::where('unionid', $unionid)->first();
if (empty($wechat) || empty($wechat->user)) throw new \Exception('获取user失败. unionid='.$unionid);
$jump_url = urlencode(env('APP_URL').'/h5/#/loveMpWithdraw');
$share_url = env('APP_URL').'/api/official/earning/wechat/oauth?url='.$jump_url;
return $this->success('ok',$share_url);
}catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
}