love_php/app/Http/Controllers/Mobile/EarningController.php

701 lines
37 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?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();
}
}
}