admin/plugins/rebate/src/api/IndexController.php

386 lines
19 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 Yunshop\Rebate\Api;
use app\common\components\ApiController;
use app\common\facades\Setting;
use app\common\models\Goods;
use app\common\models\Income;
use app\common\models\Member;
use Illuminate\Support\Facades\DB;
use Yunshop\Rebate\models\Rebate;
use Yunshop\TeamDividend\models\TeamDividendAgencyModel;
use Yunshop\TeamDividend\models\TeamDividendLevelModel;
use Yunshop\TeamDividend\models\TeamDividendModel;
class IndexController extends ApiController{
/**
* Common: 我的收入
* Author: wu-hui
* Time: 2024/03/18 10:58
* @return \Illuminate\Http\JsonResponse
*/
public function myIncomeStatistics(){
$uid = \YunShop::app()->getMemberId();
$userInfo = Member::select(['uid','nickname','avatar'])
->where('uid',$uid)
->with(['hasOneTeamDividend'=>function($query){
$query->select(['uid','id','level']);
}])
->first();
if($userInfo) $userInfo = $userInfo->toArray();
// 经销商等级
$userInfo['level_info'] = TeamDividendLevelModel::select(['id','level_name'])->where('id',$userInfo['has_one_team_dividend']['level'])->first();
if($userInfo['level_info']) $userInfo['level_info'] = $userInfo['level_info']->toArray();
// 今日收益
$startTime = strtotime(date("Y-m-d 00:00:00", time()));
$endTime = strtotime(date("Y-m-d 23:59:59",time()));
// $toDayIncome = TeamDividendModel::where('created_at','>=',$startTime)
// ->where('created_at','<=',$endTime)
// ->where('member_id',$uid)
// ->sum('dividend_amount');
$toDayIncome = (float)Income::uniacid()
->where('member_id', $uid)
->where('created_at','>=',$startTime)
->where('created_at','<=',$endTime)
->sum('amount');
// 全部收益
// $allIncome = TeamDividendModel:: where('member_id',$uid)->sum('dividend_amount');
$allIncome = (float)Income::uniacid()->where('member_id', $uid)->sum('amount');
// 可提现
$withdrawal = (float)Income::uniacid()->where('member_id', $uid)->where('status', 0)->sum('amount');
// 养殖收益 统计已结算收益
$rebate = Rebate::where('uid',$uid)->where('status',2)->sum('money');
// 合作养殖补助
$recommend = TeamDividendModel::uniacid()->where('member_id',$uid)->whereIn('type',[7,8])->sum('dividend_amount');
// 平级奖
$levelGive = TeamDividendModel::uniacid()->where('member_id',$uid)->where('type',1)->sum('dividend_amount');
// 下级总数
$subCount = TeamDividendAgencyModel::where('parent_id', $uid)->count();
// 复购商品 是否存在推广佣金信息 存在继续下一个步骤
$goods = [];
$rebateGroupMax = Rebate::selectRaw('max(id) as max_id,max(reality_thaw_time) as max_reality_thaw_time,order_id,goods_id,max(status) as status')
->where('uid',$uid)
->groupBy('order_id','goods_id')
->get()
->toArray();
// 获取最新返利信息
if($rebateGroupMax){
foreach($rebateGroupMax as $rebateInfo){
// 判断:是否失效 未失效则获取最后一次结算时间,已失效则无操作
if(!in_array($rebateInfo['status'], [3,4])){
// 未失效:最后一次结算时间是否需要复购 需要则判断是否在复购时间内解冻时间N天内 在时间内则获取商品信息,不在时间内则失效
$lastSettlement = Rebate::where([
'order_id' => $rebateInfo['order_id'],
'goods_id' => $rebateInfo['goods_id'],
'reality_thaw_time' => $rebateInfo['max_reality_thaw_time'],
])->first();
$isRepurchase = $lastSettlement->is_repurchase ?? 0;
if($isRepurchase == 1){
$set = Setting::get('plugin.rebate');
$repurchaseDay = $set['repurchase_day'] ?? 0;
$startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day");
$isRepurchase = (int)Db::table('yz_order_goods')
->join('yz_order','yz_order.id','=','yz_order_goods.order_id')
->where('yz_order_goods.is_rebate',1)
->where('yz_order.pay_time','>',$startTime)
->where('yz_order.uid',$uid)
->value('yz_order_goods.id');
if($isRepurchase <= 0){
$good = Goods::where('id',$rebateInfo['goods_id'])
->select(['id','title','thumb'])
->first();
if($good) {
$good->price = $lastSettlement['repurchase_money'];
$goods[] = $good->toArray();
}
}
}
}
}
}
// 海报
$set = Setting::get('plugin.rebate');
$poster_id = $set['poster_id'] ?? 0;
$data = compact('userInfo','toDayIncome','allIncome','withdrawal','rebate','recommend','levelGive','subCount','goods','poster_id');
return $this->successJson('success', $data);
}
/**
* Common: 获取返利明细
* Author: wu-hui
* Time: 2024/03/18 11:33
* @return \Illuminate\Http\JsonResponse
*/
public function rebateInfo(){
$uid = \YunShop::app()->getMemberId();
$statistics = [];
$quarterList = [];
$realityThawTime = 0;
// 获取最新一期内容 存在且未失效
$lastRebateMaxId = Rebate::where('uid',$uid)->max('id');
$lastRebateInfo = Rebate::where('id',$lastRebateMaxId)->first();
if($lastRebateInfo && !in_array($lastRebateInfo->status,[3,4])){
$lastRebateInfo = $lastRebateInfo->toArray();
// 获取最后结算时间
$realityThawTime = Rebate::where([
'uid' => $uid,
'order_id' => $lastRebateInfo['order_id'],
'goods_id' => $lastRebateInfo['goods_id'],
])->max('reality_thaw_time');
// 统计
$statistics['all_balance'] = Rebate::where( 'uid',$uid)->sum('money');// 所有期全部返利金额
$statistics['recorded'] = Rebate::where( 'uid',$uid)->where('status', 2)->sum('money');// 所有期 已入账(已结算)金额
$statistics['credited'] = Rebate::where( 'uid',$uid)->where('status', 0)->sum('money');// 所有期 待入账(冻结中)金额
// 可提现
$statistics['withdrawal'] = (float)Income::uniacid()
->leftjoin('yz_rebate','yz_rebate.id','=','yz_member_income.incometable_id')
->where('yz_member_income.dividend_code', 203)
->where('yz_member_income.member_id', $uid)
->where('yz_member_income.status', 0)
->sum('yz_member_income.amount');
// 获取全部返利信息 并且循环处理
$set = Setting::get('plugin.rebate');
$repurchaseDay = $set['repurchase_day'] ?? 0;
$monthList = Rebate::select(['id','quarter','month','expect_thaw_time','money','status','is_repurchase','repurchase_money','reality_thaw_time','goods_id'])
->where([
'uid' => $uid,
'order_id' => $lastRebateInfo['order_id'],
'goods_id' => $lastRebateInfo['goods_id'],
])
->get()
->toArray();
// 循环每月信息 生成季度信息
foreach($monthList as $monthInfo){
// 时间
$monthInfo['expect_thaw_time'] = strtotime($monthInfo['expect_thaw_time']);
$monthInfo['reality_thaw_time'] = strtotime($monthInfo['reality_thaw_time']);
// 信息赋值及处理
$quarterList[$monthInfo['quarter']]['quarter'] = (int)$monthInfo['quarter'];
$quarterList[$monthInfo['quarter']]['list'][$monthInfo['month']] = $monthInfo;
// 返利时间 开始 ~ 结束
if($monthInfo['month'] == 1) $quarterList[$monthInfo['quarter']]['start_time'] = date("Y.m", $monthInfo['expect_thaw_time']);
$quarterList[$monthInfo['quarter']]['end_time'] = date("Y.m", $monthInfo['expect_thaw_time']);
// 本季度总金额
$quarterList[$monthInfo['quarter']]['total_money'] += (float)$monthInfo['money'];
}
// 循环处理季度信息
$upQuarter = [];
foreach($quarterList as &$quarterInfo){
$quarterInfo['goods_id'] = max(array_column($quarterInfo['list'], 'goods_id'));
// 获取本季度状态 状态值最高则为本季度最高状态
$quarterInfo['status'] = max(array_column($quarterInfo['list'], 'status'));
// 获取本季度最后预计结算时间
$quarterInfo['last_expect_thaw_time'] = (int)max(array_column($quarterInfo['list'], 'expect_thaw_time'));
// 获取本季度最后已结算时间
$quarterInfo['last_reality_thaw_time'] = (int)max(array_column($quarterInfo['list'], 'reality_thaw_time'));
// 复购信息:当前季度复购信息 = 上一个季度复购信息
$quarterInfo['is_repurchase'] = (int)max(array_column($upQuarter['list'], 'is_repurchase'));
$quarterInfo['repurchase_money'] = (float)max(array_column($upQuarter['list'], 'repurchase_money'));
// 判断:本季度最后结算时间=0且上一个季度结束需要复购进入复购判断流程
$quarterInfo['repurchase_type'] = $quarterInfo['status'] == 0;// 0=无复购1=有复购未到复购时间2=有复购未复购3=有复购,已复购
if($quarterInfo['last_reality_thaw_time'] == 0 && $quarterInfo['is_repurchase'] == 1){
// 且上一个季最后结算时间大于等于上一个季度最后预计结算时间 已到复购时间内
if($upQuarter['last_reality_thaw_time'] >= $upQuarter['last_expect_thaw_time']){
$quarterInfo['repurchase_type'] = 2;// 有复购 未复购
$quarterInfo['repurchase_end_time'] = (int)strtotime(date("Y-m-d H:i:s",$realityThawTime)." +{$repurchaseDay} day");;
// 判断N天内是否存在 该商品和用户的复购订单 存在则已复购
$startTime = strtotime(date("Y-m-d H:i:s",time())." -{$repurchaseDay} day");
$isRepurchase = (int)Db::table('yz_order_goods')
->join('yz_order','yz_order.id','=','yz_order_goods.order_id')
->where('yz_order_goods.is_rebate',1)
->where('yz_order.pay_time','>',$startTime)
->where('yz_order.uid',$uid)
->value('yz_order_goods.id');
if($isRepurchase > 0) $quarterInfo['repurchase_type'] = 3;// 有复购 已复购
}else{
$quarterInfo['repurchase_type'] = 1;// 有复购 未到复购时间
}
}
// 判断当前季度最大状态为0或者1 复购状态为0、3时 强制修改为1
if(in_array($quarterInfo['status'],[0,1]) && in_array($quarterInfo['repurchase_type'],[0,3])) $quarterInfo['repurchase_type'] = 1;
// 刷新上一个季度信息
$upQuarter = $quarterInfo;
}
}
return $this->successJson('success',compact('statistics', 'quarterList', 'realityThawTime'));
}
/**
* Common: 推荐奖励 - 统计
* Author: wu-hui
* Time: 2024/03/16 18:01
* @return \Illuminate\Http\JsonResponse
*/
public function recommendStatistics(){
$uid = \YunShop::app()->getMemberId();
// 获取统计信息
$data = [
'all_income' => TeamDividendModel::uniacid()->where('member_id',$uid)->where('status', '<>', -1)->sum('dividend_amount'),// 全部收益
'credited' => TeamDividendModel::uniacid()->where('member_id',$uid)->where('status',2)->sum('dividend_amount'),// 待入账收益
'recorded' => TeamDividendModel::uniacid()->where('member_id',$uid)->whereIn('status',[0,1])->sum('dividend_amount'),// 已入账收益
// 可提现
'withdrawable' => (float)Income::uniacid()
->leftjoin('yz_team_dividend','yz_team_dividend.id','=','yz_member_income.incometable_id')
->where('yz_member_income.dividend_code', 2)
->where('yz_member_income.member_id', $uid)
->where('yz_member_income.status', 0)
->sum('yz_member_income.amount'),
];
return $this->successJson('success',$data);
}
/**
* Common: 推荐奖励 - 等级统计
* Author: wu-hui
* Time: 2024/03/18 9:14
* @return \Illuminate\Http\JsonResponse
*/
public function recommendLvStatistics(){
$uid = \YunShop::app()->getMemberId();
$levelId = (int)request()->input('level_id');
// 获取全部等级
$level_list = TeamDividendLevelModel::uniacid()->select(['id','level_name'])->orderBy('level_weight','ASC')->get()->toArray();
// 获取登记统计 不存在则使用默认第一个等级
$levelId = $levelId <= 0 ? TeamDividendAgencyModel::where('uid', $uid)->value('level') : $levelId;
$list = TeamDividendModel::where('member_id', $uid)
->select(['id','expect_thaw_time','dividend_amount','status','type'])
->where('agent_level',$levelId)
->where('status',1)
->orderBy('expect_thaw_time','ASC')
->get()->each(function($item){
$item['expect_thaw_time'] = date("m月d日",$item['expect_thaw_time']);
return $item;
})->toArray();
// 统计
$all_income = TeamDividendModel::where('member_id', $uid)->where('agent_level',$levelId)->where('status', '<>', -1)->sum('dividend_amount');
$credited = TeamDividendModel::where('member_id', $uid)->where('agent_level',$levelId)->where('status', 2)->sum('dividend_amount');
// 当前等级
$levelInfo = TeamDividendLevelModel::select(['id','level_name'])->where('id',$levelId)->first();
return $this->successJson('success',compact('level_list','list','all_income','credited','levelInfo'));
}
/**
* Common: 奖励明细
* Author: wu-hui
* Time: 2024/03/19 10:45
* @return \Illuminate\Http\JsonResponse
*/
public function incomeRecord(){
// 基本参数
$uid = \YunShop::app()->getMemberId();
$typeName = request()->input('type_name');
// 根据类型获取对应的记录
switch($typeName){
// 总收益
case 'all_income':
$result = Income::uniacid()
->leftJoin('yz_team_dividend', 'yz_team_dividend.id', 'yz_member_income.incometable_id')
->select([
'yz_member_income.id',
'yz_member_income.member_id',
'yz_member_income.dividend_code',
'yz_member_income.amount',
'yz_member_income.status',
'yz_member_income.created_at',
'yz_member_income.type_name',
'yz_team_dividend.type'
])
->where('yz_member_income.member_id', $uid)
->orderBy('yz_member_income.created_at','DESC')
->paginate(20)
->toArray();
foreach($result['data'] as &$item){
switch ($item['type']) {
case 0:
$item['type_name'] = '分红佣金';
break;
case 1:
$item['type_name'] = '区县奖励';
break;
case 2:
$item['type_name'] = '感恩奖励';
break;
case 3:
$item['type_name'] = '额外分红';
break;
case 7:
$item['type_name'] = '合作养殖补助';// 月月返
break;
case 8:
$item['type_name'] = '拓新奖';// 分红奖
break;
}
}
break;
// 今日收益
case 'today':
$startTime = strtotime(date("Y-m-d 00:00:00", time()));
$endTime = strtotime(date("Y-m-d 23:59:59",time()));
$result = Income::uniacid()
->select(['id','member_id','dividend_code','amount','status','created_at','type_name'])
->where('created_at','>=',$startTime)
->where('created_at','<=',$endTime)
->where('member_id', $uid)
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
break;
// 可提现金额
case 'withdrawal':
$result = Income::uniacid()
->select(['id','member_id','dividend_code','amount','status','created_at','type_name'])
->where('member_id', $uid)
->where('status', 0)
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
break;
// 养殖收益 统计已结算收益
case 'rebate':
$result = Rebate::where('uid',$uid)
->selectRaw('id,uid as member_id,money as amount,status,created_at')
->where('status', 2)
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
break;
// 合作养殖补助
case 'recommend':
$result = TeamDividendModel::uniacid()
->select(['id','member_id','dividend_amount','status','created_at','type'])
->where('member_id',$uid)
->whereIn('type',[7,8])
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
break;
// 平级奖收益
case 'level_give':
$result = TeamDividendModel::uniacid()
->select(['id','member_id','dividend_amount','status','created_at','type'])
->where('member_id',$uid)
->where('type',1)
->orderBy('created_at','DESC')
->paginate(20)
->toArray();
break;
}
return $this->successJson('success',[
'current_page' => (int)$result['current_page'],
'data' => (array)$result['data'],
'last_page' => (int)$result['last_page'],
]);
}
}